Skip to main content
Complete reference for all response shapes returned by the Partner API.

Booking Response

Returned by: POST /partners/bookings, GET /partners/bookings/:id/status, PATCH /partners/bookings/:id, PATCH /partners/bookings/:id/cancel, POST /partners/bookings/:id/confirm-payment
{
  "bookingId": "11111111-0000-0000-0000-000000000001",
  "externalReference": "ORDER-20260615-001",
  "appointmentId": "22222222-0000-0000-0000-000000000002",
  "status": "in progress",
  "paymentStatus": "NOT_REQUIRED",
  "trackingReference": "SA-0042",
  "date": "2026-06-20T00:00:00.000Z",
  "timeslot": {
    "startAt": "09:00",
    "endAt": "12:00",
    "endsAtNextDay": false
  },
  "appointment": {
    "id": "22222222-0000-0000-0000-000000000002",
    "name": "SA-0042",
    "status": "Scheduled",
    "scheduledStartDateTime": "2026-06-20T09:00:00+03:00",
    "scheduledEndDateTime": "2026-06-20T12:00:00+03:00"
  }
}
FieldTypeNullableDescription
bookingIdUUIDNoCleanLife booking identifier
externalReferencestringYesYour external reference, or null if not provided
appointmentIdUUIDYesService appointment ID; null if not yet assigned
statusstringNoBooking status (see Enums)
paymentStatusstringNoPayment status (see Enums)
trackingReferencestringNoHuman-readable reference for customer communication. Falls back to bookingId if no appointment is assigned.
datestringNoService date
timeslot.startAtstringNoAppointment start time
timeslot.endAtstringNoAppointment end time
timeslot.endsAtNextDaybooleanNotrue if the appointment spans midnight
appointmentobjectYesService appointment details; null if not assigned
appointment.idUUIDAppointment ID
appointment.namestringAppointment name (tracking reference)
appointment.statusstringAppointment status (see Enums)
appointment.scheduledStartDateTimestringISO 8601 scheduled start datetime
appointment.scheduledEndDateTimestringISO 8601 scheduled end datetime

Paginated Booking List Response

Returned by: GET /partners/bookings
{
  "success": true,
  "data": [ /* array of Booking Response objects */ ],
  "meta": {
    "page": 1,
    "limit": 20,
    "total": 45,
    "totalPages": 3
  }
}

Webhook Subscription Response

Returned by: POST /partners/webhooks/subscriptions (includes secret)
{
  "id": "gggggggg-0000-0000-0000-000000000001",
  "partnerClientId": "hhhhhhhh-0000-0000-0000-000000000001",
  "url": "https://yourplatform.com/webhooks/cleanlife",
  "events": ["booking.created", "booking.cancelled"],
  "secret": "a1b2c3d4...(64 hex chars)...",
  "status": "ACTIVE",
  "createdAt": "2026-06-15T10:00:00+03:00",
  "updatedAt": "2026-06-15T10:00:00+03:00"
}
secret is only included in the response to POST /partners/webhooks/subscriptions and POST /partners/webhooks/subscriptions/:id/rotate-secret. All other responses omit this field.
FieldTypeDescription
idUUIDSubscription identifier
partnerClientIdUUIDYour partner account ID
urlstringThe webhook endpoint URL
eventsstring[]Subscribed event types
secretstring64-char hex HMAC-SHA256 signing secret (creation/rotation only)
statusstringACTIVE or INACTIVE
createdAtdatetimeCreation timestamp
updatedAtdatetimeLast update timestamp

Webhook Subscription List Item Response

Returned by: GET /partners/webhooks/subscriptions and PATCH /partners/webhooks/subscriptions/:id Same as above but without the secret field.

Rotate Secret Response

Returned by: POST /partners/webhooks/subscriptions/:id/rotate-secret
{
  "id": "gggggggg-0000-0000-0000-000000000001",
  "secret": "9f8e7d6c...(64 hex chars)..."
}

Delete Subscription Response

Returned by: DELETE /partners/webhooks/subscriptions/:id
{
  "id": "gggggggg-0000-0000-0000-000000000001",
  "removed": true
}

Webhook Delivery Response

Returned by: GET /partners/webhooks/deliveries
{
  "id": "iiiiiiii-0000-0000-0000-000000000001",
  "subscriptionId": "gggggggg-0000-0000-0000-000000000001",
  "event": "booking.created",
  "status": "DELIVERED",
  "attemptCount": 1,
  "statusCode": 200,
  "error": null,
  "nextRetryAt": null,
  "deliveredAt": "2026-06-15T10:01:05+03:00",
  "createdAt": "2026-06-15T10:00:00+03:00"
}
FieldTypeNullableDescription
idUUIDNoDelivery record identifier
subscriptionIdUUIDNoAssociated subscription
eventstringNoEvent type
statusstringNoPENDING, DELIVERED, or FAILED
attemptCountintegerNoTotal number of dispatch attempts
statusCodeintegerYesHTTP status from your endpoint on last attempt
errorstringYesError message from last failed attempt
nextRetryAtdatetimeYesNext scheduled retry time (null if delivered or failed)
deliveredAtdatetimeYesSuccessful delivery timestamp (null if not delivered)
createdAtdatetimeNoRecord creation timestamp

Retry Delivery Response

Returned by: POST /partners/webhooks/deliveries/:id/retry
{
  "id": "iiiiiiii-0000-0000-0000-000000000001",
  "status": "PENDING"
}

Pricing Tier Response

Returned by: GET /partners/pricing/tiers
[
  {
    "id": "eeeeeeee-0000-0000-0000-000000000001",
    "minMinutes": 120,
    "maxMinutes": 179,
    "factor": 1.0,
    "sorting": 1
  }
]
FieldTypeNullableDescription
idUUIDNoTier identifier
minMinutesintegerNoMinimum duration (inclusive)
maxMinutesintegerYesMaximum duration (inclusive); null = no upper bound
factorfloatNoPrice multiplier
sortingintegerNoDisplay order

Success Envelope

All single-resource responses are wrapped in:
{
  "success": true,
  "data": { /* resource object */ }
}

Paginated Envelope

All list responses are wrapped in:
{
  "success": true,
  "data": [ /* array of resource objects */ ],
  "meta": {
    "page": 1,
    "limit": 20,
    "total": 100,
    "totalPages": 5
  }
}

Error Envelope

{
  "success": false,
  "error": {
    "code": "ERROR_CODE",
    "message": "Human-readable description",
    "details": { /* optional, for validation errors */ },
    "requestId": "uuid"
  }
}