Tickets
| Method | Path | Purpose |
|---|---|---|
| GET | /v1/tickets |
List tickets |
| POST | /v1/tickets |
Create ticket |
| GET | /v1/tickets/:id |
Ticket detail |
| POST | /v1/tickets/:id/messages |
Reply |
Creating or updating tickets can emit ticket.created / ticket.updated for Slack and outbound webhooks.
Structured intake
Agencies define request types with required fields under Settings → Intake. Portal clients pick a form when opening a request; the ticket stores intakeFormId and intakeAnswers, and the first message summarizes the answers.
| Method | Path | Purpose |
|---|---|---|
| GET | /v1/intake-forms |
List forms |
| POST | /v1/intake-forms |
Create form |
| PUT | /v1/intake-forms/:id |
Update form |
| DELETE | /v1/intake-forms/:id |
Delete form |
Example create body:
{
"name": "Design change",
"active": true,
"fields": [
{ "key": "page", "label": "Page / screen", "type": "text", "required": true },
{ "key": "priority", "label": "Priority", "type": "select", "required": true, "options": ["Normal", "Urgent"] }
],
"defaults": { "priority": "normal" }
}
When creating a ticket from a form, pass the selected form id and answers in the ticket payload (portal UI does this automatically).
Files
Agency uploads may omit projectId and link later. Nested folders are supported via parentId. Design uploads also appear in the Files library.
| Method | Path | Purpose |
|---|---|---|
| GET | /v1/files |
List files |
| POST | /v1/files/presign |
Presign upload |
| POST | /v1/files/confirm |
Confirm upload |
| GET | /v1/folders |
List folders |
| POST | /v1/folders |
Create folder |
See openapi/v1.yaml in the repository for the complete surface.