Booking, payment and admin API for a photographer's booking site in Kigali.
The API behind the Bookly booking site. It serves three kinds of caller:
Authorization: Bearer JWT from
POST /api/admin/auth/login.Read the API conventions first: error shapes, the 400-versus-422 rule, time zones and money are the same on every operation.
This file is written by hand. A backend test (src/openapi.test.ts) fails
when a route exists without an operation here, or the other way round, and
validates real responses against these schemas.
Active services, each with their active packages and the add-ons they offer. Anonymous.
required | Array of objects (PublicService) |
{- "services": [
- {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "slug": "portraits",
- "nameEn": "string",
- "descriptionEn": "string",
- "packages": [
- {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "nameEn": "string",
- "descriptionEn": "string",
- "priceRwf": 0,
- "photoCount": 0,
- "durationMinutes": 1
}
], - "addons": [
- {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "nameEn": "string",
- "priceRwf": 0
}
]
}
]
}| slug required | string |
required | object (PublicServiceDetail) A service plus the booking-fee rate that applies to it, so a page can show a live quote. |
{- "service": {
- "bookingFeeRate": 0,
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "slug": "string",
- "nameEn": "string",
- "descriptionEn": "string",
- "packages": [
- {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "nameEn": "string",
- "descriptionEn": "string",
- "priceRwf": 0,
- "photoCount": 0,
- "durationMinutes": 1
}
], - "addons": [
- {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "nameEn": "string",
- "priceRwf": 0
}
]
}
}The API's authority over money. The price is always computed from the catalogue, never from the body.
| packageId required | string <uuid> (Uuid) |
| addonIds | Array of strings <uuid> (Uuid) <= 50 items unique [ items <uuid > ] Default: [] |
required | object (Quote) The API's price for a basket. Only the booking fee is rounded (half-up, to a whole franc); the session fee is the remainder, so the two always add up to the total. |
{- "packageId": "471cc1d4-ec27-4504-b7c2-949af95662bc",
- "addonIds": [ ]
}{- "quote": {
- "totalRwf": 0,
- "bookingFeeRwf": 0,
- "sessionFeeRwf": 0,
- "bookingFeeRate": 0,
- "service": {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "slug": "string",
- "nameEn": "string"
}, - "package": {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "nameEn": "string",
- "priceRwf": 0
}, - "addons": [
- {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "nameEn": "string",
- "priceRwf": 0
}
]
}
}Every Kigali date of the month with the slot starts a visitor may book for this package right now. Cache-Control: no-store. Anonymous.
| packageId required | string <uuid> (Uuid) |
| month required | string^\d{4}-(0[1-9]|1[0-2])$
|
required | Array of objects Every Kigali date of the month, in order, each with the starts still bookable for this package right now. |
{- "days": [
- {
- "date": "2019-08-24",
- "starts": [
- "2019-08-24T14:15:22Z"
]
}
]
}Turns a chosen slot and a filled form into a pending_payment booking
holding its slot for the hold window. Anonymous. The returned
checkoutToken opens the booking's checkout.
| packageId required | string <uuid> (Uuid) |
| addonIds | Array of strings <uuid> (Uuid) <= 50 items unique [ items <uuid > ] Default: [] |
| startsAt required | string <date-time> (OffsetInstant) Must be one of the |
| fullName required | string [ 1 .. 200 ] characters |
| email required | string <= 320 characters Stored lowercased. A mistyped address is a 422, not a 400. |
| phone required | string <= 40 characters |
| location required | string [ 1 .. 500 ] characters |
| partySize | integer or null [ 1 .. 1000 ] Default: null |
| specialRequests | string or null <= 2000 characters Default: null |
| consent required | boolean Must be |
required | object |
{- "packageId": "471cc1d4-ec27-4504-b7c2-949af95662bc",
- "addonIds": [ ],
- "startsAt": "2019-08-24T14:15:22Z",
- "fullName": "string",
- "email": "string",
- "phone": "+250788123456",
- "location": "string",
- "partySize": null,
- "specialRequests": null,
- "consent": true
}{- "booking": {
- "reference": "BKY-2610-7MAR5",
- "status": "pending_payment",
- "startsAt": "2019-08-24T14:15:22Z",
- "endsAt": "2019-08-24T14:15:22Z",
- "holdExpiresAt": "2019-08-24T14:15:22Z",
- "serviceName": "string",
- "packageName": "string",
- "packagePriceRwf": 0,
- "addons": [
- {
- "name": "string",
- "priceRwf": 0
}
], - "totalRwf": 0,
- "bookingFeeRate": 0,
- "bookingFeeRwf": 0,
- "sessionFeeRwf": 0,
- "checkoutToken": "string"
}
}The active provider and the methods its pay page may offer. Cache-Control: no-store. Anonymous.
| provider required | string |
| methods required | Array of strings (PaymentMethod) Items Enum: "momo_mtn" "momo_airtel" "card" |
{- "provider": "mtn_momo_direct",
- "methods": [
- "momo_mtn"
]
}What the pay page shows. Addressed by the booking reference and its checkout token; a wrong token is a 404, as an unknown reference is. Cache-Control: no-store.
| reference required | string (BookingReference) ^BKY-\d{4}-[0-9A-HJKMNP-TV-Z]{5}$ Examples: BKY-2610-7MAR5 The booking's quotable reference: |
| token required | string^[A-Za-z0-9_-]{43}$ The checkout token returned when the booking was created: an HMAC of the reference, 43 base64url characters. Good only for paying the booking fee while the hold lasts. |
required | object |
{- "checkout": {
- "reference": "BKY-2610-7MAR5",
- "serviceName": "string",
- "packageName": "string",
- "startsAt": "2019-08-24T14:15:22Z",
- "endsAt": "2019-08-24T14:15:22Z",
- "holdExpiresAt": "2019-08-24T14:15:22Z",
- "bookingFeeRwf": 0,
- "state": "payable",
- "waitingPayment": { }
}
}Starts a booking-fee payment; the payer's phone is prompted. Cache-Control: no-store.
| reference required | string (BookingReference) ^BKY-\d{4}-[0-9A-HJKMNP-TV-Z]{5}$ Examples: BKY-2610-7MAR5 The booking's quotable reference: |
| token required | string^[A-Za-z0-9_-]{43}$ The checkout token returned when the booking was created: an HMAC of the reference, 43 base64url characters. Good only for paying the booking fee while the hold lasts. |
| method required | string Enum: "momo_mtn" "momo_airtel" "card" One of the active provider's methods ( |
| phone required | string <= 40 characters The number to prompt. Rwandan numbers may be local ( |
required | object |
{- "method": "momo_mtn",
- "phone": "+250788123456"
}{- "payment": {
- "ourRef": "4ba2ec28-e70d-44d3-8779-1ac23f41ec59",
- "status": "pending"
}
}The confirmation page polls this while a Mobile Money payment settles —
often 30 seconds or more. Addressed by the random our_ref the pay page
was handed; shows no contact details. Cache-Control: no-store.
| ourRef required | string <uuid> (Uuid) Our id for one payment attempt, returned when it was started. |
required | object |
required | object |
{- "payment": {
- "status": "initiated",
- "amountRwf": 0,
- "failure": "declined"
}, - "booking": {
- "reference": "BKY-2610-7MAR5",
- "status": "pending_payment",
- "serviceName": "string",
- "packageName": "string",
- "startsAt": "2019-08-24T14:15:22Z",
- "endsAt": "2019-08-24T14:15:22Z"
}
}The booking the token addresses, and records the token's use. Any token that does not resolve is a 404.
| token required | string^[A-Za-z0-9_-]{16,256}$ The booking's access token, from its confirmation email or a resend: 256 random bits, base64url. It is the client's whole identity, so treat the URL as a secret. Unknown, expired (365 days) and superseded tokens are all a 404. |
required | object (ClientBooking) A booking as its own client sees it. Neither the booking's id nor the
token that reached it appears anywhere in it, and the contact email is
masked ( |
{- "booking": {
- "reference": "BKY-2610-7MAR5",
- "status": "pending_payment",
- "stage": "awaiting_payment",
- "clientName": "string",
- "maskedEmail": "a•••••@example.com",
- "pendingMaskedEmail": "string",
- "startsAt": "2019-08-24T14:15:22Z",
- "endsAt": "2019-08-24T14:15:22Z",
- "serviceName": "string",
- "packageName": "string",
- "packagePriceRwf": 0,
- "packagePhotoCount": 0,
- "packageDurationMinutes": 0,
- "locationText": "string",
- "partySize": 0,
- "specialRequests": "string",
- "addons": [
- {
- "name": "string",
- "priceRwf": 0,
- "stage": "at_booking"
}
], - "totals": {
- "quotedTotalRwf": 0,
- "grandTotalRwf": 0,
- "collectedRwf": 0,
- "refundDueRwf": 0,
- "outstandingRwf": 0
}, - "bookingFeeRwf": 0,
- "payments": [
- {
- "kind": "booking_fee",
- "status": "succeeded",
- "amountRwf": 0,
- "settledAt": "2019-08-24T14:15:22Z"
}
], - "canCancel": true,
- "cancellationReason": "string",
- "cancelledAt": "2019-08-24T14:15:22Z",
- "sessionFee": { },
- "delivery": { },
- "notices": [
- {
- "id": "string",
- "at": "2019-08-24T14:15:22Z",
- "kind": "reschedule",
- "data": { }
}
]
}
}Cancellable up to the shoot, and only on a confirmed booking. The booking fee is not refunded (it is non-refundable on a client cancellation).
| token required | string^[A-Za-z0-9_-]{16,256}$ The booking's access token, from its confirmation email or a resend: 256 random bits, base64url. It is the client's whole identity, so treat the URL as a secret. Unknown, expired (365 days) and superseded tokens are all a 404. |
required | object (ClientBooking) A booking as its own client sees it. Neither the booking's id nor the
token that reached it appears anywhere in it, and the contact email is
masked ( |
{- "booking": {
- "reference": "BKY-2610-7MAR5",
- "status": "pending_payment",
- "stage": "awaiting_payment",
- "clientName": "string",
- "maskedEmail": "a•••••@example.com",
- "pendingMaskedEmail": "string",
- "startsAt": "2019-08-24T14:15:22Z",
- "endsAt": "2019-08-24T14:15:22Z",
- "serviceName": "string",
- "packageName": "string",
- "packagePriceRwf": 0,
- "packagePhotoCount": 0,
- "packageDurationMinutes": 0,
- "locationText": "string",
- "partySize": 0,
- "specialRequests": "string",
- "addons": [
- {
- "name": "string",
- "priceRwf": 0,
- "stage": "at_booking"
}
], - "totals": {
- "quotedTotalRwf": 0,
- "grandTotalRwf": 0,
- "collectedRwf": 0,
- "refundDueRwf": 0,
- "outstandingRwf": 0
}, - "bookingFeeRwf": 0,
- "payments": [
- {
- "kind": "booking_fee",
- "status": "succeeded",
- "amountRwf": 0,
- "settledAt": "2019-08-24T14:15:22Z"
}
], - "canCancel": true,
- "cancellationReason": "string",
- "cancelledAt": "2019-08-24T14:15:22Z",
- "sessionFee": { },
- "delivery": { },
- "notices": [
- {
- "id": "string",
- "at": "2019-08-24T14:15:22Z",
- "kind": "reschedule",
- "data": { }
}
]
}
}Stores the new address as pending and emails a confirmation link to it; nothing changes until that link is followed, so a link-holder who is not the client cannot redirect the booking's email without also owning the new inbox. At most three requests a day per booking.
| token required | string^[A-Za-z0-9_-]{16,256}$ The booking's access token, from its confirmation email or a resend: 256 random bits, base64url. It is the client's whole identity, so treat the URL as a secret. Unknown, expired (365 days) and superseded tokens are all a 404. |
| email required | string <= 254 characters A mistyped address is a 422. |
required | object (ClientBooking) A booking as its own client sees it. Neither the booking's id nor the
token that reached it appears anywhere in it, and the contact email is
masked ( |
{- "email": "string"
}{- "booking": {
- "reference": "BKY-2610-7MAR5",
- "status": "pending_payment",
- "stage": "awaiting_payment",
- "clientName": "string",
- "maskedEmail": "a•••••@example.com",
- "pendingMaskedEmail": "string",
- "startsAt": "2019-08-24T14:15:22Z",
- "endsAt": "2019-08-24T14:15:22Z",
- "serviceName": "string",
- "packageName": "string",
- "packagePriceRwf": 0,
- "packagePhotoCount": 0,
- "packageDurationMinutes": 0,
- "locationText": "string",
- "partySize": 0,
- "specialRequests": "string",
- "addons": [
- {
- "name": "string",
- "priceRwf": 0,
- "stage": "at_booking"
}
], - "totals": {
- "quotedTotalRwf": 0,
- "grandTotalRwf": 0,
- "collectedRwf": 0,
- "refundDueRwf": 0,
- "outstandingRwf": 0
}, - "bookingFeeRwf": 0,
- "payments": [
- {
- "kind": "booking_fee",
- "status": "succeeded",
- "amountRwf": 0,
- "settledAt": "2019-08-24T14:15:22Z"
}
], - "canCancel": true,
- "cancellationReason": "string",
- "cancelledAt": "2019-08-24T14:15:22Z",
- "sessionFee": { },
- "delivery": { },
- "notices": [
- {
- "id": "string",
- "at": "2019-08-24T14:15:22Z",
- "kind": "reschedule",
- "data": { }
}
]
}
}Starts a session-fee payment for what the booking owes. Only mounted when a payment provider is configured. The amount is computed server-side from the booking, never sent by the client.
| token required | string^[A-Za-z0-9_-]{16,256}$ The booking's access token, from its confirmation email or a resend: 256 random bits, base64url. It is the client's whole identity, so treat the URL as a secret. Unknown, expired (365 days) and superseded tokens are all a 404. |
| method required | string Enum: "momo_mtn" "momo_airtel" "card" One of the active provider's methods ( |
| phone required | string <= 40 characters The number to prompt. Rwandan numbers may be local ( |
required | object |
{- "method": "momo_mtn",
- "phone": "+250788123456"
}{- "payment": {
- "ourRef": "4ba2ec28-e70d-44d3-8779-1ac23f41ec59",
- "status": "pending"
}
}Sends one email with a fresh link for every current booking on the
address. The response is always 202 — a match, no match, or too many
requests are indistinguishable, so the endpoint cannot be used to learn
who has booked. Rate-limited per address and per IP.
| email required | string <= 254 characters A mistyped address is a 422. |
{- "email": "string"
}{- "sent": true
}Follows the link sent to the new address when a client asked to change their booking's email. A POST, not a GET, so a mail scanner opening the link cannot trigger the change. Unknown, expired, replaced and already-used tokens are all a 404.
| token required | string^[A-Za-z0-9_-]{16,256}$ The booking's access token, from its confirmation email or a resend: 256 random bits, base64url. It is the client's whole identity, so treat the URL as a secret. Unknown, expired (365 days) and superseded tokens are all a 404. |
| confirmed required | any Value: true |
{- "confirmed": true
}Email and password for the one admin account. Returns a bearer JWT valid
8 hours. Unknown email, wrong password and a locked account are one
answer — 401 invalid_credentials — so none is disclosed; repeated
failures lock the account and email the photographer. Cache-Control: no-store.
| email required | string [ 1 .. 320 ] characters |
| password required | string [ 1 .. 1024 ] characters |
required | object (PublicAdmin) The only shape of the admin that leaves the API. No hash, reset or lockout state. |
| token required | string Send as |
| tokenType required | any Value: "Bearer" |
| expiresAt required | string <date-time> (Instant) An ISO-8601 instant, always UTC in responses ( |
{- "email": "string",
- "password": "string"
}{- "admin": {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "email": "user@example.com",
- "lastLoginAt": "2019-08-24T14:15:22Z"
}, - "token": "string",
- "tokenType": "Bearer",
- "expiresAt": "2019-08-24T14:15:22Z"
}If the address is the admin's, a single-use, time-limited reset link is
emailed. The answer is always 202, whether or not it is, so the endpoint
does not reveal the admin's address.
| email required | string [ 1 .. 320 ] characters |
{- "email": "string"
}{- "ok": true
}Consumes the emailed token and sets the new password, which revokes every token already issued. The token works once.
| token required | string [ 1 .. 512 ] characters |
| newPassword required | string [ 12 .. 1024 ] characters |
{- "token": "string",
- "newPassword": "stringstring"
}{- "error": "invalid_request"
}required | object (PublicAdmin) The only shape of the admin that leaves the API. No hash, reset or lockout state. |
{- "admin": {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "email": "user@example.com",
- "lastLoginAt": "2019-08-24T14:15:22Z"
}
}required | Array of objects (WorkingHours) |
{- "workingHours": [
- {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "weekday": 0,
- "effectiveDate": "2019-08-24",
- "opensMinute": 0,
- "closesMinute": 0,
- "isOpen": true,
- "note": "string"
}
]
}| weekday required | integer [ 0 .. 6 ] |
| opensMinute | integer or null [ 0 .. 1440 ] Default: null |
| closesMinute | integer or null [ 0 .. 1440 ] Default: null |
| isOpen | boolean Default: true |
| note | string or null <= 500 characters Default: null |
required | object (WorkingHours) A weekly rule ( |
{- "weekday": 0,
- "opensMinute": null,
- "closesMinute": null,
- "isOpen": true,
- "note": null
}{- "workingHours": {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "weekday": 0,
- "effectiveDate": "2019-08-24",
- "opensMinute": 0,
- "closesMinute": 0,
- "isOpen": true,
- "note": "string"
}
}Replaces the whole row, so a rule can move between a weekday and a date.
| id required | string <uuid> (Uuid) |
| weekday required | integer [ 0 .. 6 ] |
| opensMinute | integer or null [ 0 .. 1440 ] Default: null |
| closesMinute | integer or null [ 0 .. 1440 ] Default: null |
| isOpen | boolean Default: true |
| note | string or null <= 500 characters Default: null |
required | object (WorkingHours) A weekly rule ( |
{- "weekday": 0,
- "opensMinute": null,
- "closesMinute": null,
- "isOpen": true,
- "note": null
}{- "workingHours": {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "weekday": 0,
- "effectiveDate": "2019-08-24",
- "opensMinute": 0,
- "closesMinute": 0,
- "isOpen": true,
- "note": "string"
}
}required | Array of objects (Block) |
{- "blocks": [
- {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "startsAt": "2019-08-24T14:15:22Z",
- "endsAt": "2019-08-24T14:15:22Z",
- "isAllDay": true,
- "reason": "string"
}
]
}| isAllDay required | any Value: true |
| startDate required | string <date> (KigaliDate) A calendar date in Africa/Kigali (UTC+2, no DST), |
| endDate required | string <date> (KigaliDate) Inclusive; not before |
| reason | string or null <= 500 characters Default: null |
| confirm | boolean Default: false |
required | object (Block) |
{- "isAllDay": true,
- "startDate": "2019-08-24",
- "endDate": "2019-08-24",
- "reason": null,
- "confirm": false
}{- "block": {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "startsAt": "2019-08-24T14:15:22Z",
- "endsAt": "2019-08-24T14:15:22Z",
- "isAllDay": true,
- "reason": "string"
}
}| id required | string <uuid> (Uuid) |
| isAllDay required | any Value: true |
| startDate required | string <date> (KigaliDate) A calendar date in Africa/Kigali (UTC+2, no DST), |
| endDate required | string <date> (KigaliDate) Inclusive; not before |
| reason | string or null <= 500 characters Default: null |
| confirm | boolean Default: false |
required | object (Block) |
{- "isAllDay": true,
- "startDate": "2019-08-24",
- "endDate": "2019-08-24",
- "reason": null,
- "confirm": false
}{- "block": {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "startsAt": "2019-08-24T14:15:22Z",
- "endsAt": "2019-08-24T14:15:22Z",
- "isAllDay": true,
- "reason": "string"
}
}Any subset of the five. Each is range-checked here, so a value out of range is a 422 rather than a database error.
| bookingFeeRate | number [ 0 .. 1 ] |
| minLeadTimeMinutes | integer [ 0 .. 2147483647 ] |
| holdMinutes | integer [ 1 .. 2147483647 ] |
| bufferMinutes | integer [ 0 .. 2147483647 ] |
| deliveryExpiryDays | integer [ 1 .. 2147483647 ] |
required | object (Settings) |
{- "bookingFeeRate": 0,
- "minLeadTimeMinutes": 0,
- "holdMinutes": 1,
- "bufferMinutes": 0,
- "deliveryExpiryDays": 1
}{- "settings": {
- "bookingFeeRate": 0,
- "minLeadTimeMinutes": 0,
- "holdMinutes": 1,
- "bufferMinutes": 0,
- "deliveryExpiryDays": 1
}
}| from required | string <date> (KigaliDate) A calendar date in Africa/Kigali (UTC+2, no DST), |
| to required | string <date> (KigaliDate) Inclusive. At most 62 days after |
required | Array of objects What occupies time. |
required | Array of objects |
{- "bookings": [
- {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "reference": "BKY-2610-7MAR5",
- "status": "pending_payment",
- "startsAt": "2019-08-24T14:15:22Z",
- "endsAt": "2019-08-24T14:15:22Z",
- "contactName": "string",
- "serviceName": "string",
- "packageName": "string",
- "conflictsWithBlock": true
}
], - "blocks": [
- {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "startsAt": "2019-08-24T14:15:22Z",
- "endsAt": "2019-08-24T14:15:22Z",
- "isAllDay": true,
- "reason": "string"
}
]
}Filtered by stage, status and shoot date, searched by reference, name, email or phone, and paged by number with a total.
BookingStage (string) or Array of BookingStage (strings) Repeatable. Display stages (see | |
BookingStatus (string) or Array of BookingStatus (strings) Repeatable. Kept for links made before stages existed. | |
| from | string <date> (KigaliDate) A calendar date in Africa/Kigali (UTC+2, no DST), |
| to | string <date> (KigaliDate) A calendar date in Africa/Kigali (UTC+2, no DST), |
| search | string <= 200 characters |
| page | integer >= 1 1-based. Past the end, the last page is answered. |
| pageSize | integer [ 1 .. 100 ] Default: 25 |
required | Array of objects (BookingListRow) Newest shoot first (start, then id, descending). |
| total required | integer >= 0 Every booking the filter matches, across all pages. |
| page required | integer >= 1 The page answered; a page past the end answers the last one. |
| pageSize required | integer [ 1 .. 100 ] |
| pageCount required | integer >= 1 |
{- "bookings": [
- {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "reference": "BKY-2610-7MAR5",
- "status": "pending_payment",
- "stage": "awaiting_payment",
- "startsAt": "2019-08-24T14:15:22Z",
- "endsAt": "2019-08-24T14:15:22Z",
- "contactName": "string",
- "contactEmail": "string",
- "contactPhone": "string",
- "serviceName": "string",
- "packageName": "string",
- "grandTotalRwf": 0,
- "collectedRwf": 0,
- "outstandingRwf": 0,
- "refundDueRwf": 0,
- "hasRefundDue": true
}
], - "total": 0,
- "page": 1,
- "pageSize": 1,
- "pageCount": 1
}| id required | string <uuid> (Uuid) |
required | object (AdminBooking) |
{- "booking": {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "reference": "BKY-2610-7MAR5",
- "status": "pending_payment",
- "stage": "awaiting_payment",
- "locale": "string",
- "client": {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "fullName": "string",
- "email": "string",
- "phone": "string",
- "anonymized": true
}, - "contact": {
- "name": "string",
- "email": "string",
- "phone": "string"
}, - "service": {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "name": "string"
}, - "package": {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "name": "string",
- "priceRwf": 0,
- "durationMinutes": 0,
- "photoCount": 0
}, - "schedule": {
- "startsAt": "2019-08-24T14:15:22Z",
- "endsAt": "2019-08-24T14:15:22Z",
- "bufferEndsAt": "2019-08-24T14:15:22Z",
- "holdExpiresAt": "2019-08-24T14:15:22Z",
- "originalStartsAt": "2019-08-24T14:15:22Z",
- "rescheduledAt": "2019-08-24T14:15:22Z"
}, - "details": {
- "locationText": "string",
- "partySize": 0,
- "specialRequests": "string",
- "consentAt": "2019-08-24T14:15:22Z"
}, - "addons": [
- {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "name": "string",
- "unitPriceRwf": 0,
- "quantity": 1,
- "amountRwf": 0,
- "stage": "at_booking",
- "canRemove": true
}
], - "money": {
- "bookingFeeRate": 0,
- "bookingFeeRwf": 0,
- "totals": {
- "quotedTotalRwf": 0,
- "grandTotalRwf": 0,
- "collectedRwf": 0,
- "refundDueRwf": 0,
- "outstandingRwf": 0
}
}, - "payments": [
- {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "kind": "booking_fee",
- "provider": "mtn_momo_direct",
- "ourRef": "4ba2ec28-e70d-44d3-8779-1ac23f41ec59",
- "providerRef": "string",
- "method": "string",
- "amountRwf": 0,
- "status": "initiated",
- "failureReason": "string",
- "initiatedAt": "2019-08-24T14:15:22Z",
- "settledAt": "2019-08-24T14:15:22Z",
- "refundedAt": "2019-08-24T14:15:22Z",
- "refundReference": "string",
- "note": "string",
- "canRecordRefund": true
}
], - "lifecycle": {
- "confirmedAt": "2019-08-24T14:15:22Z",
- "completedAt": "2019-08-24T14:15:22Z",
- "cancelledAt": "2019-08-24T14:15:22Z",
- "cancellationReason": "string"
}, - "access": {
- "hasLink": true,
- "expiresAt": "2019-08-24T14:15:22Z",
- "lastUsedAt": "2019-08-24T14:15:22Z"
}, - "delivery": {
- "expiresOn": "2019-08-24",
- "sentAt": "2019-08-24T14:15:22Z",
- "note": "string"
}, - "messages": [
- {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "kind": "string",
- "template": "string",
- "recipient": "string",
- "status": "string",
- "attempts": 0,
- "lastError": "string",
- "createdAt": "2019-08-24T14:15:22Z",
- "completedAt": "2019-08-24T14:15:22Z"
}
], - "notes": [
- {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "body": "string",
- "emailed": true,
- "createdAt": "2019-08-24T14:15:22Z"
}
], - "actions": {
- "canReschedule": true,
- "canCancel": true,
- "canComplete": true,
- "canMarkNoShow": true,
- "canResendLink": true,
- "canEditAddons": true,
- "canRequestSessionFee": true,
- "canEditDelivery": true,
- "canSendDelivery": true
}
}
}Keeps the booking, its reference, token and payments; moves the slot and its buffer to a free slot.
| id required | string <uuid> (Uuid) |
| startsAt required | string <date-time> (OffsetInstant) An ISO-8601 instant with an explicit offset ( |
required | object (AdminBooking) |
{- "startsAt": "2019-08-24T14:15:22Z"
}{- "booking": {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "reference": "BKY-2610-7MAR5",
- "status": "pending_payment",
- "stage": "awaiting_payment",
- "locale": "string",
- "client": {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "fullName": "string",
- "email": "string",
- "phone": "string",
- "anonymized": true
}, - "contact": {
- "name": "string",
- "email": "string",
- "phone": "string"
}, - "service": {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "name": "string"
}, - "package": {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "name": "string",
- "priceRwf": 0,
- "durationMinutes": 0,
- "photoCount": 0
}, - "schedule": {
- "startsAt": "2019-08-24T14:15:22Z",
- "endsAt": "2019-08-24T14:15:22Z",
- "bufferEndsAt": "2019-08-24T14:15:22Z",
- "holdExpiresAt": "2019-08-24T14:15:22Z",
- "originalStartsAt": "2019-08-24T14:15:22Z",
- "rescheduledAt": "2019-08-24T14:15:22Z"
}, - "details": {
- "locationText": "string",
- "partySize": 0,
- "specialRequests": "string",
- "consentAt": "2019-08-24T14:15:22Z"
}, - "addons": [
- {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "name": "string",
- "unitPriceRwf": 0,
- "quantity": 1,
- "amountRwf": 0,
- "stage": "at_booking",
- "canRemove": true
}
], - "money": {
- "bookingFeeRate": 0,
- "bookingFeeRwf": 0,
- "totals": {
- "quotedTotalRwf": 0,
- "grandTotalRwf": 0,
- "collectedRwf": 0,
- "refundDueRwf": 0,
- "outstandingRwf": 0
}
}, - "payments": [
- {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "kind": "booking_fee",
- "provider": "mtn_momo_direct",
- "ourRef": "4ba2ec28-e70d-44d3-8779-1ac23f41ec59",
- "providerRef": "string",
- "method": "string",
- "amountRwf": 0,
- "status": "initiated",
- "failureReason": "string",
- "initiatedAt": "2019-08-24T14:15:22Z",
- "settledAt": "2019-08-24T14:15:22Z",
- "refundedAt": "2019-08-24T14:15:22Z",
- "refundReference": "string",
- "note": "string",
- "canRecordRefund": true
}
], - "lifecycle": {
- "confirmedAt": "2019-08-24T14:15:22Z",
- "completedAt": "2019-08-24T14:15:22Z",
- "cancelledAt": "2019-08-24T14:15:22Z",
- "cancellationReason": "string"
}, - "access": {
- "hasLink": true,
- "expiresAt": "2019-08-24T14:15:22Z",
- "lastUsedAt": "2019-08-24T14:15:22Z"
}, - "delivery": {
- "expiresOn": "2019-08-24",
- "sentAt": "2019-08-24T14:15:22Z",
- "note": "string"
}, - "messages": [
- {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "kind": "string",
- "template": "string",
- "recipient": "string",
- "status": "string",
- "attempts": 0,
- "lastError": "string",
- "createdAt": "2019-08-24T14:15:22Z",
- "completedAt": "2019-08-24T14:15:22Z"
}
], - "notes": [
- {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "body": "string",
- "emailed": true,
- "createdAt": "2019-08-24T14:15:22Z"
}
], - "actions": {
- "canReschedule": true,
- "canCancel": true,
- "canComplete": true,
- "canMarkNoShow": true,
- "canResendLink": true,
- "canEditAddons": true,
- "canRequestSessionFee": true,
- "canEditDelivery": true,
- "canSendDelivery": true
}
}
}Releases the slot and marks the booking fee refund_due for a full refund. An optional reason is shown to the client.
| id required | string <uuid> (Uuid) |
| reason | string or null [ 1 .. 1000 ] characters |
required | object (AdminBooking) |
{- "reason": "string"
}{- "booking": {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "reference": "BKY-2610-7MAR5",
- "status": "pending_payment",
- "stage": "awaiting_payment",
- "locale": "string",
- "client": {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "fullName": "string",
- "email": "string",
- "phone": "string",
- "anonymized": true
}, - "contact": {
- "name": "string",
- "email": "string",
- "phone": "string"
}, - "service": {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "name": "string"
}, - "package": {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "name": "string",
- "priceRwf": 0,
- "durationMinutes": 0,
- "photoCount": 0
}, - "schedule": {
- "startsAt": "2019-08-24T14:15:22Z",
- "endsAt": "2019-08-24T14:15:22Z",
- "bufferEndsAt": "2019-08-24T14:15:22Z",
- "holdExpiresAt": "2019-08-24T14:15:22Z",
- "originalStartsAt": "2019-08-24T14:15:22Z",
- "rescheduledAt": "2019-08-24T14:15:22Z"
}, - "details": {
- "locationText": "string",
- "partySize": 0,
- "specialRequests": "string",
- "consentAt": "2019-08-24T14:15:22Z"
}, - "addons": [
- {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "name": "string",
- "unitPriceRwf": 0,
- "quantity": 1,
- "amountRwf": 0,
- "stage": "at_booking",
- "canRemove": true
}
], - "money": {
- "bookingFeeRate": 0,
- "bookingFeeRwf": 0,
- "totals": {
- "quotedTotalRwf": 0,
- "grandTotalRwf": 0,
- "collectedRwf": 0,
- "refundDueRwf": 0,
- "outstandingRwf": 0
}
}, - "payments": [
- {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "kind": "booking_fee",
- "provider": "mtn_momo_direct",
- "ourRef": "4ba2ec28-e70d-44d3-8779-1ac23f41ec59",
- "providerRef": "string",
- "method": "string",
- "amountRwf": 0,
- "status": "initiated",
- "failureReason": "string",
- "initiatedAt": "2019-08-24T14:15:22Z",
- "settledAt": "2019-08-24T14:15:22Z",
- "refundedAt": "2019-08-24T14:15:22Z",
- "refundReference": "string",
- "note": "string",
- "canRecordRefund": true
}
], - "lifecycle": {
- "confirmedAt": "2019-08-24T14:15:22Z",
- "completedAt": "2019-08-24T14:15:22Z",
- "cancelledAt": "2019-08-24T14:15:22Z",
- "cancellationReason": "string"
}, - "access": {
- "hasLink": true,
- "expiresAt": "2019-08-24T14:15:22Z",
- "lastUsedAt": "2019-08-24T14:15:22Z"
}, - "delivery": {
- "expiresOn": "2019-08-24",
- "sentAt": "2019-08-24T14:15:22Z",
- "note": "string"
}, - "messages": [
- {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "kind": "string",
- "template": "string",
- "recipient": "string",
- "status": "string",
- "attempts": 0,
- "lastError": "string",
- "createdAt": "2019-08-24T14:15:22Z",
- "completedAt": "2019-08-24T14:15:22Z"
}
], - "notes": [
- {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "body": "string",
- "emailed": true,
- "createdAt": "2019-08-24T14:15:22Z"
}
], - "actions": {
- "canReschedule": true,
- "canCancel": true,
- "canComplete": true,
- "canMarkNoShow": true,
- "canResendLink": true,
- "canEditAddons": true,
- "canRequestSessionFee": true,
- "canEditDelivery": true,
- "canSendDelivery": true
}
}
}Completing means paid. A booking that still owes money is a 409 balance_due.
| id required | string <uuid> (Uuid) |
required | object (AdminBooking) |
{- "booking": {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "reference": "BKY-2610-7MAR5",
- "status": "pending_payment",
- "stage": "awaiting_payment",
- "locale": "string",
- "client": {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "fullName": "string",
- "email": "string",
- "phone": "string",
- "anonymized": true
}, - "contact": {
- "name": "string",
- "email": "string",
- "phone": "string"
}, - "service": {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "name": "string"
}, - "package": {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "name": "string",
- "priceRwf": 0,
- "durationMinutes": 0,
- "photoCount": 0
}, - "schedule": {
- "startsAt": "2019-08-24T14:15:22Z",
- "endsAt": "2019-08-24T14:15:22Z",
- "bufferEndsAt": "2019-08-24T14:15:22Z",
- "holdExpiresAt": "2019-08-24T14:15:22Z",
- "originalStartsAt": "2019-08-24T14:15:22Z",
- "rescheduledAt": "2019-08-24T14:15:22Z"
}, - "details": {
- "locationText": "string",
- "partySize": 0,
- "specialRequests": "string",
- "consentAt": "2019-08-24T14:15:22Z"
}, - "addons": [
- {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "name": "string",
- "unitPriceRwf": 0,
- "quantity": 1,
- "amountRwf": 0,
- "stage": "at_booking",
- "canRemove": true
}
], - "money": {
- "bookingFeeRate": 0,
- "bookingFeeRwf": 0,
- "totals": {
- "quotedTotalRwf": 0,
- "grandTotalRwf": 0,
- "collectedRwf": 0,
- "refundDueRwf": 0,
- "outstandingRwf": 0
}
}, - "payments": [
- {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "kind": "booking_fee",
- "provider": "mtn_momo_direct",
- "ourRef": "4ba2ec28-e70d-44d3-8779-1ac23f41ec59",
- "providerRef": "string",
- "method": "string",
- "amountRwf": 0,
- "status": "initiated",
- "failureReason": "string",
- "initiatedAt": "2019-08-24T14:15:22Z",
- "settledAt": "2019-08-24T14:15:22Z",
- "refundedAt": "2019-08-24T14:15:22Z",
- "refundReference": "string",
- "note": "string",
- "canRecordRefund": true
}
], - "lifecycle": {
- "confirmedAt": "2019-08-24T14:15:22Z",
- "completedAt": "2019-08-24T14:15:22Z",
- "cancelledAt": "2019-08-24T14:15:22Z",
- "cancellationReason": "string"
}, - "access": {
- "hasLink": true,
- "expiresAt": "2019-08-24T14:15:22Z",
- "lastUsedAt": "2019-08-24T14:15:22Z"
}, - "delivery": {
- "expiresOn": "2019-08-24",
- "sentAt": "2019-08-24T14:15:22Z",
- "note": "string"
}, - "messages": [
- {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "kind": "string",
- "template": "string",
- "recipient": "string",
- "status": "string",
- "attempts": 0,
- "lastError": "string",
- "createdAt": "2019-08-24T14:15:22Z",
- "completedAt": "2019-08-24T14:15:22Z"
}
], - "notes": [
- {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "body": "string",
- "emailed": true,
- "createdAt": "2019-08-24T14:15:22Z"
}
], - "actions": {
- "canReschedule": true,
- "canCancel": true,
- "canComplete": true,
- "canMarkNoShow": true,
- "canResendLink": true,
- "canEditAddons": true,
- "canRequestSessionFee": true,
- "canEditDelivery": true,
- "canSendDelivery": true
}
}
}| id required | string <uuid> (Uuid) |
required | object (AdminBooking) |
{- "booking": {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "reference": "BKY-2610-7MAR5",
- "status": "pending_payment",
- "stage": "awaiting_payment",
- "locale": "string",
- "client": {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "fullName": "string",
- "email": "string",
- "phone": "string",
- "anonymized": true
}, - "contact": {
- "name": "string",
- "email": "string",
- "phone": "string"
}, - "service": {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "name": "string"
}, - "package": {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "name": "string",
- "priceRwf": 0,
- "durationMinutes": 0,
- "photoCount": 0
}, - "schedule": {
- "startsAt": "2019-08-24T14:15:22Z",
- "endsAt": "2019-08-24T14:15:22Z",
- "bufferEndsAt": "2019-08-24T14:15:22Z",
- "holdExpiresAt": "2019-08-24T14:15:22Z",
- "originalStartsAt": "2019-08-24T14:15:22Z",
- "rescheduledAt": "2019-08-24T14:15:22Z"
}, - "details": {
- "locationText": "string",
- "partySize": 0,
- "specialRequests": "string",
- "consentAt": "2019-08-24T14:15:22Z"
}, - "addons": [
- {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "name": "string",
- "unitPriceRwf": 0,
- "quantity": 1,
- "amountRwf": 0,
- "stage": "at_booking",
- "canRemove": true
}
], - "money": {
- "bookingFeeRate": 0,
- "bookingFeeRwf": 0,
- "totals": {
- "quotedTotalRwf": 0,
- "grandTotalRwf": 0,
- "collectedRwf": 0,
- "refundDueRwf": 0,
- "outstandingRwf": 0
}
}, - "payments": [
- {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "kind": "booking_fee",
- "provider": "mtn_momo_direct",
- "ourRef": "4ba2ec28-e70d-44d3-8779-1ac23f41ec59",
- "providerRef": "string",
- "method": "string",
- "amountRwf": 0,
- "status": "initiated",
- "failureReason": "string",
- "initiatedAt": "2019-08-24T14:15:22Z",
- "settledAt": "2019-08-24T14:15:22Z",
- "refundedAt": "2019-08-24T14:15:22Z",
- "refundReference": "string",
- "note": "string",
- "canRecordRefund": true
}
], - "lifecycle": {
- "confirmedAt": "2019-08-24T14:15:22Z",
- "completedAt": "2019-08-24T14:15:22Z",
- "cancelledAt": "2019-08-24T14:15:22Z",
- "cancellationReason": "string"
}, - "access": {
- "hasLink": true,
- "expiresAt": "2019-08-24T14:15:22Z",
- "lastUsedAt": "2019-08-24T14:15:22Z"
}, - "delivery": {
- "expiresOn": "2019-08-24",
- "sentAt": "2019-08-24T14:15:22Z",
- "note": "string"
}, - "messages": [
- {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "kind": "string",
- "template": "string",
- "recipient": "string",
- "status": "string",
- "attempts": 0,
- "lastError": "string",
- "createdAt": "2019-08-24T14:15:22Z",
- "completedAt": "2019-08-24T14:15:22Z"
}
], - "notes": [
- {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "body": "string",
- "emailed": true,
- "createdAt": "2019-08-24T14:15:22Z"
}
], - "actions": {
- "canReschedule": true,
- "canCancel": true,
- "canComplete": true,
- "canMarkNoShow": true,
- "canResendLink": true,
- "canEditAddons": true,
- "canRequestSessionFee": true,
- "canEditDelivery": true,
- "canSendDelivery": true
}
}
}Issues a fresh token and invalidates the old one, then emails the new link.
| id required | string <uuid> (Uuid) |
required | object (AdminBooking) |
{- "booking": {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "reference": "BKY-2610-7MAR5",
- "status": "pending_payment",
- "stage": "awaiting_payment",
- "locale": "string",
- "client": {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "fullName": "string",
- "email": "string",
- "phone": "string",
- "anonymized": true
}, - "contact": {
- "name": "string",
- "email": "string",
- "phone": "string"
}, - "service": {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "name": "string"
}, - "package": {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "name": "string",
- "priceRwf": 0,
- "durationMinutes": 0,
- "photoCount": 0
}, - "schedule": {
- "startsAt": "2019-08-24T14:15:22Z",
- "endsAt": "2019-08-24T14:15:22Z",
- "bufferEndsAt": "2019-08-24T14:15:22Z",
- "holdExpiresAt": "2019-08-24T14:15:22Z",
- "originalStartsAt": "2019-08-24T14:15:22Z",
- "rescheduledAt": "2019-08-24T14:15:22Z"
}, - "details": {
- "locationText": "string",
- "partySize": 0,
- "specialRequests": "string",
- "consentAt": "2019-08-24T14:15:22Z"
}, - "addons": [
- {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "name": "string",
- "unitPriceRwf": 0,
- "quantity": 1,
- "amountRwf": 0,
- "stage": "at_booking",
- "canRemove": true
}
], - "money": {
- "bookingFeeRate": 0,
- "bookingFeeRwf": 0,
- "totals": {
- "quotedTotalRwf": 0,
- "grandTotalRwf": 0,
- "collectedRwf": 0,
- "refundDueRwf": 0,
- "outstandingRwf": 0
}
}, - "payments": [
- {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "kind": "booking_fee",
- "provider": "mtn_momo_direct",
- "ourRef": "4ba2ec28-e70d-44d3-8779-1ac23f41ec59",
- "providerRef": "string",
- "method": "string",
- "amountRwf": 0,
- "status": "initiated",
- "failureReason": "string",
- "initiatedAt": "2019-08-24T14:15:22Z",
- "settledAt": "2019-08-24T14:15:22Z",
- "refundedAt": "2019-08-24T14:15:22Z",
- "refundReference": "string",
- "note": "string",
- "canRecordRefund": true
}
], - "lifecycle": {
- "confirmedAt": "2019-08-24T14:15:22Z",
- "completedAt": "2019-08-24T14:15:22Z",
- "cancelledAt": "2019-08-24T14:15:22Z",
- "cancellationReason": "string"
}, - "access": {
- "hasLink": true,
- "expiresAt": "2019-08-24T14:15:22Z",
- "lastUsedAt": "2019-08-24T14:15:22Z"
}, - "delivery": {
- "expiresOn": "2019-08-24",
- "sentAt": "2019-08-24T14:15:22Z",
- "note": "string"
}, - "messages": [
- {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "kind": "string",
- "template": "string",
- "recipient": "string",
- "status": "string",
- "attempts": 0,
- "lastError": "string",
- "createdAt": "2019-08-24T14:15:22Z",
- "completedAt": "2019-08-24T14:15:22Z"
}
], - "notes": [
- {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "body": "string",
- "emailed": true,
- "createdAt": "2019-08-24T14:15:22Z"
}
], - "actions": {
- "canReschedule": true,
- "canCancel": true,
- "canComplete": true,
- "canMarkNoShow": true,
- "canResendLink": true,
- "canEditAddons": true,
- "canRequestSessionFee": true,
- "canEditDelivery": true,
- "canSendDelivery": true
}
}
}Adds a catalogue add-on to a booking whose shoot has begun. The price is read from the catalogue, never sent.
| id required | string <uuid> (Uuid) |
| addonId required | string <uuid> (Uuid) |
| quantity | integer [ 1 .. 99 ] Default: 1 |
required | object (AdminBooking) |
{- "addonId": "ed930881-3f27-4e25-9365-ff53ffbcfa14",
- "quantity": 1
}{- "booking": {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "reference": "BKY-2610-7MAR5",
- "status": "pending_payment",
- "stage": "awaiting_payment",
- "locale": "string",
- "client": {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "fullName": "string",
- "email": "string",
- "phone": "string",
- "anonymized": true
}, - "contact": {
- "name": "string",
- "email": "string",
- "phone": "string"
}, - "service": {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "name": "string"
}, - "package": {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "name": "string",
- "priceRwf": 0,
- "durationMinutes": 0,
- "photoCount": 0
}, - "schedule": {
- "startsAt": "2019-08-24T14:15:22Z",
- "endsAt": "2019-08-24T14:15:22Z",
- "bufferEndsAt": "2019-08-24T14:15:22Z",
- "holdExpiresAt": "2019-08-24T14:15:22Z",
- "originalStartsAt": "2019-08-24T14:15:22Z",
- "rescheduledAt": "2019-08-24T14:15:22Z"
}, - "details": {
- "locationText": "string",
- "partySize": 0,
- "specialRequests": "string",
- "consentAt": "2019-08-24T14:15:22Z"
}, - "addons": [
- {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "name": "string",
- "unitPriceRwf": 0,
- "quantity": 1,
- "amountRwf": 0,
- "stage": "at_booking",
- "canRemove": true
}
], - "money": {
- "bookingFeeRate": 0,
- "bookingFeeRwf": 0,
- "totals": {
- "quotedTotalRwf": 0,
- "grandTotalRwf": 0,
- "collectedRwf": 0,
- "refundDueRwf": 0,
- "outstandingRwf": 0
}
}, - "payments": [
- {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "kind": "booking_fee",
- "provider": "mtn_momo_direct",
- "ourRef": "4ba2ec28-e70d-44d3-8779-1ac23f41ec59",
- "providerRef": "string",
- "method": "string",
- "amountRwf": 0,
- "status": "initiated",
- "failureReason": "string",
- "initiatedAt": "2019-08-24T14:15:22Z",
- "settledAt": "2019-08-24T14:15:22Z",
- "refundedAt": "2019-08-24T14:15:22Z",
- "refundReference": "string",
- "note": "string",
- "canRecordRefund": true
}
], - "lifecycle": {
- "confirmedAt": "2019-08-24T14:15:22Z",
- "completedAt": "2019-08-24T14:15:22Z",
- "cancelledAt": "2019-08-24T14:15:22Z",
- "cancellationReason": "string"
}, - "access": {
- "hasLink": true,
- "expiresAt": "2019-08-24T14:15:22Z",
- "lastUsedAt": "2019-08-24T14:15:22Z"
}, - "delivery": {
- "expiresOn": "2019-08-24",
- "sentAt": "2019-08-24T14:15:22Z",
- "note": "string"
}, - "messages": [
- {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "kind": "string",
- "template": "string",
- "recipient": "string",
- "status": "string",
- "attempts": 0,
- "lastError": "string",
- "createdAt": "2019-08-24T14:15:22Z",
- "completedAt": "2019-08-24T14:15:22Z"
}
], - "notes": [
- {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "body": "string",
- "emailed": true,
- "createdAt": "2019-08-24T14:15:22Z"
}
], - "actions": {
- "canReschedule": true,
- "canCancel": true,
- "canComplete": true,
- "canMarkNoShow": true,
- "canResendLink": true,
- "canEditAddons": true,
- "canRequestSessionFee": true,
- "canEditDelivery": true,
- "canSendDelivery": true
}
}
}Removes an add-on still removable (post-shoot, not yet paid for).
| id required | string <uuid> (Uuid) |
| addonId required | string <uuid> (Uuid) |
required | object (AdminBooking) |
{- "booking": {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "reference": "BKY-2610-7MAR5",
- "status": "pending_payment",
- "stage": "awaiting_payment",
- "locale": "string",
- "client": {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "fullName": "string",
- "email": "string",
- "phone": "string",
- "anonymized": true
}, - "contact": {
- "name": "string",
- "email": "string",
- "phone": "string"
}, - "service": {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "name": "string"
}, - "package": {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "name": "string",
- "priceRwf": 0,
- "durationMinutes": 0,
- "photoCount": 0
}, - "schedule": {
- "startsAt": "2019-08-24T14:15:22Z",
- "endsAt": "2019-08-24T14:15:22Z",
- "bufferEndsAt": "2019-08-24T14:15:22Z",
- "holdExpiresAt": "2019-08-24T14:15:22Z",
- "originalStartsAt": "2019-08-24T14:15:22Z",
- "rescheduledAt": "2019-08-24T14:15:22Z"
}, - "details": {
- "locationText": "string",
- "partySize": 0,
- "specialRequests": "string",
- "consentAt": "2019-08-24T14:15:22Z"
}, - "addons": [
- {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "name": "string",
- "unitPriceRwf": 0,
- "quantity": 1,
- "amountRwf": 0,
- "stage": "at_booking",
- "canRemove": true
}
], - "money": {
- "bookingFeeRate": 0,
- "bookingFeeRwf": 0,
- "totals": {
- "quotedTotalRwf": 0,
- "grandTotalRwf": 0,
- "collectedRwf": 0,
- "refundDueRwf": 0,
- "outstandingRwf": 0
}
}, - "payments": [
- {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "kind": "booking_fee",
- "provider": "mtn_momo_direct",
- "ourRef": "4ba2ec28-e70d-44d3-8779-1ac23f41ec59",
- "providerRef": "string",
- "method": "string",
- "amountRwf": 0,
- "status": "initiated",
- "failureReason": "string",
- "initiatedAt": "2019-08-24T14:15:22Z",
- "settledAt": "2019-08-24T14:15:22Z",
- "refundedAt": "2019-08-24T14:15:22Z",
- "refundReference": "string",
- "note": "string",
- "canRecordRefund": true
}
], - "lifecycle": {
- "confirmedAt": "2019-08-24T14:15:22Z",
- "completedAt": "2019-08-24T14:15:22Z",
- "cancelledAt": "2019-08-24T14:15:22Z",
- "cancellationReason": "string"
}, - "access": {
- "hasLink": true,
- "expiresAt": "2019-08-24T14:15:22Z",
- "lastUsedAt": "2019-08-24T14:15:22Z"
}, - "delivery": {
- "expiresOn": "2019-08-24",
- "sentAt": "2019-08-24T14:15:22Z",
- "note": "string"
}, - "messages": [
- {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "kind": "string",
- "template": "string",
- "recipient": "string",
- "status": "string",
- "attempts": 0,
- "lastError": "string",
- "createdAt": "2019-08-24T14:15:22Z",
- "completedAt": "2019-08-24T14:15:22Z"
}
], - "notes": [
- {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "body": "string",
- "emailed": true,
- "createdAt": "2019-08-24T14:15:22Z"
}
], - "actions": {
- "canReschedule": true,
- "canCancel": true,
- "canComplete": true,
- "canMarkNoShow": true,
- "canResendLink": true,
- "canEditAddons": true,
- "canRequestSessionFee": true,
- "canEditDelivery": true,
- "canSendDelivery": true
}
}
}Opens a session-fee request for what the booking owes and emails the client. Only mounted when a payment provider is configured; without one the route is a 404.
| id required | string <uuid> (Uuid) |
required | object (AdminBooking) |
{- "booking": {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "reference": "BKY-2610-7MAR5",
- "status": "pending_payment",
- "stage": "awaiting_payment",
- "locale": "string",
- "client": {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "fullName": "string",
- "email": "string",
- "phone": "string",
- "anonymized": true
}, - "contact": {
- "name": "string",
- "email": "string",
- "phone": "string"
}, - "service": {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "name": "string"
}, - "package": {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "name": "string",
- "priceRwf": 0,
- "durationMinutes": 0,
- "photoCount": 0
}, - "schedule": {
- "startsAt": "2019-08-24T14:15:22Z",
- "endsAt": "2019-08-24T14:15:22Z",
- "bufferEndsAt": "2019-08-24T14:15:22Z",
- "holdExpiresAt": "2019-08-24T14:15:22Z",
- "originalStartsAt": "2019-08-24T14:15:22Z",
- "rescheduledAt": "2019-08-24T14:15:22Z"
}, - "details": {
- "locationText": "string",
- "partySize": 0,
- "specialRequests": "string",
- "consentAt": "2019-08-24T14:15:22Z"
}, - "addons": [
- {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "name": "string",
- "unitPriceRwf": 0,
- "quantity": 1,
- "amountRwf": 0,
- "stage": "at_booking",
- "canRemove": true
}
], - "money": {
- "bookingFeeRate": 0,
- "bookingFeeRwf": 0,
- "totals": {
- "quotedTotalRwf": 0,
- "grandTotalRwf": 0,
- "collectedRwf": 0,
- "refundDueRwf": 0,
- "outstandingRwf": 0
}
}, - "payments": [
- {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "kind": "booking_fee",
- "provider": "mtn_momo_direct",
- "ourRef": "4ba2ec28-e70d-44d3-8779-1ac23f41ec59",
- "providerRef": "string",
- "method": "string",
- "amountRwf": 0,
- "status": "initiated",
- "failureReason": "string",
- "initiatedAt": "2019-08-24T14:15:22Z",
- "settledAt": "2019-08-24T14:15:22Z",
- "refundedAt": "2019-08-24T14:15:22Z",
- "refundReference": "string",
- "note": "string",
- "canRecordRefund": true
}
], - "lifecycle": {
- "confirmedAt": "2019-08-24T14:15:22Z",
- "completedAt": "2019-08-24T14:15:22Z",
- "cancelledAt": "2019-08-24T14:15:22Z",
- "cancellationReason": "string"
}, - "access": {
- "hasLink": true,
- "expiresAt": "2019-08-24T14:15:22Z",
- "lastUsedAt": "2019-08-24T14:15:22Z"
}, - "delivery": {
- "expiresOn": "2019-08-24",
- "sentAt": "2019-08-24T14:15:22Z",
- "note": "string"
}, - "messages": [
- {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "kind": "string",
- "template": "string",
- "recipient": "string",
- "status": "string",
- "attempts": 0,
- "lastError": "string",
- "createdAt": "2019-08-24T14:15:22Z",
- "completedAt": "2019-08-24T14:15:22Z"
}
], - "notes": [
- {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "body": "string",
- "emailed": true,
- "createdAt": "2019-08-24T14:15:22Z"
}
], - "actions": {
- "canReschedule": true,
- "canCancel": true,
- "canComplete": true,
- "canMarkNoShow": true,
- "canResendLink": true,
- "canEditAddons": true,
- "canRequestSessionFee": true,
- "canEditDelivery": true,
- "canSendDelivery": true
}
}
}Records cash the photographer was handed, up to what is owed. Refused while an online payment may be in flight; it voids an open online request so the same money cannot be taken twice, and emails nobody.
| id required | string <uuid> (Uuid) |
| amountRwf required | integer [ 1 .. 2147483647 ] |
| note | string or null [ 1 .. 500 ] characters |
required | object (AdminBooking) |
{- "amountRwf": 1,
- "note": "string"
}{- "booking": {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "reference": "BKY-2610-7MAR5",
- "status": "pending_payment",
- "stage": "awaiting_payment",
- "locale": "string",
- "client": {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "fullName": "string",
- "email": "string",
- "phone": "string",
- "anonymized": true
}, - "contact": {
- "name": "string",
- "email": "string",
- "phone": "string"
}, - "service": {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "name": "string"
}, - "package": {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "name": "string",
- "priceRwf": 0,
- "durationMinutes": 0,
- "photoCount": 0
}, - "schedule": {
- "startsAt": "2019-08-24T14:15:22Z",
- "endsAt": "2019-08-24T14:15:22Z",
- "bufferEndsAt": "2019-08-24T14:15:22Z",
- "holdExpiresAt": "2019-08-24T14:15:22Z",
- "originalStartsAt": "2019-08-24T14:15:22Z",
- "rescheduledAt": "2019-08-24T14:15:22Z"
}, - "details": {
- "locationText": "string",
- "partySize": 0,
- "specialRequests": "string",
- "consentAt": "2019-08-24T14:15:22Z"
}, - "addons": [
- {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "name": "string",
- "unitPriceRwf": 0,
- "quantity": 1,
- "amountRwf": 0,
- "stage": "at_booking",
- "canRemove": true
}
], - "money": {
- "bookingFeeRate": 0,
- "bookingFeeRwf": 0,
- "totals": {
- "quotedTotalRwf": 0,
- "grandTotalRwf": 0,
- "collectedRwf": 0,
- "refundDueRwf": 0,
- "outstandingRwf": 0
}
}, - "payments": [
- {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "kind": "booking_fee",
- "provider": "mtn_momo_direct",
- "ourRef": "4ba2ec28-e70d-44d3-8779-1ac23f41ec59",
- "providerRef": "string",
- "method": "string",
- "amountRwf": 0,
- "status": "initiated",
- "failureReason": "string",
- "initiatedAt": "2019-08-24T14:15:22Z",
- "settledAt": "2019-08-24T14:15:22Z",
- "refundedAt": "2019-08-24T14:15:22Z",
- "refundReference": "string",
- "note": "string",
- "canRecordRefund": true
}
], - "lifecycle": {
- "confirmedAt": "2019-08-24T14:15:22Z",
- "completedAt": "2019-08-24T14:15:22Z",
- "cancelledAt": "2019-08-24T14:15:22Z",
- "cancellationReason": "string"
}, - "access": {
- "hasLink": true,
- "expiresAt": "2019-08-24T14:15:22Z",
- "lastUsedAt": "2019-08-24T14:15:22Z"
}, - "delivery": {
- "expiresOn": "2019-08-24",
- "sentAt": "2019-08-24T14:15:22Z",
- "note": "string"
}, - "messages": [
- {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "kind": "string",
- "template": "string",
- "recipient": "string",
- "status": "string",
- "attempts": 0,
- "lastError": "string",
- "createdAt": "2019-08-24T14:15:22Z",
- "completedAt": "2019-08-24T14:15:22Z"
}
], - "notes": [
- {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "body": "string",
- "emailed": true,
- "createdAt": "2019-08-24T14:15:22Z"
}
], - "actions": {
- "canReschedule": true,
- "canCancel": true,
- "canComplete": true,
- "canMarkNoShow": true,
- "canResendLink": true,
- "canEditAddons": true,
- "canRequestSessionFee": true,
- "canEditDelivery": true,
- "canSendDelivery": true
}
}
}Sets the external photo link and its expiry on a completed booking. The link must be https.
| id required | string <uuid> (Uuid) |
| url required | string <uri> <= 2000 characters Must be https. |
| expiresOn | string <date> (KigaliDate) Defaults to today plus the delivery-expiry setting. |
| note | string or null [ 1 .. 2000 ] characters |
required | object (AdminBooking) |
{- "expiresOn": "2019-08-24",
- "note": "string"
}{- "booking": {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "reference": "BKY-2610-7MAR5",
- "status": "pending_payment",
- "stage": "awaiting_payment",
- "locale": "string",
- "client": {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "fullName": "string",
- "email": "string",
- "phone": "string",
- "anonymized": true
}, - "contact": {
- "name": "string",
- "email": "string",
- "phone": "string"
}, - "service": {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "name": "string"
}, - "package": {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "name": "string",
- "priceRwf": 0,
- "durationMinutes": 0,
- "photoCount": 0
}, - "schedule": {
- "startsAt": "2019-08-24T14:15:22Z",
- "endsAt": "2019-08-24T14:15:22Z",
- "bufferEndsAt": "2019-08-24T14:15:22Z",
- "holdExpiresAt": "2019-08-24T14:15:22Z",
- "originalStartsAt": "2019-08-24T14:15:22Z",
- "rescheduledAt": "2019-08-24T14:15:22Z"
}, - "details": {
- "locationText": "string",
- "partySize": 0,
- "specialRequests": "string",
- "consentAt": "2019-08-24T14:15:22Z"
}, - "addons": [
- {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "name": "string",
- "unitPriceRwf": 0,
- "quantity": 1,
- "amountRwf": 0,
- "stage": "at_booking",
- "canRemove": true
}
], - "money": {
- "bookingFeeRate": 0,
- "bookingFeeRwf": 0,
- "totals": {
- "quotedTotalRwf": 0,
- "grandTotalRwf": 0,
- "collectedRwf": 0,
- "refundDueRwf": 0,
- "outstandingRwf": 0
}
}, - "payments": [
- {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "kind": "booking_fee",
- "provider": "mtn_momo_direct",
- "ourRef": "4ba2ec28-e70d-44d3-8779-1ac23f41ec59",
- "providerRef": "string",
- "method": "string",
- "amountRwf": 0,
- "status": "initiated",
- "failureReason": "string",
- "initiatedAt": "2019-08-24T14:15:22Z",
- "settledAt": "2019-08-24T14:15:22Z",
- "refundedAt": "2019-08-24T14:15:22Z",
- "refundReference": "string",
- "note": "string",
- "canRecordRefund": true
}
], - "lifecycle": {
- "confirmedAt": "2019-08-24T14:15:22Z",
- "completedAt": "2019-08-24T14:15:22Z",
- "cancelledAt": "2019-08-24T14:15:22Z",
- "cancellationReason": "string"
}, - "access": {
- "hasLink": true,
- "expiresAt": "2019-08-24T14:15:22Z",
- "lastUsedAt": "2019-08-24T14:15:22Z"
}, - "delivery": {
- "expiresOn": "2019-08-24",
- "sentAt": "2019-08-24T14:15:22Z",
- "note": "string"
}, - "messages": [
- {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "kind": "string",
- "template": "string",
- "recipient": "string",
- "status": "string",
- "attempts": 0,
- "lastError": "string",
- "createdAt": "2019-08-24T14:15:22Z",
- "completedAt": "2019-08-24T14:15:22Z"
}
], - "notes": [
- {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "body": "string",
- "emailed": true,
- "createdAt": "2019-08-24T14:15:22Z"
}
], - "actions": {
- "canReschedule": true,
- "canCancel": true,
- "canComplete": true,
- "canMarkNoShow": true,
- "canResendLink": true,
- "canEditAddons": true,
- "canRequestSessionFee": true,
- "canEditDelivery": true,
- "canSendDelivery": true
}
}
}Emails the saved delivery link, optionally to another address for this one email. The booking's own contact email is not changed.
| id required | string <uuid> (Uuid) |
| recipient | string <= 254 characters A one-off address; a mistyped one is a 422. |
required | object (AdminBooking) |
{- "recipient": "string"
}{- "booking": {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "reference": "BKY-2610-7MAR5",
- "status": "pending_payment",
- "stage": "awaiting_payment",
- "locale": "string",
- "client": {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "fullName": "string",
- "email": "string",
- "phone": "string",
- "anonymized": true
}, - "contact": {
- "name": "string",
- "email": "string",
- "phone": "string"
}, - "service": {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "name": "string"
}, - "package": {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "name": "string",
- "priceRwf": 0,
- "durationMinutes": 0,
- "photoCount": 0
}, - "schedule": {
- "startsAt": "2019-08-24T14:15:22Z",
- "endsAt": "2019-08-24T14:15:22Z",
- "bufferEndsAt": "2019-08-24T14:15:22Z",
- "holdExpiresAt": "2019-08-24T14:15:22Z",
- "originalStartsAt": "2019-08-24T14:15:22Z",
- "rescheduledAt": "2019-08-24T14:15:22Z"
}, - "details": {
- "locationText": "string",
- "partySize": 0,
- "specialRequests": "string",
- "consentAt": "2019-08-24T14:15:22Z"
}, - "addons": [
- {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "name": "string",
- "unitPriceRwf": 0,
- "quantity": 1,
- "amountRwf": 0,
- "stage": "at_booking",
- "canRemove": true
}
], - "money": {
- "bookingFeeRate": 0,
- "bookingFeeRwf": 0,
- "totals": {
- "quotedTotalRwf": 0,
- "grandTotalRwf": 0,
- "collectedRwf": 0,
- "refundDueRwf": 0,
- "outstandingRwf": 0
}
}, - "payments": [
- {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "kind": "booking_fee",
- "provider": "mtn_momo_direct",
- "ourRef": "4ba2ec28-e70d-44d3-8779-1ac23f41ec59",
- "providerRef": "string",
- "method": "string",
- "amountRwf": 0,
- "status": "initiated",
- "failureReason": "string",
- "initiatedAt": "2019-08-24T14:15:22Z",
- "settledAt": "2019-08-24T14:15:22Z",
- "refundedAt": "2019-08-24T14:15:22Z",
- "refundReference": "string",
- "note": "string",
- "canRecordRefund": true
}
], - "lifecycle": {
- "confirmedAt": "2019-08-24T14:15:22Z",
- "completedAt": "2019-08-24T14:15:22Z",
- "cancelledAt": "2019-08-24T14:15:22Z",
- "cancellationReason": "string"
}, - "access": {
- "hasLink": true,
- "expiresAt": "2019-08-24T14:15:22Z",
- "lastUsedAt": "2019-08-24T14:15:22Z"
}, - "delivery": {
- "expiresOn": "2019-08-24",
- "sentAt": "2019-08-24T14:15:22Z",
- "note": "string"
}, - "messages": [
- {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "kind": "string",
- "template": "string",
- "recipient": "string",
- "status": "string",
- "attempts": 0,
- "lastError": "string",
- "createdAt": "2019-08-24T14:15:22Z",
- "completedAt": "2019-08-24T14:15:22Z"
}
], - "notes": [
- {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "body": "string",
- "emailed": true,
- "createdAt": "2019-08-24T14:15:22Z"
}
], - "actions": {
- "canReschedule": true,
- "canCancel": true,
- "canComplete": true,
- "canMarkNoShow": true,
- "canResendLink": true,
- "canEditAddons": true,
- "canRequestSessionFee": true,
- "canEditDelivery": true,
- "canSendDelivery": true
}
}
}A plain-text note, emailed to the client unless email is false.
| id required | string <uuid> (Uuid) |
| body required | string [ 1 .. 1000 ] characters |
boolean Default: true |
required | object (AdminBooking) |
{- "body": "string",
- "email": true
}{- "booking": {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "reference": "BKY-2610-7MAR5",
- "status": "pending_payment",
- "stage": "awaiting_payment",
- "locale": "string",
- "client": {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "fullName": "string",
- "email": "string",
- "phone": "string",
- "anonymized": true
}, - "contact": {
- "name": "string",
- "email": "string",
- "phone": "string"
}, - "service": {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "name": "string"
}, - "package": {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "name": "string",
- "priceRwf": 0,
- "durationMinutes": 0,
- "photoCount": 0
}, - "schedule": {
- "startsAt": "2019-08-24T14:15:22Z",
- "endsAt": "2019-08-24T14:15:22Z",
- "bufferEndsAt": "2019-08-24T14:15:22Z",
- "holdExpiresAt": "2019-08-24T14:15:22Z",
- "originalStartsAt": "2019-08-24T14:15:22Z",
- "rescheduledAt": "2019-08-24T14:15:22Z"
}, - "details": {
- "locationText": "string",
- "partySize": 0,
- "specialRequests": "string",
- "consentAt": "2019-08-24T14:15:22Z"
}, - "addons": [
- {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "name": "string",
- "unitPriceRwf": 0,
- "quantity": 1,
- "amountRwf": 0,
- "stage": "at_booking",
- "canRemove": true
}
], - "money": {
- "bookingFeeRate": 0,
- "bookingFeeRwf": 0,
- "totals": {
- "quotedTotalRwf": 0,
- "grandTotalRwf": 0,
- "collectedRwf": 0,
- "refundDueRwf": 0,
- "outstandingRwf": 0
}
}, - "payments": [
- {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "kind": "booking_fee",
- "provider": "mtn_momo_direct",
- "ourRef": "4ba2ec28-e70d-44d3-8779-1ac23f41ec59",
- "providerRef": "string",
- "method": "string",
- "amountRwf": 0,
- "status": "initiated",
- "failureReason": "string",
- "initiatedAt": "2019-08-24T14:15:22Z",
- "settledAt": "2019-08-24T14:15:22Z",
- "refundedAt": "2019-08-24T14:15:22Z",
- "refundReference": "string",
- "note": "string",
- "canRecordRefund": true
}
], - "lifecycle": {
- "confirmedAt": "2019-08-24T14:15:22Z",
- "completedAt": "2019-08-24T14:15:22Z",
- "cancelledAt": "2019-08-24T14:15:22Z",
- "cancellationReason": "string"
}, - "access": {
- "hasLink": true,
- "expiresAt": "2019-08-24T14:15:22Z",
- "lastUsedAt": "2019-08-24T14:15:22Z"
}, - "delivery": {
- "expiresOn": "2019-08-24",
- "sentAt": "2019-08-24T14:15:22Z",
- "note": "string"
}, - "messages": [
- {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "kind": "string",
- "template": "string",
- "recipient": "string",
- "status": "string",
- "attempts": 0,
- "lastError": "string",
- "createdAt": "2019-08-24T14:15:22Z",
- "completedAt": "2019-08-24T14:15:22Z"
}
], - "notes": [
- {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "body": "string",
- "emailed": true,
- "createdAt": "2019-08-24T14:15:22Z"
}
], - "actions": {
- "canReschedule": true,
- "canCancel": true,
- "canComplete": true,
- "canMarkNoShow": true,
- "canResendLink": true,
- "canEditAddons": true,
- "canRequestSessionFee": true,
- "canEditDelivery": true,
- "canSendDelivery": true
}
}
}| id required | string <uuid> (Uuid) |
| noteId required | string <uuid> (Uuid) |
required | object (AdminBooking) |
{- "booking": {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "reference": "BKY-2610-7MAR5",
- "status": "pending_payment",
- "stage": "awaiting_payment",
- "locale": "string",
- "client": {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "fullName": "string",
- "email": "string",
- "phone": "string",
- "anonymized": true
}, - "contact": {
- "name": "string",
- "email": "string",
- "phone": "string"
}, - "service": {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "name": "string"
}, - "package": {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "name": "string",
- "priceRwf": 0,
- "durationMinutes": 0,
- "photoCount": 0
}, - "schedule": {
- "startsAt": "2019-08-24T14:15:22Z",
- "endsAt": "2019-08-24T14:15:22Z",
- "bufferEndsAt": "2019-08-24T14:15:22Z",
- "holdExpiresAt": "2019-08-24T14:15:22Z",
- "originalStartsAt": "2019-08-24T14:15:22Z",
- "rescheduledAt": "2019-08-24T14:15:22Z"
}, - "details": {
- "locationText": "string",
- "partySize": 0,
- "specialRequests": "string",
- "consentAt": "2019-08-24T14:15:22Z"
}, - "addons": [
- {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "name": "string",
- "unitPriceRwf": 0,
- "quantity": 1,
- "amountRwf": 0,
- "stage": "at_booking",
- "canRemove": true
}
], - "money": {
- "bookingFeeRate": 0,
- "bookingFeeRwf": 0,
- "totals": {
- "quotedTotalRwf": 0,
- "grandTotalRwf": 0,
- "collectedRwf": 0,
- "refundDueRwf": 0,
- "outstandingRwf": 0
}
}, - "payments": [
- {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "kind": "booking_fee",
- "provider": "mtn_momo_direct",
- "ourRef": "4ba2ec28-e70d-44d3-8779-1ac23f41ec59",
- "providerRef": "string",
- "method": "string",
- "amountRwf": 0,
- "status": "initiated",
- "failureReason": "string",
- "initiatedAt": "2019-08-24T14:15:22Z",
- "settledAt": "2019-08-24T14:15:22Z",
- "refundedAt": "2019-08-24T14:15:22Z",
- "refundReference": "string",
- "note": "string",
- "canRecordRefund": true
}
], - "lifecycle": {
- "confirmedAt": "2019-08-24T14:15:22Z",
- "completedAt": "2019-08-24T14:15:22Z",
- "cancelledAt": "2019-08-24T14:15:22Z",
- "cancellationReason": "string"
}, - "access": {
- "hasLink": true,
- "expiresAt": "2019-08-24T14:15:22Z",
- "lastUsedAt": "2019-08-24T14:15:22Z"
}, - "delivery": {
- "expiresOn": "2019-08-24",
- "sentAt": "2019-08-24T14:15:22Z",
- "note": "string"
}, - "messages": [
- {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "kind": "string",
- "template": "string",
- "recipient": "string",
- "status": "string",
- "attempts": 0,
- "lastError": "string",
- "createdAt": "2019-08-24T14:15:22Z",
- "completedAt": "2019-08-24T14:15:22Z"
}
], - "notes": [
- {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "body": "string",
- "emailed": true,
- "createdAt": "2019-08-24T14:15:22Z"
}
], - "actions": {
- "canReschedule": true,
- "canCancel": true,
- "canComplete": true,
- "canMarkNoShow": true,
- "canResendLink": true,
- "canEditAddons": true,
- "canRequestSessionFee": true,
- "canEditDelivery": true,
- "canSendDelivery": true
}
}
}Records that the photographer refunded a payment by hand (the system never moves money). Needs the MoMo or bank reference it was sent with.
| id required | string <uuid> (Uuid) |
| reference required | string [ 1 .. 100 ] characters |
| refundedAt | string <date-time> (OffsetInstant) An ISO-8601 instant with an explicit offset ( |
required | object (AdminBooking) |
{- "reference": "string",
- "refundedAt": "2019-08-24T14:15:22Z"
}{- "booking": {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "reference": "BKY-2610-7MAR5",
- "status": "pending_payment",
- "stage": "awaiting_payment",
- "locale": "string",
- "client": {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "fullName": "string",
- "email": "string",
- "phone": "string",
- "anonymized": true
}, - "contact": {
- "name": "string",
- "email": "string",
- "phone": "string"
}, - "service": {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "name": "string"
}, - "package": {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "name": "string",
- "priceRwf": 0,
- "durationMinutes": 0,
- "photoCount": 0
}, - "schedule": {
- "startsAt": "2019-08-24T14:15:22Z",
- "endsAt": "2019-08-24T14:15:22Z",
- "bufferEndsAt": "2019-08-24T14:15:22Z",
- "holdExpiresAt": "2019-08-24T14:15:22Z",
- "originalStartsAt": "2019-08-24T14:15:22Z",
- "rescheduledAt": "2019-08-24T14:15:22Z"
}, - "details": {
- "locationText": "string",
- "partySize": 0,
- "specialRequests": "string",
- "consentAt": "2019-08-24T14:15:22Z"
}, - "addons": [
- {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "name": "string",
- "unitPriceRwf": 0,
- "quantity": 1,
- "amountRwf": 0,
- "stage": "at_booking",
- "canRemove": true
}
], - "money": {
- "bookingFeeRate": 0,
- "bookingFeeRwf": 0,
- "totals": {
- "quotedTotalRwf": 0,
- "grandTotalRwf": 0,
- "collectedRwf": 0,
- "refundDueRwf": 0,
- "outstandingRwf": 0
}
}, - "payments": [
- {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "kind": "booking_fee",
- "provider": "mtn_momo_direct",
- "ourRef": "4ba2ec28-e70d-44d3-8779-1ac23f41ec59",
- "providerRef": "string",
- "method": "string",
- "amountRwf": 0,
- "status": "initiated",
- "failureReason": "string",
- "initiatedAt": "2019-08-24T14:15:22Z",
- "settledAt": "2019-08-24T14:15:22Z",
- "refundedAt": "2019-08-24T14:15:22Z",
- "refundReference": "string",
- "note": "string",
- "canRecordRefund": true
}
], - "lifecycle": {
- "confirmedAt": "2019-08-24T14:15:22Z",
- "completedAt": "2019-08-24T14:15:22Z",
- "cancelledAt": "2019-08-24T14:15:22Z",
- "cancellationReason": "string"
}, - "access": {
- "hasLink": true,
- "expiresAt": "2019-08-24T14:15:22Z",
- "lastUsedAt": "2019-08-24T14:15:22Z"
}, - "delivery": {
- "expiresOn": "2019-08-24",
- "sentAt": "2019-08-24T14:15:22Z",
- "note": "string"
}, - "messages": [
- {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "kind": "string",
- "template": "string",
- "recipient": "string",
- "status": "string",
- "attempts": 0,
- "lastError": "string",
- "createdAt": "2019-08-24T14:15:22Z",
- "completedAt": "2019-08-24T14:15:22Z"
}
], - "notes": [
- {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "body": "string",
- "emailed": true,
- "createdAt": "2019-08-24T14:15:22Z"
}
], - "actions": {
- "canReschedule": true,
- "canCancel": true,
- "canComplete": true,
- "canMarkNoShow": true,
- "canResendLink": true,
- "canEditAddons": true,
- "canRequestSessionFee": true,
- "canEditDelivery": true,
- "canSendDelivery": true
}
}
}Every service (active or not) with its packages and own add-ons, and the add-ons offered on every service.
required | Array of objects Every service, active or not, with all its packages and its own add-ons. |
required | Array of objects (AdminAddon) Add-ons offered on every service ( |
{- "services": [
- {
- "packages": [
- {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "serviceId": "8f8bb40f-b96b-40fe-9064-5031fbe483f9",
- "nameEn": "string",
- "nameFr": "string",
- "descriptionEn": "string",
- "descriptionFr": "string",
- "priceRwf": 0,
- "photoCount": 0,
- "durationMinutes": 1,
- "isActive": true,
- "sortOrder": 0
}
], - "addons": [
- {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "serviceId": "8f8bb40f-b96b-40fe-9064-5031fbe483f9",
- "nameEn": "string",
- "nameFr": "string",
- "priceRwf": 0,
- "isActive": true,
- "sortOrder": 0
}
], - "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "slug": "string",
- "nameEn": "string",
- "nameFr": "string",
- "descriptionEn": "string",
- "descriptionFr": "string",
- "bookingFeeRateOverride": 0,
- "isActive": true,
- "sortOrder": 0
}
], - "sharedAddons": [
- {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "serviceId": "8f8bb40f-b96b-40fe-9064-5031fbe483f9",
- "nameEn": "string",
- "nameFr": "string",
- "priceRwf": 0,
- "isActive": true,
- "sortOrder": 0
}
]
}| slug | string <= 100 characters ^[a-z0-9]+(?:-[a-z0-9]+)*$ Lowercase words joined by single hyphens. Unique; a taken slug is 409 |
| nameEn | string [ 1 .. 200 ] characters |
| nameFr | string or null <= 200 characters |
| descriptionEn | string or null <= 5000 characters |
| descriptionFr | string or null <= 5000 characters |
| coverImageUrl | string or null <uri> A pasted link to an image hosted elsewhere. Must be |
| bookingFeeRateOverride | number or null [ 0 .. 1 ] At most three decimal places. Null uses the global rate. |
| isActive | boolean |
| sortOrder | integer >= 0 |
required | object (AdminService) |
{- "slug": "string",
- "nameEn": "string",
- "nameFr": "string",
- "descriptionEn": "string",
- "descriptionFr": "string",
- "bookingFeeRateOverride": 0,
- "isActive": true,
- "sortOrder": 0
}{- "service": {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "slug": "string",
- "nameEn": "string",
- "nameFr": "string",
- "descriptionEn": "string",
- "descriptionFr": "string",
- "bookingFeeRateOverride": 0,
- "isActive": true,
- "sortOrder": 0
}
}| id required | string <uuid> (Uuid) |
| slug | string <= 100 characters ^[a-z0-9]+(?:-[a-z0-9]+)*$ Lowercase words joined by single hyphens. Unique; a taken slug is 409 |
| nameEn | string [ 1 .. 200 ] characters |
| nameFr | string or null <= 200 characters |
| descriptionEn | string or null <= 5000 characters |
| descriptionFr | string or null <= 5000 characters |
| coverImageUrl | string or null <uri> A pasted link to an image hosted elsewhere. Must be |
| bookingFeeRateOverride | number or null [ 0 .. 1 ] At most three decimal places. Null uses the global rate. |
| isActive | boolean |
| sortOrder | integer >= 0 |
required | object (AdminService) |
{- "slug": "string",
- "nameEn": "string",
- "nameFr": "string",
- "descriptionEn": "string",
- "descriptionFr": "string",
- "bookingFeeRateOverride": 0,
- "isActive": true,
- "sortOrder": 0
}{- "service": {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "slug": "string",
- "nameEn": "string",
- "nameFr": "string",
- "descriptionEn": "string",
- "descriptionFr": "string",
- "bookingFeeRateOverride": 0,
- "isActive": true,
- "sortOrder": 0
}
}| serviceId | string <uuid> (Uuid) Create only. A service that does not exist is a 422 naming |
| nameEn | string [ 1 .. 200 ] characters |
| nameFr | string or null <= 200 characters |
| descriptionEn | string or null <= 5000 characters |
| descriptionFr | string or null <= 5000 characters |
| priceRwf | integer (Rwf) >= 0 Whole Rwandan francs. Money is never a float. |
| photoCount | integer >= 0 |
| durationMinutes | integer >= 1 |
| isActive | boolean |
| sortOrder | integer >= 0 |
required | object (AdminPackage) |
required | null or object |
{- "serviceId": "8f8bb40f-b96b-40fe-9064-5031fbe483f9",
- "nameEn": "string",
- "nameFr": "string",
- "descriptionEn": "string",
- "descriptionFr": "string",
- "priceRwf": 0,
- "photoCount": 0,
- "durationMinutes": 1,
- "isActive": true,
- "sortOrder": 0
}{- "package": {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "serviceId": "8f8bb40f-b96b-40fe-9064-5031fbe483f9",
- "nameEn": "string",
- "nameFr": "string",
- "descriptionEn": "string",
- "descriptionFr": "string",
- "priceRwf": 0,
- "photoCount": 0,
- "durationMinutes": 1,
- "isActive": true,
- "sortOrder": 0
}, - "warning": { }
}| id required | string <uuid> (Uuid) |
| serviceId | string <uuid> (Uuid) Create only. A service that does not exist is a 422 naming |
| nameEn | string [ 1 .. 200 ] characters |
| nameFr | string or null <= 200 characters |
| descriptionEn | string or null <= 5000 characters |
| descriptionFr | string or null <= 5000 characters |
| priceRwf | integer (Rwf) >= 0 Whole Rwandan francs. Money is never a float. |
| photoCount | integer >= 0 |
| durationMinutes | integer >= 1 |
| isActive | boolean |
| sortOrder | integer >= 0 |
required | object (AdminPackage) |
required | null or object |
{- "serviceId": "8f8bb40f-b96b-40fe-9064-5031fbe483f9",
- "nameEn": "string",
- "nameFr": "string",
- "descriptionEn": "string",
- "descriptionFr": "string",
- "priceRwf": 0,
- "photoCount": 0,
- "durationMinutes": 1,
- "isActive": true,
- "sortOrder": 0
}{- "package": {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "serviceId": "8f8bb40f-b96b-40fe-9064-5031fbe483f9",
- "nameEn": "string",
- "nameFr": "string",
- "descriptionEn": "string",
- "descriptionFr": "string",
- "priceRwf": 0,
- "photoCount": 0,
- "durationMinutes": 1,
- "isActive": true,
- "sortOrder": 0
}, - "warning": { }
}| serviceId | string or null <uuid> Create only. |
| nameEn | string [ 1 .. 200 ] characters |
| nameFr | string or null <= 200 characters |
| priceRwf | integer (Rwf) >= 0 Whole Rwandan francs. Money is never a float. |
| isActive | boolean |
| sortOrder | integer >= 0 |
required | object (AdminAddon) |
{- "serviceId": "8f8bb40f-b96b-40fe-9064-5031fbe483f9",
- "nameEn": "string",
- "nameFr": "string",
- "priceRwf": 0,
- "isActive": true,
- "sortOrder": 0
}{- "addon": {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "serviceId": "8f8bb40f-b96b-40fe-9064-5031fbe483f9",
- "nameEn": "string",
- "nameFr": "string",
- "priceRwf": 0,
- "isActive": true,
- "sortOrder": 0
}
}| id required | string <uuid> (Uuid) |
| serviceId | string or null <uuid> Create only. |
| nameEn | string [ 1 .. 200 ] characters |
| nameFr | string or null <= 200 characters |
| priceRwf | integer (Rwf) >= 0 Whole Rwandan francs. Money is never a float. |
| isActive | boolean |
| sortOrder | integer >= 0 |
required | object (AdminAddon) |
{- "serviceId": "8f8bb40f-b96b-40fe-9064-5031fbe483f9",
- "nameEn": "string",
- "nameFr": "string",
- "priceRwf": 0,
- "isActive": true,
- "sortOrder": 0
}{- "addon": {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "serviceId": "8f8bb40f-b96b-40fe-9064-5031fbe483f9",
- "nameEn": "string",
- "nameFr": "string",
- "priceRwf": 0,
- "isActive": true,
- "sortOrder": 0
}
}MTN signs nothing it sends, so the proof is in the URL: the path carries
our reference and HMAC(our_ref) keyed from SESSION_SECRET, and the
body's externalId must name the same payment. Only MTN is ever given
this URL. A body failing either check is stored and applied to nothing.
| ourRef required | string <uuid> (Uuid) Our id for one payment attempt, returned when it was started. |
| signature required | string
|
| externalId | string |
| status | string |
| amount | string |
| financialTransactionId | string |
| received required | any Value: true |
{- "externalId": "string",
- "status": "SUCCESSFUL",
- "amount": "string",
- "financialTransactionId": "string"
}{- "received": true
}Same as the POST callback; MTN may deliver either verb.
| ourRef required | string <uuid> (Uuid) Our id for one payment attempt, returned when it was started. |
| signature required | string |
| externalId | string |
| status | string |
| amount | string |
| financialTransactionId | string |
| received required | any Value: true |
{- "externalId": "string",
- "status": "string",
- "amount": "string",
- "financialTransactionId": "string"
}{- "received": true
}Verified by the flutterwave-signature header, an HMAC-SHA256 of the raw
body keyed by the dashboard's secret hash. A body whose signature does not
match is stored unverified and applied to nothing.
| flutterwave-signature required | string Base64 HMAC-SHA256 of the raw body. |
| type | string |
| data | object |
| received required | any Value: true |
{- "type": "charge.completed",
- "data": { }
}{- "received": true
}