Some account have access to CONQA's API as part of their subscription. If you are not sure whether this applies to your company, please contact your account manager, or reach out to our support ream via support@conqahq.com, or via Live Chat.
This is the public API for CONQA.
Getting Started with the API
The Public API is available at:
https://api-oceania.con.qa/api-v1
To get started, you'll need to:
Generate an API token from your user settings in CONQA Console
Include your API token in the Authorization header for all API requests
Endpoints
Get Projects for User
Retrieves a list of all projects that you have access to in licensed accounts.
GET https://api-oceania.con.qa/api-v1/projects
Authorization: your-api-token-here
Example Response
{
"projects": [
{
"projectId": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"projectName": "CONQA Apartments"
},
{
"projectId": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"projectName": "CONQA Office Upgrade"
}
]
}Get Project Summary
Retrieves the summary information for a specific project that you have access to, including the project name and statistics for Issues and Milestones.
GET https://api-oceania.con.qa/api-v1/project/{projectId}/summary
Authorization: your-api-token-hereParameters
projectId (path parameter): The unique identifier of the project
Example Response
{
"data": {
"name": "CONQA Apartments",
"issues": {
"total": 10,
"statuses": [
{
"name": "open",
"issueCount": 45
},
{
"name": "closed",
"issueCount": 33
},
{
"name": "disputed",
"issueCount": 3
},
{
"name": "ready-to-inspect",
"issueCount": 4
},
{
"name": "work-completed",
"issueCount": 12
}
]
},
"milestones": {
"total": 3,
"statuses": [],
"measures": {}
}
}
}Get Project Issues
Retrieves a list of issues for a specific project that you have access to, with pagination support.
GET https://api-oceania.con.qa/api-v1/project/{projectId}/issues
Authorization: your-api-token-hereParameters
projectId (path parameter): The unique identifier of the project
page (query parameter, optional): The page number to retrieve (default: 1)
limit (query parameter, optional): The number of issues per page (default: 300)
Example Response
{
"data": {
"paging": {
"total_records": 112,
"page_size": 300,
"page_number": 1
},
"issues": [
{
"issueId": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"projectId": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"assignedTo": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"checklistId": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"checkpointId": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"description": "Test issue description",
"dueDate": "2023-12-30T11:00:00.000Z",
"issueNumber": "ISS-22",
"lastUpdatedAt": "2024-10-21T12:38:02.959Z",
"lastUpdatedBy": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"raisedAt": "2024-10-21T12:38:02.959Z",
"raisedBy": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"raisedByName": "John Doe",
"responsiblePerson": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"responsiblePersonName": "Jane Smith",
"status": "open",
"title": "Test issue",
"daysAtStatus": 3,
"ballInCourtUser": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"ballInCourtUserName": "John Doe",
"numberOfAttachments": 2
}
]
}
}Get Project Milestones
Retrieves a list of milestones for a specific project that you have access to, with pagination support.. This will vary depending on your milestone configuration.
GET https://api-oceania.con.qa/api-v1/project/{projectId}/milestones Authorization: your-api-token-here
Parameters
projectId (path parameter, required): The unique identifier of the project
page (query parameter, optional): The page number to retrieve (default: 1)
limit (query parameter, optional): The number of milestones per page (default: 300)
orderBy (query parameter, optional): The field name to order by.
orderDirection (query parameter, optional): Can be one of asc or desc
Example Response
This response has sample fields and measures configured; your project will likely be configured with different fields, measures and statuses.
{
"data": {
"paging": {
"total_records": 50,
"page_size": 300,
"page_number": 1
},
"milestones": [
{
"milestoneId": "ms:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"projectId": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"externalId": "QA10M-ITP-001-A1-LOT-001",
"name": "Excavation, Fill & Subgrade Prep",
"status": {
"value": "open",
"display": "Open",
"lastUpdatedAt": "2024-01-15T10:30:00.000Z",
"lastUpdatedBy": "user@example.com",
"lastUpdatedByUser": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
},
"fields": {
"area": {
"value": "Area 1",
"display": "Area 1"
}
},
"checklistId": "cl:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"measurements": {
"timeToSubmitted": {
"days": 410,
"threshold": "overdue"
}
}
}
]
}
}
Webhooks
Webhooks allow you to receive real-time notifications about events in your CONQA projects.
Two kinds of webhooks are available:
Project-scoped webhooks: Receive notifications for events in a specific project
Account-scoped webhooks: Receive notifications for events across all projects in an account
Webhook Event types
Two event types are currently supported:
MILESTONE: Receives notifications about milestone events
REPORT: Receives notifications about completed reports
Webhook Status
There are two statuses for webhooks:
ACTIVE: The webhook is active and will receive notifications
INACTIVE: The webhook is inactive and will not receive notifications
Webhook Auto-Disable
Webhooks are automatically disabled if they fail to receive notifications 10 consecutive times. When a webhook is auto-disabled:
The webhook status is changed to INACTIVE
The webhook owner receives an email notification explaining why the webhook was disabled
The failure count is reset to 0
The webhook will no longer receive notifications until it is manually re-enabled
Common reasons for webhook failures include:
The callback URL is unreachable or returns an error status code
The callback URL times out (30 second timeout)
Network connectivity issues
To re-enable an auto-disabled webhook, use the Update Webhook endpoint to set the status back to ACTIVE.
Project-Scoped Webhooks
Project-scoped webhooks allow you to receive notifications for events in a specific project.
List Webhooks for Project
Retrieves webhooks for a specific project with pagination support.
GET https://api-oceania.con.qa/api-v1/project/{projectId}/webhooks
Authorization: your-api-token-here
Content-Type: application/jsonParameters
projectId (path parameter): The unique identifier of the project
limit (query parameter, optional): The maximum number of webhooks to return per page (default: 300)
lastEvaluatedKey (query parameter, optional): A Base64-encoded pagination token to retrieve the next page of results
Pagination
This endpoint uses cursor-based pagination to retrieve webhooks in pages:
First Request: Make a request without lastEvaluatedKey to get the first page (up to 300 webhooks by default)
Subsequent Requests: Use the lastEvaluatedKey from the previous response to get the next page
End of Results: When lastEvaluatedKey is undefined in the response, there are no more results
Note: This endpoint does not return all webhooks at once. Use pagination to retrieve all webhooks if needed.
Example Requests
First page:
GET https://api-oceania.con.qa/api-v1/project/{projectId}/webhooks?limit=10
Authorization: your-api-token-hereNext page:
GET https://api-oceania.con.qa/api-v1/project/{projectId}/webhooks?limit=10&lastEvaluatedKey=eyJpZCI6IndoOjEyM2U0NTY3LWU4OWItMTJkMy1hNDU2LTQyNjYxNDE3NDAwMCIsInByb2plY3RJZCI6ImQ2YzVlM2I5LWI0MjctNGFkZS1hY2Q5LWEwZjkzNWY4ZGI5YyJ9
Authorization: your-api-token-hereExample Response
{
"data": {
"count": 1,
"lastEvaluatedKey": "eyJpZCI6IndoOjEyM2U0NTY3LWU4OWItMTJkMy1hNDU2LTQyNjYxNDE3NDAwMCIsInByb2plY3RJZCI6ImQ2YzVlM2I5LWI0MjctNGFkZS1hY2Q5LWEwZjkzNWY4ZGI5YyJ9",
"webhooks": [{
"id": "wh:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"projectId": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"userId": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"maskedCallbackUrl": "example.com/***",
"type": "MILESTONE",
"status": "ACTIVE",
"createdAt": "2024-01-15T10:30:00.000Z",
"updatedAt": "2024-01-15T10:30:00.000Z"
}]
}
}Response Fields
count: The number of webhooks returned in this page (not the total count)
lastEvaluatedKey: A Base64-encoded pagination token. Use this value in the lastEvaluatedKey query parameter to retrieve the next page. If undefined, there are no more results.
webhooks: An array of webhook objects (limited by the limit parameter)
Register Project Webhook
Registers a new webhook for a specific project to receive notifications about milestone or report events.
PUT https://api-oceania.con.qa/api-v1/project/{projectId}/{type}/webhook
Authorization: your-api-token-here
Content-Type: application/jsonParameters
projectId (path parameter): The unique identifier of the project
type (path parameter): The webhook type, either milestone or report
Request Body
{
"name": "Project Milestone Webhook",
"callbackUrl": "https://example.com/webhook"
}Request Body Parameters
name (required): A descriptive name for the webhook
callbackUrl (required): The URL where webhook notifications will be sent. Must be a valid URL format.
Example Requests
For milestone webhooks:
PUT https://api-oceania.con.qa/api-v1/project/{projectId}/milestone/webhook
Authorization: your-api-token-here
Content-Type: application/json
For report webhooks:
PUT https://api-oceania.con.qa/api-v1/project/{projectId}/report/webhook
Authorization: your-api-token-here
Content-Type: application/jsonExample Response
{
"webhook": {
"id": "wh:123e4567-e89b-12d3-a456-426614174000",
"name": "Project Milestone Webhook",
"projectId": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"userId": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"maskedCallbackUrl": "example.com/***",
"type": "MILESTONE",
"status": "ACTIVE",
"createdAt": "2024-01-15T10:30:00.000Z",
"updatedAt": "2024-01-15T10:30:00.000Z"
}
}
Update Project Webhook
Updates a webhook for a specific project.
PATCH https://api-oceania.con.qa/api-v1/project/{projectId}/{type}/webhook/{webhookId}
Authorization: your-api-token-here
Content-Type: application/jsonParameters
projectId (path parameter): The unique identifier of the project
type (path parameter): The webhook type, either milestone or report
webhookId (path parameter): The unique identifier of the webhook
Request Body
{
"name": "Updated Webhook Name",
"status": "INACTIVE"
}Request Body Parameters
name (optional): The new name for the webhook
status (optional): The new status for the webhook. Must be either ACTIVE or INACTIVE
Note: At least one field (name or status) must be provided in the request body.
Example Response
{
"message": "Webhook updated successfully",
"webhookId": "wh:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"name": "Updated Webhook Name",
"status": "INACTIVE"
}
Delete Project Webhook
Deletes a webhook for a specific project.
DELETE https://api-oceania.con.qa/api-v1/project/{projectId}/{type}/webhook/{webhookId}
Authorization: your-api-token-hereParameters
projectId (path parameter): The unique identifier of the project
type (path parameter): The webhook type, either milestone or report
webhookId (path parameter): The unique identifier of the webhook
Example Requests
For milestone webhooks:
DELETE https://api-oceania.con.qa/api-v1/project/{projectId}/milestone/webhook/{webhookId}
Authorization: your-api-token-hereFor report webhooks:
DELETE https://api-oceania.con.qa/api-v1/project/{projectId}/report/webhook/{webhookId}
Authorization: your-api-token-hereExample Response
{
"message": "Webhook deleted successfully",
"webhookId": "wh:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
}
Account-Scoped Webhooks
Account-scoped webhooks allow you to receive notifications for all projects within a specific account. These webhooks are useful when you want to monitor activity across multiple projects in your account.
List Webhooks for Account
Retrieves webhooks for a specific account with pagination support.
Authorization: your-api-token-here
Content-Type: application/json
Parameters
accountId (path parameter): The unique identifier of the account
limit (query parameter, optional): The maximum number of webhooks to return per page (default: 300)
lastEvaluatedKey (query parameter, optional): A Base64-encoded pagination token to retrieve the next page of results
Pagination
This endpoint uses cursor-based pagination to retrieve webhooks in pages:
First Request: Make a request without lastEvaluatedKey to get the first page (up to 300 webhooks by default)
Subsequent Requests: Use the lastEvaluatedKey from the previous response to get the next page
End of Results: When lastEvaluatedKey is undefined in the response, there are no more results
Note: This endpoint does not return all webhooks at once. Use pagination to retrieve all webhooks if needed.
Example Requests
First page:
GET https://api-oceania.con.qa/api-v1/account/{accountId}/webhooks?limit=10
Authorization: your-api-token-hereNext page:
GET https://api-oceania.con.qa/api-v1/account/{accountId}/webhooks?limit=10&lastEvaluatedKey=eyJpZCI6IndoOjEyM2U0NTY3LWU4OWItMTJkMy1hNDU2LTQyNjYxNDE3NDAwMCIsImFjY291bnRJZCI6ImQ2YzVlM2I5LWI0MjctNGFkZS1hY2Q5LWEwZjkzNWY4ZGI5YyJ9
Authorization: your-api-token-hereExample Response
{
"data": {
"count": 1,
"lastEvaluatedKey": "eyJpZCI6IndoOjEyM2U0NTY3LWU4OWItMTJkMy1hNDU2LTQyNjYxNDE3NDAwMCIsImFjY291bnRJZCI6ImQ2YzVlM2I5LWI0MjctNGFkZS1hY2Q5LWEwZjkzNWY4ZGI5YyJ9",
"webhooks": [{
"id": "wh:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"name": "Account Milestone Webhook",
"accountId": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"userId": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"maskedCallbackUrl": "example.com/***",
"type": "MILESTONE",
"status": "ACTIVE",
"createdAt": "2024-01-15T10:30:00.000Z",
"updatedAt": "2024-01-15T10:30:00.000Z"
}]
}
}Response Fields
count: The number of webhooks returned in this page (not the total count)
lastEvaluatedKey: A Base64-encoded pagination token. Use this value in the lastEvaluatedKey query parameter to retrieve the next page. If undefined, there are no more results.
webhooks: An array of webhook objects (limited by the limit parameter)
Register Account Webhook
Registers a new webhook for a specific account to receive notifications about milestone or report events across all projects in that account.
PUT https://api-oceania.con.qa/api-v1/account/{accountId}/{type}/webhook
Authorization: your-api-token-here
Content-Type: application/jsonParameters
accountId (path parameter): The unique identifier of the account
type (path parameter): The webhook type, either milestone or report
Request Body
{
"name": "Account Milestone Webhook",
"callbackUrl": "https://example.com/webhook"
}Request Body Parameters
name (required): A descriptive name for the webhook
callbackUrl (required): The URL where webhook notifications will be sent. Must be a valid URL format.
Example Requests
For milestone webhooks:
PUT https://api-oceania.con.qa/api-v1/account/{accountId}/milestone/webhook
Authorization: your-api-token-here
Content-Type: application/jsonFor report webhooks:
PUT https://api-oceania.con.qa/api-v1/account/{accountId}/report/webhook
Authorization: your-api-token-here
Content-Type: application/jsonExample Response
{
"webhook": {
"id": "wh:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"name": "Account Milestone Webhook",
"accountId": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"userId": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"maskedCallbackUrl": "example.com/***",
"status": "ACTIVE",
"type": "MILESTONE",
"createdAt": "2024-01-15T10:30:00.000Z",
"updatedAt": "2024-01-15T10:30:00.000Z"
}
}
Update Account Webhook
Updates a webhook for a specific account.
PATCH https://api-oceania.con.qa/api-v1/account/{accountId}/{type}/webhook/{webhookId}
Authorization: your-api-token-here
Content-Type: application/jsonParameters
accountId (path parameter): The unique identifier of the account
type (path parameter): The webhook type, either milestone or report
webhookId (path parameter): The unique identifier of the webhook
Request Body
{
"name": "Updated Account Webhook Name",
"status": "INACTIVE"
}Request Body Parameters
name (optional): The new name for the webhook
status (optional): The new status for the webhook. Must be either ACTIVE or INACTIVE
Note: At least one field (name or status) must be provided in the request body.
Example Response
{
"message": "Webhook updated successfully",
"webhookId": "wh:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"name": "Updated Account Webhook Name",
"status": "INACTIVE"
}
Delete Account Webhook
Deletes a webhook for a specific account.
DELETE https://api-oceania.con.qa/api-v1/account/{accountId}/{type}/webhook/{webhookId}
Authorization: your-api-token-hereParameters
accountId (path parameter): The unique identifier of the account
type (path parameter): The webhook type, either milestone or report
webhookId (path parameter): The unique identifier of the webhook
Example Requests
For milestone webhooks:
DELETE https://api-oceania.con.qa/api-v1/account/{accountId}/milestone/webhook/{webhookId}
Authorization: your-api-token-hereFor report webhooks:
DELETE https://api-oceania.con.qa/api-v1/account/{accountId}/report/webhook/{webhookId}
Authorization: your-api-token-hereExample Response
{
"message": "Webhook deleted successfully",
"webhookId": "wh:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
}
Start generation of Report
Starts the generation of a new Report. When the report completes, the webhook registered for reports for this project will be called.
POST https://api-oceania.con.qa/api-v1/project/{projectId}/report Authorization: your-api-token-hereParameters
projectId (path parameter): The unique identifier of the project
Request Body
{
"checklistId": "cl:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"context": {
// context to be passed back
}
}Request Body Parameters
checklistId (required): The checklist to generate the report for.
context (optional): A Json object to be passed back to the report webhook when the report completes.
Example Response
{
"data": {
"message": "Report submitted"
}
}
Report Webhook
The REPORT webhook type receives notifications for both QA reports and issue reports. When you register a webhook with type=report, it will receive events for both report types. You can distinguish between them using the reportType field in the payload:
QA Reports: reportType will be "QAREPORT", "HISTORY", or "FAILED_CHECKPOINT". The context field contains the object that was passed into the start generation of the report.
Issue Reports: reportType will be "ISSUES". The filters field contains the filters that were applied when generating the report.
QA Report Payload
Completed:
{
"data": {
"reportUrl": "https://example.com/exports/6e3314ba-a9d8-4ab1-9fa7-411fd87fb5ec/v2/qa-report.pdf",
"reportRequestedBy": "user@example.com",
"reportType": "QAREPORT",
"context": {},
"supportCode": "",
"error": "",
"status": "completed",
"breadcrumbs": [
{
"id": "fo:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"name": "Site QA",
"type": "folder"
},
{
"id": "fo:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"name": "Area 1",
"type": "folder"
},
{
"id": "fo:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"name": "ITP 0001 - Clearing & Grubbing",
"type": "folder"
},
{
"id": "cl:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"name": "RAN-A1-ITP-0001-001",
"type": "checklist"
}
]
}
}Failed:
{
"data": {
"projectId": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"reportUrl": "",
"reportRequestedBy": "user@example.com",
"reportType": "QAREPORT",
"context": {},
"supportCode": "1RRQ7",
"error": "There was an error generating the report",
"status": "failed"
}
}Issue Report Payload
Completed:
{
"data": {
"projectId": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"reportUrl": "https://example.com/exports/6e3314ba-a9d8-4ab1-9fa7-411fd87fb5ec/v2/issue-report.pdf",
"reportRequestedBy": "user@example.com",
"reportType": "ISSUES",
"filters": {
"checklistId": "cl:checklist-123",
"status": "open",
"responsiblePerson": "user-123"
},
"supportCode": "",
"error": "",
"status": "completed"
}
}Failed:
{
"data": {
"projectId": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"reportUrl": "",
"reportRequestedBy": "user@example.com",
"reportType": "ISSUES",
"filters": {
"checklistId": "cl:checklist-123"
},
"supportCode": "1RRQ7",
"error": "There was an error generating the report",
"status": "failed"
}
}
Error Responses
The API uses standard HTTP status codes to indicate success or failure:
200: Success
400: Bad Request
401: Unauthorized (invalid or missing API token)
403: Forbidden
404: Not Found
500: Internal Server Error