Skip to content
Reponse.ai LogoDocs
DocsAPISDKsGuides

Search Documentation

Search for an article...

Getting Started

  • Overview
  • Architecture
  • Installation
  • Authentication
  • First Request

Products & Collections

  • Products — List
  • Products — Get
  • Products — Metafields
  • Collections — List
  • Collections — Get
  • Collections — Products

Cart & Checkout

  • Cart — Create
  • Cart — Get
  • Cart — Add Item
  • Cart — Update Item
  • Cart — Remove Item
  • Cart — Apply Promotion
  • Checkout — Stripe
  • Checkout — Payment Intent
  • Checkout — ACP

Orders & Fulfillment

  • Orders — Create
  • Orders — Get
  • Orders — Confirm
  • Orders — Cancel
  • Orders — Fulfill
  • Orders — Refund

Commerce

  • Inventory — Get
  • Inventory — Update
  • Shipping — Rates
  • Discounts — List
  • Discounts — Create
  • Discounts — Validate
  • Subscriptions — Manage

Loyalty & Gift Cards

  • Loyalty — Balance
  • Loyalty — Redeem
  • Loyalty — Referral
  • Gift Cards — List
  • Gift Cards — Redeem

Tickets & Support

  • Tickets — List
  • Tickets — Create
  • Tickets — Reply

Platform

  • Product Feed — JSON
  • Product Feed — CSV
  • Theme — Get
  • Approvals — Execute
  • Approvals — Reject
  • Geocode

SDKs

  • SDK Overview
  • TypeScript SDK
  • React Hooks

Guides

  • Chat Widget
  • Shopify Sync
  • Storefront Starter
  • Loyalty Program
  • Discounts & Promotions
  • Subscriptions
  • Klaviyo Integration
  • Custom Domains
  • Agentic Commerce (ACP)
  • A2A Protocol
  • AI Engines
  • MCP Server

Webhooks

  • Webhooks Overview
  • Events Reference
  • Shopify Webhooks
  • Stripe Webhooks
  • Reviews (Stamped / Trustpilot)
  • Logistics
  • Email Inbound

Resources

  • Environment Variables
  • Rate Limits
  • Changelog
DocsResourcesRate Limits

Rate Limits

API rate limits and how to handle them.

2 min read/Last updated Jul 22, 2026
On this page

Overview

The Reponse API applies per-workspace rate limits to ensure fair usage and platform stability. When you exceed a limit, the API responds with HTTP `429 Too Many Requests`. All responses include rate-limit headers so your application can self-throttle proactively.

Rate-Limit Headers

Every API response includes the following headers:

HeaderTypeDescription
X-RateLimit-LimitnumberMaximum requests allowed in the current window.
X-RateLimit-RemainingnumberRequests remaining before the limit is reached.
X-RateLimit-ResetnumberUnix timestamp (seconds) when the window resets.
Retry-AfternumberSeconds to wait before retrying (only on 429 responses).

Limits per Endpoint

EndpointWindowLimitNotes
POST /v1/chat1 minute60Per workspace. Streaming counts as one request.
GET /v1/catalog/products1 minute120Cached responses do not count.
GET /v1/catalog/products/:id1 minute120—
POST /v1/shopify/sync1 hour10Full catalog syncs are heavy operations.
POST /v1/leads1 minute30Lead capture / submission.
All other endpoints1 minute100Default limit.

Limits are applied per workspace, not per API key. Multiple keys on the same workspace share the same quota.

Handling 429 Responses

When you receive a `429`, the response body and headers tell you how long to wait:

json
{
  "error": {
    "code": "rate_limit_exceeded",
    "message": "Too many requests. Retry after 12 seconds.",
    "retryAfter": 12
  }
}

Retry with Exponential Backoff

typescript
async function fetchWithRetry(url: string, options: RequestInit, maxRetries = 3) {
  for (let attempt = 0; attempt < maxRetries; attempt++) {
    const response = await fetch(url, options);

    if (response.status !== 429) return response;

    const retryAfter = parseInt(response.headers.get("Retry-After") || "1", 10);
    const delay = retryAfter * 1000 * Math.pow(2, attempt);
    console.warn(`Rate limited. Retrying in ${delay}ms (attempt ${attempt + 1})`);
    await new Promise((resolve) => setTimeout(resolve, delay));
  }

  throw new Error("Max retries exceeded");
}

cURL Example

bash
curl -s -o /dev/null -w "%{http_code}" \
  -H "Authorization: Bearer rp_live_abc123..." \
  "https://api.reponse.ai/v1/catalog/products"

# Check headers
curl -s -D - \
  -H "Authorization: Bearer rp_live_abc123..." \
  "https://api.reponse.ai/v1/catalog/products" | grep X-RateLimit

Best Practices

  • Read the headers proactively. Pause requests when X-RateLimit-Remaining approaches zero.
  • Cache responses on your side for data that changes infrequently (products, collections).
  • Batch operations where possible instead of making many sequential calls.
  • Use webhooks for real-time updates instead of polling the API.

Troubleshooting

IssueSolution
Constant 429 errorsCheck if multiple services share the same workspace. Consolidate or request a limit increase.
Retry-After header missingOlder SDK versions may not parse it. Update to @reponseai/sdk ≥ 1.0.0.
Limits seem lower than documentedTest keys (rp_test_) have reduced limits. Use live keys for production loads.
PreviousEnvironment Variables
NextChangelog