Queries

Queries

car

Returns: Car

Argument Type Description
id ID!
Query
query Car($id: ID!) {
  car(id: $id) {
    id
    bodyType
    color
    createdAt
    customerId
    isMember
    lastVisitedAt
    make
    customer {
      id
      city
      country
      createdAt
    }
    lastVisitedLocation {
      id
      cashEnabled
      city
      companyId
    }
    membership {
      id
      active
      cancelAt
      carLimit
    }
  }
}
Variables
{
  "id": "abc123"
}
Response
{
  "data": {
    "car": {
      "id": "abc123",
      "bodyType": "example",
      "color": "example",
      "createdAt": "2026-01-15T14:30:00.000Z",
      "customerId": "def456",
      "isMember": true,
      "lastVisitedAt": "2026-01-15T14:30:00.000Z",
      "make": "example",
      "customer": {
        "id": "abc123",
        "city": "example",
        "country": "example",
        "createdAt": "2026-01-15T14:30:00.000Z"
      },
      "lastVisitedLocation": {
        "id": "abc123",
        "cashEnabled": true,
        "city": "example",
        "companyId": "ghi789"
      },
      "membership": {
        "id": "abc123",
        "active": true,
        "cancelAt": "2026-01-15T14:30:00.000Z",
        "carLimit": 1
      }
    }
  }
}

cars

Returns: CarPage!

Argument Type Description
input CarsQueryInput
Query
query Cars {
  cars {
    nodes {
      id
      bodyType
      color
      createdAt
    }
    pageInfo {
      endCursor
      hasNextPage
      hasPreviousPage
      startCursor
    }
  }
}
Response
{
  "data": {
    "cars": {
      "nodes": [
        {
          "id": "abc123",
          "bodyType": "example",
          "color": "example",
          "createdAt": "2026-01-15T14:30:00.000Z"
        }
      ],
      "pageInfo": {
        "endCursor": "example",
        "hasNextPage": true,
        "hasPreviousPage": true,
        "startCursor": "example"
      }
    }
  }
}

customer

Get a single RollerUp customer by ID

Returns: RollerupCustomer

Requires permission: customers:view

Argument Type Description
id ID! Customer ID
Query
query Customer($id: ID!) {
  customer(id: $id) {
    id
    city
    country
    createdAt
    email
    externalBillingId
    isActiveMember
    isExternallyManaged
    notes {
      id
      archivedAt
      createdAt
      customerId
    }
    subscriptions {
      id
      billingCustomerId
      billingFrequency
      billingSubscriptionId
    }
  }
}
Variables
{
  "id": "abc123"
}
Response
{
  "data": {
    "customer": {
      "id": "abc123",
      "city": "example",
      "country": "example",
      "createdAt": "2026-01-15T14:30:00.000Z",
      "email": "jane@example.com",
      "externalBillingId": "def456",
      "isActiveMember": true,
      "isExternallyManaged": true,
      "notes": [
        {
          "id": "abc123",
          "archivedAt": "2026-01-15T14:30:00.000Z",
          "createdAt": "2026-01-15T14:30:00.000Z",
          "customerId": "ghi789"
        }
      ],
      "subscriptions": [
        {
          "id": "abc123",
          "billingCustomerId": "jkl012",
          "billingFrequency": "example",
          "billingSubscriptionId": "abc123"
        }
      ]
    }
  }
}

customers

Search for RollerUp customers using flexible filters. Supports searching by name, email, phone,
license plate, and last four digits of payment method. Results are paginated using
cursor-based pagination.

Returns: CustomersPage!

Requires permission: customers:view

Argument Type Description
input CustomersInput! Search parameters and pagination options
Query
query Customers($input: CustomersInput!) {
  customers(input: $input) {
    nodes {
      id
      city
      country
      createdAt
    }
    pageInfo {
      endCursor
      hasNextPage
      hasPreviousPage
      startCursor
    }
  }
}
Variables
{
  "input": {
    "email": "jane@example.com",
    "first": 25
  }
}
Response
{
  "data": {
    "customers": {
      "nodes": [
        {
          "id": "abc123",
          "city": "example",
          "country": "example",
          "createdAt": "2026-01-15T14:30:00.000Z"
        }
      ],
      "pageInfo": {
        "endCursor": "example",
        "hasNextPage": true,
        "hasPreviousPage": true,
        "startCursor": "example"
      }
    }
  }
}

discount

Retrieve a single discount by its unique ID

Returns: Discount!

Requires permission: discounts:view

Argument Type Description
id ID!
Query
query Discount($id: ID!) {
  discount(id: $id) {
    id
    amountOff
    createdAt
    duration
    durationInMonths
    maxRedemptions
    name
    percentOff
    availabilitySchedule {
      durationMinutes
      endDate
      rrule
      startDate
    }
  }
}
Variables
{
  "id": "abc123"
}
Response
{
  "data": {
    "discount": {
      "id": "abc123",
      "amountOff": 1,
      "createdAt": "2026-01-15T14:30:00.000Z",
      "duration": "FOREVER",
      "durationInMonths": 1,
      "maxRedemptions": 1,
      "name": "example",
      "percentOff": 1,
      "availabilitySchedule": {
        "durationMinutes": 1,
        "endDate": "2026-01-15T14:30:00.000Z",
        "rrule": "FREQ=MONTHLY;BYMONTHDAY=1",
        "startDate": "2026-01-15T14:30:00.000Z"
      }
    }
  }
}

discounts

Query discounts with pagination support. Returns a paginated list of discounts.
Supports optional filtering by name, active status, and expiration date range.

Returns: DiscountPage!

Requires permission: discounts:view

Argument Type Description
input DiscountQueryInput
Query
query Discounts {
  discounts {
    nodes {
      id
      amountOff
      createdAt
      duration
    }
    pageInfo {
      endCursor
      hasNextPage
      hasPreviousPage
      startCursor
    }
  }
}
Response
{
  "data": {
    "discounts": {
      "nodes": [
        {
          "id": "abc123",
          "amountOff": 1,
          "createdAt": "2026-01-15T14:30:00.000Z",
          "duration": "FOREVER"
        }
      ],
      "pageInfo": {
        "endCursor": "example",
        "hasNextPage": true,
        "hasPreviousPage": true,
        "startCursor": "example"
      }
    }
  }
}

employee

Get an employee by their unique identifier

Returns: Employee!

Argument Type Description
id ID!
Query
query Employee($id: ID!) {
  employee(id: $id) {
    id
    createdAt
    externalId
    isActive
    name
    updatedAt
    car {
      id
      bodyType
      color
      createdAt
    }
  }
}
Variables
{
  "id": "abc123"
}
Response
{
  "data": {
    "employee": {
      "id": "abc123",
      "createdAt": "2026-01-15T14:30:00.000Z",
      "externalId": "def456",
      "isActive": true,
      "name": "example",
      "updatedAt": "2026-01-15T14:30:00.000Z",
      "car": {
        "id": "abc123",
        "bodyType": "example",
        "color": "example",
        "createdAt": "2026-01-15T14:30:00.000Z"
      }
    }
  }
}

employees

Get a list of employees

Returns: EmployeesPage!

Argument Type Description
input EmployeesInput
Query
query Employees {
  employees {
    nodes {
      id
      createdAt
      externalId
      isActive
    }
    pageInfo {
      endCursor
      hasNextPage
      hasPreviousPage
      startCursor
    }
  }
}
Response
{
  "data": {
    "employees": {
      "nodes": [
        {
          "id": "abc123",
          "createdAt": "2026-01-15T14:30:00.000Z",
          "externalId": "def456",
          "isActive": true
        }
      ],
      "pageInfo": {
        "endCursor": "example",
        "hasNextPage": true,
        "hasPreviousPage": true,
        "startCursor": "example"
      }
    }
  }
}

fleet

Unstable Fleet features are in active development and may change without warning

Returns: Fleet

Requires permission: fleets:view

Argument Type Description
id ID!
Query
query Fleet($id: ID!) {
  fleet(id: $id) {
    id
    businessName
    city
    contactName
    country
    createdAt
    customerId
    description
    company {
      id
      features
      maxCarsPerFamilyMembership
      name
    }
    createdBy {
      id
      createdAt
      externalId
      isActive
    }
    customer {
      id
      city
      country
      createdAt
    }
  }
}
Variables
{
  "id": "abc123"
}
Response
{
  "data": {
    "fleet": {
      "id": "abc123",
      "businessName": "example",
      "city": "example",
      "contactName": "example",
      "country": "example",
      "createdAt": "2026-01-15T14:30:00.000Z",
      "customerId": "def456",
      "description": "example",
      "company": {
        "id": "abc123",
        "features": [
          "example"
        ],
        "maxCarsPerFamilyMembership": 1,
        "name": "example"
      },
      "createdBy": {
        "id": "abc123",
        "createdAt": "2026-01-15T14:30:00.000Z",
        "externalId": "ghi789",
        "isActive": true
      },
      "customer": {
        "id": "abc123",
        "city": "example",
        "country": "example",
        "createdAt": "2026-01-15T14:30:00.000Z"
      }
    }
  }
}

fleets

Unstable Fleet features are in active development and may change without warning

Returns: FleetPage!

Requires permission: fleets:view

Argument Type Description
input FleetsQueryInput
Query
query Fleets {
  fleets {
    nodes {
      id
      businessName
      city
      contactName
    }
    pageInfo {
      endCursor
      hasNextPage
      hasPreviousPage
      startCursor
    }
  }
}
Response
{
  "data": {
    "fleets": {
      "nodes": [
        {
          "id": "abc123",
          "businessName": "example",
          "city": "example",
          "contactName": "example"
        }
      ],
      "pageInfo": {
        "endCursor": "example",
        "hasNextPage": true,
        "hasPreviousPage": true,
        "startCursor": "example"
      }
    }
  }
}

group

Returns: Group

Argument Type Description
id ID!
Query
query Group($id: ID!) {
  group(id: $id) {
    id
    description
    isAdmin
    name
    permissions
    slug
  }
}
Variables
{
  "id": "abc123"
}
Response
{
  "data": {
    "group": {
      "id": "abc123",
      "description": "example",
      "isAdmin": true,
      "name": "example",
      "permissions": [
        "example"
      ],
      "slug": "example"
    }
  }
}

groups

Returns: [Group!]!

Query
query Groups {
  groups {
    id
    description
    isAdmin
    name
    permissions
    slug
  }
}
Response
{
  "data": {
    "groups": [
      {
        "id": "abc123",
        "description": "example",
        "isAdmin": true,
        "name": "example",
        "permissions": [
          "example"
        ],
        "slug": "example"
      }
    ]
  }
}

isCarActive

Returns: Boolean!

Argument Type Description
plate String!
state String!
Query
query IsCarActive($plate: String!, $state: String!) {
  isCarActive(plate: $plate, state: $state)
}
Variables
{
  "plate": "example",
  "state": "example"
}
Response
{
  "data": {
    "isCarActive": true
  }
}

listOwnerPlans

Query owner plans with pagination support. Returns a paginated list of simple
owner plans without nested relations to avoid N+1 queries.

Returns: SimpleOwnerPlansPage!

Requires permission: owner-plans:view

Argument Type Description
input ListOwnerPlansInput
Query
query ListOwnerPlans {
  listOwnerPlans {
    nodes {
      id
      city
      createdAt
      description
    }
    pageInfo {
      endCursor
      hasNextPage
      hasPreviousPage
      startCursor
    }
  }
}
Response
{
  "data": {
    "listOwnerPlans": {
      "nodes": [
        {
          "id": "abc123",
          "city": "example",
          "createdAt": "2026-01-15T14:30:00.000Z",
          "description": "example"
        }
      ],
      "pageInfo": {
        "endCursor": "example",
        "hasNextPage": true,
        "hasPreviousPage": true,
        "startCursor": "example"
      }
    }
  }
}

listOwnerVisits

Returns: OwnerVisitsPage!

Requires permission: owner-plans:view

Argument Type Description
input ListOwnerVisitsInput!
Query
query ListOwnerVisits($input: ListOwnerVisitsInput!) {
  listOwnerVisits(input: $input) {
    nodes {
      id
      createdAt
    }
    pageInfo {
      endCursor
      hasNextPage
      hasPreviousPage
      startCursor
    }
  }
}
Variables
{
  "input": {
    "ownerPlanId": "def456"
  }
}
Response
{
  "data": {
    "listOwnerVisits": {
      "nodes": [
        {
          "id": "abc123",
          "createdAt": "2026-01-15T14:30:00.000Z"
        }
      ],
      "pageInfo": {
        "endCursor": "example",
        "hasNextPage": true,
        "hasPreviousPage": true,
        "startCursor": "example"
      }
    }
  }
}

location

Get a location by ID. Requires ‘locations:view’ permission

Returns: Location

Requires permission: locations:view

Argument Type Description
id ID!
Query
query Location($id: ID!) {
  location(id: $id) {
    id
    cashEnabled
    city
    companyId
    createdAt
    externalId
    interiorEnabled
    isVirtual
  }
}
Variables
{
  "id": "abc123"
}
Response
{
  "data": {
    "location": {
      "id": "abc123",
      "cashEnabled": true,
      "city": "example",
      "companyId": "def456",
      "createdAt": "2026-01-15T14:30:00.000Z",
      "externalId": "ghi789",
      "interiorEnabled": true,
      "isVirtual": true
    }
  }
}

locations

Query locations with pagination. Requires the ‘locations:view’ permission

Returns: LocationPage!

Requires permission: locations:view

Argument Type Description
input LocationQueryInput Pagination parameters for the location query
Query
query Locations {
  locations {
    nodes {
      id
      cashEnabled
      city
      companyId
    }
    pageInfo {
      endCursor
      hasNextPage
      hasPreviousPage
      startCursor
    }
  }
}
Response
{
  "data": {
    "locations": {
      "nodes": [
        {
          "id": "abc123",
          "cashEnabled": true,
          "city": "example",
          "companyId": "def456"
        }
      ],
      "pageInfo": {
        "endCursor": "example",
        "hasNextPage": true,
        "hasPreviousPage": true,
        "startCursor": "example"
      }
    }
  }
}

membership

Get a single membership by ID. Returns null if not found.

Returns: Membership

Requires permission: customers:view

Argument Type Description
id ID! Membership ID
Query
query Membership($id: ID!) {
  membership(id: $id) {
    id
    active
    cancelAt
    carLimit
    createdAt
    currentPeriodEnd
    currentPeriodStart
    endedAt
    membershipCars {
      id
      createdAt
      nickname
      removingAt
    }
    price {
      id
      amount
      archivedReason
      availableInPos
    }
  }
}
Variables
{
  "id": "abc123"
}
Response
{
  "data": {
    "membership": {
      "id": "abc123",
      "active": true,
      "cancelAt": "2026-01-15T14:30:00.000Z",
      "carLimit": 1,
      "createdAt": "2026-01-15T14:30:00.000Z",
      "currentPeriodEnd": "2026-01-15T14:30:00.000Z",
      "currentPeriodStart": "2026-01-15T14:30:00.000Z",
      "endedAt": "2026-01-15T14:30:00.000Z",
      "membershipCars": [
        {
          "id": "abc123",
          "createdAt": "2026-01-15T14:30:00.000Z",
          "nickname": "example",
          "removingAt": "2026-01-15T14:30:00.000Z"
        }
      ],
      "price": {
        "id": "abc123",
        "amount": 1,
        "archivedReason": "CASCADE",
        "availableInPos": true
      }
    }
  }
}

membershipCars

Returns: [MembershipCar!]!

Requires permission: subscriptions:manage

Argument Type Description
membershipId ID!
Query
query MembershipCars($membershipId: ID!) {
  membershipCars(membershipId: $membershipId) {
    id
    createdAt
    nickname
    removingAt
    car {
      id
      bodyType
      color
      createdAt
    }
  }
}
Variables
{
  "membershipId": "def456"
}
Response
{
  "data": {
    "membershipCars": [
      {
        "id": "abc123",
        "createdAt": "2026-01-15T14:30:00.000Z",
        "nickname": "example",
        "removingAt": "2026-01-15T14:30:00.000Z",
        "car": {
          "id": "abc123",
          "bodyType": "example",
          "color": "example",
          "createdAt": "2026-01-15T14:30:00.000Z"
        }
      }
    ]
  }
}

membershipSearch

Search memberships using flexible filters (plate, RFID, name, card last four,
start date). Supports cursor-based pagination. Multiple filters are combined
using AND logic.

Results carry only the SimpleMembership projection — they do not surface which
specific car matched a plate/state/rfid filter, nor whether that car is
currently linked or scheduled for removal. To inspect car-level detail for a
result, follow up with membership(id:) and read membershipCars.

Returns: MembershipSearchPage!

Requires permission: customers:view

Argument Type Description
input MembershipSearchInput!
Query
query MembershipSearch($input: MembershipSearchInput!) {
  membershipSearch(input: $input) {
    nodes {
      id
      cancelAt
      carLimit
      createdAt
    }
    pageInfo {
      endCursor
      hasNextPage
      hasPreviousPage
      startCursor
    }
  }
}
Variables
{
  "input": {
    "cardLast4": "example",
    "email": "jane@example.com"
  }
}
Response
{
  "data": {
    "membershipSearch": {
      "nodes": [
        {
          "id": "abc123",
          "cancelAt": "2026-01-15T14:30:00.000Z",
          "carLimit": 1,
          "createdAt": "2026-01-15T14:30:00.000Z"
        }
      ],
      "pageInfo": {
        "endCursor": "example",
        "hasNextPage": true,
        "hasPreviousPage": true,
        "startCursor": "example"
      }
    }
  }
}

ownerPlan

Retrieve a single owner plan by its unique ID. Returns full details including
nested relations (wash package, cars, wash history).

Returns: OwnerPlan!

Requires permission: owner-plans:view

Argument Type Description
id ID!
Query
query OwnerPlan($id: ID!) {
  ownerPlan(id: $id) {
    id
    city
    createdAt
    description
    email
    expiresAt
    name
    phone
    cars {
      id
      createdAt
      nickname
      plate
    }
    washPackage {
      id
      createdAt
      description
      externalId
    }
  }
}
Variables
{
  "id": "abc123"
}
Response
{
  "data": {
    "ownerPlan": {
      "id": "abc123",
      "city": "example",
      "createdAt": "2026-01-15T14:30:00.000Z",
      "description": "example",
      "email": "jane@example.com",
      "expiresAt": "2026-01-15T14:30:00.000Z",
      "name": "example",
      "phone": "example",
      "cars": [
        {
          "id": "abc123",
          "createdAt": "2026-01-15T14:30:00.000Z",
          "nickname": "example",
          "plate": "example"
        }
      ],
      "washPackage": {
        "id": "abc123",
        "createdAt": "2026-01-15T14:30:00.000Z",
        "description": "example",
        "externalId": "def456"
      }
    }
  }
}

paidInvoice

Get a single paid invoice by its ID

Returns: PaidInvoice!

Requires permission: sales:view

Argument Type Description
id ID!
Query
query PaidInvoice($id: ID!) {
  paidInvoice(id: $id) {
    id
    amountAvailableToRefund
    billingReason
    createdAt
    invoiceUrl
    isRecharge
    isUpdate
    paymentMethodType
    card {
      id
      brand
      expMonth
      expYear
    }
    customer {
      id
      city
      country
      createdAt
    }
    employee {
      id
      createdAt
      externalId
      isActive
    }
  }
}
Variables
{
  "id": "abc123"
}
Response
{
  "data": {
    "paidInvoice": {
      "id": "abc123",
      "amountAvailableToRefund": 1,
      "billingReason": "example",
      "createdAt": "2026-01-15T14:30:00.000Z",
      "invoiceUrl": "https://example.com",
      "isRecharge": true,
      "isUpdate": true,
      "paymentMethodType": "BANK_ACCOUNT",
      "card": {
        "id": "abc123",
        "brand": "example",
        "expMonth": 1,
        "expYear": 1
      },
      "customer": {
        "id": "abc123",
        "city": "example",
        "country": "example",
        "createdAt": "2026-01-15T14:30:00.000Z"
      },
      "employee": {
        "id": "abc123",
        "createdAt": "2026-01-15T14:30:00.000Z",
        "externalId": "def456",
        "isActive": true
      }
    }
  }
}

paidInvoices

Get a paginated list of paid invoices, sorted in reverse chronological order

Returns: PaidInvoicePage!

Requires permission: sales:view

Argument Type Description
input PaidInvoicesQueryInput
Query
query PaidInvoices {
  paidInvoices {
    nodes {
      id
      amountAvailableToRefund
      billingReason
      createdAt
    }
    pageInfo {
      endCursor
      hasNextPage
      hasPreviousPage
      startCursor
    }
  }
}
Response
{
  "data": {
    "paidInvoices": {
      "nodes": [
        {
          "id": "abc123",
          "amountAvailableToRefund": 1,
          "billingReason": "example",
          "createdAt": "2026-01-15T14:30:00.000Z"
        }
      ],
      "pageInfo": {
        "endCursor": "example",
        "hasNextPage": true,
        "hasPreviousPage": true,
        "startCursor": "example"
      }
    }
  }
}

plateChangeHistory

Get plate change history for a subscription

Returns: [PlateChange!]!

Requires permission: customers:view

Argument Type Description
input PlateChangeHistoryInput!
Query
query PlateChangeHistory($input: PlateChangeHistoryInput!) {
  plateChangeHistory(input: $input) {
    id
    action
    createdAt
    exempt
    car {
      id
      bodyType
      color
      createdAt
    }
    changedBy {
      id
      createdAt
      email
      externalId
    }
    originalCar {
      id
      bodyType
      color
      createdAt
    }
  }
}
Variables
{
  "input": {
    "subscriptionId": "ghi789"
  }
}
Response
{
  "data": {
    "plateChangeHistory": [
      {
        "id": "abc123",
        "action": "example",
        "createdAt": "2026-01-15T14:30:00.000Z",
        "exempt": true,
        "car": {
          "id": "abc123",
          "bodyType": "example",
          "color": "example",
          "createdAt": "2026-01-15T14:30:00.000Z"
        },
        "changedBy": {
          "id": "abc123",
          "createdAt": "2026-01-15T14:30:00.000Z",
          "email": "jane@example.com",
          "externalId": "def456"
        },
        "originalCar": {
          "id": "abc123",
          "bodyType": "example",
          "color": "example",
          "createdAt": "2026-01-15T14:30:00.000Z"
        }
      }
    ]
  }
}

prepaid

Retrieve a single prepaid by its unique ID

Returns: Prepaid!

Requires permission: prepaids:view

Argument Type Description
id ID!
Query
query Prepaid($id: ID!) {
  prepaid(id: $id) {
    id
    codesPerBook
    companyId
    createdAt
    createdById
    description
    exportableCodeCount
    importedFromSitewatch
    createdBy {
      id
      createdAt
      externalId
      isActive
    }
    exports {
      id
      exportedAt
      exportedCodeCount
    }
    washPackage {
      id
      createdAt
      description
      externalId
    }
  }
}
Variables
{
  "id": "abc123"
}
Response
{
  "data": {
    "prepaid": {
      "id": "abc123",
      "codesPerBook": 1,
      "companyId": "def456",
      "createdAt": "2026-01-15T14:30:00.000Z",
      "createdById": "ghi789",
      "description": "example",
      "exportableCodeCount": 1,
      "importedFromSitewatch": true,
      "createdBy": {
        "id": "abc123",
        "createdAt": "2026-01-15T14:30:00.000Z",
        "externalId": "jkl012",
        "isActive": true
      },
      "exports": [
        {
          "id": "abc123",
          "exportedAt": "2026-01-15T14:30:00.000Z",
          "exportedCodeCount": 1
        }
      ],
      "washPackage": {
        "id": "abc123",
        "createdAt": "2026-01-15T14:30:00.000Z",
        "description": "example",
        "externalId": "jkl012"
      }
    }
  }
}

prepaidBooks

Query prepaid books with pagination support. Returns a paginated list of prepaid books

Returns: PrepaidBookPage!

Requires permission: prepaids:view

Argument Type Description
input PrepaidBookQueryInput
Query
query PrepaidBooks {
  prepaidBooks {
    nodes {
      id
      activatedAt
      createdAt
      overwritten
    }
    pageInfo {
      endCursor
      hasNextPage
      hasPreviousPage
      startCursor
    }
  }
}
Response
{
  "data": {
    "prepaidBooks": {
      "nodes": [
        {
          "id": "abc123",
          "activatedAt": "2026-01-15T14:30:00.000Z",
          "createdAt": "2026-01-15T14:30:00.000Z",
          "overwritten": true
        }
      ],
      "pageInfo": {
        "endCursor": "example",
        "hasNextPage": true,
        "hasPreviousPage": true,
        "startCursor": "example"
      }
    }
  }
}

prepaidCodeRedemptions

Query prepaid code redemptions with pagination support. Returns a paginated list of redemptions

Returns: PrepaidCodeRedemptionPage!

Requires permission: prepaids:view

Argument Type Description
input PrepaidCodeRedemptionQueryInput
Query
query PrepaidCodeRedemptions {
  prepaidCodeRedemptions {
    nodes {
      id
      createdAt
      locationId
      prepaidCodeId
    }
    pageInfo {
      endCursor
      hasNextPage
      hasPreviousPage
      startCursor
    }
  }
}
Response
{
  "data": {
    "prepaidCodeRedemptions": {
      "nodes": [
        {
          "id": "abc123",
          "createdAt": "2026-01-15T14:30:00.000Z",
          "locationId": "def456",
          "prepaidCodeId": "ghi789"
        }
      ],
      "pageInfo": {
        "endCursor": "example",
        "hasNextPage": true,
        "hasPreviousPage": true,
        "startCursor": "example"
      }
    }
  }
}

prepaidCodes

Query prepaid codes with pagination support. Returns a paginated list of prepaid codes

Returns: PrepaidCodePage!

Requires permission: prepaids:view

Argument Type Description
input PrepaidCodeQueryInput
Query
query PrepaidCodes {
  prepaidCodes {
    nodes {
      id
      activatedAt
      code
      companyId
    }
    pageInfo {
      endCursor
      hasNextPage
      hasPreviousPage
      startCursor
    }
  }
}
Response
{
  "data": {
    "prepaidCodes": {
      "nodes": [
        {
          "id": "abc123",
          "activatedAt": "2026-01-15T14:30:00.000Z",
          "code": "example",
          "companyId": "def456"
        }
      ],
      "pageInfo": {
        "endCursor": "example",
        "hasNextPage": true,
        "hasPreviousPage": true,
        "startCursor": "example"
      }
    }
  }
}

prepaidExportDownloadUrl

Returns a signed URL to download a prepaid export file.

Returns: String!

Requires permission: prepaids:view

Argument Type Description
prepaidExportId ID!
Query
query PrepaidExportDownloadUrl($prepaidExportId: ID!) {
  prepaidExportDownloadUrl(prepaidExportId: $prepaidExportId)
}
Variables
{
  "prepaidExportId": "abc123"
}
Response
{
  "data": {
    "prepaidExportDownloadUrl": "https://example.com"
  }
}

prepaids

Query prepaids with pagination support. Returns a paginated list of prepaids

Returns: PrepaidPage!

Requires permission: prepaids:view

Argument Type Description
input PrepaidQueryInput
Query
query Prepaids {
  prepaids {
    nodes {
      id
      codesPerBook
      companyId
      createdAt
    }
    pageInfo {
      endCursor
      hasNextPage
      hasPreviousPage
      startCursor
    }
  }
}
Response
{
  "data": {
    "prepaids": {
      "nodes": [
        {
          "id": "abc123",
          "codesPerBook": 1,
          "companyId": "def456",
          "createdAt": "2026-01-15T14:30:00.000Z"
        }
      ],
      "pageInfo": {
        "endCursor": "example",
        "hasNextPage": true,
        "hasPreviousPage": true,
        "startCursor": "example"
      }
    }
  }
}

previewMembershipCarChange

Preview the invoice impact of adding, removing, or cancelling the
removal of a car on a membership. Does not mutate any state.

Returns: MembershipCarChangePreview!

Requires permission: subscriptions:manage

Argument Type Description
input PreviewMembershipCarChangeInput!
Query
query PreviewMembershipCarChange($input: PreviewMembershipCarChangeInput!) {
  previewMembershipCarChange(input: $input) {
    changeType
    immediateTotal
    newVehicleQuantity
    nextBillingDate
    nextInvoiceTotal
    currentPrice {
      id
      amount
      archivedReason
      availableInPos
    }
    lineItems {
      amount
      description
      proration
      quantity
    }
    targetPrice {
      id
      amount
      archivedReason
      availableInPos
    }
  }
}
Variables
{
  "input": {
    "intent": "add",
    "membershipId": "def456"
  }
}
Response
{
  "data": {
    "previewMembershipCarChange": {
      "changeType": "downgrade",
      "immediateTotal": 1,
      "newVehicleQuantity": 1,
      "nextBillingDate": "2026-01-15T14:30:00.000Z",
      "nextInvoiceTotal": 1,
      "currentPrice": {
        "id": "abc123",
        "amount": 1,
        "archivedReason": "CASCADE",
        "availableInPos": true
      },
      "lineItems": [
        {
          "amount": 1,
          "description": "example",
          "proration": true,
          "quantity": 1
        }
      ],
      "targetPrice": {
        "id": "abc123",
        "amount": 1,
        "archivedReason": "CASCADE",
        "availableInPos": true
      }
    }
  }
}

pumpWashCodeByCode

Find the most recent pump wash code matching an exact 5-digit code, or null if none exists.

Returns: PumpWashCode

Argument Type Description
code String!
Query
query PumpWashCodeByCode($code: String!) {
  pumpWashCodeByCode(code: $code) {
    id
    activatedAt
    code
    createdAt
    expiration
    locationId
    pumpWashControllerId
    pumpWashPackageId
    pumpWashPackage {
      id
      packageNumber
      washPackageId
    }
  }
}
Variables
{
  "code": "example"
}
Response
{
  "data": {
    "pumpWashCodeByCode": {
      "id": "abc123",
      "activatedAt": "2026-01-15T14:30:00.000Z",
      "code": "example",
      "createdAt": "2026-01-15T14:30:00.000Z",
      "expiration": "2026-01-15T14:30:00.000Z",
      "locationId": "def456",
      "pumpWashControllerId": "ghi789",
      "pumpWashPackageId": "jkl012",
      "pumpWashPackage": {
        "id": "abc123",
        "packageNumber": 1,
        "washPackageId": "abc123"
      }
    }
  }
}

stripeAccount

Get a Stripe account by ID. Requires the ‘stripe-accounts:view’ permission

Returns: StripeAccount

Requires permission: stripe-accounts:view

Argument Type Description
id String!
Query
query StripeAccount($id: String!) {
  stripeAccount(id: $id) {
    id
    city
    companyId
    createdAt
    name
    state
    street
    updatedAt
    requirements {
      currentlyDue
      disabledReason
      eventuallyDue
      pastDue
    }
  }
}
Variables
{
  "id": "abc123"
}
Response
{
  "data": {
    "stripeAccount": {
      "id": "abc123",
      "city": "example",
      "companyId": "def456",
      "createdAt": "2026-01-15T14:30:00.000Z",
      "name": "example",
      "state": "CA",
      "street": "example",
      "updatedAt": "2026-01-15T14:30:00.000Z",
      "requirements": {
        "currentlyDue": [
          "example"
        ],
        "disabledReason": "example",
        "eventuallyDue": [
          "example"
        ],
        "pastDue": [
          "example"
        ]
      }
    }
  }
}

stripeAccounts

Query Stripe accounts with pagination. Requires the ‘stripe-accounts:view’ permission

Returns: StripeAccountPage!

Requires permission: stripe-accounts:view

Argument Type Description
input StripeAccountQueryInput Pagination parameters for the Stripe accounts query
Query
query StripeAccounts {
  stripeAccounts {
    nodes {
      id
      city
      companyId
      createdAt
    }
    pageInfo {
      endCursor
      hasNextPage
      hasPreviousPage
      startCursor
    }
  }
}
Response
{
  "data": {
    "stripeAccounts": {
      "nodes": [
        {
          "id": "abc123",
          "city": "example",
          "companyId": "def456",
          "createdAt": "2026-01-15T14:30:00.000Z"
        }
      ],
      "pageInfo": {
        "endCursor": "example",
        "hasNextPage": true,
        "hasPreviousPage": true,
        "startCursor": "example"
      }
    }
  }
}

user

Get a user by ID

Returns: User

Requires permission: users:view

Argument Type Description
id ID!
Query
query User($id: ID!) {
  user(id: $id) {
    id
    createdAt
    email
    externalId
    isActive
    name
    permissions
    phone
    company {
      id
      features
      maxCarsPerFamilyMembership
      name
    }
    groups {
      id
      description
      isAdmin
      name
    }
  }
}
Variables
{
  "id": "abc123"
}
Response
{
  "data": {
    "user": {
      "id": "abc123",
      "createdAt": "2026-01-15T14:30:00.000Z",
      "email": "jane@example.com",
      "externalId": "def456",
      "isActive": true,
      "name": "example",
      "permissions": [
        "example"
      ],
      "phone": "+15555550123",
      "company": {
        "id": "abc123",
        "features": [
          "example"
        ],
        "maxCarsPerFamilyMembership": 1,
        "name": "example"
      },
      "groups": [
        {
          "id": "abc123",
          "description": "example",
          "isAdmin": true,
          "name": "example"
        }
      ]
    }
  }
}

users

Query users with pagination. Requires ‘users:view’ permission

Returns: UserPage!

Requires permission: users:view

Argument Type Description
input UserQueryInput Pagination parameters for the user query
Query
query Users {
  users {
    nodes {
      id
      createdAt
      email
      externalId
    }
    pageInfo {
      endCursor
      hasNextPage
      hasPreviousPage
      startCursor
    }
  }
}
Response
{
  "data": {
    "users": {
      "nodes": [
        {
          "id": "abc123",
          "createdAt": "2026-01-15T14:30:00.000Z",
          "email": "jane@example.com",
          "externalId": "def456"
        }
      ],
      "pageInfo": {
        "endCursor": "example",
        "hasNextPage": true,
        "hasPreviousPage": true,
        "startCursor": "example"
      }
    }
  }
}

viewer

Get the currently authenticated user

Returns: User

Query
query Viewer {
  viewer {
    id
    createdAt
    email
    externalId
    isActive
    name
    permissions
    phone
    company {
      id
      features
      maxCarsPerFamilyMembership
      name
    }
    groups {
      id
      description
      isAdmin
      name
    }
  }
}
Response
{
  "data": {
    "viewer": {
      "id": "abc123",
      "createdAt": "2026-01-15T14:30:00.000Z",
      "email": "jane@example.com",
      "externalId": "def456",
      "isActive": true,
      "name": "example",
      "permissions": [
        "example"
      ],
      "phone": "+15555550123",
      "company": {
        "id": "abc123",
        "features": [
          "example"
        ],
        "maxCarsPerFamilyMembership": 1,
        "name": "example"
      },
      "groups": [
        {
          "id": "abc123",
          "description": "example",
          "isAdmin": true,
          "name": "example"
        }
      ]
    }
  }
}

visit

Get a single visit by ID

Returns: Visit!

Argument Type Description
id ID!
Query
query Visit($id: ID!) {
  visit(id: $id) {
    id
    carId
    createdAt
    imageUrl
    isExternalMember
    isSale
    laneId
    locationId
    car {
      id
      bodyType
      color
      createdAt
    }
    employee {
      id
      createdAt
      externalId
      isActive
    }
    washPackage {
      id
      createdAt
      description
      externalId
    }
  }
}
Variables
{
  "id": "abc123"
}
Response
{
  "data": {
    "visit": {
      "id": "abc123",
      "carId": "def456",
      "createdAt": "2026-01-15T14:30:00.000Z",
      "imageUrl": "https://example.com",
      "isExternalMember": true,
      "isSale": true,
      "laneId": "ghi789",
      "locationId": "jkl012",
      "car": {
        "id": "abc123",
        "bodyType": "example",
        "color": "example",
        "createdAt": "2026-01-15T14:30:00.000Z"
      },
      "employee": {
        "id": "abc123",
        "createdAt": "2026-01-15T14:30:00.000Z",
        "externalId": "abc123",
        "isActive": true
      },
      "washPackage": {
        "id": "abc123",
        "createdAt": "2026-01-15T14:30:00.000Z",
        "description": "example",
        "externalId": "abc123"
      }
    }
  }
}

visits

List all visits in reverse chronological order

Returns: VisitsPage!

Argument Type Description
input VisitsInput
Query
query Visits {
  visits {
    nodes {
      id
      carId
      createdAt
      imageUrl
    }
    pageInfo {
      endCursor
      hasNextPage
      hasPreviousPage
      startCursor
    }
  }
}
Response
{
  "data": {
    "visits": {
      "nodes": [
        {
          "id": "abc123",
          "carId": "def456",
          "createdAt": "2026-01-15T14:30:00.000Z",
          "imageUrl": "https://example.com"
        }
      ],
      "pageInfo": {
        "endCursor": "example",
        "hasNextPage": true,
        "hasPreviousPage": true,
        "startCursor": "example"
      }
    }
  }
}

washCode

Retrieve a single wash code by its unique ID

Returns: WashCode!

Requires permission: free-washes:view

Argument Type Description
id ID!
Query
query WashCode($id: ID!) {
  washCode(id: $id) {
    id
    code
    createdAt
    expiresAt
    isActive
    maxRedemptions
    redemptionsCount
    redemptionsRemaining
    washCodeGroup {
      id
      createdAt
      description
      expiresAt
    }
    washPackage {
      id
      createdAt
      description
      externalId
    }
  }
}
Variables
{
  "id": "abc123"
}
Response
{
  "data": {
    "washCode": {
      "id": "abc123",
      "code": "example",
      "createdAt": "2026-01-15T14:30:00.000Z",
      "expiresAt": "2026-01-15T14:30:00.000Z",
      "isActive": true,
      "maxRedemptions": 1,
      "redemptionsCount": 1,
      "redemptionsRemaining": 1,
      "washCodeGroup": {
        "id": "abc123",
        "createdAt": "2026-01-15T14:30:00.000Z",
        "description": "example",
        "expiresAt": "2026-01-15T14:30:00.000Z"
      },
      "washPackage": {
        "id": "abc123",
        "createdAt": "2026-01-15T14:30:00.000Z",
        "description": "example",
        "externalId": "def456"
      }
    }
  }
}

washCodeGroups

Query wash code groups with pagination support. Returns a paginated list of wash code groups

Returns: WashCodeGroupPage!

Requires permission: free-washes:view

Argument Type Description
input WashCodeGroupQueryInput
Query
query WashCodeGroups {
  washCodeGroups {
    nodes {
      id
      createdAt
      description
      expiresAt
    }
    pageInfo {
      endCursor
      hasNextPage
      hasPreviousPage
      startCursor
    }
  }
}
Response
{
  "data": {
    "washCodeGroups": {
      "nodes": [
        {
          "id": "abc123",
          "createdAt": "2026-01-15T14:30:00.000Z",
          "description": "example",
          "expiresAt": "2026-01-15T14:30:00.000Z"
        }
      ],
      "pageInfo": {
        "endCursor": "example",
        "hasNextPage": true,
        "hasPreviousPage": true,
        "startCursor": "example"
      }
    }
  }
}

washCodeRedemptions

Query wash code redemptions with pagination support. Returns a paginated list of redemptions

Returns: WashCodeRedemptionPage!

Requires permission: free-washes:view

Argument Type Description
input WashCodeRedemptionQueryInput
Query
query WashCodeRedemptions {
  washCodeRedemptions {
    nodes {
      id
      createdAt
      locationId
      redeemedAt
    }
    pageInfo {
      endCursor
      hasNextPage
      hasPreviousPage
      startCursor
    }
  }
}
Response
{
  "data": {
    "washCodeRedemptions": {
      "nodes": [
        {
          "id": "abc123",
          "createdAt": "2026-01-15T14:30:00.000Z",
          "locationId": "def456",
          "redeemedAt": "2026-01-15T14:30:00.000Z"
        }
      ],
      "pageInfo": {
        "endCursor": "example",
        "hasNextPage": true,
        "hasPreviousPage": true,
        "startCursor": "example"
      }
    }
  }
}

washCodes

Query wash codes with pagination support. Returns a paginated list of wash codes

Returns: WashCodePage!

Requires permission: free-washes:view

Argument Type Description
input WashCodeQueryInput
Query
query WashCodes {
  washCodes {
    nodes {
      id
      code
      createdAt
      expiresAt
    }
    pageInfo {
      endCursor
      hasNextPage
      hasPreviousPage
      startCursor
    }
  }
}
Response
{
  "data": {
    "washCodes": {
      "nodes": [
        {
          "id": "abc123",
          "code": "example",
          "createdAt": "2026-01-15T14:30:00.000Z",
          "expiresAt": "2026-01-15T14:30:00.000Z"
        }
      ],
      "pageInfo": {
        "endCursor": "example",
        "hasNextPage": true,
        "hasPreviousPage": true,
        "startCursor": "example"
      }
    }
  }
}

washPackage

Get a Wash package by ID. Requires the ‘wash-packages:view’ permission

Returns: WashPackage!

Requires permission: wash-packages:view

Argument Type Description
id ID!
Query
query WashPackage($id: ID!) {
  washPackage(id: $id) {
    id
    createdAt
    description
    externalId
    includesInterior
    name
    updatedAt
  }
}
Variables
{
  "id": "abc123"
}
Response
{
  "data": {
    "washPackage": {
      "id": "abc123",
      "createdAt": "2026-01-15T14:30:00.000Z",
      "description": "example",
      "externalId": "def456",
      "includesInterior": true,
      "name": "example",
      "updatedAt": "2026-01-15T14:30:00.000Z"
    }
  }
}

washPackages

Query Wash packages with pagination. Requires the ‘wash-packages:view’ permission

Returns: [WashPackage!]!

Requires permission: wash-packages:view

Query
query WashPackages {
  washPackages {
    id
    createdAt
    description
    externalId
    includesInterior
    name
    updatedAt
  }
}
Response
{
  "data": {
    "washPackages": [
      {
        "id": "abc123",
        "createdAt": "2026-01-15T14:30:00.000Z",
        "description": "example",
        "externalId": "def456",
        "includesInterior": true,
        "name": "example",
        "updatedAt": "2026-01-15T14:30:00.000Z"
      }
    ]
  }
}