{
  "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
}
