The Fly catalog is getting a GraphQL API alongside the REST endpoints. Query exactly the fields you need and batch related data in a single request. This page documents the schema so you can plan your integration ahead of launch.
POST https://api.useflyconnect.com/api/v1/catalog/graphqlNot yet reachable — the GraphQL endpoint is not exposed through the public API gateway yet. Use the REST API for production catalog access today, or email developers@useflysystems.com to hear when the preview opens.
Only receive the fields you ask for — no over-fetching. Reduces payload size and speeds up client rendering.
Fetch products, categories, and modifier groups in a single HTTP request instead of three separate REST calls.
The schema is the contract. Introspect it for type safety, auto-complete, and documentation without reading a spec doc.
All GraphQL requests must include a valid JWT issued by the Fly Auth service. Pass it as an Authorization header. Queries are automatically scoped to the orgId embedded in the token — you cannot access another organisation's data.
# Send your JWT with every request (planned endpoint — not yet public)
POST /api/v1/catalog/graphql
Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...
Content-Type: application/json
{
"query": "{ products(orgId: \"org_abc\") { id name } }"
}The types below represent the full set of fields available through the GraphQL API. Non-null fields are marked with !.
Fetch active products in a category with only the fields you need.
query ListProducts {
products(
orgId: "org_abc123"
categoryId: "cat_xyz"
isActive: true
limit: 20
) {
id
name
sku
basePrice
isActive
category {
id
name
}
tags
}
}
Fetch a product by ID including its category.
query GetProduct {
product(id: "prod_abc123") {
id
name
description
sku
barcodes
basePrice
isActive
categoryId
category {
id
name
sortOrder
}
tags
createdAt
updatedAt
}
}
Fetch all categories and their associated products in one round trip.
query CategoriesWithProducts {
categories(orgId: "org_abc123") {
id
name
description
parentId
sortOrder
isActive
products {
id
name
basePrice
isActive
}
}
}
Fetch modifier groups and all options linked to a specific product.
query ProductModifiers {
modifierGroups(
orgId: "org_abc123"
productId: "prod_abc123"
) {
id
name
required
minSelections
maxSelections
options {
id
name
priceAdjustment
isDefault
}
}
}
Create a new product in the catalog.
mutation CreateProduct {
createProduct(input: {
name: "Flat White"
description: "House blend with steamed milk"
sku: "BVRG-FW-001"
barcodes: ["9300675024042"]
basePrice: 5.50
categoryId: "cat_beverages"
tags: ["coffee", "hot", "popular"]
isActive: true
}) {
id
name
sku
basePrice
createdAt
}
}Update specific fields on an existing product.
mutation UpdateProduct {
updateProduct(
id: "prod_abc123"
input: {
basePrice: 6.00
isActive: false
tags: ["coffee", "hot", "seasonal"]
}
) {
id
name
basePrice
isActive
updatedAt
}
}Soft-deletes a product by setting isActive to false.
mutation DeleteProduct {
deleteProduct(id: "prod_abc123")
}A hosted GraphiQL playground — explore the full schema, write queries with autocomplete, and run them against your own org — will launch alongside the public GraphQL endpoint. Until then, this page is the schema reference.
Errors follow the standard GraphQL error envelope. Check the errors array for field-level detail.
{
"data": null,
"errors": [{
"message": "Unauthorized: missing orgId in token",
"locations": [{ "line": 2, "column": 3 }],
"path": ["products"]
} ]
}