Skip to content

Limits and errors

GraphQL answers HTTP 200 even when the query fails. Always check the body for errors.

{
"errors": [
{
"message": "field 'cost_price' not found in type: 'stocked_vehicles'",
"extensions": { "path": "$.selectionSet.stocked_vehicles.selectionSet.cost_price", "code": "validation-failed" }
}
]
}
Message or code Usual cause Fix
field '…' not found in type A typo, or your role can’t read the field. Check spelling in the explorer with the same token.
expected an enum value … but found a string Quotes around an enum value. condition: { _eq: used }, or use a variable.
invalid-jwt with JWTExpired The token is older than 60 minutes. Authenticate again once, then retry the request.
invalid-jwt, other messages The token is damaged or from another environment. Check the endpoint matches the token’s environment.
invalid-headers The Authorization header is malformed. Send Authorization: Bearer <token>.
unexpected variables in variableValues You sent a variable the query doesn’t declare. Send only the variables the query declares.
variable … is declared as 'Int!', but used where 'numeric' is expected Wrong variable type. Decimal columns such as odometer and production_year take numeric.
not-supported / unexpected Malformed query or variable types. Check variable types against the schema (for example uuid!, not String!).
HTTP 401 invalid-credentials from the authentication API Unknown client, or wrong secret. Check both; the secret is shown only once.
HTTP 400 from the authentication API Missing fields, a malformed client_id, or a body that isn’t JSON. POST JSON with client_id and client_secret.
data-exception A value that isn’t valid for its type, e.g. a malformed uuid. Check the value.
HTTP 403 from the authentication API The client’s user no longer has the role it was created with. Create a new client.
HTTP 5xx or timeout A query that is too large, or a temporary fault. Reduce limit and nested lists, then retry with backoff.

An empty list is not an error. If you expected rows, check the where and that your token can see that showroom.

There is no published rate limit, but please:

  • Reuse your token for its 60 minutes.
  • Page with limit of 50 to 200, and only nest the lists you need.
  • Poll for changes with updated_at no more often than every few minutes, rather than re-reading everything.
  • Cache slow-changing data: showrooms, locations, makes and models.
  • Retry 5xx errors and timeouts with exponential backoff, up to a few attempts.

Requests without a token are capped per request at 500 vehicles, 100 images and 1 showroom. A larger limit is cut to the cap without an error, so page with offset.

If you expect sustained high volume, email support@vyro.co first so we can make sure there is capacity.

Vyro adds fields and tables regularly; that is not a breaking change, so ignore fields you don’t know. We give notice before removing or renaming anything. Tell support@vyro.co who should hear about changes.