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 SoftwareSpa SoftwareMed SpaAppointment SchedulingGraphQLCRMPaymentsSelf-Care

APIs

Boulevard Admin API - Clients & CRM

Query and mutate client (customer) records synced from Boulevard's CRM - profiles, contact details, custom fields, loyalty point balances, and appointment history. Third parties...

Boulevard Admin API - Appointments, Staff & Locations

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...

Boulevard Admin API - Memberships & Packages

Access recurring membership and prepaid package data - plan status, renewal state, and entitlements. Membership lifecycle changes are also pushed outbound as MEMBERSHIP_CREATED,...

Boulevard Admin API - Payments, Gift Cards & Vouchers

Issue and manage stored-value gift cards, service vouchers, and account credit adjustments as a certified payment facilitator. Documented mutations include `CreateGiftCard`, `vo...

Boulevard Client API - Booking Cart & Checkout

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...

Boulevard Client API - Catalog & Availability

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...

Boulevard Tokenization API

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...

Collections

GraphQL

Boulevard GraphQL APIs

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

Pricing Plans

Boulevard Plans Pricing

5 plans

PLANS

Rate Limits

Boulevard Rate Limits

4 limits

RATE LIMITS

FinOps

Resources

🔗
DomainSecurity
DomainSecurity
👥
GitHubOrganization
GitHubOrganization
🔗
LinkedIn
LinkedIn
🔗
Website
Website
🔗
Documentation
Documentation
🔗
Plans
Plans
🔗
RateLimits
RateLimits
🔗
FinOps
FinOps
📰
Blog
Blog

Sources

apis.yml Raw ↑
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