Version 1

Server API reference.

These operations accept a Fendsy server credential. Each entry names its required scope. Workspace session and internal operations are excluded.

Send Authorization: Bearer $FENDSY_API_KEY over HTTPS. Use the returned request ID when asking for support. Limits return429 with Retry-After; invalid keys return401 and missing scopes return 403.

Download the OpenAPI contract

Operations

56 of 56 operations

GET/v1/credentials/verify

Verify a server API key

Validates any supported developer key and returns safe metadata. No event, dispatch or provider message is created. The response is private/no-store. Revoked or expired keys return 401.

Required scope: valid key

POST/v1/events

Ingest a public event

Requires events:write. The credential determines tenant ownership and Event Source; body source is a descriptive label. Reuse the same JSON body and idempotencyKey on retries. New receipts return 202; exact replays return 200; changed content under the same source/key returns 409. A 202 quarantined receipt has validationErrors and no queued dispatch. Analytics/report visibility is asynchronous. Limit: 120 requests per minute per key when the coordination service is available. Retry 429 after Retry-After; never retry a 409 blindly.

Required scope: events:write

POST/v1/sites/{publicId}/identity-tokens

Create onsite identity token

Trusted-server operation. Requires identity:write (legacy events:write keys remain supported). Both Site and customerProfileId must belong to the key's organization. Pass the short-lived token to Fendsy.identify; never expose the API key.

Required scope: identity:write or events:write

GET/v1/catalog/items

List merchant Catalog Items

Cursor-paginated Catalog Items for an organization credential.

Required scope: catalog:read

POST/v1/catalog/items

Create merchant Catalog Item

Create a manual Catalog Item with an Idempotency-Key.

Required scope: catalog:write

GET/v1/catalog/items/{itemId}

Get merchant Catalog Item

Read an Item and its active Variants.

Required scope: catalog:read

GET/v1/orders

List merchant orders

Read a bounded page of merchant-confirmed orders.

Required scope: orders:read

POST/v1/orders

Confirm merchant order

Submit a signed, retry-safe confirmed order with immutable item and money snapshots.

Required scope: orders:write

GET/v1/orders/{orderId}

Get merchant order

Read the confirmed order and its immutable item and shipping snapshots.

Required scope: orders:read

POST/v1/orders/{orderId}/milestones

Record order milestone

Record payment, fulfillment, delivery, cancellation or refund evidence.

Required scope: orders:write

GET/v1/audience/profiles

List Customer Profiles

Read a bounded organization-wide page without private identity evidence.

Required scope: audience:read

POST/v1/audience/profiles

Create or resolve Customer Profile

Use a contact identity and Idempotency-Key; this does not grant marketing consent.

Required scope: audience:write

GET/v1/audience/profiles/{profileId}

Get Customer Profile

Read allowlisted profile fields.

Required scope: audience:read

PATCH/v1/audience/profiles/{profileId}

Update Customer Profile

Update allowlisted identity fields without changing consent.

Required scope: audience:write

GET/v1/audience/lists

List static Lists

Read a bounded page of static Audience Lists.

Required scope: audience:read

POST/v1/audience/lists

Create static List

Create an explicit static List with an Idempotency-Key.

Required scope: audience:write

GET/v1/audience/lists/{listId}

Get static List

Read List lifecycle and member count.

Required scope: audience:read

PATCH/v1/audience/lists/{listId}

Update static List

Update List name or description without changing members.

Required scope: audience:write

POST/v1/audience/lists/{listId}/archive

Archive static List

Archive a List and preserve its provenance for restore.

Required scope: audience:write

POST/v1/audience/lists/{listId}/restore

Restore static List

Restore an archived List with credential audit.

Required scope: audience:write

GET/v1/audience/lists/{listId}/members

List List members

Read bounded member pages with original join provenance.

Required scope: audience:read

POST/v1/audience/lists/{listId}/members

Add List member

Add an existing Profile without changing marketing consent or its original join source.

Required scope: audience:write

DELETE/v1/audience/lists/{listId}/members/{profileId}

Remove List member

Remove a Profile from a static List with lifecycle evidence.

Required scope: audience:write

GET/v1/audience/segments

List Segments

Read bounded Segment Definition and lifecycle pages.

Required scope: audience:read

POST/v1/audience/segments

Create Segment draft

Create a version 1 draft with an Idempotency-Key.

Required scope: audience:write

GET/v1/audience/segments/catalog

Get condition catalog

Read the authorized condition catalog and source health.

Required scope: audience:read

GET/v1/audience/segments/{segmentId}

Get Segment

Read a Segment Definition and its revision state.

Required scope: audience:read

PATCH/v1/audience/segments/{segmentId}

Update Segment draft

Update a draft with its expected version.

Required scope: audience:write

POST/v1/audience/segments/{segmentId}/activate

Activate Segment draft

Publish the exact draft revision and queue evaluation; accepted is not ready membership.

Required scope: audience:write

GET/v1/analytics/event-definitions

List Event Definitions

Read bounded definitions and governance state.

Required scope: analytics:read

GET/v1/analytics/receipts/{receiptId}

Get event receipt

Read accepted and downstream processing status without raw event payload.

Required scope: analytics:read

GET/v1/analytics/reports

List reports

Read bounded approved report definitions.

Required scope: analytics:read

GET/v1/analytics/dashboards

List dashboards

Read bounded saved Dashboard card summaries.

Required scope: analytics:read

GET/v1/analytics/dashboards/{dashboardId}/cards/{cardId}/query

Query saved Dashboard card

Read a bounded 31-day aggregate from a permitted saved card.

Required scope: analytics:read

GET/v1/customers/{profileId}/orders

List Customer orders

Read allowlisted confirmed order history for one Customer Profile.

Required scope: customer_history:read

GET/v1/billing/account

Read Fendsy account billing

Read Organization plan, usage and invoice summary without payment actions.

Required scope: account_billing:read

GET/v1/templates

List published Templates

Read bounded published Email Template pages.

Required scope: templates:read

POST/v1/templates

Create Template draft

Create an organization Email Template draft with an Idempotency-Key; credential is the actor.

Required scope: templates:write

GET/v1/templates/{templateId}/draft

Read Template draft

Read an organization Template draft with templates:write scope.

Required scope: templates:write

PUT/v1/templates/{templateId}/draft

Replace Template draft

Save a validated draft with its expected version.

Required scope: templates:write

POST/v1/templates/{templateId}/versions/{version}/edit

Edit published Template

Create a new editable draft from a published version.

Required scope: templates:write

POST/v1/templates/{templateId}/publish

Publish Template draft

Publish the exact draft revision using a separately scoped credential and Idempotency-Key.

Required scope: templates:publish

GET/v1/templates/{templateId}/versions/{version}

Get published Template version

Read one immutable Template version and document.

Required scope: templates:read

GET/v1/campaigns

List Campaigns

Read a bounded Campaign page for the credential organization.

Required scope: campaigns:read

POST/v1/campaigns

Create Campaign draft

Create a credential-authored Campaign through the workspace domain service.

Required scope: campaigns:write

GET/v1/campaigns/{campaignId}

Get Campaign

Read the current Campaign revision and latest run ID.

Required scope: campaigns:read

PUT/v1/campaigns/{campaignId}/revision

Replace Campaign draft revision

Save a Campaign draft with an expected version; no send occurs.

Required scope: campaigns:write

POST/v1/campaigns/{campaignId}/validate

Validate Campaign

Pin a ready revision only after audience, sender and content checks pass.

Required scope: campaigns:write

POST/v1/campaigns/{campaignId}/schedule

Schedule Campaign

Queue a ready Campaign through the same recipient pipeline as the workspace.

Required scope: campaigns:publish

GET/v1/campaigns/{campaignId}/runs

List Campaign runs

Read a bounded page of aggregate Campaign run status.

Required scope: campaigns:read

GET/v1/campaigns/{campaignId}/runs/{runId}

Get Campaign run

Read aggregate delivery and failure counts for one run.

Required scope: campaigns:read

POST/v1/campaigns/{campaignId}/runs/{runId}/{action}

Control Campaign run

Pause, resume or cancel one run with an Idempotency-Key.

Required scope: campaigns:publish

POST/v1/saas/events

Report SaaS lifecycle fact

Report a Customer-bound account, trial or plan outcome from a scoped server credential.

Required scope: saas:write

POST/v1/sends/marketing

Queue one marketing email

Send one eligible Customer a published Template with an Idempotency-Key; returns a delivery ID.

Required scope: sends:marketing

POST/v1/sends/service

Queue one order confirmation

Send one confirmed merchant order with an explicit reason and published service Template. Shopify orders remain on Shopify confirmation by default.

Required scope: sends:service

GET/v1/sends/{deliveryId}

Get send status

Read a delivery authorized for this credential's send scope.

Required scope: sends:marketing or sends:service