> For the complete documentation index, see [llms.txt](https://docs.durohub.com/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.durohub.com/rate-limits/budgets.md).

# Budget Reference

Every budget, the operations that draw on it, and its limit on each plan.

Limits are per user or API key unless the table says otherwise (see [who a budget is charged to](/rate-limits/rate-limits.md#who-a-budget-is-charged-to)). Your organization's plan picks the column:

* **Free** — an organization with no subscription
* **Standard** and **Premium** — the API tier of your organization's plan

These are plan defaults. If your organization has an arrangement for higher limits, the `RateLimit-Policy` header on each response shows the limit that actually applies to you.

{% hint style="info" %}
Operations are written as `namespace.field`, the way you select them in a query: `component.findAll` is the `findAll` field under the root `component` field. An operation with no namespace, such as `retryChangeOrderExport`, is a root field.
{% endhint %}

## Default budgets

Any operation not listed under [operation budgets](#operation-budgets) or [your own account](#your-own-account) draws on one of these.

| Budget          | Covers                                                                                                                                                                                                                                                                                                                                                    | Free      | Standard  | Premium     |
| --------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------- | --------- | ----------- |
| `default-read`  | Every query without a budget of its own: single components, libraries, categories, statuses, comments, change order reads, sourcing reads such as `vendorSourcing.libraryVendors`, `vendorSourcing.archivedLibraryVendors` and `vendorSourcing.libraryVendorStatusCounts`, Drive reads such as `drive.drives`, `drive.driveFolder` and `drive.driveTrash` | 120 / min | 600 / min | 3,000 / min |
| `default-write` | Every mutation without a budget of its own: component updates, labels, bookmarks, document links, settings, sourcing writes such as `vendorSourcing.changeVendorApprovalStatus`, Drive writes such as `drive.createDrive`, `drive.createDriveFolder` and `drive.restoreDriveItem`                                                                         | 24 / min  | 120 / min | 600 / min   |

## Operation budgets

Operations that do more work than an ordinary read or write, send email, call an AI model, or start a long job have budgets of their own.

### Components

| Budget             | Operations                                                                                                                     | Free     | Standard  | Premium   |
| ------------------ | ------------------------------------------------------------------------------------------------------------------------------ | -------- | --------- | --------- |
| `search`           | `component.findAll`, `component.filter`, `component.filterWithQuery`, `component.componentSearch`, `component.componentGroups` | 24 / min | 120 / min | 600 / min |
| `component-create` | `component.create`, `component.duplicate`, `component.createVariant`, `component.createWithSharedCounter`                      | 12 / min | 60 / min  | 300 / min |
| `bulk-write`       | `component.bulkCreate`, `component.bulkUpdate`, `item.create`, `item.update`                                                   | 4 / min  | 20 / min  | 100 / min |

### Assemblies and BOMs

| Budget      | Operations                                                                                                                                            | Free     | Standard | Premium   |
| ----------- | ----------------------------------------------------------------------------------------------------------------------------------------------------- | -------- | -------- | --------- |
| `bom-read`  | `assembly.getFlattenedAssemblyTree`, `assembly.getFlattenedAssemblyTrees`, `assembly.getAssemblyTrees`, `assembly.getHistoricalFlattenedAssemblyTree` | 12 / min | 60 / min | 300 / min |
| `bom-write` | `assemblyMutation.updateBOM`, `assemblyMutation.linkComponents`, `assemblyMutation.updateAssemblyLinks`, `assemblyMutation.unlinkComponents`          | 12 / min | 60 / min | 300 / min |

### Change orders

| Budget        | Operations                                                                                                         | Free     | Standard  | Premium     |
| ------------- | ------------------------------------------------------------------------------------------------------------------ | -------- | --------- | ----------- |
| `co-create`   | `changeOrders.create`                                                                                              | 2 / min  | 10 / min  | 50 / min    |
| `co-items`    | `changeOrders.addItems`, `changeOrders.removeItems`                                                                | 30 / min | 300 / min | 1,500 / min |
| `co-write`    | `changeOrders.update`, `changeOrders.archiveBulk`                                                                  | 12 / min | 60 / min  | 300 / min   |
| `co-workflow` | `changeOrders.submitForReview`, `changeOrders.updateReviewDecision`, `changeOrders.close`, `changeOrders.withdraw` | 6 / min  | 30 / min  | 120 / min   |

`changeOrders.addItems` accepts at most 1,000 items per call; a larger list is refused with `TOO_MANY_ITEMS`, so split it across calls.

### Imports, exports and files

| Budget           | Operations                                                          | Free     | Standard  | Premium   |
| ---------------- | ------------------------------------------------------------------- | -------- | --------- | --------- |
| `import-prepare` | `componentImport.prepare`                                           | 3 / min  | 15 / min  | 60 / min  |
| `import-start`   | `componentImport.start`                                             | 1 / hour | 5 / hour  | 30 / hour |
| `export-start`   | `exportJob.create`, `retryChangeOrderExport`                        | 2 / hour | 10 / hour | 60 / hour |
| `job-status`     | `componentImport.jobStatus`, `exportJob.findOne`                    | 12 / min | 60 / min  | 120 / min |
| `file-transfer`  | `file.getUploadUrls`, `file.confirmUploads`, `file.getDownloadUrls` | 24 / min | 120 / min | 600 / min |

An import counts against `import-start` once, when you start it. Preparing it, including a `validateOnly` check and every prepare after you fix a mapping, counts against `import-prepare`, so checking a file several times doesn't use up your hourly imports.

A library runs one import at a time: starting a second while one is in progress is refused with `CONCURRENT_IMPORT`.

### AI-assisted

| Budget | Operations                                                                                                        | Free     | Standard  | Premium    |
| ------ | ----------------------------------------------------------------------------------------------------------------- | -------- | --------- | ---------- |
| `ai`   | `component.buildFilterWithAI`, `component.filterWithAI`, `changeOrders.buildFilterWithAI`, `config.fixYamlWithAI` | 4 / hour | 20 / hour | 100 / hour |

### Organization administration

These are **per organization**: one allowance shared by everyone in it.

| Budget     | Operations                                                  | Free     | Standard  | Premium   |
| ---------- | ----------------------------------------------------------- | -------- | --------- | --------- |
| `invite`   | `organization.bulkInvite`, `teams.addMembers`               | 2 / hour | 10 / hour | 30 / hour |
| `api-keys` | `apiKey.create`, `apiKey.rotateApiKey`, `apiKey.deactivate` | 2 / hour | 10 / hour | 10 / hour |

## Your own account

These are **per user**, the same in every organization and on every plan, and shared by your web session and every API key you own. They cover operations that read or change only your own records.

| Budget       | Operations                                                                                                                                                                                                                                                                                                                                                                                                                                                                              | Limit     |
| ------------ | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------- |
| `user-read`  | `user.me`, `user.findOne`, `user.findAll`, `user.findByUsername`, `user.findByAuth0Id`, `user.checkUsernameAvailability`, `user.orgCreationOptions`, `organization.findAll`, `organization.currentUser`, `organization.discoverByDomain`, `roles.currentUser`, `teams.currentUser`, `scimTokens.currentUser`, `drive.currentUser`, `onshape.getOnshapeCredentials`, `myIdentities`                                                                                                      | 600 / min |
| `user-write` | `user.updateMe`, `user.update`, `user.create`, `user.setMyTimezone`, `user.updatePrimaryEmail`, `user.linkAuth0Account`, `user.unlinkAuth0Account`, `organization.create`, `organization.acceptInvitation`, `organization.declineInvitation`, `organization.joinByDomain`, `roles.currentUser`, `teams.currentUser`, `scimTokens.currentUser`, `drive.currentUser`, `onshape.saveOnshapeCredentials`, `onshape.exchangeOnshapeAccessCode`, `setMeasurementPreference`, `unlinkIdentity` | 120 / min |

{% hint style="info" %}
`roles.currentUser`, `teams.currentUser`, `scimTokens.currentUser` and `drive.currentUser` appear twice because each exists as both a query (`user-read`) and a mutation (`user-write`).
{% endhint %}

{% hint style="info" %}
The `drive` operations are assigned to budgets ahead of being implemented. Today every Drive operation is refused with `UNAUTHORIZED_RESOURCE_ACCESS`; see [Drive](/core-concepts/documents.md#drive-schema-preview-not-yet-available).
{% endhint %}

## Limits by address

These apply only to requests that are **not** signed in, or whose credential is not valid. Signed-in traffic is never counted by IP address, so a whole office behind one address is fine.

| Budget               | Applies to                                                                                   | Default limit |
| -------------------- | -------------------------------------------------------------------------------------------- | ------------- |
| `invalid-credential` | Requests from one IP address whose API key or session token is expired, revoked or not valid | 600 / min     |
| `ip-backstop`        | All requests from one IP address that carry no valid credential                              | 5,000 / 5 min |

A `429` naming either of these means your credential is the problem, not your pace. Waiting will not help; sign in again or replace the API key. See [Handling 429s](/rate-limits/handling-429s.md#when-waiting-wont-help).

Requests with no credential at all are also charged per IP address against the operations' own budgets, at the Free limits.

## Next steps

* [How Rate Limiting Works](/rate-limits/rate-limits.md): scopes, token buckets and headers
* [Handling 429s](/rate-limits/handling-429s.md): the refusal response, a retry helper, and pacing


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation by asking a question.

Perform an HTTP GET request on the following URL with the `ask` and `goal` query parameters:

```
GET https://docs.durohub.com/rate-limits/budgets.md?ask=<question>&goal=<user_goal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is what the user is ultimately trying to achieve, the reason they need the answer. Sharing it helps GitBook give you a better, more relevant answer. A goal is most helpful when it describes the outcome the user wants rather than restating the question. For example, with `ask=how do I create an API token`, a goal like `automate deployments from our CI pipeline` lets GitBook tailor the answer to that use case.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
