API reference
Every documented endpoint of the modules above, generated from the live OpenAPI document.
This reference is generated from the OpenAPI document published by the API, so it always matches what is deployed. It covers the modules described in the guides.
The same document can be imported into Postman, Insomnia or a client generator. It declares the X-Api-Key header scheme, so authenticated requests work as soon as you add your key.
Only these endpoints are part of the public API. Loupe's own apps call other endpoints that are not published and can change without notice: do not build on requests you observe in the browser.
API keys
/api/authentication/api-keysList the API keys owned by the authenticated user
200 API keys (token value is never returned here)403 No authenticated user/api/authentication/api-keysCreate a new API key; the raw token is returned once in the response
labelrequired | string |
201 API key created; raw token included (shown only once)403 No authenticated user422 Missing, blank or too long label/api/authentication/api-keys/{id}Revoke one of the authenticated user own API keys
idrequired | path · string · uuid |
204 API key revoked (idempotent)403 No authenticated user404 API key not found for this userOrganization
/api/public/organizations/{slug}Get an organization and its settings by slug
slugrequired | path · string |
200 Organization found404 Organization not found/api/public/organizations/{slug}/ils/locationsThe SIGB location directory of an organization, for the public maps
slugrequired | path · string |
200 Locations with their stable locationRef, library and access mode404 Organization not found or Catalog module disabled/api/public/organizations/{slug}/opening-calendarProject effective organization opening hours over a date range
slugrequired | path · string | |
fromrequired | query · string · date | |
torequired | query · string · date |
200 Inclusive effective calendar projection400 Invalid or oversized date rangeEvents
/api/manager/cms-event-registrationsRetrieves the collection of CmsEventRegistration resources.
page | query · integer | The collection page number |
event.id | query · string | |
event.id[] | query · string[] |
200 CmsEventRegistration collection/api/manager/cms-event-registrationsCreates a CmsEventRegistration resource.
201 CmsEventRegistration resource created400 Invalid input422 An error occurred/api/manager/cms-event-registrations/{id}Updates the CmsEventRegistration resource.
idrequired | path · string | CmsEventRegistration identifier |
200 CmsEventRegistration resource updated400 Invalid input404 Not found422 An error occurred/api/manager/cms-event-registrations/{id}Removes the CmsEventRegistration resource.
idrequired | path · string | CmsEventRegistration identifier |
204 CmsEventRegistration resource deleted404 Not found/api/manager/cms-event-registrations/{id}/cancelCancel a CMS event registration and notify the participant
idrequired | path · string · uuid |
reasonrequired | string |
204 Registration cancelled404 Registration not found422 Validation failed/api/manager/cms-eventsCreates a CmsEvent resource.
cover | IRI | null | |
coverPositionY | integer | |
title | string | |
titleFont | "geist" | "anton" | "oswald" | "poppins" | "hahmlet" | … (35 values) | |
slugrequired | string | |
publishedAt | string · date-time | null | |
isPublishedrequired | boolean | |
content | string | |
contentDocument | string | null[] | null | Canonical Tiptap/ProseMirror document; content remains a transition fallback. |
startAt | string · date-time | null | |
endAt | string · date-time | null | |
locationName | string | null | |
locationUrl | string | null | |
onlineUrl | string | null | |
locationType | "none" | "free" | "address" | "map" | |
locationLatitude | number | null | |
locationLongitude | number | null | |
locationAddress | string | null[] | null | |
locationMap | IRI | null | |
locationMapPoint | string | null[] | null | |
speakers | string | null[] | null | |
categories | IRI[] | |
enableRegistration | boolean | |
enableEmailRegistration | boolean | |
membersOnly | boolean | |
capacityGuests | integer | |
capacity | integer | null |
201 CmsEvent resource created400 Invalid input422 An error occurred/api/manager/cms-events/{id}Retrieves a CmsEvent resource.
idrequired | path · string | CmsEvent identifier |
200 CmsEvent resource404 Not found/api/manager/cms-events/{id}Updates the CmsEvent resource.
idrequired | path · string | CmsEvent identifier |
cover | IRI | null | |
coverPositionY | integer | |
title | string | |
titleFont | "geist" | "anton" | "oswald" | "poppins" | "hahmlet" | … (35 values) | |
slug | string | |
publishedAt | string · date-time | null | |
isPublished | boolean | |
content | string | |
contentDocument | string | null[] | null | Canonical Tiptap/ProseMirror document; content remains a transition fallback. |
startAt | string · date-time | null | |
endAt | string · date-time | null | |
locationName | string | null | |
locationUrl | string | null | |
onlineUrl | string | null | |
locationType | "none" | "free" | "address" | "map" | |
locationLatitude | number | null | |
locationLongitude | number | null | |
locationAddress | string | null[] | null | |
locationMap | IRI | null | |
locationMapPoint | string | null[] | null | |
speakers | string | null[] | null | |
categories | IRI[] | |
enableRegistration | boolean | |
enableEmailRegistration | boolean | |
membersOnly | boolean | |
capacityGuests | integer | |
capacity | integer | null |
200 CmsEvent resource updated400 Invalid input404 Not found422 An error occurred/api/manager/cms-events/{id}Removes the CmsEvent resource.
idrequired | path · string | CmsEvent identifier |
204 CmsEvent resource deleted404 Not found/api/manager/cms-events/{id}/cancelCancel a CMS event and notify its participants
idrequired | path · string · uuid |
reasonrequired | string |
204 Event cancelled404 Event not found422 Validation failed/api/manager/cms-events/{id}/duplicateDuplicate a CMS event
idrequired | path · string · uuid |
title | string | null |
201 Event duplicated404 Event not found/api/manager/cms-events/{id}/notify-participantsSend an email notification to all active participants of a CMS event
idrequired | path · string · uuid |
subjectrequired | string | |
bodyrequired | string |
200 Notification sent404 Event not found422 Validation failed/api/manager/statistics/cms-eventsAggregated CMS event and registration statistics
organization | query · string | Organization slug (administrators only; defaults to caller organization) |
from | query · string · date | First day of the period, included (YYYY-MM-DD). Without it, the period has no start. |
to | query · string · date | Last day of the period, included (YYYY-MM-DD). Without it, the period has no end. |
200 CMS event and registration statistics/api/public/cms-event-categoriesRetrieves the collection of CmsEventCategory resources.
page | query · integer | The collection page number |
name | query · string |
200 CmsEventCategory collection/api/public/cms-event-categories/itemRetrieves a CmsEventCategory resource.
200 CmsEventCategory resource404 Not found/api/public/cms-eventsRetrieves the collection of CmsEvent resources.
page | query · integer | The collection page number |
categories.id | query · string | |
categories.id[] | query · string[] | |
title | query · string |
200 CmsEvent collection/api/public/cms-events/{id}/registerRegister a participant to a CMS event
idrequired | path · string · uuid |
confirmationId | string · uuid | null | |
email | string · email | null | |
firstname | string | null | |
lastname | string | null | |
comment | string | null | |
guests | integer | null |
200 Registration created400 Registration disabled, capacity exceeded, or already registered404 Event not found422 Validation failed/api/public/cms-events/itemRetrieves a CmsEvent resource.
200 CmsEvent resource404 Not foundBookings
/api/manager/bookablesCreates a Bookable resource.
cover | IRI | null | |
coverPositionY | integer | |
bookableType | "room" | "equipment" | |
calendarType | "day" | "slot" | |
title | string | |
slugrequired | string | |
publishedAt | string · date-time | null | |
isPublished | boolean | |
autoValidate | boolean | |
enableCheckIn | boolean | |
membersOnly | boolean | |
requireParticipantAccounts | boolean | Sub-requirement of membersOnly: every additional participant must be identified by an active patron account of the organization. Inert unless membersOnly is true AND patron-account access is enabled — no cross-field constraint on purpose, mirroring how a disabled module makes membersOnly itself inert. |
countParticipantQuota | boolean | |
capacityGuests | integer | |
content | string | |
contentDocument | string | null[] | null | Canonical Tiptap/ProseMirror document; content remains a transition fallback. |
locationName | string | null | |
locationUrl | string | null | |
capacity | integer | null | |
slotSize | 15 | 30 | 60 | null | Contain the size time of a single defined slot (in minutes), only if applicable (range) |
maxSlotPerReservation | integer | null | Contain the number of slot that can be reserved in a single process, only if applicable (range) |
minSlotPerReservation | integer | null | |
leadTimeAmount | integer | null | Minimum delay before a reservation may start; the unit decides the semantics (rolling hours, or calendar days at midnight org-time). |
leadTimeUnit | "hours" | "days" | null | |
maxAdvanceDays | integer | null | Booking horizon: the last reservable day is today + maxAdvanceDays (calendar days, organization timezone). Null means unlimited. |
minParticipants | integer | null | Minimum total participants, holder included (a group room may require 2). Declarative: enforced against the declared guests count only. |
equipments | string[] | null | |
settings | string | null[] | null |
201 Bookable resource created400 Invalid input422 An error occurred/api/manager/bookables/{id}Updates the Bookable resource.
idrequired | path · string | Bookable identifier |
cover | IRI | null | |
coverPositionY | integer | |
bookableType | "room" | "equipment" | |
calendarType | "day" | "slot" | |
title | string | |
slug | string | |
publishedAt | string · date-time | null | |
isPublished | boolean | |
autoValidate | boolean | |
enableCheckIn | boolean | |
membersOnly | boolean | |
requireParticipantAccounts | boolean | Sub-requirement of membersOnly: every additional participant must be identified by an active patron account of the organization. Inert unless membersOnly is true AND patron-account access is enabled — no cross-field constraint on purpose, mirroring how a disabled module makes membersOnly itself inert. |
countParticipantQuota | boolean | |
capacityGuests | integer | |
content | string | |
contentDocument | string | null[] | null | Canonical Tiptap/ProseMirror document; content remains a transition fallback. |
locationName | string | null | |
locationUrl | string | null | |
capacity | integer | null | |
slotSize | 15 | 30 | 60 | null | Contain the size time of a single defined slot (in minutes), only if applicable (range) |
maxSlotPerReservation | integer | null | Contain the number of slot that can be reserved in a single process, only if applicable (range) |
minSlotPerReservation | integer | null | |
leadTimeAmount | integer | null | Minimum delay before a reservation may start; the unit decides the semantics (rolling hours, or calendar days at midnight org-time). |
leadTimeUnit | "hours" | "days" | null | |
maxAdvanceDays | integer | null | Booking horizon: the last reservable day is today + maxAdvanceDays (calendar days, organization timezone). Null means unlimited. |
minParticipants | integer | null | Minimum total participants, holder included (a group room may require 2). Declarative: enforced against the declared guests count only. |
equipments | string[] | null | |
settings | string | null[] | null |
200 Bookable resource updated400 Invalid input404 Not found422 An error occurred/api/manager/bookables/{id}Removes the Bookable resource.
idrequired | path · string | Bookable identifier |
204 Bookable resource deleted404 Not found/api/manager/bookables/{id}/closuresList slot closures for a bookable within a range
idrequired | path · string · uuid | |
fromrequired | query · string · date-time | |
torequired | query · string · date-time |
200 Closures overlapping the requested range, ordered by start400 Missing "from" or "to" query parameter403 Bookable of another organization, or missing bookables.read permission404 Bookable not found/api/manager/bookables/{id}/closuresCreate a slot closure for a bookable
idrequired | path · string · uuid |
startAtrequired | string · date-time | |
endAtrequired | string · date-time |
200 Existing matching closure returned201 Closure created400 Missing dates or end not after start404 Bookable not found/api/manager/bookables/{id}/closures/batchCreate and/or delete several slot closures in a single request
idrequired | path · string · uuid |
200 The closures that now exist for the submitted ranges, in submission order; deleted closures are not listed400 A range has end not after start404 Bookable not found422 Validation failed/api/manager/bookables/{id}/duplicateDuplicate a bookable, optionally with a new title
idrequired | path · string · uuid |
title | string | null | Title for the duplicated bookable; falls back to a default when omitted |
201 Bookable duplicated404 Bookable not found/api/manager/reservationsManager reservation directory, 25 rows per page
organizationrequired | query · string | |
locale | query · string | |
q | query · string | Identity search: snapshot name, linked profile, SIGB fullname or email |
period | query · "upcoming" | "history" | "all" | |
status | query · string | |
bookable | query · string · uuid | |
from | query · string · date | |
to | query · string · date | Inclusive calendar date |
page | query · integer |
200 items, totalItems, page and pageSize; ordered by start then UUID400 Invalid filters401 Authentication required403 Organization, permission or module access denied/api/manager/reservations/{id}One reservation with its identity, companion count, retained companions and reservation-wide check-in
idrequired | path · string · uuid | |
organizationrequired | query · string | |
locale | query · string |
200 Reservation row; guests excludes the holder, participantDetails contains retained active companions, checkedInAt applies to the whole reservation401 Authentication required403 Organization, permission or module access denied404 Reservation not found in this organization/api/manager/reservations/{id}Updates the Reservation resource.
idrequired | path · string | Reservation identifier |
validated | boolean |
200 Reservation resource updated400 Invalid input404 Not found422 An error occurred/api/manager/reservations/{id}Removes the Reservation resource.
idrequired | path · string | Reservation identifier |
204 Reservation resource deleted404 Not found/api/manager/reservations/{id}/cancelCancel a reservation as a manager
idrequired | path · string · uuid |
reasonrequired | string |
204 Reservation cancelled404 Reservation not found422 Validation failed/api/manager/reservations/{id}/validateValidate a reservation, optionally reassigning it to another bookable
idrequired | path · string · uuid |
newBookable | string · uuid | null | Id of a bookable to reassign the reservation to before validating |
200 Reservation validated400 Target bookable not found or slot already reserved404 Reservation not found/api/manager/statistics/bookablesAggregated bookable and reservation statistics
organization | query · string | Organization slug (administrators only; defaults to caller organization) |
from | query · string · date | First day of the period, included (YYYY-MM-DD). Without it, the period has no start. |
to | query · string · date | Last day of the period, included (YYYY-MM-DD). Without it, the period has no end. |
200 Bookable and reservation statistics/api/public/bookablesRetrieves the collection of Bookable resources.
page | query · integer | The collection page number |
title | query · string | |
bookableType | query · string | |
bookableType[] | query · string[] | |
equipment | query · string | Filter bookables by equipment. Allowed values: table, paperboard, projector, whiteboard, wheelchair_access, power_outlet. |
200 Bookable collection/api/public/bookables/{id}/checkinNames shown on the on-site check-in page before the patron submits
idrequired | path · string · uuid |
200 Bookable title, organization name and calendar type404 Bookable not found, not published, or check-in disabled/api/public/bookables/{id}/checkinCheck in to a reservation on-site by scanning the printed QR code
idrequired | path · string · uuid |
emailrequired | string · email | |
latituderequired | number | |
longituderequired | number |
200 Reservation checked in (a repeated check-in returns the same reservation)400 Too far from the venue, no open reservation, deadline missed (reservation_expired), or check-in not configured404 Bookable not found, not published, or check-in disabled422 Validation failed/api/public/bookables/{id}/closuresList slot closures for a published bookable within a range
idrequired | path · string · uuid | |
fromrequired | query · string · date-time | |
torequired | query · string · date-time |
200 Closures overlapping the requested range, ordered by start400 Missing "from" or "to" query parameter404 Bookable not found or not published/api/public/bookables/{id}/participants/validateCheck named participants without creating a reservation or sending mail
idrequired | path · string · uuid | |
organizationrequired | query · string |
participants | string · email[] |
200 Email eligibility only; no profile or usage counts403 Authenticated member or organization staff required404 Unavailable resource or feature422 Invalid list429 Retry later/api/public/bookables/{id}/reservationCreate a reservation for a bookable
idrequired | path · string · uuid |
confirmationId | string · uuid | null | |
startAtrequired | string · date-time | |
endAtrequired | string · date-time | |
email | string · email | null | |
firstname | string | null | |
lastname | string | null | |
comment | string | null | |
guests | integer | null | |
participants | string · email[] | Additional participants' emails, one per person, when the bookable requires named participant accounts. `guests` is then derived from this list server-side. |
200 Reservation created400 Slot unavailable, already reserved, or guests exceed capacity404 Bookable not found or not published422 Validation failed/api/public/bookables/availableFind available bookables for a day or a time range
organizationrequired | string | Organization slug |
mode | "day" | "range" | null | Availability mode; inferred as "day" when "date" is provided, otherwise "range" |
date | string · date | null | Day to check (YYYY-MM-DD), required for day mode |
from | string · date-time | null | Range start, required for range mode |
to | string · date-time | null | Range end, required for range mode |
bookableType | "room" | "equipment" | null | |
equipment | string | null |
200 List of available bookables400 Missing or invalid date/range, type, or equipment404 Organization not found/api/public/bookables/itemRetrieves a Bookable resource.
200 Bookable resource404 Not found/api/public/reservationsRetrieves the collection of Reservation resources.
page | query · integer | The collection page number |
bookable.organization.id | query · string | |
bookable.organization.id[] | query · string[] | |
bookable.organization.slug | query · string | |
bookable.organization.slug[] | query · string[] | |
bookable.id | query · string | |
bookable.id[] | query · string[] | |
validated | query · boolean | |
validated[] | query · boolean[] | |
startAt[before] | query · string | |
startAt[strictly_before] | query · string | |
startAt[after] | query · string | |
startAt[strictly_after] | query · string | |
endAt[before] | query · string | |
endAt[strictly_before] | query · string | |
endAt[after] | query · string | |
endAt[strictly_after] | query · string |
200 Reservation collection/api/public/reservations/cancelCancel a reservation by its public token
tokenrequired | query · string |
204 Reservation cancelled (or already cancelled)400 Token is required404 Reservation not found/api/public/reservations/participantsComplete a reservation group as its authenticated holder
participants | string[] | |
participantsAgreement | boolean |
204 Participants added400 Eligibility, quota or capacity refusal403 Not the holder404 Reservation unavailable/api/public/reservations/viewView a reservation by its public token
tokenrequired | query · string |
200 Reservation found400 Token is required404 Reservation not foundPages
/api/manager/cms-pagesCreates a CmsPage resource.
parent | IRI | null | |
cover | IRI | null | |
coverPositionY | integer | |
title | string | |
slugrequired | string | |
publishedAt | string · date-time | null | |
isPublished | boolean | |
isAiIndexable | boolean | |
content | string | |
contentDocument | string | null[] | null | Canonical Tiptap/ProseMirror document; content remains a transition fallback. |
categories | IRI[] |
201 CmsPage resource created400 Invalid input422 An error occurred/api/manager/cms-pages/{id}Retrieves a CmsPage resource.
idrequired | path · string | CmsPage identifier |
200 CmsPage resource404 Not found/api/manager/cms-pages/{id}Updates the CmsPage resource.
idrequired | path · string | CmsPage identifier |
parent | IRI | null | |
cover | IRI | null | |
coverPositionY | integer | |
title | string | |
slug | string | |
publishedAt | string · date-time | null | |
isPublished | boolean | |
isAiIndexable | boolean | |
content | string | |
contentDocument | string | null[] | null | Canonical Tiptap/ProseMirror document; content remains a transition fallback. |
categories | IRI[] |
200 CmsPage resource updated400 Invalid input404 Not found422 An error occurred/api/manager/cms-pages/{id}Removes the CmsPage resource.
idrequired | path · string | CmsPage identifier |
204 CmsPage resource deleted404 Not found/api/manager/cms-pages/{id}/duplicateDuplicate a CMS page
idrequired | path · string · uuid |
title | string | null |
201 Page duplicated404 Page not found/api/public/cms-page-categoriesRetrieves the collection of CmsPageCategory resources.
page | query · integer | The collection page number |
name | query · string |
200 CmsPageCategory collection/api/public/cms-page-categories/itemRetrieves a CmsPageCategory resource.
200 CmsPageCategory resource404 Not found/api/public/cms-page-treePublished page navigation without draft metadata
organizationrequired | query · string | Slug of the organization whose pages are listed. |
200 Published page navigation summaries/api/public/cms-pagesRetrieves the collection of CmsPage resources.
page | query · integer | The collection page number |
categories.id | query · string | |
categories.id[] | query · string[] | |
parent.id | query · string | |
parent.id[] | query · string[] | |
title | query · string | |
exists[parent] | query · boolean |
200 CmsPage collection/api/public/cms-pages/itemRetrieves a CmsPage resource.
200 CmsPage resource404 Not foundCatalogue
/api/public/ils/browseStructured catalog listing (novelties by type/library, recency-sorted) — no keywords, no relevance ranking
organization | string | |
canonicalType | "book" | "comic" | "manga" | "serial" | "score" | … (14 values) | null | Restricts the listing to one document type. |
noveltyAfter | string | null | Only records displayed as novelties since this month ('YYYY-MM'). |
libraryCode | string | null | Owning library code (852 $b / 995 $b), e.g. 'bcur'. |
locationRef | string | null | |
locationCode | string | null | Physical shelf, as a raw ILS location code (852 $c / 949 $4 / 995 $c), e.g. '810010072' — the "what is on this shelf" listing. Codes, not labels. Prefer locationRef for new map associations. |
callNumberRegexes | string[] | Call-number regexes narrowing $locationCode down to ONE physical shelf when several shelves share a location code (the map builder's per-shelf `regexes`). A record matches when any regex matches the call number of a holding AT that location. Ignored without $locationCode; patterns the Postgres regex engine rejects (they are authored/tested as JS regexes in the map builder) are skipped individually rather than failing the listing. |
callNumberRanges | object[] | Call-number ranges narrowing $locationCode down to one shelf, read in shelf order (docs/call-number-order.md): a copy matches when its stored sort key lies from `from` (inclusive) up to `to`, whatever continues `to` included. Either bound may be omitted. A copy matching any range or any regex is kept. Ignored without $locationCode. |
callNumberRanges[].from | string | null | |
callNumberRanges[].to | string | null | |
shelfSegments | object[] | Rayon segments narrowing $locationCode down to one shelf (docs/shelf-model.md): a copy matches when its `shelf` descriptor names this rayon (and order, when given) and its key lies from `from` (inclusive) up to `to` (exclusive). Keys are `loupe-shelf-2` keys; either bound may be omitted. A copy matching any segment, range or regex is kept. Ignored without $locationCode. |
shelfSegments[].rayon | string | |
shelfSegments[].order | string | null | |
shelfSegments[].from | string | null | |
shelfSegments[].to | string | null | |
recordIds | string[] | Records a shelf names directly (an exhibition), by public id (SIGB bibliographic id or harvest source id). They are listed whatever their location, alongside the location's matching copies. |
excludeRecordIds | string[] | Records named by other shelves' selections: they stand there, not on this shelf's rayons, so the listing leaves them out. |
sort | string | 'recency' (default, novelty-first) or 'callNumber' — the physical shelf order, sorted on the call number of the holding matched at $locationCode; requires $locationCode. With shelf segments, copies sort by segment, in the order given, then by shelf key. |
offset | integer | |
limit | integer | |
facets | object[] | Type values are canonical types; genre values are exact catalog labels from /ils/genres or canonical genre slugs; one included publication year or year range ("2025-2026"). |
liveLookups | boolean |
200 Catalog listing422 Validation failed/api/public/ils/genresList the top catalog genres available for an organization
organizationrequired | query · string | |
limit | query · integer |
200 Catalog genres400 Invalid request/api/public/ils/itemFetch a single catalog item by ID (ILS)
organization | string | |
id | string |
200 Catalog item422 Validation failed/api/public/ils/itemsFetch multiple catalog items by ID (ILS)
organization | string | |
ids | object[] |
200 Catalog items422 Validation failed/api/public/ils/searchSearch the library catalog (ILS)
organization | string | |
lang | string | |
sort | object | |
queryField | object | |
queryPrecision | object | |
queryValue | string | |
retrievalMode | string | The model chooses semantic discovery or a structured catalog listing. |
userQuery | string | null | |
facetProvenance | object | |
facetSourceScope | string | null | Opaque identity of the source that resolved these facet values. |
offset | integer | |
limit | integer | |
facets | object[] | Free-form facet payload — interpreted by each provider. Shape: { facetName: { facetValue: operator } } |
semanticQuery | string | null | Optional rewritten semantic THEME of the request, used for the dense (vector) side of the RAG engine when present — richer than the bare `queryValue` keywords ("un polar cosy dans les Alpes" instead of "polar"). The sparse/lexical side and the live provider keep using `queryValue`. |
liveLookups | boolean | Whether indexed (RAG) results wait for the live SIGB lookup (availability, provider covers, catalog URL) before answering. Result grids that never display availability opt out: the harvested notice renders at once and the record detail performs its own live lookup. Live-engine searches ignore it. |
200 Search results422 Validation failed/api/public/ils/typesList the top Loupe catalog types available for an organization
organizationrequired | query · string | |
limit | query · integer |
200 Catalog types400 Invalid requestFootfall
/api/public/organizations/{organizationSlug}/maps/{mapSlug}/affluence/zonesLive occupancy of the affluence zones linked to a map (public)
organizationSlugrequired | path · string | |
mapSlugrequired | path · string |
200 Per-zone live occupancy for the map404 Map not foundMaps
/api/public/organizations/{organizationSlug}/map-placesSearch the named public places of an organization's maps
organizationSlugrequired | path · string | |
qrequired | query · string | |
mapSlug | query · string | |
layerId | query · string | |
storey | query · integer | |
types[] | query · "legend" | "room" | "object" | "box"[] | |
limit | query · integer |
200 Ranked public map places400 Missing or too-short query403 The map module is not enabled404 Unknown organization/api/public/organizations/{organizationSlug}/maps/{mapSlug}Get the public definition of a map by slug
organizationSlugrequired | path · string | |
mapSlugrequired | path · string | |
wire | query · "prototype-v1" | "regional-v15" |
200 Map definition404 Map not found/api/public/organizations/{organizationSlug}/maps/{mapSlug}/layers/{layerId}Get one thematic layer of a public map
Returns the same document as the full map definition, restricted to one layer: its layers list holds only the requested layer, and only the labels and tours of that layer are kept.
organizationSlugrequired | path · string | |
mapSlugrequired | path · string | |
layerIdrequired | path · string | |
wire | query · "prototype-v1" | "regional-v15" |
200 Projected map definition404 Map or layer not found/api/public/organizations/{organizationSlug}/maps/{mapSlug}/renderer-errorsReport a browser GPU failure on a public map
kindrequired | string | |
backendrequired | string | |
renderProfilerequired | string | |
widthrequired | integer | |
heightrequired | integer | |
storeyrequired | integer | |
reason | string | |
errorType | string | |
message | string | |
userAgent | string |
204 Diagnostic recorded404 Map not public422 Invalid diagnostic429 Rate limitedMessages
/api/manager/threadsRetrieves the collection of Thread resources.
page | query · integer | The collection page number |
token | query · string | |
token[] | query · string[] | |
contactName | query · string | |
contactEmail | query · string | |
type | query · string | |
type[] | query · string[] | |
acquisition.acquisitionStatus | query · string | |
acquisition.acquisitionStatus[] | query · string[] |
200 Thread collection/api/manager/threads/{id}Retrieves a Thread resource.
idrequired | path · string | Thread identifier |
200 Thread resource404 Not found/api/manager/threads/{id}Updates the Thread resource.
idrequired | path · string | Thread identifier |
status | "new" | "open" | "pending" | "on_hold" | "resolved" | "closed" | |
assignee | IRI | null | Staff member currently owning the thread. Null = unassigned. Set/cleared via PATCH (IRI or null); SET NULL on user removal so the thread survives. |
priority | "low" | "normal" | "high" | |
contactName | string | |
contactEmail | string |
200 Thread resource updated400 Invalid input404 Not found422 An error occurred/api/manager/threads/{id}Removes the Thread resource.
idrequired | path · string | Thread identifier |
204 Thread resource deleted404 Not found/api/manager/threads/acquisitions/convertConvert a general thread into an acquisition request
threadId | string | |
title | string | |
author | string | null | |
isbn | string | null | |
publisher | string | null | |
publicationYear | integer | null | |
format | string | null | |
notes | string | null |
200 Thread converted400 Thread is already an acquisition request404 Thread not found409 Thread version conflict422 Validation failed428 If-Match header required/api/manager/threads/acquisitions/decideMove an acquisition request through its decision workflow
threadId | string | |
decision | string | `start_review` (re)opens the evaluation; `approve` / `reject` decide; `request_info` hands the ball back to the patron; `mark_transmitted` records the manual push to the ILS. |
reason | string | null | Required when rejecting; optional context otherwise. |
ilsReference | string | null | Required when marking as transmitted. |
200 Decision recorded400 Invalid transition or missing reason/reference404 Thread not found409 Thread version conflict422 Validation failed428 If-Match header required/api/manager/threads/acquisitions/precheckDedup pre-check against the selected organization catalog and open suggestions
organization | string | null | Organization slug — required publicly; managers may select an authorized organization. |
title | string | null | |
isbn | string | null | |
author | string | null | |
excludeThreadId | string | null | Manager only: exclude this thread from the duplicate lookup (self-check). |
200 Pre-check result400 Missing search criteria/api/manager/threads/acquisitions/revertTurn an acquisition request back into a general thread
threadId | string |
200 Thread reverted400 Thread is not an acquisition request404 Thread not found409 Thread version conflict422 Validation failed428 If-Match header required/api/manager/threads/acquisitions/updateEdit the bibliographic fields of an acquisition request
threadId | string | |
title | string | |
author | string | null | |
isbn | string | null | |
publisher | string | null | |
publicationYear | integer | null | |
format | string | null | |
notes | string | null |
200 Acquisition updated400 Thread is not an acquisition request404 Thread not found409 Thread version conflict422 Validation failed428 If-Match header required/api/manager/threads/replyReply to a message thread as a manager
threadId | string | |
message | string | |
kind | string | `reply` = public message sent to the contact; `note` = internal staff-only note (no email, no status change). |
mentionedUserIds | string[] | User ids (UUID) mentioned in an internal note — each is notified. Ignored for public replies. |
200 Reply posted404 Thread not found422 Validation failed/api/manager/threads/startStart a message thread as a manager
organization | string | |
contactEmail | string | |
contactName | string | |
message | string |
201 Thread created422 Validation failed/api/public/threads/acquisitions/precheckCheck whether a suggested document is already held or already suggested
organization | string | null | Organization slug — required publicly; managers may select an authorized organization. |
title | string | null | |
isbn | string | null | |
author | string | null | |
excludeThreadId | string | null | Manager only: exclude this thread from the duplicate lookup (self-check). |
200 Pre-check result400 Missing organization or search criteria/api/public/threads/acquisitions/startSuggest a purchase as a public user (creates an acquisition thread)
organization | string | |
email | string | null | |
name | string | null | |
title | string | |
author | string | null | |
isbn | string | null | |
publisher | string | null | |
publicationYear | integer | null | |
format | string | null | |
comment | string | null | Free-text justification shown as the thread's first message. |
201 Acquisition thread created422 Validation failed/api/public/threads/replyReply to a message thread as a public user
token | string | |
name | string | null | |
message | string |
200 Reply posted404 Thread not found422 Validation failed/api/public/threads/startStart a message thread as a public user
organization | string | |
email | string | null | |
name | string | null | |
message | string |
201 Thread created422 Validation failed/api/public/threads/token/{token}Get a message thread by its public token
tokenrequired | path · string |
200 Thread found404 Thread not found