QuickBooks Online Plus, Advanced and Intuit Enterprise Suite users rely on Projects to track profitability by organising income and expenses in a unified way. Now, with the new Projects API, developers can bring that capability into their apps. As announced on 17 July 2025 in the Premium APIs blog post, the Projects API is one of four brand new sets of Premium APIs available to Gold, Platinum (Custom Fields early access) and Silver tier partners (Projects, Sales Tax and Payroll Compensation).
Click here to learn more about the different tiers and how to upgrade.
In this post we will cover
- Why the Projects API matters
- How it works (GraphQL and REST)
- Sample workflows with queries, mutations and REST calls
- Available sample code and usage examples
- Best practices and key considerations to keep in mind
Why the Projects API matters
The Projects feature lets QuickBooks Online users create and manage projects while tracking income, expenses and profitability. With the Projects API, this logic becomes extendable to your own apps which makes it easy to integrate project based workflows into your platform. Whether you are building invoicing flows, time tracking tools or reporting dashboards, project level context becomes seamless through API integration.
How the API works
The Projects API operates on a dual layer system.
1. GraphQL for project definitions and queries
All project related interactions such as creating, querying or updating use a GraphQL endpoint.
- Production endpoint: https://qb.api.intuit.com/graphql
- Sandbox endpoint: https://qb-sandbox.api.intuit.com/graphql
Required GraphQL scopes include:
project-management.project(read and write project data)com.intuit.quickbooks.accountingfor REST operations
Headers required for both GraphQL and REST:
Authorization: Bearer <access_token>Content-Type: application/json
2. REST for operating on projects
Once project entries exist, you can interact with them as part of the broader QuickBooks Online REST ecosystem:
https://quickbooks.api.intuit.com/v3/company/{realmId}/{entity}
Operations such as creating invoices, bills or linking other entities often use this REST endpoint with project specific data included through minor versioning and specific payload format.
The following scope is required for REST operations:
com.intuit.quickbooks.accounting
Workflow examples
Example A: Create a new project (GraphQL)
mutation {
projectManagementCreateProject(input: {
name: "Renovation Project Alpha",
startDate: "2025-08-01",
endDate: "2025-12-31"
}) {
project {
id
name
status
}
}
}
You can run this against either the production or sandbox GraphQL endpoints:
Sample query to list projects
query {
projectManagementProjects {
id
name
status
startDate
endDate
}
}
Example B: Associate a transaction with a project (REST)
Once you have a project, you can link a transaction such as an invoice to it.
curl -X POST \
"https://quickbooks.api.intuit.com/v3/company/<realmId>/invoice?minorversion=70" \
-H "Authorization: Bearer <access_token>" \
-H "Content-Type: application/json" \
-d '{
"Line": [
{
"Amount": 500,
"DetailType": "SalesItemLineDetail",
"SalesItemLineDetail": {
"ItemRef": { "value": "1", "name": "Consulting Service" }
}
}
],
"CustomerRef": {"value": "1"},
"ProjectRef": {"value": "123"}
}'
The response should reflect the invoice with the associated project reference. In the example above, the project ID is retrieved from GraphQL and then used in the REST payload.
Example C: Query projects with multiple filters (GraphQL)
This example retrieves a list of projects filtered by status, date range and name pattern. This is useful for apps that need to display only active or recent projects.
query {
projectManagementProjects(
filter: {
status: { eq: "ACTIVE" },
startDate: { gte: "2025-01-01" },
endDate: { lte: "2025-12-31" },
name: { contains: "Renovation" }
},
sort: { field: "startDate", order: ASC },
limit: 10,
offset: 0
) {
edges {
node {
id
name
status
startDate
endDate
customer {
id
displayName
}
}
}
pageInfo {
totalCount
hasNextPage
}
}
}
Response example:
{
"data": {
"projectManagementProjects": {
"edges": [
{
"node": {
"id": "123",
"name": "Renovation Project Alpha",
"status": "ACTIVE",
"startDate": "2025-03-01",
"endDate": "2025-09-30",
"customer": {
"id": "45",
"displayName": "Brighton Builders Ltd."
}
}
},
{
"node": {
"id": "124",
"name": "Renovation Beta",
"status": "ACTIVE",
"startDate": "2025-05-10",
"endDate": "2025-12-15",
"customer": {
"id": "48",
"displayName": "Greenfield Interiors"
}
}
}
],
"pageInfo": {
"totalCount": 2,
"hasNextPage": false
}
}
}
}
Notes:
- Pagination is handled through
limitandoffsetparameters. - You can sort results by project fields such as
startDate,endDateorname. - Combine filters to tailor results to specific reporting or dashboard views.
Sample app reference
For hands on implementations, explore the Intuit Developer repositories which demonstrate:
- Configuring OAuth and required permissions
- Creating and managing project entities
- Parsing responses and integrating project tracking into business flows
Browse the sample repos on GitHub.
Limitations and considerations
- Availability: Currently available for Silver, Gold and Platinum partners.
- Sandbox support: GraphQL supports sandbox testing which makes it safer to iterate before production deployment.
- Scopes and permissions: Use
project-management.projectand accounting scopes according to least privilege principles. - Versioning: Make sure you are using the correct
minorversionfor REST endpoints so that project fields surface correctly.
Best practices
To integrate project tracking effectively into your app, use GraphQL for core project management workflows including creating, listing and updating projects. When associating transactions, use ProjectRef in REST payloads to link resources. Test thoroughly in a sandbox environment, specifically using the sandbox GraphQL endpoint. Ensure your partner tier permissions are set correctly to allow API access. Finally, manage pagination and query limits when retrieving project lists through GraphQL.
The final note
With the Projects API, developers can unlock project centric workflows inside their apps, bringing revenue and cost tracking into a centralised process. Using GraphQL to define and query, paired with REST to manage transactions, gives you flexibility and power in one model.
Getting started by partner tier
- Builder: Click here to learn how to upgrade your tier.
- Silver: Submit a request in the developer portal (product: Partner Program, category: API usage).
- Gold and Platinum: You have default access. Open your app in the developer portal, go to Permissions, select the new scopes, save and then use those scopes in your authorisation request to generate tokens.
