Client API overview
The Client API source contract is a tenant-scoped interface for approved partners. V1 has 78 operations: 50 GET, 26 POST, 2 DELETE. It exposes bounded business reads plus operation-specific writes guarded by scopes, idempotency, preconditions, or preview and commit where the route requires them. It is not a read-only API. Production access remains gated behind CLIENT_API_ENABLED, registration, grant, and entitlement; unregistered OAuth clients remain denied.
These docs do not grant access.
These routes require a registered OAuth client, an exact callback URI, and customer consent. Examples on this page are not credentials and cannot authorize a request.
Registered clients only
Unknown or disabled clients are denied. There is no public self-service client-registration endpoint.
Tenant from the grant
Every access token is bound to the customer that approved it. Callers cannot choose another tenant in a path, header, or request body.
Narrow scopes
Read and write permissions are separate. There is no Client API full-access scope, and the MCP-only mcp:full shortcut is never valid here.
Access and registration
Client API access requires a separate developer account, a submitted application, manual review, operator provisioning, and one-time secret delivery. Business owners cannot currently generate Client API credentials or API keys. Owner-created service accounts are MCP-only and cannot call /api/client/v1.
Review-gated and production-gated
After approval and provisioning, a registered client must use an exact HTTPS redirect URI and PKCE S256. The signed-in customer then approves the requested scopes for one business. Unknown or disabled clients cannot start an authorization flow, and the production gate can keep the whole resource surface closed.
What must happen before a first request
- Create a developer account, complete publisher onboarding, and submit a fixed Client API application with its minimum scopes, exact HTTPS redirects, security contact, and data-handling details.
- First AI Employee manually reviews the application. An operator provisions the confidential OAuth client, delivers its secret once through the approved secure channel, and finalizes the registration. The portal never displays the secret.
- The client creates a PKCE verifier and S256 challenge, then keeps the verifier until the callback.
- A signed-in customer approves the scopes on the First AI Employee consent screen.
- The partner exchanges the one-time code and stores the returned tokens securely. OAuth client_credentials is not supported for the Client API.
Quickstart
Use this sequence after First AI Employee registers your integration. The example values are placeholders and will not work as credentials.
1. Submit a developer application
Create a developer account, complete onboarding, and submit the integration name, exact redirect URIs, security contact, data use, retention plan, and requested scopes for manual review and provisioning.
2. Send the customer to consent
Build an Authorization Code request. Use state for request binding and PKCE with S256 for every Client API client.
3. Exchange the code once
POST form-encoded data to /oauth/token. Authorization codes are single use. Reuse is rejected.
4. Call a granted resource
Send the access token as a Bearer credential. Do not put tokens in URLs, logs, analytics, or browser storage.
Read and write scopes are separate. Every write uses its documented operation-specific controls. Some CRM, Forms, job, task, and note mutations use preview and commit; exports, webhooks, and asynchronous job lifecycle use their documented idempotency or preconditions.
OAuth 2.0
First AI Employee acts as an OAuth 2.0 authorization server. The implemented flow supports Authorization Code, exact registered redirect URIs, mandatory PKCE S256 for Client API clients, customer consent, hashed token storage, and refresh-token rotation.
Refresh an existing connection
Authorization flow
- Authorization endpoint: GET /oauth/authorize.
- Token endpoint: POST /oauth/token with application/x-www-form-urlencoded.
- Resource endpoints accept OAuth Bearer access tokens only. Customer session cookies never authorize Client API requests.
- Access token lifetime: 3,600 seconds.
- Refresh tokens rotate and expire after 90 days of inactivity. Every successful refresh returns a replacement.
- The confidential client secret has no automatic or owner-selected expiry. Operator-controlled rotation is separate from customer grant revocation.
- The customer can disconnect the grant, which invalidates the integration.
Token response
Persist the new refresh token before discarding the old one. Presenting a rotated token again is treated as possible theft and can revoke the token family.
Client obligations
- Keep confidential client secrets and refresh tokens in a server-side secrets store.
- Validate state on the callback and send the original PKCE verifier during the code exchange.
- Request only the scopes needed for the current feature.
- On an expired-token 401, refresh once and retry once. Serialize refreshes for each connection and save both replacement tokens atomically. Reconnect if refresh is refused.
- For 403, inspect the error code: a missing scope needs consent; a missing entitlement or denied operation needs the corresponding account access.
Pagination and time
Paginated lists return data and pagination metadata. Cursor behavior depends on the resource: calls, contacts, bookings, and reviews use offset pages; newer CRM and event resources use stable or signed cursors. No cursor is a cross-resource identifier or a promise of a frozen database snapshot.
- Use the limit and filters documented for that endpoint. The base lists default to 50 records and allow 1 to 100; companion APIs can use different defaults.
- Send the returned next_cursor unchanged. Never parse or construct a cursor.
- Keep the same resource, account, sort, and filters when reusing a cursor. If it expires or returns invalid_cursor, restart that resource from the first page.
- Deduplicate by stable id and reconcile periodically. Inserts and updates can change the records observed during a long sync.
- Save a cursor only after its page commits at the destination. Complete periodic traversals or use a documented update filter. A previously seen id can still contain changed data.
Dates, times, and phone numbers
Most timestamps are UTC ISO 8601 strings. Booking starts_at and ends_at are local wall-clock strings without an offset; interpret them with the current time_zone returned by /me. Phone numbers are returned in E.164 where source data permits. Preserve the original field when your destination has stricter formatting.
Errors and retries
OAuth endpoints use error and error_description. Implemented v1 resource errors add a stable request_id for support. Client API limiters use the smaller { error } body, so retry logic must key off the HTTP status and Retry-After. Normal authenticated budgets are isolated by the verified client and business pair. Do not branch on human-readable descriptions.
| HTTP | Meaning | Client action |
|---|---|---|
400 | Malformed request, unsupported field, or invalid OAuth exchange. | Fix the request. Do not retry unchanged. |
401 | Missing, expired, revoked, or otherwise invalid access token. | Refresh once, then reconnect if refresh fails. |
403 | Scope, account entitlement, or operation permission is missing. | Inspect the error code. Request the missing permission or account access. |
404 | The resource is absent or not visible to this tenant. | Treat as absent. Do not infer cross-tenant existence. |
409 | Revision, preview, or idempotency conflict; a request may already be running. | Read the code. Re-read and preview changed records. Retry an in-progress request with the same key and body. |
413 | Request body exceeds the allowed size. | Reduce the payload to the documented limit. |
428 | A required If-Match precondition is missing. | Read the current ETag and review the change before committing. |
429 | Rate limit exceeded. | Honor Retry-After and use exponential backoff with jitter. |
500 / 502 / 503 | Server or provider failure, or temporary unavailability. | Use bounded backoff. Retry writes only with their documented idempotency controls; otherwise reconcile first. |
Calls
Calls are tenant-owned call-history projections. The calls:read scope exposes an allowlisted record with caller details, timing, outcome, intent, sentiment, services mentioned, follow-up state, spam status, summary, and transcript.
Sensitive text
Call summaries and transcripts can contain personal or sensitive free text. Minimize what you copy, encrypt it at rest, restrict destination access, and apply a documented retention period.
Related read-only resources
GET /contactsContacts
Returns identity, notes, tags, classification, history, and recorded consent state. Requires contacts:read.
GET /reviewsReviews
Returns platform, author, rating, text, analysis, and reply status. Requires reviews:read.
Bookings
The bookings:read scope returns booking projections with starts_at, ends_at, status, completed_at, and created_at. The official Client API has no booking write route in v1.
Treat status as source data and preserve the original value before mapping it to a destination enum. A booking record does not by itself prove that a specific third-party calendar still contains an event.
Safe writes
Write controls depend on the operation. A write scope does not replace review of the change or a required precondition. Check the exact route in OpenAPI for its body, headers, and responses.
- Read the current record. Keep its ETag and revision when the operation requires them.
- Request a preview and review the changes, conflicts, and effects. A preview does not apply the change.
- Commit only the reviewed change using the fields returned by that operation. Contacts use expected_revision and preview_key; tasks and Forms have their own contracts.
- Where Idempotency-Key is required, use one key per logical change. Retry an uncertain result with the same key and body. Do not create a new key to hide a conflict.
- If the revision changes or the preview expires, read and preview again before requesting renewed approval.
Webhooks
Event delivery should complement polling, not replace reconciliation. Consumers must be able to process an event more than once and should periodically compare against the source API.
What exists now
Registered Client API integrations can manage verified HTTPS webhook endpoints, receive signed allowlisted events, and inspect sanitized delivery history. Zapier keeps its separate partner-specific hook contract. Subscribable names include the signature.envelope lifecycle family, for example signature.envelope.completed.
Operational boundary
Use webhooks:manage to register a public HTTPS URL and event_names. Save the signing_secret returned once. Within ten minutes, POST the returned verification_challenge as challenge to /webhooks/{id}/verify before delivery. Use events:read for event history and webhook_deliveries:read for sanitized delivery status. Delivery-history reads omit payloads, targets, signing references, and provider response bodies.
- Acknowledge with a 2xx response only after the event is durably queued.
- Use the event id as the idempotency key. Duplicate deliveries must be harmless.
- Verify X-Signature: t=<seconds>,v1=<hex>. Compute HMAC-SHA256 over the timestamp, a period, and the exact raw body bytes, using your endpoint signing secret. Compare signatures in constant time.
- Reject timestamps outside a short replay window, such as 300 seconds. Verify before parsing JSON or applying business effects.
Complete exports
The exports:read scope provides complete CSV portability across every field-allowlisted dataset already available to the account owner. The catalog spans calls, conversations, CRM, jobs, files, sales, tasks, reports, settings, custom fields, and their applicable history.
Live with separate export approval
GET /exports returns the live catalog. GET /exports/{dataset}.csv streams a complete UTF-8 CSV. This broad surface is available only when the customer explicitly approves exports:read.
Safe import sequence
- Fetch the catalog and explicitly select reviewed dataset ids.
- Download each CSV to temporary storage and require a complete connection close.
- Validate headers, counts, JSON cells, time offsets, and required relationships.
- Import into a staging table before promoting destination changes atomically.
- Retry partial downloads from the beginning and delete staging files under the approved retention policy.
Porting playbook
A reliable port is a checkpointed synchronization, not one large request. Start with the smallest useful resource set and record provenance in the destination.
1. Inventory
List required fields and decide whether each destination record is a snapshot, an event, or a mutable object.
2. Minimize
Request only the matching read scopes. Do not export recordings, free text, or phone numbers unless the destination actually needs them.
3. Backfill
Read the API's newest-first order in bounded pages. Commit one page atomically, then persist its cursor.
4. Catch up
Repeat from the checkpoint until lag is small. Overlap the final time window and deduplicate by source id.
5. Reconcile
Compare counts, time bounds, null handling, and a sample of source ids. Keep a failure queue for records that need manual mapping.
6. Operate
Use webhooks for low latency when supported, polling for repair, and an auditable disconnect and deletion procedure.
Recommended destination mapping
| Source field | Destination field | Rule |
|---|---|---|
id | source_id | Store verbatim and make unique with source_system. |
occurred_at | source_occurred_at | Parse as UTC. Preserve precision. |
contact.phone | phone_e164 | Keep null distinct from an empty string. |
summary | source_summary | Treat as sensitive free text. Do not use as a stable key. |
status | source_status | Store the original value before mapping to local enums. |
business_name | source_account_label | Display label only. Never use it as the tenant identifier. |
Versioning
The major version lives in the resource path. OAuth protocol endpoints remain unversioned. Successful resource responses also carry X-FAE-API-Version: v1. A new major version is required when a safe migration cannot preserve existing client behavior.
- New optional response fields are compatible. Clients must ignore fields they do not understand.
- New enum values are compatible. Store unknown values instead of rejecting the whole record.
- Removing or renaming a field, changing its meaning, or making an optional field required is breaking.
- Security fixes can change rejection behavior without a major version when preserving it would be unsafe.
Deprecation policy
V1 is live for approved integrations. A formal deprecation window will be documented before a breaking replacement. Draft and Reserved surfaces can still change before they become available.
Endpoint status
Complete application API catalog
The Client API includes the operations below, including those Zapier does not use. The public OpenAPI contracts describe parameters, request bodies, permissions, and responses without requiring sign-in. Every success response with a body includes a schema; some nested objects allow fields that depend on the resource. Calling the API still requires approved access, consent, and the relevant modules.
- Client API OpenAPI contract
- Forms authoring companion contract
- Zapier API: authentication, events, actions, and searches
- Forms developer API: forms, revisions, and responses
Private dashboard, administration, and infrastructure routes are not supported APIs for external applications and are excluded from this catalog.
Open an operation for its inputs and responses. Follow named schema links for field definitions. Descriptions and wire names come directly from the published contract.
GET /API discovery
Authentication and scopes: OAuth2: authenticated
Responses
401Missing, invalid, expired or revoked bearer token.
Response headers
WWW-Authenticatestringapplication/jsonErrorGET /meCurrent tenant and grant
Authentication and scopes: OAuth2: authenticated
Responses
401Missing, invalid, expired or revoked bearer token.
Response headers
WWW-Authenticatestringapplication/jsonErrorGET /openapi.jsonOpenAPI document
Authentication and scopes: OAuth2: authenticated
Responses
401Missing, invalid, expired or revoked bearer token.
Response headers
WWW-Authenticatestringapplication/jsonErrorGET /callscalls
Authentication and scopes: OAuth2: calls:read
Parameters
limit · query · optionalintegerminimum: 1maximum: 100default: 50
cursor · query · optionalOpaque continuation cursor returned in meta.next_cursor. Cursor semantics are resource-specific; deduplicate by resource id and reconcile from the first page after a long export.
stringResponses
200A tenant-scoped page.
401Missing, invalid, expired or revoked bearer token.
Response headers
WWW-Authenticatestringapplication/jsonError429Client API ingress or verified client-and-tenant rate exceeded. Honor Retry-After.
Response headers
Retry-Afterstringapplication/jsonRateLimitErrorGET /contactscontacts
Authentication and scopes: OAuth2: contacts:read
Parameters
limit · query · optionalintegerminimum: 1maximum: 100default: 50
cursor · query · optionalOpaque continuation cursor returned in meta.next_cursor. Cursor semantics are resource-specific; deduplicate by resource id and reconcile from the first page after a long export.
stringResponses
200A tenant-scoped page.
401Missing, invalid, expired or revoked bearer token.
Response headers
WWW-Authenticatestringapplication/jsonError429Client API ingress or verified client-and-tenant rate exceeded. Honor Retry-After.
Response headers
Retry-Afterstringapplication/jsonRateLimitErrorGET /crm/contactsCRM contacts
Authentication and scopes: OAuth2: contacts:read
Parameters
limit · query · optionalintegerminimum: 1maximum: 100default: 25
cursor · query · optionalOpaque continuation cursor returned in meta.next_cursor. Cursor semantics are resource-specific; deduplicate by resource id and reconcile from the first page after a long export.
stringemail · query · optionalstringmaxLength: 255
phone · query · optionalstringmaxLength: 50
updated_since · query · optionalstringformat: "date-time"
fields · query · optionalOptional comma-separated selection: id, name, phone, email, notes, tags, classification, total_jobs, lifetime_value, consent, first_seen_at, last_seen_at, created_at, updated_at, lead_source, lifecycle_stage, qualification, revision.
stringResponses
200A tenant-scoped page.
application/jsonobjectdata· requiredarrayArray items: CrmContactpage· requiredobjectnext_cursor· requiredstring | nullhas_more· requiredboolean
meta· requiredobjectrequest_id· requiredstringversion· requiredSchemaconst: "1"
limit· requiredintegerhas_more· requiredbooleannext_cursor· requiredstring | null
401Missing, invalid, expired or revoked bearer token.
Response headers
WWW-Authenticatestringapplication/jsonError429Client API ingress or verified client-and-tenant rate exceeded. Honor Retry-After.
Response headers
Retry-Afterstringapplication/jsonRateLimitErrorGET /crm/contacts/{id}Read one CRM contact
Authentication and scopes: OAuth2: contacts:read
Parameters
id · path · requiredstringformat: "uuid"
fields · query · optionalOptional comma-separated selection: id, name, phone, email, notes, tags, classification, total_jobs, lifetime_value, consent, first_seen_at, last_seen_at, created_at, updated_at, lead_source, lifecycle_stage, qualification, revision.
stringResponses
200The tenant-owned CRM contact and its strong ETag.
Response headers
ETagstringapplication/jsonobjectdata· required- CrmContact
meta· requiredobject
401Missing, invalid, expired or revoked bearer token.
Response headers
WWW-Authenticatestringapplication/jsonError404Contact not found in this tenant.
429Client API ingress or verified client-and-tenant rate exceeded. Honor Retry-After.
Response headers
Retry-Afterstringapplication/jsonRateLimitErrorPOST /crm/contacts:previewPreview a CRM contact create or update without changing data
Authentication and scopes: OAuth2: contacts:write
Request body · required
application/jsonCrmContactInputResponses
200Exact before/after preview and commit binding.
application/jsonobjectdata· required- ContactUpsertPreview
meta· requiredobjectrequest_id· requiredstringversion· requiredSchemaconst: "1"
401Missing, invalid, expired or revoked bearer token.
Response headers
WWW-Authenticatestringapplication/jsonError429Client API ingress or verified client-and-tenant rate exceeded. Honor Retry-After.
Response headers
Retry-Afterstringapplication/jsonRateLimitErrorPOST /crm/contacts:commitCommit a previously previewed CRM contact create or update
Authentication and scopes: OAuth2: contacts:write
Parameters
Idempotency-Key · header · requiredstringminLength: 8maxLength: 256
If-Match · header · optionalRequired for updates; use the ETag returned by GET or preview.
stringRequest body · required
application/jsonobjectOnly the listed fields are accepted.
phone· requiredstringminLength: 1maxLength: 50
email· optionalstringmaxLength: 255
name· optionalstringmaxLength: 255
expected_revision· requiredinteger | nullminimum: 1
preview_key· optionalstring | null
Responses
200Existing contact updated or already current.
Response headers
ETagstringapplication/jsonobjectdata· required- CrmContact
meta· requiredobjectrequest_id· requiredstringversion· requiredSchemaconst: "1"
outcome· requiredstring
201Contact created.
Response headers
LocationstringETagstringapplication/jsonobjectdata· required- CrmContact
meta· requiredobjectrequest_id· requiredstringversion· requiredSchemaconst: "1"
outcome· requiredstring
401Missing, invalid, expired or revoked bearer token.
Response headers
WWW-Authenticatestringapplication/jsonError409Idempotency, preview, or revision conflict.
428If-Match is required for an update.
429Client API ingress or verified client-and-tenant rate exceeded. Honor Retry-After.
Response headers
Retry-Afterstringapplication/jsonRateLimitErrorGET /formsforms
Authentication and scopes: OAuth2: front_desk:forms:read OR OAuth2: forms:lifecycle
Parameters
limit · query · optionalintegerminimum: 1maximum: 100default: 25
cursor · query · optionalOpaque continuation cursor returned in meta.next_cursor. Cursor semantics are resource-specific; deduplicate by resource id and reconcile from the first page after a long export.
stringstatus · query · optionalSchemaenum: ["draft","published","closed"]
updated_since · query · optionalstringformat: "date-time"
fields · query · optionalOptional comma-separated selection: id, ref, title, status, version, received_responses, created_at, updated_at, published_at, draft_revision.
stringResponses
200A tenant-scoped page.
application/jsonobjectdata· requiredarrayArray items: FormsAuthoringFormpage· requiredobjectnext_cursor· requiredstring | nullhas_more· requiredboolean
meta· requiredobjectrequest_id· requiredstringversion· requiredSchemaconst: "1"
limit· requiredintegerhas_more· requiredbooleannext_cursor· requiredstring | null
401Missing, invalid, expired or revoked bearer token.
Response headers
WWW-Authenticatestringapplication/jsonError429Client API ingress or verified client-and-tenant rate exceeded. Honor Retry-After.
Response headers
Retry-Afterstringapplication/jsonRateLimitErrorPOST /formsCreate an unpublished form draft
Requires CLIENT_API_ENABLED=on, a registered client, an owner-consented forms:lifecycle grant, and live Forms entitlement. One Idempotency-Key (16 to 128 chars) binds the tenant, client, grant, operation, and canonical request; exact retries replay for 24 hours.
Authentication and scopes: OAuth2: forms:lifecycle
Parameters
Idempotency-Key · header · requiredOne value only. Same request replays; different request returns 409.
stringpattern: "^[A-Za-z0-9._:-]{16,128}$"
Request body · required
application/jsonobjectOnly the listed fields are accepted.
definition· requiredobjectref· optionalstringmaxLength: 64
Responses
201Unpublished draft created.
Response headers
LocationstringETagstringapplication/jsonobjectOnly the listed fields are accepted.
data· required- FormsAuthoringForm
meta· required- FormsAuthoringMeta
401Missing, invalid, expired or revoked bearer token.
Response headers
WWW-Authenticatestringapplication/jsonError409Idempotency key mismatch, concurrent in-flight request, or deterministic command conflict.
429Client API ingress or verified client-and-tenant rate exceeded. Honor Retry-After.
Response headers
Retry-Afterstringapplication/jsonRateLimitErrorGET /forms/{id}Read one form draft definition
Authentication and scopes: OAuth2: front_desk:forms:read OR OAuth2: forms:lifecycle
Parameters
id · path · requiredstringformat: "uuid"
fields · query · optionalOptional comma-separated selection: id, ref, title, status, version, received_responses, created_at, updated_at, published_at, draft_revision, definition. Select definition explicitly to retrieve the draft. id is always included.
stringResponses
200The tenant-owned form and strong draft ETag.
application/jsonobjectOnly the listed fields are accepted.
data· required- FormsAuthoringForm
meta· required- FormsAuthoringMeta
401Missing, invalid, expired or revoked bearer token.
Response headers
WWW-Authenticatestringapplication/jsonError404Form not found.
429Client API ingress or verified client-and-tenant rate exceeded. Honor Retry-After.
Response headers
Retry-Afterstringapplication/jsonRateLimitErrorDELETE /forms/{id}Delete only a never-published empty draft
Requires CLIENT_API_ENABLED=on, a registered client, an owner-consented forms:lifecycle grant, and the current strong ETag plus canonical draft revision. Only an empty never-published draft can be deleted; published forms and response history are out of scope.
Authentication and scopes: OAuth2: forms:lifecycle
Parameters
id · path · requiredstringformat: "uuid"
Idempotency-Key · header · requiredstringpattern: "^[A-Za-z0-9._:-]{16,128}$"
If-Match · header · requiredOne current strong ETag. The body must also contain the current draft revision.
stringpattern: "^\"v1:[a-f0-9]{32}\"$"
Request body · required
application/jsonobjectOnly the listed fields are accepted.
expected_draft_revision· requiredstringformat: "date-time"
Responses
200Empty never-published draft deleted.
Response headers
ETagstringapplication/jsonobjectOnly the listed fields are accepted.
data· required- FormsAuthoringDeleted
meta· required- FormsAuthoringMeta
401Missing, invalid, expired or revoked bearer token.
Response headers
WWW-Authenticatestringapplication/jsonError404Form not found in this tenant.
409Idempotency, revision, or delete-policy conflict.
428If-Match is required.
429Client API ingress or verified client-and-tenant rate exceeded. Honor Retry-After.
Response headers
Retry-Afterstringapplication/jsonRateLimitErrorGET /forms/{formId}/schedulingRead bounded scheduling configuration
Returns sanitized scheduler-question settings from the current form draft. It does not query provider availability or create a booking.
Authentication and scopes: OAuth2: front_desk:forms:read
Parameters
formId · path · requiredstringformat: "uuid"
Responses
200Scheduler fields and explicit no-provider-effect markers.
application/jsonobjectdata· required- FormScheduling
meta· requiredobjectrequest_id· requiredstring
401Missing, invalid, expired or revoked bearer token.
Response headers
WWW-Authenticatestringapplication/jsonError404Form not found in this tenant.
429Client API ingress or verified client-and-tenant rate exceeded. Honor Retry-After.
Response headers
Retry-Afterstringapplication/jsonRateLimitErrorPOST /forms/{id}:applyOperationsApply a closed batch of edit operations to one form draft
Authentication and scopes: OAuth2: forms:write
Parameters
id · path · requiredstringformat: "uuid"
Idempotency-Key · header · requiredstringminLength: 8maxLength: 256
If-Match · header · requiredStrong ETag returned by GET /forms/{id}.
stringRequest body · required
application/jsonobjectOnly the listed fields are accepted.
version· requiredintegerconst: 1
operations· requiredarrayminItems: 1maxItems: 100
Array items:objectexpected_draft_revision· requiredstringformat: "date-time"
Responses
200Saved draft, operation summary, and exact diff.
Response headers
ETagstringapplication/jsonobjectOnly the listed fields are accepted.
data· required- FormsAuthoringApplied
meta· required- FormsAuthoringMeta
401Missing, invalid, expired or revoked bearer token.
Response headers
WWW-Authenticatestringapplication/jsonError409Draft revision, idempotency, or operation conflict.
428If-Match is required.
429Client API ingress or verified client-and-tenant rate exceeded. Honor Retry-After.
Response headers
Retry-Afterstringapplication/jsonRateLimitErrorPOST /forms/validateValidate a form definition without persisting
Requires CLIENT_API_ENABLED=on, a registered client, and a forms:write or owner-consented forms:lifecycle grant. Canonical semantic validation only; a valid document is not a publication approval.
Authentication and scopes: OAuth2: forms:write OR OAuth2: forms:lifecycle
Request body · required
application/jsonobjectOnly the listed fields are accepted.
definition· requiredobject
Responses
200Semantic validation result; publication_authorized is always false.
application/jsonobjectOnly the listed fields are accepted.
data· required- FormsAuthoringValidation
meta· required- FormsAuthoringMeta
401Missing, invalid, expired or revoked bearer token.
Response headers
WWW-Authenticatestringapplication/jsonError429Client API ingress or verified client-and-tenant rate exceeded. Honor Retry-After.
Response headers
Retry-Afterstringapplication/jsonRateLimitErrorPOST /forms/{id}/duplicateCopy a definition into a new draft
Requires CLIENT_API_ENABLED=on, a registered client, an owner-consented forms:lifecycle grant, and live Forms entitlement. New draft carries stable child refs and no responses.
Authentication and scopes: OAuth2: forms:lifecycle
Parameters
id · path · requiredstringformat: "uuid"
Idempotency-Key · header · requiredstringpattern: "^[A-Za-z0-9._:-]{16,128}$"
If-Match · header · requiredOne current strong ETag. The body must also contain the current draft revision.
stringpattern: "^\"v1:[a-f0-9]{32}\"$"
Request body · required
application/jsonobjectOnly the listed fields are accepted.
ref· requiredstringmaxLength: 64
title· optionalstringmaxLength: 300
expected_draft_revision· requiredstringformat: "date-time"
Responses
201New draft duplicated.
Response headers
LocationstringETagstringapplication/jsonobjectOnly the listed fields are accepted.
data· required- FormsAuthoringForm
meta· required- FormsAuthoringMeta
401Missing, invalid, expired or revoked bearer token.
Response headers
WWW-Authenticatestringapplication/jsonError404Form not found in this tenant.
409Idempotency, revision, or duplicate conflict.
428If-Match is required.
429Client API ingress or verified client-and-tenant rate exceeded. Honor Retry-After.
Response headers
Retry-Afterstringapplication/jsonRateLimitErrorPOST /forms/{id}/publish-previewReview the exact publish candidate
Requires CLIENT_API_ENABLED=on, a registered client, an owner-consented forms:lifecycle grant, and live Forms entitlement. No publication occurs. Preview receipts expire after ten minutes; reuse the same Idempotency-Key for publication.
Authentication and scopes: OAuth2: forms:lifecycle
Parameters
id · path · requiredstringformat: "uuid"
Idempotency-Key · header · requiredstringpattern: "^[A-Za-z0-9._:-]{16,128}$"
If-Match · header · requiredOne current strong ETag. The body must also contain the current draft revision.
stringpattern: "^\"v1:[a-f0-9]{32}\"$"
Request body · required
application/jsonobjectOnly the listed fields are accepted.
expected_draft_revision· requiredstringformat: "date-time"
expected_published_version· requiredintegerminimum: 0
Responses
200Exact publish candidate and expiring preview receipt.
Response headers
ETagstringapplication/jsonobjectOnly the listed fields are accepted.
data· required- FormsAuthoringPreparedPreview
meta· required- FormsAuthoringMeta
401Missing, invalid, expired or revoked bearer token.
Response headers
WWW-Authenticatestringapplication/jsonError404Form not found in this tenant.
409Idempotency, revision, or review-gate conflict.
428If-Match is required.
429Client API ingress or verified client-and-tenant rate exceeded. Honor Retry-After.
Response headers
Retry-Afterstringapplication/jsonRateLimitErrorPOST /forms/{id}/publishPublish the approved preview as a new revision
Requires CLIENT_API_ENABLED=on, a registered client, an owner-consented forms:lifecycle grant, and live Forms entitlement. Requires the preview receipt, unchanged revisions, and confirmed:true. Never publish automatically from validation.
Authentication and scopes: OAuth2: forms:lifecycle
Parameters
id · path · requiredstringformat: "uuid"
Idempotency-Key · header · requiredReuse the preview key. Same request replays; different request returns 409.
stringpattern: "^[A-Za-z0-9._:-]{16,128}$"
If-Match · header · requiredOne current strong ETag. The body must also contain the current draft revision.
stringpattern: "^\"v1:[a-f0-9]{32}\"$"
Request body · required
application/jsonobjectOnly the listed fields are accepted.
expected_draft_revision· requiredstringformat: "date-time"
expected_published_version· requiredintegerminimum: 0
preview_receipt· requiredstringminLength: 40maxLength: 2000
confirmed· requiredSchemaconst: true
Responses
200New immutable published revision.
Response headers
ETagstringapplication/jsonobjectOnly the listed fields are accepted.
data· required- FormsAuthoringForm
meta· required- FormsAuthoringMeta
401Missing, invalid, expired or revoked bearer token.
Response headers
WWW-Authenticatestringapplication/jsonError404Form not found in this tenant.
409Idempotency, revision, receipt, or review-gate conflict.
428If-Match is required.
429Client API ingress or verified client-and-tenant rate exceeded. Honor Retry-After.
Response headers
Retry-Afterstringapplication/jsonRateLimitErrorPOST /forms/{id}/closeStop collection without deleting history
Requires CLIENT_API_ENABLED=on, a registered client, and an owner-consented forms:lifecycle grant. Close remains available after module deactivation; history is retained.
Authentication and scopes: OAuth2: forms:lifecycle
Parameters
id · path · requiredstringformat: "uuid"
Idempotency-Key · header · requiredstringpattern: "^[A-Za-z0-9._:-]{16,128}$"
If-Match · header · requiredOne current strong ETag. The body must also contain the current draft revision.
stringpattern: "^\"v1:[a-f0-9]{32}\"$"
Request body · required
application/jsonobjectOnly the listed fields are accepted.
expected_draft_revision· requiredstringformat: "date-time"
Responses
200Form closed; history retained.
Response headers
ETagstringapplication/jsonobjectOnly the listed fields are accepted.
data· required- FormsAuthoringForm
meta· required- FormsAuthoringMeta
401Missing, invalid, expired or revoked bearer token.
Response headers
WWW-Authenticatestringapplication/jsonError404Form not found in this tenant.
409Idempotency, revision, or lifecycle-state conflict.
428If-Match is required.
429Client API ingress or verified client-and-tenant rate exceeded. Honor Retry-After.
Response headers
Retry-Afterstringapplication/jsonRateLimitErrorGET /forms/schema.jsonRead the Forms authoring structural schema
Requires CLIENT_API_ENABLED=on, a registered client, and a forms read or owner-consented forms:lifecycle grant. Structural checks only; POST /forms/validate runs the canonical semantic validator. The versioned Forms authoring OpenAPI companion (getFormsAuthoringContract) lives at GET /forms/openapi.json and is cross-linked here rather than duplicated.
Authentication and scopes: OAuth2: front_desk:forms:read OR OAuth2: forms:lifecycle
Responses
200Structural JSON Schema versioned in $comment.
application/jsonobject401Missing, invalid, expired or revoked bearer token.
Response headers
WWW-Authenticatestringapplication/jsonError429Client API ingress or verified client-and-tenant rate exceeded. Honor Retry-After.
Response headers
Retry-Afterstringapplication/jsonRateLimitErrorGET /forms/{formId}/responsesList form responses with stable historical columns
Newest-first tenant-scoped keyset page. The opaque cursor is bound to this form and the complete filter fingerprint; unknown query parameters are rejected.
Authentication and scopes: OAuth2: forms:responses:read
Parameters
formId · path · requiredstringformat: "uuid"
limit · query · optionalintegerminimum: 1maximum: 100default: 50
cursor · query · optionalOpaque continuation cursor issued for this exact form and filter.
stringstatus · query · optionalComma-separated partial, completed, or spam states. Defaults to partial,completed.
stringfrom · query · optionalInclusive YYYY-MM-DD in the tenant time zone or a full ISO timestamp.
stringto · query · optionalExclusive YYYY-MM-DD in the tenant time zone or a full ISO timestamp; must follow from.
stringending · query · optionalEnding reference from the form definition.
stringpattern: "^[a-z0-9_-]{1,64}$"
revision · query · optionalPublished version number, or any.
stringq · query · optionalFree-text search over text, email, and phone answers only.
stringmaxLength: 200
fields · query · optionalJSON-encoded array of at most 20 {ref, op, value} field predicates.
stringtag · query · optionalJSON-encoded {op, value} tag predicate.
stringowner_status · query · optionalstringenum: ["new","in_review","done"]
correction_state · query · optionalstringenum: ["corrected","uncorrected"]
Responses
200Response page, filter definition, total count, and stable current-plus-historical column descriptors.
application/jsonFormResponseCollection401Missing, invalid, expired or revoked bearer token.
Response headers
WWW-Authenticatestringapplication/jsonError413Historical revision, unknown-field, or stable-column reconstruction exceeds the public bound.
application/jsonError429Client API ingress or verified client-and-tenant rate exceeded. Honor Retry-After.
Response headers
Retry-Afterstringapplication/jsonRateLimitErrorGET /forms/{formId}/responses/{responseId}Read one form response
Returns one tenant- and form-bound response with the same stable column descriptors as the list route. No query parameters are accepted.
Authentication and scopes: OAuth2: forms:responses:read
Parameters
formId · path · requiredstringformat: "uuid"
responseId · path · requiredstringformat: "uuid"
Responses
200Response and stable current-plus-historical column descriptors.
application/jsonFormResponseResource401Missing, invalid, expired or revoked bearer token.
Response headers
WWW-Authenticatestringapplication/jsonError413Historical revision, unknown-field, or stable-column reconstruction exceeds the public bound.
application/jsonError429Client API ingress or verified client-and-tenant rate exceeded. Honor Retry-After.
Response headers
Retry-Afterstringapplication/jsonRateLimitErrorGET /forms/{formId}/analyticsRead revision-pinned form analytics
Deterministic branch-aware analytics. Every metric includes its numerator, denominator, definition, and exclusions; synthetic responses are excluded. Only revision_id is accepted.
Authentication and scopes: OAuth2: forms:analytics:read
Parameters
formId · path · requiredstringformat: "uuid"
revision_id · query · requiredImmutable form revision to analyze.
stringformat: "uuid"
Responses
401Missing, invalid, expired or revoked bearer token.
Response headers
WWW-Authenticatestringapplication/jsonError429Client API ingress or verified client-and-tenant rate exceeded. Honor Retry-After.
Response headers
Retry-Afterstringapplication/jsonRateLimitErrorGET /forms/{formId}/insightsList stored evidence-backed form insights
Reads unexpired tenant-owned insight artifacts with their source population fingerprint and row counts. It never invokes a model or creates a new insight.
Authentication and scopes: OAuth2: forms:analytics:read
Parameters
formId · path · requiredstringformat: "uuid"
limit · query · optionalintegerminimum: 1maximum: 50default: 20
Responses
200Stored insight artifacts and evidence citations.
application/jsonobjectdata· requiredarrayArray items: StoredFormInsightmeta· requiredobjectrequest_id· requiredstringlimit· requiredintegergenerated_new_insight· requiredSchemaconst: false
401Missing, invalid, expired or revoked bearer token.
Response headers
WWW-Authenticatestringapplication/jsonError404Form not found in this tenant.
429Client API ingress or verified client-and-tenant rate exceeded. Honor Retry-After.
Response headers
Retry-Afterstringapplication/jsonRateLimitErrorPOST /forms/{formId}/exportsCreate an idempotent frozen form-response export
Creates CSV or XLSX bytes from a response population and stable column manifest frozen in one transaction at request time. Unknown body, filter, and query keys are rejected.
Authentication and scopes: OAuth2: exports:create
Parameters
formId · path · requiredstringformat: "uuid"
Idempotency-Key · header · requiredDurably bound to the tenant, grant, client, operation, path, and canonical request. Same request replays; different request returns 409.
stringminLength: 8maxLength: 255pattern: "^[A-Za-z0-9][A-Za-z0-9._:-]{7,254}$"
Request body · required
application/jsonFormExportRequestResponses
202Frozen export created, or a completed idempotent response replayed.
Response headers
Idempotency-Replayedtrue only when replaying the stored response.
stringenum: ["true"]
application/jsonFormExportResource401Missing, invalid, expired or revoked bearer token.
Response headers
WWW-Authenticatestringapplication/jsonError409Idempotency key mismatch, concurrent in-flight request, or deterministic command conflict.
Response headers
Retry-AfterPresent while an equivalent request is still in flight.
stringapplication/jsonError429Client API rate limit exceeded, or five exports are already queued or running for this tenant.
Response headers
Retry-Afterstringapplication/jsonSchemaGET /forms/{formId}/exports/{exportId}Read form export status
Returns tenant-bound lifecycle and progress metadata only. No object keys, file bytes, download URLs, or query parameters.
Authentication and scopes: OAuth2: exports:read
Parameters
formId · path · requiredstringformat: "uuid"
exportId · path · requiredstringformat: "uuid"
Responses
401Missing, invalid, expired or revoked bearer token.
Response headers
WWW-Authenticatestringapplication/jsonError429Client API ingress or verified client-and-tenant rate exceeded. Honor Retry-After.
Response headers
Retry-Afterstringapplication/jsonRateLimitErrorGET /forms/{formId}/exports/{exportId}/downloadDownload a completed form export once
Atomically consumes the export one-time download and returns CSV or XLSX bytes directly. The job must be ready, unexpired, and not previously downloaded; no permanent URL is returned.
Authentication and scopes: OAuth2: exports:read
Parameters
formId · path · requiredstringformat: "uuid"
exportId · path · requiredstringformat: "uuid"
Responses
200Completed attachment. A successful response consumes the one-time download.
Response headers
Content-DispositionServer-generated attachment filename.
stringCache-Controlstringconst: "no-store"
text/csvstringapplication/vnd.openxmlformats-officedocument.spreadsheetml.sheetstringformat: "binary"
401Missing, invalid, expired or revoked bearer token.
Response headers
WWW-Authenticatestringapplication/jsonError410Export expired or its one-time download was already consumed. Both use the generic not_found error body.
application/jsonError429Client API ingress or verified client-and-tenant rate exceeded. Honor Retry-After.
Response headers
Retry-Afterstringapplication/jsonRateLimitErrorGET /payments/deposit-capabilityRead deposit-link capability state
Reports whether the business-owned deposit-link lane is configured. It never returns the payment URL, charges, refunds, or confirms settlement.
Authentication and scopes: OAuth2: bookings:read
Responses
200Provider-free payment capability state.
application/jsonobjectdata· required- DepositCapability
meta· requiredobjectrequest_id· requiredstring
401Missing, invalid, expired or revoked bearer token.
Response headers
WWW-Authenticatestringapplication/jsonError429Client API ingress or verified client-and-tenant rate exceeded. Honor Retry-After.
Response headers
Retry-Afterstringapplication/jsonRateLimitErrorPOST /workflows/previewPreview a bounded CRM workflow rule
Validates and evaluates one closed workflow rule against exact supplied facts. The deterministic response includes an idempotency basis and never executes an action.
Authentication and scopes: OAuth2: automations:read
Request body · required
application/jsonobjectResponses
200Deterministic preview-only evaluation.
application/jsonobjectdata· required- WorkflowPreview
meta· requiredobjectrequest_id· requiredstring
401Missing, invalid, expired or revoked bearer token.
Response headers
WWW-Authenticatestringapplication/jsonError429Client API ingress or verified client-and-tenant rate exceeded. Honor Retry-After.
Response headers
Retry-Afterstringapplication/jsonRateLimitErrorGET /bookingsbookings
Authentication and scopes: OAuth2: bookings:read
Parameters
limit · query · optionalintegerminimum: 1maximum: 100default: 50
cursor · query · optionalOpaque continuation cursor returned in meta.next_cursor. Cursor semantics are resource-specific; deduplicate by resource id and reconcile from the first page after a long export.
stringResponses
200A tenant-scoped page.
401Missing, invalid, expired or revoked bearer token.
Response headers
WWW-Authenticatestringapplication/jsonError429Client API ingress or verified client-and-tenant rate exceeded. Honor Retry-After.
Response headers
Retry-Afterstringapplication/jsonRateLimitErrorGET /reviewsreviews
Authentication and scopes: OAuth2: reviews:read
Parameters
limit · query · optionalintegerminimum: 1maximum: 100default: 50
cursor · query · optionalOpaque continuation cursor returned in meta.next_cursor. Cursor semantics are resource-specific; deduplicate by resource id and reconcile from the first page after a long export.
stringResponses
200A tenant-scoped page.
401Missing, invalid, expired or revoked bearer token.
Response headers
WWW-Authenticatestringapplication/jsonError429Client API ingress or verified client-and-tenant rate exceeded. Honor Retry-After.
Response headers
Retry-Afterstringapplication/jsonRateLimitErrorGET /client-accountsclient accounts
Authentication and scopes: OAuth2: client_accounts:read
Parameters
limit · query · optionalintegerminimum: 1maximum: 100default: 50
cursor · query · optionalOpaque continuation cursor returned in meta.next_cursor. Cursor semantics are resource-specific; deduplicate by resource id and reconcile from the first page after a long export.
stringResponses
200A tenant-scoped page.
application/jsonobjectdata· requiredarrayArray items: ClientAccountmeta· required- PageMeta
{
"data": [
{
"id": "11111111-1111-4111-8111-111111111111",
"name": "Northside Property Group",
"status": "active"
}
],
"meta": {
"limit": 50,
"has_more": false,
"next_cursor": null
}
}401Missing, invalid, expired or revoked bearer token.
Response headers
WWW-Authenticatestringapplication/jsonError429Client API ingress or verified client-and-tenant rate exceeded. Honor Retry-After.
Response headers
Retry-Afterstringapplication/jsonRateLimitErrorGET /jobsjobs
Authentication and scopes: OAuth2: jobs:read
Parameters
limit · query · optionalintegerminimum: 1maximum: 100default: 50
cursor · query · optionalOpaque continuation cursor returned in meta.next_cursor. Cursor semantics are resource-specific; deduplicate by resource id and reconcile from the first page after a long export.
stringfrom · query · optionalOptional UTC range start with seconds and a Z suffix; optional fractional seconds have 1 to 3 digits. Supply with to. The range may not exceed 366 days.
stringformat: "date-time"pattern: "^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(?:\\.\\d{1,3})?Z$"
to · query · optionalOptional UTC range end with seconds and a Z suffix; optional fractional seconds have 1 to 3 digits. Supply with from.
stringformat: "date-time"pattern: "^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(?:\\.\\d{1,3})?Z$"
Responses
200A tenant-scoped page.
401Missing, invalid, expired or revoked bearer token.
Response headers
WWW-Authenticatestringapplication/jsonError429Client API ingress or verified client-and-tenant rate exceeded. Honor Retry-After.
Response headers
Retry-Afterstringapplication/jsonRateLimitErrorPOST /jobsPrepare one bounded asynchronous Client API job
Authentication and scopes: OAuth2: jobs:write
Parameters
Idempotency-Key · header · requiredstringminLength: 8maxLength: 256
Request body · required
application/jsonClientApiJobCreateRequestResponses
202Queued job status. Repeating the same idempotency key and request replays the same job.
Response headers
ETagstringapplication/jsonClientApiJobResource401Missing, invalid, expired or revoked bearer token.
Response headers
WWW-Authenticatestringapplication/jsonError409Idempotency key conflicts with a different request.
429Client API ingress or verified client-and-tenant rate exceeded. Honor Retry-After.
Response headers
Retry-Afterstringapplication/jsonRateLimitErrorGET /jobs/{id}Read one asynchronous Client API job
Authentication and scopes: OAuth2: jobs:read
Parameters
id · path · requiredstringformat: "uuid"
If-None-Match · header · optionalstringResponses
200Tenant and grant-bound job status with an opaque result manifest.
Response headers
ETagstringapplication/jsonClientApiJobResource304The job version has not changed.
Response headers
ETagstring401Missing, invalid, expired or revoked bearer token.
Response headers
WWW-Authenticatestringapplication/jsonError404Job not found for this tenant and grant.
429Client API ingress or verified client-and-tenant rate exceeded. Honor Retry-After.
Response headers
Retry-Afterstringapplication/jsonRateLimitErrorPOST /jobs/{id}/cancelCancel one queued or running asynchronous job
Authentication and scopes: OAuth2: jobs:write
Parameters
id · path · requiredstringformat: "uuid"
If-Match · header · requiredstringResponses
401Missing, invalid, expired or revoked bearer token.
Response headers
WWW-Authenticatestringapplication/jsonError404Job not found.
409The version or lifecycle state is no longer cancellable.
428If-Match is required.
429Client API ingress or verified client-and-tenant rate exceeded. Honor Retry-After.
Response headers
Retry-Afterstringapplication/jsonRateLimitErrorPOST /jobs/{id}/retryRetry one retryable failed asynchronous job
Authentication and scopes: OAuth2: jobs:write
Parameters
id · path · requiredstringformat: "uuid"
If-Match · header · requiredstringResponses
401Missing, invalid, expired or revoked bearer token.
Response headers
WWW-Authenticatestringapplication/jsonError404Job not found.
409The version or lifecycle state is not retryable.
428If-Match is required.
429Client API ingress or verified client-and-tenant rate exceeded. Honor Retry-After.
Response headers
Retry-Afterstringapplication/jsonRateLimitErrorGET /taskstasks
Authentication and scopes: OAuth2: tasks:read
Parameters
limit · query · optionalintegerminimum: 1maximum: 100default: 50
cursor · query · optionalOpaque continuation cursor returned in meta.next_cursor. Cursor semantics are resource-specific; deduplicate by resource id and reconcile from the first page after a long export.
stringfrom · query · optionalOptional UTC range start with seconds and a Z suffix; optional fractional seconds have 1 to 3 digits. Supply with to. The range may not exceed 366 days.
stringformat: "date-time"pattern: "^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(?:\\.\\d{1,3})?Z$"
to · query · optionalOptional UTC range end with seconds and a Z suffix; optional fractional seconds have 1 to 3 digits. Supply with from.
stringformat: "date-time"pattern: "^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(?:\\.\\d{1,3})?Z$"
Responses
200A tenant-scoped page.
401Missing, invalid, expired or revoked bearer token.
Response headers
WWW-Authenticatestringapplication/jsonError429Client API ingress or verified client-and-tenant rate exceeded. Honor Retry-After.
Response headers
Retry-Afterstringapplication/jsonRateLimitErrorGET /requestsrequests
Authentication and scopes: OAuth2: requests:read
Parameters
limit · query · optionalintegerminimum: 1maximum: 100default: 50
cursor · query · optionalOpaque continuation cursor returned in meta.next_cursor. Cursor semantics are resource-specific; deduplicate by resource id and reconcile from the first page after a long export.
stringResponses
200A tenant-scoped page.
401Missing, invalid, expired or revoked bearer token.
Response headers
WWW-Authenticatestringapplication/jsonError429Client API ingress or verified client-and-tenant rate exceeded. Honor Retry-After.
Response headers
Retry-Afterstringapplication/jsonRateLimitErrorGET /requests/{requestId}Read one Request with its bounded public conversation
Authentication and scopes: OAuth2: requests:read
Parameters
requestId · path · requiredstringformat: "uuid"
Responses
200The tenant-owned Request and at most its latest 100 public messages.
application/jsonobjectOnly the listed fields are accepted.
data· required- RequestDetail
meta· requiredobjectOnly the listed fields are accepted.
version· requiredstringconst: "1"
401Missing, invalid, expired or revoked bearer token.
Response headers
WWW-Authenticatestringapplication/jsonError404Request not found in this tenant.
429Client API ingress or verified client-and-tenant rate exceeded. Honor Retry-After.
Response headers
Retry-Afterstringapplication/jsonRateLimitErrorGET /pipeline-opportunitiespipeline opportunities
Authentication and scopes: OAuth2: pipeline_opportunities:read
Parameters
limit · query · optionalintegerminimum: 1maximum: 100default: 50
cursor · query · optionalOpaque continuation cursor returned in meta.next_cursor. Cursor semantics are resource-specific; deduplicate by resource id and reconcile from the first page after a long export.
stringpipeline_key · query · requiredstringmaxLength: 48
Responses
200A tenant-scoped page.
application/jsonobjectdata· requiredarrayArray items: PipelineOpportunitymeta· required- PageMeta
{
"data": [
{
"id": "44444444-4444-4444-8444-444444444444",
"pipeline_key": "sales",
"stage_key": "qualified",
"title": "Boiler replacement"
}
],
"meta": {
"limit": 50,
"has_more": false,
"next_cursor": null
}
}401Missing, invalid, expired or revoked bearer token.
Response headers
WWW-Authenticatestringapplication/jsonError429Client API ingress or verified client-and-tenant rate exceeded. Honor Retry-After.
Response headers
Retry-Afterstringapplication/jsonRateLimitErrorGET /activitiesactivities
Authentication and scopes: OAuth2: activities:read
Parameters
limit · query · optionalintegerminimum: 1maximum: 100default: 50
cursor · query · optionalOpaque continuation cursor returned in meta.next_cursor. Cursor semantics are resource-specific; deduplicate by resource id and reconcile from the first page after a long export.
stringfrom · query · optionalOptional UTC range start with seconds and a Z suffix; optional fractional seconds have 1 to 3 digits. Supply with to. The range may not exceed 366 days.
stringformat: "date-time"pattern: "^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(?:\\.\\d{1,3})?Z$"
to · query · optionalOptional UTC range end with seconds and a Z suffix; optional fractional seconds have 1 to 3 digits. Supply with from.
stringformat: "date-time"pattern: "^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(?:\\.\\d{1,3})?Z$"
Responses
200A tenant-scoped page.
401Missing, invalid, expired or revoked bearer token.
Response headers
WWW-Authenticatestringapplication/jsonError429Client API ingress or verified client-and-tenant rate exceeded. Honor Retry-After.
Response headers
Retry-Afterstringapplication/jsonRateLimitErrorGET /saved-viewssaved views
Authentication and scopes: OAuth2: saved_views:read
Parameters
limit · query · optionalintegerminimum: 1maximum: 100default: 50
cursor · query · optionalOpaque continuation cursor returned in meta.next_cursor. Cursor semantics are resource-specific; deduplicate by resource id and reconcile from the first page after a long export.
stringfrom · query · optionalOptional UTC range start with seconds and a Z suffix; optional fractional seconds have 1 to 3 digits. Supply with to. The range may not exceed 366 days.
stringformat: "date-time"pattern: "^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(?:\\.\\d{1,3})?Z$"
to · query · optionalOptional UTC range end with seconds and a Z suffix; optional fractional seconds have 1 to 3 digits. Supply with from.
stringformat: "date-time"pattern: "^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(?:\\.\\d{1,3})?Z$"
Responses
200A tenant-scoped page.
401Missing, invalid, expired or revoked bearer token.
Response headers
WWW-Authenticatestringapplication/jsonError429Client API ingress or verified client-and-tenant rate exceeded. Honor Retry-After.
Response headers
Retry-Afterstringapplication/jsonRateLimitErrorGET /saved-views/{id}/resultsRun one saved view without changing it
Authentication and scopes: OAuth2: saved_views:execute
Parameters
id · path · requiredstringformat: "uuid"
revision · query · requiredintegerminimum: 1
cursor · query · optionalstringResponses
200A source-revision-pinned saved-view result page.
application/jsonobjectdata· requiredarrayArray items:objectresource· requiredstring | nullrecord_id· requiredstring | nulldisplay_label· requiredstring | nullsecondary_label· requiredstring | nullstate_label· requiredstring | nullcreated_at· requiredstring | nullupdated_at· requiredstring | null
meta· requiredobjectlimit· requiredintegerhas_more· requiredbooleannext_cursor· requiredstring | nulldata_revision· requiredstringsaved_view· required- SavedView
{
"data": [
{
"resource": "jobs",
"record_id": "22222222-2222-4222-8222-222222222222",
"display_label": "Water heater repair",
"secondary_label": null,
"state_label": "scheduled",
"created_at": null,
"updated_at": null
}
],
"meta": {
"limit": 50,
"has_more": false,
"next_cursor": null,
"data_revision": "42",
"saved_view": {
"id": "66666666-6666-4666-8666-666666666666",
"key": "open_jobs",
"label": "Open jobs",
"resource": "jobs",
"revision": 2
}
}
}401Missing, invalid, expired or revoked bearer token.
Response headers
WWW-Authenticatestringapplication/jsonError404Saved view not found.
409Saved view revision changed.
429Client API ingress or verified client-and-tenant rate exceeded. Honor Retry-After.
Response headers
Retry-Afterstringapplication/jsonRateLimitErrorGET /report-definitionsreport definitions and latest successful runs
Authentication and scopes: OAuth2: reports:read
Parameters
limit · query · optionalintegerminimum: 1maximum: 100default: 50
cursor · query · optionalOpaque continuation cursor returned in meta.next_cursor. Cursor semantics are resource-specific; deduplicate by resource id and reconcile from the first page after a long export.
stringResponses
200A tenant-scoped page.
application/jsonobjectdata· requiredarrayArray items: ReportDefinitionmeta· required- PageMeta
{
"data": [
{
"id": "77777777-7777-4777-8777-777777777777",
"version": 1,
"name": "Open work by status",
"resource": "jobs",
"latest_successful_run": null
}
],
"meta": {
"limit": 50,
"has_more": false,
"next_cursor": null
}
}401Missing, invalid, expired or revoked bearer token.
Response headers
WWW-Authenticatestringapplication/jsonError429Client API ingress or verified client-and-tenant rate exceeded. Honor Retry-After.
Response headers
Retry-Afterstringapplication/jsonRateLimitErrorGET /automation-executionsrecent automation execution summaries
Authentication and scopes: OAuth2: automations:read
Parameters
limit · query · optionalintegerminimum: 1maximum: 100default: 50
cursor · query · optionalOpaque continuation cursor returned in meta.next_cursor. Cursor semantics are resource-specific; deduplicate by resource id and reconcile from the first page after a long export.
stringfrom · query · optionalOptional UTC range start with seconds and a Z suffix; optional fractional seconds have 1 to 3 digits. Supply with to. The range may not exceed 366 days.
stringformat: "date-time"pattern: "^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(?:\\.\\d{1,3})?Z$"
to · query · optionalOptional UTC range end with seconds and a Z suffix; optional fractional seconds have 1 to 3 digits. Supply with from.
stringformat: "date-time"pattern: "^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(?:\\.\\d{1,3})?Z$"
Responses
200A tenant-scoped page.
application/jsonobjectdata· requiredarrayArray items: AutomationExecutionmeta· required- PageMeta
{
"data": [
{
"id": "88888888-8888-4888-8888-888888888888",
"rule_id": "99999999-9999-4999-8999-999999999999",
"rule_version": 3,
"status": "succeeded"
}
],
"meta": {
"limit": 50,
"has_more": false,
"next_cursor": null
}
}401Missing, invalid, expired or revoked bearer token.
Response headers
WWW-Authenticatestringapplication/jsonError429Client API ingress or verified client-and-tenant rate exceeded. Honor Retry-After.
Response headers
Retry-Afterstringapplication/jsonRateLimitErrorGET /dashboardDashboard overview
Authentication and scopes: OAuth2: dashboard:read
Responses
200A compact operational overview.
application/jsonobjectdata· requiredobjectbusiness· requiredobjectname· requiredstring | null
ai_employee· requiredobjectname· requiredstring | nullstatus· requiredstring | null
today· requiredobjectmessages· requirednumbervoice_minutes· requirednumberappointments· requirednumber
channels· requiredobjectmessenger· requiredbooleanwhatsapp· requiredbooleaninstagram· requiredbooleanphone· requiredbooleanemail· requiredbooleancalendar· requiredboolean
{
"data": {
"business": {
"name": "Acme Plumbing"
},
"ai_employee": {
"name": "Acme Assistant",
"status": "active"
},
"today": {
"messages": 4,
"voice_minutes": 12,
"appointments": 1
},
"channels": {
"messenger": false,
"whatsapp": false,
"instagram": false,
"phone": true,
"email": false,
"calendar": true
}
}
}401Missing, invalid, expired or revoked bearer token.
Response headers
WWW-Authenticatestringapplication/jsonError429Client API ingress or verified client-and-tenant rate exceeded. Honor Retry-After.
Response headers
Retry-Afterstringapplication/jsonRateLimitErrorGET /eventsAPI events
Authentication and scopes: OAuth2: events:read
Parameters
limit · query · optionalintegerminimum: 1maximum: 100default: 50
cursor · query · optionalOpaque continuation cursor returned in meta.next_cursor. Cursor semantics are resource-specific; deduplicate by resource id and reconcile from the first page after a long export.
stringResponses
200A tenant-scoped page.
401Missing, invalid, expired or revoked bearer token.
Response headers
WWW-Authenticatestringapplication/jsonError429Client API ingress or verified client-and-tenant rate exceeded. Honor Retry-After.
Response headers
Retry-Afterstringapplication/jsonRateLimitErrorGET /webhooksList verified webhook endpoints
Authentication and scopes: OAuth2: webhooks:manage
Parameters
limit · query · optionalintegerminimum: 1maximum: 100default: 50
cursor · query · optionalOpaque continuation cursor returned in meta.next_cursor. Cursor semantics are resource-specific; deduplicate by resource id and reconcile from the first page after a long export.
stringResponses
200Tenant-scoped webhook endpoints.
application/jsonobjectdata· requiredarrayArray items: WebhookEndpointpage· requiredobjectnext_cursor· requiredstring | nullhas_more· requiredboolean
meta· requiredobjectrequest_id· requiredstringversion· requiredSchemaconst: "1"
limit· requiredintegerhas_more· requiredbooleannext_cursor· requiredstring | null
401Missing, invalid, expired or revoked bearer token.
Response headers
WWW-Authenticatestringapplication/jsonError429Client API ingress or verified client-and-tenant rate exceeded. Honor Retry-After.
Response headers
Retry-Afterstringapplication/jsonRateLimitErrorPOST /webhooksCreate a webhook endpoint and one-time verification challenge
Authentication and scopes: OAuth2: webhooks:manage
Request body · required
application/jsonobjectOnly the listed fields are accepted.
url· requiredstringformat: "uri"maxLength: 2048
event_names· requiredarrayminItems: 1maxItems: 64
Array items:string"signature.envelope.completed"
Responses
201Endpoint, one-time signing secret, and verification challenge.
application/jsonobjectdata· required- ProvisionedWebhookEndpoint
meta· requiredobjectrequest_id· requiredstringversion· requiredSchemaconst: "1"
401Missing, invalid, expired or revoked bearer token.
Response headers
WWW-Authenticatestringapplication/jsonError429Client API ingress or verified client-and-tenant rate exceeded. Honor Retry-After.
Response headers
Retry-Afterstringapplication/jsonRateLimitErrorGET /webhooks/{id}Read one webhook endpoint
Authentication and scopes: OAuth2: webhooks:manage
Parameters
id · path · requiredstringformat: "uuid"
Responses
200Webhook endpoint.
application/jsonobjectdata· required- WebhookEndpoint
meta· requiredobjectrequest_id· requiredstringversion· requiredSchemaconst: "1"
401Missing, invalid, expired or revoked bearer token.
Response headers
WWW-Authenticatestringapplication/jsonError404Endpoint not found.
429Client API ingress or verified client-and-tenant rate exceeded. Honor Retry-After.
Response headers
Retry-Afterstringapplication/jsonRateLimitErrorDELETE /webhooks/{id}Remove one webhook endpoint
Authentication and scopes: OAuth2: webhooks:manage
Parameters
id · path · requiredstringformat: "uuid"
Responses
204Endpoint removed.
401Missing, invalid, expired or revoked bearer token.
Response headers
WWW-Authenticatestringapplication/jsonError404Endpoint not found.
409Endpoint lifecycle conflict.
429Client API ingress or verified client-and-tenant rate exceeded. Honor Retry-After.
Response headers
Retry-Afterstringapplication/jsonRateLimitErrorPOST /webhooks/{id}/verifyVerify and activate a webhook endpoint
Authentication and scopes: OAuth2: webhooks:manage
Parameters
id · path · requiredstringformat: "uuid"
Request body · required
application/jsonobjectOnly the listed fields are accepted.
challenge· requiredstringminLength: 32maxLength: 128
Responses
200Verified active endpoint.
application/jsonobjectdata· required- WebhookEndpoint
meta· requiredobjectrequest_id· requiredstringversion· requiredSchemaconst: "1"
401Missing, invalid, expired or revoked bearer token.
Response headers
WWW-Authenticatestringapplication/jsonError404Endpoint not found.
409Challenge expired, replayed, or raced.
429Client API ingress or verified client-and-tenant rate exceeded. Honor Retry-After.
Response headers
Retry-Afterstringapplication/jsonRateLimitErrorGET /webhook-deliveriesList sanitized webhook delivery status
Authentication and scopes: OAuth2: webhook_deliveries:read
Parameters
limit · query · optionalintegerminimum: 1maximum: 100default: 50
cursor · query · optionalOpaque continuation cursor returned in meta.next_cursor. Cursor semantics are resource-specific; deduplicate by resource id and reconcile from the first page after a long export.
stringendpoint_id · query · optionalstringformat: "uuid"
state · query · optionalstringenum: ["pending","leased","failed_retryable","delivered","dead_letter"]
Responses
200Tenant-scoped delivery metadata with a sanitized latest attempt; event payloads, endpoint URLs, signing material, provider bodies, and lease identities are never returned.
application/jsonobjectdata· requiredarrayArray items: WebhookDeliverypage· requiredobjectnext_cursor· requiredstring | nullhas_more· requiredboolean
meta· requiredobjectrequest_id· requiredstringversion· requiredSchemaconst: "1"
limit· requiredintegerhas_more· requiredbooleannext_cursor· requiredstring | null
401Missing, invalid, expired or revoked bearer token.
Response headers
WWW-Authenticatestringapplication/jsonError429Client API ingress or verified client-and-tenant rate exceeded. Honor Retry-After.
Response headers
Retry-Afterstringapplication/jsonRateLimitErrorGET /webhook-deliveries/{id}Read sanitized webhook delivery attempt history
Authentication and scopes: OAuth2: webhook_deliveries:read
Parameters
id · path · requiredstringformat: "uuid"
Responses
200One tenant-scoped delivery and at most 50 sanitized settled attempts.
application/jsonobjectdata· required- WebhookDeliveryDetail
meta· requiredobjectrequest_id· requiredstringversion· requiredSchemaconst: "1"
401Missing, invalid, expired or revoked bearer token.
Response headers
WWW-Authenticatestringapplication/jsonError404Delivery not found.
429Client API ingress or verified client-and-tenant rate exceeded. Honor Retry-After.
Response headers
Retry-Afterstringapplication/jsonRateLimitErrorGET /crm/tasksCRM tasks
Authentication and scopes: OAuth2: tasks:read
Parameters
limit · query · optionalintegerminimum: 1maximum: 100default: 25
cursor · query · optionalOpaque continuation cursor returned in meta.next_cursor. Cursor semantics are resource-specific; deduplicate by resource id and reconcile from the first page after a long export.
stringstatus · query · optionalSchemaenum: ["open","done","canceled"]
contact_id · query · optionalstringformat: "uuid"
job_id · query · optionalstringformat: "uuid"
overdue · query · optionaltrue selects open tasks past due; combining it with a non-open status is refused. false applies no overdue filter.
booleandefault: false
fields · query · optionalOptional comma-separated selection: id, title, description, status, priority, due_at, contact_id, job_id, owner, completed_at, created_at, updated_at, revision.
stringResponses
200A tenant-scoped page.
application/jsonobjectdata· requiredarrayArray items: CrmTaskpage· requiredobjectnext_cursor· requiredstring | nullhas_more· requiredboolean
meta· requiredobjectrequest_id· requiredstringversion· requiredSchemaconst: "1"
limit· requiredintegerhas_more· requiredbooleannext_cursor· requiredstring | null
401Missing, invalid, expired or revoked bearer token.
Response headers
WWW-Authenticatestringapplication/jsonError429Client API ingress or verified client-and-tenant rate exceeded. Honor Retry-After.
Response headers
Retry-Afterstringapplication/jsonRateLimitErrorGET /crm/tasks/{id}Read one CRM task
Authentication and scopes: OAuth2: tasks:read
Parameters
id · path · requiredstringformat: "uuid"
fields · query · optionalOptional comma-separated selection: id, title, description, status, priority, due_at, contact_id, job_id, owner, completed_at, created_at, updated_at, revision.
stringResponses
200Tenant-owned task with a strong ETag.
Response headers
ETagstringapplication/jsonobjectdata· required- CrmTask
meta· requiredobjectrequest_id· requiredstringversion· requiredSchemaconst: "1"
401Missing, invalid, expired or revoked bearer token.
Response headers
WWW-Authenticatestringapplication/jsonError404Task not found.
429Client API ingress or verified client-and-tenant rate exceeded. Honor Retry-After.
Response headers
Retry-Afterstringapplication/jsonRateLimitErrorPOST /crm/tasks/actions/create/previewPreview one CRM task creation
Authentication and scopes: OAuth2: tasks:prepare
Request body · required
application/jsonTaskCreateInputResponses
200Exact no-effect preview and commit key.
application/jsonobjectdata· required- TaskCreatePreview
meta· requiredobjectrequest_id· requiredstringversion· requiredSchemaconst: "1"
401Missing, invalid, expired or revoked bearer token.
Response headers
WWW-Authenticatestringapplication/jsonError429Client API ingress or verified client-and-tenant rate exceeded. Honor Retry-After.
Response headers
Retry-Afterstringapplication/jsonRateLimitErrorPOST /crm/tasks/actions/create/commitCommit one reviewed CRM task creation
Authentication and scopes: OAuth2: tasks:commit
Parameters
Idempotency-Key · header · requiredstringminLength: 8maxLength: 256
Request body · required
application/jsonobjectOnly the listed fields are accepted.
title· requiredstringminLength: 1maxLength: 200
description· optionalstring | nulldue_at· optionalstring | nullpriority· optionalstringenum: ["low","normal","high"]
contact_id· optionalstring | nulljob_id· optionalstring | nullowner· optionalobjectpreview_key· requiredstringminLength: 16maxLength: 200
confirmed· requiredSchemaconst: true
Responses
201Task created once.
application/jsonobjectdata· required- CrmTask
meta· requiredobjectrequest_id· requiredstringversion· requiredSchemaconst: "1"
outcome· requiredstring
401Missing, invalid, expired or revoked bearer token.
Response headers
WWW-Authenticatestringapplication/jsonError409Preview or idempotency conflict.
429Client API ingress or verified client-and-tenant rate exceeded. Honor Retry-After.
Response headers
Retry-Afterstringapplication/jsonRateLimitErrorPOST /crm/tasks/{id}/actions/status/previewPreview a CRM task open or done transition
Authentication and scopes: OAuth2: tasks:prepare
Parameters
id · path · requiredstringformat: "uuid"
Request body · required
application/jsonTaskStatusInputResponses
200Exact no-effect status preview, ETag, and commit key.
application/jsonobjectdata· required- TaskStatusPreview
meta· requiredobjectrequest_id· requiredstringversion· requiredSchemaconst: "1"
401Missing, invalid, expired or revoked bearer token.
Response headers
WWW-Authenticatestringapplication/jsonError404Task not found.
409Task revision or state conflict.
429Client API ingress or verified client-and-tenant rate exceeded. Honor Retry-After.
Response headers
Retry-Afterstringapplication/jsonRateLimitErrorPOST /crm/tasks/{id}/actions/status/commitCommit a reviewed CRM task status transition
Authentication and scopes: OAuth2: tasks:commit
Parameters
id · path · requiredstringformat: "uuid"
Idempotency-Key · header · requiredstringminLength: 8maxLength: 256
If-Match · header · requiredstringRequest body · required
application/jsonobjectOnly the listed fields are accepted.
target_status· requiredstringenum: ["open","done"]
expected_revision· requiredintegerminimum: 1
preview_key· requiredstringminLength: 16maxLength: 200
confirmed· requiredSchemaconst: true
Responses
200Task status changed once.
application/jsonobjectdata· required- CrmTask
meta· requiredobjectrequest_id· requiredstringversion· requiredSchemaconst: "1"
outcome· requiredstring
401Missing, invalid, expired or revoked bearer token.
Response headers
WWW-Authenticatestringapplication/jsonError409Preview, state, revision, or idempotency conflict.
428If-Match is required.
429Client API ingress or verified client-and-tenant rate exceeded. Honor Retry-After.
Response headers
Retry-Afterstringapplication/jsonRateLimitErrorGET /document-templatesdocument templates
Authentication and scopes: OAuth2: documents:read
Parameters
limit · query · optionalintegerminimum: 1maximum: 100default: 25
cursor · query · optionalOpaque continuation cursor returned in meta.next_cursor. Cursor semantics are resource-specific; deduplicate by resource id and reconcile from the first page after a long export.
stringResponses
200A tenant-scoped page.
application/jsonobjectdata· requiredarrayArray items: DocumentTemplatemeta· required- PageMeta
401Missing, invalid, expired or revoked bearer token.
Response headers
WWW-Authenticatestringapplication/jsonError429Client API ingress or verified client-and-tenant rate exceeded. Honor Retry-After.
Response headers
Retry-Afterstringapplication/jsonRateLimitErrorGET /document-templates/{id}Read one document template
Authentication and scopes: OAuth2: documents:read
Parameters
id · path · requiredstringformat: "uuid"
Responses
200Template and immutable version layouts without storage identifiers.
application/jsonobjectdata· required- DocumentTemplate
meta· requiredobjectrequest_id· requiredstringversion· requiredSchemaconst: "1"
401Missing, invalid, expired or revoked bearer token.
Response headers
WWW-Authenticatestringapplication/jsonError404Template not found.
429Client API ingress or verified client-and-tenant rate exceeded. Honor Retry-After.
Response headers
Retry-Afterstringapplication/jsonRateLimitErrorGET /signature-envelopessignature envelopes
Authentication and scopes: OAuth2: signatures:read
Parameters
limit · query · optionalintegerminimum: 1maximum: 100default: 50
cursor · query · optionalOpaque continuation cursor returned in meta.next_cursor. Cursor semantics are resource-specific; deduplicate by resource id and reconcile from the first page after a long export.
stringResponses
200A tenant-scoped page.
application/jsonobjectdata· requiredarrayArray items: SignatureEnvelopemeta· required- PageMeta
401Missing, invalid, expired or revoked bearer token.
Response headers
WWW-Authenticatestringapplication/jsonError429Client API ingress or verified client-and-tenant rate exceeded. Honor Retry-After.
Response headers
Retry-Afterstringapplication/jsonRateLimitErrorGET /signature-envelopes/{id}Read one signature envelope status
Authentication and scopes: OAuth2: signatures:read
Parameters
id · path · requiredstringformat: "uuid"
If-None-Match · header · optionalstringResponses
200Envelope lifecycle and retention status without recipients, signer tokens, fields, evidence details, artifacts, storage identifiers, or actor labels.
Response headers
ETagstringapplication/jsonobjectdata· required- SignatureEnvelope
meta· requiredobjectrequest_id· requiredstringversion· requiredSchemaconst: "1"
304The version-derived ETag still matches.
Response headers
ETagstring401Missing, invalid, expired or revoked bearer token.
Response headers
WWW-Authenticatestringapplication/jsonError404Envelope not found.
429Client API ingress or verified client-and-tenant rate exceeded. Honor Retry-After.
Response headers
Retry-Afterstringapplication/jsonRateLimitErrorGET /exportsList every available portability dataset
Authentication and scopes: OAuth2: exports:read
Responses
401Missing, invalid, expired or revoked bearer token.
Response headers
WWW-Authenticatestringapplication/jsonError429Client API ingress or verified client-and-tenant rate exceeded. Honor Retry-After.
Response headers
Retry-Afterstringapplication/jsonRateLimitErrorGET /exports/{dataset}.csvStream one complete tenant dataset as CSV
Authentication and scopes: OAuth2: exports:read
Parameters
dataset · path · requiredDataset id returned by GET /exports.
stringenum: ["calls","call-insight-reviews","callers","lead-lifecycle-history","lead-reason-sets","lead-import-history","chats","messages","webchat-resolution-feedback","taken-messages","bookings","internal-calendar-events","reviews","client-accounts","account-relationships","account-command-history","jobs","fulfillment-operations","fulfillment-outbox","call-outcomes","call-outcome-steps","equipment","equipment-service-history","equipment-service-evidence","job-status-links","delivery-templates","delivery-plans","delivery-items","delivery-dependencies","delivery-blockers","delivery-history","tasks","task-reminders","task-reminder-deliveries","team-workload-revision","team-queues","team-queue-memberships","team-queue-resources","team-queue-watchers","task-assignment-history","resource-assignment-history","team-threads","team-messages","team-mentions","team-notifications","team-notification-preferences","push-devices","team-command-history","crm-activity","crm-timeline","business-files","business-file-sources","business-file-revisions","business-file-publications","intake-media","attachments","signature-envelopes","signature-recipients","signature-fields","signature-field-values","signature-events","signature-artifacts","signature-templates","signature-verifications","signature-bulk-batches","signature-bulk-items","sales-pipeline-definitions","sales-opportunities","sales-opportunity-history","crm-duplicate-candidates","crm-duplicate-dismissed-pairs","crm-forecast-snapshots","crm-import-mapping-profiles","crm-import-dry-run-fingerprints","sla-policies","sla-ticket-clocks","sla-ticket-clock-pauses","crm-account-classifications","crm-account-segments","csat-survey-definitions","csat-survey-invitations","csat-survey-responses","crm-relationship-edges","territories","territory-visit-events","portal-access-grants","config-draft-versions","config-activations","crm-partner-account-attributes","crm-partner-contacts","crm-partner-onboarding-events","crm-partner-lead-registrations","crm-partner-lead-events","crm-contact-identities","crm-contact-merge-aliases","tenant-referrals","tenant-referral-events","incentive-plan-versions","incentive-period-versions","incentive-period-participants","incentive-revenue-credits","incentive-revenue-credit-splits","incentive-adjustments","incentive-statements","crm-layout-visibility-conditions","crm-layout-approved-actions","crm-report-definitions","crm-report-runs","crm-report-result-rows","crm-report-memberships","crm-report-command-history","custom-field-definitions","custom-field-values","custom-field-definition-history","custom-field-value-history","custom-field-command-history","record-layout-history","customer-cases","customer-case-messages","customer-case-events","customer-case-reply-snippets","service-area-settings","public-faqs","faq-disclosures","consented-visitor-activity","saved-views","search-saved-views","quote-templates","settings"]
Responses
200A UTF-8 CSV attachment streamed in bounded-memory pages.
text/csvstring401Missing, invalid, expired or revoked bearer token.
Response headers
WWW-Authenticatestringapplication/jsonError404The dataset id is not part of the export catalog.
429Client API ingress or verified client-and-tenant rate exceeded. Honor Retry-After.
Response headers
Retry-Afterstringapplication/jsonRateLimitErrorGET /forms/openapi.jsonRead the Forms authoring OpenAPI contract
Authentication and scopes: OAuth2: front_desk:forms:read
Responses
401Missing, invalid, expired or revoked bearer token.
Response headers
WWW-Authenticatestringapplication/jsonError429Client API ingress or verified client-and-tenant rate exceeded. Honor Retry-After.
Response headers
Retry-Afterstringapplication/jsonRateLimitErrorGET /crm/notesList append-only notes for one CRM subject
Requires the activity module. Both subject filters are mandatory; this is not a tenant-wide note scan. Results are ordered by created_at and id descending. Cursors are bound to the tenant and subject filters.
Authentication and scopes: OAuth2: activities:read
Parameters
limit · query · optionalintegerminimum: 1maximum: 100default: 25
cursor · query · optionalOpaque continuation cursor returned in meta.next_cursor. Cursor semantics are resource-specific; deduplicate by resource id and reconcile from the first page after a long export.
stringsubject_type · query · requiredSchemaenum: ["contact","job","task"]
subject_id · query · requiredstringformat: "uuid"
fields · query · optionalOptional comma-separated selection: id, subject_type, subject_id, body, actor, created_at.
stringResponses
200Tenant-scoped note page.
application/jsonobjectdata· requiredarrayArray items: CrmNotepage· requiredobjectnext_cursor· requiredstring | nullhas_more· requiredboolean
meta· requiredobjectrequest_id· requiredstringversion· requiredSchemaconst: "1"
limit· requiredintegerhas_more· requiredbooleannext_cursor· requiredstring | null
401Missing, invalid, expired or revoked bearer token.
Response headers
WWW-Authenticatestringapplication/jsonError429Client API ingress or verified client-and-tenant rate exceeded. Honor Retry-After.
Response headers
Retry-Afterstringapplication/jsonRateLimitErrorPOST /crm/notes/actions/create/previewPreview an append-only CRM note
Requires the Client API launch gate, configured CRM cursor/preview secret, and the tenant module entitlement. Preview has no side effects. Commit requires explicit confirmation of the sealed preview and never sends messages, places calls, or synchronizes a provider.
Authentication and scopes: OAuth2: activities:write
Request body · required
application/jsonCrmNoteCreateInputResponses
200Tenant-scoped reviewed CRM result.
Response headers
application/jsonobjectdata· required- CrmNoteCreatePreview
meta· requiredobjectrequest_id· requiredstringversion· requiredSchemaconst: "1"
401Missing, invalid, expired or revoked bearer token.
Response headers
WWW-Authenticatestringapplication/jsonError404The resource or referenced subject is not available in this tenant.
409Preview expired, grant binding changed, state changed, or idempotency key conflicted.
429Client API ingress or verified client-and-tenant rate exceeded. Honor Retry-After.
Response headers
Retry-Afterstringapplication/jsonRateLimitErrorPOST /crm/notes/actions/create/commitAppend an explicitly reviewed CRM note
Requires the Client API launch gate, configured CRM cursor/preview secret, and the tenant module entitlement. Preview has no side effects. Commit requires explicit confirmation of the sealed preview and never sends messages, places calls, or synchronizes a provider.
Authentication and scopes: OAuth2: activities:write
Parameters
Idempotency-Key · header · requiredReuse the same key and receipt to replay a successful commit. Receipts are retained for 24 hours.
stringminLength: 8maxLength: 255pattern: "^[A-Za-z0-9][A-Za-z0-9._:-]*$"
Request body · required
application/jsonReviewedCrmCommitResponses
201Tenant-scoped reviewed CRM result.
Response headers
application/jsonobjectdata· required- CrmNote
meta· requiredobjectrequest_id· requiredstringversion· requiredSchemaconst: "1"
outcome· requiredSchemaconst: "create"
mutation_policy· requiredstring
401Missing, invalid, expired or revoked bearer token.
Response headers
WWW-Authenticatestringapplication/jsonError404The resource or referenced subject is not available in this tenant.
409Preview expired, grant binding changed, state changed, or idempotency key conflicted.
429Client API ingress or verified client-and-tenant rate exceeded. Honor Retry-After.
Response headers
Retry-Afterstringapplication/jsonRateLimitErrorGET /crm/jobsList CRM business jobs
Requires the jobs module. These business records are distinct from asynchronous /jobs. Results are ordered by updated_at and id descending; cursors are tenant- and filter-bound.
Authentication and scopes: OAuth2: jobs:read
Parameters
limit · query · optionalintegerminimum: 1maximum: 100default: 25
cursor · query · optionalOpaque continuation cursor returned in meta.next_cursor. Cursor semantics are resource-specific; deduplicate by resource id and reconcile from the first page after a long export.
stringstatus · query · optionalSchemaenum: ["lead","quoted","scheduled","in_progress","done","closed","cancelled","lost"]
contact_id · query · optionalstringformat: "uuid"
fields · query · optionalOptional comma-separated selection: id, contact_id, status, title, details, service_name, source_channel, lifecycle_stage, qualification, owner, quoted_at, scheduled_at, started_at, completed_at, created_at, updated_at.
stringResponses
200Tenant-scoped CRM job page.
application/jsonobjectdata· requiredarrayArray items: CrmJobpage· requiredobjectnext_cursor· requiredstring | nullhas_more· requiredboolean
meta· requiredobjectrequest_id· requiredstringversion· requiredSchemaconst: "1"
limit· requiredintegerhas_more· requiredbooleannext_cursor· requiredstring | null
401Missing, invalid, expired or revoked bearer token.
Response headers
WWW-Authenticatestringapplication/jsonError429Client API ingress or verified client-and-tenant rate exceeded. Honor Retry-After.
Response headers
Retry-Afterstringapplication/jsonRateLimitErrorGET /crm/jobs/{id}Read one CRM business job
Authentication and scopes: OAuth2: jobs:read
Parameters
id · path · requiredstringformat: "uuid"
fields · query · optionalOptional comma-separated selection: id, contact_id, status, title, details, service_name, source_channel, lifecycle_stage, qualification, owner, quoted_at, scheduled_at, started_at, completed_at, created_at, updated_at.
stringResponses
200CRM job and strong ETag.
Response headers
ETagstringapplication/jsonobjectdata· required- CrmJob
meta· requiredobjectrequest_id· requiredstringversion· requiredSchemaconst: "1"
401Missing, invalid, expired or revoked bearer token.
Response headers
WWW-Authenticatestringapplication/jsonError404The resource or referenced subject is not available in this tenant.
429Client API ingress or verified client-and-tenant rate exceeded. Honor Retry-After.
Response headers
Retry-Afterstringapplication/jsonRateLimitErrorPOST /crm/jobs/actions/create/previewPreview a CRM business job creation
Requires the Client API launch gate, configured CRM cursor/preview secret, and the tenant module entitlement. Preview has no side effects. Commit requires explicit confirmation of the sealed preview and never sends messages, places calls, or synchronizes a provider.
Authentication and scopes: OAuth2: jobs:write
Request body · required
application/jsonCrmJobCreateInputResponses
200Tenant-scoped reviewed CRM result.
Response headers
application/jsonobjectdata· required- CrmJobCreatePreview
meta· requiredobjectrequest_id· requiredstringversion· requiredSchemaconst: "1"
401Missing, invalid, expired or revoked bearer token.
Response headers
WWW-Authenticatestringapplication/jsonError404The resource or referenced subject is not available in this tenant.
409Preview expired, grant binding changed, state changed, or idempotency key conflicted.
429Client API ingress or verified client-and-tenant rate exceeded. Honor Retry-After.
Response headers
Retry-Afterstringapplication/jsonRateLimitErrorPOST /crm/jobs/actions/create/commitCreate an explicitly reviewed CRM business job
Requires the Client API launch gate, configured CRM cursor/preview secret, and the tenant module entitlement. Preview has no side effects. Commit requires explicit confirmation of the sealed preview and never sends messages, places calls, or synchronizes a provider.
Authentication and scopes: OAuth2: jobs:write
Parameters
Idempotency-Key · header · requiredReuse the same key and receipt to replay a successful commit. Receipts are retained for 24 hours.
stringminLength: 8maxLength: 255pattern: "^[A-Za-z0-9][A-Za-z0-9._:-]*$"
Request body · required
application/jsonReviewedCrmCommitResponses
201Tenant-scoped reviewed CRM result.
Response headers
ETagstringLocationstringapplication/jsonobjectdata· required- CrmJob
meta· requiredobjectrequest_id· requiredstringversion· requiredSchemaconst: "1"
outcome· requiredstring
401Missing, invalid, expired or revoked bearer token.
Response headers
WWW-Authenticatestringapplication/jsonError404The resource or referenced subject is not available in this tenant.
409Preview expired, grant binding changed, state changed, or idempotency key conflicted.
429Client API ingress or verified client-and-tenant rate exceeded. Honor Retry-After.
Response headers
Retry-Afterstringapplication/jsonRateLimitErrorPOST /crm/jobs/{id}/actions/lifecycle/previewPreview a permitted CRM job status transition
Requires the Client API launch gate, configured CRM cursor/preview secret, and the tenant module entitlement. Preview has no side effects. Commit requires explicit confirmation of the sealed preview and never sends messages, places calls, or synchronizes a provider.
Authentication and scopes: OAuth2: jobs:write
Parameters
id · path · requiredstringformat: "uuid"
If-Match · header · requiredCurrent strong ETag from GET /crm/jobs/{id}.
stringRequest body · required
application/jsonobjectOnly the listed fields are accepted.
to· requiredSchemaenum: ["lead","quoted","scheduled","in_progress","done","closed","cancelled","lost"]
Responses
200Exact before/after status and a sealed 15-minute receipt. The server enforces the allowed transition graph.
Response headers
ETagstringapplication/jsonobjectdata· required- CrmJobLifecyclePreview
meta· requiredobjectrequest_id· requiredstringversion· requiredSchemaconst: "1"
401Missing, invalid, expired or revoked bearer token.
Response headers
WWW-Authenticatestringapplication/jsonError404The resource or referenced subject is not available in this tenant.
409Preview expired, grant binding changed, state changed, or idempotency key conflicted.
428If-Match is required.
429Client API ingress or verified client-and-tenant rate exceeded. Honor Retry-After.
Response headers
Retry-Afterstringapplication/jsonRateLimitErrorPOST /crm/jobs/{id}/actions/lifecycle/commitCommit an explicitly reviewed CRM job status transition
Requires the Client API launch gate, configured CRM cursor/preview secret, and the tenant module entitlement. Preview has no side effects. Commit requires explicit confirmation of the sealed preview and never sends messages, places calls, or synchronizes a provider.
Authentication and scopes: OAuth2: jobs:write
Parameters
id · path · requiredstringformat: "uuid"
Idempotency-Key · header · requiredReuse the same key and receipt to replay a successful commit. Receipts are retained for 24 hours.
stringminLength: 8maxLength: 255pattern: "^[A-Za-z0-9][A-Za-z0-9._:-]*$"
Request body · required
application/jsonReviewedCrmCommitResponses
200Tenant-scoped reviewed CRM result.
Response headers
ETagstringapplication/jsonobjectdata· required- CrmJob
meta· requiredobjectrequest_id· requiredstringversion· requiredSchemaconst: "1"
outcome· requiredstring
401Missing, invalid, expired or revoked bearer token.
Response headers
WWW-Authenticatestringapplication/jsonError404The resource or referenced subject is not available in this tenant.
409Preview expired, grant binding changed, state changed, or idempotency key conflicted.
429Client API ingress or verified client-and-tenant rate exceeded. Honor Retry-After.
Response headers
Retry-Afterstringapplication/jsonRateLimitErrorField definitions
Error
objecterror· requiredobjectcode· requiredstringmessage· requiredstringrequest_id· optionalstring | null
RateLimitError
objecterror· requiredstring
PageMeta
objectlimit· requiredintegerhas_more· requiredbooleannext_cursor· requiredstring | null
Call
objectid· requiredstringformat: "uuid"
occurred_at· requiredstring | nullcaller· requiredobjectname· optionalstring | nullphone· optionalstring | null
duration_seconds· optionalinteger | nulloutcome· optionalstring | nullintent· optionalstring | nullsentiment· optionalstring | nullservices_mentioned· optionalstring | nullfollow_up_needed· optionalboolean | nullspam_status· optionalstring | nullsummary· optionalstring | nulltranscript· optionalstring | null
Contact
objectid· requiredstringformat: "uuid"
name· optionalstring | nullphone· optionalstring | nullemail· optionalstring | nullnotes· optionalstring | nulltags· optionalSchemaclassification· optionalstring | nulltotal_jobs· optionalinteger | nulllifetime_value· optionalSchemaconsent· optionalobjectfirst_seen_at· optionalstring | nulllast_seen_at· optionalstring | nulllead_source· optionalstringlifecycle_stage· optionalstringqualification· optionalstring
CrmContactInput
objectOnly the listed fields are accepted.
phone· requiredstringminLength: 1maxLength: 50
email· optionalstringmaxLength: 255
name· optionalstringmaxLength: 255
CrmContact
objectid· requiredstringformat: "uuid"
name· optionalstring | nullphone· optionalstringemail· optionalstring | nullnotes· optionalstring | nulltags· optionalarray | nullArray items:stringclassification· optionalstring | nulltotal_jobs· optionalintegerlifetime_value· optionalstring | nullconsent· optionalobjectfirst_seen_at· optionalstring | nulllast_seen_at· optionalstring | nullcreated_at· optionalstring | nullupdated_at· optionalstring | nulllead_source· optionalstringlifecycle_stage· optionalstringqualification· optionalstringrevision· optionalintegerminimum: 1
Form
objectid· requiredstringformat: "uuid"
ref· requiredstringtitle· requiredstringstatus· requiredstringdefinition· optionalobjectversion· requiredintegerreceived_responses· optionalintegerdraft_revision· requiredstringformat: "date-time"
created_at· optionalstringformat: "date-time"
updated_at· optionalstringformat: "date-time"
published_at· optionalstring | null
FormResponseColumn
objectOnly the listed fields are accepted.
ref· requiredstringtitle· requiredstringtype· requiredstringremoved· requiredbooleanTrue when the current definition no longer carries this question.
unknownHistory· requiredbooleanTrue when no referenced revision can recover its label and field type.
FormResponse
objectOnly the listed fields are accepted.
id· requiredstringformat: "uuid"
formId· requiredstringformat: "uuid"
formVersion· requiredintegerminimum: 1
revisionId· requiredstring | nullformat: "uuid"
revisionFingerprint· requiredstring | nullstatus· requiredstringenum: ["partial","completed","spam"]
answers· requiredobjectAnswers keyed by field reference. File answers omit storage keys and permanent URLs. Signature acknowledgments carry the safe completion projection only: kind, optional printed name, completion, and time. The typed mark, drawn storage id, signer email, and statement text never leave the response-storage boundary.
Additional fields are allowed.
hidden· requiredobject | nullAdditional fields are allowed.
Additional field values:stringcalculated· requiredobject | nullAllowlisted warnings, logic result, mode result, and clarification prompts only.
Additional fields are allowed.
ending· requiredstring | nulllandedAt· requiredstring | nullformat: "date-time"
submittedAt· requiredstring | nullformat: "date-time"
FormResponseListMeta
objectrequest_id· requiredstringversion· requiredstringconst: "1"
limit· requiredintegerminimum: 1maximum: 100
has_more· requiredbooleannext_cursor· requiredstring | nulltotal· requiredintegerminimum: 0
filter_fingerprint· requiredstringpattern: "^[0-9a-f]{32}$"
filter_description· requiredstringcolumn_descriptor_fingerprint· requiredstringpattern: "^[0-9a-f]{64}$"
columns· required
FormResponseCollection
objectOnly the listed fields are accepted.
data· requiredpage· requiredobjectOnly the listed fields are accepted.
next_cursor· requiredstring | nullhas_more· requiredboolean
meta· required- FormResponseListMeta
FormResponseResource
objectOnly the listed fields are accepted.
data· required- FormResponse
meta· requiredobjectrequest_id· requiredstringversion· requiredstringconst: "1"
column_descriptor_fingerprint· requiredstringpattern: "^[0-9a-f]{64}$"
columns· required
FormAnalyticsExclusions
objectOnly the listed fields are accepted.
input· requiredintegerminimum: 0
spam· requiredintegerminimum: 0
synthetic· requiredintegerminimum: 0
included· requiredintegerminimum: 0
policy· requiredstring
FormAnalyticsMetric
objectOnly the listed fields are accepted.
value· requirednumber | string | nullnumerator· requirednumberdenominator· requirednumberdefinition· requiredstringexclusions· required- FormAnalyticsExclusions
FormAnalyticsDistribution
objectOnly the listed fields are accepted.
key· requiredstringlabel· requiredstringcount· required- FormAnalyticsMetric
FormAnalyticsProfileComparison
objectOnly the listed fields are accepted.
ref· requiredstringtitle· requiredstringwins· required- FormAnalyticsMetric
mean_score· required- FormAnalyticsMetric
FormAnalyticsAggregate
objectChoice uses options/none; boolean uses true/false/none; numeric uses count/mean/median/min/max; NPS adds promoters/passives/detractors/score; date uses min/max; text and presence use answered/skipped.
kind· requiredstringenum: ["choice","boolean","numeric","nps","date","text","presence"]
options· optionalarrayArray items: FormAnalyticsDistributionnone· optional- FormAnalyticsMetric
true· optional- FormAnalyticsMetric
false· optional- FormAnalyticsMetric
count· optional- FormAnalyticsMetric
mean· optional- FormAnalyticsMetric
median· optional- FormAnalyticsMetric
min· optional- FormAnalyticsMetric
max· optional- FormAnalyticsMetric
promoters· optional- FormAnalyticsMetric
passives· optional- FormAnalyticsMetric
detractors· optional- FormAnalyticsMetric
score· optional- FormAnalyticsMetric
answered· optional- FormAnalyticsMetric
skipped· optional- FormAnalyticsMetric
FormAnalyticsQuestion
objectOnly the listed fields are accepted.
ref· requiredstringtitle· requiredstringtype· requiredstringeligible· required- FormAnalyticsMetric
reached· required- FormAnalyticsMetric
answered· required- FormAnalyticsMetric
skipped· required- FormAnalyticsMetric
abandoned_at· required- FormAnalyticsMetric
aggregate· required- FormAnalyticsAggregate
FormAnalytics
objectOnly the listed fields are accepted.
schema_version· requiredintegerconst: 1
revision_id· requiredstringformat: "uuid"
exclude_synthetic· requiredbooleanconst: true
exclusions· required- FormAnalyticsExclusions
questions· requiredendings· requiredarrayArray items: FormAnalyticsDistributionoutcomes· requiredSchemaoneOfarrayArray items: FormAnalyticsDistributionnullprofile_comparison· requiredSchemaDeclared-order personality/recommendation profile wins and mean scores. Null when the revision declares no profiles.
oneOfarrayArray items: FormAnalyticsProfileComparisonnullqualification· requiredSchemaoneOfobjectOnly the listed fields are accepted.
qualified· required- FormAnalyticsMetric
unqualified· required- FormAnalyticsMetric
unknown· required- FormAnalyticsMetric
null
FormAnalyticsResource
objectOnly the listed fields are accepted.
data· required- FormAnalytics
meta· requiredobjectrequest_id· requiredstringversion· requiredstringconst: "1"
FormResponseFieldPredicate
objectref· requiredstringpattern: "^[a-z0-9_-]{1,64}$"
op· requiredstringenum: ["contains","not_contains","starts_with","equals","is","is_not","any_of","all_of","eq","gt","gte","lt","lte","between","before","after","last_n_days","answered","not_answered"]
value· optionalSchemaScalar, two-value range, or choice-reference array as required by the field type and operator.
FormResponseFilter
objectOnly the listed fields are accepted.
status· optionalSchemaoneOfstringarrayArray items:stringenum: ["partial","completed","spam"]
from· optionalstringto· optionalstringending· optionalstringpattern: "^[a-z0-9_-]{1,64}$"
revision· optionalSchemaoneOfstringconst: "any"
stringpattern: "^[1-9][0-9]*$"
integerminimum: 1
q· optionalstringmaxLength: 200
fields· optionaltag· optionalobjectop· requiredstringenum: ["has_tag","not_has_tag"]
value· requiredstringmaxLength: 40
owner_status· optionalstringenum: ["new","in_review","done"]
correction_state· optionalstringenum: ["corrected","uncorrected"]
FormExportRequest
objectOmitted format defaults to CSV; omitted filter uses the default non-spam population.
Only the listed fields are accepted.
format· optionalstringenum: ["csv","xlsx"]default: "csv"
filter· optional- FormResponseFilter
FormExport
objectOnly the listed fields are accepted.
id· requiredstringformat: "uuid"
format· requiredstringenum: ["csv","xlsx"]
status· requiredstringenum: ["queued","running","ready","cancelled","failed","expired"]
filterFingerprint· requiredstringpattern: "^[0-9a-f]{32}$"
descriptorFingerprint· requiredstring | nullpattern: "^[0-9a-f]{64}$"
revisionScope· requiredstringprogressRows· requiredintegerminimum: 0
rowCount· requiredintegerminimum: 0
error· requiredstring | nulldownloaded· requiredbooleanexpiresAt· requiredstringExpires 24 hours after creation.
format: "date-time"
createdAt· requiredstringformat: "date-time"
percent· requiredinteger | nullminimum: 0maximum: 100
FormExportResource
objectOnly the listed fields are accepted.
data· required- FormExport
meta· requiredobjectrequest_id· requiredstringversion· requiredstringconst: "1"
filter_description· optionalstringPresent on creation and describes the frozen population.
ApiEvent
objectid· requiredstringformat: "uuid"
name· requiredstringoccurred_at· requiredstringformat: "date-time"
payload· requiredobject
Booking
objectid· requiredstringformat: "uuid"
starts_at· optionalstring | nullends_at· optionalstring | nullstatus· optionalstring | nullcompleted_at· optionalstring | nullcreated_at· optionalstring | null
Review
objectid· requiredstringformat: "uuid"
platform· optionalstring | nullauthor_name· optionalstring | nullrating· optionalinteger | nulltext· optionalstring | nullsentiment· optionalstring | nulltopic· optionalstring | nullreviewed_at· optionalstring | nullreply· optionalobject
ClientAccount
objectid· requiredstring | nullformat: "uuid"
version· optionalinteger | nullkind· optionalstring | nullname· requiredstring | nulldisplay_name· optionalstring | nullstatus· requiredstring | nullowner· optionalobjectrollup· optionalobjectcreated_at· optionalstring | nullupdated_at· optionalstring | null
ClientApiJob
objectOnly the listed fields are accepted.
id· requiredstringformat: "uuid"
operation· requiredstringenum: ["form_export","ai_insight","report_run","integration_sync"]
state· requiredstringenum: ["queued","running","ready","failed","cancelled","expired"]
progress· requiredobjectOnly the listed fields are accepted.
completed· requiredintegerminimum: 0maximum: 1000
total· requiredintegerminimum: 0maximum: 1000
result_manifest· optionalobject | nullOnly the listed fields are accepted.
item_count· optionalintegerminimum: 0maximum: 20
byte_count· optionalintegerminimum: 0maximum: 52428800
result_ref· optionalstringpattern: "^result_[A-Za-z0-9_-]{16,128}$"
error_code· optionalstring | nullretryable· requiredbooleanattempt· requiredintegerminimum: 0maximum: 3
max_attempts· requiredintegerminimum: 1maximum: 3
version· requiredintegerminimum: 1
created_at· requiredstringformat: "date-time"
updated_at· requiredstringformat: "date-time"
expires_at· requiredstringformat: "date-time"
ClientApiJobResource
objectOnly the listed fields are accepted.
data· required- ClientApiJob
meta· requiredobjectOnly the listed fields are accepted.
request_id· requiredstringversion· requiredstringconst: "1"
ClientApiJobCreateRequest
objectOnly the listed fields are accepted.
operation· requiredstringenum: ["form_export","ai_insight","report_run","integration_sync"]
total· requiredintegerminimum: 0maximum: 1000
expires_at· requiredstringformat: "date-time"
approved· requiredSchemaconst: true
retryable· optionalbooleanmax_attempts· optionalintegerminimum: 1maximum: 3
Job
objectid· requiredstring | nullformat: "uuid"
title· requiredstring | nullstatus· requiredstring | nullcontact_id· optionalstring | nullclient_account_id· optionalstring | nullservice_name· optionalstring | nullscheduled_at· optionalstring | nullcompleted_at· optionalstring | nullaccepted_quote_total_cents· optionalinteger | nullsource_channel· optionalstring | nullcreated_at· optionalstring | nullupdated_at· optionalstring | null
Task
objectid· requiredstring | nullformat: "uuid"
revision· optionalinteger | nulltitle· requiredstring | nulldescription· optionalstring | nullstatus· requiredstring | nullpriority· optionalstring | nullcontact_id· optionalstring | nulljob_id· optionalstring | nulldue_at· optionalstring | nullcompleted_at· optionalstring | nullcreated_at· optionalstring | nullupdated_at· optionalstring | null
RequestOwner
objectOnly the listed fields are accepted.
kind· requiredstringenum: ["unassigned","owner","team_member"]
team_member_id· requiredstring | null
Request
objectOnly the listed fields are accepted.
id· requiredstringformat: "uuid"
contact_id· requiredstringformat: "uuid"
job_id· requiredstring | nullsource· requiredstringsummary· requiredstringcategory· requiredstringpriority· requiredstringstatus· requiredstringowner· required- RequestOwner
tags· requiredarrayArray items:stringrevision· requiredintegerminimum: 1
responded_at· requiredstring | nullresolved_at· requiredstring | nullcreated_at· requiredstringformat: "date-time"
updated_at· requiredstringformat: "date-time"
RequestConversationItem
objectOnly the listed fields are accepted.
id· requiredstringformat: "uuid"
type· requiredstringenum: ["customer_message","public_reply"]
text· requiredstringmaxLength: 4000
created_at· requiredstringformat: "date-time"
author· requiredstringenum: ["customer","business"]
RequestDetail
objectOnly the listed fields are accepted.
id· requiredstringformat: "uuid"
contact_id· requiredstringformat: "uuid"
job_id· requiredstring | nullsource· requiredstringsummary· requiredstringcategory· requiredstringpriority· requiredstringstatus· requiredstringowner· required- RequestOwner
tags· requiredarrayArray items:stringrevision· requiredintegerminimum: 1
responded_at· requiredstring | nullresolved_at· requiredstring | nullcreated_at· requiredstringformat: "date-time"
updated_at· requiredstringformat: "date-time"
description· requiredstring | nullconversation· requiredobjectOnly the listed fields are accepted.
items· requiredtruncated· requiredboolean
TaskCreateInput
objectOnly the listed fields are accepted.
title· requiredstringminLength: 1maxLength: 200
description· optionalstring | nulldue_at· optionalstring | nullpriority· optionalstringenum: ["low","normal","high"]
contact_id· optionalstring | nulljob_id· optionalstring | nullowner· optionalobject
TaskStatusInput
objectOnly the listed fields are accepted.
target_status· requiredstringenum: ["open","done"]
expected_revision· requiredintegerminimum: 1
DocumentTemplate
objectid· requiredstringformat: "uuid"
form_id· optionalstring | nullname· requiredstringdescription· optionalstringkind· requiredstringstatus· requiredstringactive_version_id· optionalstring | nullversions· requiredarrayArray items: DocumentTemplateVersioncreated_at· optionalstringformat: "date-time"
updated_at· optionalstringformat: "date-time"
SignatureEnvelope
objectOnly the listed fields are accepted.
id· requiredstringformat: "uuid"
version· requiredintegerminimum: 1
status· requiredstringenum: ["draft","ready","sent","in_progress","finalizing","completed","declined","voided","expired","finalization_failed","abandoned"]
title· requiredstringdocument_kind· requiredstringenum: ["agreement","quote_acceptance"]
related_record· requiredobjectOnly the listed fields are accepted.
kind· optionalstringenum: ["business","contact","account","job","task"]
id· optionalstringformat: "uuid"
oneOfobjectOnly the listed fields are accepted.
kind· requiredstringconst: "business"
objectOnly the listed fields are accepted.
kind· requiredstringenum: ["contact","account","job","task"]
id· requiredstringformat: "uuid"
delivery_method· requiredstringenum: ["copy_link","email"]
legal_hold· requiredbooleanretention_policy· requiredstringenum: ["90_days","1_year","3_years","7_years"]
retention_until· optionalstring | nullformat: "date-time"
expires_at· optionalstring | nullformat: "date-time"
sent_at· optionalstring | nullformat: "date-time"
completed_at· optionalstring | nullformat: "date-time"
created_at· requiredstringformat: "date-time"
updated_at· requiredstringformat: "date-time"
PipelineOpportunity
objectid· requiredstring | nullformat: "uuid"
version· optionalinteger | nullpipeline_key· requiredstring | nullstage_key· requiredstring | nulltitle· requiredstring | nullvalue_cents· optionalinteger | nullexpected_close_date· optionalstring | nullcontact_id· optionalstring | nulljob_id· optionalstring | nullcreated_at· optionalstring | nullupdated_at· optionalstring | null
Activity
objectid· requiredstring | nullformat: "uuid"
event_type· requiredstring | nullpayload· optionalobjectactor· optionalobjectsubjects· optionalarrayArray items:objectoccurred_at· requiredstring | nullrecord· optionalobject | null
SavedView
objectid· requiredstring | nullformat: "uuid"
key· requiredstring | nulllabel· requiredstring | nullresource· requiredstring | nullrevision· requiredinteger | nullpresentation· optionalobjectcreated_at· optionalstring | nullupdated_at· optionalstring | null
ReportDefinition
objectid· requiredstring | nullformat: "uuid"
version· requiredinteger | nullname· requiredstring | nulldescription· optionalstring | nullresource· requiredstring | nulldimensions· optionalarraymeasures· optionalarraydate_range· optionalobjectarchived_at· optionalstring | nullupdated_at· optionalstring | nulllatest_successful_run· optionalobject | null
AutomationExecution
objectid· requiredstring | nullformat: "uuid"
rule_id· requiredstring | nullrule_version· requiredinteger | nullstatus· requiredstring | nullattempt_count· optionalinteger | nullmaximum_attempts· optionalinteger | nullevent_label· optionalstring | nullstarted_at· optionalstring | nullcompleted_at· optionalstring | nullnext_retry_at· optionalstring | nulllast_error_code· optionalstring | nullactions· optionalarrayArray items:objectsubject· optionalobject
CrmJob
objectTenant-owned CRM business job, distinct from the asynchronous /jobs resource. fields can select any subset of these properties.
id· optionalstringcontact_id· optionalstring | nullstatus· optionalSchemaenum: ["lead","quoted","scheduled","in_progress","done","closed","cancelled","lost"]
title· optionalstringdetails· optionalstring | nullservice_name· optionalstring | nullsource_channel· optionalstring | nulllifecycle_stage· optionalstringqualification· optionalstringowner· optionalobjectkind· requiredstringteam_member_id· requiredstring | null
quoted_at· optionalstring | nullscheduled_at· optionalstring | nullstarted_at· optionalstring | nullcompleted_at· optionalstring | nullcreated_at· optionalstring | nullupdated_at· optionalstring | null
CrmNote
objectAppend-only CRM note. fields may select a subset; id is always included. Mutation responses return all listed fields.
id· requiredstringsubject_type· optionalSchemaenum: ["contact","job","task"]
subject_id· optionalstringbody· optionalstring | nullactor· optionalobjectemail· requiredstring | nullrole· requiredstring | null
created_at· optionalstring | null
ReviewedCrmCommit
objectOnly the listed fields are accepted.
preview_token· requiredstringminLength: 32maxLength: 8192
confirmed· requiredSchemaconst: true
CrmJobCreateInput
objectOnly the listed fields are accepted.
title· requiredstringTrimmed; whitespace-only titles are refused.
minLength: 1maxLength: 200
details· optionalstring | nullmaxLength: 20000
contact_id· optionalstring | nullformat: "uuid"
service_name· optionalstring | nullmaxLength: 80
status· optionalSchemaMust also satisfy the current job creation policy.
enum: ["lead","quoted","scheduled","in_progress","done","closed","cancelled","lost"]default: "lead"
CrmNoteCreateInput
objectOnly the listed fields are accepted.
subject_type· requiredSchemaenum: ["contact","job","task"]
subject_id· requiredstringformat: "uuid"
body· requiredstringTrimmed; blank notes are refused.
minLength: 1maxLength: 5000
CrmJobCreatePreview
objectoperation· requiredSchemaconst: "job.create"
before· requirednullafter· requiredobjecttitle· requiredstringdetails· requiredstring | nullcontactId· requiredstring | nullserviceName· requiredstring | nullstatus· requiredSchemaenum: ["lead","quoted","scheduled","in_progress","done","closed","cancelled","lost"]
commit· required- ReviewedCrmPreviewReceipt
non_effects· requiredarrayArray items:string
CrmJobLifecyclePreview
objectoperation· requiredSchemaconst: "job.lifecycle"
before· requiredobjectid· requiredstringstatus· requiredstringversion· requiredstringformat: "date-time"
after· requiredobjectid· requiredstringstatus· requiredstring
commit· required- ReviewedCrmPreviewReceipt
non_effects· requiredarrayArray items:string
CrmNoteCreatePreview
objectoperation· requiredSchemaconst: "note.create"
before· requirednullafter· requiredobjectsubject_type· requiredstringsubject_id· requiredstringbody· requiredstringactor· requiredobjectkind· requiredSchemaconst: "oauth_grant"
grant_id· requiredstring | nullclient_id· requiredstring | null
commit· required- ReviewedCrmPreviewReceipt
non_effects· requiredarrayArray items:string
ReviewedCrmPreviewReceipt
objectpreview_token· requiredstringSealed, expiring receipt bound to this tenant and OAuth grant. Do not log it or substitute edited fields at commit.
expires_at· requiredstringformat: "date-time"
requires_confirmation· requiredSchemaconst: true
DocumentTemplateVersion
objectid· requiredstringkind· requiredstringstatus· requiredstringis_active· requiredbooleansource_pdf_configured· requiredbooleanversion_fingerprint· requiredstringmerge_placements· requiredarrayArray items:objectplacement_ref· requiredstringsource_kind· requiredstringsource_ref· requiredstringpage· requiredintegerx· requirednumbery· requirednumberw· requirednumberh· requirednumberfont· requiredstringfont_size· requirednumberalignment· requiredstringline_limit· requiredintegeroverflow_policy· requiredstringrequired· requiredboolean
signature_placements· requiredarrayArray items:objectplacement_ref· requiredstringrecipient_role_ref· requiredstringfield_type· requiredstringpage· requiredintegerx· requirednumbery· requirednumberw· requirednumberh· requirednumberrequired· requiredboolean
approved_at· requiredstring | nullcreated_at· requiredstringformat: "date-time"
updated_at· requiredstringformat: "date-time"
ApiDiscovery
objectname· requiredstringversion· requiredstringread_only· requiredbooleanresources· requiredobjectAdditional fields are allowed.
Additional field values:stringgranted_scopes· requiredarrayArray items:string
CurrentClient
objectdata· requiredobjectid· requiredstringbusiness_name· requiredstring | nullemail· requiredstring | nulltime_zone· requiredstring | nulloauth_client_id· requiredstringscopes· requiredarrayArray items:string
OpenApiDocument
objectAn OpenAPI 3.1 document. Path items and components follow the OpenAPI specification.
openapi· requiredSchemaconst: "3.1.0"
info· requiredobjecttitle· requiredstringversion· requiredstringdescription· requiredstring
servers· optionalarrayArray items:objecturl· requiredstring
paths· requiredobjectcomponents· optionalobjectsecurity· optionalarrayArray items:object
ContactUpsertPreview
objectkind· requiredSchemaenum: ["create","update","no_op","ambiguous","conflict"]
contact_id· requiredstring | nullbefore· requiredobjectemail· optionalstring | nullphone· optionalstring | nullname· optionalstring | null
after· requiredobjectemail· optionalstring | nullphone· optionalstring | nullname· optionalstring | null
expected_revision· requiredinteger | nullnon_effects· requiredarrayArray items:stringcandidate_ids· optionalarrayArray items:stringambiguity· optionalstringrefusal· optionalstringreason· optionalstringcommit· requiredobjectcommittable· requiredbooleanpreview_key· requiredstringexpected_revision· requiredinteger | nullif_match_required· requiredbooleanetag· optionalstring | nullidempotency_key_header· optionalstringconfirmation_required· optionalboolean
CrmTask
objectThe CRM task projection. fields may select a subset; id is always returned. Mutation responses return all listed properties.
id· requiredstringformat: "uuid"
title· optionalstringdescription· optionalstring | nullstatus· optionalstringpriority· optionalstringdue_at· optionalstring | nullcontact_id· optionalstring | nulljob_id· optionalstring | nullowner· optionalobjectkind· requiredstringteam_member_id· requiredstring | null
completed_at· optionalstring | nullcreated_at· optionalstring | nullupdated_at· optionalstring | nullrevision· optionalinteger
TaskCreatePreview
objectkind· requiredstringbefore· requiredobjecttitle· requirednulldue_at· requirednullpriority· requirednullowner· requirednull
after· requiredobjecttitle· requiredstringdue_at· requiredstring | nullpriority· requiredstringowner· requiredobjectkind· requiredstringteam_member_id· requiredstring | null
description· requiredstring | nullcontact_id· requiredstring | nulljob_id· requiredstring | null
expected_revision· requirednullnon_effects· requiredarrayArray items:stringcommit· requiredobjectcommittable· requiredbooleanpreview_key· requiredstringexpected_revision· requiredinteger | nullif_match_required· requiredbooleanetag· optionalstring | nullidempotency_key_header· optionalstringconfirmation_required· optionalboolean
TaskStatusPreview
objectkind· requiredstringtask_id· requiredstringbefore· requiredobjectstatus· requiredstring
after· requiredobjectstatus· requiredstring
expected_revision· requiredintegernon_effects· requiredarrayArray items:stringcommit· requiredobjectcommittable· requiredbooleanpreview_key· requiredstringexpected_revision· requiredinteger | nullif_match_required· requiredbooleanetag· optionalstring | nullidempotency_key_header· optionalstringconfirmation_required· optionalboolean
FormScheduling
objectform_id· requiredstringsource· requiredSchemaconst: "draft"
scheduling_fields· requiredarrayArray items:objectfield_ref· requiredstringtitle· requiredstringprovider· requiredstringduration_minutes· requiredintegerbuffer_minutes· requiredintegermax_days_ahead· requiredintegerweekdays· requiredarrayArray items:integerminimum: 0maximum: 6
working_hours_source· requiredstring
provider_availability_queried· requiredSchemaconst: false
booking_created· requiredSchemaconst: false
StoredFormInsight
objectid· requiredstringquestion· requiredstringanswer· requiredstringevidence· requiredobjectfilter_fingerprint· requiredstringfilter_summary· requiredstringpopulation_rows· requiredintegerrows_read· requiredintegerwindow_from· requiredstring | nullwindow_to· requiredstring | null
generated_at· requiredstringformat: "date-time"
expires_at· requiredstringformat: "date-time"
DepositCapability
objectcapability· requiredSchemaconst: "business_owned_deposit_link"
enabled· requiredbooleanready· requiredbooleanmode· requiredstring | nullunavailable_reason· requiredstring | nulltrigger· requiredstringcharge_supported· requiredSchemaconst: false
refund_supported· requiredSchemaconst: false
provider_settlement_confirmed· requiredSchemaconst: false
payment_url_disclosed· requiredSchemaconst: false
WorkflowPreview
objectcontractVersion· requiredstringmode· requiredSchemaconst: "preview_only"
status· requiredstringruleKey· requiredstringruleVersion· requiredintegerruleStatus· requiredstringruleFingerprint· requiredstringeventFingerprint· requiredstringidempotencyBasis· requiredstringtriggerMatched· requiredbooleanconditionsMatched· requiredbooleanwouldMatch· requiredbooleanhumanApprovalRequired· requiredbooleanactionPreviews· requiredarrayArray items:objectindex· requiredintegertype· requiredstringapprovalRequirement· requiredstringdecision· requiredstring
conditionTrace· requiredarrayArray items:objectpath· requiredstringfact· requiredstringoperator· requiredstringexpected· requiredstring | boolean | numberactual· requiredstring | boolean | number | nullmatched· requiredbooleanreason· requiredSchemaenum: ["matched","not_matched","missing_fact"]
executionPerformed· requiredSchemaconst: false
executionAllowed· requiredSchemaconst: false
WebhookEndpoint
objectid· requiredstringurl· requiredstringformat: "uri"
event_names· requiredarrayArray items:stringstatus· requiredstringverification_status· requiredstringcreated_at· requiredstringformat: "date-time"
updated_at· requiredstringformat: "date-time"
ProvisionedWebhookEndpoint
objectid· requiredstringurl· requiredstringformat: "uri"
event_names· requiredarrayArray items:stringstatus· requiredstringverification_status· requiredstringcreated_at· requiredstringformat: "date-time"
updated_at· requiredstringformat: "date-time"
signing_secret· requiredstringReturned only on creation. Store securely; subsequent reads cannot recover this value.
verification_challenge· requiredstringverification_expires_at· requiredstringformat: "date-time"
WebhookDeliveryAttempt
objectattempt· requiredintegerstate· requiredstringstarted_at· requiredstringformat: "date-time"
finished_at· requiredstringformat: "date-time"
latency_ms· requiredintegerhttp_status· requiredinteger | nullerror_code· requiredstring | null
WebhookDelivery
objectid· requiredstringendpoint_id· requiredstringevent· requiredobjectid· requiredstringname· requiredstringoccurred_at· requiredstringformat: "date-time"
state· requiredstringattempt_count· requiredintegernext_attempt_at· requiredstring | nulllatest_attempt· requiredSchemaanyOfnullcreated_at· requiredstringformat: "date-time"
updated_at· requiredstringformat: "date-time"
delivered_at· requiredstring | nulldead_lettered_at· requiredstring | null
WebhookDeliveryDetail
objectid· requiredstringendpoint_id· requiredstringevent· requiredobjectid· requiredstringname· requiredstringoccurred_at· requiredstringformat: "date-time"
state· requiredstringattempt_count· requiredintegernext_attempt_at· requiredstring | nulllatest_attempt· requiredSchemaanyOfnullcreated_at· requiredstringformat: "date-time"
updated_at· requiredstringformat: "date-time"
delivered_at· requiredstring | nulldead_lettered_at· requiredstring | nullattempts· required
ExportCatalog
objectdata· requiredarrayArray items:objectid· requiredSchemaenum: ["calls","call-insight-reviews","callers","lead-lifecycle-history","lead-reason-sets","lead-import-history","chats","messages","webchat-resolution-feedback","taken-messages","bookings","internal-calendar-events","reviews","client-accounts","account-relationships","account-command-history","jobs","fulfillment-operations","fulfillment-outbox","call-outcomes","call-outcome-steps","equipment","equipment-service-history","equipment-service-evidence","job-status-links","delivery-templates","delivery-plans","delivery-items","delivery-dependencies","delivery-blockers","delivery-history","tasks","task-reminders","task-reminder-deliveries","team-workload-revision","team-queues","team-queue-memberships","team-queue-resources","team-queue-watchers","task-assignment-history","resource-assignment-history","team-threads","team-messages","team-mentions","team-notifications","team-notification-preferences","push-devices","team-command-history","crm-activity","crm-timeline","business-files","business-file-sources","business-file-revisions","business-file-publications","intake-media","attachments","signature-envelopes","signature-recipients","signature-fields","signature-field-values","signature-events","signature-artifacts","signature-templates","signature-verifications","signature-bulk-batches","signature-bulk-items","sales-pipeline-definitions","sales-opportunities","sales-opportunity-history","crm-duplicate-candidates","crm-duplicate-dismissed-pairs","crm-forecast-snapshots","crm-import-mapping-profiles","crm-import-dry-run-fingerprints","sla-policies","sla-ticket-clocks","sla-ticket-clock-pauses","crm-account-classifications","crm-account-segments","csat-survey-definitions","csat-survey-invitations","csat-survey-responses","crm-relationship-edges","territories","territory-visit-events","portal-access-grants","config-draft-versions","config-activations","crm-partner-account-attributes","crm-partner-contacts","crm-partner-onboarding-events","crm-partner-lead-registrations","crm-partner-lead-events","crm-contact-identities","crm-contact-merge-aliases","tenant-referrals","tenant-referral-events","incentive-plan-versions","incentive-period-versions","incentive-period-participants","incentive-revenue-credits","incentive-revenue-credit-splits","incentive-adjustments","incentive-statements","crm-layout-visibility-conditions","crm-layout-approved-actions","crm-report-definitions","crm-report-runs","crm-report-result-rows","crm-report-memberships","crm-report-command-history","custom-field-definitions","custom-field-values","custom-field-definition-history","custom-field-value-history","custom-field-command-history","record-layout-history","customer-cases","customer-case-messages","customer-case-events","customer-case-reply-snippets","service-area-settings","public-faqs","faq-disclosures","consented-visitor-activity","saved-views","search-saved-views","quote-templates","settings"]
label· requiredstringdescription· requiredstringformat· requiredSchemaconst: "text/csv"
endpoint· requiredstring
meta· requiredobjectcount· requiredinteger
FormsAuthoringDefinition
objectStructural checks only. POST /forms/validate runs the canonical semantic validator. Saving also checks references, logic, settings and owned assets. Validation never authorizes publication.
Additional fields are allowed.
title· requiredstringminLength: 1maxLength: 300
ref· optionalstringpattern: "^[a-z0-9_-]{1,64}$"
fields· requiredarrayArray items:objectAdditional fields are allowed.
ref· optionalstringpattern: "^[a-z0-9_-]{1,64}$"
type· requiredstringenum: ["short_text","long_text","email","phone_number","multiple_choice","checkbox","picture_choice","dropdown","yes_no","opinion_scale","rating","nps","number","date","time","address","website","file_upload","signature","contact","ranking","matrix","scheduler","statement","legal"]
title· requiredstring
theme· optionalobjectThe canonical validator checks colors, layout, fonts and tenant-owned image references.
FormsAuthoringCreate
objectOnly the listed fields are accepted.
definition· required- FormsAuthoringDefinition
ref· optionalstringpattern: "^[a-z0-9_-]{1,64}$"
FormsAuthoringDuplicate
objectOnly the listed fields are accepted.
ref· requiredstringpattern: "^[a-z0-9_-]{1,64}$"
title· optionalstringminLength: 1maxLength: 300
expected_draft_revision· requiredstringformat: "date-time"pattern: "^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}\\.\\d{3}Z$"
FormsAuthoringPreview
objectOnly the listed fields are accepted.
expected_draft_revision· requiredstringformat: "date-time"pattern: "^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}\\.\\d{3}Z$"
expected_published_version· requiredintegerminimum: 0
FormsAuthoringPublish
objectOnly the listed fields are accepted.
expected_draft_revision· requiredstringformat: "date-time"pattern: "^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}\\.\\d{3}Z$"
expected_published_version· requiredintegerminimum: 0
preview_receipt· requiredstringminLength: 40maxLength: 2000
confirmed· requiredSchemaconst: true
FormsAuthoringConditionalWrite
objectOnly the listed fields are accepted.
expected_draft_revision· requiredstringformat: "date-time"pattern: "^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}\\.\\d{3}Z$"
FormsAuthoringValidate
FormsAuthoringApply
objectOnly the listed fields are accepted.
version· requiredSchemaconst: 1
expected_draft_revision· requiredstringformat: "date-time"pattern: "^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}\\.\\d{3}Z$"
operations· requiredarrayThe closed operation vocabulary and semantic constraints are enforced by the canonical Forms operation parser.
Array items:objectop· requiredstring
FormsAuthoringMeta
objectAdditional fields are allowed.
request_id· requiredstringversion· requiredSchemaconst: "1"
FormsAuthoringForm
objectid· requiredstringformat: "uuid"
ref· optionalstringpattern: "^[a-z0-9_-]{1,64}$"
title· optionalstringstatus· optionalSchemaenum: ["draft","published","closed"]
version· optionalintegerdraft_revision· optionalstringformat: "date-time"pattern: "^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}\\.\\d{3}Z$"
definition· optional- FormsAuthoringDefinition
received_responses· optionalintegercreated_at· optionalstring | nullupdated_at· optionalstring | nullpublished_at· optionalstring | null
FormsAuthoringPreparedPreview
objectpreview_receipt· requiredstringdefinition· required- FormsAuthoringDefinition
fingerprint· requiredstringexpires_at· requiredstringformat: "date-time"
expected_draft_revision· requiredstringformat: "date-time"pattern: "^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}\\.\\d{3}Z$"
expected_published_version· requiredintegerpublished· requiredSchemaconst: false
confirmation_instruction· optionalstring
FormsAuthoringDeleted
objectOnly the listed fields are accepted.
id· requiredstringformat: "uuid"
deleted· requiredSchemaconst: true
scope· requiredSchemaconst: "never_published_empty_draft"
FormsAuthoringValidation
objectdefinition· optional- FormsAuthoringDefinition
warnings· optionalarraypublication_authorized· optionalSchemaconst: false
validation_scope· optionalSchemaconst: "definition_only"
FormsAuthoringApplied
objectform· optional- FormsAuthoringForm
applied· optionalobjectdiff· optionalobjectwarnings· optionalarray
FormsAuthoringError
objectOnly the listed fields are accepted.
error· requiredobjectcode· requiredstringmessage· requiredstringrequest_id· requiredstringretryable· requiredbooleanfield· optionalstring | nulldetails· optionalobject
Implementation and access notes
The authenticated OpenAPI 3.1 document is the exact 78-operation source contract. The table below groups compatible operations by OAuth scope and calls out important companion routes. Implemented means the route exists in source and still remains subject to the production gate (CLIENT_API_ENABLED), registration, grant, and entitlement. Draft is a design example only. Reserved means no Client API resource implementation exists.
https://api.firstaiemployee.com/api/client/v1| Method | Path | Scope | Status | Notes |
|---|---|---|---|---|
GET | /oauth/authorize | requested scopes | Implemented | Browser consent. Registered clients only. |
POST | /oauth/token | none | Implemented | Authorization code and rotating refresh grants. |
GET | /api/client/v1/me | any valid grant | Implemented | Tenant-safe connection identity. |
GET | /api/client/v1 | any valid grant | Implemented | Read-only service discovery. |
GET | /api/client/v1/openapi.json | any valid grant | Implemented | Authenticated OpenAPI 3.1 contract. |
GET | /api/client/v1/calls | calls:read | Implemented | Call history and transcript projection. |
GET | /api/client/v1/contacts | contacts:read | Implemented | Contacts and recorded consent state. |
POST | /api/client/v1/crm/contacts:preview | contacts:write | Implemented | Preview and commit a bounded contact upsert. |
GET | /api/client/v1/bookings | bookings:read | Implemented | Read-only booking projection. |
GET | /api/client/v1/reviews | reviews:read | Implemented | Reviews and reply status. |
GET | /api/developer/v1/forms | forms:read | Implemented | Forms a business owns and the responses they collected. |
GET | /api/client/v1/forms | front_desk:forms:read | Implemented | Forms metadata and safe draft definitions. List and detail also accept forms:lifecycle. Select definition explicitly on detail. |
POST | /api/client/v1/forms/{id}:applyOperations | forms:write | Implemented | Apply a closed batch of revision-checked form edits. |
GET | /api/client/v1/forms/{formId}/responses | forms:responses:read | Implemented | Bounded form responses with stable historical columns. |
GET | /api/client/v1/forms/{formId}/analytics | forms:analytics:read | Implemented | Deterministic branch-aware form analytics. |
GET | /api/client/v1/exports | exports:read | Implemented | Complete field-allowlisted dataset catalog. |
POST | /api/client/v1/forms/{formId}/exports | exports:create | Implemented | Create, inspect, and download frozen form exports. |
GET | /api/client/v1/client-accounts | client_accounts:read | Implemented | Client accounts with bounded contact and job summaries. |
GET | /api/client/v1/jobs | jobs:read | Implemented | Tenant-scoped job records. |
POST | /api/client/v1/crm/jobs/actions/create/preview | jobs:write | Implemented | Create jobs and apply explicitly reviewed lifecycle changes. |
GET | /api/client/v1/tasks | tasks:read | Implemented | Tenant-scoped Front Desk tasks. |
GET | /api/client/v1/requests | requests:read | Implemented | Tenant-scoped Request list and exact detail projections. |
GET | /api/client/v1/pipeline-opportunities | pipeline_opportunities:read | Implemented | Pipeline opportunity projections. |
GET | /api/client/v1/activities | activities:read | Implemented | Bounded CRM activity timeline. |
POST | /api/client/v1/crm/notes/actions/create/preview | activities:write | Implemented | Add an append-only CRM note after explicit review. |
GET | /api/client/v1/saved-views | saved_views:read | Implemented | Saved-view definitions visible to the account. |
GET | /api/client/v1/saved-views/{id}/results | saved_views:execute | Implemented | Execute an authorized saved view. |
GET | /api/client/v1/report-definitions | reports:read | Implemented | Report definitions and current summaries. |
GET | /api/client/v1/automation-executions | automations:read | Implemented | Recent automation execution projections. |
GET | /api/client/v1/dashboard | dashboard:read | Implemented | Owner-facing dashboard summary. |
GET | /api/client/v1/events | events:read | Implemented | Tenant-scoped API event history. |
POST | /api/client/v1/webhooks | webhooks:manage | Implemented | Verified webhook endpoint lifecycle. |
GET | /api/client/v1/webhook-deliveries | webhook_deliveries:read | Implemented | Sanitized webhook delivery status and attempt history. |
GET | /api/client/v1/document-templates | documents:read | Implemented | Read document templates and immutable version layouts. |
GET | /api/client/v1/signature-envelopes | signatures:read | Implemented | Read signature envelope status without signer-sensitive details. |
POST | /api/client/v1/crm/tasks/actions/create/preview | tasks:prepare | Implemented | Preview bounded CRM task changes without applying them. |
POST | /api/client/v1/crm/tasks/actions/create/commit | tasks:commit | Implemented | Commit only an explicitly reviewed CRM task change. |
POST | /api/client/v1/forms | forms:lifecycle | Implemented | Create an unpublished draft. 201 with ETag and Location. Idempotency-Key 16 to 128 chars; exact retries replay for 24 hours. |
POST | /api/client/v1/forms/{id}/duplicate | forms:lifecycle | Implemented | Copy a definition into a new draft with stable child refs and no responses. 201. Requires If-Match and expected draft revision. |
POST | /api/client/v1/forms/{id}/publish-preview | forms:lifecycle | Implemented | Review the exact publish candidate. No publication occurs. Receipt expires after ten minutes; reuse the same Idempotency-Key for publish. |
POST | /api/client/v1/forms/{id}/publish | forms:lifecycle | Implemented | Publish the approved preview as a new immutable revision. Requires receipt, unchanged revisions, and confirmed:true. |
POST | /api/client/v1/forms/{id}/close | forms:lifecycle | Implemented | Stop collection without deleting history. Remains available after module deactivation. |
DELETE | /api/client/v1/forms/{id} | forms:lifecycle | Implemented | Delete only an empty never-published draft. Requires If-Match and expected draft revision. |
POST | /api/client/v1/forms/validate | forms:write, forms:lifecycle | Implemented | Canonical semantic validation without persistence. A valid document is not a publication approval. |
GET | /api/client/v1/forms/schema.json | front_desk:forms:read, forms:lifecycle | Implemented | Structural JSON Schema versioned in $comment. Cross-links the versioned Forms authoring OpenAPI companion at GET /forms/openapi.json. |
GET | /api/client/v1/forms/openapi.json | front_desk:forms:read | Implemented | Versioned Forms authoring OpenAPI companion (2026-09-05.1). Cross-linked from the main contract; requires the same gates. |
GET | /api/client/v1/signature-envelopes/{id} | signatures:read | Implemented | Privacy-minimized envelope detail. It omits signer capabilities and storage identifiers. |
GET | /api/client/v1/exports/{dataset}.csv | exports:read | Implemented | Bounded-memory complete CSV stream. |
GET | /api/developer/v1/forms | forms:read | Implemented | Forms, revisions and responses. Read only. |
Do not build production dependencies against a Reserved row. An Implemented row still requires the production gate (CLIENT_API_ENABLED), reviewed registration, the exact customer grant, and live entitlement.
Forms has two documents of its own
The forms:read routes and the browser embed each have a full contract page: every endpoint with its page size, cursor and error envelope, and every embed mode with its attributes and events.