Skip to main content

API Endpoints

Written by Christina Hill

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:

  1. Generate an API token from your user settings in CONQA Console: https://account.con.qa/explorer/settings/user

  2. 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 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": "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 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 to order by

  • orderDirection (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 project

  • externalId (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 value if provided (slugified as above), or from display if value is omitted

  • display sets the user-facing label; if omitted, the raw value string is used as the label

  • createNew is only supported on project-specific option fields - it cannot be used on checklist template fields or account-wide option lists

  • If the resolved match is an inactive value, the request is rejected with 400 Bad Request rather than creating a new value

Other field types

Simple fields accept a raw value directly:

  • Date fields: YYYY-MM-DD string (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 option

  • 404 Not Found: No milestone config exists for the project

  • 422 Unprocessable Entity: The request could not be processed. The response body includes an error message and a skipReason field with one of the following values:

    • ambiguousExternalId - more than one milestone exists with the given external ID

    • missingFields - one or more fields required to create the milestone were not provided

    • noChecklistTemplate - no checklist template is configured for the given product type field value

    • noFolderNaming - the project has no folder structure defined in its milestone config

    • noFolder - the folder path implied by the provided field values does not exist

    • noData - 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 Entity and skipReason: 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 project

  • externalId (path parameter): The unique identifier of the milestone in the external system

  • timestamp (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 project

  • 422 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 events

  • REPORT: Receives notifications about completed reports

Webhook Status

Webhook status values:

  • 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/json

Parameters

  • 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:

  1. First Request: Make a request without lastEvaluatedKey to get the first page (up to 300 webhooks by default)

  2. Subsequent Requests: Use the lastEvaluatedKey from the previous response to get the next page

  3. 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-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 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/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 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-here

Parameters

  • 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-here

For report webhooks:

DELETE https://api-oceania.con.qa/api-v1/project/{projectId}/report/webhook/{webhookId}
Authorization: your-api-token-here

Example 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 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:

  1. First Request: Make a request without lastEvaluatedKey to get the first page (up to 300 webhooks by default)

  2. Subsequent Requests: Use the lastEvaluatedKey from the previous response to get the next page

  3. 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-here

Next page:

GET https://api-oceania.con.qa/api-v1/account/{accountId}/webhooks?limit=10&lastEvaluatedKey=eyJpZCI6IndoOjEyM2U0NTY3LWU4OWItMTJkMy1hNDU2LTQyNjYxNDE3NDAwMCIsImFjY291bnRJZCI6ImQ2YzVlM2I5LWI0MjctNGFkZS1hY2Q5LWEwZjkzNWY4ZGI5YyJ9
Authorization: your-api-token-here

Example 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/json

Parameters

  • 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/json

For report webhooks:

PUT https://api-oceania.con.qa/api-v1/account/{accountId}/report/webhook
Authorization: your-api-token-here
Content-Type: application/json

Example 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 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-here

Parameters

  • 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-here

For report webhooks:

DELETE https://api-oceania.con.qa/api-v1/account/{accountId}/report/webhook/{webhookId}
Authorization: your-api-token-here

Example 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: 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/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.

Did this answer your question?