Developer Portal
Quick StartsComposition scriptingAPIs and SDKsSupport
  • Portal overview
  • Quick start
  • REST API
    • Introduction
    • Rate limits
    • Authorization
    • How-to guides
      • Get a control app's API token
      • Get a composition's sub-composition IDs and names and their payload structures
      • Get a control app's model
      • Get a control app's metadata
      • Update a sub-composition's content
      • Update a sub-composition's animation state
      • Update a sub-composition's content and animation state in one call
      • Update multiple sub-compositions in one call
    • API reference
      • Get control app details
        • Get a control app's metadata
        • Get a control app's model
        • Get a control app's control data
      • Send data to a control app
        • Update a control app's content
        • Update a control app's animation state
      • Take out all of an app's output
  • Data stream API
    • Introduction
    • Rate limits
    • Authorization
    • How-to guides
      • Create a data stream
      • Link a data stream to a composition
      • Send data to an app using the data stream API
    • API reference
  • Composition scripting
    • Introduction
    • Overview
    • Quick start
      • Find sub-compositions and widgets
      • Read and update control nodes
      • Set text widget text properties
      • Read and update widget properties
      • Read control nodes and update widget properties
      • Set image widget URL property
      • Set table widget content property
    • Cheat sheets
      • Fundamentals
      • Interactive overlays
      • Best practices
    • Use cases
      • Read control nodes and generate HTML text
      • Read control nodes, generate HTML text with background
      • Text Ticker - Start ticker on "In" animation
    • Composition script editor reference
  • Software development kits
    • Graphics SDK
      • Getting started
      • Reference
        • SDK functions
        • Composition object
        • Sequencer object
      • Guides and examples
        • Load a composition with its token
        • Load a composition with its URL
        • Get the composition URL of an app instance
        • Sequencer VOD example
        • Control local preview of app
        • Load app instance output
    • Overlay SDK
      • Getting started
      • SDK functions
      • Use case examples
    • Widget SDK
      • Preparing your environment
      • Getting started
      • Reference
        • Widget UI definition
        • Widget callback functions
        • Time control object
        • Composition instance
      • Guides and examples
        • Widget example: CSS patterns
    • App SDK
  • Singular Basics
    • Overview of Singular
    • Managing overlays in the Dashboard
      • How to create a new composition
      • How to open a new app template
      • How to create an app for a composition
      • How to extract a composition from an app
      • How to find an app's shared app token and shared API URL
      • Dashboard reference
    • Building overlays in Composer
      • How to build a composition
      • How to set up layer logic to automate overlay transitions
      • How to set up control nodes to make widget properties available to a control app
      • Animating overlays
        • How to create timeline animations
        • How to create behavior animations
        • How to create update animations
      • How to make overlays interactive
      • How to adapt overlays to various screen sizes
      • Composer reference
    • Controlling overlays in Studio and UNO
      • How to use Studio
      • Studio reference
      • UNO reference
  • Support
    • Singular status
    • Support resources
    • Singular terminology
    • Performance Testing
Powered by GitBook
On this page
  • Endpoints that use rate limits
  • Header response codes
  • Common causes and mitigation strategies
  • Rate limit violations
  • How to handle rate limit violations

Was this helpful?

  1. REST API

Rate limits

PreviousIntroductionNextAuthorization

Last updated 2 years ago

Was this helpful?

Every day, the Singular API receives millions of requests. To manage the volume of requests, limits are placed on the number of requests that one account can make. The Singular API also employs several safeguards against bursts of incoming traffic. If you send a lot of requests in quick succession or if the data you send exceeds your account limit, you might receive error responses that show up as . These limits help to provide a reliable, scalable API.

The API has several limiters, including:

  • Daily limiters, which limit the number of requests and the amount of data received by the API per day.

  • Burst rate limiters, which limit the number of requests and the amount of data received by the API per minute.

The daily and burst rate limiters depend on your subscription type.

Rate limits for enterprise subscriptions

Daily API limit
Burst API limit (per minute)

Number of requests

100,000 calls

500 calls

Amount of data

500 MB

1 MB

Rate limits for professional and non-profit subscriptions

Daily API limit
Burst API limit (per minute)

Number of requests

20,000 calls

200 calls

Amount of data

100 MB

500 KB

Rate limits for free subscriptions

Daily API limit
Burst API limit (per minute)

Number of requests

5,000 calls

25 calls

Amount of data

25 MB

100 KB

Treat these limits as maximums and don’t generate unnecessary load. See for advice on handling 429s.

If you suddenly see a rising number of rate-limited requests, please contact . We may reduce limits to prevent abuse or increase limits to enable high-traffic applications.

To request an increased rate limit, contact .

Endpoints that use rate limits

  • POST / PATCH: https://app.singular.live/apiv2/controlapps/:appToken/control

  • POST / PATCH: https://app.singular.live/apiv2/controlapps/:appToken/command

Header response codes

Requests to endpoints that use rate limits return custom headers response codes. The response code is a JSON string with detailed information about daily limits and burst limits.

Header
Value

X-Singular-Ratelimit-Burst-Calls

X-Singular-Ratelimit-Daily-Calls

X-Singular-Ratelimit-Burst-Data

X-Singular-Ratelimit-Daily-Data

Rate limit values

Property
Description

limit

Maximum number of requests per minute or day

remaining

Number of calls left within the current minute or day

reset

UTC time indicates the next reset of the burst or daily limit

Common causes and mitigation strategies

Rate limits can occur under a variety of conditions, but it’s most common in these scenarios:

  • Running a large volume of closely-spaced requests can lead to the burst rate limiting. This often happens when developing or testing a data feed integration. When engaging in these activities, you should try to control the client side's request rate and data volume (see Handling Rate Limit Violations).

  • Sending huge amounts of data to the API can lead to the burst rate limiting. This happens when sending growing statistics data over a period of time. In such a case, you should control the data volume on the client-side and only send the required dynamic data to the API.

Rate limit violations

Professional and enterprise subscriptions: Rate limit violations are logged, but API requests that exceed the limits are still processed.

How to handle rate limit violations

A basic technique for integrations to handle rate limiting is to watch for 429 status codes and build in a retry mechanism. Your retry mechanism should follow an exponential backoff schedule to reduce request volume or increase the time between requests when necessary. Ideally, the client-side is self-aware of existing rate limits and can pause requests until the currently exceeded window expires.

We also recommend looking into the following techniques for handling limiting smoothly:

For integrating data feeds with high-volume, high-frequency, and low-latency updates, we recommend using .

Rate limit violations are logged to your and processed according to your subscription level.

Free subscriptions: Rate limit violations are logged and API requests exceeding the limits are rejected and return Too Many Requests.

Add randomness into the requests to avoid a .

Implement a for controlling rate limits at a global scale.

{"limit": 500, "remaining": 499, "reset": 1614430792}
{"limit": 100000, "remaining": 99854, "reset": 1614470401}
{"limit": 1048576, "remaining": 1048452, "reset": 1614430792}
{"limit": 524288000, "remaining": 522565096, "reset": 1614470401}
status code 429
Handling rate limit violations
Singular Support
Singular Support
Singular Data Streams
Account Usage Statistics
error status code 429
thundering herd problem
token bucket algorithm