Queries
Queries
car
Returns: Car
| Argument | Type | Description |
|---|---|---|
id |
ID! |
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
}
}
}
{
"id": "abc123"
}
{
"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 Cars {
cars {
nodes {
id
bodyType
color
createdAt
}
pageInfo {
endCursor
hasNextPage
hasPreviousPage
startCursor
}
}
}
{
"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 Customer($id: ID!) {
customer(id: $id) {
id
city
country
createdAt
email
externalBillingId
isActiveMember
isExternallyManaged
notes {
id
archivedAt
createdAt
customerId
}
subscriptions {
id
billingCustomerId
billingFrequency
billingSubscriptionId
}
}
}
{
"id": "abc123"
}
{
"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 Customers($input: CustomersInput!) {
customers(input: $input) {
nodes {
id
city
country
createdAt
}
pageInfo {
endCursor
hasNextPage
hasPreviousPage
startCursor
}
}
}
{
"input": {
"email": "jane@example.com",
"first": 25
}
}
{
"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 Discount($id: ID!) {
discount(id: $id) {
id
amountOff
createdAt
duration
durationInMonths
maxRedemptions
name
percentOff
availabilitySchedule {
durationMinutes
endDate
rrule
startDate
}
}
}
{
"id": "abc123"
}
{
"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 Discounts {
discounts {
nodes {
id
amountOff
createdAt
duration
}
pageInfo {
endCursor
hasNextPage
hasPreviousPage
startCursor
}
}
}
{
"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 Employee($id: ID!) {
employee(id: $id) {
id
createdAt
externalId
isActive
name
updatedAt
car {
id
bodyType
color
createdAt
}
}
}
{
"id": "abc123"
}
{
"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 Employees {
employees {
nodes {
id
createdAt
externalId
isActive
}
pageInfo {
endCursor
hasNextPage
hasPreviousPage
startCursor
}
}
}
{
"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 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
}
}
}
{
"id": "abc123"
}
{
"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 Fleets {
fleets {
nodes {
id
businessName
city
contactName
}
pageInfo {
endCursor
hasNextPage
hasPreviousPage
startCursor
}
}
}
{
"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 Group($id: ID!) {
group(id: $id) {
id
description
isAdmin
name
permissions
slug
}
}
{
"id": "abc123"
}
{
"data": {
"group": {
"id": "abc123",
"description": "example",
"isAdmin": true,
"name": "example",
"permissions": [
"example"
],
"slug": "example"
}
}
}
groups
Returns: [Group!]!
query Groups {
groups {
id
description
isAdmin
name
permissions
slug
}
}
{
"data": {
"groups": [
{
"id": "abc123",
"description": "example",
"isAdmin": true,
"name": "example",
"permissions": [
"example"
],
"slug": "example"
}
]
}
}
isCarActive
Returns: Boolean!
query IsCarActive($plate: String!, $state: String!) {
isCarActive(plate: $plate, state: $state)
}
{
"plate": "example",
"state": "example"
}
{
"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 ListOwnerPlans {
listOwnerPlans {
nodes {
id
city
createdAt
description
}
pageInfo {
endCursor
hasNextPage
hasPreviousPage
startCursor
}
}
}
{
"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 ListOwnerVisits($input: ListOwnerVisitsInput!) {
listOwnerVisits(input: $input) {
nodes {
id
createdAt
}
pageInfo {
endCursor
hasNextPage
hasPreviousPage
startCursor
}
}
}
{
"input": {
"ownerPlanId": "def456"
}
}
{
"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 Location($id: ID!) {
location(id: $id) {
id
cashEnabled
city
companyId
createdAt
externalId
interiorEnabled
isVirtual
}
}
{
"id": "abc123"
}
{
"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 Locations {
locations {
nodes {
id
cashEnabled
city
companyId
}
pageInfo {
endCursor
hasNextPage
hasPreviousPage
startCursor
}
}
}
{
"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 Membership($id: ID!) {
membership(id: $id) {
id
active
cancelAt
carLimit
createdAt
currentPeriodEnd
currentPeriodStart
endedAt
membershipCars {
id
createdAt
nickname
removingAt
}
price {
id
amount
archivedReason
availableInPos
}
}
}
{
"id": "abc123"
}
{
"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 MembershipCars($membershipId: ID!) {
membershipCars(membershipId: $membershipId) {
id
createdAt
nickname
removingAt
car {
id
bodyType
color
createdAt
}
}
}
{
"membershipId": "def456"
}
{
"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 MembershipSearch($input: MembershipSearchInput!) {
membershipSearch(input: $input) {
nodes {
id
cancelAt
carLimit
createdAt
}
pageInfo {
endCursor
hasNextPage
hasPreviousPage
startCursor
}
}
}
{
"input": {
"cardLast4": "example",
"email": "jane@example.com"
}
}
{
"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 OwnerPlan($id: ID!) {
ownerPlan(id: $id) {
id
city
createdAt
description
email
expiresAt
name
phone
cars {
id
createdAt
nickname
plate
}
washPackage {
id
createdAt
description
externalId
}
}
}
{
"id": "abc123"
}
{
"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 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
}
}
}
{
"id": "abc123"
}
{
"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 PaidInvoices {
paidInvoices {
nodes {
id
amountAvailableToRefund
billingReason
createdAt
}
pageInfo {
endCursor
hasNextPage
hasPreviousPage
startCursor
}
}
}
{
"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 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
}
}
}
{
"input": {
"subscriptionId": "ghi789"
}
}
{
"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 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
}
}
}
{
"id": "abc123"
}
{
"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 PrepaidBooks {
prepaidBooks {
nodes {
id
activatedAt
createdAt
overwritten
}
pageInfo {
endCursor
hasNextPage
hasPreviousPage
startCursor
}
}
}
{
"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 PrepaidCodeRedemptions {
prepaidCodeRedemptions {
nodes {
id
createdAt
locationId
prepaidCodeId
}
pageInfo {
endCursor
hasNextPage
hasPreviousPage
startCursor
}
}
}
{
"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 PrepaidCodes {
prepaidCodes {
nodes {
id
activatedAt
code
companyId
}
pageInfo {
endCursor
hasNextPage
hasPreviousPage
startCursor
}
}
}
{
"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 PrepaidExportDownloadUrl($prepaidExportId: ID!) {
prepaidExportDownloadUrl(prepaidExportId: $prepaidExportId)
}
{
"prepaidExportId": "abc123"
}
{
"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 Prepaids {
prepaids {
nodes {
id
codesPerBook
companyId
createdAt
}
pageInfo {
endCursor
hasNextPage
hasPreviousPage
startCursor
}
}
}
{
"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 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
}
}
}
{
"input": {
"intent": "add",
"membershipId": "def456"
}
}
{
"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 PumpWashCodeByCode($code: String!) {
pumpWashCodeByCode(code: $code) {
id
activatedAt
code
createdAt
expiration
locationId
pumpWashControllerId
pumpWashPackageId
pumpWashPackage {
id
packageNumber
washPackageId
}
}
}
{
"code": "example"
}
{
"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 StripeAccount($id: String!) {
stripeAccount(id: $id) {
id
city
companyId
createdAt
name
state
street
updatedAt
requirements {
currentlyDue
disabledReason
eventuallyDue
pastDue
}
}
}
{
"id": "abc123"
}
{
"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 StripeAccounts {
stripeAccounts {
nodes {
id
city
companyId
createdAt
}
pageInfo {
endCursor
hasNextPage
hasPreviousPage
startCursor
}
}
}
{
"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 User($id: ID!) {
user(id: $id) {
id
createdAt
email
externalId
isActive
name
permissions
phone
company {
id
features
maxCarsPerFamilyMembership
name
}
groups {
id
description
isAdmin
name
}
}
}
{
"id": "abc123"
}
{
"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 Users {
users {
nodes {
id
createdAt
email
externalId
}
pageInfo {
endCursor
hasNextPage
hasPreviousPage
startCursor
}
}
}
{
"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 Viewer {
viewer {
id
createdAt
email
externalId
isActive
name
permissions
phone
company {
id
features
maxCarsPerFamilyMembership
name
}
groups {
id
description
isAdmin
name
}
}
}
{
"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 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
}
}
}
{
"id": "abc123"
}
{
"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 Visits {
visits {
nodes {
id
carId
createdAt
imageUrl
}
pageInfo {
endCursor
hasNextPage
hasPreviousPage
startCursor
}
}
}
{
"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 WashCode($id: ID!) {
washCode(id: $id) {
id
code
createdAt
expiresAt
isActive
maxRedemptions
redemptionsCount
redemptionsRemaining
washCodeGroup {
id
createdAt
description
expiresAt
}
washPackage {
id
createdAt
description
externalId
}
}
}
{
"id": "abc123"
}
{
"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 WashCodeGroups {
washCodeGroups {
nodes {
id
createdAt
description
expiresAt
}
pageInfo {
endCursor
hasNextPage
hasPreviousPage
startCursor
}
}
}
{
"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 WashCodeRedemptions {
washCodeRedemptions {
nodes {
id
createdAt
locationId
redeemedAt
}
pageInfo {
endCursor
hasNextPage
hasPreviousPage
startCursor
}
}
}
{
"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 WashCodes {
washCodes {
nodes {
id
code
createdAt
expiresAt
}
pageInfo {
endCursor
hasNextPage
hasPreviousPage
startCursor
}
}
}
{
"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 WashPackage($id: ID!) {
washPackage(id: $id) {
id
createdAt
description
externalId
includesInterior
name
updatedAt
}
}
{
"id": "abc123"
}
{
"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 WashPackages {
washPackages {
id
createdAt
description
externalId
includesInterior
name
updatedAt
}
}
{
"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"
}
]
}
}