Download OpenAPI specification:
Commerce and order-fulfilment platform API for 4klyft.
This API provides endpoints for managing:
All API endpoints (except /api/docs and /api/v1/iam/auth/*) require JWT Bearer token authentication.
Include the token in the Authorization header:
Authorization: Bearer <your-jwt-token>
Every /api/ request is rate-limited per caller — by your authenticated
identity when a token is present, otherwise by client IP. The
authentication endpoints (/auth/login, /auth/refresh,
/auth/request-password-reset) carry stricter, IP-based limits.
Each response advertises your current budget via headers:
X-RateLimit-Limit — the bucket sizeX-RateLimit-Remaining — tokens left in the current windowX-RateLimit-Reset — Unix timestamp when a token next frees upExceeding a limit returns 429 Too Many Requests (RFC 6585) with a
Retry-After header (seconds to wait). Back off and retry after the
indicated delay rather than hammering the endpoint.
Closed catalog of subscribable webhook events.
The catalog is derived from NotificationTopic and grouped as
module → aggregate → event so the UI can render a three-tier tree
picker. The endpoint is a singleton (no identifier) — clients always
GET the full tree.
Retrieve a paginated list of webhook delivery records with optional filters.
| endpointId | string <uuid> Example: endpointId=01912345-6789-7abc-def0-123456789abc Filter by webhook endpoint UUID |
| status | string Enum: "pending" "sending" "succeeded" "failed" "cancelled" Example: status=succeeded Filter by delivery status |
| eventType | string Example: eventType=shipment.delivered Filter by event type |
| dateFrom | string <date> Example: dateFrom=2024-06-01 Filter deliveries from this date (inclusive) |
| dateTo | string <date> Example: dateTo=2024-06-30 Filter deliveries up to this date (inclusive) |
| page | integer >= 1 Default: 1 Example: page=1 Page number for pagination |
| itemsPerPage | integer [ 1 .. 100 ] Default: 30 Example: itemsPerPage=30 Number of items per page |
{- "totalItems": 0,
- "search": {
- "@type": "string",
- "template": "string",
- "variableRepresentation": "string",
- "mapping": [
- {
- "@type": "string",
- "variable": "string",
- "property": "string",
- "required": true
}
]
}, - "view": {
- "@id": "string",
- "@type": "string",
- "first": "string",
- "last": "string",
- "previous": "string",
- "next": "string"
}, - "member": [
- {
- "@context": "string",
- "@id": "string",
- "@type": "string",
- "id": "01912345-6789-7abc-def0-123456789abc",
- "endpointId": "01912345-6789-7abc-def0-123456789abc",
- "eventType": "shipment.delivered",
- "status": "pending",
- "attemptCount": 1,
- "maxAttempts": 5,
- "lastResponseCode": 200,
- "lastResponseBody": "{\"status\": \"received\"}",
- "lastDurationMs": 150,
- "lastError": "Connection timeout",
- "nextRetryAt": "2024-06-15T14:35:00+00:00",
- "firstAttemptAt": "2024-06-15T14:30:00+00:00",
- "lastAttemptAt": "2024-06-15T14:30:00+00:00",
- "succeededAt": "2024-06-15T14:30:00+00:00",
- "createdAt": "2024-06-15T14:30:00+00:00",
- "updatedAt": "2024-06-15T14:30:00+00:00"
}
]
}Retrieve a single webhook delivery by its UUID. Returns full details including attempt history.
| id required | string <uuid> Example: 01912345-6789-7abc-def0-123456789abc Webhook delivery UUID |
{- "@context": "string",
- "@id": "string",
- "@type": "string",
- "id": "01912345-6789-7abc-def0-123456789abc",
- "endpointId": "01912345-6789-7abc-def0-123456789abc",
- "eventType": "shipment.delivered",
- "status": "pending",
- "attemptCount": 1,
- "maxAttempts": 5,
- "lastResponseCode": 200,
- "lastResponseBody": "{\"status\": \"received\"}",
- "lastDurationMs": 150,
- "lastError": "Connection timeout",
- "nextRetryAt": "2024-06-15T14:35:00+00:00",
- "firstAttemptAt": "2024-06-15T14:30:00+00:00",
- "lastAttemptAt": "2024-06-15T14:30:00+00:00",
- "succeededAt": "2024-06-15T14:30:00+00:00",
- "createdAt": "2024-06-15T14:30:00+00:00",
- "updatedAt": "2024-06-15T14:30:00+00:00"
}Manually retry a failed webhook delivery. The delivery will be queued for immediate retry.
| id required | string <uuid> Example: 01912345-6789-7abc-def0-123456789abc Webhook delivery UUID |
{- "@context": "string",
- "@id": "string",
- "@type": "string",
- "id": "01912345-6789-7abc-def0-123456789abc",
- "endpointId": "01912345-6789-7abc-def0-123456789abc",
- "eventType": "shipment.delivered",
- "status": "pending",
- "attemptCount": 1,
- "maxAttempts": 5,
- "lastResponseCode": 200,
- "lastResponseBody": "{\"status\": \"received\"}",
- "lastDurationMs": 150,
- "lastError": "Connection timeout",
- "nextRetryAt": "2024-06-15T14:35:00+00:00",
- "firstAttemptAt": "2024-06-15T14:30:00+00:00",
- "lastAttemptAt": "2024-06-15T14:30:00+00:00",
- "succeededAt": "2024-06-15T14:30:00+00:00",
- "createdAt": "2024-06-15T14:30:00+00:00",
- "updatedAt": "2024-06-15T14:30:00+00:00"
}Retrieve a paginated list of webhook endpoints with optional filters.
| status | string Enum: "active" "paused" "failed" "disabled" Example: status=active Filter by endpoint status |
| page | integer >= 1 Default: 1 Example: page=1 Page number for pagination |
| itemsPerPage | integer [ 1 .. 100 ] Default: 30 Example: itemsPerPage=30 Number of items per page |
{- "totalItems": 0,
- "search": {
- "@type": "string",
- "template": "string",
- "variableRepresentation": "string",
- "mapping": [
- {
- "@type": "string",
- "variable": "string",
- "property": "string",
- "required": true
}
]
}, - "view": {
- "@id": "string",
- "@type": "string",
- "first": "string",
- "last": "string",
- "previous": "string",
- "next": "string"
}, - "member": [
- {
- "@context": "string",
- "@id": "string",
- "@type": "string",
- "id": "01912345-6789-7abc-def0-123456789abc",
- "description": "Order management system notifications",
- "status": "active",
- "events": [
- "shipping.shipment.delivered",
- "shipping.shipment.cancelled"
], - "headers": {
- "X-Custom-Header": "value"
}, - "secret": "whsec_abc123...",
- "failureCount": 0,
- "lastSuccessAt": "2024-06-15T14:30:00+00:00",
- "lastFailureAt": "2024-06-15T14:30:00+00:00",
- "createdAt": "2024-01-15T10:00:00+00:00",
- "updatedAt": "2024-06-15T14:30:00+00:00"
}
]
}Create a new webhook endpoint subscription. The endpoint will be active immediately after creation.
Webhook endpoint configuration
| url required | string <uri> URL to receive webhook payloads |
| events required | Array of strings List of events to subscribe to. See GET /webhooks/events for the full catalog. |
| description | string or null <= 255 characters Human-readable description of the endpoint |
object or null Custom headers to include in webhook requests |
{- "events": [
- "shipping.shipment.delivered",
- "shipping.shipment.cancelled"
], - "description": "Order management system notifications",
- "headers": {
- "X-Custom-Header": "value"
}
}{- "@context": "string",
- "@id": "string",
- "@type": "string",
- "id": "01912345-6789-7abc-def0-123456789abc",
- "description": "Order management system notifications",
- "status": "active",
- "events": [
- "shipping.shipment.delivered",
- "shipping.shipment.cancelled"
], - "headers": {
- "X-Custom-Header": "value"
}, - "secret": "whsec_abc123...",
- "failureCount": 0,
- "lastSuccessAt": "2024-06-15T14:30:00+00:00",
- "lastFailureAt": "2024-06-15T14:30:00+00:00",
- "createdAt": "2024-01-15T10:00:00+00:00",
- "updatedAt": "2024-06-15T14:30:00+00:00"
}Retrieve a single webhook endpoint by its UUID. Returns full details including event subscriptions.
| id required | string <uuid> Example: 01912345-6789-7abc-def0-123456789abc Webhook endpoint UUID |
{- "@context": "string",
- "@id": "string",
- "@type": "string",
- "id": "01912345-6789-7abc-def0-123456789abc",
- "description": "Order management system notifications",
- "status": "active",
- "events": [
- "shipping.shipment.delivered",
- "shipping.shipment.cancelled"
], - "headers": {
- "X-Custom-Header": "value"
}, - "secret": "whsec_abc123...",
- "failureCount": 0,
- "lastSuccessAt": "2024-06-15T14:30:00+00:00",
- "lastFailureAt": "2024-06-15T14:30:00+00:00",
- "createdAt": "2024-01-15T10:00:00+00:00",
- "updatedAt": "2024-06-15T14:30:00+00:00"
}Update webhook endpoint configuration. Only provided fields will be updated.
| id required | string <uuid> Example: 01912345-6789-7abc-def0-123456789abc Webhook endpoint UUID |
Webhook endpoint update data
| url | string <uri> URL to receive webhook payloads |
| events | Array of strings List of events to subscribe to |
| description | string or null Human-readable description |
object or null Custom headers to include |
{- "events": [
- "string"
], - "description": "string",
- "headers": {
- "property1": "string",
- "property2": "string"
}
}{- "@context": "string",
- "@id": "string",
- "@type": "string",
- "id": "01912345-6789-7abc-def0-123456789abc",
- "description": "Order management system notifications",
- "status": "active",
- "events": [
- "shipping.shipment.delivered",
- "shipping.shipment.cancelled"
], - "headers": {
- "X-Custom-Header": "value"
}, - "secret": "whsec_abc123...",
- "failureCount": 0,
- "lastSuccessAt": "2024-06-15T14:30:00+00:00",
- "lastFailureAt": "2024-06-15T14:30:00+00:00",
- "createdAt": "2024-01-15T10:00:00+00:00",
- "updatedAt": "2024-06-15T14:30:00+00:00"
}Temporarily pause webhook delivery to this endpoint. Events will be queued and delivered when resumed.
| id required | string <uuid> Example: 01912345-6789-7abc-def0-123456789abc Webhook endpoint UUID |
{- "@context": "string",
- "@id": "string",
- "@type": "string",
- "id": "01912345-6789-7abc-def0-123456789abc",
- "description": "Order management system notifications",
- "status": "active",
- "events": [
- "shipping.shipment.delivered",
- "shipping.shipment.cancelled"
], - "headers": {
- "X-Custom-Header": "value"
}, - "secret": "whsec_abc123...",
- "failureCount": 0,
- "lastSuccessAt": "2024-06-15T14:30:00+00:00",
- "lastFailureAt": "2024-06-15T14:30:00+00:00",
- "createdAt": "2024-01-15T10:00:00+00:00",
- "updatedAt": "2024-06-15T14:30:00+00:00"
}Resume webhook delivery to a paused endpoint. Queued events will be delivered.
| id required | string <uuid> Example: 01912345-6789-7abc-def0-123456789abc Webhook endpoint UUID |
{- "@context": "string",
- "@id": "string",
- "@type": "string",
- "id": "01912345-6789-7abc-def0-123456789abc",
- "description": "Order management system notifications",
- "status": "active",
- "events": [
- "shipping.shipment.delivered",
- "shipping.shipment.cancelled"
], - "headers": {
- "X-Custom-Header": "value"
}, - "secret": "whsec_abc123...",
- "failureCount": 0,
- "lastSuccessAt": "2024-06-15T14:30:00+00:00",
- "lastFailureAt": "2024-06-15T14:30:00+00:00",
- "createdAt": "2024-01-15T10:00:00+00:00",
- "updatedAt": "2024-06-15T14:30:00+00:00"
}Generate a new signing secret for the webhook endpoint. The old secret becomes invalid immediately.
| id required | string <uuid> Example: 01912345-6789-7abc-def0-123456789abc Webhook endpoint UUID |
{- "@context": "string",
- "@id": "string",
- "@type": "string",
- "id": "01912345-6789-7abc-def0-123456789abc",
- "description": "Order management system notifications",
- "status": "active",
- "events": [
- "shipping.shipment.delivered",
- "shipping.shipment.cancelled"
], - "headers": {
- "X-Custom-Header": "value"
}, - "secret": "whsec_abc123...",
- "failureCount": 0,
- "lastSuccessAt": "2024-06-15T14:30:00+00:00",
- "lastFailureAt": "2024-06-15T14:30:00+00:00",
- "createdAt": "2024-01-15T10:00:00+00:00",
- "updatedAt": "2024-06-15T14:30:00+00:00"
}Send a test payload to the webhook endpoint to verify connectivity and configuration.
| id required | string <uuid> Example: 01912345-6789-7abc-def0-123456789abc Webhook endpoint UUID |
The new WebhookEndpoint resource
| eventType | string or null <= 255 characters |
{- "eventType": "string"
}{- "@context": "string",
- "@id": "string",
- "@type": "string",
- "success": true,
- "responseCode": 200,
- "responseTimeMs": 142,
- "responseBody": "{\"ok\":true}",
- "errorMessage": "HTTP 405"
}Returns every event a webhook endpoint may subscribe to, grouped by module and aggregate for tree-picker UIs.
{- "@context": "string",
- "@id": "string",
- "@type": "string",
- "groups": [
- {
- "module": "routing",
- "label": "Routing",
- "aggregates": [
- {
- "aggregate": "shipment",
- "label": "Shipment",
- "events": [
- {
- "value": "shipping.shipment.delivered",
- "label": "Delivered"
}
]
}
]
}
]
}The single generic inbound-webhook receiver. Every external platform (Shopify, WooCommerce, ShipBob, carriers, …) POSTs here, keyed by the Integration connection. The connection's providerKey + capabilities select the verifier and domain handler. PUBLIC — the sender carries no JWT; the HMAC signature IS the authentication.
Generic receiver for external platforms (Shopify, WooCommerce, ShipBob, carriers, …). Keyed by the Integration connection id; the HMAC signature is verified fail-closed.
| connectionId required | string Example: 01HQWXYZ1234567890ABCDEF Integration connection ULID |
{- "type": "/errors/validation-error",
- "title": "Validation Error",
- "status": 400,
- "detail": "The provided input is invalid",
- "violations": [
- {
- "propertyPath": "code",
- "message": "This value should not be blank."
}
], - "instance": "string"
}OAuth-connect entry point for the Integration module.
POST /api/integration/connections/oauth/init — start an OAuth flow; returns the authorization URL the browser must navigate to.
The matching GET /api/integration/connections/oauth/callback lives on a plain Symfony route (see OAuthConnectCallbackProvider) because an OAuth callback carries no path identifier.
List integration connections
| page | integer Default: 1 The collection page number |
{- "totalItems": 0,
- "search": {
- "@type": "string",
- "template": "string",
- "variableRepresentation": "string",
- "mapping": [
- {
- "@type": "string",
- "variable": "string",
- "property": "string",
- "required": true
}
]
}, - "view": {
- "@id": "string",
- "@type": "string",
- "first": "string",
- "last": "string",
- "previous": "string",
- "next": "string"
}, - "member": [
- {
- "@context": "string",
- "@id": "string",
- "@type": "string",
- "id": "",
- "reference": "glacia:///integration/connections/01HZY...",
- "providerKey": "",
- "status": "",
- "grantedCapabilities": [
- "string"
], - "createdAt": ""
}
]
}Connect an external service
The new IntegrationConnection resource
| providerKey required | string Default: "" |
object |
{- "providerKey": "",
- "secrets": {
- "property1": "string",
- "property2": "string"
}
}{- "@context": "string",
- "@id": "string",
- "@type": "string",
- "id": "",
- "reference": "glacia:///integration/connections/01HZY...",
- "providerKey": "",
- "status": "",
- "grantedCapabilities": [
- "string"
], - "createdAt": ""
}Returns the authorization URL the browser must navigate to. The signed state is embedded in the URL.
The new IntegrationOAuthConnect resource
| providerKey | string Default: "" |
{- "providerKey": ""
}{- "@context": "string",
- "@id": "string",
- "@type": "string",
- "id": "oauth-connect",
- "authorizationUrl": ""
}Get a connection by id
| id required | string IntegrationConnection identifier |
{- "@context": "string",
- "@id": "string",
- "@type": "string",
- "id": "",
- "reference": "glacia:///integration/connections/01HZY...",
- "providerKey": "",
- "status": "",
- "grantedCapabilities": [
- "string"
], - "createdAt": ""
}Grant a capability on a connection
| id required | string IntegrationConnection identifier |
The new IntegrationConnection resource
| capabilityKey required | string Default: "" |
{- "capabilityKey": ""
}{- "@context": "string",
- "@id": "string",
- "@type": "string",
- "id": "",
- "reference": "glacia:///integration/connections/01HZY...",
- "providerKey": "",
- "status": "",
- "grantedCapabilities": [
- "string"
], - "createdAt": ""
}Purge a connection and wipe its secrets
| id required | string IntegrationConnection identifier |
{- "@context": "string",
- "@id": "string",
- "@type": "string",
- "id": "",
- "reference": "glacia:///integration/connections/01HZY...",
- "providerKey": "",
- "status": "",
- "grantedCapabilities": [
- "string"
], - "createdAt": ""
}Revoke a capability on a connection
| id required | string IntegrationConnection identifier |
The new IntegrationConnection resource
| capabilityKey required | string Default: "" |
{- "capabilityKey": ""
}{- "@context": "string",
- "@id": "string",
- "@type": "string",
- "id": "",
- "reference": "glacia:///integration/connections/01HZY...",
- "providerKey": "",
- "status": "",
- "grantedCapabilities": [
- "string"
], - "createdAt": ""
}A connectable external-service provider descriptor.
Drives the connect-form picker: clients read this catalog to learn which
providers exist, which surface capabilities each declares, whether the connect
flow is an OAuth redirect (oauth: true) or a credential form, and — for
credential-form providers — the fields to render.
Returns the provider catalog that drives the connect-form picker. Filter with ?capability=channel|carrier|custodian|storage.
{- "totalItems": 0,
- "search": {
- "@type": "string",
- "template": "string",
- "variableRepresentation": "string",
- "mapping": [
- {
- "@type": "string",
- "variable": "string",
- "property": "string",
- "required": true
}
]
}, - "member": [
- {
- "@context": "string",
- "@id": "string",
- "@type": "string",
- "providerType": "sendcloud",
- "label": "SendCloud",
- "capabilities": [
- "carrier"
], - "credentialFields": [
- {
- "key": "secret_key",
- "label": "API secret key",
- "type": "text",
- "secret": true,
- "required": true,
- "help": "string"
}
], - "oauth": false
}
]
}