Webhooks | Coperniq API

Webhooks

Coperniq can send real-time notifications to your server whenever events occur — a project is created, a work order is completed, a phase starts, and more. These outbound webhooks are powered by Coperniq’s Automation engine.

Note: Webhooks are configured in the Coperniq UI, not via the API. See How to Set Up Outbound Webhooks for the full setup walkthrough.

Setup

  1. Navigate to Company Settings → Process Studio → Automations
  2. Click + AUTOMATION and give it a name
  3. Configure your Trigger (the event that fires the webhook)
  4. Set the Action to Call webhook and enter your endpoint URL
  5. Toggle the automation Active and save

Requirements for your endpoint:

  • Must accept POST requests with Content-Type: application/json
  • No authentication is required
  • Return any 2xx status to acknowledge receipt — any other status triggers a retry

Webhooks only fire for records that meet the trigger criteria after the automation is activated. Records created before activation are not processed retroactively.

Payload structure

Every webhook is a POST request with a JSON body containing up to three top-level keys:

KeyTypeWhen present
eventobjectAlways
recordobjectWhen the trigger is associated with a Project, Request, or Account
workOrderobjectWork order triggers only

event

Always present. Contains metadata about what triggered the webhook.

FieldTypeDescription
eventIdnumberUnique ID for this event
recordIdnumberID of the associated record
triggerKeystringMachine-readable trigger identifier (see Triggers)
triggerNamestringHuman-readable trigger name
firedAtdatetimeISO 8601 timestamp of when the event fired

Trigger-specific fields are added to event depending on the trigger type. See Triggers for the full list.

record

Present when the trigger is associated with a Project, Request, or Account.

FieldTypeDescription
idnumberRecord ID
uidnumberHuman-readable record number
typestring"PROJECT", "DEAL", "ACCOUNT", or "VENDOR"
titlestringRecord title
statusstring | nullProject or account status
requestStatusstring | nullOpportunity status
stage{id, name} | nullCurrent workflow stage
addressstring | nullPrimary address
citystring | nullCity
statestring | nullState
geoLocationobject | nullLat/lng coordinates
jurisdiction{id, name} | nullJurisdiction
tradesstring[] | nullTrades associated with the record
dealValuenumber | nullProject or opportunity value
ownerIdnumber | nullID of the assigned owner
primaryEmailstring | nullPrimary contact email
primaryPhonestring | nullPrimary contact phone
createdAtdatetimeISO 8601 creation timestamp
updatedAtdatetimeISO 8601 last-updated timestamp

workOrder

Present only for work order triggers.

FieldTypeDescription
idnumberWork order ID
uidnumberHuman-readable work order number
titlestringWork order title
descriptionstring | nullWork order description
statusstringCurrent status
prioritynumber | nullPriority level
recordIdnumberID of the parent record
assigneeIdnumber | nullID of the assigned user
isFieldbooleanWhether this is a field work order
startDatedatetime | nullScheduled start
endDatedatetime | nullScheduled end
startDateAllDaybooleanWhether start date is all-day
endDateAllDaybooleanWhether end date is all-day
completionDatedatetime | nullActual completion date
createdAtdatetimeISO 8601 creation timestamp
modifiedAtdatetimeISO 8601 last-modified timestamp

Triggers

The triggerKey in the event object identifies which event fired. Some triggers add extra fields to event beyond the base set.

Work order triggers

triggerKeyDescriptionExtra event fields
TASK_CREATEDA work order was createdworkOrderId, currentStatus, previousStatus
TASK_COMPLETEDA work order was completedworkOrderId
TASK_STATUS_MOVEMENTA work order moved to a new statusworkOrderId, currentStatus, previousStatus

Record triggers

triggerKeyDescriptionExtra event fields
PROJECT_CREATEDA project was created
REQUEST_CREATEDA request was created
PROJECT_STATUS_MOVEMENTA project moved to a new status
DEAL_STATUS_MOVEMENTA request moved to a new status
PROJECT_PROPERTY_UPDATEDA project custom property was updated
DEAL_PROPERTY_UPDATEDA request custom property was updated
CALL_UPSERTEDA call was logged or updated

Phase triggers

triggerKeyDescriptionExtra event fields
PROJECT_PHASE_STARTEDA project entered a new phasephaseInstanceId, phaseTemplateId, phaseType, status
PROJECT_PHASE_COMPLETEDA project phase was completedphaseInstanceId, phaseTemplateId, phaseType, status
REQUEST_PHASE_STARTEDA request entered a new phasephaseInstanceId, phaseTemplateId, phaseType, status
REQUEST_PHASE_COMPLETEDA request phase was completedphaseInstanceId, phaseTemplateId, phaseType, status

SLA triggers

triggerKeyDescriptionExtra event fields
PROJECT_PHASE_SLA_VIOLATIONA project phase exceeded its SLAoverdueAt, slaType, phaseTemplateId
DEAL_PHASE_SLA_VIOLATIONA request phase exceeded its SLAoverdueAt, slaType, phaseTemplateId

Appointment triggers

triggerKeyDescriptionExtra event fields
APPOINTMENT_CREATEDAn appointment was scheduledappointmentId, dueDate
APPOINTMENT_RESCHEDULEDAn appointment was rescheduledappointmentId, dueDate, previousDueDate

Example payload

1{
2 "event": {
3 "eventId": 48291,
4 "recordId": 10423,
5 "triggerKey": "TASK_STATUS_MOVEMENT",
6 "triggerName": "Work Order Status Movement",
7 "firedAt": "2026-03-31T17:04:22.000Z",
8 "workOrderId": 8812,
9 "currentStatus": "COMPLETED",
10 "previousStatus": "IN_PROGRESS"
11 },
12 "record": {
13 "id": 10423,
14 "uid": 3301,
15 "type": "PROJECT",
16 "title": "123 Main St Austin TX 78701",
17 "status": "ACTIVE",
18 "requestStatus": null,
19 "stage": { "id": 16651, "name": "Installation" },
20 "address": "123 Main St Austin TX 78701",
21 "city": "Austin",
22 "state": "TX",
23 "geoLocation": { "lat": 30.2672, "lng": -97.7431 },
24 "jurisdiction": null,
25 "trades": ["Solar", "Storage"],
26 "dealValue": 28500,
27 "ownerId": 13870,
28 "primaryEmail": "homeowner@example.com",
29 "primaryPhone": "+15125550100",
30 "createdAt": "2026-01-15T14:30:00.000Z",
31 "updatedAt": "2026-03-31T17:04:22.000Z"
32 },
33 "workOrder": {
34 "id": 8812,
35 "uid": 204,
36 "title": "Panel Installation",
37 "description": null,
38 "status": "COMPLETED",
39 "priority": null,
40 "recordId": 10423,
41 "assigneeId": 13870,
42 "isField": true,
43 "startDate": "2026-03-31T08:00:00.000Z",
44 "endDate": "2026-03-31T17:00:00.000Z",
45 "startDateAllDay": false,
46 "endDateAllDay": false,
47 "completionDate": "2026-03-31T17:04:22.000Z",
48 "createdAt": "2026-03-01T09:00:00.000Z",
49 "modifiedAt": "2026-03-31T17:04:22.000Z"
50 }
51}