Developers

API reference

Generated from the contract this application serves, not written alongside it.

The contract publishes 68 operations. They are listed below in 6 groups. The machine-readable contract is at /developers/openapi.json, and a typed client is generated from the same document. Group names, paths and parameter names appear exactly as the contract writes them. None of the reference below is maintained by hand, so it cannot fall behind the API.

There is no API credential you can hold yet.
The contract declares experienceSession (apiKey in cookie). A cookie is issued by an interactive sign-in and belongs to a browser, so there is no credential you could hold and present. Issuing, listing and revoking a machine credential is not built. The operations that do not need a session are not a way in either: they take a signature or a token this deployment issues, and they are named below. Read this reference as the shape of the API, not as an invitation to integrate against it today.
Authorization is not visible in this contract.
61 of 68 operations attach no security requirement in the document at all. That is a gap in the published contract rather than a statement about the handlers, but it is not one gap with one answer behind it. What each of those operations actually requires is set out below, class by class, and the classes are not interchangeable: 51 by browser session and a permission check, 6 by provider signature, 1 by a bootstrap token in the body, and 3 by nothing at all. Check the class before you decide what an operation needs.

How each operation is authenticated

Derived from the contract and checked against the handlers. What stood here before was one hand-written sentence, and it was false for ten of these operations.
Authentication mechanism by route class
What the caller presentsOperationsWhat the handler does with it
Browser session, plus a permission and an account scope51The handler calls requirePermission with a named permission and the account it is acting inside, which rejects an unauthenticated request with 401 and an out-of-scope one with 403. There is no credential a caller outside a browser can present for these today.
Provider signature over the raw request body6No session, no permission and no account scope. The signature is the whole control: it is verified against the unparsed body, and the event id is claimed so a redelivery is deduplicated rather than applied twice. These routes are deliberately exempt from the CSRF and idempotency-key checks, and the browser proxy does not put sign-in in front of them.
A bootstrap token carried in the request body1The caller has no account yet, so there is nothing to scope to and no permission to resolve. A server-issued registration token is verified against the registrant's email and business domain. Apart from the webhook namespace, which bypasses sign-in entirely, this is the only API path the browser proxy serves to a caller with no session.
Nothing3The handler authenticates nobody and authorizes nothing. These report whether their API lane's dependencies are configured, and return no account data. The browser proxy still requires a session to reach them, so they are not anonymous on a deployed origin, but do not read them as authorized, because the handler makes no check.
Declared in the contract7The operation carries a security requirement in the document, so a generated client knows what to present without reading this page.

The classes below are small enough to name in full, so read them as the exceptions rather than as examples. An operation that is not in one of these lists and does not declare a scheme in the contract is in the browser-session row above.

  • Provider signature over the raw request body
    • POST/v1/webhooks/esign
    • POST/v1/webhooks/marketplaces/{provider}
    • POST/v1/webhooks/provisioning
    • POST/v1/webhooks/stripe
    • POST/v1/webhooks/support/{provider}
    • POST/v1/webhooks/workos
  • A bootstrap token carried in the request body
    • POST/v1/lifecycle/registrations
  • Nothing
    • GET/v1/core/status
    • GET/v1/lifecycle/status
    • GET/v1/system/status

core

17 operations
core operations
OperationTagsRequired parametersRequest bodyResponses
GET/v1/core/artifacts/{kind}/{id}core, documentskind (path), id (path)No body200, 403, 404, 503
POST/v1/core/commands/{resource}coreresource (path), idempotency-key (header)Required: application/json200, 403, 404, 409
GET/v1/core/payg-offerscore, pricingNoneNo body200, 403, 503
POST/v1/core/payg-offerscore, pricingNoneRequired: application/json200, 403, 409, 503
GET/v1/core/payg-offers/billing-effectscore, billingNoneNo body200, 403, 503
POST/v1/core/payg-offers/billing-effectscore, billingNoneRequired: application/json200, 403, 409, 503
GET/v1/core/payg-offers/enrollmentscore, billingNoneNo body200, 403, 503
POST/v1/core/payg-offers/enrollmentscore, billingNoneRequired: application/json200, 403, 409, 503
POST/v1/core/payg-offers/simulatecore, pricingNoneRequired: application/json200, 403
GET/v1/core/payg-offers/trialscore, trialsNoneNo body200, 403, 503
POST/v1/core/payg-offers/trialscore, trialsNoneRequired: application/json200, 403, 409, 503
POST/v1/core/payment-sessionscore, billingidempotency-key (header)Required: application/json200, 403, 409, 503
GET/v1/core/records/{resource}coreresource (path)No body200, 403
POST/v1/core/replays/{provider}/{eventId}core, operationsprovider (path), eventId (path)Required: application/json200, 403
GET/v1/core/reports/{report}core, reportsreport (path)No body200, 403
GET/v1/core/statuscoreNoneNo body200
POST/v1/webhooks/stripecore, webhooksstripe-signature (header)Required: application/json200, 503

Experience artifacts

3 operations
Experience artifacts operations
OperationTagsRequired parametersRequest bodyResponses
GET/api/experience/artifacts/{kind}/{artifactId}Experience artifactskind (path), artifactId (path)No body200, 403, 404, 409, 422, 502, 503
POST/api/experience/artifacts/render-requestsExperience artifactsx-csrf-token (header), idempotency-key (header)Required: application/json201, 403, 409, 422, 503
POST/api/experience/artifacts/render-requests/{requestId}Experience artifactsx-csrf-token (header), idempotency-key (header), requestId (path)No body201, 403, 404, 409, 422, 502, 503

Experience projections

4 operations
Experience projections operations
OperationTagsRequired parametersRequest bodyResponses
GET/api/experience/projections/{audience}/{channel}Experience projectionsaudience (path), channel (path)No body200, 403, 422, 503
GET/api/experience/projections/{audience}/{channel}/{recordKey}Experience projectionsaudience (path), channel (path), recordKey (path)No body200, 403, 404, 503
POST/api/experience/projections/{audience}/{channel}/{recordKey}/actionsExperience projectionsx-csrf-token (header), idempotency-key (header), audience (path), channel (path), recordKey (path)Required: application/json202, 403, 404, 409, 422, 503
GET/api/experience/projections/{audience}/{channel}/{recordKey}/actions/{actionRequestId}Experience projectionsaudience (path), channel (path), recordKey (path), actionRequestId (path)No body200, 403, 404, 503

lifecycle

32 operations
lifecycle operations
OperationTagsRequired parametersRequest bodyResponses
POST/v1/lifecycle/account-selectionlifecycle, identityidempotency-key (header)Required: application/json200, 403, 503
PUT/v1/lifecycle/accounts/{accountId}/procurement-profilelifecycle, onboardingaccountId (path), idempotency-key (header)Required: application/json200, 403, 503
GET/v1/lifecycle/accounts/{accountId}/support-signalslifecycle, supportaccountId (path)No body200, 403, 503
POST/v1/lifecycle/agreement-templateslifecycle, agreementsidempotency-key (header)Required: application/json200, 403, 503
GET/v1/lifecycle/agreement-templates/activelifecycle, agreementstype (query), jurisdiction (query)No body200, 403, 404, 503
POST/v1/lifecycle/agreements/click-throughlifecycle, agreementsidempotency-key (header)Required: application/json200, 403, 503
POST/v1/lifecycle/agreements/customer-paperlifecycle, agreementsidempotency-key (header)Required: application/json200, 403, 503
POST/v1/lifecycle/agreements/envelopeslifecycle, agreementsidempotency-key (header)Required: application/json200, 403, 503
POST/v1/lifecycle/end-user-terms/acceptanceslifecycle, agreementsidempotency-key (header)Required: application/json200, 403, 503
POST/v1/lifecycle/exceptionslifecycle, exceptionsidempotency-key (header)Required: application/json200, 403, 503
POST/v1/lifecycle/exceptions/{caseId}/decisionslifecycle, exceptionscaseId (path), idempotency-key (header)Required: application/json200, 403, 503
POST/v1/lifecycle/migrationslifecycle, migrationsidempotency-key (header)Required: application/json200, 403, 503
POST/v1/lifecycle/migrations/{runId}/matches/{legacyAccountId}/decisionlifecycle, migrations, exceptionsrunId (path), legacyAccountId (path), idempotency-key (header)Required: application/json200, 403, 503
POST/v1/lifecycle/noticeslifecycle, renewalsidempotency-key (header)Required: application/json200, 403, 503
POST/v1/lifecycle/novationslifecycle, offboardingidempotency-key (header)Required: application/json200, 403, 503
POST/v1/lifecycle/organizations/{organizationId}/inviteslifecycle, identityorganizationId (path), idempotency-key (header)Required: application/json200, 403, 503
POST/v1/lifecycle/partners/{accountId}/domainslifecycle, identity, partnersaccountId (path), idempotency-key (header)Required: application/json200, 403, 503
POST/v1/lifecycle/pocslifecycle, pocsidempotency-key (header)Required: application/json200, 403, 503
POST/v1/lifecycle/pocs/{pocId}/conversionlifecycle, pocspocId (path), idempotency-key (header)Required: application/json200, 403, 503
POST/v1/lifecycle/pocs/{pocId}/decisionslifecycle, pocs, exceptionspocId (path), idempotency-key (header)Required: application/json200, 403, 503
POST/v1/lifecycle/provisioning/{commandId}/recoverlifecycle, provisioningcommandId (path), idempotency-key (header)Required: application/json200, 403, 503
POST/v1/lifecycle/registrationslifecycle, onboardingidempotency-key (header)Required: application/json200, 403, 503
GET/v1/lifecycle/renewalslifecycle, renewalsNoneNo body200, 403, 503
POST/v1/lifecycle/renewals/{orderId}/declineslifecycle, renewalsorderId (path), idempotency-key (header)Required: application/json200, 403, 503
POST/v1/lifecycle/renewals/{orderId}/requestslifecycle, renewalsorderId (path), idempotency-key (header)Required: application/json200, 403, 503
GET/v1/lifecycle/statuslifecycleNoneNo body200
POST/v1/lifecycle/terminationslifecycle, offboardingidempotency-key (header)Required: application/json200, 403, 503
POST/v1/lifecycle/terminations/{terminationId}/approvalslifecycle, offboardingterminationId (path), idempotency-key (header)Required: application/json200, 403, 503
POST/v1/webhooks/esignlifecycle, webhooksesign-signature (header)Required: application/json200, 503
POST/v1/webhooks/marketplaces/{provider}lifecycle, webhooks, marketplacesprovider (path), marketplace-signature (header)Required: application/json200, 503
POST/v1/webhooks/provisioninglifecycle, webhooks, provisioningprovisioning-signature (header)Required: application/json200, 503
POST/v1/webhooks/support/{provider}lifecycle, webhooks, supportprovider (path), support-signature (header)Required: application/json200, 422, 503

notifications

3 operations
notifications operations
OperationTagsRequired parametersRequest bodyResponses
GET/v1/notificationsnotificationsaccountId (query)No body200, 403, 503
GET/v1/notifications/preferencesnotificationsaccountId (query)No body200, 403, 503
PUT/v1/notifications/preferencesnotificationsidempotency-key (header)Required: application/json200, 403, 422, 503

system

9 operations
system operations
OperationTagsRequired parametersRequest bodyResponses
POST/v1/system/exception-cases/{caseId}/reassignsystem, operationscaseId (path), idempotency-key (header)Required: application/json200, 403, 404, 409, 422, 503
PUT/v1/system/exception-roster/{rosterEntryId}system, operationsrosterEntryId (path), idempotency-key (header)Required: application/json200, 201, 403, 409, 422, 503
GET/v1/system/external-gatessystem, operationsNoneNo body200, 403, 503
PUT/v1/system/external-gates/{gateKey}system, operationsgateKey (path), idempotency-key (header)Required: application/json200, 403, 404, 409, 422, 503
POST/v1/system/external-gates/{gateKey}/activation-taskssystem, operationsgateKey (path), idempotency-key (header)Required: application/json202, 403, 404, 409, 503
POST/v1/system/external-gates/{gateKey}/activation-testssystem, operationsgateKey (path), idempotency-key (header)Required: application/json200, 403, 404, 409, 503
PUT/v1/system/external-gates/{gateKey}/emergency-statesystem, operationsgateKey (path), idempotency-key (header)Required: application/json200, 403, 404, 409, 422, 503
GET/v1/system/statussystemNoneNo body200
POST/v1/webhooks/workossystem, webhooksworkos-signature (header)Required: application/json200, 503

What is missing before you can integrate

Stated here rather than discovered after a contract is signed.
  • Not built Credential management. There is no way to issue, list or revoke a key scoped to an account, and no audit trail for one, because there is no store to hold a key hash in.
  • Not built A sandbox. No environment exists that a caller can exercise these operations against without touching real commercial records.
  • Partial Security in the contract. 7 of 68 operations declare a scheme; the rest declare none, and what they require has to be read from the table above rather than from the document. Until the contract carries it, a generated client cannot present a credential automatically and cannot tell those classes apart.

Rendered from the contract at build time. If an operation is listed here, the application serves it; if the application stops serving it, this page loses it on the next build.