This guide walks you through everything you need to make your first successful Jobber API call. By the end, you'll have a test Jobber account, an app registered in the Developer Center, and a working query running in GraphiQL.
Jobber uses OAuth 2.0, not API keys. Rather than a static key copied from a settings page, a company admin for each Jobber account authorizes your app to access its data. This is what allows your app to securely serve many Jobber customers, if applicable. Step 3 covers app setup, and Step 4 provides a testing token without requiring any auth code to be written first.
There are two separate accounts involved in Jobber development:
These are independent accounts. Both are used throughout development.
New to GraphQL? Jobber's API uses GraphQL rather than REST. The key differences: there is a single endpoint for all requests, and you specify exactly which fields you want returned. The API returns only those fields. There are two operation types: queries (read data, equivalent to GET) and mutations (write data, equivalent to POST or PUT). Both are sent as HTTP POST requests with a JSON body. The official GraphQL introduction provides a useful overview.
ℹ️ Note: Skip this step if you already have a Jobber account available for testing.
Use the developer testing signup link to create a developer testing account. This differs from a standard Jobber trial in that it provides a 90-day testing window without a subscription prompt. Developer test accounts are limited in features but have access to all exposed items via our API. Developer testing accounts expire after 90 days. To request an extension, email [email protected].
Sign up here if you haven't already. This is your hub for managing apps, API credentials, and team access.
Invite your team (optional)
Click Invite Team Member, then enter their name and email address. After filling in these fields, click Send Invite. The recipient will receive an email about their invitation. Invitations expire after 30 days.
All team members with Two Factor Authentication enabled have the same permissions to create and manage apps on the account. They can also invite additional members to join the team.
In the Developer Center, go to Apps and click New. You'll be prompted to fill in details about your app. Only the required fields are needed to get started - all fields can be edited later.
Required to create your app:
Required before publishing:
The Developer Center includes a sandbox that handles the OAuth flow automatically, allowing API exploration without writing any auth code.
Go to Manage Apps, click the ⋯ menu next to your app, and select Test in GraphiQL.
This initiates the same OAuth 2.0 authorization flow that users go through when connecting an app. An Allow Access screen will be displayed:
After approving, you'll be redirected into GraphiQL with a live access token loaded. The token is valid for 60 minutes and is visible in the Headers section inside GraphiQL. The access token generated by GraphiQL is intended for testing only. Production apps must implement the full OAuth flow and handle refresh token rotation to maintain access. See App Authorization and Refresh Token Rotation for implementation details.
⚠️ Warning: Each Test in GraphiQL session initiates a new OAuth flow and invalidates existing refresh tokens for that app and admin. Existing access tokens remain valid until they expire, but the integration can no longer refresh them. Use a dedicated test account to avoid disrupting a live integration.
ℹ️ Note: The scopes configured on your app determine what data is accessible in GraphiQL. If a query returns no data or a permission error, verify that the relevant scope is enabled on your app.
Once in GraphiQL, a pre-loaded example query will be displayed. Click the Docs icon in the top-left corner to browse the full schema.
The following query returns the name and ID of the Jobber account the token is authorized for. It works regardless of which scopes are configured and is a reliable starting point:
query GetAccount {
account {
id
name
}
}
The following example fetches the ID, job number, and title of jobs in the account:
query GetJobs {
jobs(first: 10) {
nodes {
id
jobNumber
title
}
pageInfo {
hasNextPage
endCursor
}
}
}
The first: 10 argument limits the results returned and controls query cost. Pagination arguments should always be included on collection queries. See API Rate Limits for more on how query cost is calculated.
All GraphQL requests are sent via POST to a single endpoint:
POST https://api.getjobber.com/api/graphql
curl:
curl -X POST \
-H "Authorization: Bearer <ACCESS_TOKEN>" \
-H "X-JOBBER-GRAPHQL-VERSION: 2025-04-16" \
-H "Content-Type: application/json" \
-d '{"query": "{ account { id name } }"}' \
https://api.getjobber.com/api/graphql
Node.js:
async function queryJobber() {
const response = await fetch("https://api.getjobber.com/api/graphql", {
method: "POST",
headers: {
"Authorization": "Bearer <ACCESS_TOKEN>",
"X-JOBBER-GRAPHQL-VERSION": "2025-04-16",
"Content-Type": "application/json",
},
body: JSON.stringify({ query: "{ account { id name } }" }),
});
const result = await response.json();
const data = result.data;
const errors = result.errors; // present for request-level failures such as throttling or invalid arguments
}