openapi: 3.0.3 info: title: Jobber Developer API version: '2025-04-16' description: | The Jobber Developer API is a GraphQL API for accessing and modifying data on Jobber accounts. A single HTTPS endpoint accepts POST requests containing GraphQL `query`, `variables`, and `operationName` fields. Authentication is OAuth 2.0 bearer access tokens. API versioning is date-based and selected via the `X-JOBBER-GRAPHQL-VERSION` header. Rate limiting uses a leaky-bucket query-cost system in addition to a 2,500 requests per 5 minutes DDoS guard. contact: name: Jobber API Support email: api-support@getjobber.com url: https://developer.getjobber.com license: name: Jobber Developer Terms of Service url: https://developer.getjobber.com servers: - url: https://api.getjobber.com description: Jobber production GraphQL endpoint paths: /api/graphql: post: operationId: executeGraphQLQuery summary: Execute A GraphQL Query Or Mutation description: | Single GraphQL endpoint for executing queries and mutations against the Jobber Developer API. Top-level query objects include Clients, Requests, Quotes, Jobs, Invoices, Visits, Assessments, Properties, Products, Services, Expenses, TimeSheetEntries, Users, Accounts, and CustomFieldConfigurations. Mutations support create / edit / delete operations on most resources, plus archive, activate, and event-style transitions (e.g. invoice approval, payment recording). tags: - GraphQL parameters: - name: X-JOBBER-GRAPHQL-VERSION in: header description: Date-based API version to pin the request to (e.g. `2025-04-16`). required: false schema: type: string example: '2025-04-16' security: - bearerAuth: [] requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/GraphQLRequest' examples: listJobs: summary: List Jobs value: query: | query SampleQuery { jobs { nodes { id jobNumber title } } } listClients: summary: List Clients With Pagination value: query: | query Clients($first: Int!, $after: String) { clients(first: $first, after: $after) { nodes { id firstName lastName companyName emails { address } } pageInfo { hasNextPage endCursor } } } variables: first: 25 responses: '200': description: GraphQL response. `data` contains the result; `errors` contains any errors. `extensions.cost` includes throttling cost metadata. content: application/json: schema: $ref: '#/components/schemas/GraphQLResponse' '401': description: Unauthorized — invalid or missing access token. '429': description: Too Many Requests — DDoS limit (2500 / 5 min) or GraphQL cost throttling. components: securitySchemes: bearerAuth: type: http scheme: bearer bearerFormat: OAuth 2.0 Access Token schemas: GraphQLRequest: type: object required: - query properties: query: type: string description: GraphQL document containing one or more operations. variables: type: object additionalProperties: true description: Variables referenced by the GraphQL document. operationName: type: string description: Name of the operation to execute when the document contains multiple. GraphQLResponse: type: object properties: data: type: object additionalProperties: true nullable: true errors: type: array items: $ref: '#/components/schemas/GraphQLError' extensions: type: object properties: cost: $ref: '#/components/schemas/CostExtension' GraphQLError: type: object properties: message: type: string path: type: array items: type: string extensions: type: object properties: code: type: string description: Error code (e.g. `THROTTLED`, `UNAUTHENTICATED`). CostExtension: type: object description: Query cost telemetry returned in `extensions.cost`. properties: requestedQueryCost: type: integer description: Points the API expected this query to consume. actualQueryCost: type: integer description: Points the query actually consumed. throttleStatus: type: object properties: maximumAvailable: type: integer currentlyAvailable: type: integer restoreRate: type: integer description: Points restored per second.