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: https://account.con.qa/explorer/settings/user
Include your API token in the Authorization header for all API requests
Quick links
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 issue statistics.
GET https://api-oceania.con.qa/api-v1/project/{projectId}/summary
Authorization: your-api-token-here
Parameters
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/projects
Authorization: your-api-token-here
Parameters
projectId(path parameter): The unique identifier of the projectpage(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": "iss:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"projectId": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"assignedTo": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"checklistId": "cl:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"checkpointId": "scpd: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.
GET https://api-oceania.con.qa/api-v1/project/{projectId}/milestones
Authorization: your-api-token-here
Parameters
projectId(path parameter): The unique identifier of the projectpage(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 to order byorderDirection(query parameter, optional): The order direction, either asc or desc
Upsert Milestone
Create or update a milestone for a specific project that you have access to. This endpoint is asynchronous and returns 202 Accepted when the request has been queued.
POST https://api-oceania.con.qa/api-v1/project/{projectId}/milestones/{externalId}
Authorization: your-api-token-here
Content-Type: application/json
Parameters
projectId(path parameter): The unique identifier of the projectexternalId(path parameter): The unique identifier of the milestone in the external system
Request Body
{
"metadata": {
// The transaction timestamp (required). Should be set to the current time,
// but is provided by the client to allow idempotency.
"timestamp": "2026-01-15T10:30:00.000Z"
},
"data": {
"name": "Excavation, Fill & Subgrade Prep", // optional
"status": { // optional. At least one of value or display required if provided.
"value": "planned", // optional - the unchanging status identifier (preferred)
"display": "Planned" // optional - the user-facing label
},
"fields": { // optional, keyed by field name
"startDate": "2024-01-15", // simple fields accept a raw value
"area": { // option fields use an object
"value": "area-1",
"display": "Area 1", // optional display label
"createNew": true // optional, create a new option value if it doesn't exist
}
}
}
}
Example Response
202 Accepted with no body.
Status
data.status matches against the project's configured statuses. Provide value, display, or both - at least one is required if status is included:
// Preferred: use the unchanging identifier
"status": { "value": "planned" }
// Alternatively: match by display label (can break if the label is renamed)
"status": { "display": "Planned" }
// Both can be provided - value is used for matching, display is ignored
"status": { "value": "planned", "display": "Planned" }
Status values are matched exactly against the configured status identifiers. Values are typically lowercase slugs (e.g. planned, ready-to-inspect). Providing only value is valid and preferred.
Field Value Formats
Field values in data.fields must match the type of the field being set.
Option/category fields
Option fields hold a value from a configured list of options. Each option has an unchanging internal identifier (value) and a user-facing label (display). Provide at least one:
// Preferred: use the unchanging identifier
"area": { "value": "ground-floor" }
// Alternatively: match by display label (can break if the label is renamed)
"area": { "display": "Ground Floor" }
// Both can be provided - value is used for matching, display is ignored
"area": { "value": "ground-floor", "display": "Ground Floor" }
Option values are matched exactly against configured option identifiers. Values are typically lowercase slugs (e.g. ground-floor, level-3). Providing only value is valid and preferred.
Creating new option values with createNew
By default, providing an unrecognised value for an option/category field returns 400 Bad Request. Set createNew: true to add the value to the field's option list instead:
The value string is slugified to form the internal identifier: lowercased, with any characters outside [a-z0-9.-] replaced by dashes (e.g. "Level 3" → level-3, "Type A/B" → type-a-b, "v1.2" → v1.2). The display string is used as-is for the user-facing label and is not modified.
// Provide both: value is slugified to form the identifier, display is the label
"area": { "value": "level-3", "display": "Level 3", "createNew": true }
// identifier: "level-3", label: "Level 3"
// Provide only value: value is slugified for the identifier, and used as-is for the label
"area": { "value": "Level 3", "createNew": true }
// identifier: "level-3", label: "Level 3"
// If value is already a slug, the label will also be the slug - provide display for a readable label
"area": { "value": "level-3", "createNew": true }
// identifier: "level-3", label: "level-3" ← consider adding display here
// Provide only display: identifier is derived from the display label
"area": { "display": "Level 3", "createNew": true }
// identifier: "level-3", label: "Level 3"
When createNew is used:
The internal identifier is derived from
valueif provided (slugified as above), or fromdisplayifvalueis omitteddisplaysets the user-facing label; if omitted, the rawvaluestring is used as the labelcreateNewis only supported on project-specific option fields - it cannot be used on checklist template fields or account-wide option listsIf the resolved match is an inactive value, the request is rejected with
400 Bad Requestrather than creating a new value
Other field types
Simple fields accept a raw value directly:
Date fields:
YYYY-MM-DDstring (e.g."2024-01-15")Numeric fields: a JSON number (e.g.
42,3.14)Text fields: a JSON string
Clearing a field
Set the field to null to clear it. Both the direct null form and the object form ({ "value": null }) are accepted for any field type:
// Direct null - works for any field type
"notes": null // clears a text field
"startDate": null // clears a date field
"area": null // clears an option field
// Object form - also works for any field type
"notes": { "value": null } // clears a text field
"startDate": { "value": null } // clears a date field
"area": { "value": null } // clears an option field
Error Responses
400 Bad Request:The request body failed schema validation, an unknown field name or field value was provided, or a provided field value matches an inactive option404 Not Found:No milestone config exists for the project422 Unprocessable Entity:The request could not be processed. The response body includes anerrormessage and askipReasonfield with one of the following values:ambiguousExternalId- more than one milestone exists with the given external IDmissingFields- one or more fields required to create the milestone were not providednoChecklistTemplate- no checklist template is configured for the given product type field valuenoFolderNaming- the project has no folder structure defined in its milestone confignoFolder- the folder path implied by the provided field values does not existnoData- an update was requested but no data fields were provided
Behavioural Notes
This is an asynchronous API. The request is queued and processed separately, so changes may take a short time to appear when listing milestones.
If the external ID already exists but belongs to a deleted milestone, it is treated as if it doesn't exist and a new milestone will be created.
If no status is provided when creating a milestone, it will default to the first configured status (typically
planned).Minimum required fields for creation: All fields that determine checklist template selection and folder tree location are required when creating milestones. If these are missing the request will be rejected with
422 Unprocessable EntityandskipReason: missingFields.
Delete Milestone
Delete a milestone by its external ID for a specific project that you have access to. This endpoint is asynchronous and returns 202 Accepted when the request has been queued.
DELETE https://api-oceania.con.qa/api-v1/project/{projectId}/milestones/{externalId}?timestamp={timestamp}
Authorization: your-api-token-here
Parameters
projectId(path parameter): The unique identifier of the projectexternalId(path parameter): The unique identifier of the milestone in the external systemtimestamp(query parameter, required): The transaction timestamp as an ISO 8601 datetime (e.g.2026-01-15T10:30:00.000Z). Should be set to the current time, but is provided by the client to allow idempotency.
Example Response
202 Accepted with no body.
Error Responses
404 Not Found: No milestone with the given external ID exists in the project422 Unprocessable Entity: More than one milestone exists with the given external ID
Behavioural Notes
This is an asynchronous API. The delete command is queued and processed separately, so the deletion may take a short time to appear when listing milestones.
Both the milestone and its associated checklist are soft-deleted. They can be restored through the CONQA UI but there is not currently an API for restore.
No folders are deleted.
Webhooks
Webhooks allow you to receive real-time notifications about events in your CONQA projects. There are two types of webhooks 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 Types
Currently supported webhook types:
MILESTONE: Receives notifications about milestone eventsREPORT: Receives notifications about completed reports
Webhook Status
Webhook status values:
ACTIVE: The webhook is active and will receive notificationsINACTIVE: 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
INACTIVEThe 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/json
Parameters
projectId(path parameter): The unique identifier of the projectlimit(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
lastEvaluatedKeyto get the first page (up to 300 webhooks by default)Subsequent Requests: Use the
lastEvaluatedKeyfrom the previous response to get the next pageEnd of Results: When
lastEvaluatedKeyisundefinedin 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-here
Next page:
GET https://api-oceania.con.qa/api-v1/project/{projectId}/webhooks?limit=10&lastEvaluatedKey=eyJpZCI6IndoOjEyM2U0NTY3LWU4OWItMTJkMy1hNDU2LTQyNjYxNDE3NDAwMCIsInByb2plY3RJZCI6ImQ2YzVlM2I5LWI0MjctNGFkZS1hY2Q5LWEwZjkzNWY4ZGI5YyJ9
Authorization: your-api-token-here
Example 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/json
Parameters
projectId(path parameter): The unique identifier of the projecttype(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 webhookcallbackUrl(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/json
Example Response
{
"webhook": {
"id": "wh:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"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/json
Parameters
projectId(path parameter): The unique identifier of the projecttype(path parameter): The webhook type, eithermilestoneorreportwebhookId(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 webhookstatus(optional): The new status for the webhook. Must be eitherACTIVEorINACTIVE
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-here
Parameters
projectId(path parameter): The unique identifier of the projecttype(path parameter): The webhook type, either milestone or reportwebhookId(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.
GET https://api-oceania.con.qa/api-v1/account/{accountId}/webhooks
Authorization: your-api-token-here
Content-Type: application/json
Parameters
accountId(path parameter): The unique identifier of the accountlimit(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
lastEvaluatedKeyto get the first page (up to 300 webhooks by default)Subsequent Requests: Use the
lastEvaluatedKeyfrom the previous response to get the next pageEnd of Results: When
lastEvaluatedKeyisundefinedin 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 thelastEvaluatedKeyquery parameter to retrieve the next page. Ifundefined, 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/json
Parameters
accountId(path parameter): The unique identifier of the accounttype(path parameter): The webhook type, eithermilestoneorreport
Request Body
{
"name": "Account Milestone Webhook",
"callbackUrl": "https://example.com/webhook"
}
Request Body Parameters
name(required): A descriptive name for the webhookcallbackUrl(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/json
Parameters
accountId(path parameter): The unique identifier of the accounttype(path parameter): The webhook type, either milestone or reportwebhookId(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 webhookstatus(optional): The new status for the webhook. Must be eitherACTIVEorINACTIVE
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-here
Parameters
accountId(path parameter): The unique identifier of the accounttype(path parameter): The webhook type, either milestone or reportwebhookId(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-here
Parameters
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:
reportTypewill be"QAREPORT","HISTORY", or"FAILED_CHECKPOINT". Thecontextfield contains the object that was passed into the start generation of the report.Issue Reports:
reportTypewill be"ISSUES". Thefiltersfield contains the filters that were applied when generating the report.
QA Report Payload
Completed:
{
"data": {
"reportUrl": "https://example.com/exports/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/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/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/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
All error responses will include a JSON body with an error message and details when applicable.