Deliveries are in the API. Retrieve deliveries of the network, a location, a customer,
or a user, get a delivery, create one with a
photo from create a media upload, update
it, for example to mark it
pickedUp, and delete it. OAuth apps request the new
deliveries.readonly or deliveries scope, and with bearer token authentication the user needs the deliveries area in
locationPermissionLevels of retrieve registrations for the delivery’s location.Plans and resource tiers can require a contract at sign-up. Set
selfSignup.contract.templateRef on create a
plan, update a plan, create a
resource or patch a resource, and a customer who
signs up immediately signs a contract from that template. The subscription starts once the contract is signed, and its first invoice is
issued then. The template must belong to the location of the plan or resource, the location must have eSignature turned on, and the
sign-up type must be immediate. selfSignup is replaced as a whole, so sending it without contract stops requiring one, as does
switching the sign-up type to request. Retrieve a plan, retrieve
plans and get a resource return selfSignup.contract
when a contract is required.Create a booking with Basic
authentication accepts a
paymentMethod, such as external for a payment collected
outside Spacebring, and pays for the booking the way an administrator would, also on a resource only administrators can book. Pass the
membershipRefOwner of the customer the booking is paid for. Before, Basic authentication could create only free bookings and got 403
for any payment method.The new
booking.upcoming webhook is sent an hour before a booking starts, and an hour before each date of a repeating booking, so an
integration can act on every date a resource is booked, such as sending a door code. A repeating booking is a single booking, so
booking.created is sent for it once, with its first date. booking.upcoming carries the date’s own startDate and endDate, and an
id of {bookingId}_{isoDate} for each date after the first, as retrieve bookings returns
them with singleBookings. Only confirmed bookings are sent, and a booking made, paid or rescheduled less than an hour before it starts
is left out, as booking.created, booking.paid or booking.updated already carries it. See
Webhooks.refundPolicy on resources has partialRefunds, and refundPolicy.public has its own for nonmembers: up to five shares refunded when a
booking is canceled after its full refund threshold has passed, each a percent from 1 to 99 and a value threshold. A cancellation gets
back the percent of the longest threshold it still meets, of what the booking was paid with by card, externally, in credits, in day
passes or on an invoice not yet issued, and nothing once every threshold has passed. Day passes are refunded whole, rounded down. Each
threshold must be shorter than value, unless value is noRefund, and a shorter threshold must refund a smaller share. Create a
resource and patch a resource accept them; a
patch that leaves partialRefunds out keeps the current ones, and an empty list removes them. Get a
resource, retrieve resources and resource webhook
payloads return them, as an empty list when there are none. A booking keeps the partial refunds of the policy it was made with. See
Webhooks.Retrieve subscriptions accepts
requested in status, and retrieve a
subscription can return it. A requested subscription is one a person asked for on a
plan that needs an administrator’s approval: it bills nothing, grants no credits or day passes and holds no resource until it is approved.
A request ends as declined when an administrator declines it or nobody answers it within 30 days, and as withdrawn when the person
takes it back; status accepts both too. An approved request is returned as approved, and the subscription the approval created is a
separate one. Without status, the list still returns active, scheduled and incomplete subscriptions only.Location payloads no longer carry
guidance and ticketReplies in supportLemAI. Agents reply to support tickets, each with its own
instructions, so these fields had no effect. supportLemAI.autoAssignTickets stays. See Webhooks.Retrieve resource assignments for a location with a bearer token needs resources
access to the location instead of analytics access, the same access get a resource
assignment needs.
A booking made with basic authentication through create a
booking notifies its owner and attendees when
sendUpdates is all, the default, as a
booking made with a bearer token already did, and attendees added with basic authentication through update a
booking are notified too. Set sendUpdates to none to skip these notifications. The
confirmationEmail options of create a resource and get a
resource now pick the email by the role of the customer the booking is for, not of the person
who made it.companyRequester in retrieve a ticket and retrieve
tickets carries the company’s logo with its key and url when an administrator uploaded
one, and publicLogoUrl derived from the company’s website.A support ticket can be requested for the requester’s company, so every member of the company can read it and comment on it.
userRequester stays the member who opened it. Create a ticket accepts an optional
companyRefRequester, the ID of the requester’s company, and fails with 400 when the requester is not a member of that company or the
ticket’s type is discriminationAndHarassment. Retrieve a ticket and retrieve
tickets return companyRefRequester and companyRequester with the company’s id and title,
and a member sees the tickets requested for their company next to their own. Retrieve tickets also filters by companyRefRequester, one
or more comma-separated company IDs, for support admins of the company’s location and for members of the company. Together with
membershipRefRequester, it lists the tickets that match either one. Members of the company can create a ticket
comment on the ticket. The support.ticket.created webhook carries companyRefRequester
too. A ticket without companyRefRequester stays visible to its requester only. See Webhooks.Campaigns are in the API. Retrieve campaigns and get a
campaign with its delivery statistics, and create,
update, and delete drafts. The API never sends
a campaign: an administrator sends a draft from the admin web portal. OAuth apps request the new
campaigns.readonly or campaigns
scope, and with bearer token authentication the user needs the campaigns area in locationPermissionLevels of retrieve
registrations for the campaign’s locations.Administrators have a
deliveries area in locationPermissionLevels and locationPermissions of retrieve
registrations. Every existing administrator starts out with write, and owners and
super administrators always have it. read lets an administrator see the deliveries kept at their locations, and write also lets them
add, change, and delete them.Retrieve bookings accepts
requested and declined in status. A booking request is what
a person creates when a resource’s booking permission doesn’t let them book it directly, and it holds no time until an administrator
approves it. requested lists the requests waiting for an answer, and declined the ones an administrator declined or nobody answered
before they started. Without status, the list still returns tentative and confirmed bookings only.Administrators have a
visitors area in locationPermissionLevels and locationPermissions of retrieve
registrations. Every existing administrator starts out with write, and owners and
super administrators always have it. With read, an administrator can still retrieve visits,
get requests, and get contacts, but create a
request, create a contact, check in a
visit, and check out a visit fail with 403, and
create a visit and update a visit treat them like any
other member. With none, getting a single visit, request, or contact fails with 403 too, and the lists leave out the locations where
they hold it.Administrators have a
checkIns area in locationPermissionLevels and locationPermissions of retrieve
registrations. Every existing administrator starts out with write, and owners and
super administrators always have it. With read, an administrator can still get a check-in and
retrieve check-ins, but check in, check
out, and update a check-in fail with 403. With
none, getting a check-in fails with 403 too, and retrieving check-ins leaves out the locations where they hold it.An administrator in retrieve registrations has
locationPermissionLevels next to
locationPermissions: the access level they hold in each area of the locations they manage. none hides the area, read shows it
without changes, and write manages it. Analytics is only none or read, and settings only none or write. A permission in
locationPermissions is true only when its area holds the highest level, so an administrator with none and one with read both show
false there.Get a check-in and list check-ins return the new
accessControl value in checkInMethod for a check-in opened when a member unlocked a door through an access control integration.A product and a benefit can have no category. Create a product, update a
product, create a benefit, and update a
benefit accept
categoryRef left out or null. Partially update a
product and partially update a
benefit take a product or a benefit out of its category with categoryRef: null. A
product or a benefit without a category returns categoryRef: null. The categoryRef filter of retrieve
orders and retrieve applications accepts none
next to category IDs, for orders of products and applications for benefits that had no category.The
receiptPdfUrl of a money transaction now expires. A link stops working 190 days after it was issued, whether or not the transaction
is fetched again, and opening it after that fails with 400 and the code receiptLinkExpired. A link issued before this change got an
expiration date somewhere in the 180 days after it, so it keeps working for at least 10 more days. Retrieve a money
transaction and retrieve money
transactions return a new link once the current one is 180 days old, so fetch
the transaction again for the current link rather than storing it.The
locationPermissions of an administrator in retrieve registrations has a
campaigns permission: whether the administrator can manage campaigns in the locations they manage. It starts out with the value of
feed, and owners and super administrators always have it.A resource can have a separate booking window for nonmembers in
bookingWindow.public, with its own enabled, bookAhead, and
minNotice. While bookingWindow.public.enabled is true, a booking of a nonmember follows it instead of the rest of bookingWindow,
even when bookingWindow.enabled is false, and both values are required. Members keep following the rest of bookingWindow. Create a
resource and patch a resource accept it, and
get a resource and retrieve resources return it.
Create a booking, update a booking, and check
resource availability apply it. Retrieve
bookings filters bookings by when they were created with createDate[gt], createDate[gte],
createDate[lt] and createDate[lte], in any order and together with the start and end date filters. With singleBookings, each
occurrence of a repeating booking matches by the date the repeating booking was created. Create a
booking keeps the attendees of a booking an API key or an administrator makes for a
nonmember owner. They were left out before, as they still are when a nonmember books for themselves.A visit’s check-in in list check-ins and get a
check-in returns the host’s email in
visit.userHost.email, and the host’s company in
visit.companyHost with its id and title. visit.companyHost is absent when the host was not a member of a company when the visit
was created.Check in with a
customerRef accepts a past checkInDate to record an arrival nobody checked the
member in for. The member stays checked in from that date until they check out. Send a past checkOutDate as well to create the check-in
as checked out at those dates, even while the member is checked in right now, without the checkInCheckedIn or checkInCheckedOut
webhooks. Get a check-in and list check-ins
return the new backdated value in checkInMethod and checkOutMethod for a past check-in an administrator added in the admin app.Retrieve invoices without
customerRef or locationRef, list invoice
items without customerRef, invoiceRef or locationRef, and retrieve credit
notes without invoiceRef or locationRef return the records of every location in the
network, with the same filters and pagination. Search by q works across the network too. An administrator limited to some locations
still has to pass one of the references.Create an alternative currency and update an alternative
currency accept
null again for the one of exchangeRate and
provider that is not used, and treat it as absent. Since October 20, a request with "provider": null or "exchangeRate": null was
rejected with “The provider is not supported.” or “The exchange rate must be a positive number.”An external payment can record how the money was collected. Pay an invoice and create a money
transaction take an optional
paidBy inside payment.method.external:
bankTransfer, card, cash, check, or paymentLink. The invoice payments in retrieve an
invoice and the transaction in retrieve a money
transaction return it in payment.method.external.paidBy, and the invoice PDF
names it in place of External. Absent when it was not recorded.A check-in in list check-ins, get a check-in,
and everywhere else check-ins are returned has a
checkInMethod and a checkOutMethod: how the customer was checked in and out. The
values are reception for a code entered on the Reception app, manual for an administrator, agent for the AI agent, and api for an
API key or OAuth app. A check-out can also be automatic. The checkInCheckedIn and checkInCheckedOut webhooks carry them as
check_in_method and check_out_method. Check-ins made before methods were recorded have neither.A contract with the
subscription action carries the new subscriptionRef once it is issued, the ID of the subscription it created. Get
a contract, retrieve contracts, and issue a
contract return it, and retrieve a
subscription already links back through contract.id.Update a check-in,
PATCH /check_ins/v1/{checkInId}, changes the checkInDate or
checkOutDate of a check-in, both in the past. checkOutDate is accepted only for a check-in that is checked out. The booking, event
ticket, or visit behind the check-in returns the new dates too. No webhooks are sent.A check-in in list check-ins, get a check-in,
and everywhere else check-ins are returned has a
checkInMethod and a checkOutMethod: how the customer was checked in and out. The
values are reception for a code entered on the Reception app, manual for an administrator, agent for the AI agent, and api for an
API key or OAuth app. A check-out can also be automatic. The checkInCheckedIn and checkInCheckedOut webhooks carry them as
check_in_method and check_out_method. Check-ins made before methods were recorded have neither.Coupons can have a name. Create a coupon and update a
coupon accept an optional
title, and retrieve
coupons and get a coupon return it. A coupon without
a name has no title. Update a coupon now takes title and limitedItems each on its own, so any coupon can be renamed, and an empty
title removes the name. Sending limitedItems still needs a coupon created with limited items enabled. Plans can have a cover image.
Create a media upload, send the file, then pass its key as media[0].key to create a
plan or update a plan. An empty media on update removes the
image. Every plan response, including retrieve plans and retrieve a
plan, carries media with the image’s key and public url. See File
uploads.bufferTime now applies to desks as well as rooms. Create a resource and patch a
resource store it for a hotDesk, dedicatedDesk, or station, and bookings of that desk
keep it free before and after them. Until now a desk dropped the bufferTime sent to it. Other resource types still ignore it. In
retrieve a ticket, a reply an agent posted shows that agent: lemAI carries the new
agentRef with the agent’s ID, and its name and photoUrl are the agent’s. photoUrl is null when the agent has no photo. Replies
posted before agents keep the name Agent and the agent icon, without agentRef.Location payloads carry which billing details customers see at checkout in new fields,
companyBillingDetailsFields for companies and
userBillingDetailsFields for individual users, each with legalName, address, and taxId set to required, optional, or hidden.
The customerBillingDetailsRequired and userBillingDetailsRequired fields are deprecated and will be removed. Until then they are
true only while every field of that customer type is required. See Webhooks.Create a shop category and create a benefit category
need the Settings permission in the location, as reordering categories already did, instead of the Shop or Benefits permission. API keys
are not affected.
The request body of create an alternative currency and update an
alternative currency is now documented as one object with optional
exchangeRate and provider, of which exactly one is required. The same requests are accepted as before, and an unsupported provider
or a rate that is not positive is now reported on altCurrency.provider or altCurrency.exchangeRate with its own message instead of
“Either provider or exchange rate is required.”An invoice item in list invoice items, retrieve an invoice
item and everywhere else items are returned has a
status: the status of the invoice it
is on, as the status filter of list invoice items reads it. An item on no invoice has none.Get posts no longer requires
locationRef. Leave it out to list the posts of every location in the
network where the feed is on, pinned posts first and then newest first. Each location’s feed visibility still applies: API keys see every
location’s posts, and administrators and members see the posts of the locations whose feed they may open.The reference now documents void a credit note,
PUT /billing/credit_notes/v1/{id}/void,
which answers with the voided credit note in the shape retrieve a credit note returns.Get a resource assignment reads one assignment by id, in the shape retrieve
resource assignments lists them, so you can read an assignment back after
updating it. It needs resources access to the assignment’s location. The
reference now also documents delete a resource assignment and delete a
resource, which both answer
204 No Content.The
user of a check-in in retrieve check-ins, get a
check-in, check in and check
out has a deleteDate when the user account was deleted.Retrieve events no longer requires
locationRef. Leave it out to list the events of every
location in the network, with the same date filters and order as before; each event keeps the visibility it has in its own location.
Retrieve tickets no longer requires locationRef, eventRef, customerRef or userRef. Leave
all four out to list the tickets of every location, newest first. API keys see every ticket; administrators see the tickets of the
locations where they have events access and their own tickets elsewhere, and members only their own tickets.Retrieve visits, get contacts and get
requests no longer require
locationRef. Leave it out to list the visits, contacts or pending
requests of every location in the network; visits then come newest visit date first. API keys see every location’s records; administrators
see those of the locations they manage, plus the visits and requests they host elsewhere, and members only their own visits and requests.
Listing contacts without locationRef needs an administrator.Retrieve check-ins no longer requires
locationRef. Leave it out to list the check-ins of
every location in the network. API keys see every check-in, and administrators see the check-ins of the locations they manage.Partially update an event, partially update a
post and partially update a product change
only the fields a request sets and keep the others, so renaming an event, a post or a product no longer means sending the whole record.
They answer
204 No Content; read the result with retrieve an event, get a
post or get a product. Update an
event, update a post and update a
product still replace every field.Partially update a benefit changes only the fields a request sets and keeps the
others, so renaming a benefit no longer means sending the whole benefit. It answers
204 No Content; read the result with retrieve a
benefit. Update a benefit still replaces every
field.Retrieve products no longer requires
locationRef, categoryRef or id. Leave them out to list
the products of every location in the network, newest first; each product’s visibility still applies against its own location. Retrieve
categories no longer requires locationRef; leave it out to list the categories of every
location, grouped by location. Retrieve orders no longer requires locationRef, customerRef or
userRef. Leave all three out to list the orders of every location, newest first, with the status, categoryRef, productRef and
createDate filters. API keys see every order, and administrators their own orders and those of the locations where they have shop
access; a caller who is not an administrator in the network gets 403.Resources have a
refundPolicy with the same shape as duration and schedule: value is the rescheduling policy, and public holds a
separate one for nonmembers, with enabled and value. Create a resource and patch a
resource accept it, and get a resource, retrieve
resources and resource webhook payloads return it. When public.enabled is true, a
booking made for a customer who is not a member of the location follows public.value. A booking keeps the policy it was made with;
moving it to another resource takes that resource’s policy for the customer. refundThreshold is deprecated: responses still return it
with the same value as refundPolicy.value, and a request that sends it without refundPolicy changes refundPolicy.value only. See
Webhooks.With
query, GET /customers/v1 finds customers by the beginning of their phone number again. A query made only of digits, spaces, +,
-, . and brackets is compared by its digits, so +380 67 12 finds +380671234567, and these matches come after email matches.With
query, GET /customers/v1 matches customers by meaning, across a person’s name, about text and company or a company’s title and
website, and by the beginning of their email, instead of matching names, emails and phone numbers by spelling. Customers whose email
starts with the query come first. A query that contains @ or is made only of digits is matched by email only, so it no longer finds a
customer by phone number.Create a resource no longer lists an
id field in its request body. Spacebring has always
given a new resource its own id and ignored the one sent, so requests that still send id keep working and get the same result.Retrieve a package returns one package by its id, with the same fields as retrieve
packages. API keys read any package in the network; members read the packages of the locations
where they are a member, and administrators those of the locations where they have billing access.
Create a company saves the
taxId it is given; before, the company was created without a tax
ID.Retrieve tickets applies
eventRef together with customerRef, returning only that customer’s
tickets for the event. Before, eventRef was ignored when customerRef was set.Update a plan changes only the fields the request sends. It used to reset
commitmentCycles,
credits, dayPasses and setupFee to 0, description to empty and exclusiveAccess to no resources whenever the request left them
out, so a request that renamed a plan also cleared them.With
query, GET /customers/v1 searches members and nonmembers when membershipType is left out, and returns at most 10 matches when
limit is left out, so a single search finds a former customer too. Pass membershipType=member to search current members only, or a
limit of up to 100. Without query, the defaults are unchanged: members only, 100 per page.Retrieve orders ignores spaces around each
status, categoryRef and productRef value and names
the values it rejects: an unknown status reads Invalid status: "shipped". Use one or more of canceled, completed, inProgress, new, pending, separated by commas. (was status should be new, inProgress, completed or canceled.), and a categoryRef or productRef that
is not a UUID reads Invalid categoryRef: "…". Use one or more UUIDs, separated by commas. (was categoryRefs should be uuid. and
productRef should be uuid.). The reference now lists pending, which the status filter already accepted. Retrieve
products ignores spaces around each id the same way, and an id that is not a UUID reads
Invalid id: "…". Use one or more UUIDs, separated by commas. (was productIds should be a list of valid UUIDs.).Retrieve subscriptions no longer requires
locationRef or customerRef. Leave
both out to list the subscriptions of every location in the network, grouped by location, with the status, planRef and createDate
filters; order still needs locationRef. API keys see the subscriptions of every location, and administrators those of the locations
where they have billing access.The
status filter of retrieve invoices, list invoice
items and retrieve credit notes, and the type
filter of list invoice items, ignore spaces around each comma-separated value, and a value they do not accept is reported as Invalid status: "unpaid". Use one or more of draft, issued, paid, voided, separated by commas. instead of status should be draft, issued, paid or voided., and the same way for credit note statuses and item types. Retrieve the upcoming
invoice, list upcoming invoice
items and retrieve a credit note
report invalid parameters as a validationError that lists each rejected field in issues. The upcoming invoice reads Subscription ref is required. or subscriptionRef should be a valid UUID. (was Subscription reference is not valid.), a credit note id that is not a UUID
reads creditNoteId should be a valid UUID. (was Credit note ref is not valid.), and list upcoming invoice items keeps its messages. The
invoice, invoice item and credit note references now document discounts[].promocode.expiration as the { enabled, date } object it has
always been, not a date.GET /customers/v1 takes an optional query that finds customers by a person’s name, email or phone number, a company title, or the
company of a person. Matching is fuzzy and accent-insensitive, the locationRef, type and membershipType filters still apply, and the
response holds at most limit matches, best first, without a nextPageToken. An optional userRef lists the person customers of that
user, one per location they belong to, under the same filters; a userRef that is not a UUID reads userRef should be a valid UUID.. The
type and membershipType filters ignore spaces around each value, and a rejected value is now named with the accepted ones: Invalid type: "person". Use one or more of user, company, separated by commas. (was type should be user or company.), and the same for
membershipType (was membershipType should be member or nonmember.).Retrieve benefits no longer requires
locationRef or categoryRef. Leave both out to list
the benefits of every location in the network, newest first; each benefit’s visibility still applies against its own location.
categoryRef on its own now only returns benefits of the caller’s network. Retrieve
categories no longer requires locationRef; leave it out to list the categories of every
location. Retrieve applications no longer requires a filter: without locationRef,
benefitRef, customerRef or userRef, API keys see the applications of every location, administrators those of the locations where
they have benefits access and their own, and other users their own. Applications of a deleted location no longer appear in any list,
including the lists by benefit, customer or user.Retrieve resources and retrieve bookings trim
spaces around each
type and status value, and their error now names the rejected values and the accepted ones, for example Invalid type: "castle". Use one or more of …, separated by commas. (was type is not valid., and status is not valid. for status). The
reference lists the accepted values from the same list the API checks. Bookings returned by retrieve
bookings, get a booking, create a
booking and update a booking always include
isCheckInRequired, as the reference documents: a free booking on a resource without auto-release now returns false instead of leaving
the field out.Retrieve visits, get contacts and get
requests report invalid parameters as a
validationError that lists each rejected field in
issues, with the same messages as before. Retrieve a visit, get a
contact and retrieve a request report an id that is
not a UUID the same way. Two messages now name the actual problem: a locationRef that is not a UUID on retrieve visits reads The locationRef should be a valid UUID. (was The locationRef is required.), and a visitId that is not a UUID reads visitId should be a valid UUID. (was visitId is required.). The visit reference now documents that location.address is null for a location without an
address.Retrieve coupons, get a coupon, retrieve
promocodes, get a promocode, and retrieve
redemptions reject an invalid parameter with a
validationError whose issues name the
field, instead of an invalidParams error. The type filter of retrieve coupons takes the product types a coupon applies to, such as
roomBookings,shopProducts, as it always has; the reference now lists them, spaces around each value are ignored, and the error names the
values it rejects. Retrieve redemptions caps limit at 100. In redemptions, limitedRedemption.usage of the coupon and promocode is 0
instead of missing when nothing was counted yet, customer.user.photoUrl is null for a member without a photo, and the reference marks
customer.user.name and surname optional, as a member who has not set them has neither.Retrieve events documents the
createDate, startDate and endDate filters it already
accepted, and reports invalid parameters as a validationError that lists each rejected field in issues, with the same messages as
before. Retrieve an event and retrieve a ticket
report an id that is not a UUID the same way. Retrieve tickets trims spaces around each status
value and names the rejected value and the accepted ones in its error. The event ticket reference no longer lists
payment.method.paymentGateway.location and payment.method.external.location, which tickets never returned.Retrieve tickets no longer requires
locationRef. Leave it out to list the tickets of every
location in the network, sorted by order as before. API keys see every ticket; administrators see the tickets of the locations where
they have support access and their own tickets elsewhere, and members only their own tickets.PayTabs joins the payment gateways. Create a money transaction charges a
customer’s saved PayTabs card with
payment.method.paymentGateway.gateway set to paytabs, and
bookings, orders, event
tickets, invoice payments, and money transactions paid
through PayTabs return paytabs as their payment gateway. The location in location webhooks includes paytabsConnectionStatus.Retrieve an alternative currency returns one alternative
currency by its id, with the same fields as retrieve alternative
currencies. It takes the
invoices.readonly or invoices scope.Revoking tokens now follows RFC 7009. Send
token in an x-www-form-urlencoded body
with your client_id and client_secret, as you do when you get or refresh a token. A token in the query string is ignored, and the
GET variant of the endpoint is removed. You can revoke only tokens issued to your own client. Revoking a refresh token now also stops it
from issuing new access tokens.Create a resource assignment and update a resource
assignment now end the assignment at 23:59 on the day of
endDate, in the time
zone of the location, as assignments from subscriptions do. An assignment that ends on a day now overlaps another that starts that day.Create a ticket accepts Basic authentication, so an integration can create a support ticket for
a member without acting as a user. With Basic authentication,
userRefRequester is required, and the ticket and its ticketCreated
activity have no creator.Retrieve packages no longer requires
locationRef. Leave it out to list the packages of
every location in the network, newest first. A member sees the packages of the locations where they are a member.Retrieve contracts no longer requires
customerRef or locationRef. Leave both out to
list the contracts of every location in the network; status, createDate and the q title search still apply. Administrators see the
contracts of the locations where they have billing access, and members their own contracts. Retrieve
templates no longer requires locationRef; leave it out to list the templates of every
location in the network.Retrieve coupons no longer requires
locationRef. Leave it out to list the coupons of every
location in the network, or pass only customerRef to list the coupons of that customer’s location. Retrieve
promocodes lists the promocodes of every location when both locationRef and couponRef
are left out. API keys see the coupons and promocodes of every location, and administrators those of the locations where they have billing
access. Retrieve guides no longer requires locationRef. Leave it out to list the guides of
every location in the network, newest first. Each guide’s visibility still applies, against the guide’s own location.Retrieve plans no longer requires
locationRef. Leave it out to list the plans of every location
in the network. As with one location, API keys see every plan, administrators also see the plans without self sign-up in the locations
where they have billing access, and everyone else sees only plans with self sign-up enabled.Events can have a
ticketsPerAttendee limit on how many tickets one attendee can get. Retrieve
events and retrieve an event return it, and leave it
out when the event is unlimited. Create an event and update an
event accept it; omit it to make the event unlimited, including on an update. Purchasing more
tickets than the limit is rejected with the eventTicketsPerAttendeeExceeded error.Locations no longer set a booking window for each resource type, so a resource whose
bookingWindow.enabled is false has none: users
can book it up to its start and any time ahead. While enabled is true, its minNotice and bookAhead apply as before. Create a
booking, update a booking, and check resource
availability follow the resource’s window, which create a
resource, patch a resource, get a
resource, and retrieve resources carry in
bookingWindow.The
roomBookAhead, deskBookAhead, officeBookAhead, parkingBookAhead, and equipmentBookAhead fields of location payloads, and the
*BookingPeriod fields already deprecated in their favor, are deprecated and will be removed. Bookings no longer follow them: each
resource has its own bookingWindow. See Webhooks.Retrieve resources and retrieve bookings no
longer require
locationRef. Leave it out to list the resources or bookings of every location in the network; the other filters, such as
type, status, and the date ranges, still apply. Retrieve bookings also accepts userRefOwner on its own, for the bookings a user made
in any location, and customerRef or companyRefOwner on their own, for the bookings in the customer’s location. Update a
booking can extend a booking paid with invoice, or add seats to it, after its invoice is
issued. The extra charge goes on a new pending invoice item and appears as its own entry in the booking’s payments, with its
method.invoice.invoiceItemRef. Shortening such a booking or moving it to another resource still fails. When delete a
booking refunds a booking whose invoice is issued, it removes the pending invoice items of its
extensions.Retrieve tickets and retrieve a ticket return
checkOutDate, the time the attendee last checked out. It is cleared when the attendee checks in again, so a ticket with a checkInDate
and no checkOutDate belongs to an attendee who is checked in.Update a money transaction accepts
internalNote, a note about the payment that
only administrators see, such as how an external payment was collected. It can be changed on any money transaction, together with status
or on its own, and an empty string clears it. status is now optional, and a request must contain internalNote or status. The request
now needs the Billing permission in the transaction’s location instead of Customers, including to approve or cancel a pending external
payment. Retrieve a money transaction and retrieve money
transactions return internalNote to administrators.The
customer of a resource assignment includes the company logo and the user’s photoUrl in retrieve resource
assignments, create a resource
assignment, update a resource
assignment, retrieve resources, and
get a resource.Create a money transaction charges a customer’s saved PayPal card with
payment.method.paymentGateway.gateway set to paypal.Create a resource and patch a resource accept a
bookingStepMinutes of 60 for rooms, conference rooms, event spaces, meeting rooms, phone booths, and studios, next to 5, 10, 15, and 30.Create a resource and patch a resource accept
a
bookingStepMinutes of 60 for rooms, conference rooms, event spaces, meeting rooms, phone booths, and studios, next to 5, 10, 15, and
30.
Create a booking invites people from outside the location. Each attendee is either an existing
user, { "user": { "id": "…" } }, or a person by email, { "user": { "email": "…", "name": "…", "surname": "…" } }. A person invited
by email is matched to the user with that email or added as a new user, and attends without a membership in the location. An id that
is not an existing user is rejected with the attendeeNotValid error, and an existing user who is not a member of the location is
now kept as an attendee instead of being left out.Update a subscription and update a subscription
item ignore the deprecated
discounts field of an item when the request carries
grantedDiscounts, so sending an item back as it was returned, with its grantedDiscounts edited, keeps exactly the coupons in that
list. Before, the discounts percentages the response derives from a granted coupon re-created that coupon when grantedDiscounts was
emptied in the same request. A request without grantedDiscounts still applies discounts.A user whose profile the authorized user may not see is now left out of transactions instead of being returned with
null fields, the
same as in bookings. The user object (customer.user, userCreatedBy, userOwner, a refund’s or a booking’s user) and every reference
to them (userRefOwner, userRefCreator, customerRefCreatedBy, membershipRef, membershipRefCreator) are omitted. Admins of the
location and requests authenticated with an API key still get every user.Transactions retrieved with an OAuth2 access token respect the privacy settings of the users they embed. When the authorized user is not
an admin of the location, another user’s
name, surname, photoUrl, about, email, and phoneNumber are null unless that user
shares their profile, email, or phone number with them. Requests authenticated with an API key are unchanged. This applies to retrieve
credit transactions, retrieve a credit
transaction, retrieve day pass
transactions, retrieve a day pass
transaction, retrieve money
transactions, retrieve a money
transaction, retrieve scheduled credits
transactions, and retrieve scheduled day pass
transactions.Retrieve visits filters by visitor with
userRefVisitor, the id of the user who visits, as
returned in each visit’s userRefVisitor.A booking paid by invoice carries
payments[].method.invoice.invoiceRef, the invoice its invoice item was added to. It is not set while
the item is pending. This applies to get a booking, retrieve
bookings, create a booking, and update a
booking.List invoice items accepts
invoiceRef to list the items of one invoice, in place of
customerRef or locationRef or together with them. They page and sort like the rest of the list, and the other filters still apply.List invoice items lists pending invoice items with
pending=true, for one customer with
customerRef or for a whole location with locationRef. List upcoming invoice
items is deprecated: use list invoice items with pending=true and customerRef
instead. It keeps working for existing integrations. Listing the items of one invoice (GET /billing/invoices/v1/{invoiceId}/items) is no
longer in the API reference and keeps working too. In list invoice items, createDate[gte] and createDate[lte] filter by when the item
was created, while status, issueDate[gte], and issueDate[lte] filter by the invoice the item is on.The OpenAPI spec lists the OAuth2 authorization, token, and refresh URLs on
https://oauth2.spacebring.com/api/oauth2/, the same URLs the
authentication page documents. The https://api.spacebring.com/oauth2/ URLs it listed before
reach the same endpoints and keep working, so existing integrations need no change.Location
media follows the order administrators arrange the photos and videos in, and the first one is the location’s cover. Media added
since the last arrangement comes first, newest first, which is the order every location returned before. This applies to get a
location, retrieve all locations, and the
location in webhook payloads.Update a subscription item with
grantedDiscounts now keeps exactly the
coupons in the list, and an empty list removes them all. Before, a coupon the item carried as a product-type percentage discount, the
deprecated discounts field, came back after the update.A resource can charge different prices on some weekdays.
pricingRules lists the rules, each with the days it covers and the money
and credits tiers that replace the regular ones for a booking starting on one of those days, in the location’s time zone. Pass it when
you create a resource or patch a resource: the
list replaces the current rule, an empty list removes it, and a patch without it keeps it. The list holds at most one rule, a rule must
select at least one day, and a rule keeps only the prices the resource charges, so its money tiers are dropped while money is disabled
and its credits tiers while credits are disabled. Get a resource returns the rules, and
create a booking prices the booking with the rule covering its start day. Dynamic pricing
still applies on top of the day’s tiers.Invoice items carry
issueDate, when their invoice was issued. It is returned once the item is on an issued invoice: list invoice
items, retrieve an invoice item, retrieve
an invoice, and issue an invoice.List invoice items accepts
pending. With true it returns only pending items, the ones not
on an invoice and not part of a subscription, and with false only the rest.A resource can have its own booking window. Create a resource and patch a
resource accept
bookingWindow, and get a resource
and retrieve resources return it. While bookingWindow.enabled is true, minNotice, how
many minutes before it starts a booking has to be made, and bookAhead, how far ahead users can book (oneDay, twoDays, oneWeek,
twoWeeks, oneMonth, threeMonths, sixMonths, oneYear, or unlimited), replace the ones the location sets for the resource type,
and both are required. While it is false, the resource follows its location and keeps its own values. Create a
booking, update a booking, and check resource
availability apply the resource’s window.Location payloads carry how far ahead users can book in new fields,
roomBookAhead, deskBookAhead, officeBookAhead,
parkingBookAhead, and equipmentBookAhead, with the values oneDay, twoDays, oneWeek, twoWeeks, oneMonth, threeMonths,
sixMonths, oneYear, and unlimited. The roomBookingPeriod, deskBookingPeriod, officeBookingPeriod, parkingBookingPeriod, and
equipmentBookingPeriod fields and their BOOKING_PERIOD_* values are deprecated and will be removed. Until then they keep the same
values. See Webhooks.Invoice items carry the
customer they are billed to, with the company name in title for a company and the member in user, the same
way invoices do. It is returned wherever an invoice item is: list invoice items, retrieve an
invoice item, create an invoice item,
list upcoming invoice items, retrieve the upcoming
invoice, retrieve an invoice, and
issue an invoice.A membership’s
role is read-only. Administrators are managed on the Administrators page, so create a
membership and update a membership no
longer take role, and role is no longer required on create. A role sent in the request is ignored and never changes the user’s
administrator access. The role returned by retrieve a membership and the other
membership endpoints still says whether the user administers the location, and removing a membership no longer removes that access.Update a booking can move a booking paid by card or externally to a pricier resource with
resourceRef. The difference is charged as a separate money transaction, the way an extension is: the booking stays tentative while the
charge is pending, and a failed charge returns it to its previous resource and interval. A move to a resource with a lower price is still
rejected with bookingMovePriceMismatch, and a move while an extra charge is pending is rejected with bookingPaymentPending.Ticket comment and guide attachments can be uploaded through the API. Create an upload for a file of any type up to 50 MB with ticket
comments or guides, send the
file to the presigned URL with the headers returned, then pass the returned key in
activity.attachments when you create a ticket
comment within 25 minutes, or in attachments when you create a
guide or update a guide within an hour. A key that is
unknown, expired, already attached, or uploaded by another network now fails with 400 and the code fileUploadNotFound, where a ticket
comment returned 404 and a guide dropped the attachment, and one whose file is still in transit fails with 409 and
fileUploadPending. See File uploads for the full flow.Retrieve resource assignments no longer returns an assignment that a
subscription reserved during a checkout that expired without completing. Such a reservation never held the resource, as creating or
updating an assignment already ignored it once expired, but it stayed in the list until it was deleted, which could take days.
Check-ins are part of the API. Retrieve check-ins lists a location’s check-ins, newest
arrival first, filtered by arrival date,
status, type, or userRef, and get a check-in
returns one by its id. Check in records an arrival for a booking, an event ticket, a visit, or a
member’s subscription, found by its check-in id, by a location and a six-digit code, or by a location and a customerRef, and check
out records the departure. They come with their own OAuth scopes: reading needs checkIns.readonly
or checkIns, and checking in or out needs checkIns. With a bearer token, the user must be an administrator of the check-in’s location.Contract template files can be uploaded through the API. Create a template upload for
a .docx file of up to 50 MB, send the file to the presigned URL, then pass the returned key as
template.file.key when you create a
template or update a template. A key that is
unknown, expired, already used, or uploaded by another network now fails with 400 and the code fileUploadNotFound instead of 404,
and one whose file is still in transit with 409 and fileUploadPending. An update that replaces the file fails with 409 and the code
conflict when another request replaced it first. See File uploads for the full flow.Product, resource, guide, and post media and company logos can be uploaded through the API. Create an upload with
products, resources,
guides, posts, or
companies, send the file to the presigned URL, then attach it:
media[0].key on a
product, a key in media on a resource or a post, a Markdown image with the returned url in a guide description, or logo.key on a
company. Guides and posts also take MP4, QuickTime, and WebM videos up to 50 MB. Create a
company and update a company now accept logo,
where null removes it, and companies return logo with its key and url. An attached key that is unknown, expired, or already used
fails with fileUploadNotFound, and one whose file is still in transit with fileUploadPending. See File
uploads for the full flow.A resource can have up to 10 images.
media lists them in display order, and imageUrl is the URL of the first one, the resource’s
cover. When you create a resource or patch a
resource, media sets the whole list in the order given, so send the current keys in a new
order to reorder the images, or an empty list to remove them all. A patch without media keeps the current images. Before, a patch used
only the first key in media and ignored an empty list. See Get a resource.Retrieve bookings sorts by cancellation with
order=deleteDate:desc or
order=deleteDate:asc. The list then holds only cancelled bookings, ordered by their deleteDate, and status defaults to canceled.
It works with every lookup the endpoint supports, but not with singleBookings, which returns a validation error as it does for
createDate.Location and resource schedules can stay open past midnight. A schedule item’s
hours.to is counted from the start of its weekday, so a
day open from 6:00 PM to 2:00 AM returns from: "18:00:00" and to: "26:00:00", at most 24 hours after from. Parse hours.to as a
number of hours and minutes rather than as a time of day. Bookings inside such a day can run past midnight, and a hot desk booking spends
one day pass per seat for each schedule day it covers. See Get a location and Get a
resource.Orders can carry the
external payment method, which an administrator uses to record a payment collected outside Spacebring, such as cash
or a bank transfer. When getting an order or retrieving orders,
such an order returns payment.method.type as external and the paying customer in payment.method.external.customer. When the payment
is recorded as still owed, payment.status stays pending until it is marked as paid. The shop.order.created and shop.order.paid
webhooks carry the same payment with type set to external.Update a booking paid by card or externally to extend it or add seats. The added part is
charged as a separate money transaction, so
payments lists one entry per charge, the booking stays tentative while the charge is
pending, and a failed charge returns the booking to its previous interval instead of canceling it. Shortening such a booking is still
rejected with bookingDurationChangeNotAllowed for users and is not refunded for administrators, and a change to the duration or seats
while a payment is pending is rejected with bookingPaymentPending. See Get a booking for the
payments field.The
benefit.application.created payload always includes the benefit object with the applied benefit’s id and title, so an
integration no longer has to treat it as optional. No other field of the payload changes. See Webhooks.Shop orders paid through a payment gateway are created with the
pending status and move to new once the payment succeeds. Pass
status=pending when you retrieve orders to list them; the default status filter still excludes
them. Updating a pending order fails with a validation error until its payment completes.Check resource availability before creating a booking. Send the
startDate and
endDate of the slot, plus quantity for seat-based resources such as hot desks, entire to check a whole office, or recurrence RRULE
lines for a repeating slot. The response returns available, and when the slot cannot be booked, a reason with the code and message
the booking would fail with, such as bookingConflict or bookingScheduleConflict. The same capacity, schedule, duration, and booking
window rules as booking creation apply.Event cover images can be uploaded through the API. Create a media upload to get a
presigned URL, send the file to it, then pass the returned
key as media[0].key when creating or updating an event. Creating or
updating an event with a key that is unknown, not yet uploaded, or expired now fails with the fileUploadNotFound code, or
fileUploadPending while the file is still in transit, instead of saving the event without an image. See File
uploads for the full flow.Transactions share one response format across credits, day passes, and money, and money transactions can now be updated and refunded through the API:
- All transaction responses:
customeridentifies the company or user the transaction belongs to,productlinks the transaction to its booking, ticket, order, invoice, or subscription and carries a displaytitle, anduserCreatedBynames who created it - Credits and day pass transactions:
amountssplits a charge across the expiring and permanent balances it was deducted from - Money transactions:
paymentcarries the payment method, price, surcharge, refunds, dispute, and whether the payment is still refundable, alongside top-levelcurrencyCode,customerName,customerTaxId,customerAddress, andreceiptPdfUrl - New money routes: update a money transaction to approve or cancel a pending external payment, and refund a money transaction fully or partially through the payment gateway it was paid with
membershipRef,companyRef,company,user, anduserOwner— usecustomerandcustomer.userinsteadmembershipRefCreator,userCreator, anduserRefCreator— useuserCreatedByinstead- The
booking,ticket,order,invoice,plan, andcreditPackageembeds — useproductinstead expiringAmountandpermanentAmounton credits transactions — useamountsinsteadpaymentMethod,refund,refunds,billingAddressBy, andbillingAddressToon money transactions — usepayment.method,payment.refunds,locationAddress, andcustomerAddressinsteadmembershipRefandcompanyRefin transaction list queries and in create credit or day pass transaction requests — passcustomerRefinstead
Create booking requests accept a
paymentMethod with the external type to record a payment collected outside Spacebring. Pass
external.status as succeeded to confirm the booking, or pending to keep it tentative until the payment is marked as paid. Spacebring
issues the invoice once the payment is confirmed.New webhook event types for events, alongside the existing
event.created:event.updated— sent when an event’s details changeevent.canceled— sent when an event is canceledevent.deleted— sent when an event is deleted
cancelDate and deleteDate. Select the new event types for your endpoint in Network Settings > Developers.Support ticket assignees are now users instead of memberships. The membership-based assignee fields are deprecated and will be removed in a future release:
- Ticket responses:
membershipAssigneeandmembershipRefAssigneeare deprecated — useuserAssigneeanduserRefAssigneeinstead - Ticket activity responses:
data.membershipAssigneeanddata.previousAttributes.membershipAssigneeare deprecated — usedata.userAssigneeanddata.previousAttributes.userAssigneeinstead - Update ticket assignee requests:
ticket.membershipRefAssigneeis deprecated — passticket.userRefAssigneewith the ID of the user to assign, ornullto unassign
New API routes for floors management:
- Retrieve a list of all floors
- Delete a floor
- Retrieve, create, get, update, and delete coupons
- Retrieve, create, get, and archive promocodes
- Retrieve promocode redemptions
New API routes for credit notes management:
- Issue, preview and update credit notes
- Update, delete, duplicate, issue, void, and resend invoices
- Cancel a payment on an invoice
- Retrieve an upcoming invoice preview
- Search invoices by code or number
- Retrieve, update, and delete invoice items
- List invoice items by invoice, scheduled, or upcoming
- Retrieve a single guide or list of all guides
- Add, modify, and delete guides
Manage subscriptions with ease! With new API routes, you can:
- Retrieve subscription data
- Add, modify, and delete subscription items
- Patch subscription details, as advance invoicing, pause payment collection etc.
Check out new ways to manage visitors! With new API routes, you can:
- Check in and check out visitors
- Create visit requests
- Approve and reject requests
- Register contacts
Comprehensive social feed management capabilities:• Feed Posts Management
– Create, retrieve, update, and delete feed posts seamlessly
– Browse all posts with filtering by hashtags and pagination• Interactive Comments System
– Add, retrieve, and manage comments on any feed post
– Enable rich discussions and community engagement• Social Engagement Features
– Like and unlike both posts and commentsBuild dynamic social experiences and foster community engagement with these powerful feed management tools!
Introducing comprehensive support and subscription management capabilities:• Support
– Open, update, and close support tickets effortlessly• Subscription Plans
– Create, modify, and monitor customer plansUnlock new possibilities for customer service and subscription management with these robust tools!
Major expansion in product catalog and event coordination features:• Product & Order Management
– Add or modify products with a single call
– Place, track, and update orders seamlessly• Event Management
– Schedule events, manage details, and publish updatesTransform how you handle events—streamline operations like never before!
Powerful new capabilities for benefits administration and visitor insights:• Benefits & Applications
– Create, organize, and update benefit and their categories
– Submit and review user applications in one go• Visitor Tracking
– Capture and query visitors dataEnhance your platform with better benefits and visitor management!
Introducing New API & WebhooksWe’re thrilled to introduce the newly redesigned Spacebring API, built from the ground up to help you create more powerful, seamless integrations and automated workflows.Expanded Endpoints: Take advantage of the restructured existing endpoints and many new ones to build more flexible, custom integrations.
Webhook Support: Receive real-time event notifications, enabling faster and more responsive interactions.
Improved Documentation: Get up and running with the development process more quickly thanks to helpful explanations in our newly added guides.