Skip to main content

API Endpoints

Christina Hill avatar
Written by Christina Hill
Updated over a week ago

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

  2. 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-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/project/{projectId}/issues
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": "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/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: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/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.

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

Did this answer your question?