> You are reading the Docusign Developer Documentation. For clean Markdown of any page, append .md to the page URL.
>
> Documentation indexes by section:
> - APIs and SDKs: https://docusign.docs.buildwithfern.com/docs/llms.txt
> - Platform 101: https://docusign.docs.buildwithfern.com/platform/llms.txt
> - Extension Apps: https://docusign.docs.buildwithfern.com/extension-apps/llms.txt
> - Docusign CLI: https://docusign.docs.buildwithfern.com/docusign-cli/llms.txt
>
> Authentication (OAuth, JWT Grant, M2M): https://docusign.docs.buildwithfern.com/platform/auth
> Webhooks and Connect: https://docusign.docs.buildwithfern.com/platform/webhooks
>
> OpenAPI specifications: https://docusign.docs.buildwithfern.com/openapi.json
> MCP server: https://docusign.docs.buildwithfern.com/_mcp/server

# Agreement Manager API rules and resource limits

> See what rules and resource limits apply to the Agreement Manager API.

This page lists the rate limits, and other restrictions on using the Agreement Manager API.

## API rate limits

The Docusign Agreement Manager API enforces rate limits to ensure service reliability and fair access across all integrations. Requests that exceed these limits receive an `HTTP 429 Too Many Requests` response.

Rate limits are enforced per **account** for most requests. When a request does not carry an account identifier in the URL path, the limit is applied per **OAuth client** (the `sub` or `userId` claim in the access token) instead.

The Agreement Manager API enforces the following API call rate limits:

| Dimension        | Limit                            |
| ---------------- | -------------------------------- |
| Per account      | 10 requests per second (600 RPM) |
| Per OAuth client | 10 requests per second (600 RPM) |

No burst allowance is available beyond this limit.. The dimension applied to a given request depends on whether the request URL contains an `accountId` path parameter:

* **Account-scoped requests** (such as `GET /accounts/{accountId}/agreements`) are counted against the per-account limit.
* **Non-account-scoped requests** are counted against the  per-OAuth-client limit (identified by the `userId/sub` value of your JSON Web Token).

**Note:** These rate limits are not shared across environments. A separate limit is applied for the developer and the production environments.

## Rate limit error response

When a request is rejected after hitting the rate limit, the API returns:

| Field              | Value                                                 |
| ------------------ | ----------------------------------------------------- |
| HTTP status code   | 429 Too Many Requests                                 |
| Response body      | Rate limit exceeded. Please try again later.          |
| Retry-After header | The number of seconds until the current window resets |

**Example response header**

```text
HTTP/1.1 429 Too Many Requests
Retry-After: 1
Content-Type: text/plain
Rate limit exceeded. Please try again later.
```

The `Retry-After` value is always a whole number of seconds (ceiling-rounded) and is safe to use directly as a sleep duration before retrying.

## Best practices

**Use the** Retry-After **header to create a cool-down period**. Read the `Retry-After` value from the 429 response and wait at least that many seconds before retrying the request. Retrying immediately will result in additional 429 responses without making progress.

**Use exponential backoff.** If you receive repeated 429 responses after waiting for Retry-After, apply exponential backoff between retries. Start with the Retry-After value and double the wait on each subsequent failure.

**Distribute requests evenly.** Avoid issuing requests in bursts. Spreading 600 requests uniformly across a minute (one every 100 ms) is more reliable than sending all 600 in rapid succession at the start of the minute.

**Cache responses where appropriate.** For read-heavy workflows, such as listing agreement types or retrieving account settings that change infrequently, caching API responses client-side reduces the number of requests counted against your limit.

**Use bulk endpoints.** Where the API offers batch or list endpoints, prefer them over making individual requests in a loop. A single `GET /accounts/{accountId}/agreements` call with pagination consumes one request against your limit regardless of the number of items returned.