GraphQL Schema
RollerUp GraphQL API schema reference
API Endpoints
https://api.rollerup.tech/graphql
Queries
car
Example
Query
query car($id: ID!) {
car(id: $id) {
bodyType
color
createdAt
customer {
...RollerupCustomerFragment
}
customerId
id
isMember
lastVisitedAt
lastVisitedLocation {
...LocationFragment
}
make
membership {
...MembershipFragment
}
membershipId
model
nickname
plate
rfidTag
state
stripeCustomer {
...StripeCustomerFragment
}
totalVisits
updatedAt
year
}
}
Variables
{"id": "4"}
Response
{
"data": {
"car": {
"bodyType": "abc123",
"color": "xyz789",
"createdAt": "2007-12-03T10:15:30Z",
"customer": RollerupCustomer,
"customerId": "xyz789",
"id": 4,
"isMember": false,
"lastVisitedAt": "2007-12-03T10:15:30Z",
"lastVisitedLocation": Location,
"make": "abc123",
"membership": Membership,
"membershipId": "abc123",
"model": "xyz789",
"nickname": "xyz789",
"plate": "abc123",
"rfidTag": "xyz789",
"state": "xyz789",
"stripeCustomer": StripeCustomer,
"totalVisits": 123,
"updatedAt": "2007-12-03T10:15:30Z",
"year": "xyz789"
}
}
}
cars
Response
Returns a CarPage!
Arguments
| Name | Description |
|---|---|
input - CarsQueryInput
|
Example
Query
query cars($input: CarsQueryInput) {
cars(input: $input) {
nodes {
...CarFragment
}
pageInfo {
...PageInfoFragment
}
}
}
Variables
{"input": CarsQueryInput}
Response
{
"data": {
"cars": {
"nodes": [Car],
"pageInfo": PageInfo
}
}
}
customer
Description
Get a single Rollerup customer by ID
Response
Returns a RollerupCustomer
Arguments
| Name | Description |
|---|---|
id - ID!
|
Customer ID |
Example
Query
query customer($id: ID!) {
customer(id: $id) {
city
country
createdAt
email
id
isActiveMember
name
notes {
...NoteFragment
}
phone
state
street1
street2
subscriptions {
...RollerupSubscriptionFragment
}
updatedAt
zip
}
}
Variables
{"id": 4}
Response
{
"data": {
"customer": {
"city": "xyz789",
"country": "xyz789",
"createdAt": "2007-12-03T10:15:30Z",
"email": "test@test.com",
"id": "4",
"isActiveMember": true,
"name": "abc123",
"notes": [Note],
"phone": "+17895551234",
"state": "xyz789",
"street1": "xyz789",
"street2": "xyz789",
"subscriptions": [RollerupSubscription],
"updatedAt": "2007-12-03T10:15:30Z",
"zip": "abc123"
}
}
}
customers
Description
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.
Response
Returns a CustomersPage!
Arguments
| Name | Description |
|---|---|
input - CustomersInput!
|
Search parameters and pagination options |
Example
Query
query customers($input: CustomersInput!) {
customers(input: $input) {
nodes {
...RollerupCustomerFragment
}
pageInfo {
...PageInfoFragment
}
}
}
Variables
{"input": CustomersInput}
Response
{
"data": {
"customers": {
"nodes": [RollerupCustomer],
"pageInfo": PageInfo
}
}
}
discount
Description
Retrieve a single discount by its unique ID
Example
Query
query discount($id: ID!) {
discount(id: $id) {
amountOff
availabilitySchedule {
...ScheduleFragment
}
createdAt
duration
durationInMonths
id
maxRedemptions
name
percentOff
redeemBy
updatedAt
}
}
Variables
{"id": 4}
Response
{
"data": {
"discount": {
"amountOff": 123,
"availabilitySchedule": Schedule,
"createdAt": "2007-12-03T10:15:30Z",
"duration": "FOREVER",
"durationInMonths": 987,
"id": 4,
"maxRedemptions": 987,
"name": "xyz789",
"percentOff": 123,
"redeemBy": "2007-12-03T10:15:30Z",
"updatedAt": "2007-12-03T10:15:30Z"
}
}
}
discounts
Description
Query discounts with pagination support. Returns a paginated list of discounts. Supports optional filtering by name, active status, and expiration date range.
Response
Returns a DiscountPage!
Arguments
| Name | Description |
|---|---|
input - DiscountQueryInput
|
Example
Query
query discounts($input: DiscountQueryInput) {
discounts(input: $input) {
nodes {
...DiscountFragment
}
pageInfo {
...PageInfoFragment
}
}
}
Variables
{"input": DiscountQueryInput}
Response
{
"data": {
"discounts": {
"nodes": [Discount],
"pageInfo": PageInfo
}
}
}
employee
Description
Get an employee by their unique identifier
Example
Query
query employee($id: ID!) {
employee(id: $id) {
car {
...CarFragment
}
createdAt
externalId
id
isActive
name
updatedAt
}
}
Variables
{"id": 4}
Response
{
"data": {
"employee": {
"car": Car,
"createdAt": "2007-12-03T10:15:30Z",
"externalId": "abc123",
"id": "4",
"isActive": true,
"name": "abc123",
"updatedAt": "2007-12-03T10:15:30Z"
}
}
}
employees
Description
Get a list of employees
Response
Returns an EmployeesPage!
Arguments
| Name | Description |
|---|---|
input - EmployeesInput
|
Example
Query
query employees($input: EmployeesInput) {
employees(input: $input) {
nodes {
...EmployeeFragment
}
pageInfo {
...PageInfoFragment
}
}
}
Variables
{"input": EmployeesInput}
Response
{
"data": {
"employees": {
"nodes": [Employee],
"pageInfo": PageInfo
}
}
}
group
Example
Query
query group($id: ID!) {
group(id: $id) {
description
id
isAdmin
name
permissions
slug
}
}
Variables
{"id": 4}
Response
{
"data": {
"group": {
"description": "abc123",
"id": "4",
"isAdmin": false,
"name": "abc123",
"permissions": ["abc123"],
"slug": "abc123"
}
}
}
groups
Response
Returns [Group!]!
Example
Query
query groups {
groups {
description
id
isAdmin
name
permissions
slug
}
}
Response
{
"data": {
"groups": [
{
"description": "xyz789",
"id": 4,
"isAdmin": true,
"name": "abc123",
"permissions": ["abc123"],
"slug": "xyz789"
}
]
}
}
isCarActive
listOwnerPlans
Description
Query owner plans with pagination support. Returns a paginated list of simple owner plans without nested relations to avoid N+1 queries.
Response
Returns a SimpleOwnerPlansPage!
Arguments
| Name | Description |
|---|---|
input - ListOwnerPlansInput
|
Example
Query
query listOwnerPlans($input: ListOwnerPlansInput) {
listOwnerPlans(input: $input) {
nodes {
...SimpleOwnerPlanFragment
}
pageInfo {
...PageInfoFragment
}
}
}
Variables
{"input": ListOwnerPlansInput}
Response
{
"data": {
"listOwnerPlans": {
"nodes": [SimpleOwnerPlan],
"pageInfo": PageInfo
}
}
}
listOwnerVisits
Response
Returns an OwnerVisitsPage!
Arguments
| Name | Description |
|---|---|
input - ListOwnerVisitsInput!
|
Example
Query
query listOwnerVisits($input: ListOwnerVisitsInput!) {
listOwnerVisits(input: $input) {
nodes {
...OwnerVisitFragment
}
pageInfo {
...PageInfoFragment
}
}
}
Variables
{"input": ListOwnerVisitsInput}
Response
{
"data": {
"listOwnerVisits": {
"nodes": [OwnerVisit],
"pageInfo": PageInfo
}
}
}
location
Description
Get a location by ID. Requires 'locations:view' permission
Example
Query
query location($id: ID!) {
location(id: $id) {
cashEnabled
city
companyId
createdAt
externalId
id
isVirtual
name
shortName
state
street
stripeAccountId
stripeTerminalLocationId
taxEnabled
timezone
updatedAt
zip
}
}
Variables
{"id": 4}
Response
{
"data": {
"location": {
"cashEnabled": false,
"city": "xyz789",
"companyId": 4,
"createdAt": "2007-12-03T10:15:30Z",
"externalId": "xyz789",
"id": 4,
"isVirtual": false,
"name": "abc123",
"shortName": "xyz789",
"state": USStateCode,
"street": "abc123",
"stripeAccountId": "xyz789",
"stripeTerminalLocationId": "xyz789",
"taxEnabled": true,
"timezone": "xyz789",
"updatedAt": "2007-12-03T10:15:30Z",
"zip": USPostalCode
}
}
}
locations
Description
Query locations with pagination. Requires the 'locations:view' permission
Response
Returns a LocationPage!
Arguments
| Name | Description |
|---|---|
input - LocationQueryInput
|
Pagination parameters for the location query |
Example
Query
query locations($input: LocationQueryInput) {
locations(input: $input) {
nodes {
...LocationFragment
}
pageInfo {
...PageInfoFragment
}
}
}
Variables
{"input": LocationQueryInput}
Response
{
"data": {
"locations": {
"nodes": [Location],
"pageInfo": PageInfo
}
}
}
membershipCars
Response
Returns [MembershipCar!]!
Arguments
| Name | Description |
|---|---|
membershipId - ID!
|
Example
Query
query membershipCars($membershipId: ID!) {
membershipCars(membershipId: $membershipId) {
car {
...CarFragment
}
createdAt
id
nickname
removingAt
}
}
Variables
{"membershipId": "4"}
Response
{
"data": {
"membershipCars": [
{
"car": Car,
"createdAt": "2007-12-03T10:15:30Z",
"id": 4,
"nickname": "xyz789",
"removingAt": "2007-12-03T10:15:30Z"
}
]
}
}
ownerPlan
Description
Retrieve a single owner plan by its unique ID. Returns full details including nested relations (wash package, cars, wash history).
Response
Returns an OwnerPlan!
Arguments
| Name | Description |
|---|---|
id - ID!
|
Example
Query
query ownerPlan($id: ID!) {
ownerPlan(id: $id) {
cars {
...OwnerCarFragment
}
city
createdAt
description
email
expiresAt
id
name
phone
state
street1
street2
updatedAt
washPackage {
...WashPackageFragment
}
washPackageId
zip
}
}
Variables
{"id": 4}
Response
{
"data": {
"ownerPlan": {
"cars": [OwnerCar],
"city": "abc123",
"createdAt": "2007-12-03T10:15:30Z",
"description": "xyz789",
"email": "abc123",
"expiresAt": "2007-12-03T10:15:30Z",
"id": "4",
"name": "abc123",
"phone": "xyz789",
"state": "xyz789",
"street1": "xyz789",
"street2": "xyz789",
"updatedAt": "2007-12-03T10:15:30Z",
"washPackage": WashPackage,
"washPackageId": 4,
"zip": "abc123"
}
}
}
paidInvoice
Description
Get a single paid invoice by its ID
Response
Returns a PaidInvoice!
Arguments
| Name | Description |
|---|---|
id - ID!
|
Example
Query
query paidInvoice($id: ID!) {
paidInvoice(id: $id) {
amountAvailableToRefund
billingReason
card {
...CardFragment
}
createdAt
customer {
...SimpleRollerupCustomerFragment
}
employee {
...EmployeeFragment
}
id
invoiceUrl
isRecharge
isUpdate
lineItems {
...SimplePaidInvoiceLineItemFragment
}
location {
...SimpleLocationFragment
}
stripeChargeId
stripeInvoiceId
subscriptionId
total
visit {
...VisitFragment
}
}
}
Variables
{"id": "4"}
Response
{
"data": {
"paidInvoice": {
"amountAvailableToRefund": 123,
"billingReason": "xyz789",
"card": Card,
"createdAt": "2007-12-03T10:15:30Z",
"customer": SimpleRollerupCustomer,
"employee": Employee,
"id": 4,
"invoiceUrl": "abc123",
"isRecharge": true,
"isUpdate": false,
"lineItems": [SimplePaidInvoiceLineItem],
"location": SimpleLocation,
"stripeChargeId": "abc123",
"stripeInvoiceId": "abc123",
"subscriptionId": "abc123",
"total": 987,
"visit": Visit
}
}
}
paidInvoices
Description
Get a paginated list of paid invoices, sorted in reverse chronological order
Response
Returns a PaidInvoicePage!
Arguments
| Name | Description |
|---|---|
input - PaidInvoicesQueryInput
|
Example
Query
query paidInvoices($input: PaidInvoicesQueryInput) {
paidInvoices(input: $input) {
nodes {
...PaidInvoiceFragment
}
pageInfo {
...PageInfoFragment
}
}
}
Variables
{"input": PaidInvoicesQueryInput}
Response
{
"data": {
"paidInvoices": {
"nodes": [PaidInvoice],
"pageInfo": PageInfo
}
}
}
plateChangeHistory
Description
Get plate change history for a subscription
Response
Returns [PlateChange!]!
Arguments
| Name | Description |
|---|---|
input - PlateChangeHistoryInput!
|
Example
Query
query plateChangeHistory($input: PlateChangeHistoryInput!) {
plateChangeHistory(input: $input) {
action
car {
...CarFragment
}
changedBy {
...UserFragment
}
createdAt
exempt
id
originalCar {
...CarFragment
}
}
}
Variables
{"input": PlateChangeHistoryInput}
Response
{
"data": {
"plateChangeHistory": [
{
"action": "xyz789",
"car": Car,
"changedBy": User,
"createdAt": "2007-12-03T10:15:30Z",
"exempt": false,
"id": 4,
"originalCar": Car
}
]
}
}
prepaid
Description
Retrieve a single prepaid by its unique ID
Example
Query
query prepaid($id: ID!) {
prepaid(id: $id) {
codesPerBook
companyId
createdAt
createdBy {
...EmployeeFragment
}
createdById
description
exportableCodeCount
exports {
...SimplePrepaidExportFragment
}
id
importedFromSitewatch
maxRedemptionsPerPrepaid
name
updatedAt
washPackage {
...WashPackageFragment
}
washPackageId
}
}
Variables
{"id": 4}
Response
{
"data": {
"prepaid": {
"codesPerBook": 987,
"companyId": "4",
"createdAt": "2007-12-03T10:15:30Z",
"createdBy": Employee,
"createdById": "4",
"description": "abc123",
"exportableCodeCount": 123,
"exports": [SimplePrepaidExport],
"id": "4",
"importedFromSitewatch": false,
"maxRedemptionsPerPrepaid": 123,
"name": "xyz789",
"updatedAt": "2007-12-03T10:15:30Z",
"washPackage": WashPackage,
"washPackageId": "4"
}
}
}
prepaidBooks
Description
Query prepaid books with pagination support. Returns a paginated list of prepaid books
Response
Returns a PrepaidBookPage!
Arguments
| Name | Description |
|---|---|
input - PrepaidBookQueryInput
|
Example
Query
query prepaidBooks($input: PrepaidBookQueryInput) {
prepaidBooks(input: $input) {
nodes {
...PrepaidBookFragment
}
pageInfo {
...PageInfoFragment
}
}
}
Variables
{"input": PrepaidBookQueryInput}
Response
{
"data": {
"prepaidBooks": {
"nodes": [PrepaidBook],
"pageInfo": PageInfo
}
}
}
prepaidCodeRedemptions
Description
Query prepaid code redemptions with pagination support. Returns a paginated list of redemptions
Response
Returns a PrepaidCodeRedemptionPage!
Arguments
| Name | Description |
|---|---|
input - PrepaidCodeRedemptionQueryInput
|
Example
Query
query prepaidCodeRedemptions($input: PrepaidCodeRedemptionQueryInput) {
prepaidCodeRedemptions(input: $input) {
nodes {
...PrepaidCodeRedemptionFragment
}
pageInfo {
...PageInfoFragment
}
}
}
Variables
{"input": PrepaidCodeRedemptionQueryInput}
Response
{
"data": {
"prepaidCodeRedemptions": {
"nodes": [PrepaidCodeRedemption],
"pageInfo": PageInfo
}
}
}
prepaidCodes
Description
Query prepaid codes with pagination support. Returns a paginated list of prepaid codes
Response
Returns a PrepaidCodePage!
Arguments
| Name | Description |
|---|---|
input - PrepaidCodeQueryInput
|
Example
Query
query prepaidCodes($input: PrepaidCodeQueryInput) {
prepaidCodes(input: $input) {
nodes {
...PrepaidCodeFragment
}
pageInfo {
...PageInfoFragment
}
}
}
Variables
{"input": PrepaidCodeQueryInput}
Response
{
"data": {
"prepaidCodes": {
"nodes": [PrepaidCode],
"pageInfo": PageInfo
}
}
}
prepaidExportDownloadUrl
Description
Returns a signed URL to download a prepaid export file.
Example
Query
query prepaidExportDownloadUrl($prepaidExportId: ID!) {
prepaidExportDownloadUrl(prepaidExportId: $prepaidExportId)
}
Variables
{"prepaidExportId": "4"}
Response
{
"data": {
"prepaidExportDownloadUrl": "xyz789"
}
}
prepaids
Description
Query prepaids with pagination support. Returns a paginated list of prepaids
Response
Returns a PrepaidPage!
Arguments
| Name | Description |
|---|---|
input - PrepaidQueryInput
|
Example
Query
query prepaids($input: PrepaidQueryInput) {
prepaids(input: $input) {
nodes {
...PrepaidFragment
}
pageInfo {
...PageInfoFragment
}
}
}
Variables
{"input": PrepaidQueryInput}
Response
{
"data": {
"prepaids": {
"nodes": [Prepaid],
"pageInfo": PageInfo
}
}
}
previewMembershipCarChange
Description
Preview the invoice impact of adding, removing, or cancelling the removal of a car on a membership. Does not mutate any state.
Response
Returns a MembershipCarChangePreview!
Arguments
| Name | Description |
|---|---|
input - PreviewMembershipCarChangeInput!
|
Example
Query
query previewMembershipCarChange($input: PreviewMembershipCarChangeInput!) {
previewMembershipCarChange(input: $input) {
changeType
immediateTotal
lineItems {
...MembershipCarChangePreviewLineItemFragment
}
newVehicleQuantity
nextBillingDate
nextInvoiceTotal
}
}
Variables
{"input": PreviewMembershipCarChangeInput}
Response
{
"data": {
"previewMembershipCarChange": {
"changeType": "downgrade",
"immediateTotal": 123,
"lineItems": [MembershipCarChangePreviewLineItem],
"newVehicleQuantity": 987,
"nextBillingDate": "2007-12-03T10:15:30Z",
"nextInvoiceTotal": 987
}
}
}
stripeAccount
Description
Get a Stripe account by ID. Requires the 'stripe-accounts:view' permission
Response
Returns a StripeAccount
Arguments
| Name | Description |
|---|---|
id - String!
|
Example
Query
query stripeAccount($id: String!) {
stripeAccount(id: $id) {
city
companyId
createdAt
id
name
requirements {
...StripeAccountRequirementsFragment
}
state
street
updatedAt
zip
}
}
Variables
{"id": "abc123"}
Response
{
"data": {
"stripeAccount": {
"city": "xyz789",
"companyId": 4,
"createdAt": "2007-12-03T10:15:30Z",
"id": "xyz789",
"name": "abc123",
"requirements": StripeAccountRequirements,
"state": USStateCode,
"street": "abc123",
"updatedAt": "2007-12-03T10:15:30Z",
"zip": USPostalCode
}
}
}
stripeAccounts
Description
Query Stripe accounts with pagination. Requires the 'stripe-accounts:view' permission
Response
Returns a StripeAccountPage!
Arguments
| Name | Description |
|---|---|
input - StripeAccountQueryInput
|
Pagination parameters for the Stripe accounts query |
Example
Query
query stripeAccounts($input: StripeAccountQueryInput) {
stripeAccounts(input: $input) {
nodes {
...StripeAccountFragment
}
pageInfo {
...PageInfoFragment
}
}
}
Variables
{"input": StripeAccountQueryInput}
Response
{
"data": {
"stripeAccounts": {
"nodes": [StripeAccount],
"pageInfo": PageInfo
}
}
}
user
Description
Get a user by ID
Example
Query
query user($id: ID!) {
user(id: $id) {
company {
...SimpleCompanyFragment
}
createdAt
email
externalId
groups {
...GroupFragment
}
id
isActive
name
permissions
phone
updatedAt
username
}
}
Variables
{"id": 4}
Response
{
"data": {
"user": {
"company": SimpleCompany,
"createdAt": "2007-12-03T10:15:30Z",
"email": "test@test.com",
"externalId": "abc123",
"groups": [Group],
"id": 4,
"isActive": false,
"name": "xyz789",
"permissions": ["xyz789"],
"phone": "+17895551234",
"updatedAt": "2007-12-03T10:15:30Z",
"username": "abc123"
}
}
}
users
Description
Query users with pagination. Requires 'users:view' permission
Response
Returns a UserPage!
Arguments
| Name | Description |
|---|---|
input - UserQueryInput
|
Pagination parameters for the user query |
Example
Query
query users($input: UserQueryInput) {
users(input: $input) {
nodes {
...UserFragment
}
pageInfo {
...PageInfoFragment
}
}
}
Variables
{"input": UserQueryInput}
Response
{
"data": {
"users": {
"nodes": [User],
"pageInfo": PageInfo
}
}
}
viewer
Description
Get the currently authenticated user
Response
Returns a User
Example
Query
query viewer {
viewer {
company {
...SimpleCompanyFragment
}
createdAt
email
externalId
groups {
...GroupFragment
}
id
isActive
name
permissions
phone
updatedAt
username
}
}
Response
{
"data": {
"viewer": {
"company": SimpleCompany,
"createdAt": "2007-12-03T10:15:30Z",
"email": "test@test.com",
"externalId": "abc123",
"groups": [Group],
"id": 4,
"isActive": true,
"name": "xyz789",
"permissions": ["xyz789"],
"phone": "+17895551234",
"updatedAt": "2007-12-03T10:15:30Z",
"username": "xyz789"
}
}
}
visit
Description
Get a single visit by ID
Example
Query
query visit($id: ID!) {
visit(id: $id) {
createdAt
employee {
...EmployeeFragment
}
id
imageUrl
isExternalMember
isSale
laneId
lprOverridden
lprPlate
lprState
plate
plateImageUrl
rfidTag
state
status
stripeSubscriptionId
timeTotal
timeWaitingForAttendant
timeWaitingForGate
timeWithAttendant
updatedAt
visitType
washPackage {
...WashPackageFragment
}
}
}
Variables
{"id": "4"}
Response
{
"data": {
"visit": {
"createdAt": "2007-12-03T10:15:30Z",
"employee": Employee,
"id": 4,
"imageUrl": "abc123",
"isExternalMember": false,
"isSale": true,
"laneId": "abc123",
"lprOverridden": false,
"lprPlate": "xyz789",
"lprState": "xyz789",
"plate": "xyz789",
"plateImageUrl": "abc123",
"rfidTag": "xyz789",
"state": "abc123",
"status": "xyz789",
"stripeSubscriptionId": "abc123",
"timeTotal": 123.45,
"timeWaitingForAttendant": 123.45,
"timeWaitingForGate": 123.45,
"timeWithAttendant": 987.65,
"updatedAt": "2007-12-03T10:15:30Z",
"visitType": "abc123",
"washPackage": WashPackage
}
}
}
visits
Description
List all visits in reverse chronological order
Response
Returns a VisitsPage!
Arguments
| Name | Description |
|---|---|
input - VisitsInput
|
Example
Query
query visits($input: VisitsInput) {
visits(input: $input) {
nodes {
...VisitFragment
}
pageInfo {
...PageInfoFragment
}
}
}
Variables
{"input": VisitsInput}
Response
{
"data": {
"visits": {
"nodes": [Visit],
"pageInfo": PageInfo
}
}
}
washPackage
Description
Get a Wash package by ID. Requires the 'wash-packages:view' permission
Response
Returns a WashPackage!
Arguments
| Name | Description |
|---|---|
id - ID!
|
Example
Query
query washPackage($id: ID!) {
washPackage(id: $id) {
createdAt
description
externalId
id
name
updatedAt
}
}
Variables
{"id": 4}
Response
{
"data": {
"washPackage": {
"createdAt": "2007-12-03T10:15:30Z",
"description": "abc123",
"externalId": "abc123",
"id": 4,
"name": "abc123",
"updatedAt": "2007-12-03T10:15:30Z"
}
}
}
washPackages
Description
Query Wash packages with pagination. Requires the 'wash-packages:view' permission
Response
Returns [WashPackage!]!
Example
Query
query washPackages {
washPackages {
createdAt
description
externalId
id
name
updatedAt
}
}
Response
{
"data": {
"washPackages": [
{
"createdAt": "2007-12-03T10:15:30Z",
"description": "xyz789",
"externalId": "xyz789",
"id": 4,
"name": "xyz789",
"updatedAt": "2007-12-03T10:15:30Z"
}
]
}
}
Mutations
addCarToMembership
Response
Returns a MembershipCar!
Arguments
| Name | Description |
|---|---|
input - AddCarToMembershipInput!
|
Example
Query
mutation addCarToMembership($input: AddCarToMembershipInput!) {
addCarToMembership(input: $input) {
car {
...CarFragment
}
createdAt
id
nickname
removingAt
}
}
Variables
{"input": AddCarToMembershipInput}
Response
{
"data": {
"addCarToMembership": {
"car": Car,
"createdAt": "2007-12-03T10:15:30Z",
"id": "4",
"nickname": "xyz789",
"removingAt": "2007-12-03T10:15:30Z"
}
}
}
addCarToOwnerPlan
Description
Add a car to an owner plan
Response
Returns an OwnerCar!
Arguments
| Name | Description |
|---|---|
input - AddCarToOwnerPlanInput!
|
Example
Query
mutation addCarToOwnerPlan($input: AddCarToOwnerPlanInput!) {
addCarToOwnerPlan(input: $input) {
createdAt
id
nickname
plate
state
updatedAt
}
}
Variables
{"input": AddCarToOwnerPlanInput}
Response
{
"data": {
"addCarToOwnerPlan": {
"createdAt": "2007-12-03T10:15:30Z",
"id": 4,
"nickname": "abc123",
"plate": "xyz789",
"state": "abc123",
"updatedAt": "2007-12-03T10:15:30Z"
}
}
}
archiveNote
Example
Query
mutation archiveNote($id: ID!) {
archiveNote(id: $id) {
archivedAt
archivedBy {
...EmployeeFragment
}
createdAt
createdBy {
...EmployeeFragment
}
customerId
id
note
updatedAt
}
}
Variables
{"id": "4"}
Response
{
"data": {
"archiveNote": {
"archivedAt": "2007-12-03T10:15:30Z",
"archivedBy": Employee,
"createdAt": "2007-12-03T10:15:30Z",
"createdBy": Employee,
"customerId": 4,
"id": "4",
"note": "xyz789",
"updatedAt": "2007-12-03T10:15:30Z"
}
}
}
cancelCarRemoval
Response
Returns a MembershipCar!
Arguments
| Name | Description |
|---|---|
input - CancelCarRemovalInput!
|
Example
Query
mutation cancelCarRemoval($input: CancelCarRemovalInput!) {
cancelCarRemoval(input: $input) {
car {
...CarFragment
}
createdAt
id
nickname
removingAt
}
}
Variables
{"input": CancelCarRemovalInput}
Response
{
"data": {
"cancelCarRemoval": {
"car": Car,
"createdAt": "2007-12-03T10:15:30Z",
"id": 4,
"nickname": "abc123",
"removingAt": "2007-12-03T10:15:30Z"
}
}
}
createDiscount
Description
Create a new discount. Either amountOff or percentOff must be specified, but not both
Response
Returns a Discount!
Arguments
| Name | Description |
|---|---|
input - CreateDiscountInput!
|
Example
Query
mutation createDiscount($input: CreateDiscountInput!) {
createDiscount(input: $input) {
amountOff
availabilitySchedule {
...ScheduleFragment
}
createdAt
duration
durationInMonths
id
maxRedemptions
name
percentOff
redeemBy
updatedAt
}
}
Variables
{"input": CreateDiscountInput}
Response
{
"data": {
"createDiscount": {
"amountOff": 987,
"availabilitySchedule": Schedule,
"createdAt": "2007-12-03T10:15:30Z",
"duration": "FOREVER",
"durationInMonths": 123,
"id": "4",
"maxRedemptions": 123,
"name": "abc123",
"percentOff": 987,
"redeemBy": "2007-12-03T10:15:30Z",
"updatedAt": "2007-12-03T10:15:30Z"
}
}
}
createNote
Response
Returns a Note!
Arguments
| Name | Description |
|---|---|
input - CreateNoteInput!
|
Example
Query
mutation createNote($input: CreateNoteInput!) {
createNote(input: $input) {
archivedAt
archivedBy {
...EmployeeFragment
}
createdAt
createdBy {
...EmployeeFragment
}
customerId
id
note
updatedAt
}
}
Variables
{"input": CreateNoteInput}
Response
{
"data": {
"createNote": {
"archivedAt": "2007-12-03T10:15:30Z",
"archivedBy": Employee,
"createdAt": "2007-12-03T10:15:30Z",
"createdBy": Employee,
"customerId": "4",
"id": 4,
"note": "xyz789",
"updatedAt": "2007-12-03T10:15:30Z"
}
}
}
createOwnerPlan
Description
Create a new owner plan
Response
Returns an OwnerPlan!
Arguments
| Name | Description |
|---|---|
input - CreateOwnerPlanInput!
|
Example
Query
mutation createOwnerPlan($input: CreateOwnerPlanInput!) {
createOwnerPlan(input: $input) {
cars {
...OwnerCarFragment
}
city
createdAt
description
email
expiresAt
id
name
phone
state
street1
street2
updatedAt
washPackage {
...WashPackageFragment
}
washPackageId
zip
}
}
Variables
{"input": CreateOwnerPlanInput}
Response
{
"data": {
"createOwnerPlan": {
"cars": [OwnerCar],
"city": "xyz789",
"createdAt": "2007-12-03T10:15:30Z",
"description": "xyz789",
"email": "abc123",
"expiresAt": "2007-12-03T10:15:30Z",
"id": "4",
"name": "abc123",
"phone": "abc123",
"state": "xyz789",
"street1": "xyz789",
"street2": "xyz789",
"updatedAt": "2007-12-03T10:15:30Z",
"washPackage": WashPackage,
"washPackageId": 4,
"zip": "xyz789"
}
}
}
createUser
Description
Create a new user. Requires 'users:manage' permission
Response
Returns a MutateUserResponse!
Arguments
| Name | Description |
|---|---|
input - CreateUserInput!
|
User creation parameters |
Example
Query
mutation createUser($input: CreateUserInput!) {
createUser(input: $input) {
tempPassword
user {
...UserFragment
}
}
}
Variables
{"input": CreateUserInput}
Response
{
"data": {
"createUser": {
"tempPassword": "xyz789",
"user": User
}
}
}
createWashPackage
Description
Create a new Wash package. Requires the 'wash-packages:manage' permission
Response
Returns a WashPackage!
Arguments
| Name | Description |
|---|---|
input - CreateWashPackageInput!
|
Example
Query
mutation createWashPackage($input: CreateWashPackageInput!) {
createWashPackage(input: $input) {
createdAt
description
externalId
id
name
updatedAt
}
}
Variables
{"input": CreateWashPackageInput}
Response
{
"data": {
"createWashPackage": {
"createdAt": "2007-12-03T10:15:30Z",
"description": "abc123",
"externalId": "xyz789",
"id": "4",
"name": "xyz789",
"updatedAt": "2007-12-03T10:15:30Z"
}
}
}
deactivateUser
Description
Deactivate a user account, preventing them from logging in. Requires 'users:manage' permission
Example
Query
mutation deactivateUser($id: ID!) {
deactivateUser(id: $id) {
company {
...SimpleCompanyFragment
}
createdAt
email
externalId
groups {
...GroupFragment
}
id
isActive
name
permissions
phone
updatedAt
username
}
}
Variables
{"id": 4}
Response
{
"data": {
"deactivateUser": {
"company": SimpleCompany,
"createdAt": "2007-12-03T10:15:30Z",
"email": "test@test.com",
"externalId": "xyz789",
"groups": [Group],
"id": 4,
"isActive": true,
"name": "xyz789",
"permissions": ["abc123"],
"phone": "+17895551234",
"updatedAt": "2007-12-03T10:15:30Z",
"username": "xyz789"
}
}
}
deleteOwnerPlan
Description
Delete an owner plan (soft delete)
mergeCustomers
Description
Merge one Rollerup customer into another. The source customer's subscriptions, paid invoices, and stripe customers are re-pointed to the target; any null fields on the target are backfilled from the source; the source row is then hard-deleted. A snapshot of the source row is preserved in the customer_merges audit table. Requires the 'customers:manage' permission.
Response
Returns a RollerupCustomer!
Arguments
| Name | Description |
|---|---|
input - MergeCustomersInput!
|
Example
Query
mutation mergeCustomers($input: MergeCustomersInput!) {
mergeCustomers(input: $input) {
city
country
createdAt
email
id
isActiveMember
name
notes {
...NoteFragment
}
phone
state
street1
street2
subscriptions {
...RollerupSubscriptionFragment
}
updatedAt
zip
}
}
Variables
{"input": MergeCustomersInput}
Response
{
"data": {
"mergeCustomers": {
"city": "xyz789",
"country": "xyz789",
"createdAt": "2007-12-03T10:15:30Z",
"email": "test@test.com",
"id": "4",
"isActiveMember": false,
"name": "xyz789",
"notes": [Note],
"phone": "+17895551234",
"state": "xyz789",
"street1": "xyz789",
"street2": "xyz789",
"subscriptions": [RollerupSubscription],
"updatedAt": "2007-12-03T10:15:30Z",
"zip": "xyz789"
}
}
}
reactivateUser
Description
Reactivate a previously deactivated user account, restoring their ability to log in. Requires 'users:manage' permission
Example
Query
mutation reactivateUser($id: ID!) {
reactivateUser(id: $id) {
company {
...SimpleCompanyFragment
}
createdAt
email
externalId
groups {
...GroupFragment
}
id
isActive
name
permissions
phone
updatedAt
username
}
}
Variables
{"id": 4}
Response
{
"data": {
"reactivateUser": {
"company": SimpleCompany,
"createdAt": "2007-12-03T10:15:30Z",
"email": "test@test.com",
"externalId": "abc123",
"groups": [Group],
"id": "4",
"isActive": false,
"name": "xyz789",
"permissions": ["xyz789"],
"phone": "+17895551234",
"updatedAt": "2007-12-03T10:15:30Z",
"username": "abc123"
}
}
}
removeCarFromMembership
Response
Returns a MembershipCar!
Arguments
| Name | Description |
|---|---|
input - RemoveCarFromMembershipInput!
|
Example
Query
mutation removeCarFromMembership($input: RemoveCarFromMembershipInput!) {
removeCarFromMembership(input: $input) {
car {
...CarFragment
}
createdAt
id
nickname
removingAt
}
}
Variables
{"input": RemoveCarFromMembershipInput}
Response
{
"data": {
"removeCarFromMembership": {
"car": Car,
"createdAt": "2007-12-03T10:15:30Z",
"id": 4,
"nickname": "abc123",
"removingAt": "2007-12-03T10:15:30Z"
}
}
}
removeCarFromOwnerPlan
Description
Remove a car from an owner plan
updateCustomer
Description
Update a Rollerup customer's name, email, or phone. Only fields provided in the input are updated. If the new email matches another customer in the same company, the mutation fails with a CUSTOMER_EMAIL_CONFLICT error whose extensions include the conflicting customer id so the client can offer a merge.
Response
Returns a RollerupCustomer!
Arguments
| Name | Description |
|---|---|
input - UpdateCustomerInput!
|
Example
Query
mutation updateCustomer($input: UpdateCustomerInput!) {
updateCustomer(input: $input) {
city
country
createdAt
email
id
isActiveMember
name
notes {
...NoteFragment
}
phone
state
street1
street2
subscriptions {
...RollerupSubscriptionFragment
}
updatedAt
zip
}
}
Variables
{"input": UpdateCustomerInput}
Response
{
"data": {
"updateCustomer": {
"city": "xyz789",
"country": "abc123",
"createdAt": "2007-12-03T10:15:30Z",
"email": "test@test.com",
"id": "4",
"isActiveMember": false,
"name": "xyz789",
"notes": [Note],
"phone": "+17895551234",
"state": "abc123",
"street1": "xyz789",
"street2": "abc123",
"subscriptions": [RollerupSubscription],
"updatedAt": "2007-12-03T10:15:30Z",
"zip": "abc123"
}
}
}
updateOwnerPlan
Description
Update an existing owner plan
Response
Returns an OwnerPlan!
Arguments
| Name | Description |
|---|---|
input - UpdateOwnerPlanInput!
|
Example
Query
mutation updateOwnerPlan($input: UpdateOwnerPlanInput!) {
updateOwnerPlan(input: $input) {
cars {
...OwnerCarFragment
}
city
createdAt
description
email
expiresAt
id
name
phone
state
street1
street2
updatedAt
washPackage {
...WashPackageFragment
}
washPackageId
zip
}
}
Variables
{"input": UpdateOwnerPlanInput}
Response
{
"data": {
"updateOwnerPlan": {
"cars": [OwnerCar],
"city": "xyz789",
"createdAt": "2007-12-03T10:15:30Z",
"description": "xyz789",
"email": "xyz789",
"expiresAt": "2007-12-03T10:15:30Z",
"id": 4,
"name": "abc123",
"phone": "xyz789",
"state": "xyz789",
"street1": "abc123",
"street2": "xyz789",
"updatedAt": "2007-12-03T10:15:30Z",
"washPackage": WashPackage,
"washPackageId": 4,
"zip": "abc123"
}
}
}
updateOwnerPlanCar
Description
Update a car on an owner plan (e.g., change nickname)
Response
Returns an OwnerCar!
Arguments
| Name | Description |
|---|---|
input - UpdateOwnerPlanCarInput!
|
Example
Query
mutation updateOwnerPlanCar($input: UpdateOwnerPlanCarInput!) {
updateOwnerPlanCar(input: $input) {
createdAt
id
nickname
plate
state
updatedAt
}
}
Variables
{"input": UpdateOwnerPlanCarInput}
Response
{
"data": {
"updateOwnerPlanCar": {
"createdAt": "2007-12-03T10:15:30Z",
"id": 4,
"nickname": "abc123",
"plate": "abc123",
"state": "xyz789",
"updatedAt": "2007-12-03T10:15:30Z"
}
}
}
updateUser
Description
Update an existing user. Requires 'users:manage' permission
Response
Returns a MutateUserResponse!
Arguments
| Name | Description |
|---|---|
input - UpdateUserInput!
|
User update parameters |
Example
Query
mutation updateUser($input: UpdateUserInput!) {
updateUser(input: $input) {
tempPassword
user {
...UserFragment
}
}
}
Variables
{"input": UpdateUserInput}
Response
{
"data": {
"updateUser": {
"tempPassword": "xyz789",
"user": User
}
}
}
updateWashPackage
Description
Update an existing Wash package. Requires the 'wash-packages:manage' permission
Response
Returns a WashPackage!
Arguments
| Name | Description |
|---|---|
input - UpdateWashPackageInput!
|
Example
Query
mutation updateWashPackage($input: UpdateWashPackageInput!) {
updateWashPackage(input: $input) {
createdAt
description
externalId
id
name
updatedAt
}
}
Variables
{"input": UpdateWashPackageInput}
Response
{
"data": {
"updateWashPackage": {
"createdAt": "2007-12-03T10:15:30Z",
"description": "xyz789",
"externalId": "abc123",
"id": "4",
"name": "xyz789",
"updatedAt": "2007-12-03T10:15:30Z"
}
}
}
Types
AddCarToMembershipInput
AddCarToOwnerPlanInput
Description
Input for adding a car to an owner plan
Example
{
"nickname": "abc123",
"ownerPlanId": 4,
"plate": "abc123",
"state": "xyz789"
}
ArchivedReason
Description
Why a record was archived. USER means a user explicitly archived it. SYSTEM means it was automatically archived because a newer version replaced it. CASCADE means it was automatically archived alongside a parent record being archived (e.g. a Price cascade-archived when its Product is archived).
Values
| Enum Value | Description |
|---|---|
|
|
Archived automatically alongside a parent record (e.g. Price cascade-archived with its Product) |
|
|
Archived automatically by the system (e.g. replaced by a newer version) |
|
|
Archived explicitly by a user |
Example
"CASCADE"
BillingFrequency
Description
Billing frequency options for subscription prices
Values
| Enum Value | Description |
|---|---|
|
|
Billed monthly |
|
|
Billed quarterly (every 3 months) |
|
|
Billed yearly |
Example
"MONTHLY"
Boolean
Description
The Boolean scalar type represents true or false.
CancelCarRemovalInput
Car
Fields
| Field Name | Description |
|---|---|
bodyType - String
|
The body type of the car |
color - String
|
The color of the car |
createdAt - DateTime!
|
Time when this car was created |
customer - RollerupCustomer
|
The customer associated with the car |
customerId - String
|
The customer ID associated with the car |
id - ID!
|
|
isMember - Boolean!
|
Whether the car belongs to a member or not |
lastVisitedAt - DateTime
|
Timestamp of the vehicle's most recent visit |
lastVisitedLocation - Location
|
Location where the vehicle was last seen |
make - String
|
The make of the car |
membership - Membership
|
The membership associated with the car |
membershipId - String
|
The membership ID associated with the car |
model - String
|
The model of the car |
nickname - String
|
The nickname associated with the car |
plate - String!
|
The plate number of the car |
rfidTag - String
|
The RFID tag, if there is one, on the car |
state - String!
|
The state of the car |
stripeCustomer - StripeCustomer
|
The Stripe customer associated with the car Use RollerupCustomer instead |
totalVisits - Int!
|
Total number of visits across all locations |
updatedAt - DateTime!
|
Time when this car was last updated |
year - String
|
The year of the car |
Example
{
"bodyType": "abc123",
"color": "abc123",
"createdAt": "2007-12-03T10:15:30Z",
"customer": RollerupCustomer,
"customerId": "abc123",
"id": 4,
"isMember": true,
"lastVisitedAt": "2007-12-03T10:15:30Z",
"lastVisitedLocation": Location,
"make": "abc123",
"membership": Membership,
"membershipId": "xyz789",
"model": "xyz789",
"nickname": "xyz789",
"plate": "abc123",
"rfidTag": "xyz789",
"state": "xyz789",
"stripeCustomer": StripeCustomer,
"totalVisits": 123,
"updatedAt": "2007-12-03T10:15:30Z",
"year": "abc123"
}
CarPage
Card
Description
Represents a card used to make a payment.
Example
{
"brand": "xyz789",
"expMonth": 123,
"expYear": 123,
"id": 4,
"last4": "abc123"
}
CarsQueryInput
Description
Pagination input for querying cars. Supports both forward and backward pagination. Use 'first' and 'after' for forward pagination, or 'last' and 'before' for backward pagination.
Fields
| Input Field | Description |
|---|---|
after - String
|
A cursor for pagination, returns items after this cursor (forward pagination) |
before - String
|
A cursor for pagination, returns items before this cursor (backward pagination) |
customerId - String
|
A customer ID to filter vehicles by |
first - Int
|
The number of items to return from the beginning of the list (forward pagination) |
last - Int
|
The number of items to return from the end of the list (backward pagination) |
search - String
|
A search term to filter vehicles by, typically a plate number |
Example
{
"after": "xyz789",
"before": "abc123",
"customerId": "abc123",
"first": 123,
"last": 987,
"search": "xyz789"
}
CreateDiscountInput
Description
Input for creating a new discount. You must specify either amountOff (fixed amount) or percentOff (percentage), but not both. The duration determines how long the discount applies to subscriptions.
Fields
| Input Field | Description |
|---|---|
amountOff - Int
|
Fixed amount to discount in cents (e.g., 500 for $5.00 off). Mutually exclusive with percentOff |
availabilitySchedule - ScheduleInput
|
A schedule that describes when this discount is available for redemption (null for always available) |
duration - DiscountDuration!
|
How long the discount applies to a subscription |
durationInMonths - Int
|
Number of months the discount is applied (required when duration is REPEATING) |
maxRedemptions - Int
|
Maximum number of times this discount can be redeemed (null for unlimited) |
name - String!
|
Human-readable name for the discount |
percentOff - Int
|
Percentage off (e.g., 20 for 20% off). Mutually exclusive with amountOff |
redeemBy - DateTime
|
Expiration date for the discount code (null for no expiration) |
Example
{
"amountOff": 987,
"availabilitySchedule": ScheduleInput,
"duration": "FOREVER",
"durationInMonths": 123,
"maxRedemptions": 123,
"name": "abc123",
"percentOff": 123,
"redeemBy": "2007-12-03T10:15:30Z"
}
CreateNoteInput
CreateOwnerPlanInput
Description
Input for creating a new owner plan
Fields
| Input Field | Description |
|---|---|
city - String
|
City |
description - String
|
Description of the owner plan |
email - String
|
Email address for the owner |
expiresAt - DateTime
|
When this owner plan expires (null for no expiration) |
name - String!
|
Name of the owner plan (required) |
phone - String
|
Phone number for the owner |
state - String
|
State |
street1 - String
|
Street address line 1 |
street2 - String
|
Street address line 2 |
washPackageId - ID!
|
The wash package ID that this owner plan provides (required) |
zip - String
|
ZIP code |
Example
{
"city": "xyz789",
"description": "abc123",
"email": "xyz789",
"expiresAt": "2007-12-03T10:15:30Z",
"name": "xyz789",
"phone": "abc123",
"state": "abc123",
"street1": "abc123",
"street2": "abc123",
"washPackageId": 4,
"zip": "xyz789"
}
CreateUserInput
Description
Input for creating a new user in the system. Note: If username is provided, either password must be set or issueTempPassword must be true.
Fields
| Input Field | Description |
|---|---|
email - EmailAddress
|
Email address of the user (must be valid email format) |
externalId - String
|
Optional external system identifier for the user |
groupIds - [String!]!
|
List of group IDs the user should belong to |
name - String!
|
Full name of the user |
phone - PhoneNumber
|
Phone number of the user (must be valid phone format - example: +12345678901) |
username - String
|
Unique username for authentication. If provided, a temporary password will be returned in the response |
Example
{
"email": "test@test.com",
"externalId": "abc123",
"groupIds": ["abc123"],
"name": "xyz789",
"phone": "+17895551234",
"username": "xyz789"
}
CreateWashPackageInput
Description
Input for creating a new wash package
Example
{
"description": "abc123",
"externalId": "abc123",
"name": "xyz789"
}
CustomersInput
Description
Input for searching Rollerup customers with multiple optional filter criteria. Supports cursor-based pagination. Multiple filters are combined using AND logic.
Fields
| Input Field | Description |
|---|---|
after - String
|
A cursor for pagination, returns items after this cursor (forward pagination) |
before - String
|
A cursor for pagination, returns items before this cursor (backward pagination) |
email - String
|
Filter by customer email address (case-insensitive partial match) |
first - Int
|
The number of items to return from the beginning of the list (forward pagination) |
isActiveMember - Boolean
|
Filter by active member status. A customer is an active member if they have at least one car assigned to a membership (i.e. a membership_car exists). This is independent of subscription billing status. |
last - Int
|
The number of items to return from the end of the list (backward pagination) |
lastFour - String
|
Filter by last four digits of payment method (card) |
name - String
|
Filter by customer name (case-insensitive partial match) |
phone - String
|
Filter by phone number (E.164 exact match if valid, otherwise partial match) |
plate - String
|
Filter by vehicle license plate (case-insensitive, normalized) |
Example
{
"after": "abc123",
"before": "abc123",
"email": "abc123",
"first": 987,
"isActiveMember": false,
"last": 123,
"lastFour": "abc123",
"name": "xyz789",
"phone": "xyz789",
"plate": "abc123"
}
CustomersPage
Description
Paginated result for Rollerup customer search queries
Fields
| Field Name | Description |
|---|---|
nodes - [RollerupCustomer!]!
|
List of customers matching the search criteria |
pageInfo - PageInfo!
|
Pagination metadata including cursors and page position |
Example
{
"nodes": [RollerupCustomer],
"pageInfo": PageInfo
}
DateTime
Example
"2007-12-03T10:15:30Z"
Discount
Description
Represents a discount that can be applied to subscriptions or purchases. Discounts can be either a fixed amount off or a percentage off the total.
Fields
| Field Name | Description |
|---|---|
amountOff - Int
|
Fixed amount to discount in cents (e.g., 500 for $5.00 off) |
availabilitySchedule - Schedule
|
A schedule that describes when this discount is available for redemption (null for always available) |
createdAt - DateTime!
|
Timestamp when the discount was created |
duration - DiscountDuration!
|
How long the discount applies to a subscription |
durationInMonths - Int
|
Number of months the discount is applied (only used when duration is REPEATING) |
id - ID!
|
Unique identifier for the discount |
maxRedemptions - Int
|
Maximum number of times this discount can be redeemed (null for unlimited) |
name - String!
|
Human-readable name for the discount |
percentOff - Int
|
Percentage off (e.g., 20 for 20% off) |
redeemBy - DateTime
|
Expiration date for the discount code (null for no expiration) |
updatedAt - DateTime!
|
Timestamp when the discount was last updated |
Example
{
"amountOff": 123,
"availabilitySchedule": Schedule,
"createdAt": "2007-12-03T10:15:30Z",
"duration": "FOREVER",
"durationInMonths": 987,
"id": 4,
"maxRedemptions": 123,
"name": "xyz789",
"percentOff": 123,
"redeemBy": "2007-12-03T10:15:30Z",
"updatedAt": "2007-12-03T10:15:30Z"
}
DiscountDuration
Description
Duration types for how long a discount applies to a subscription
Values
| Enum Value | Description |
|---|---|
|
|
Apply discount to all payments indefinitely |
|
|
Apply discount only to the first payment |
|
|
Apply discount for a specific number of months (requires durationInMonths) |
Example
"FOREVER"
DiscountPage
Description
Paginated result for discounts
Fields
| Field Name | Description |
|---|---|
nodes - [Discount!]!
|
List of discounts in the current page |
pageInfo - PageInfo!
|
Pagination metadata including cursors and page position |
Example
{
"nodes": [Discount],
"pageInfo": PageInfo
}
DiscountQueryInput
Description
Input for querying discounts with optional filter criteria. Supports both forward and backward cursor-based pagination. Use 'first' and 'after' for forward pagination, or 'last' and 'before' for backward pagination.
Fields
| Input Field | Description |
|---|---|
active - Boolean
|
Filter by active status (true for discounts that haven't expired and haven't reached max redemptions) |
after - String
|
A cursor for pagination, returns items after this cursor (forward pagination) |
before - String
|
A cursor for pagination, returns items before this cursor (backward pagination) |
expiresEnd - DateTime
|
Filter for discounts that expire on or before this date |
expiresStart - DateTime
|
Filter for discounts that expire on or after this date |
first - Int
|
The number of items to return from the beginning of the list (forward pagination) |
last - Int
|
The number of items to return from the end of the list (backward pagination) |
name - String
|
Filter by discount name (case-insensitive partial match) |
Example
{
"active": false,
"after": "abc123",
"before": "xyz789",
"expiresEnd": "2007-12-03T10:15:30Z",
"expiresStart": "2007-12-03T10:15:30Z",
"first": 987,
"last": 987,
"name": "xyz789"
}
EmailAddress
Example
"test@test.com"
Employee
Description
Represents an employee. This is backed by the same data as the User model, but with less fields and without the same permission restrictions.
Fields
| Field Name | Description |
|---|---|
car - Car
|
The car assigned to the employee |
createdAt - DateTime!
|
Timestamp when the employee was created |
externalId - String
|
An id from an system external to Rollerup for reference purposes |
id - ID!
|
Unique identifier for the employee |
isActive - Boolean!
|
Whether or not the employee is still active in Rollerup |
name - String
|
Name of the employee |
updatedAt - DateTime!
|
Timestamp when the employee was last updated |
Example
{
"car": Car,
"createdAt": "2007-12-03T10:15:30Z",
"externalId": "xyz789",
"id": "4",
"isActive": true,
"name": "abc123",
"updatedAt": "2007-12-03T10:15:30Z"
}
EmployeesInput
Description
Input for querying employees. Supports both forward and backward pagination. Use 'first' and 'after' for forward pagination, or 'last' and 'before' for backward pagination.
Fields
| Input Field | Description |
|---|---|
after - String
|
A cursor for pagination, returns items after this cursor (forward pagination) |
before - String
|
A cursor for pagination, returns items before this cursor (backward pagination) |
first - Int
|
The number of items to return from the beginning of the list (forward pagination) |
last - Int
|
The number of items to return from the end of the list (backward pagination) |
Example
{
"after": "abc123",
"before": "xyz789",
"first": 987,
"last": 987
}
EmployeesPage
Description
Paginated result for employee queries
Fields
| Field Name | Description |
|---|---|
nodes - [Employee!]!
|
List of employees in the current page |
pageInfo - PageInfo!
|
Pagination metadata including cursors and page position |
Example
{
"nodes": [Employee],
"pageInfo": PageInfo
}
Float
Description
The Float scalar type represents signed double-precision fractional values as specified by IEEE 754.
Example
987.65
Group
Description
Represents a user group for organizing users and managing permissions
Example
{
"description": "xyz789",
"id": 4,
"isAdmin": true,
"name": "abc123",
"permissions": ["abc123"],
"slug": "xyz789"
}
ID
Description
The ID scalar type represents a unique identifier, often used to refetch an object or as key for a cache. The ID type appears in a JSON response as a String; however, it is not intended to be human-readable. When expected as an input type, any string (such as "4") or integer (such as 4) input value will be accepted as an ID.
Example
"4"
Int
Description
The Int scalar type represents non-fractional signed whole numeric values. Int can represent values between -(2^31) and 2^31 - 1.
Example
123
ListOwnerPlansInput
Description
Pagination input for querying owner plans. Supports both forward and backward pagination. Use 'first' and 'after' for forward pagination, or 'last' and 'before' for backward pagination.
Fields
| Input Field | Description |
|---|---|
after - String
|
A cursor for pagination, returns items after this cursor (forward pagination) |
before - String
|
A cursor for pagination, returns items before this cursor (backward pagination) |
first - Int
|
The number of items to return from the beginning of the list (forward pagination) |
last - Int
|
The number of items to return from the end of the list (backward pagination) |
Example
{
"after": "xyz789",
"before": "abc123",
"first": 987,
"last": 987
}
ListOwnerVisitsInput
Description
Pagination input for querying owner visits. Supports both forward and backward pagination. Use 'first' and 'after' for forward pagination, or 'last' and 'before' for backward pagination.
Fields
| Input Field | Description |
|---|---|
after - String
|
A cursor for pagination, returns items after this cursor (forward pagination) |
before - String
|
A cursor for pagination, returns items before this cursor (backward pagination) |
carId - ID
|
if provided filter visits to just those for this particular car |
first - Int
|
The number of items to return from the beginning of the list (forward pagination) |
last - Int
|
The number of items to return from the end of the list (backward pagination) |
ownerPlanId - ID!
|
Example
{
"after": "abc123",
"before": "abc123",
"carId": "4",
"first": 123,
"last": 987,
"ownerPlanId": "4"
}
LocalDate
Example
"2020-07-19"
Location
Description
Represents a location in the system
Fields
| Field Name | Description |
|---|---|
cashEnabled - Boolean!
|
Whether cash payments are enabled for this location |
city - String
|
City |
companyId - ID!
|
The company this location belongs to |
createdAt - DateTime!
|
Timestamp when the location was created |
externalId - String
|
External system identifier for the location |
id - ID!
|
Unique identifier for the location |
isVirtual - Boolean!
|
Whether this is a virtual location |
name - String!
|
Display name of the location |
shortName - String
|
Short display name of the location |
state - USStateCode
|
State or province |
street - String
|
Street address |
stripeAccountId - String!
|
The Stripe account ID used by this location |
stripeTerminalLocationId - String
|
Stripe terminal location ID |
taxEnabled - Boolean!
|
Whether tax calculation is enabled for this location |
timezone - String!
|
Location timezone |
updatedAt - DateTime!
|
Timestamp when the location was last updated |
zip - USPostalCode
|
ZIP or postal code |
Example
{
"cashEnabled": false,
"city": "abc123",
"companyId": 4,
"createdAt": "2007-12-03T10:15:30Z",
"externalId": "abc123",
"id": "4",
"isVirtual": true,
"name": "xyz789",
"shortName": "xyz789",
"state": USStateCode,
"street": "xyz789",
"stripeAccountId": "abc123",
"stripeTerminalLocationId": "abc123",
"taxEnabled": false,
"timezone": "abc123",
"updatedAt": "2007-12-03T10:15:30Z",
"zip": USPostalCode
}
LocationPage
Description
Paginated result for location queries
Fields
| Field Name | Description |
|---|---|
nodes - [Location!]!
|
List of locations in the current page |
pageInfo - PageInfo!
|
Pagination metadata including cursors and page position |
Example
{
"nodes": [Location],
"pageInfo": PageInfo
}
LocationQueryInput
Description
Pagination input for querying locations. Supports both forward and backward pagination. Use 'first' and 'after' for forward pagination, or 'last' and 'before' for backward pagination.
Fields
| Input Field | Description |
|---|---|
after - String
|
A cursor for pagination, returns items after this cursor (forward pagination) |
before - String
|
A cursor for pagination, returns items before this cursor (backward pagination) |
first - Int
|
The number of items to return from the beginning of the list (forward pagination) |
last - Int
|
The number of items to return from the end of the list (backward pagination) |
Example
{
"after": "xyz789",
"before": "xyz789",
"first": 123,
"last": 987
}
Membership
Fields
| Field Name | Description |
|---|---|
active - Boolean!
|
Whether this membership is active |
carLimit - Int!
|
Maximum number of cars allowed on this membership |
createdAt - DateTime!
|
Timestamp when the membership was created |
id - String!
|
Membership ID |
isFleet - Boolean!
|
Whether this membership uses fleet-style billing / management |
membershipCars - [MembershipCar!]!
|
All cars linked to this membership, including those scheduled for removal |
price - Price!
|
Price |
priceId - String!
|
Price ID |
Example
{
"active": false,
"carLimit": 987,
"createdAt": "2007-12-03T10:15:30Z",
"id": "abc123",
"isFleet": true,
"membershipCars": [MembershipCar],
"price": Price,
"priceId": "abc123"
}
MembershipCar
Description
A car linked to a subscription membership, including scheduled end-of-period removal.
Example
{
"car": Car,
"createdAt": "2007-12-03T10:15:30Z",
"id": 4,
"nickname": "xyz789",
"removingAt": "2007-12-03T10:15:30Z"
}
MembershipCarChangeIntent
Description
The kind of change being previewed against a membership's linked cars.
Values
| Enum Value | Description |
|---|---|
|
|
Adding a new car to the membership |
|
|
Cancelling a previously-scheduled removal |
|
|
Scheduling an existing car for removal at end of period |
Example
"add"
MembershipCarChangePreview
Description
Preview of a membership car change. Reflects the upcoming invoice for the proposed change without mutating any state.
Fields
| Field Name | Description |
|---|---|
changeType - SubscriptionChangeType!
|
Whether this change is an upgrade (more cars / charge now) or downgrade |
immediateTotal - Int!
|
Amount that would be invoiced immediately, in the smallest currency unit |
lineItems - [MembershipCarChangePreviewLineItem!]!
|
Line items for the immediate (proration) preview invoice |
newVehicleQuantity - Int!
|
Number of vehicles on the membership after the change is applied |
nextBillingDate - DateTime
|
When the next recurring invoice would be billed |
nextInvoiceTotal - Int!
|
Total of the next recurring invoice after the change |
Example
{
"changeType": "downgrade",
"immediateTotal": 123,
"lineItems": [MembershipCarChangePreviewLineItem],
"newVehicleQuantity": 987,
"nextBillingDate": "2007-12-03T10:15:30Z",
"nextInvoiceTotal": 123
}
MembershipCarChangePreviewLineItem
Description
A line item from the upcoming invoice preview.
Example
{
"amount": 987,
"description": "xyz789",
"proration": false,
"quantity": 123
}
MergeCustomersInput
Description
Input for merging one Rollerup customer into another. The source customer is hard-deleted after dependent records are re-pointed to the target.
Example
{
"sourceId": "4",
"targetId": "4"
}
MutateUserResponse
Note
Fields
| Field Name | Description |
|---|---|
archivedAt - DateTime
|
The timestamp when the note was archived |
archivedBy - Employee
|
The user who archived the note |
createdAt - DateTime!
|
The timestamp when the note was created |
createdBy - Employee!
|
The user who created the note |
customerId - ID!
|
The ID of the customer |
id - ID!
|
Unique identifier for the note |
note - String!
|
The note content |
updatedAt - DateTime!
|
The timestamp when the note was last updated |
Example
{
"archivedAt": "2007-12-03T10:15:30Z",
"archivedBy": Employee,
"createdAt": "2007-12-03T10:15:30Z",
"createdBy": Employee,
"customerId": 4,
"id": "4",
"note": "xyz789",
"updatedAt": "2007-12-03T10:15:30Z"
}
OwnerCar
Description
A vehicle registered to an owner plan
Fields
| Field Name | Description |
|---|---|
createdAt - DateTime!
|
Timestamp when this car was registered to the owner plan |
id - ID!
|
Unique identifier for this owner car registration |
nickname - String
|
Optional nickname for this vehicle |
plate - String
|
the license plate of this vehicle |
state - String
|
the state of this vehicle |
updatedAt - DateTime!
|
Timestamp when this record was last updated |
Example
{
"createdAt": "2007-12-03T10:15:30Z",
"id": "4",
"nickname": "abc123",
"plate": "abc123",
"state": "xyz789",
"updatedAt": "2007-12-03T10:15:30Z"
}
OwnerPlan
Description
Full representation of an owner plan with nested relations. Use ownerPlan(id) query to fetch this for detail views.
Fields
| Field Name | Description |
|---|---|
cars - [OwnerCar!]!
|
Vehicles registered to this owner plan |
city - String
|
City |
createdAt - DateTime!
|
Timestamp when the owner plan was created |
description - String
|
Description of the owner plan |
email - String
|
Email address for the owner |
expiresAt - DateTime
|
When this owner plan expires (null if no expiration) |
id - ID!
|
Unique identifier for the owner plan |
name - String!
|
Name of the owner plan |
phone - String
|
Phone number for the owner |
state - String
|
State |
street1 - String
|
Street address line 1 |
street2 - String
|
Street address line 2 |
updatedAt - DateTime!
|
Timestamp when the owner plan was last updated |
washPackage - WashPackage!
|
The wash package that this owner plan provides |
washPackageId - ID!
|
The wash package ID that this owner plan provides |
zip - String
|
ZIP code |
Example
{
"cars": [OwnerCar],
"city": "xyz789",
"createdAt": "2007-12-03T10:15:30Z",
"description": "xyz789",
"email": "xyz789",
"expiresAt": "2007-12-03T10:15:30Z",
"id": "4",
"name": "abc123",
"phone": "abc123",
"state": "xyz789",
"street1": "xyz789",
"street2": "xyz789",
"updatedAt": "2007-12-03T10:15:30Z",
"washPackage": WashPackage,
"washPackageId": 4,
"zip": "abc123"
}
OwnerVisit
Description
A wash record for an owner plan
Example
{
"car": OwnerCar,
"createdAt": "2007-12-03T10:15:30Z",
"id": "4",
"visit": Visit
}
OwnerVisitsPage
Fields
| Field Name | Description |
|---|---|
nodes - [OwnerVisit!]!
|
List of owner visits in the current page |
pageInfo - PageInfo!
|
Pagination metadata including cursors and page position |
Example
{
"nodes": [OwnerVisit],
"pageInfo": PageInfo
}
PageInfo
PaidInvoice
Fields
| Field Name | Description |
|---|---|
amountAvailableToRefund - Int!
|
The amount available to refund in cents (total minus already-refunded credit notes) |
billingReason - String
|
The billing reason for the paid invoice |
card - Card
|
The card used to make the payment, if any |
createdAt - DateTime!
|
The date and time the paid invoice was created |
customer - SimpleRollerupCustomer
|
The customer who was sold to |
employee - Employee
|
The employee who made the sale |
id - ID!
|
|
invoiceUrl - String
|
The url for the invoice |
isRecharge - Boolean!
|
Whether this invoice is a recharge (subscription_cycle billing reason) |
isUpdate - Boolean!
|
Whether this invoice is an update (subscription_update billing reason) |
lineItems - [SimplePaidInvoiceLineItem!]
|
The line items that were sold in the paid invoice |
location - SimpleLocation
|
The location that the paid invoice occurred in |
stripeChargeId - String
|
The charge ID associated with the paid invoice |
stripeInvoiceId - String
|
The Stripe invoice ID associated with the paid invoice |
subscriptionId - String
|
The rollerup subscription ID associated with this paid invoice |
total - Int!
|
The total amount of the paid invoice in cents |
visit - Visit
|
The visit that the paid invoice occurred in |
Example
{
"amountAvailableToRefund": 123,
"billingReason": "abc123",
"card": Card,
"createdAt": "2007-12-03T10:15:30Z",
"customer": SimpleRollerupCustomer,
"employee": Employee,
"id": 4,
"invoiceUrl": "xyz789",
"isRecharge": false,
"isUpdate": false,
"lineItems": [SimplePaidInvoiceLineItem],
"location": SimpleLocation,
"stripeChargeId": "xyz789",
"stripeInvoiceId": "abc123",
"subscriptionId": "xyz789",
"total": 987,
"visit": Visit
}
PaidInvoicePage
Fields
| Field Name | Description |
|---|---|
nodes - [PaidInvoice!]!
|
|
pageInfo - PageInfo!
|
Example
{
"nodes": [PaidInvoice],
"pageInfo": PageInfo
}
PaidInvoicesQueryInput
Fields
| Input Field | Description |
|---|---|
after - String
|
A cursor for pagination, returns items after this cursor (forward pagination) |
before - String
|
A cursor for pagination, returns items before this cursor (backward pagination) |
cardBrand - String
|
If provided, filter by the brand of the card |
cardLast4 - String
|
If provided, filter by the last 4 digits of the card |
customerId - String
|
If provided, filter to just this customer |
employeeId - ID
|
If provided, filter by the ID of the employee |
endDate - LocalDate
|
If provided, filter by the end date of the paid invoices |
endTime - DateTime
|
If provided, filter by the end time of the paid invoices |
first - Int
|
The number of items to return from the beginning of the list (forward pagination) |
includeRecharges - Boolean
|
Include recharges (subscription_cycle billing reason) |
includeSales - Boolean!
|
Include sales (manual and subscription_create billing reasons). Default = true |
includeUpdates - Boolean
|
Include updates (subscription_update billing reason) |
last - Int
|
The number of items to return from the end of the list (backward pagination) |
locationId - ID
|
If provided, filter by the ID of the location |
locationIds - [ID!]
|
If provided, filter to paid invoices at any of these locations. Combined with locationId when both are set. |
plate - String
|
If provided, filter by the plate number of the visit |
startDate - LocalDate
|
If provided, filter by the start date of the paid invoices |
startTime - DateTime
|
If provided, filter by the start time of the paid invoices |
total - Int
|
If provided, filter by this total amount in cents |
Example
{
"after": "abc123",
"before": "xyz789",
"cardBrand": "abc123",
"cardLast4": "abc123",
"customerId": "abc123",
"employeeId": "4",
"endDate": "2020-07-19",
"endTime": "2007-12-03T10:15:30Z",
"first": 123,
"includeRecharges": false,
"includeSales": false,
"includeUpdates": true,
"last": 987,
"locationId": 4,
"locationIds": ["4"],
"plate": "xyz789",
"startDate": "2020-07-19",
"startTime": "2007-12-03T10:15:30Z",
"total": 123
}
PaymentMethod
Description
Represents a payment method (source-agnostic)
Fields
| Field Name | Description |
|---|---|
cardBrand - String
|
Card brand (Visa, Mastercard, etc) if applicable |
cardLast4 - String
|
Last 4 digits of card if applicable |
createdAt - DateTime!
|
Timestamp when the payment method was created |
id - ID!
|
Unique identifier |
source - PaymentMethodSource!
|
Source of the payment method (stripe, internal, etc) |
type - String!
|
Type of payment method (card, cash, other) |
Example
{
"cardBrand": "abc123",
"cardLast4": "xyz789",
"createdAt": "2007-12-03T10:15:30Z",
"id": "4",
"source": "INTERNAL",
"type": "xyz789"
}
PaymentMethodSource
Description
Source of the payment method (stripe, internal, etc)
Values
| Enum Value | Description |
|---|---|
|
|
|
|
|
Example
"INTERNAL"
PhoneNumber
Description
Phone number scalar that enforces E.164 format (e.g., +1234567890)
Example
"+17895551234"
PlateChange
Description
A record of a plate change (car linked or unlinked from a membership)
Fields
| Field Name | Description |
|---|---|
action - String!
|
Whether the car was linked or unlinked |
car - Car!
|
The car that was linked or unlinked |
changedBy - User
|
The user who made the change |
createdAt - DateTime!
|
Timestamp when the change occurred |
exempt - Boolean!
|
Whether this change was exempt from plate change limits |
id - ID!
|
Unique identifier |
originalCar - Car
|
The original car that was replaced (for swaps) |
Example
{
"action": "abc123",
"car": Car,
"changedBy": User,
"createdAt": "2007-12-03T10:15:30Z",
"exempt": false,
"id": 4,
"originalCar": Car
}
PlateChangeHistoryInput
Description
Input for querying plate change history
Fields
| Input Field | Description |
|---|---|
subscriptionId - String!
|
Subscription ID to get plate change history for |
Example
{"subscriptionId": "abc123"}
Prepaid
Description
Represents a prepaid that can be redeemed for wash packages
Fields
| Field Name | Description |
|---|---|
codesPerBook - Int
|
Number of codes per prepaid book (null if not set) |
companyId - ID!
|
The company this prepaid belongs to |
createdAt - DateTime!
|
Timestamp when the prepaid was created |
createdBy - Employee
|
The employee who created this prepaid |
createdById - ID
|
The employee who created this prepaid |
description - String!
|
Description of what this prepaid provides |
exportableCodeCount - Int!
|
Number of codes that can be included in an export (unactivated and not yet exported) |
exports - [SimplePrepaidExport!]!
|
List of exports for this prepaid |
id - ID!
|
Unique identifier for the prepaid |
importedFromSitewatch - Boolean!
|
Whether this prepaid was imported from Sitewatch |
maxRedemptionsPerPrepaid - Int
|
Maximum number of times this prepaid can be redeemed per prepaid code |
name - String!
|
Human-readable name for the prepaid |
updatedAt - DateTime!
|
Timestamp when the prepaid was last updated |
washPackage - WashPackage!
|
The wash package that this prepaid provides |
washPackageId - ID!
|
The wash package that this prepaid provides |
Example
{
"codesPerBook": 123,
"companyId": "4",
"createdAt": "2007-12-03T10:15:30Z",
"createdBy": Employee,
"createdById": 4,
"description": "abc123",
"exportableCodeCount": 123,
"exports": [SimplePrepaidExport],
"id": 4,
"importedFromSitewatch": true,
"maxRedemptionsPerPrepaid": 987,
"name": "abc123",
"updatedAt": "2007-12-03T10:15:30Z",
"washPackage": WashPackage,
"washPackageId": "4"
}
PrepaidBook
Description
Represents a prepaid book that contains prepaid codes
Fields
| Field Name | Description |
|---|---|
activatedAt - DateTime
|
When this book was activated (null if not yet activated) |
createdAt - DateTime!
|
Timestamp when the prepaid book was created |
id - ID!
|
Unique identifier for the prepaid book |
prepaid - Prepaid!
|
The prepaid this book belongs to |
prepaidCodes - [PrepaidCode!]!
|
List of prepaid codes in this book |
prepaidId - ID!
|
The prepaid this book belongs to |
updatedAt - DateTime!
|
Timestamp when the prepaid book was last updated |
Example
{
"activatedAt": "2007-12-03T10:15:30Z",
"createdAt": "2007-12-03T10:15:30Z",
"id": 4,
"prepaid": Prepaid,
"prepaidCodes": [PrepaidCode],
"prepaidId": 4,
"updatedAt": "2007-12-03T10:15:30Z"
}
PrepaidBookPage
Description
Paginated result for prepaid books
Fields
| Field Name | Description |
|---|---|
nodes - [PrepaidBook!]!
|
List of prepaid books in the current page |
pageInfo - PageInfo!
|
Pagination metadata including cursors and page position |
Example
{
"nodes": [PrepaidBook],
"pageInfo": PageInfo
}
PrepaidBookQueryInput
Description
Pagination input for querying prepaid books. Supports both forward and backward pagination. Use 'first' and 'after' for forward pagination, or 'last' and 'before' for backward pagination.
Fields
| Input Field | Description |
|---|---|
after - String
|
A cursor for pagination, returns items after this cursor (forward pagination) |
before - String
|
A cursor for pagination, returns items before this cursor (backward pagination) |
code - String
|
Filter by prepaid code string (returns books that contain a matching code) |
first - Int
|
The number of items to return from the beginning of the list (forward pagination) |
last - Int
|
The number of items to return from the end of the list (backward pagination) |
prepaidId - ID
|
Filter by prepaid ID |
Example
{
"after": "abc123",
"before": "abc123",
"code": "abc123",
"first": 123,
"last": 987,
"prepaidId": 4
}
PrepaidCode
Description
Represents a prepaid code that can be redeemed for a prepaid
Fields
| Field Name | Description |
|---|---|
activatedAt - DateTime
|
When this code was activated (null if not yet activated) |
code - String!
|
The code string that is typically scanned but can also be manually entered |
companyId - ID!
|
The company this prepaid code belongs to |
createdAt - DateTime!
|
Timestamp when the prepaid code was created |
drbBook - Int
|
DRB book number |
drbSeries - String
|
DRB series identifier |
drbTicket - Int
|
DRB ticket number |
id - ID!
|
Unique identifier for the prepaid code |
maxRedemptions - Int
|
Maximum number of times this code can be redeemed |
prepaid - Prepaid!
|
The prepaid this code applies to |
prepaidBookId - ID
|
The prepaid book ID this code belongs to (null if not part of a book) |
prepaidExport - SimplePrepaidExport
|
The export this code was included in (null if never exported) |
prepaidId - ID!
|
The prepaid this code applies to |
redemptions - [PrepaidCodeRedemption!]!
|
List of redemptions for this prepaid code (limited by maxRedemptionsPerPrepaid) |
redemptionsCount - Int!
|
Total count of redemptions for this prepaid code |
updatedAt - DateTime!
|
Timestamp when the prepaid code was last updated |
Example
{
"activatedAt": "2007-12-03T10:15:30Z",
"code": "xyz789",
"companyId": 4,
"createdAt": "2007-12-03T10:15:30Z",
"drbBook": 123,
"drbSeries": "abc123",
"drbTicket": 123,
"id": "4",
"maxRedemptions": 123,
"prepaid": Prepaid,
"prepaidBookId": 4,
"prepaidExport": SimplePrepaidExport,
"prepaidId": "4",
"redemptions": [PrepaidCodeRedemption],
"redemptionsCount": 123,
"updatedAt": "2007-12-03T10:15:30Z"
}
PrepaidCodePage
Description
Paginated result for prepaid codes
Fields
| Field Name | Description |
|---|---|
nodes - [PrepaidCode!]!
|
List of prepaid codes in the current page |
pageInfo - PageInfo!
|
Pagination metadata including cursors and page position |
Example
{
"nodes": [PrepaidCode],
"pageInfo": PageInfo
}
PrepaidCodeQueryInput
Description
Pagination input for querying prepaid codes. Supports both forward and backward pagination. Use 'first' and 'after' for forward pagination, or 'last' and 'before' for backward pagination.
Fields
| Input Field | Description |
|---|---|
after - String
|
A cursor for pagination, returns items after this cursor (forward pagination) |
before - String
|
A cursor for pagination, returns items before this cursor (backward pagination) |
code - String
|
Filter by prepaid code string |
first - Int
|
The number of items to return from the beginning of the list (forward pagination) |
last - Int
|
The number of items to return from the end of the list (backward pagination) |
prepaidBookId - ID
|
Filter by prepaid book ID |
prepaidId - ID
|
Filter by prepaid ID |
Example
{
"after": "xyz789",
"before": "xyz789",
"code": "xyz789",
"first": 987,
"last": 123,
"prepaidBookId": 4,
"prepaidId": 4
}
PrepaidCodeRedemption
Description
Represents a redemption of a prepaid code
Fields
| Field Name | Description |
|---|---|
createdAt - DateTime!
|
Timestamp when the redemption was created |
id - ID!
|
Unique identifier for the redemption |
location - Location!
|
The location where this code was redeemed |
locationId - ID!
|
The location where this code was redeemed |
prepaidCode - PrepaidCode!
|
The prepaid code that was redeemed |
prepaidCodeId - ID!
|
The prepaid code that was redeemed |
redeemedAt - DateTime!
|
When this code was redeemed |
redeemedBy - Employee
|
The employee who redeemed this code (null if redeemed without an employee) |
redeemedById - ID
|
The employee who redeemed this code (null if redeemed without an employee) |
updatedAt - DateTime!
|
Timestamp when the redemption was last updated |
visitId - ID
|
The visit ID associated with this redemption (null if not associated with a visit) |
Example
{
"createdAt": "2007-12-03T10:15:30Z",
"id": "4",
"location": Location,
"locationId": "4",
"prepaidCode": PrepaidCode,
"prepaidCodeId": "4",
"redeemedAt": "2007-12-03T10:15:30Z",
"redeemedBy": Employee,
"redeemedById": "4",
"updatedAt": "2007-12-03T10:15:30Z",
"visitId": 4
}
PrepaidCodeRedemptionPage
Description
Paginated result for prepaid code redemptions
Fields
| Field Name | Description |
|---|---|
nodes - [PrepaidCodeRedemption!]!
|
List of redemptions in the current page |
pageInfo - PageInfo!
|
Pagination metadata including cursors and page position |
Example
{
"nodes": [PrepaidCodeRedemption],
"pageInfo": PageInfo
}
PrepaidCodeRedemptionQueryInput
Description
Pagination input for querying prepaid code redemptions. Supports both forward and backward pagination. Use 'first' and 'after' for forward pagination, or 'last' and 'before' for backward pagination.
Fields
| Input Field | Description |
|---|---|
after - String
|
A cursor for pagination, returns items after this cursor (forward pagination) |
before - String
|
A cursor for pagination, returns items before this cursor (backward pagination) |
code - String
|
Filter by prepaid code string |
first - Int
|
The number of items to return from the beginning of the list (forward pagination) |
last - Int
|
The number of items to return from the end of the list (backward pagination) |
prepaidId - ID
|
Filter by prepaid ID |
Example
{
"after": "xyz789",
"before": "xyz789",
"code": "abc123",
"first": 987,
"last": 123,
"prepaidId": "4"
}
PrepaidPage
Description
Paginated result for prepaids
Fields
| Field Name | Description |
|---|---|
nodes - [Prepaid!]!
|
List of prepaids in the current page |
pageInfo - PageInfo!
|
Pagination metadata including cursors and page position |
Example
{
"nodes": [Prepaid],
"pageInfo": PageInfo
}
PrepaidQueryInput
Description
Pagination input for querying prepaids. Supports both forward and backward pagination. Use 'first' and 'after' for forward pagination, or 'last' and 'before' for backward pagination.
Fields
| Input Field | Description |
|---|---|
after - String
|
A cursor for pagination, returns items after this cursor (forward pagination) |
before - String
|
A cursor for pagination, returns items before this cursor (backward pagination) |
code - String
|
Filter by prepaid code string |
first - Int
|
The number of items to return from the beginning of the list (forward pagination) |
last - Int
|
The number of items to return from the end of the list (backward pagination) |
Example
{
"after": "xyz789",
"before": "xyz789",
"code": "xyz789",
"first": 123,
"last": 123
}
PreviewMembershipCarChangeInput
Fields
| Input Field | Description |
|---|---|
carId - ID
|
Required when intent is remove or cancel_removal. Must be one of the membership's currently linked cars. |
intent - MembershipCarChangeIntent!
|
The kind of change to preview |
membershipId - ID!
|
Membership being changed |
Example
{
"carId": "4",
"intent": "add",
"membershipId": "4"
}
Price
Description
Represents a price for a wash package with billing details
Fields
| Field Name | Description |
|---|---|
amount - Int!
|
Price amount in cents (e.g., 1999 = $19.99) |
archivedReason - ArchivedReason
|
Why this price was archived: USER (manually by a user), SYSTEM (automatically during archive-and-replace), or null if not archived |
availabilitySchedule - Schedule
|
A schedule that describes when this price is available for purchase (null for always available) |
availableInPos - Boolean!
|
Whether this price is currently available for selection in the POS |
availableInUnattended - Boolean!
|
Whether this price is currently available for selection in unattended purchase flow |
availableOnline - Boolean!
|
Whether this price is currently available for selection online |
billingFrequency - BillingFrequency
|
Billing frequency for subscription prices (null for one-time prices) |
createdAt - DateTime!
|
When this price was created |
currency - String!
|
Currency code (e.g., 'USD', 'EUR') |
discount - Discount
|
An (optional) promotional discount that will be applied to this price at sign-up |
displayName - String
|
Operator-editable customer-facing name. When null, the UI falls back to product.name at render time. |
id - ID!
|
Unique identifier for the price |
internalName - String
|
Admin-only annotation. When set, shown as the primary label in admin tables with the resolved display name as the secondary label. |
isArchived - Boolean!
|
Whether this price is archived and no longer active |
isDefault - Boolean!
|
Whether this is a default price for the product (automatically assigned to new locations) |
name - String!
|
Display name for this price |
pricingProfile - PricingProfile
|
The pricing profile this price applies to Use pricingProfiles instead |
pricingProfiles - [PricingProfile!]!
|
The pricing profiles this price applies to |
product - SimpleProduct
|
The product this price belongs to (null for v1 pricing-profile prices). Lightweight projection — full Product is available via a separate product(id:) query. |
sortOrder - Int!
|
Sort order for displaying the price in the POS |
tiers - [PriceTier!]!
|
Pricing tiers for graduated pricing (empty for flat-rate prices) |
trialDuration - Int
|
Duration of the free trial period (used with trialUnits) |
trialUnits - TrialUnits
|
Units for the trial duration (DAYS, WEEKS, or MONTHS) |
updatedAt - DateTime!
|
When this price was last updated |
washPackage - WashPackage
|
The wash package this price applies to (null for v2 product-catalog prices) |
Example
{
"amount": 123,
"archivedReason": "CASCADE",
"availabilitySchedule": Schedule,
"availableInPos": false,
"availableInUnattended": true,
"availableOnline": true,
"billingFrequency": "MONTHLY",
"createdAt": "2007-12-03T10:15:30Z",
"currency": "xyz789",
"discount": Discount,
"displayName": "abc123",
"id": 4,
"internalName": "abc123",
"isArchived": false,
"isDefault": true,
"name": "xyz789",
"pricingProfile": PricingProfile,
"pricingProfiles": [PricingProfile],
"product": SimpleProduct,
"sortOrder": 987,
"tiers": [PriceTier],
"trialDuration": 123,
"trialUnits": "DAYS",
"updatedAt": "2007-12-03T10:15:30Z",
"washPackage": WashPackage
}
PriceTier
Description
A pricing tier for graduated pricing. Each tier defines a unit price that applies starting at a given quantity.
Example
{
"fromQuantity": 123,
"id": "4",
"unitAmount": 123
}
PricingProfile
Description
Represents a Pricing profile in the system
Fields
| Field Name | Description |
|---|---|
createdAt - DateTime!
|
Timestamp when the pricing profile was created |
description - String
|
Pricing profile description |
id - ID!
|
Unique Pricing profile identifier |
locations - [Location!]!
|
Locations associated with the pricing profile |
name - String!
|
Pricing profile name |
prices - [Price!]!
|
Prices associated with the pricing profile |
updatedAt - DateTime!
|
Timestamp when the pricing profile was last updated |
Example
{
"createdAt": "2007-12-03T10:15:30Z",
"description": "abc123",
"id": 4,
"locations": [Location],
"name": "abc123",
"prices": [Price],
"updatedAt": "2007-12-03T10:15:30Z"
}
ProductType
Description
Product type discriminator.
Values
| Enum Value | Description |
|---|---|
|
|
|
|
|
|
|
|
|
|
|
Example
"GIFT_CARD"
RRule
Description
RFC-5545 compliant recurrence rule scalar
Example
RRule
RemoveCarFromMembershipInput
RollerupCustomer
Description
Represents a Rollerup customer with their subscriptions
Fields
| Field Name | Description |
|---|---|
city - String
|
City |
country - String
|
Country |
createdAt - DateTime!
|
Timestamp when the customer was created |
email - EmailAddress
|
Customer's email address |
id - ID!
|
Unique identifier |
isActiveMember - Boolean!
|
Whether the customer is an active member. True if the customer has at least one car assigned to a membership (i.e. a membership_car exists). This is independent of subscription billing status. |
name - String
|
Customer's full name |
notes - [Note!]!
|
List of active (non-archived) notes for this customer |
phone - PhoneNumber
|
Customer's phone number in E.164 format |
state - String
|
State |
street1 - String
|
Street address line 1 |
street2 - String
|
Street address line 2 |
subscriptions - [RollerupSubscription!]!
|
List of subscriptions for this customer |
updatedAt - DateTime!
|
Timestamp when the customer was last updated |
zip - String
|
ZIP/postal code |
Example
{
"city": "abc123",
"country": "xyz789",
"createdAt": "2007-12-03T10:15:30Z",
"email": "test@test.com",
"id": "4",
"isActiveMember": true,
"name": "abc123",
"notes": [Note],
"phone": "+17895551234",
"state": "abc123",
"street1": "xyz789",
"street2": "abc123",
"subscriptions": [RollerupSubscription],
"updatedAt": "2007-12-03T10:15:30Z",
"zip": "xyz789"
}
RollerupSubscription
Fields
| Field Name | Description |
|---|---|
billingCustomerId - String
|
Latest billing provider customer ID (e.g., Stripe 'cus_...') associated with this subscription |
billingFrequency - String!
|
Billing frequency |
billingSubscriptionId - String
|
Latest billing provider subscription ID (e.g., Stripe 'sub_...') associated with this subscription |
cancelAt - DateTime
|
Timestamp when the subscription is scheduled to be cancelled |
cancelledAt - DateTime
|
Timestamp when the subscription was cancelled |
createdAt - DateTime!
|
Timestamp when the subscription was created |
currentPeriodEnd - DateTime!
|
Current period end |
currentPeriodStart - DateTime!
|
Current period start |
customer - RollerupCustomer
|
Customer for this subscription |
customerId - String
|
Customer ID |
defaultPaymentMethod - PaymentMethod
|
Default payment method for this subscription |
id - String!
|
Subscription ID |
location - Location
|
Current location for this subscription |
locationId - String
|
Current location ID associated with this subscription |
memberships - [Membership!]!
|
Memberships belonging to this subscription |
soldAtLocation - SimpleLocation
|
Location where this subscription was sold |
soldAtLocationId - String
|
Location ID where this subscription was sold |
soldBy - User
|
Employee who sold this subscription |
soldById - String
|
Employee ID who sold this subscription |
status - String!
|
Status of this subscription |
Example
{
"billingCustomerId": "xyz789",
"billingFrequency": "abc123",
"billingSubscriptionId": "xyz789",
"cancelAt": "2007-12-03T10:15:30Z",
"cancelledAt": "2007-12-03T10:15:30Z",
"createdAt": "2007-12-03T10:15:30Z",
"currentPeriodEnd": "2007-12-03T10:15:30Z",
"currentPeriodStart": "2007-12-03T10:15:30Z",
"customer": RollerupCustomer,
"customerId": "abc123",
"defaultPaymentMethod": PaymentMethod,
"id": "xyz789",
"location": Location,
"locationId": "abc123",
"memberships": [Membership],
"soldAtLocation": SimpleLocation,
"soldAtLocationId": "abc123",
"soldBy": User,
"soldById": "abc123",
"status": "xyz789"
}
Schedule
Description
A schedule defining availability of a resource (e.g. a price or discount).
All date/time values in a Schedule follow a floating-time convention: they are serialized as UTC but should be interpreted as local times relative to the context in which the schedule is evaluated (typically the location's time zone). For example, a startDate of 2026-02-17T00:00:00Z means "midnight local time on Feb 17", not "midnight UTC".
Fields
| Field Name | Description |
|---|---|
durationMinutes - Int
|
Duration of each recurring event in minutes (required if rrule is present). For example, a recurring event from 8am-9am local time can be represented by: { "rrule": "RRULE:FREQ=DAILY;BYHOUR=8;BYMINUTE=0;BYSECOND=0", "durationMinutes": 60 } |
endDate - DateTime
|
When the schedule expires (null means no expiration). Stored as UTC but interpreted as a floating local time — see the Schedule type description. |
rrule - RRule
|
Recurrence pattern (null means no recurrence). This follows the RRULE property format from iCalendar (RFC-5545). Note that there are redundant degrees of freedom between the rrule's UNTIL and COUNT rules and the endDate property on the Schedule type. In practice, the value resulting in the soonest expiration will take effect. |
startDate - DateTime
|
When the resource becomes active (null means active from when the schedule is created). Stored as UTC but interpreted as a floating local time — see the Schedule type description. |
Example
{
"durationMinutes": 987,
"endDate": "2007-12-03T10:15:30Z",
"rrule": RRule,
"startDate": "2007-12-03T10:15:30Z"
}
ScheduleInput
Description
Input for creating a new Schedule. All DateTime values follow the same floating-time convention described on the Schedule type.
For fixed schedules: one or both of startDate and endDate must be set. For recurring schedules: rrule and durationMinutes must be set.
Fields
| Input Field | Description |
|---|---|
durationMinutes - Int
|
Duration of each recurring event in minutes (required if rrule is present). For example, a recurring event from 8am-9am local time can be represented by: { "rrule": "RRULE:FREQ=DAILY;BYHOUR=8;BYMINUTE=0;BYSECOND=0", "durationMinutes": 60 } |
endDate - DateTime
|
When the schedule expires (null means no expiration). Stored as UTC but interpreted as a floating local time. |
rrule - RRule
|
Recurrence pattern (null means no recurrence). This follows the RRULE property format from iCalendar (RFC-5545). Note that there are redundant degrees of freedom between the rrule's UNTIL and COUNT rules and the endDate property on the Schedule type. In practice, the value resulting in the soonest expiration will take effect. Additional iCalendar properties (such as DTSTART) are not supported; to restrict the start date of a recurring event, use the startDate property. |
startDate - DateTime
|
When the resource becomes active (null means active from when the schedule is created). Stored as UTC but interpreted as a floating local time. |
Example
{
"durationMinutes": 123,
"endDate": "2007-12-03T10:15:30Z",
"rrule": RRule,
"startDate": "2007-12-03T10:15:30Z"
}
SimpleCompany
Description
Simplified company type with minimal fields
Fields
| Field Name | Description |
|---|---|
features - [String!]!
|
Client-visible feature flags enabled for this company |
id - ID!
|
Unique identifier for the company |
maxCarsPerFamilyMembership - Int
|
Maximum number of cars per family membership |
name - String!
|
Company name |
slug - String!
|
Company Slug |
timezone - String!
|
Company Timezone |
Example
{
"features": ["xyz789"],
"id": "4",
"maxCarsPerFamilyMembership": 123,
"name": "xyz789",
"slug": "xyz789",
"timezone": "abc123"
}
SimpleLocation
Description
Represents a location in the system with only primitives and no sensitive settings
Example
{
"city": "abc123",
"createdAt": "2007-12-03T10:15:30Z",
"externalId": "xyz789",
"id": "4",
"isVirtual": true,
"name": "xyz789",
"shortName": "abc123",
"state": USStateCode,
"street": "abc123",
"timezone": "xyz789",
"updatedAt": "2007-12-03T10:15:30Z",
"zip": USPostalCode
}
SimpleOwnerPlan
Description
Simple flat representation of an owner plan without nested relations.
Fields
| Field Name | Description |
|---|---|
city - String
|
City |
createdAt - DateTime!
|
Timestamp when the owner plan was created |
description - String
|
Description of the owner plan |
email - String
|
Email address for the owner |
expiresAt - DateTime
|
When this owner plan expires (null if no expiration) |
id - ID!
|
Unique identifier for the owner plan |
name - String!
|
Name of the owner plan |
phone - String
|
Phone number for the owner |
state - String
|
State |
street1 - String
|
Street address line 1 |
street2 - String
|
Street address line 2 |
updatedAt - DateTime!
|
Timestamp when the owner plan was last updated |
washPackageId - ID!
|
The wash package ID that this owner plan provides |
zip - String
|
ZIP code |
Example
{
"city": "abc123",
"createdAt": "2007-12-03T10:15:30Z",
"description": "xyz789",
"email": "abc123",
"expiresAt": "2007-12-03T10:15:30Z",
"id": "4",
"name": "abc123",
"phone": "abc123",
"state": "xyz789",
"street1": "xyz789",
"street2": "abc123",
"updatedAt": "2007-12-03T10:15:30Z",
"washPackageId": 4,
"zip": "abc123"
}
SimpleOwnerPlansPage
Description
Paginated result for simple owner plan queries
Fields
| Field Name | Description |
|---|---|
nodes - [SimpleOwnerPlan!]!
|
List of owner plans in the current page |
pageInfo - PageInfo!
|
Pagination metadata including cursors and page position |
Example
{
"nodes": [SimpleOwnerPlan],
"pageInfo": PageInfo
}
SimplePaidInvoiceLineItem
Example
{
"id": 4,
"price": 987,
"productName": "abc123",
"quantity": 987
}
SimplePrepaidExport
Description
Minimal prepaid export fields for list display (e.g. on Prepaid.exports).
Example
{
"exportedAt": "2007-12-03T10:15:30Z",
"exportedBy": Employee,
"exportedCodeCount": 123,
"id": "4"
}
SimpleProduct
Description
Lightweight projection of Product — scalar fields only, no relational joins or computed aggregates. Used by list payloads like Price.product so paginated responses don't fan out into per-row activeLocationCount and productPrices resolutions.
Fields
| Field Name | Description |
|---|---|
id - ID!
|
Unique identifier for the product |
isArchived - Boolean!
|
Whether this product is archived. Mirrors Product.isArchived — lets list payloads render an 'on archived product' indicator without a second per-row query. |
name - String!
|
Human-readable name for the product |
productType - ProductType!
|
The kind of product |
Example
{
"id": 4,
"isArchived": false,
"name": "abc123",
"productType": "GIFT_CARD"
}
SimpleRollerupCustomer
Example
{
"city": "xyz789",
"country": "xyz789",
"createdAt": "2007-12-03T10:15:30Z",
"email": "test@test.com",
"id": 4,
"name": "abc123",
"phone": "+17895551234",
"state": "abc123",
"street1": "abc123",
"street2": "xyz789",
"updatedAt": "2007-12-03T10:15:30Z",
"zip": "xyz789"
}
String
Description
The String scalar type represents textual data, represented as UTF-8 character sequences. The String type is most often used by GraphQL to represent free-form human-readable text.
Example
"xyz789"
StripeAccount
Description
Represents a Stripe account in the system
Fields
| Field Name | Description |
|---|---|
city - String
|
City |
companyId - ID
|
The company this Stripe account belongs to |
createdAt - DateTime!
|
Timestamp when the account was created |
id - String!
|
Unique Stripe account identifier |
name - String
|
Account name |
requirements - StripeAccountRequirements
|
Stripe account requirements for onboarding |
state - USStateCode
|
State |
street - String
|
Street address |
updatedAt - DateTime!
|
Timestamp when the account was last updated |
zip - USPostalCode
|
ZIP or postal code |
Example
{
"city": "xyz789",
"companyId": 4,
"createdAt": "2007-12-03T10:15:30Z",
"id": "abc123",
"name": "xyz789",
"requirements": StripeAccountRequirements,
"state": USStateCode,
"street": "abc123",
"updatedAt": "2007-12-03T10:15:30Z",
"zip": USPostalCode
}
StripeAccountPage
Description
Paginated result for Stripe account queries
Fields
| Field Name | Description |
|---|---|
nodes - [StripeAccount!]!
|
List of Stripe accounts in the current page |
pageInfo - PageInfo!
|
Pagination metadata including cursors and page position |
Example
{
"nodes": [StripeAccount],
"pageInfo": PageInfo
}
StripeAccountQueryInput
Description
Pagination input for querying Stripe accounts. Supports both forward and backward pagination. Use 'first' and 'after' for forward pagination, or 'last' and 'before' for backward pagination.
Fields
| Input Field | Description |
|---|---|
after - String
|
A cursor for pagination, returns items after this cursor (forward pagination) |
before - String
|
A cursor for pagination, returns items before this cursor (backward pagination) |
first - Int
|
The number of items to return from the beginning of the list (forward pagination) |
last - Int
|
The number of items to return from the end of the list (backward pagination) |
Example
{
"after": "xyz789",
"before": "xyz789",
"first": 123,
"last": 987
}
StripeAccountRequirements
Description
Stripe account requirements for onboarding and compliance
Example
{
"currentlyDue": ["xyz789"],
"disabledReason": "xyz789",
"eventuallyDue": ["abc123"],
"pastDue": ["abc123"],
"pendingVerification": ["xyz789"]
}
StripeCustomer
Description
Represents a Stripe customer in the system
Fields
| Field Name | Description |
|---|---|
companyId - ID!
|
The company this Stripe customer belongs to |
createdAt - DateTime!
|
Timestamp when the customer was created |
defaultPaymentMethodId - String
|
Default payment method ID |
description - String
|
Customer description |
email - String
|
Customer email address |
id - String!
|
Unique Stripe customer identifier |
isDeleted - Boolean!
|
Whether the customer is deleted |
isPhoneValid - Boolean!
|
Whether the phone number is valid |
memberships - [StripeCustomerMembership!]!
|
Customer memberships with detailed information |
name - String
|
Customer name |
phone - String
|
Customer phone number |
phoneE164 - String
|
Customer phone number in E.164 format |
referralCode - String!
|
Customer referral code |
updatedAt - DateTime!
|
Timestamp when the customer was last updated |
Example
{
"companyId": "4",
"createdAt": "2007-12-03T10:15:30Z",
"defaultPaymentMethodId": "abc123",
"description": "xyz789",
"email": "xyz789",
"id": "xyz789",
"isDeleted": false,
"isPhoneValid": false,
"memberships": [StripeCustomerMembership],
"name": "abc123",
"phone": "xyz789",
"phoneE164": "xyz789",
"referralCode": "xyz789",
"updatedAt": "2007-12-03T10:15:30Z"
}
StripeCustomerMembership
Description
Represents a customer membership with subscription details
Fields
| Field Name | Description |
|---|---|
banId - String
|
Ban ID if plate is banned |
cancelAtPeriodEnd - Boolean!
|
Cancel at period end |
canceledAt - DateTime
|
Canceled at timestamp |
companyId - String!
|
Company ID |
createdAt - DateTime!
|
Created timestamp |
currentPeriodEnd - DateTime
|
Current period end |
currentPeriodStart - DateTime
|
Current period start |
description - String
|
Product description |
hasBan - Boolean!
|
Whether the plate is banned |
id - String!
|
Subscription ID |
name - String
|
Product name |
recurringInterval - String
|
Recurring interval |
recurringIntervalCount - Int
|
Recurring interval count |
soldByBadge - String
|
Sold by employee badge |
soldByName - String
|
Sold by employee name |
status - String!
|
Subscription status |
stripeAccountId - String!
|
Stripe account ID |
stripeCustomerId - String!
|
Customer ID |
updatedAt - DateTime!
|
Updated timestamp |
Example
{
"banId": "xyz789",
"cancelAtPeriodEnd": false,
"canceledAt": "2007-12-03T10:15:30Z",
"companyId": "abc123",
"createdAt": "2007-12-03T10:15:30Z",
"currentPeriodEnd": "2007-12-03T10:15:30Z",
"currentPeriodStart": "2007-12-03T10:15:30Z",
"description": "abc123",
"hasBan": false,
"id": "abc123",
"name": "abc123",
"recurringInterval": "xyz789",
"recurringIntervalCount": 123,
"soldByBadge": "xyz789",
"soldByName": "xyz789",
"status": "xyz789",
"stripeAccountId": "abc123",
"stripeCustomerId": "xyz789",
"updatedAt": "2007-12-03T10:15:30Z"
}
SubscriptionChangeType
Values
| Enum Value | Description |
|---|---|
|
|
|
|
|
Example
"downgrade"
TrialUnits
Description
Trial period units for free trial durations
Values
| Enum Value | Description |
|---|---|
|
|
Duration specified in days |
|
|
Duration specified in months |
|
|
Duration specified in weeks |
Example
"DAYS"
USPostalCode
Description
Postal code scalar that enforces valid US postal code format
Example
USPostalCode
USStateCode
Description
State code scalar that enforces valid 2-character USPS state code format
Example
USStateCode
UpdateCustomerInput
Description
Input for updating a Rollerup customer. Only fields provided are updated.
Fields
| Input Field | Description |
|---|---|
email - EmailAddress
|
Customer email |
id - ID!
|
Customer ID |
name - String
|
Customer name |
phone - PhoneNumber
|
Customer phone |
Example
{
"email": "test@test.com",
"id": "4",
"name": "abc123",
"phone": "+17895551234"
}
UpdateOwnerPlanCarInput
Description
Input for updating a car on an owner plan
Example
{
"id": "4",
"nickname": "abc123",
"plate": "abc123",
"state": "xyz789"
}
UpdateOwnerPlanInput
Description
Input for updating an existing owner plan. All fields except 'id' are optional.
Fields
| Input Field | Description |
|---|---|
city - String
|
City |
description - String
|
Description of the owner plan |
email - String
|
Email address for the owner |
expiresAt - DateTime
|
When this owner plan expires (null for no expiration) |
id - ID!
|
The ID of the owner plan to update (required) |
name - String
|
Name of the owner plan |
phone - String
|
Phone number for the owner |
state - String
|
State |
street1 - String
|
Street address line 1 |
street2 - String
|
Street address line 2 |
washPackageId - ID
|
The wash package ID that this owner plan provides |
zip - String
|
ZIP code |
Example
{
"city": "xyz789",
"description": "xyz789",
"email": "abc123",
"expiresAt": "2007-12-03T10:15:30Z",
"id": 4,
"name": "abc123",
"phone": "abc123",
"state": "abc123",
"street1": "xyz789",
"street2": "xyz789",
"washPackageId": 4,
"zip": "abc123"
}
UpdateUserInput
Description
Input for updating an existing user. All fields except 'id' are optional
Fields
| Input Field | Description |
|---|---|
email - EmailAddress
|
Update the user's email address (must be valid email format) |
externalId - String
|
Update the external system identifier |
groupIds - [String!]
|
Update the list of group IDs the user belongs to |
id - ID!
|
The unique identifier of the user to update |
name - String
|
Update the user's full name |
phone - PhoneNumber
|
Update the user's phone number (must be valid phone format) |
resetPassword - Boolean
|
If true, generates a new temporary password that must be changed on next login |
username - String
|
Update the username for authentication. If username was not set before, a temporary password will be returned in the response |
Example
{
"email": "test@test.com",
"externalId": "abc123",
"groupIds": ["xyz789"],
"id": "4",
"name": "abc123",
"phone": "+17895551234",
"resetPassword": false,
"username": "abc123"
}
UpdateWashPackageInput
Description
Input for updating an existing wash package. All fields except 'id' are optional.
Example
{
"description": "xyz789",
"externalId": "abc123",
"id": "4",
"name": "abc123"
}
User
Description
Represents a user in the system
Fields
| Field Name | Description |
|---|---|
company - SimpleCompany!
|
The company this user belongs to |
createdAt - DateTime!
|
Timestamp when the user was created |
email - EmailAddress
|
Email address of the user |
externalId - String
|
External system identifier for the user |
groups - [Group!]!
|
Groups this user belongs to |
id - ID!
|
Unique identifier for the user |
isActive - Boolean!
|
Indicates if the user is active and able to authenticate. If not can be reactivated with 'reactivateUser' mutation |
name - String
|
Full name of the user |
permissions - [String!]!
|
List of permissions granted to this user (derived from groups and direct assignments) |
phone - PhoneNumber
|
Phone number of the user |
updatedAt - DateTime!
|
Timestamp when the user was last updated |
username - String
|
Username used for authentication |
Example
{
"company": SimpleCompany,
"createdAt": "2007-12-03T10:15:30Z",
"email": "test@test.com",
"externalId": "xyz789",
"groups": [Group],
"id": "4",
"isActive": true,
"name": "abc123",
"permissions": ["abc123"],
"phone": "+17895551234",
"updatedAt": "2007-12-03T10:15:30Z",
"username": "xyz789"
}
UserPage
UserQueryInput
Description
Pagination input for querying users. Supports both forward and backward pagination. Use 'first' and 'after' for forward pagination, or 'last' and 'before' for backward pagination.
Fields
| Input Field | Description |
|---|---|
after - String
|
A cursor for pagination, returns items after this cursor (forward pagination) |
before - String
|
A cursor for pagination, returns items before this cursor (backward pagination) |
email - String
|
if provided, filter users by email |
first - Int
|
The number of items to return from the beginning of the list (forward pagination) |
includeInactive - Boolean
|
When true, include inactive users in results. Defaults to false (only active users returned). Default = false |
last - Int
|
The number of items to return from the end of the list (backward pagination) |
name - String
|
if provided, filter users by name |
phone - String
|
if provided, filter users by phone |
username - String
|
if provided, filter users by username |
Example
{
"after": "xyz789",
"before": "abc123",
"email": "xyz789",
"first": 987,
"includeInactive": false,
"last": 123,
"name": "xyz789",
"phone": "abc123",
"username": "abc123"
}
Visit
Description
Represents a visit to a location
Fields
| Field Name | Description |
|---|---|
createdAt - DateTime!
|
The timestamp when the visit was created |
employee - Employee
|
The employee who processed the visit |
id - ID!
|
The unique identifier for the visit |
imageUrl - String
|
The URL of the image of the car. This is a signed URL for our object storage that will expire. |
isExternalMember - Boolean!
|
Whether or not this is a member in an external system. Primarily useful during onboarding. Will always be false if visit type is not 'member'. |
isSale - Boolean!
|
Whether or not this visit included a membership signup or wash purchase. |
laneId - String
|
The lane ID where the visit occurred |
lprOverridden - Boolean
|
Whether the LPR data has been overridden |
lprPlate - String
|
The plate as seen by LPR |
lprState - String
|
The state as seen by LPR |
plate - String
|
The plate number of the vehicle |
plateImageUrl - String
|
The URL of the plate image. This is a signed URL for our object storage that will expire. |
rfidTag - String
|
The RFID tag of the vehicle |
state - String
|
The state of the vehicle |
status - String!
|
The status of the visit |
stripeSubscriptionId - String
|
The Stripe subscription ID for the visit Will be replaced with Membership IDs |
timeTotal - Float
|
The total time the visit took in seconds. |
timeWaitingForAttendant - Float
|
The time the visit spent waiting for the attendant in seconds. |
timeWaitingForGate - Float
|
The time the visit spent waiting for the gate to open in seconds. |
timeWithAttendant - Float
|
The time the visit spent with the attendant in seconds. |
updatedAt - DateTime!
|
The timestamp when the visit was last updated |
visitType - String
|
The type of visit |
washPackage - WashPackage
|
The wash package for the visit |
Example
{
"createdAt": "2007-12-03T10:15:30Z",
"employee": Employee,
"id": "4",
"imageUrl": "abc123",
"isExternalMember": false,
"isSale": false,
"laneId": "xyz789",
"lprOverridden": true,
"lprPlate": "abc123",
"lprState": "abc123",
"plate": "xyz789",
"plateImageUrl": "abc123",
"rfidTag": "xyz789",
"state": "abc123",
"status": "abc123",
"stripeSubscriptionId": "abc123",
"timeTotal": 987.65,
"timeWaitingForAttendant": 123.45,
"timeWaitingForGate": 987.65,
"timeWithAttendant": 987.65,
"updatedAt": "2007-12-03T10:15:30Z",
"visitType": "xyz789",
"washPackage": WashPackage
}
VisitsInput
Description
Options for setting pagination and filtering for the visits query
Fields
| Input Field | Description |
|---|---|
after - String
|
A cursor for pagination, returns items after this cursor (forward pagination) |
before - String
|
A cursor for pagination, returns items before this cursor (backward pagination) |
carId - String
|
If set will only return visits matching this car ID |
first - Int
|
The number of items to return from the beginning of the list (forward pagination) |
isSale - Boolean
|
If set will only return visits that are sales |
last - Int
|
The number of items to return from the end of the list (backward pagination) |
locationId - String
|
|
plate - String
|
If set will only return visits matching this plate number (case insensitive) |
state - String
|
If set will only return visits matching this state (case insensitive) |
status - String
|
If set will only return visits matching this status (case insensitive) |
visitType - String
|
If set will only return visits matching this visit type (case insensitive) |
Example
{
"after": "abc123",
"before": "abc123",
"carId": "xyz789",
"first": 987,
"isSale": true,
"last": 987,
"locationId": "xyz789",
"plate": "abc123",
"state": "xyz789",
"status": "xyz789",
"visitType": "xyz789"
}
VisitsPage
WashPackage
Description
Represents a Wash package in Rollerup
Fields
| Field Name | Description |
|---|---|
createdAt - DateTime!
|
Timestamp when the package was created |
description - String
|
An optional detailed description of the package |
externalId - String
|
An optional reference ID to link this Rollerup package to a system external to Rollerup |
id - ID!
|
Unique Wash package identifier |
name - String!
|
A friendly name for the package |
updatedAt - DateTime!
|
Timestamp when the package was last updated |
Example
{
"createdAt": "2007-12-03T10:15:30Z",
"description": "xyz789",
"externalId": "abc123",
"id": "4",
"name": "abc123",
"updatedAt": "2007-12-03T10:15:30Z"
}