{
  "checked": "2026-11-01",
  "note": "Practical presets for scripts/size_sync.py. Limits change: confirm each figure on the source page before relying on it, and record the date you checked. No Salesforce preset: allocations are org-specific, so read DailyApiRequests from the REST Limits resource and pass --daily-limit and --remaining.",
  "presets": {
    "hubspot-private-free-starter": {
      "vendor": "HubSpot",
      "scope": "Privately distributed app on a Free or Starter account: burst per app, daily per account across all apps",
      "windows": [{"limit": 100, "seconds": 10}],
      "daily_limit": 250000,
      "daily_reset": "Midnight in the HubSpot account's time zone",
      "batch_max": 100,
      "concurrency": null,
      "result_cap": null,
      "page_size": null,
      "checked": "2026-11-06",
      "source": "https://developers.hubspot.com/docs/developer-tooling/platform/usage-guidelines",
      "notes": "The 429 body's policyName says which limit was hit. Keep error responses under 5% of daily requests."
    },
    "hubspot-private-pro": {
      "vendor": "HubSpot",
      "scope": "Privately distributed app on a Professional account: burst per app, daily per account across all apps",
      "windows": [{"limit": 190, "seconds": 10}],
      "daily_limit": 625000,
      "daily_reset": "Midnight in the HubSpot account's time zone",
      "batch_max": 100,
      "concurrency": null,
      "result_cap": null,
      "page_size": null,
      "checked": "2026-11-06",
      "source": "https://developers.hubspot.com/docs/developer-tooling/platform/usage-guidelines",
      "notes": "Batch create, update and upsert take 100 records per request. Headers X-HubSpot-RateLimit-Daily-Remaining and -Remaining show what is left."
    },
    "hubspot-private-enterprise": {
      "vendor": "HubSpot",
      "scope": "Privately distributed app on an Enterprise account: burst per app, daily per account across all apps",
      "windows": [{"limit": 190, "seconds": 10}],
      "daily_limit": 1000000,
      "daily_reset": "Midnight in the HubSpot account's time zone",
      "batch_max": 100,
      "concurrency": null,
      "result_cap": null,
      "page_size": null,
      "checked": "2026-11-06",
      "source": "https://developers.hubspot.com/docs/developer-tooling/platform/usage-guidelines",
      "notes": "Daily limit is shared by every privately distributed app on the account."
    },
    "hubspot-private-limit-increase": {
      "vendor": "HubSpot",
      "scope": "Privately distributed app with the API limit increase: burst per app",
      "windows": [{"limit": 250, "seconds": 10}],
      "daily_limit": null,
      "daily_reset": "Midnight in the HubSpot account's time zone",
      "batch_max": 100,
      "concurrency": null,
      "result_cap": null,
      "page_size": null,
      "checked": "2026-11-06",
      "source": "https://developers.hubspot.com/docs/developer-tooling/platform/usage-guidelines",
      "notes": "Each increase adds 1,000,000 requests per day to the tier's figure, at most two increases. Pass --daily-limit with the account's total."
    },
    "hubspot-public-app": {
      "vendor": "HubSpot",
      "scope": "Marketplace OAuth app: burst per installing account, CRM search excluded",
      "windows": [{"limit": 110, "seconds": 10}],
      "daily_limit": null,
      "daily_reset": "No daily figure is listed for marketplace OAuth apps; daily headers are absent for OAuth",
      "batch_max": 100,
      "concurrency": null,
      "result_cap": null,
      "page_size": null,
      "checked": "2026-11-06",
      "source": "https://developers.hubspot.com/docs/developer-tooling/platform/usage-guidelines",
      "notes": "Plan search calls with the hubspot-crm-search preset."
    },
    "hubspot-crm-search": {
      "vendor": "HubSpot",
      "scope": "CRM search endpoints, per account",
      "windows": [{"limit": 5, "seconds": 1}],
      "daily_limit": null,
      "daily_reset": "Not stated for search; search responses carry no rate-limit headers",
      "batch_max": null,
      "concurrency": null,
      "result_cap": 10000,
      "page_size": 200,
      "checked": "2026-11-06",
      "source": "https://developers.hubspot.com/docs/api-reference/latest/crm/search-the-crm",
      "notes": "A query returns at most 10,000 results, excludes archived records, and new changes can take a moment to appear. Split recovery windows to stay under 9,000 results each."
    },
    "stripe-live": {
      "vendor": "Stripe",
      "scope": "Live mode: 100 operations per second account-wide, 25 per second on most endpoints",
      "windows": [{"limit": 100, "seconds": 1}, {"limit": 25, "seconds": 1}],
      "daily_limit": null,
      "daily_reset": "Per-second limits; reads also count against a rolling 30-day read allocation",
      "batch_max": null,
      "concurrency": 50,
      "result_cap": null,
      "page_size": null,
      "checked": "2026-11-06",
      "source": "https://docs.stripe.com/rate-limits",
      "notes": "Search allows 20 reads per second. Read allocation averages at most 500 reads per transaction over 30 days, minimum 10,000 per month. A 429 carries Stripe-Rate-Limited-Reason; code lock_timeout means object contention, not quota."
    },
    "stripe-sandbox": {
      "vendor": "Stripe",
      "scope": "Sandbox: 25 operations per second",
      "windows": [{"limit": 25, "seconds": 1}],
      "daily_limit": null,
      "daily_reset": "Per-second limits",
      "batch_max": null,
      "concurrency": null,
      "result_cap": null,
      "page_size": null,
      "checked": "2026-11-06",
      "source": "https://docs.stripe.com/rate-limits",
      "notes": "Sandbox limits are lower than live; a load that passes here may still need re-sizing for live, and the reverse."
    },
    "marketo": {
      "vendor": "Adobe Marketo Engage",
      "scope": "REST API per subscription",
      "windows": [{"limit": 100, "seconds": 20}],
      "daily_limit": 50000,
      "daily_reset": "12:00 AM CST",
      "batch_max": null,
      "concurrency": 10,
      "result_cap": null,
      "page_size": null,
      "checked": "2026-11-06",
      "source": "https://experienceleague.adobe.com/en/docs/marketo-developer/marketo/rest/rest-api",
      "notes": "Errors usually arrive as HTTP 200 with success false and an errors array; count them from the body. Adobe's best-practices page gives a daily allocation of at least 10,000, so read the instance's figure under Admin, Web Services and pass it with --daily-limit."
    },
    "klaviyo-create-event": {
      "vendor": "Klaviyo",
      "scope": "Create Event, per account for private keys; OAuth apps get a quota per installed app instance",
      "windows": [{"limit": 350, "seconds": 1}, {"limit": 3500, "seconds": 60}],
      "daily_limit": null,
      "daily_reset": "Burst and steady windows; Retry-After is in seconds",
      "batch_max": null,
      "concurrency": null,
      "result_cap": null,
      "page_size": null,
      "checked": "2026-11-02",
      "source": "https://developers.klaviyo.com/en/reference/create_event",
      "notes": "Burst 350/s and steady 3,500/m on the endpoint reference; tiers and Retry-After on https://developers.klaviyo.com/en/docs/rate_limits_and_error_handling. One event per request; without unique_id, events dedupe on profile, metric and time to the second."
    },
    "klaviyo-bulk-create-events": {
      "vendor": "Klaviyo",
      "scope": "Bulk Create Events, per account for private keys; OAuth apps get a quota per installed app instance",
      "windows": [{"limit": 10, "seconds": 1}, {"limit": 150, "seconds": 60}],
      "daily_limit": null,
      "daily_reset": "Burst and steady windows; Retry-After is in seconds",
      "batch_max": 1000,
      "concurrency": null,
      "result_cap": null,
      "page_size": null,
      "checked": "2026-11-02",
      "source": "https://developers.klaviyo.com/en/reference/bulk_create_events",
      "notes": "Burst 10/s and steady 150/m, up to 1,000 events per request, on the endpoint reference; pass the events per request as --batch."
    },
    "braze-users-track": {
      "vendor": "Braze",
      "scope": "/users/track for data-point contracts (MAU contracts add an hourly limit)",
      "windows": [{"limit": 3000, "seconds": 3}],
      "daily_limit": null,
      "daily_reset": "Rolling 3-second window",
      "batch_max": 75,
      "concurrency": null,
      "result_cap": null,
      "page_size": null,
      "checked": "2026-11-06",
      "source": "https://www.braze.com/docs/api/endpoints/user_data/post_user_track/",
      "notes": "Up to 75 objects combined across attributes, events and purchases per request. Processing is asynchronous with no ordering guarantee. Every custom attribute sent consumes a data point, so send changes only."
    }
  }
}
