Developers

Endpoint reference

Every REST endpoint, generated from the same route table and schemas the API validates with. Paths are relative to /api/v1.

Summary

Method and pathScope
GET /meAny one scope.
GET /projectsprojects:read
GET /projects/{id}projects:read
GET /projects/{id}/linksprojects:read
POST /projectsprojects:write
PATCH /projects/{id}projects:write
POST /projects/{id}/linkslinks:write
PATCH /links/{id}links:write
DELETE /links/{id}links:write
GET /projects/{id}/shoot-daysschedule:read
GET /shoot-days/{id}schedule:read
GET /projects/{id}/deliverablesdeliverables:read
GET /deliverables/{id}deliverables:read
GET /deliverables/{id}/versionsdeliverables:read
POST /projects/{id}/deliverablesdeliverables:write
PATCH /deliverables/{id}deliverables:write
POST /deliverables/{id}/versionsdeliverables:write
GET /versions/{id}/notesdeliverables:read
POST /versions/{id}/notesdeliverables:write
GET /clientscontacts:read
GET /clients/{id}contacts:read
GET /contactscontacts:read
GET /contacts/{id}contacts:read
GET /projects/{id}/locationslocations:read
GET /projects/{id}/crewcrew:read
GET /projects/{id}/media-drivesmedia:read
GET /webhook-endpointswebhooks:manage
POST /webhook-endpointswebhooks:manage
GET /webhook-endpoints/{id}webhooks:manage
PATCH /webhook-endpoints/{id}webhooks:manage
DELETE /webhook-endpoints/{id}webhooks:manage
POST /webhook-endpoints/{id}/testwebhooks:manage
GET /openapi.jsonNone. This document is public.

Every list is newest first and pages with a cursor. See Pagination and filters. Dates follow Dates and time zones. Writes take a JSON body, reject unknown fields, and accept an Idempotency-Key on every POST. See Retries and idempotency.

Workspace

GET /me

The workspace this token belongs to, its time zone, and the token's own scopes and expiry. A cheap way to check a token works.

Scope: Any one scope.

FieldTypeDescription
workspaceobject
workspace.idstringProduction Engine id.
workspace.namestring
workspace.time_zonestringIANA zone shoot-day dates and call times are read in.
tokenobject
token.idstringProduction Engine id.
token.namestring
token.scopesarray of one of projects:read, projects:write, schedule:read, deliverables:read, deliverables:write, contacts:read, crew:read, locations:read, media:read, links:write, webhooks:manage
token.expires_attimestamp (UTC) or nullISO 8601 instant in UTC.
Request
curl https://production-engine.com/api/v1/me \
  -H "Authorization: Bearer $PE_TOKEN"
Response
{
  "workspace": {
    "id": "cmexampletenant001",
    "name": "Eastside Pictures",
    "time_zone": "America/Los_Angeles"
  },
  "token": {
    "id": "cmexampletoken0001",
    "name": "Shade sync",
    "scopes": [
      "projects:read",
      "schedule:read",
      "deliverables:read"
    ],
    "expires_at": "2027-09-29T00:00:00.000Z"
  }
}

GET /openapi.json

This API as an OpenAPI 3.1 document, built from the same definitions as the routes. Public: no token needed.

Scope: None. This document is public.

Request
curl https://production-engine.com/api/v1/openapi.json

Projects and links

GET /projects

The workspace's projects, newest first. Deleted projects are never listed.

Scope: projects:read

ParameterInTypeDescription
limitquerystringRows per page, 1 to 100. Default 25.
cursorquerystringThe next_cursor from the previous page. Omit it for the first page.
statusqueryone of ACTIVE, COMPLETE, ARCHIVED, pre_production, production, post_production, wrap, closed, archivedOnly projects with this status.
updated_sincequerytimestamp (UTC)Only rows changed at or after this ISO 8601 instant.
Field of each item in dataTypeDescription
idstringProduction Engine id.
namestring
statusone of ACTIVE, COMPLETE, ARCHIVED, pre_production, production, post_production, wrap, closed, archived
phaseone of brief, scope_bid, awarded, pre_pro, shoot, post, wrap, closed or null
client_idstringProduction Engine id.
contact_idstring or nullProduction Engine id.
descriptionstring or null
agencystring or null
project_typestring or null
start_datedate (YYYY-MM-DD) or nullFirst day of the job, YYYY-MM-DD.
end_datedate (YYYY-MM-DD) or nullLast day of the job, YYYY-MM-DD.
created_attimestamp (UTC)ISO 8601 instant in UTC.
updated_attimestamp (UTC)ISO 8601 instant in UTC.
Request
curl https://production-engine.com/api/v1/projects \
  -H "Authorization: Bearer $PE_TOKEN"
Response
{
  "data": [
    {
      "id": "cmexampleproject01",
      "name": "Spring Hero Spot",
      "status": "pre_production",
      "phase": "pre_pro",
      "client_id": "cmexampleclient001",
      "contact_id": "cmexamplecontact01",
      "description": "Two-day studio shoot for the spring launch.",
      "agency": null,
      "project_type": "Commercial",
      "start_date": "2026-11-02",
      "end_date": "2026-11-03",
      "created_at": "2026-09-14T15:02:11.000Z",
      "updated_at": "2026-09-28T19:40:03.000Z"
    }
  ],
  "next_cursor": "eyJjIjoiMjAyNi0wOS0xNFQxNTowMjoxMS4wMDBaIiwiaSI6ImNtZXhhbXBsZXByb2plY3QwMSJ9"
}

GET /projects/{id}

One project, with up to 100 of its external links.

Scope: projects:read

ParameterInTypeDescription
idpath, requiredstringThe record's id.
FieldTypeDescription
idstringProduction Engine id.
namestring
statusone of ACTIVE, COMPLETE, ARCHIVED, pre_production, production, post_production, wrap, closed, archived
phaseone of brief, scope_bid, awarded, pre_pro, shoot, post, wrap, closed or null
client_idstringProduction Engine id.
contact_idstring or nullProduction Engine id.
descriptionstring or null
agencystring or null
project_typestring or null
start_datedate (YYYY-MM-DD) or nullFirst day of the job, YYYY-MM-DD.
end_datedate (YYYY-MM-DD) or nullLast day of the job, YYYY-MM-DD.
created_attimestamp (UTC)ISO 8601 instant in UTC.
updated_attimestamp (UTC)ISO 8601 instant in UTC.
external_linksarrayUp to 100 links, newest first. The links list pages through all of them.
external_links[].idstringProduction Engine id.
external_links[].project_idstringProduction Engine id.
external_links[].deliverable_idstring or nullProduction Engine id.
external_links[].providerstringLowercase slug naming the other system, e.g. shade.
external_links[].external_idstringThe asset's id in the other system.
external_links[].urlstringhttps URL of the asset.
external_links[].labelstring or null
external_links[].metadataobject or nullA JSON object set by whoever created the link.
external_links[].created_viaone of app, api, partner
external_links[].created_attimestamp (UTC)ISO 8601 instant in UTC.
external_links[].updated_attimestamp (UTC)ISO 8601 instant in UTC.
Request
curl https://production-engine.com/api/v1/projects/cmexampleproject01 \
  -H "Authorization: Bearer $PE_TOKEN"
Response
{
  "id": "cmexampleproject01",
  "name": "Spring Hero Spot",
  "status": "pre_production",
  "phase": "pre_pro",
  "client_id": "cmexampleclient001",
  "contact_id": "cmexamplecontact01",
  "description": "Two-day studio shoot for the spring launch.",
  "agency": null,
  "project_type": "Commercial",
  "start_date": "2026-11-02",
  "end_date": "2026-11-03",
  "created_at": "2026-09-14T15:02:11.000Z",
  "updated_at": "2026-09-28T19:40:03.000Z",
  "external_links": [
    {
      "id": "cmexamplelink00001",
      "project_id": "cmexampleproject01",
      "deliverable_id": null,
      "provider": "shade",
      "external_id": "drive_8f2k",
      "url": "https://app.shade.inc/example/drive_8f2k",
      "label": "Selects drive",
      "metadata": {
        "folder": "selects"
      },
      "created_via": "api",
      "created_at": "2026-09-20T17:00:00.000Z",
      "updated_at": "2026-09-20T17:00:00.000Z"
    }
  ]
}

Pointers from the project, or one of its deliverables, to assets in other systems.

Scope: projects:read

ParameterInTypeDescription
idpath, requiredstringThe record's id.
limitquerystringRows per page, 1 to 100. Default 25.
cursorquerystringThe next_cursor from the previous page. Omit it for the first page.
Field of each item in dataTypeDescription
idstringProduction Engine id.
project_idstringProduction Engine id.
deliverable_idstring or nullProduction Engine id.
providerstringLowercase slug naming the other system, e.g. shade.
external_idstringThe asset's id in the other system.
urlstringhttps URL of the asset.
labelstring or null
metadataobject or nullA JSON object set by whoever created the link.
created_viaone of app, api, partner
created_attimestamp (UTC)ISO 8601 instant in UTC.
updated_attimestamp (UTC)ISO 8601 instant in UTC.
Request
curl https://production-engine.com/api/v1/projects/cmexampleproject01/links \
  -H "Authorization: Bearer $PE_TOKEN"
Response
{
  "data": [
    {
      "id": "cmexamplelink00001",
      "project_id": "cmexampleproject01",
      "deliverable_id": null,
      "provider": "shade",
      "external_id": "drive_8f2k",
      "url": "https://app.shade.inc/example/drive_8f2k",
      "label": "Selects drive",
      "metadata": {
        "folder": "selects"
      },
      "created_via": "api",
      "created_at": "2026-09-20T17:00:00.000Z",
      "updated_at": "2026-09-20T17:00:00.000Z"
    }
  ],
  "next_cursor": null
}

POST /projects

Creates a project the way the app's New project form does: it gets its board, counts against the plan's active projects, and lands on the Unassigned client unless client_id names one. Logged in the project's activity as api:<token name>.

Scope: projects:write

ParameterInTypeDescription
Idempotency-KeyheaderstringUp to 255 visible ASCII characters. A retry with the same key and body within 24 hours returns the first response instead of writing again.
Body fieldTypeDescription
namestring, required
statusone of pre_production, production, post_production, wrap, closedLifecycle status.
phaseone of brief, scope_bid, awarded, pre_pro, shoot, post, wrap, closedWhere the job is, from brief to closed. Setting a phase never closes the job; closing happens in Wrap.
descriptionstring or null
agencystring or null
project_typestring or null
start_datedate (YYYY-MM-DD) or nullYYYY-MM-DD.
end_datedate (YYYY-MM-DD) or nullYYYY-MM-DD.
client_idstringA client in this workspace. On create, omit it to use the workspace's Unassigned client.
contact_idstring or nullA client contact in this workspace, or null to clear it.
FieldTypeDescription
idstringProduction Engine id.
namestring
statusone of ACTIVE, COMPLETE, ARCHIVED, pre_production, production, post_production, wrap, closed, archived
phaseone of brief, scope_bid, awarded, pre_pro, shoot, post, wrap, closed or null
client_idstringProduction Engine id.
contact_idstring or nullProduction Engine id.
descriptionstring or null
agencystring or null
project_typestring or null
start_datedate (YYYY-MM-DD) or nullFirst day of the job, YYYY-MM-DD.
end_datedate (YYYY-MM-DD) or nullLast day of the job, YYYY-MM-DD.
created_attimestamp (UTC)ISO 8601 instant in UTC.
updated_attimestamp (UTC)ISO 8601 instant in UTC.
Request
curl -X POST https://production-engine.com/api/v1/projects \
  -H "Authorization: Bearer $PE_TOKEN" \
  -H "Idempotency-Key: $(uuidgen)" \
  -H "Content-Type: application/json" \
  -d '{"name":"Fall Brand Film","phase":"brief","client_id":"cmexampleclient001","start_date":"2027-01-12","end_date":"2027-01-14"}'
Response
{
  "id": "cmexampleproject02",
  "name": "Fall Brand Film",
  "status": "pre_production",
  "phase": "brief",
  "client_id": "cmexampleclient001",
  "contact_id": null,
  "description": null,
  "agency": null,
  "project_type": null,
  "start_date": "2027-01-12",
  "end_date": "2027-01-14",
  "created_at": "2026-09-30T15:00:00.000Z",
  "updated_at": "2026-09-30T15:00:00.000Z"
}

PATCH /projects/{id}

Changes the fields sent and leaves the rest. A phase move is logged with the same guidance the app records. A project closed through Wrap answers 409 project_closed.

Scope: projects:write

ParameterInTypeDescription
idpath, requiredstringThe record's id.
Body fieldTypeDescription
namestring
statusone of pre_production, production, post_production, wrap, closedLifecycle status.
phaseone of brief, scope_bid, awarded, pre_pro, shoot, post, wrap, closedWhere the job is, from brief to closed. Setting a phase never closes the job; closing happens in Wrap.
descriptionstring or null
agencystring or null
project_typestring or null
start_datedate (YYYY-MM-DD) or nullYYYY-MM-DD.
end_datedate (YYYY-MM-DD) or nullYYYY-MM-DD.
client_idstringA client in this workspace. On create, omit it to use the workspace's Unassigned client.
contact_idstring or nullA client contact in this workspace, or null to clear it.
FieldTypeDescription
idstringProduction Engine id.
namestring
statusone of ACTIVE, COMPLETE, ARCHIVED, pre_production, production, post_production, wrap, closed, archived
phaseone of brief, scope_bid, awarded, pre_pro, shoot, post, wrap, closed or null
client_idstringProduction Engine id.
contact_idstring or nullProduction Engine id.
descriptionstring or null
agencystring or null
project_typestring or null
start_datedate (YYYY-MM-DD) or nullFirst day of the job, YYYY-MM-DD.
end_datedate (YYYY-MM-DD) or nullLast day of the job, YYYY-MM-DD.
created_attimestamp (UTC)ISO 8601 instant in UTC.
updated_attimestamp (UTC)ISO 8601 instant in UTC.
Request
curl -X PATCH https://production-engine.com/api/v1/projects/cmexampleproject01 \
  -H "Authorization: Bearer $PE_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"phase":"shoot","status":"production"}'
Response
{
  "id": "cmexampleproject01",
  "name": "Spring Hero Spot",
  "status": "production",
  "phase": "shoot",
  "client_id": "cmexampleclient001",
  "contact_id": "cmexamplecontact01",
  "description": "Two-day studio shoot for the spring launch.",
  "agency": null,
  "project_type": "Commercial",
  "start_date": "2026-11-02",
  "end_date": "2026-11-03",
  "created_at": "2026-09-14T15:02:11.000Z",
  "updated_at": "2026-09-30T15:05:00.000Z"
}

Points the project, or one of its deliverables, at an asset in your system. One link per provider and external_id on a project: a second answers 409 link_exists with the first one's id. The link shows on the project's Production Book.

Scope: links:write

ParameterInTypeDescription
idpath, requiredstringThe record's id.
Idempotency-KeyheaderstringUp to 255 visible ASCII characters. A retry with the same key and body within 24 hours returns the first response instead of writing again.
Body fieldTypeDescription
providerstring, requiredLowercase slug naming your system, e.g. shade.
external_idstring, requiredThe asset's id in your system.
urlstring, requiredhttps URL of the asset.
labelstring or null
metadataobject or nullA JSON object of at most 4 KB. No credentials and no money.
deliverable_idstring or nullA deliverable on the same project, when the link is for one cut.
FieldTypeDescription
idstringProduction Engine id.
project_idstringProduction Engine id.
deliverable_idstring or nullProduction Engine id.
providerstringLowercase slug naming the other system, e.g. shade.
external_idstringThe asset's id in the other system.
urlstringhttps URL of the asset.
labelstring or null
metadataobject or nullA JSON object set by whoever created the link.
created_viaone of app, api, partner
created_attimestamp (UTC)ISO 8601 instant in UTC.
updated_attimestamp (UTC)ISO 8601 instant in UTC.
Request
curl -X POST https://production-engine.com/api/v1/projects/cmexampleproject01/links \
  -H "Authorization: Bearer $PE_TOKEN" \
  -H "Idempotency-Key: $(uuidgen)" \
  -H "Content-Type: application/json" \
  -d '{"provider":"shade","external_id":"drive_8f2k","url":"https://app.shade.inc/example/drive_8f2k","label":"Selects drive","metadata":{"folder":"selects"}}'
Response
{
  "id": "cmexamplelink00001",
  "project_id": "cmexampleproject01",
  "deliverable_id": null,
  "provider": "shade",
  "external_id": "drive_8f2k",
  "url": "https://app.shade.inc/example/drive_8f2k",
  "label": "Selects drive",
  "metadata": {
    "folder": "selects"
  },
  "created_via": "api",
  "created_at": "2026-09-20T17:00:00.000Z",
  "updated_at": "2026-09-20T17:00:00.000Z"
}

Changes a link's url, label, metadata or deliverable. provider and external_id are fixed once made. Only the token that created the link can change it.

Scope: links:write

ParameterInTypeDescription
idpath, requiredstringThe record's id.
Body fieldTypeDescription
urlstring
labelstring or null
metadataobject or nullA JSON object of at most 4 KB. No credentials and no money.
deliverable_idstring or nullA Production Engine id in this workspace.
FieldTypeDescription
idstringProduction Engine id.
project_idstringProduction Engine id.
deliverable_idstring or nullProduction Engine id.
providerstringLowercase slug naming the other system, e.g. shade.
external_idstringThe asset's id in the other system.
urlstringhttps URL of the asset.
labelstring or null
metadataobject or nullA JSON object set by whoever created the link.
created_viaone of app, api, partner
created_attimestamp (UTC)ISO 8601 instant in UTC.
updated_attimestamp (UTC)ISO 8601 instant in UTC.
Request
curl -X PATCH https://production-engine.com/api/v1/links/cmexamplelink00001 \
  -H "Authorization: Bearer $PE_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"label":"Final selects","metadata":{"folder":"final"}}'
Response
{
  "id": "cmexamplelink00001",
  "project_id": "cmexampleproject01",
  "deliverable_id": null,
  "provider": "shade",
  "external_id": "drive_8f2k",
  "url": "https://app.shade.inc/example/drive_8f2k",
  "label": "Final selects",
  "metadata": {
    "folder": "final"
  },
  "created_via": "api",
  "created_at": "2026-09-20T17:00:00.000Z",
  "updated_at": "2026-09-30T15:10:00.000Z"
}

Removes a link. Only the token that created the link can delete it.

Scope: links:write

ParameterInTypeDescription
idpath, requiredstringThe record's id.
FieldTypeDescription
idstringProduction Engine id.
deletedboolean
Request
curl -X DELETE https://production-engine.com/api/v1/links/cmexamplelink00001 \
  -H "Authorization: Bearer $PE_TOKEN"
Response
{
  "id": "cmexamplelink00001",
  "deleted": true
}

Shoot days

GET /projects/{id}/shoot-days

Each shoot day with its date, call and wrap times, location, hold status and call sheet status.

Scope: schedule:read

ParameterInTypeDescription
idpath, requiredstringThe record's id.
limitquerystringRows per page, 1 to 100. Default 25.
cursorquerystringThe next_cursor from the previous page. Omit it for the first page.
updated_sincequerytimestamp (UTC)Only rows changed at or after this ISO 8601 instant.
Field of each item in dataTypeDescription
idstringProduction Engine id.
project_idstringProduction Engine id.
datedate (YYYY-MM-DD)The shoot date in the workspace time zone, YYYY-MM-DD.
labelstring or null
call_timestringGeneral call, as entered (usually HH:MM), in the workspace time zone.
wrap_timestring or null
hold_statusone of pencil, first_hold, second_hold, confirmed, released
time_zonestringIANA zone the date and times are in.
locationobject
location.idstring or nullProduction Engine id.
location.namestring or null
location.addressstring or null
call_sheetobject or nullThe day's call sheet, or null before one is made.
call_sheet.idstringProduction Engine id.
call_sheet.statusone of draft, sent, confirmed
created_attimestamp (UTC)ISO 8601 instant in UTC.
updated_attimestamp (UTC)ISO 8601 instant in UTC.
Request
curl https://production-engine.com/api/v1/projects/cmexampleproject01/shoot-days \
  -H "Authorization: Bearer $PE_TOKEN"
Response
{
  "data": [
    {
      "id": "cmexampleshootday1",
      "project_id": "cmexampleproject01",
      "date": "2026-11-02",
      "label": "Day 1",
      "call_time": "07:00",
      "wrap_time": "19:00",
      "hold_status": "confirmed",
      "time_zone": "America/Los_Angeles",
      "location": {
        "id": "cmexamplelocation1",
        "name": "Eastside Stage",
        "address": "100 Main St, Austin, TX"
      },
      "call_sheet": {
        "id": "cmexamplecallsheet",
        "status": "sent"
      },
      "created_at": "2026-09-15T14:00:00.000Z",
      "updated_at": "2026-09-27T21:12:00.000Z"
    }
  ],
  "next_cursor": null
}

GET /shoot-days/{id}

One shoot day. With crew:read it also lists the crew calls on its call sheet.

Scope: schedule:read With crew:read as well, crew_calls is filled in; without it, crew_calls is null.

ParameterInTypeDescription
idpath, requiredstringThe record's id.
FieldTypeDescription
idstringProduction Engine id.
project_idstringProduction Engine id.
datedate (YYYY-MM-DD)The shoot date in the workspace time zone, YYYY-MM-DD.
labelstring or null
call_timestringGeneral call, as entered (usually HH:MM), in the workspace time zone.
wrap_timestring or null
hold_statusone of pencil, first_hold, second_hold, confirmed, released
time_zonestringIANA zone the date and times are in.
locationobject
location.idstring or nullProduction Engine id.
location.namestring or null
location.addressstring or null
call_sheetobject or nullThe day's call sheet, or null before one is made.
call_sheet.idstringProduction Engine id.
call_sheet.statusone of draft, sent, confirmed
created_attimestamp (UTC)ISO 8601 instant in UTC.
updated_attimestamp (UTC)ISO 8601 instant in UTC.
crew_callsarray or nullCrew calls from the day's call sheet. Null when the token lacks crew:read.
crew_calls[].namestring
crew_calls[].rolestring
crew_calls[].call_timestring
Request
curl https://production-engine.com/api/v1/shoot-days/cmexampleshootday1 \
  -H "Authorization: Bearer $PE_TOKEN"
Response
{
  "id": "cmexampleshootday1",
  "project_id": "cmexampleproject01",
  "date": "2026-11-02",
  "label": "Day 1",
  "call_time": "07:00",
  "wrap_time": "19:00",
  "hold_status": "confirmed",
  "time_zone": "America/Los_Angeles",
  "location": {
    "id": "cmexamplelocation1",
    "name": "Eastside Stage",
    "address": "100 Main St, Austin, TX"
  },
  "call_sheet": {
    "id": "cmexamplecallsheet",
    "status": "sent"
  },
  "created_at": "2026-09-15T14:00:00.000Z",
  "updated_at": "2026-09-27T21:12:00.000Z",
  "crew_calls": [
    {
      "name": "Dana Ruiz",
      "role": "Gaffer",
      "call_time": "06:30"
    },
    {
      "name": "Sam Ortiz",
      "role": "1st AC",
      "call_time": "06:45"
    }
  ]
}

Deliverables, versions and review notes

GET /projects/{id}/deliverables

The project's deliverables with status and due date.

Scope: deliverables:read

ParameterInTypeDescription
idpath, requiredstringThe record's id.
limitquerystringRows per page, 1 to 100. Default 25.
cursorquerystringThe next_cursor from the previous page. Omit it for the first page.
statusqueryone of NOT_STARTED, IN_PRODUCTION, IN_EDIT, IN_REVIEW, REVISION, APPROVED, DELIVEREDOnly deliverables with this status.
updated_sincequerytimestamp (UTC)Only rows changed at or after this ISO 8601 instant.
Field of each item in dataTypeDescription
idstringProduction Engine id.
project_idstringProduction Engine id.
titlestring
descriptionstring or null
formatstring or null
durationstring or null
platformstring or null
statusone of NOT_STARTED, IN_PRODUCTION, IN_EDIT, IN_REVIEW, REVISION, APPROVED, DELIVERED
due_datedate (YYYY-MM-DD) or nullCalendar date, YYYY-MM-DD.
delivered_attimestamp (UTC) or nullISO 8601 instant in UTC.
external_urlstring or null
client_visibleboolean
sort_orderinteger
created_attimestamp (UTC)ISO 8601 instant in UTC.
updated_attimestamp (UTC)ISO 8601 instant in UTC.
Request
curl https://production-engine.com/api/v1/projects/cmexampleproject01/deliverables \
  -H "Authorization: Bearer $PE_TOKEN"
Response
{
  "data": [
    {
      "id": "cmexampledeliver01",
      "project_id": "cmexampleproject01",
      "title": "Hero :30",
      "description": null,
      "format": "ProRes 422 HQ",
      "duration": ":30",
      "platform": "Broadcast",
      "status": "IN_REVIEW",
      "due_date": "2026-12-01",
      "delivered_at": null,
      "external_url": null,
      "client_visible": true,
      "sort_order": 0,
      "created_at": "2026-09-15T14:05:00.000Z",
      "updated_at": "2026-09-29T16:30:00.000Z"
    }
  ],
  "next_cursor": null
}

GET /deliverables/{id}

One deliverable, with a summary of its latest version and how many client-visible notes on it are still open.

Scope: deliverables:read

ParameterInTypeDescription
idpath, requiredstringThe record's id.
FieldTypeDescription
idstringProduction Engine id.
project_idstringProduction Engine id.
titlestring
descriptionstring or null
formatstring or null
durationstring or null
platformstring or null
statusone of NOT_STARTED, IN_PRODUCTION, IN_EDIT, IN_REVIEW, REVISION, APPROVED, DELIVERED
due_datedate (YYYY-MM-DD) or nullCalendar date, YYYY-MM-DD.
delivered_attimestamp (UTC) or nullISO 8601 instant in UTC.
external_urlstring or null
client_visibleboolean
sort_orderinteger
created_attimestamp (UTC)ISO 8601 instant in UTC.
updated_attimestamp (UTC)ISO 8601 instant in UTC.
latest_versionobject or null
latest_version.idstringProduction Engine id.
latest_version.version_numberinteger
latest_version.kindone of upload, link
latest_version.file_namestring
latest_version.decisionone of PENDING, APPROVED, REVISION_REQUESTED
latest_version.created_attimestamp (UTC)ISO 8601 instant in UTC.
open_note_countintegerUnresolved, client-visible top-level review notes on the latest version.
Request
curl https://production-engine.com/api/v1/deliverables/cmexampledeliver01 \
  -H "Authorization: Bearer $PE_TOKEN"
Response
{
  "id": "cmexampledeliver01",
  "project_id": "cmexampleproject01",
  "title": "Hero :30",
  "description": null,
  "format": "ProRes 422 HQ",
  "duration": ":30",
  "platform": "Broadcast",
  "status": "IN_REVIEW",
  "due_date": "2026-12-01",
  "delivered_at": null,
  "external_url": null,
  "client_visible": true,
  "sort_order": 0,
  "created_at": "2026-09-15T14:05:00.000Z",
  "updated_at": "2026-09-29T16:30:00.000Z",
  "latest_version": {
    "id": "cmexampleversion01",
    "version_number": 2,
    "kind": "link",
    "file_name": "vimeo.com",
    "decision": "PENDING",
    "created_at": "2026-09-29T16:30:00.000Z"
  },
  "open_note_count": 3
}

GET /deliverables/{id}/versions

Every cut posted for review. An uploaded file's storage address is never returned; a link version returns its URL.

Scope: deliverables:read

ParameterInTypeDescription
idpath, requiredstringThe record's id.
limitquerystringRows per page, 1 to 100. Default 25.
cursorquerystringThe next_cursor from the previous page. Omit it for the first page.
Field of each item in dataTypeDescription
idstringProduction Engine id.
deliverable_idstringProduction Engine id.
version_numberinteger
kindone of upload, linkupload: a file stored in Production Engine. link: a cut on another site.
file_namestring
external_urlstring or nullThe cut's https URL for a link version; null for an upload.
duration_msinteger or null
widthinteger or null
heightinteger or null
decisionone of PENDING, APPROVED, REVISION_REQUESTED
decided_attimestamp (UTC) or nullISO 8601 instant in UTC.
created_attimestamp (UTC)ISO 8601 instant in UTC.
Request
curl https://production-engine.com/api/v1/deliverables/cmexampledeliver01/versions \
  -H "Authorization: Bearer $PE_TOKEN"
Response
{
  "data": [
    {
      "id": "cmexampleversion01",
      "deliverable_id": "cmexampledeliver01",
      "version_number": 2,
      "kind": "link",
      "file_name": "vimeo.com",
      "external_url": "https://vimeo.com/123456789",
      "duration_ms": null,
      "width": null,
      "height": null,
      "decision": "PENDING",
      "decided_at": null,
      "created_at": "2026-09-29T16:30:00.000Z"
    }
  ],
  "next_cursor": null
}

POST /projects/{id}/deliverables

Adds a deliverable to the end of the project's list, as the app does.

Scope: deliverables:write

ParameterInTypeDescription
idpath, requiredstringThe record's id.
Idempotency-KeyheaderstringUp to 255 visible ASCII characters. A retry with the same key and body within 24 hours returns the first response instead of writing again.
Body fieldTypeDescription
titlestring, required
descriptionstring or null
formatstring or null
durationstring or null
platformstring or null
statusone of NOT_STARTED, IN_PRODUCTION, IN_EDIT, IN_REVIEW, REVISION, APPROVED, DELIVEREDWhere the deliverable is. Adding a version moves it to IN_REVIEW on its own.
due_datedate (YYYY-MM-DD) or nullYYYY-MM-DD.
external_urlstring or nullAn https link to the deliverable elsewhere.
client_visiblebooleanWhether the client sees it in their portal.
FieldTypeDescription
idstringProduction Engine id.
project_idstringProduction Engine id.
titlestring
descriptionstring or null
formatstring or null
durationstring or null
platformstring or null
statusone of NOT_STARTED, IN_PRODUCTION, IN_EDIT, IN_REVIEW, REVISION, APPROVED, DELIVERED
due_datedate (YYYY-MM-DD) or nullCalendar date, YYYY-MM-DD.
delivered_attimestamp (UTC) or nullISO 8601 instant in UTC.
external_urlstring or null
client_visibleboolean
sort_orderinteger
created_attimestamp (UTC)ISO 8601 instant in UTC.
updated_attimestamp (UTC)ISO 8601 instant in UTC.
Request
curl -X POST https://production-engine.com/api/v1/projects/cmexampleproject01/deliverables \
  -H "Authorization: Bearer $PE_TOKEN" \
  -H "Idempotency-Key: $(uuidgen)" \
  -H "Content-Type: application/json" \
  -d '{"title":"Cutdown :15","duration":":15","platform":"Social","due_date":"2026-12-05"}'
Response
{
  "id": "cmexampledeliver02",
  "project_id": "cmexampleproject01",
  "title": "Cutdown :15",
  "description": null,
  "format": null,
  "duration": ":15",
  "platform": "Social",
  "status": "NOT_STARTED",
  "due_date": "2026-12-05",
  "delivered_at": null,
  "external_url": null,
  "client_visible": false,
  "sort_order": 1,
  "created_at": "2026-09-30T15:20:00.000Z",
  "updated_at": "2026-09-30T15:20:00.000Z"
}

PATCH /deliverables/{id}

Changes the fields sent. A status you set is kept as sent; adding a version is what moves a deliverable back to IN_REVIEW.

Scope: deliverables:write

ParameterInTypeDescription
idpath, requiredstringThe record's id.
Body fieldTypeDescription
titlestring
descriptionstring or null
formatstring or null
durationstring or null
platformstring or null
statusone of NOT_STARTED, IN_PRODUCTION, IN_EDIT, IN_REVIEW, REVISION, APPROVED, DELIVEREDWhere the deliverable is. Adding a version moves it to IN_REVIEW on its own.
due_datedate (YYYY-MM-DD) or nullYYYY-MM-DD.
external_urlstring or nullAn https link to the deliverable elsewhere.
client_visiblebooleanWhether the client sees it in their portal.
FieldTypeDescription
idstringProduction Engine id.
project_idstringProduction Engine id.
titlestring
descriptionstring or null
formatstring or null
durationstring or null
platformstring or null
statusone of NOT_STARTED, IN_PRODUCTION, IN_EDIT, IN_REVIEW, REVISION, APPROVED, DELIVERED
due_datedate (YYYY-MM-DD) or nullCalendar date, YYYY-MM-DD.
delivered_attimestamp (UTC) or nullISO 8601 instant in UTC.
external_urlstring or null
client_visibleboolean
sort_orderinteger
created_attimestamp (UTC)ISO 8601 instant in UTC.
updated_attimestamp (UTC)ISO 8601 instant in UTC.
Request
curl -X PATCH https://production-engine.com/api/v1/deliverables/cmexampledeliver01 \
  -H "Authorization: Bearer $PE_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"status":"APPROVED"}'
Response
{
  "id": "cmexampledeliver01",
  "project_id": "cmexampleproject01",
  "title": "Hero :30",
  "description": null,
  "format": "ProRes 422 HQ",
  "duration": ":30",
  "platform": "Broadcast",
  "status": "APPROVED",
  "due_date": "2026-12-01",
  "delivered_at": null,
  "external_url": null,
  "client_visible": true,
  "sort_order": 0,
  "created_at": "2026-09-15T14:05:00.000Z",
  "updated_at": "2026-09-30T15:25:00.000Z"
}

POST /deliverables/{id}/versions

Posts a cut that lives on another site (Vimeo, YouTube or another https page) as the deliverable's next version, through the same code as the review room's Add a link. Open notes carry forward and the deliverable moves to IN_REVIEW.

Scope: deliverables:write

ParameterInTypeDescription
idpath, requiredstringThe record's id.
Idempotency-KeyheaderstringUp to 255 visible ASCII characters. A retry with the same key and body within 24 hours returns the first response instead of writing again.
Body fieldTypeDescription
urlstring, requiredThe cut's https URL: Vimeo, YouTube or another page that can be framed.
file_namestringWhat to call the cut. Defaults to the URL's host name.
FieldTypeDescription
idstringProduction Engine id.
deliverable_idstringProduction Engine id.
version_numberinteger
kindone of upload, linkupload: a file stored in Production Engine. link: a cut on another site.
file_namestring
external_urlstring or nullThe cut's https URL for a link version; null for an upload.
duration_msinteger or null
widthinteger or null
heightinteger or null
decisionone of PENDING, APPROVED, REVISION_REQUESTED
decided_attimestamp (UTC) or nullISO 8601 instant in UTC.
created_attimestamp (UTC)ISO 8601 instant in UTC.
Request
curl -X POST https://production-engine.com/api/v1/deliverables/cmexampledeliver01/versions \
  -H "Authorization: Bearer $PE_TOKEN" \
  -H "Idempotency-Key: $(uuidgen)" \
  -H "Content-Type: application/json" \
  -d '{"url":"https://vimeo.com/987654321","file_name":"hero_v3.mov"}'
Response
{
  "id": "cmexampleversion02",
  "deliverable_id": "cmexampledeliver01",
  "version_number": 3,
  "kind": "link",
  "file_name": "hero_v3.mov",
  "external_url": "https://vimeo.com/987654321",
  "duration_ms": null,
  "width": null,
  "height": null,
  "decision": "PENDING",
  "decided_at": null,
  "created_at": "2026-09-30T15:30:00.000Z"
}

GET /versions/{id}/notes

Review notes and replies on one version. Internal team notes are never returned.

Scope: deliverables:read

ParameterInTypeDescription
idpath, requiredstringThe record's id.
limitquerystringRows per page, 1 to 100. Default 25.
cursorquerystringThe next_cursor from the previous page. Omit it for the first page.
Field of each item in dataTypeDescription
idstringProduction Engine id.
version_idstringProduction Engine id.
parent_idstring or nullThe note this one replies to, or null.
bodystring
time_msinteger or null
end_time_msinteger or null
author_kindone of TEAM, CLIENT
author_namestring
resolved_attimestamp (UTC) or nullISO 8601 instant in UTC.
created_attimestamp (UTC)ISO 8601 instant in UTC.
updated_attimestamp (UTC)ISO 8601 instant in UTC.
Request
curl https://production-engine.com/api/v1/versions/cmexampleversion01/notes \
  -H "Authorization: Bearer $PE_TOKEN"
Response
{
  "data": [
    {
      "id": "cmexamplenote00001",
      "version_id": "cmexampleversion01",
      "parent_id": null,
      "body": "Hold the logo two frames longer.",
      "time_ms": 27400,
      "end_time_ms": null,
      "author_kind": "CLIENT",
      "author_name": "Jordan (Brand)",
      "resolved_at": null,
      "created_at": "2026-09-29T18:02:00.000Z",
      "updated_at": "2026-09-29T18:02:00.000Z"
    }
  ],
  "next_cursor": null
}

POST /versions/{id}/notes

Adds a client-visible review note, or a reply to one, on a version. Notes written through the API are never internal.

Scope: deliverables:write

ParameterInTypeDescription
idpath, requiredstringThe record's id.
Idempotency-KeyheaderstringUp to 255 visible ASCII characters. A retry with the same key and body within 24 hours returns the first response instead of writing again.
Body fieldTypeDescription
bodystring, required
author_kindone of TEAM, CLIENT, requiredTEAM for the production side, CLIENT for the client's reviewers.
author_namestring, required
time_msinteger or nullWhere in the cut the note sits, in milliseconds. Ignored on a link cut, as in the app.
end_time_msinteger or nullEnd of a range, after time_ms.
parent_idstringA top-level, client-visible note on the same version to reply to.
FieldTypeDescription
idstringProduction Engine id.
version_idstringProduction Engine id.
parent_idstring or nullThe note this one replies to, or null.
bodystring
time_msinteger or null
end_time_msinteger or null
author_kindone of TEAM, CLIENT
author_namestring
resolved_attimestamp (UTC) or nullISO 8601 instant in UTC.
created_attimestamp (UTC)ISO 8601 instant in UTC.
updated_attimestamp (UTC)ISO 8601 instant in UTC.
Request
curl -X POST https://production-engine.com/api/v1/versions/cmexampleversion01/notes \
  -H "Authorization: Bearer $PE_TOKEN" \
  -H "Idempotency-Key: $(uuidgen)" \
  -H "Content-Type: application/json" \
  -d '{"body":"Music swell lands late in the last shot.","author_kind":"CLIENT","author_name":"Jordan (Brand)"}'
Response
{
  "id": "cmexamplenote00002",
  "version_id": "cmexampleversion01",
  "parent_id": null,
  "body": "Music swell lands late in the last shot.",
  "time_ms": null,
  "end_time_ms": null,
  "author_kind": "CLIENT",
  "author_name": "Jordan (Brand)",
  "resolved_at": null,
  "created_at": "2026-09-30T15:35:00.000Z",
  "updated_at": "2026-09-30T15:35:00.000Z"
}

Clients and contacts

GET /clients

The workspace's clients, including its reserved Unassigned client.

Scope: contacts:read

ParameterInTypeDescription
limitquerystringRows per page, 1 to 100. Default 25.
cursorquerystringThe next_cursor from the previous page. Omit it for the first page.
updated_sincequerytimestamp (UTC)Only rows changed at or after this ISO 8601 instant.
Field of each item in dataTypeDescription
idstringProduction Engine id.
namestring
is_defaultbooleanTrue for the workspace's reserved Unassigned client.
created_attimestamp (UTC)ISO 8601 instant in UTC.
updated_attimestamp (UTC)ISO 8601 instant in UTC.
Request
curl https://production-engine.com/api/v1/clients \
  -H "Authorization: Bearer $PE_TOKEN"
Response
{
  "data": [
    {
      "id": "cmexampleclient001",
      "name": "Acme Foods",
      "is_default": false,
      "created_at": "2026-08-01T12:00:00.000Z",
      "updated_at": "2026-09-10T12:00:00.000Z"
    }
  ],
  "next_cursor": null
}

GET /clients/{id}

One client.

Scope: contacts:read

ParameterInTypeDescription
idpath, requiredstringThe record's id.
FieldTypeDescription
idstringProduction Engine id.
namestring
is_defaultbooleanTrue for the workspace's reserved Unassigned client.
created_attimestamp (UTC)ISO 8601 instant in UTC.
updated_attimestamp (UTC)ISO 8601 instant in UTC.
Request
curl https://production-engine.com/api/v1/clients/cmexampleclient001 \
  -H "Authorization: Bearer $PE_TOKEN"
Response
{
  "id": "cmexampleclient001",
  "name": "Acme Foods",
  "is_default": false,
  "created_at": "2026-08-01T12:00:00.000Z",
  "updated_at": "2026-09-10T12:00:00.000Z"
}

GET /contacts

Client contacts with name, company, email, phone, role and stage. Deleted contacts are never listed.

Scope: contacts:read

ParameterInTypeDescription
limitquerystringRows per page, 1 to 100. Default 25.
cursorquerystringThe next_cursor from the previous page. Omit it for the first page.
updated_sincequerytimestamp (UTC)Only rows changed at or after this ISO 8601 instant.
Field of each item in dataTypeDescription
idstringProduction Engine id.
namestring
companystring or null
emailstring or null
phonestring or null
rolestring or null
client_idstring or nullProduction Engine id.
stageone of lead, qualifying, active_contact, active_conversation, client_account, client_past, inactive_contact
created_attimestamp (UTC)ISO 8601 instant in UTC.
updated_attimestamp (UTC)ISO 8601 instant in UTC.
Request
curl https://production-engine.com/api/v1/contacts \
  -H "Authorization: Bearer $PE_TOKEN"
Response
{
  "data": [
    {
      "id": "cmexamplecontact01",
      "name": "Jordan Lee",
      "company": "Acme Foods",
      "email": "jordan@acme.example",
      "phone": "512-555-0100",
      "role": "Brand manager",
      "client_id": "cmexampleclient001",
      "stage": "client_account",
      "created_at": "2026-08-01T12:00:00.000Z",
      "updated_at": "2026-09-10T12:00:00.000Z"
    }
  ],
  "next_cursor": null
}

GET /contacts/{id}

One client contact.

Scope: contacts:read

ParameterInTypeDescription
idpath, requiredstringThe record's id.
FieldTypeDescription
idstringProduction Engine id.
namestring
companystring or null
emailstring or null
phonestring or null
rolestring or null
client_idstring or nullProduction Engine id.
stageone of lead, qualifying, active_contact, active_conversation, client_account, client_past, inactive_contact
created_attimestamp (UTC)ISO 8601 instant in UTC.
updated_attimestamp (UTC)ISO 8601 instant in UTC.
Request
curl https://production-engine.com/api/v1/contacts/cmexamplecontact01 \
  -H "Authorization: Bearer $PE_TOKEN"
Response
{
  "id": "cmexamplecontact01",
  "name": "Jordan Lee",
  "company": "Acme Foods",
  "email": "jordan@acme.example",
  "phone": "512-555-0100",
  "role": "Brand manager",
  "client_id": "cmexampleclient001",
  "stage": "client_account",
  "created_at": "2026-08-01T12:00:00.000Z",
  "updated_at": "2026-09-10T12:00:00.000Z"
}

Locations

GET /projects/{id}/locations

The locations attached to a project, with address and status. Never the location's contact person or rate.

Scope: locations:read

ParameterInTypeDescription
idpath, requiredstringThe record's id.
limitquerystringRows per page, 1 to 100. Default 25.
cursorquerystringThe next_cursor from the previous page. Omit it for the first page.
Field of each item in dataTypeDescription
idstringThe project location id.
project_idstringProduction Engine id.
location_idstringThe workspace location it points at.
namestring
addressstring or null
citystring or null
statestring or null
zipstring or null
rolestring or nullWhat the location is for on this job, e.g. Main set.
statusone of SCOUTING, HOLD, CONFIRMED, NEEDS_PERMIT, BLOCKED, RELEASED
created_attimestamp (UTC)ISO 8601 instant in UTC.
updated_attimestamp (UTC)ISO 8601 instant in UTC.
Request
curl https://production-engine.com/api/v1/projects/cmexampleproject01/locations \
  -H "Authorization: Bearer $PE_TOKEN"
Response
{
  "data": [
    {
      "id": "cmexampleprojloc01",
      "project_id": "cmexampleproject01",
      "location_id": "cmexamplelocation1",
      "name": "Eastside Stage",
      "address": "100 Main St",
      "city": "Austin",
      "state": "TX",
      "zip": "78702",
      "role": "Main set",
      "status": "CONFIRMED",
      "created_at": "2026-09-16T10:00:00.000Z",
      "updated_at": "2026-09-20T10:00:00.000Z"
    }
  ],
  "next_cursor": null
}

Crew

GET /projects/{id}/crew

Name, role and booking status only. Never rates, start paperwork or contact details.

Scope: crew:read

ParameterInTypeDescription
idpath, requiredstringThe record's id.
limitquerystringRows per page, 1 to 100. Default 25.
cursorquerystringThe next_cursor from the previous page. Omit it for the first page.
Field of each item in dataTypeDescription
idstringProduction Engine id.
namestring
rolestring
booking_statusone of suggested, held, booked, cancelled, paid or null
Request
curl https://production-engine.com/api/v1/projects/cmexampleproject01/crew \
  -H "Authorization: Bearer $PE_TOKEN"
Response
{
  "data": [
    {
      "id": "cmexamplecrew00001",
      "name": "Dana Ruiz",
      "role": "Gaffer",
      "booking_status": "booked"
    }
  ],
  "next_cursor": null
}

Media drives

GET /projects/{id}/media-drives

Camera and backup drives logged on the project, with the shoot day they came from.

Scope: media:read

ParameterInTypeDescription
idpath, requiredstringThe record's id.
limitquerystringRows per page, 1 to 100. Default 25.
cursorquerystringThe next_cursor from the previous page. Omit it for the first page.
Field of each item in dataTypeDescription
idstringProduction Engine id.
project_idstringProduction Engine id.
shoot_day_idstring or nullProduction Engine id.
labelstring
formatstring
capacitystring
camera_sourcestring
backup_statusone of PRIMARY, MIRRORED, SHIPPED, RECEIVED
created_attimestamp (UTC)ISO 8601 instant in UTC.
updated_attimestamp (UTC)ISO 8601 instant in UTC.
Request
curl https://production-engine.com/api/v1/projects/cmexampleproject01/media-drives \
  -H "Authorization: Bearer $PE_TOKEN"
Response
{
  "data": [
    {
      "id": "cmexampledrive0001",
      "project_id": "cmexampleproject01",
      "shoot_day_id": "cmexampleshootday1",
      "label": "A001",
      "format": "SSD",
      "capacity": "2TB",
      "camera_source": "A camera",
      "backup_status": "MIRRORED",
      "created_at": "2026-11-02T23:10:00.000Z",
      "updated_at": "2026-11-03T01:00:00.000Z"
    }
  ],
  "next_cursor": null
}

Webhook endpoints

GET /webhook-endpoints

The webhook endpoints this token created, newest first. Endpoints made in Production Engine's settings, or by another token, are never listed.

Scope: webhooks:manage

ParameterInTypeDescription
limitquerystringRows per page, 1 to 100. Default 25.
cursorquerystringThe next_cursor from the previous page. Omit it for the first page.
Field of each item in dataTypeDescription
idstringProduction Engine id.
namestring
urlstringThe https URL deliveries are posted to.
eventsarray of one of project_updated, deliverable_created, deliverable_status_changed, deliverable_version_created, review_note_created, schedule_day_created, schedule_day_updated
enabledbooleanFalse while paused. A paused endpoint's queued deliveries are not sent.
failing_sincetimestamp (UTC) or nullWhen a delivery last used up all its retries; null once one succeeds.
last_delivered_attimestamp (UTC) or nullISO 8601 instant in UTC.
created_attimestamp (UTC)ISO 8601 instant in UTC.
updated_attimestamp (UTC)ISO 8601 instant in UTC.
Request
curl https://production-engine.com/api/v1/webhook-endpoints \
  -H "Authorization: Bearer $PE_TOKEN"
Response
{
  "data": [
    {
      "id": "cmexamplewebhook01",
      "name": "Shade review sync",
      "url": "https://hooks.shade.example/production-engine",
      "events": [
        "deliverable_status_changed",
        "deliverable_version_created",
        "project_updated",
        "schedule_day_updated"
      ],
      "enabled": true,
      "failing_since": null,
      "last_delivered_at": "2026-09-30T15:36:02.000Z",
      "created_at": "2026-09-30T15:00:00.000Z",
      "updated_at": "2026-09-30T15:00:00.000Z"
    }
  ],
  "next_cursor": null
}

POST /webhook-endpoints

Registers an https URL to receive signed deliveries for the events chosen. Only the seven REST events can be subscribed; money events and the other app-only events answer 422. Each event also needs the read scope for its record (projects:read for project_updated, deliverables:read for the deliverable and review note events, schedule:read for the shoot day events), or it answers 403 insufficient_scope. The response carries the whsec_ signing secret this once: store it now. A replay of the same Idempotency-Key returns the endpoint without it.

Scope: webhooks:manage

ParameterInTypeDescription
Idempotency-KeyheaderstringUp to 255 visible ASCII characters. A retry with the same key and body within 24 hours returns the first response instead of writing again.
Body fieldTypeDescription
namestring, requiredWhat to call the endpoint, shown in Production Engine's settings.
urlstring, requiredAn https URL on a public address. Redirects are not followed.
eventsarray of one of project_updated, deliverable_created, deliverable_status_changed, deliverable_version_created, review_note_created, schedule_day_created, schedule_day_updated, requiredThe events to send. Duplicates are dropped.
enabledbooleanFalse pauses deliveries; true resumes them.
FieldTypeDescription
idstringProduction Engine id.
namestring
urlstringThe https URL deliveries are posted to.
eventsarray of one of project_updated, deliverable_created, deliverable_status_changed, deliverable_version_created, review_note_created, schedule_day_created, schedule_day_updated
enabledbooleanFalse while paused. A paused endpoint's queued deliveries are not sent.
failing_sincetimestamp (UTC) or nullWhen a delivery last used up all its retries; null once one succeeds.
last_delivered_attimestamp (UTC) or nullISO 8601 instant in UTC.
created_attimestamp (UTC)ISO 8601 instant in UTC.
updated_attimestamp (UTC)ISO 8601 instant in UTC.
secretstringThe whsec_ signing secret, returned in this first response only. A replay of the same Idempotency-Key returns the endpoint without it.
Request
curl -X POST https://production-engine.com/api/v1/webhook-endpoints \
  -H "Authorization: Bearer $PE_TOKEN" \
  -H "Idempotency-Key: $(uuidgen)" \
  -H "Content-Type: application/json" \
  -d '{"name":"Shade review sync","url":"https://hooks.shade.example/production-engine","events":["deliverable_status_changed","deliverable_version_created","project_updated","schedule_day_updated"]}'
Response
{
  "id": "cmexamplewebhook01",
  "name": "Shade review sync",
  "url": "https://hooks.shade.example/production-engine",
  "events": [
    "deliverable_status_changed",
    "deliverable_version_created",
    "project_updated",
    "schedule_day_updated"
  ],
  "enabled": true,
  "failing_since": null,
  "last_delivered_at": null,
  "created_at": "2026-09-30T15:00:00.000Z",
  "updated_at": "2026-09-30T15:00:00.000Z",
  "secret": "whsec_example_2c1f0b7e9a4d4f7c8e6b1a3d"
}

GET /webhook-endpoints/{id}

One endpoint this token created. Any other endpoint answers 404.

Scope: webhooks:manage

ParameterInTypeDescription
idpath, requiredstringThe record's id.
FieldTypeDescription
idstringProduction Engine id.
namestring
urlstringThe https URL deliveries are posted to.
eventsarray of one of project_updated, deliverable_created, deliverable_status_changed, deliverable_version_created, review_note_created, schedule_day_created, schedule_day_updated
enabledbooleanFalse while paused. A paused endpoint's queued deliveries are not sent.
failing_sincetimestamp (UTC) or nullWhen a delivery last used up all its retries; null once one succeeds.
last_delivered_attimestamp (UTC) or nullISO 8601 instant in UTC.
created_attimestamp (UTC)ISO 8601 instant in UTC.
updated_attimestamp (UTC)ISO 8601 instant in UTC.
Request
curl https://production-engine.com/api/v1/webhook-endpoints/cmexamplewebhook01 \
  -H "Authorization: Bearer $PE_TOKEN"
Response
{
  "id": "cmexamplewebhook01",
  "name": "Shade review sync",
  "url": "https://hooks.shade.example/production-engine",
  "events": [
    "deliverable_status_changed",
    "deliverable_version_created",
    "project_updated",
    "schedule_day_updated"
  ],
  "enabled": true,
  "failing_since": null,
  "last_delivered_at": "2026-09-30T15:36:02.000Z",
  "created_at": "2026-09-30T15:00:00.000Z",
  "updated_at": "2026-09-30T15:00:00.000Z"
}

PATCH /webhook-endpoints/{id}

Pauses or resumes the endpoint (enabled), or changes its name, url or events. Resuming clears failing_since. The signing secret stays the same. Only the token that created the endpoint can change it.

Scope: webhooks:manage

ParameterInTypeDescription
idpath, requiredstringThe record's id.
Body fieldTypeDescription
namestringWhat to call the endpoint, shown in Production Engine's settings.
urlstringAn https URL on a public address. Redirects are not followed.
eventsarray of one of project_updated, deliverable_created, deliverable_status_changed, deliverable_version_created, review_note_created, schedule_day_created, schedule_day_updatedThe events to send. Duplicates are dropped.
enabledbooleanFalse pauses deliveries; true resumes them.
FieldTypeDescription
idstringProduction Engine id.
namestring
urlstringThe https URL deliveries are posted to.
eventsarray of one of project_updated, deliverable_created, deliverable_status_changed, deliverable_version_created, review_note_created, schedule_day_created, schedule_day_updated
enabledbooleanFalse while paused. A paused endpoint's queued deliveries are not sent.
failing_sincetimestamp (UTC) or nullWhen a delivery last used up all its retries; null once one succeeds.
last_delivered_attimestamp (UTC) or nullISO 8601 instant in UTC.
created_attimestamp (UTC)ISO 8601 instant in UTC.
updated_attimestamp (UTC)ISO 8601 instant in UTC.
Request
curl -X PATCH https://production-engine.com/api/v1/webhook-endpoints/cmexamplewebhook01 \
  -H "Authorization: Bearer $PE_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"enabled":false}'
Response
{
  "id": "cmexamplewebhook01",
  "name": "Shade review sync",
  "url": "https://hooks.shade.example/production-engine",
  "events": [
    "deliverable_status_changed",
    "deliverable_version_created",
    "project_updated",
    "schedule_day_updated"
  ],
  "enabled": false,
  "failing_since": null,
  "last_delivered_at": "2026-09-30T15:36:02.000Z",
  "created_at": "2026-09-30T15:00:00.000Z",
  "updated_at": "2026-09-30T16:10:00.000Z"
}

DELETE /webhook-endpoints/{id}

Removes the endpoint and its queued deliveries. Only the token that created it can delete it.

Scope: webhooks:manage

ParameterInTypeDescription
idpath, requiredstringThe record's id.
FieldTypeDescription
idstringProduction Engine id.
deletedboolean
Request
curl -X DELETE https://production-engine.com/api/v1/webhook-endpoints/cmexamplewebhook01 \
  -H "Authorization: Bearer $PE_TOKEN"
Response
{
  "id": "cmexamplewebhook01",
  "deleted": true
}

POST /webhook-endpoints/{id}/test

Posts a signed event named test, with an empty data object, to the endpoint now, outside the retry queue, and reports what your server answered. A receiver that fails is still a 200 here, with delivered false.

Scope: webhooks:manage

ParameterInTypeDescription
idpath, requiredstringThe record's id.
Idempotency-KeyheaderstringUp to 255 visible ASCII characters. A retry with the same key and body within 24 hours returns the first response instead of writing again.
FieldTypeDescription
deliveredbooleanTrue when your server answered 2xx within 10 seconds.
status_codeinteger or nullWhat your server answered, or null when it could not be reached.
errorstring or null
Request
curl -X POST https://production-engine.com/api/v1/webhook-endpoints/cmexamplewebhook01/test \
  -H "Authorization: Bearer $PE_TOKEN" \
  -H "Idempotency-Key: $(uuidgen)"
Response
{
  "delivered": true,
  "status_code": 200,
  "error": null
}