Home
Boulevard
Boulevard
Boulevard is a client experience platform purpose-built for appointment-based self-care businesses - hair salons, spas, medspas, barbershops, and nail salons. The platform covers self-scheduling, CRM, marketing, payments (as a certified PayFac), and reporting. Boulevard exposes its integration surface as GraphQL - a Client API for building custom booking experiences and an Admin API for syncing business operations data (clients, appointments, staff, locations, memberships, gift cards) - plus a separate Tokenization API for PCI-scope-reducing card capture. API access is gated to the Enterprise tier and provisioned through a developer sandbox (business ID + API key) via the Boulevard Developer Portal.
7 APIs
0 Features
Salon Software Spa Software Med Spa Appointment Scheduling GraphQL CRM Payments Self-Care
Query and mutate client (customer) records synced from Boulevard's CRM - profiles, contact details, custom fields, loyalty point balances, and appointment history. Third parties...
Read and sync appointment, staff, and location data across a business's calendar - past, current, and future appointments, professional rosters, and the physical/virtual locatio...
Access recurring membership and prepaid package data - plan status, renewal state, and entitlements. Membership lifecycle changes are also pushed outbound as MEMBERSHIP_CREATED,...
Issue and manage stored-value gift cards, service vouchers, and account credit adjustments as a certified payment facilitator. Documented mutations include `CreateGiftCard`, `vo...
Build custom, on-brand self-booking experiences on top of a cart workflow - create a cart for a location, add a selected purchasable (service) item, reserve an available timeslo...
Public-facing catalog reads that power a booking widget before a client ever creates a cart - business and location lookup, bookable service categories, staff/professional listi...
A narrow, non-GraphQL REST endpoint (`POST https://vault.blvd.co/cards/tokenize`, confirmed in the public `promotion-demo` reference client's source) used to exchange raw card d...
Boulevard exposes two distinct, confirmed GraphQL surfaces plus one adjacent REST endpoint. All three require an Enterprise-tier Boulevard account and are provisioned through th...
GRAPHQL
Sources
opencollection: 1.0.0
info:
name: Boulevard API
version: 2020-01
request:
auth:
type: bearer
token: '{{apiKey}}'
headers:
- key: Boulevard-Business-Id
value: '{{businessId}}'
items:
- info:
name: Admin API - Clients & CRM
type: folder
items:
- info:
name: Get client by ID
type: graphql
graphql:
url: https://dashboard.boulevard.io/api/2020-01/admin
query: "query GetClient($id: ID!) {\n client(id: $id) {\n id\n firstName\n lastName\n email\n phone\n\
\ loyaltyPointsBalance\n customFields { key value }\n }\n}"
variables: '{"id": "{{clientId}}"}'
docs: 'Confirmed public API reference path: graphql-admin-api/api-reference/queries/client.'
- info:
name: List clients updated since
type: graphql
graphql:
url: https://dashboard.boulevard.io/api/2020-01/admin
query: "query ListClients($updatedSince: DateTime, $first: Int) {\n clients(updatedSince: $updatedSince, first: $first)\
\ {\n id\n firstName\n lastName\n email\n updatedAt\n }\n}"
variables: '{"updatedSince": "2026-06-01T00:00:00Z", "first": 50}'
docs: Incremental client sync for CRM/marketing integrations.
- info:
name: updateClient mutation
type: graphql
graphql:
url: https://dashboard.boulevard.io/api/2020-01/admin
query: "mutation UpdateClient($input: UpdateClientInput!) {\n updateClient(input: $input) {\n id\n customFields\
\ { key value }\n }\n}"
variables: '{"input": {"clientId": "{{clientId}}", "customFields": [{"key": "loyalty_points", "value": 250}]}}'
docs: Confirmed mutation name per Extole's Boulevard integration guide - writes loyalty/referral custom-field state back
into Boulevard.
- info:
name: Admin API - Appointments, Staff & Locations
type: folder
items:
- info:
name: List appointments for a location
type: graphql
graphql:
url: https://dashboard.boulevard.io/api/2020-01/admin
query: "query ListAppointments($locationId: ID, $status: AppointmentStatus, $since: DateTime) {\n appointments(locationId:\
\ $locationId, status: $status, since: $since) {\n id\n status\n startAt\n endAt\n client { id firstName\
\ lastName }\n staff { id displayName }\n }\n}"
variables: '{"locationId": "{{locationId}}", "status": "CONFIRMED", "since": "2026-07-01T00:00:00Z"}'
docs: Backs webhook-driven integrations reacting to APPOINTMENT_CREATED / APPOINTMENT_CONFIRMED / APPOINTMENT_COMPLETED
events.
- info:
name: List locations and staff
type: graphql
graphql:
url: https://dashboard.boulevard.io/api/2020-01/admin
query: "query ListLocations {\n locations {\n id\n name\n timezone\n staff { id displayName bookable }\n\
\ }\n}"
variables: '{}'
docs: Full location and staff roster for a business.
- info:
name: Admin API - Memberships & Packages
type: folder
items:
- info:
name: List active memberships for a client
type: graphql
graphql:
url: https://dashboard.boulevard.io/api/2020-01/admin
query: "query ListMemberships($clientId: ID, $status: MembershipStatus) {\n memberships(clientId: $clientId, status:\
\ $status) {\n id\n planName\n status\n renewsAt\n entitlements { service { name } remainingUses }\n\
\ }\n}"
variables: '{"clientId": "{{clientId}}", "status": "ACTIVE"}'
docs: Membership lifecycle also pushed outbound as MEMBERSHIP_CREATED / MEMBERSHIP_CANCELLED / MEMBERSHIP_RENEWAL_SUCCEEDED
webhooks.
- info:
name: Admin API - Payments, Gift Cards & Vouchers
type: folder
items:
- info:
name: CreateGiftCard mutation
type: graphql
graphql:
url: https://dashboard.boulevard.io/api/2020-01/admin
query: "mutation CreateGiftCard($input: CreateGiftCardInput!) {\n createGiftCard(input: $input) {\n id\n code\n\
\ currentBalance\n status\n }\n}"
variables: '{"input": {"locationId": "{{locationId}}", "clientId": "{{clientId}}", "amount": 50.00}}'
docs: Confirmed mutation name per Extole's Boulevard integration guide.
- info:
name: createAccountCreditAdjustment mutation
type: graphql
graphql:
url: https://dashboard.boulevard.io/api/2020-01/admin
query: "mutation AdjustAccountCredit($input: CreateAccountCreditAdjustmentInput!) {\n createAccountCreditAdjustment(input:\
\ $input) {\n id\n resultingBalance\n adjustmentReason\n }\n}"
variables: '{"input": {"clientId": "{{clientId}}", "locationId": "{{locationId}}", "adjustmentReason": "REFERRAL_REWARD",
"balanceDelta": 10.00}}'
docs: Confirmed mutation name per Extole's Boulevard integration guide.
- info:
name: vouchersCreate mutation
type: graphql
graphql:
url: https://dashboard.boulevard.io/api/2020-01/admin
query: "mutation CreateVouchers($input: VouchersCreateInput!) {\n vouchersCreate(input: $input) {\n id\n status\n\
\ expiresAt\n }\n}"
variables: '{"input": {"clientId": "{{clientId}}", "locationId": "{{locationId}}", "serviceIds": ["{{serviceId}}"],
"quantity": 1}}'
docs: Confirmed mutation name per Extole's Boulevard integration guide.
- info:
name: Client API - Catalog & Availability
type: folder
items:
- info:
name: Get business and locations
type: graphql
graphql:
url: https://dashboard.boulevard.io/api/2020-01/client
query: "query GetBusiness {\n business {\n id\n name\n locations { id name address { city state } }\n }\n\
}"
variables: '{}'
docs: Mirrors the book-sdk Businesses module.
- info:
name: List bookable service categories
type: graphql
graphql:
url: https://dashboard.boulevard.io/api/2020-01/client
query: "query ListServiceCategories($locationId: ID!) {\n serviceCategories(locationId: $locationId) {\n id\n \
\ name\n services { id name durationMinutes priceStartingAt bookableOnline }\n }\n}"
variables: '{"locationId": "{{locationId}}"}'
docs: Mirrors the book-sdk Services module.
- info:
name: Get bookable dates for a cart
type: graphql
graphql:
url: https://dashboard.boulevard.io/api/2020-01/client
query: "query GetBookableDates($cartId: ID!, $month: String!) {\n bookableDates(cartId: $cartId, month: $month) {\n\
\ date\n hasAvailability\n }\n}"
variables: '{"cartId": "{{cartId}}", "month": "2026-08"}'
docs: 'Confirmed SDK method name: cart.getBookableDates().'
- info:
name: Get bookable times for a date
type: graphql
graphql:
url: https://dashboard.boulevard.io/api/2020-01/client
query: "query GetBookableTimes($cartId: ID!, $date: String!) {\n bookableTimes(cartId: $cartId, date: $date) {\n \
\ startAt\n staff { id displayName }\n }\n}"
variables: '{"cartId": "{{cartId}}", "date": "2026-08-15"}'
docs: 'Confirmed SDK method name: cart.getBookableTimes(date).'
- info:
name: Client API - Booking Cart & Checkout
type: folder
items:
- info:
name: CreateCart mutation
type: graphql
graphql:
url: https://dashboard.boulevard.io/api/2020-01/client
query: "mutation CreateCart($input: CreateCartInput!) {\n createCart(input: $input) {\n id\n status\n }\n}"
variables: '{"input": {"locationId": "{{locationId}}"}}'
docs: Confirmed mutation name, found in Boulevard/promotion-demo source (src/blvd.js).
- info:
name: AddCartSelectedPurchasableItem mutation
type: graphql
graphql:
url: https://dashboard.boulevard.io/api/2020-01/client
query: "mutation AddCartItem($input: AddCartSelectedPurchasableItemInput!) {\n addCartSelectedPurchasableItem(input:\
\ $input) {\n id\n items { id service { name } price }\n }\n}"
variables: '{"input": {"cartId": "{{cartId}}", "itemId": "{{serviceId}}"}}'
docs: Confirmed mutation name, found in Boulevard/promotion-demo source (src/blvd.js).
- info:
name: reserveCartTimeslot mutation
type: graphql
graphql:
url: https://dashboard.boulevard.io/api/2020-01/client
query: "mutation ReserveTimeslot($input: ReserveCartTimeslotInput!) {\n reserveCartTimeslot(input: $input) {\n id\n\
\ status\n reservedStartAt\n }\n}"
variables: '{"input": {"cartId": "{{cartId}}", "startAt": "2026-08-15T14:00:00Z"}}'
docs: Modeled from the book-sdk method cart.reserve(timeslot); exact GraphQL mutation name not independently confirmed.
- info:
name: AddCartCardPaymentMethod mutation
type: graphql
graphql:
url: https://dashboard.boulevard.io/api/2020-01/client
query: "mutation AddCardPaymentMethod($input: AddCartCardPaymentMethodInput!) {\n addCartCardPaymentMethod(input: $input)\
\ {\n id\n status\n }\n}"
variables: '{"input": {"cartId": "{{cartId}}", "paymentToken": "{{paymentToken}}"}}'
docs: Confirmed mutation name, found in Boulevard/promotion-demo source (src/blvd.js). Takes the token returned by the
Tokenization API.
- info:
name: CheckoutCart mutation
type: graphql
graphql:
url: https://dashboard.boulevard.io/api/2020-01/client
query: "mutation CheckoutCart($input: CheckoutCartInput!) {\n checkoutCart(input: $input) {\n confirmationCode\n\
\ appointment { id startAt status }\n }\n}"
variables: '{"input": {"cartId": "{{cartId}}"}}'
docs: Confirmed mutation name, found in Boulevard/promotion-demo source (src/blvd.js).
- info:
name: Tokenization API
type: folder
items:
- info:
name: Tokenize a card
type: http
http:
method: POST
url: https://vault.blvd.co/cards/tokenize
body:
type: json
data: '{"number": "4242424242424242", "expMonth": 12, "expYear": 2028, "cvc": "123"}'
docs: Confirmed literal endpoint (this.tokenizeUrl) found in Boulevard/promotion-demo source. REST, not GraphQL. Returns
a reusable token to pass into AddCartCardPaymentMethod, keeping raw card data out of the integrator's PCI scope.
bundled: true