RemindR API

The RemindR API lets another system work with one RemindR instance (a business): read and change its services and work hours, and see, place, move and cancel its bookings. It speaks JSON over HTTPS.

Calls are made server to server. Never put an API key in a web page or in an app that customers download.

OpenAPI 3.1 description

Import it into Postman, Insomnia or a code generator.

Getting started

Your first call:

curl "https://remindr.se/api/v1/me" \
  -H "Authorization: Bearer rmr_xxxxxxxx_…"

Authentication

Every call carries an instance API key in the Authorization header. An admin of the instance creates the key in RemindR Admin under Settings → PC-Kassa → API keys, chooses what it may do, and copies it; it is shown only once. Keys can be given an expiry date and can be revoked at any time.

The key decides which instance you work with: there is no instance id in the URL, and a key never reaches another instance. The keys are the same ones RemindRSync uses; give each system its own key, so one can be revoked without the others.

Authorization: Bearer rmr_<prefix>_<secret>

Scopes

services:readCategories, services, add-ons and the resources that perform them.
services:writeCreate and change categories, services and add-ons.
schedules:readWork hours and exceptions.
schedules:writeAdd, replace and remove work hours and exceptions.
bookings:readBookings, their customers, and availability.
bookings:writePlace, move and cancel bookings, and add the customers they are for.

A write scope includes its read scope. Resources can be listed with any read scope. The RemindRSync scopes (sync:read, sync:write) give no access to this API.

Conventions

  • Field names are camelCase. Send Content-Type: application/json.
  • Dates are YYYY-MM-DD and times of day HH:MM, both in the instance's time zone (see GET /me). Instants such as startsAt are ISO 8601 with an offset.
  • Prices are in SEK including VAT, as numbers.
  • PATCH changes only the fields you send. To clear a field that can be empty, send null.
  • Responses are never cached. Lists are not paginated: they are bounded by the date range you ask for, or by the size of the catalogue.

Rate limits

Each key may make 120 requests a minute, counted per calendar minute. Every response says where you are: RateLimit-Limit, RateLimit-Remaining and RateLimit-Reset (seconds until the count starts over).

Over the limit, the answer is 429 rate_limited with a Retry-After header. Wait that many seconds before trying again. A system that needs more should spread its calls, or fetch lists rather than one item at a time.

HTTP/1.1 429 Too Many Requests
Retry-After: 23
RateLimit-Limit: 120
RateLimit-Remaining: 0
RateLimit-Reset: 23

{ "error": "rate_limited" }

Idempotency

A write that times out may or may not have happened. Send an Idempotency-Key header with every POST, PUT, PATCH and DELETE, and use the same key when you retry: if the first request went through, you get its response back, marked Idempotent-Replayed: true, and nothing is done twice.

Use a new key, such as a UUID, for each new change. The key is tied to the request: the same key with a different method, path or body is refused with 422 idempotency_key_reused. A request that failed is not stored, so retrying it with the same key runs it again. Keys are kept for 24 hours.

curl -X POST "https://remindr.se/api/v1/bookings" \
  -H "Authorization: Bearer $REMINDR_KEY" \
  -H "Idempotency-Key: 4f6c1f0e-9a51-4c1e-8f3a-2b7d9c0e5a11" \
  -H "Content-Type: application/json" \
  -d '{ … }'

Errors

Errors have a status code and a JSON body with a machine-readable code, and sometimes a detail:

HTTP/1.1 409 Conflict

{ "error": "no_capacity", "detail": "no capacity" }
StatusCodeMeaning
401invalid_keyNo key, or not a valid one.
401revokedThe key has been revoked.
401expiredThe key has expired.
403missing_scopeThe key does not have the scope the operation needs.
403instance_suspendedThe instance is not active.
404not_foundNothing with that id in this instance.
400invalid_jsonThe body is not JSON.
422invalid_bodyThe body does not match the schema; detail says where.
422invalid_queryA query parameter is missing or wrong; detail says which.
409in_useSomething still refers to it.
409duplicateIt already exists.
413payload_too_largeThe body is over 256 kB.
429rate_limitedOver the key's limit this minute. Wait Retry-After seconds.
400invalid_idempotency_keyThe Idempotency-Key header is not 1–255 printable ASCII characters.
422idempotency_key_reusedThe Idempotency-Key was already used for a different request.
409idempotency_conflictThe first request with this Idempotency-Key has not finished. Retry shortly.
500server_errorSomething went wrong on our side. Safe to retry reads; check before retrying writes.
409invalid_categoryThe category is not one of this instance's.
409schedule_overlapThe hours overlap other hours for the same resource and weekday.
409no_capacityNo resource has room at that time.
409start_requiredThe service is booked by time slot: give startsAt.
409day_requiredThe service is booked by the day: give day.
409invalid_resourceThe resource cannot perform the service, or is not active.
409invalid_customerThe customer is not one of this instance's.
409invalid_serviceThe service does not exist or is not active.
409invalid_addonAn add-on does not belong to the service, or is not active.
409booking_disabledThe instance's plan does not include booking.
409booking_cancelledA cancelled booking cannot be moved.

Account

The key you are calling with and the instance it belongs to.

Who am I

GET/me

The instance the key belongs to, its time zone and booking mode, and the key's scopes. Works with any valid key: a good first call.

Scope: any key

Response 200

Me

curl -X GET "https://remindr.se/api/v1/me" \
  -H "Authorization: Bearer $REMINDR_KEY"

Services

The catalogue: categories, services and their add-ons, and which resources can perform each service.

List categories

GET/categories

Scope: services:read

Response 200

A list of Category

curl -X GET "https://remindr.se/api/v1/categories" \
  -H "Authorization: Bearer $REMINDR_KEY"

Create a category

POST/categories

Scope: services:write

Parameters

FieldType
Idempotency-Key (header)optional
string

Any unique string, e.g. a UUID. A retry with the same key and the same request gets the first response back, marked Idempotent-Replayed: true, instead of doing the change twice. Kept for 24 hours.

min length 1 · max length 255

Request body(CategoryCreate)

FieldType
namerequired
string

min length 1 · max length 120

sortOrderoptional
integer

Lower comes first.

≥ -100000 · ≤ 100000 · default 0

isActiveoptional
boolean

default true

Response 201

Category

curl -X POST "https://remindr.se/api/v1/categories" \
  -H 'Content-Type: application/json' \
  -H "Idempotency-Key: $(uuidgen)" \
  -H "Authorization: Bearer $REMINDR_KEY" \
  -d '{ … }'

Update a category

PATCH/categories/{id}

Only the fields given change.

Scope: services:write

Parameters

FieldType
{id}required
string (uuid)
Idempotency-Key (header)optional
string

Any unique string, e.g. a UUID. A retry with the same key and the same request gets the first response back, marked Idempotent-Replayed: true, instead of doing the change twice. Kept for 24 hours.

min length 1 · max length 255

Request body(CategoryUpdate)

FieldType
nameoptional
string

min length 1 · max length 120

sortOrderoptional
integer

Lower comes first.

≥ -100000 · ≤ 100000

isActiveoptional
boolean

Response 200

Category

May also return: not_found

curl -X PATCH "https://remindr.se/api/v1/categories/{id}" \
  -H 'Content-Type: application/json' \
  -H "Idempotency-Key: $(uuidgen)" \
  -H "Authorization: Bearer $REMINDR_KEY" \
  -d '{ … }'

Delete a category

DELETE/categories/{id}

Only an empty category can be deleted; move or deactivate its services first.

Scope: services:write

Parameters

FieldType
{id}required
string (uuid)
Idempotency-Key (header)optional
string

Any unique string, e.g. a UUID. A retry with the same key and the same request gets the first response back, marked Idempotent-Replayed: true, instead of doing the change twice. Kept for 24 hours.

min length 1 · max length 255

Response 204

No content.

May also return: not_found, in_use

curl -X DELETE "https://remindr.se/api/v1/categories/{id}" \
  -H "Idempotency-Key: $(uuidgen)" \
  -H "Authorization: Bearer $REMINDR_KEY"

List services

GET/services

Every service, active or not, with its add-ons and resources, in the order they are shown.

Scope: services:read

Response 200

A list of Service

curl -X GET "https://remindr.se/api/v1/services" \
  -H "Authorization: Bearer $REMINDR_KEY"

Create a service

POST/services

Give the category by id, or by name to find or create it. A new service is not shown on the booking site until isPublic is true, and cannot be booked until at least one resource can perform it.

Scope: services:write

Parameters

FieldType
Idempotency-Key (header)optional
string

Any unique string, e.g. a UUID. A retry with the same key and the same request gets the first response back, marked Idempotent-Replayed: true, instead of doing the change twice. Kept for 24 hours.

min length 1 · max length 255

Request body(ServiceCreate)

FieldType
categoryIdoptional
string (uuid)

An existing category. Give this or categoryName.

categoryNameoptional
string

A category by name; created if there is none. Give this or categoryId.

min length 1 · max length 120

namerequired
string

min length 1 · max length 200

descriptionoptional
string | null

max length 4000 · default null

durationMinutesrequired
integer

≥ 5 · ≤ 1440

pricerequired
number

SEK including VAT, at most two decimals.

≥ 0 · ≤ 9999999

sortOrderoptional
integer

Lower comes first.

≥ -100000 · ≤ 100000 · default 0

isActiveoptional
boolean

default true

isPublicoptional
boolean

default false

bookingModeoptional
"day_capacity" | "time_slots" | null

time_slots: the customer picks a start time. day_capacity: the customer picks a day and the work is planned into it.

default null

slotIntervalMinutesoptional
5 | 10 | 15 | 20 | 30 | 60 | null

default null

minHoursAheadoptional
integer | null

≥ 0 · ≤ 720 · default null

maxDaysAheadoptional
integer | null

≥ 0 · ≤ 730 · default null

resourcesoptional
array of object

Replaces the resources that can perform the service. Resources of other instances are ignored.

at most 200 · default []

Response 201

Service

May also return: invalid_category

curl -X POST "https://remindr.se/api/v1/services" \
  -H 'Content-Type: application/json' \
  -H "Idempotency-Key: $(uuidgen)" \
  -H "Authorization: Bearer $REMINDR_KEY" \
  -d '{ … }'

Get a service

GET/services/{id}

Scope: services:read

Parameters

FieldType
{id}required
string (uuid)

Response 200

Service

May also return: not_found

curl -X GET "https://remindr.se/api/v1/services/{id}" \
  -H "Authorization: Bearer $REMINDR_KEY"

Update a service

PATCH/services/{id}

Only the fields given change; resources, when given, replaces the whole list. Services are not deleted through the API, because bookings refer to them: set isActive to false instead. Existing bookings keep the name, duration and price they were booked with.

Scope: services:write

Parameters

FieldType
{id}required
string (uuid)
Idempotency-Key (header)optional
string

Any unique string, e.g. a UUID. A retry with the same key and the same request gets the first response back, marked Idempotent-Replayed: true, instead of doing the change twice. Kept for 24 hours.

min length 1 · max length 255

Request body(ServiceUpdate)

FieldType
categoryIdoptional
string (uuid)

An existing category. Give this or categoryName.

categoryNameoptional
string

A category by name; created if there is none. Give this or categoryId.

min length 1 · max length 120

nameoptional
string

min length 1 · max length 200

descriptionoptional
string | null

max length 4000

durationMinutesoptional
integer

≥ 5 · ≤ 1440

priceoptional
number

SEK including VAT, at most two decimals.

≥ 0 · ≤ 9999999

sortOrderoptional
integer

Lower comes first.

≥ -100000 · ≤ 100000

isActiveoptional
boolean
isPublicoptional
boolean

Offered on the public booking site.

bookingModeoptional
"day_capacity" | "time_slots" | null

time_slots: the customer picks a start time. day_capacity: the customer picks a day and the work is planned into it.

slotIntervalMinutesoptional
5 | 10 | 15 | 20 | 30 | 60 | null
minHoursAheadoptional
integer | null

≥ 0 · ≤ 720

maxDaysAheadoptional
integer | null

≥ 0 · ≤ 730

resourcesoptional
array of object

Replaces the resources that can perform the service. Resources of other instances are ignored.

at most 200

Response 200

Service

May also return: not_found, invalid_category

curl -X PATCH "https://remindr.se/api/v1/services/{id}" \
  -H 'Content-Type: application/json' \
  -H "Idempotency-Key: $(uuidgen)" \
  -H "Authorization: Bearer $REMINDR_KEY" \
  -d '{ … }'

Add an add-on

POST/services/{id}/addons

Scope: services:write

Parameters

FieldType
{id}required
string (uuid)
Idempotency-Key (header)optional
string

Any unique string, e.g. a UUID. A retry with the same key and the same request gets the first response back, marked Idempotent-Replayed: true, instead of doing the change twice. Kept for 24 hours.

min length 1 · max length 255

Request body(AddonCreate)

FieldType
namerequired
string

min length 1 · max length 200

descriptionoptional
string | null

max length 4000 · default null

durationMinutesoptional
integer

Minutes the add-on adds to the booking.

≥ 0 · ≤ 1440 · default 0

priceoptional
number

SEK including VAT, at most two decimals.

≥ 0 · ≤ 9999999 · default 0

sortOrderoptional
integer

Lower comes first.

≥ -100000 · ≤ 100000 · default 0

isActiveoptional
boolean

default true

isPublicoptional
boolean

default false

Response 201

Addon

May also return: not_found

curl -X POST "https://remindr.se/api/v1/services/{id}/addons" \
  -H 'Content-Type: application/json' \
  -H "Idempotency-Key: $(uuidgen)" \
  -H "Authorization: Bearer $REMINDR_KEY" \
  -d '{ … }'

Update an add-on

PATCH/services/{id}/addons/{addonId}

Only the fields given change.

Scope: services:write

Parameters

FieldType
{id}required
string (uuid)
{addonId}required
string (uuid)
Idempotency-Key (header)optional
string

Any unique string, e.g. a UUID. A retry with the same key and the same request gets the first response back, marked Idempotent-Replayed: true, instead of doing the change twice. Kept for 24 hours.

min length 1 · max length 255

Request body(AddonUpdate)

FieldType
nameoptional
string

min length 1 · max length 200

descriptionoptional
string | null

max length 4000

durationMinutesoptional
integer

Minutes the add-on adds to the booking.

≥ 0 · ≤ 1440

priceoptional
number

SEK including VAT, at most two decimals.

≥ 0 · ≤ 9999999

sortOrderoptional
integer

Lower comes first.

≥ -100000 · ≤ 100000

isActiveoptional
boolean
isPublicoptional
boolean

Offered on the public booking site.

Response 200

Addon

May also return: not_found

curl -X PATCH "https://remindr.se/api/v1/services/{id}/addons/{addonId}" \
  -H 'Content-Type: application/json' \
  -H "Idempotency-Key: $(uuidgen)" \
  -H "Authorization: Bearer $REMINDR_KEY" \
  -d '{ … }'

Delete an add-on

DELETE/services/{id}/addons/{addonId}

Bookings keep their own copy of the add-on.

Scope: services:write

Parameters

FieldType
{id}required
string (uuid)
{addonId}required
string (uuid)
Idempotency-Key (header)optional
string

Any unique string, e.g. a UUID. A retry with the same key and the same request gets the first response back, marked Idempotent-Replayed: true, instead of doing the change twice. Kept for 24 hours.

min length 1 · max length 255

Response 204

No content.

May also return: not_found

curl -X DELETE "https://remindr.se/api/v1/services/{id}/addons/{addonId}" \
  -H "Idempotency-Key: $(uuidgen)" \
  -H "Authorization: Bearer $REMINDR_KEY"

Resources

Staff and other resources that bookings are placed on. Created and named in RemindR Admin.

List resources

GET/resources

Active resources first.

Scope: any read scope

Response 200

A list of Resource

curl -X GET "https://remindr.se/api/v1/resources" \
  -H "Authorization: Bearer $REMINDR_KEY"

Work hours

When each resource works, week by week, and exceptions such as closed days or other hours.

Get a resource's work hours

GET/resources/{id}/work-hours

Scope: schedules:read

Parameters

FieldType
{id}required
string (uuid)

Response 200

A list of WorkHours

May also return: not_found

curl -X GET "https://remindr.se/api/v1/resources/{id}/work-hours" \
  -H "Authorization: Bearer $REMINDR_KEY"

Add work hours

POST/resources/{id}/work-hours

Adds the same hours to each weekday given. Returns all of the resource's work hours. Hours may not overlap others on the same weekday and dates.

Scope: schedules:write

Parameters

FieldType
{id}required
string (uuid)
Idempotency-Key (header)optional
string

Any unique string, e.g. a UUID. A retry with the same key and the same request gets the first response back, marked Idempotent-Replayed: true, instead of doing the change twice. Kept for 24 hours.

min length 1 · max length 255

Request body(WorkHoursCreate)

FieldType
weekdaysrequired
array of integer

The same hours on each of these weekdays.

at least 1 · at most 7

startTimerequired
string

Time of day, HH:MM (24 h).

endTimerequired
string

Time of day, HH:MM (24 h).

validFromoptional
string (date) | null

A date, YYYY-MM-DD, in the instance's time zone.

default null

validTooptional
string (date) | null

A date, YYYY-MM-DD, in the instance's time zone.

default null

Response 201

A list of WorkHours

May also return: not_found, schedule_overlap

curl -X POST "https://remindr.se/api/v1/resources/{id}/work-hours" \
  -H 'Content-Type: application/json' \
  -H "Idempotency-Key: $(uuidgen)" \
  -H "Authorization: Bearer $REMINDR_KEY" \
  -d '{ … }'

Replace all work hours

PUT/resources/{id}/work-hours

Sets the resource's complete work hours in one go: all or nothing. Handy for keeping RemindR in step with another system. Existing bookings are not moved.

Scope: schedules:write

Parameters

FieldType
{id}required
string (uuid)
Idempotency-Key (header)optional
string

Any unique string, e.g. a UUID. A retry with the same key and the same request gets the first response back, marked Idempotent-Replayed: true, instead of doing the change twice. Kept for 24 hours.

min length 1 · max length 255

Request body(WorkHoursReplace)

FieldType
entriesrequired
array of object

The resource's complete work hours. Everything not listed is removed. An empty list removes all.

at most 200

Response 200

A list of WorkHours

May also return: not_found, schedule_overlap

curl -X PUT "https://remindr.se/api/v1/resources/{id}/work-hours" \
  -H 'Content-Type: application/json' \
  -H "Idempotency-Key: $(uuidgen)" \
  -H "Authorization: Bearer $REMINDR_KEY" \
  -d '{ … }'

Delete work hours

DELETE/resources/{id}/work-hours/{entryId}

Scope: schedules:write

Parameters

FieldType
{id}required
string (uuid)
{entryId}required
string (uuid)
Idempotency-Key (header)optional
string

Any unique string, e.g. a UUID. A retry with the same key and the same request gets the first response back, marked Idempotent-Replayed: true, instead of doing the change twice. Kept for 24 hours.

min length 1 · max length 255

Response 204

No content.

May also return: not_found

curl -X DELETE "https://remindr.se/api/v1/resources/{id}/work-hours/{entryId}" \
  -H "Idempotency-Key: $(uuidgen)" \
  -H "Authorization: Bearer $REMINDR_KEY"

List exceptions

GET/schedule-exceptions

Closed days and other hours that have not ended yet, for the whole instance and each resource.

Scope: schedules:read

Parameters

FieldType
fromoptional
string (date)

Exceptions ending on or after this day. Default: today.

resourceIdoptional
string (uuid)

Only this resource's exceptions (instance-wide ones are always included).

Response 200

A list of ScheduleException

curl -X GET "https://remindr.se/api/v1/schedule-exceptions" \
  -H "Authorization: Bearer $REMINDR_KEY"

Add an exception

POST/schedule-exceptions

Closes a period, or sets other hours for it, for one resource or the whole instance. Takes precedence over the weekly work hours. Existing bookings are not moved.

Scope: schedules:write

Parameters

FieldType
Idempotency-Key (header)optional
string

Any unique string, e.g. a UUID. A retry with the same key and the same request gets the first response back, marked Idempotent-Replayed: true, instead of doing the change twice. Kept for 24 hours.

min length 1 · max length 255

Request body(ScheduleExceptionCreate)

FieldType
resourceIdoptional
string (uuid) | null

Null or left out: the whole instance.

default null

startDaterequired
string (date)

A date, YYYY-MM-DD, in the instance's time zone.

endDaterequired
string (date)

A date, YYYY-MM-DD, in the instance's time zone.

kindrequired
"closed" | "custom_hours"

closed: no work at all. custom_hours: only between startTime and endTime.

startTimeoptional
string | null

Required for custom_hours.

default null

endTimeoptional
string | null

Required for custom_hours.

default null

noteoptional
string | null

max length 200 · default null

Response 201

ScheduleException

May also return: not_found

curl -X POST "https://remindr.se/api/v1/schedule-exceptions" \
  -H 'Content-Type: application/json' \
  -H "Idempotency-Key: $(uuidgen)" \
  -H "Authorization: Bearer $REMINDR_KEY" \
  -d '{ … }'

Delete an exception

DELETE/schedule-exceptions/{id}

Scope: schedules:write

Parameters

FieldType
{id}required
string (uuid)
Idempotency-Key (header)optional
string

Any unique string, e.g. a UUID. A retry with the same key and the same request gets the first response back, marked Idempotent-Replayed: true, instead of doing the change twice. Kept for 24 hours.

min length 1 · max length 255

Response 204

No content.

May also return: not_found

curl -X DELETE "https://remindr.se/api/v1/schedule-exceptions/{id}" \
  -H "Idempotency-Key: $(uuidgen)" \
  -H "Authorization: Bearer $REMINDR_KEY"

Bookings

Bookings as staff see them. Placing, moving and cancelling check capacity and work hours, and send the same confirmations as RemindR Admin.

List bookings

GET/bookings

Bookings on the days from from to to, at most 93 days at a time.

Scope: bookings:read

Parameters

FieldType
fromrequired
string (date)

A date, YYYY-MM-DD, in the instance's time zone.

torequired
string (date)

A date, YYYY-MM-DD, in the instance's time zone.

statusoptional
"confirmed" | "cancelled" | "all"

default "confirmed"

resourceIdoptional
string (uuid)

Response 200

A list of Booking

curl -X GET "https://remindr.se/api/v1/bookings" \
  -H "Authorization: Bearer $REMINDR_KEY"

Create a booking

POST/bookings

For a service booked by time slot give startsAt; for one booked by the day give day. Without resourceId the first free resource that can perform the service is chosen. Give an existing customer's id, or the customer's details: a customer with the same mobile number is reused. The instance's confirmation e-mail and SMS are sent as when staff book.

Scope: bookings:write

Parameters

FieldType
Idempotency-Key (header)optional
string

Any unique string, e.g. a UUID. A retry with the same key and the same request gets the first response back, marked Idempotent-Replayed: true, instead of doing the change twice. Kept for 24 hours.

min length 1 · max length 255

Request body(BookingCreate)

FieldType
serviceIdrequired
string (uuid)
addonIdsoptional
array of string (uuid)

at most 20 · default []

dayoptional
string (date)

Required for services booked by the day. Ignored for time slots, where the day follows startsAt.

startsAtoptional
string (date-time)

Required for services booked by time slot.

resourceIdoptional
string (uuid)

A specific resource. Left out: any free resource that can do the service.

customerIdoptional
string (uuid)

An existing customer. Give this or customer.

customeroptional
customerNoteoptional
string | null

max length 2000 · default null

internalNoteoptional
string | null

Only visible to staff.

max length 2000 · default null

smsOptInoptional
boolean

Send SMS confirmation and reminder, if the instance sends them.

default true

emailOptInoptional
boolean

Send e-mail confirmation and reminder, if the instance sends them.

default true

Response 201

Booking

May also return: no_capacity, start_required, day_required, invalid_resource, invalid_customer, invalid_service, invalid_addon, booking_disabled

curl -X POST "https://remindr.se/api/v1/bookings" \
  -H 'Content-Type: application/json' \
  -H "Idempotency-Key: $(uuidgen)" \
  -H "Authorization: Bearer $REMINDR_KEY" \
  -d '{ … }'

Get a booking

GET/bookings/{id}

Scope: bookings:read

Parameters

FieldType
{id}required
string (uuid)

Response 200

Booking

May also return: not_found

curl -X GET "https://remindr.se/api/v1/bookings/{id}" \
  -H "Authorization: Bearer $REMINDR_KEY"

Move or update a booking

PATCH/bookings/{id}

Giving startsAt, day or resourceId moves the booking, checking capacity as for a new one. Notes and opt-ins change as given. No message is sent to the customer.

Scope: bookings:write

Parameters

FieldType
{id}required
string (uuid)
Idempotency-Key (header)optional
string

Any unique string, e.g. a UUID. A retry with the same key and the same request gets the first response back, marked Idempotent-Replayed: true, instead of doing the change twice. Kept for 24 hours.

min length 1 · max length 255

Request body(BookingUpdate)

Giving day, startsAt or resourceId moves the booking; the other fields are updated as given.

FieldType
dayoptional
string (date)

A date, YYYY-MM-DD, in the instance's time zone.

startsAtoptional
string (date-time)

ISO 8601 with offset.

resourceIdoptional
string (uuid) | null

Moves the booking to this resource. Null: any free resource. Left out: keeps the current one if it is free.

customerNoteoptional
string | null

max length 2000

internalNoteoptional
string | null

max length 2000

smsOptInoptional
boolean
emailOptInoptional
boolean

Response 200

Booking

May also return: not_found, no_capacity, start_required, invalid_resource, booking_cancelled

curl -X PATCH "https://remindr.se/api/v1/bookings/{id}" \
  -H 'Content-Type: application/json' \
  -H "Idempotency-Key: $(uuidgen)" \
  -H "Authorization: Bearer $REMINDR_KEY" \
  -d '{ … }'

Cancel a booking

POST/bookings/{id}/cancel

Stops reminders not yet sent and sends the instance's cancellation message. Cancelling a cancelled booking changes nothing.

Scope: bookings:write

Parameters

FieldType
{id}required
string (uuid)
Idempotency-Key (header)optional
string

Any unique string, e.g. a UUID. A retry with the same key and the same request gets the first response back, marked Idempotent-Replayed: true, instead of doing the change twice. Kept for 24 hours.

min length 1 · max length 255

Request body(BookingCancel)

FieldType
reasonoptional
string | null

max length 500 · default null

Response 200

Booking

May also return: not_found

curl -X POST "https://remindr.se/api/v1/bookings/{id}/cancel" \
  -H 'Content-Type: application/json' \
  -H "Idempotency-Key: $(uuidgen)" \
  -H "Authorization: Bearer $REMINDR_KEY" \
  -d '{ … }'

Availability

Free days and start times, as staff see them: the customer booking window (notice, how far ahead) does not apply.

Free days

GET/availability

Days from from to to (at most 63) with room for the service and add-ons.

Scope: bookings:read

Parameters

FieldType
serviceIdrequired
string (uuid)
addonIdoptional
string (uuid) | array of string (uuid)

Add-on ids; repeat the parameter for more than one.

at most 20

fromrequired
string (date)

A date, YYYY-MM-DD, in the instance's time zone.

torequired
string (date)

A date, YYYY-MM-DD, in the instance's time zone.

Response 200

A list of AvailableDay

May also return: invalid_service, invalid_addon

curl -X GET "https://remindr.se/api/v1/availability" \
  -H "Authorization: Bearer $REMINDR_KEY"

Free start times

GET/availability/slots

Start times on a day for a service booked by time slot, each with the resource it would be booked on. Empty for services booked by the day.

Scope: bookings:read

Parameters

FieldType
serviceIdrequired
string (uuid)
addonIdoptional
string (uuid) | array of string (uuid)

Add-on ids; repeat the parameter for more than one.

at most 20

dayrequired
string (date)

A date, YYYY-MM-DD, in the instance's time zone.

Response 200

A list of AvailableSlot

May also return: invalid_service, invalid_addon

curl -X GET "https://remindr.se/api/v1/availability/slots" \
  -H "Authorization: Bearer $REMINDR_KEY"

Models

Me

FieldType
instance
object
key
object

Category

FieldType
id
string (uuid)
name
string
sortOrder
integer

≥ -9007199254740991 · ≤ 9007199254740991

isActive
boolean
serviceCount
integer

≥ -9007199254740991 · ≤ 9007199254740991

CategoryCreate

FieldType
namerequired
string

min length 1 · max length 120

sortOrderoptional
integer

Lower comes first.

≥ -100000 · ≤ 100000 · default 0

isActiveoptional
boolean

default true

CategoryUpdate

FieldType
nameoptional
string

min length 1 · max length 120

sortOrderoptional
integer

Lower comes first.

≥ -100000 · ≤ 100000

isActiveoptional
boolean

Addon

FieldType
id
string (uuid)
name
string
description
string | null
durationMinutes
integer

≥ -9007199254740991 · ≤ 9007199254740991

price
number
sortOrder
integer

≥ -9007199254740991 · ≤ 9007199254740991

isActive
boolean
isPublic
boolean

AddonCreate

FieldType
namerequired
string

min length 1 · max length 200

descriptionoptional
string | null

max length 4000 · default null

durationMinutesoptional
integer

Minutes the add-on adds to the booking.

≥ 0 · ≤ 1440 · default 0

priceoptional
number

SEK including VAT, at most two decimals.

≥ 0 · ≤ 9999999 · default 0

sortOrderoptional
integer

Lower comes first.

≥ -100000 · ≤ 100000 · default 0

isActiveoptional
boolean

default true

isPublicoptional
boolean

default false

AddonUpdate

FieldType
nameoptional
string

min length 1 · max length 200

descriptionoptional
string | null

max length 4000

durationMinutesoptional
integer

Minutes the add-on adds to the booking.

≥ 0 · ≤ 1440

priceoptional
number

SEK including VAT, at most two decimals.

≥ 0 · ≤ 9999999

sortOrderoptional
integer

Lower comes first.

≥ -100000 · ≤ 100000

isActiveoptional
boolean
isPublicoptional
boolean

Offered on the public booking site.

Service

FieldType
id
string (uuid)
categoryId
string (uuid)
categoryName
string
name
string
description
string | null
durationMinutes
integer

≥ -9007199254740991 · ≤ 9007199254740991

price
number
sortOrder
integer

≥ -9007199254740991 · ≤ 9007199254740991

isActive
boolean
isPublic
boolean
bookingMode
"day_capacity" | "time_slots" | null

Null follows the instance's setting.

slotIntervalMinutes
integer | null

Null follows the instance's setting.

≥ -9007199254740991 · ≤ 9007199254740991

minHoursAhead
integer | null

Notice needed, in hours. Null follows the instance's setting.

≥ -9007199254740991 · ≤ 9007199254740991

maxDaysAhead
integer | null

How far ahead it can be booked, in days. Null follows the instance's setting.

≥ -9007199254740991 · ≤ 9007199254740991

addons
array of Addon
resources
array of object

The resources (staff) that can perform the service.

ServiceCreate

FieldType
categoryIdoptional
string (uuid)

An existing category. Give this or categoryName.

categoryNameoptional
string

A category by name; created if there is none. Give this or categoryId.

min length 1 · max length 120

namerequired
string

min length 1 · max length 200

descriptionoptional
string | null

max length 4000 · default null

durationMinutesrequired
integer

≥ 5 · ≤ 1440

pricerequired
number

SEK including VAT, at most two decimals.

≥ 0 · ≤ 9999999

sortOrderoptional
integer

Lower comes first.

≥ -100000 · ≤ 100000 · default 0

isActiveoptional
boolean

default true

isPublicoptional
boolean

default false

bookingModeoptional
"day_capacity" | "time_slots" | null

time_slots: the customer picks a start time. day_capacity: the customer picks a day and the work is planned into it.

default null

slotIntervalMinutesoptional
5 | 10 | 15 | 20 | 30 | 60 | null

default null

minHoursAheadoptional
integer | null

≥ 0 · ≤ 720 · default null

maxDaysAheadoptional
integer | null

≥ 0 · ≤ 730 · default null

resourcesoptional
array of object

Replaces the resources that can perform the service. Resources of other instances are ignored.

at most 200 · default []

ServiceUpdate

FieldType
categoryIdoptional
string (uuid)

An existing category. Give this or categoryName.

categoryNameoptional
string

A category by name; created if there is none. Give this or categoryId.

min length 1 · max length 120

nameoptional
string

min length 1 · max length 200

descriptionoptional
string | null

max length 4000

durationMinutesoptional
integer

≥ 5 · ≤ 1440

priceoptional
number

SEK including VAT, at most two decimals.

≥ 0 · ≤ 9999999

sortOrderoptional
integer

Lower comes first.

≥ -100000 · ≤ 100000

isActiveoptional
boolean
isPublicoptional
boolean

Offered on the public booking site.

bookingModeoptional
"day_capacity" | "time_slots" | null

time_slots: the customer picks a start time. day_capacity: the customer picks a day and the work is planned into it.

slotIntervalMinutesoptional
5 | 10 | 15 | 20 | 30 | 60 | null
minHoursAheadoptional
integer | null

≥ 0 · ≤ 720

maxDaysAheadoptional
integer | null

≥ 0 · ≤ 730

resourcesoptional
array of object

Replaces the resources that can perform the service. Resources of other instances are ignored.

at most 200

Resource

FieldType
id
string (uuid)
name
string
code
string | null

Up to five characters; starts the booking reference.

sortOrder
integer

≥ -9007199254740991 · ≤ 9007199254740991

isActive
boolean

WorkHours

FieldType
id
string (uuid)
weekday
integer

ISO weekday: 1 Monday … 7 Sunday.

≥ 1 · ≤ 7

startTime
string

Time of day, HH:MM (24 h).

endTime
string

Time of day, HH:MM (24 h).

validFrom
string (date) | null

First day the hours apply. Null: from the beginning.

validTo
string (date) | null

Last day the hours apply. Null: until further notice.

WorkHoursCreate

FieldType
weekdaysrequired
array of integer

The same hours on each of these weekdays.

at least 1 · at most 7

startTimerequired
string

Time of day, HH:MM (24 h).

endTimerequired
string

Time of day, HH:MM (24 h).

validFromoptional
string (date) | null

A date, YYYY-MM-DD, in the instance's time zone.

default null

validTooptional
string (date) | null

A date, YYYY-MM-DD, in the instance's time zone.

default null

WorkHoursReplace

FieldType
entriesrequired
array of object

The resource's complete work hours. Everything not listed is removed. An empty list removes all.

at most 200

ScheduleException

FieldType
id
string (uuid)
resourceId
string (uuid) | null

Null: applies to the whole instance, every resource.

startDate
string (date)

A date, YYYY-MM-DD, in the instance's time zone.

endDate
string (date)

A date, YYYY-MM-DD, in the instance's time zone.

kind
"closed" | "custom_hours"
startTime
string | null

Time of day, HH:MM (24 h).

endTime
string | null

Time of day, HH:MM (24 h).

note
string | null

ScheduleExceptionCreate

FieldType
resourceIdoptional
string (uuid) | null

Null or left out: the whole instance.

default null

startDaterequired
string (date)

A date, YYYY-MM-DD, in the instance's time zone.

endDaterequired
string (date)

A date, YYYY-MM-DD, in the instance's time zone.

kindrequired
"closed" | "custom_hours"

closed: no work at all. custom_hours: only between startTime and endTime.

startTimeoptional
string | null

Required for custom_hours.

default null

endTimeoptional
string | null

Required for custom_hours.

default null

noteoptional
string | null

max length 200 · default null

Customer

FieldType
id
string (uuid)
firstName
string
lastName
string | null
phone
string | null
email
string | null

Booking

FieldType
id
string (uuid)
reference
string

Shown to the customer, e.g. A1042.

status
"confirmed" | "cancelled"
day
string (date)

A date, YYYY-MM-DD, in the instance's time zone.

startsAt
string (date-time) | null

Null for bookings by the day (day_capacity).

endsAt
string (date-time) | null

ISO 8601 with offset.

service
object
addons
array of object
durationMinutes
integer

≥ -9007199254740991 · ≤ 9007199254740991

price
number
resource
object
customer
Customer | null
customerNote
string | null
internalNote
string | null
smsOptIn
boolean
emailOptIn
boolean
source
"admin" | "api" | "public" | "sync"
createdAt
string (date-time)

ISO 8601 with offset.

cancelledAt
string (date-time) | null

ISO 8601 with offset.

cancelReason
string | null

CustomerCreate

A customer with the same mobile number is reused as it is; otherwise a new customer is created.

FieldType
firstNamerequired
string

min length 1 · max length 100

lastNameoptional
string | null

max length 100 · default null

phoneoptional
string | null

Mobile number. Swedish numbers may be given without +46.

max length 40 · default null

emailoptional
string (email) | null

max length 320 · default null

BookingCreate

FieldType
serviceIdrequired
string (uuid)
addonIdsoptional
array of string (uuid)

at most 20 · default []

dayoptional
string (date)

Required for services booked by the day. Ignored for time slots, where the day follows startsAt.

startsAtoptional
string (date-time)

Required for services booked by time slot.

resourceIdoptional
string (uuid)

A specific resource. Left out: any free resource that can do the service.

customerIdoptional
string (uuid)

An existing customer. Give this or customer.

customeroptional
customerNoteoptional
string | null

max length 2000 · default null

internalNoteoptional
string | null

Only visible to staff.

max length 2000 · default null

smsOptInoptional
boolean

Send SMS confirmation and reminder, if the instance sends them.

default true

emailOptInoptional
boolean

Send e-mail confirmation and reminder, if the instance sends them.

default true

BookingUpdate

Giving day, startsAt or resourceId moves the booking; the other fields are updated as given.

FieldType
dayoptional
string (date)

A date, YYYY-MM-DD, in the instance's time zone.

startsAtoptional
string (date-time)

ISO 8601 with offset.

resourceIdoptional
string (uuid) | null

Moves the booking to this resource. Null: any free resource. Left out: keeps the current one if it is free.

customerNoteoptional
string | null

max length 2000

internalNoteoptional
string | null

max length 2000

smsOptInoptional
boolean
emailOptInoptional
boolean

BookingCancel

FieldType
reasonoptional
string | null

max length 500 · default null

AvailableDay

FieldType
day
string (date)

A date, YYYY-MM-DD, in the instance's time zone.

free
integer

Free start times (time_slots), or free minutes on the best resource (day_capacity).

≥ -9007199254740991 · ≤ 9007199254740991

AvailableSlot

FieldType
startsAt
string (date-time)

ISO 8601 with offset.

resourceId
string (uuid)

Error

FieldType
error
string

Machine-readable code, e.g. not_found, missing_scope, no_capacity.

detail
string

Human-readable detail, when there is one.