Overview
POST /v1/streams/bulk returns confirmed streams using the same Stream objects as Get Streams. This is a public endpoint. No API key is required.
It uses POST only so that multi-valued filters can be sent in the request body. Despite the verb, it is a read-only query: nothing is created or modified, and the result set is not scoped to any API key’s organization.
This endpoint is the bulk counterpart of Get Streams. Reach for it when Get Streams is too limited, specifically when you need to:
- Filter by multiple values at once: several stream IDs, several organizations, one or more target-token chains, or a set of
(chainId, address)target tokens, instead of the single-value query params accepted by Get Streams. - Paginate the result set with the optional
pageandlimitquery params.
AND; multiple values within a single filter are combined with OR. As with Get Streams, only confirmed streams are ever returned.
targetChainIds and targetTokens filter on each stream’s target token (the token tracked via customArgs.targetTokenId), not its reward token. Use the decimal EVM chain IDs listed in Get Tokens.Endpoint
Filter by multiple stream IDs
Filter by organizations and target tokens
Paginate the result set
Pagination is opt-in. Sendpage and/or limit as query parameters to receive one page plus a pagination object in the response.
Parameters
Request Body
All body fields are optional. Sending an empty body is allowed, but only together with a boundedlimit query parameter (see Response Semantics).
Filter by stream IDs. Returns streams whose
id is in this list.Filter by owning organization IDs. Returns streams belonging to any of these organizations.
Filter by streams whose target token is on any of these chains. Values are decimal EVM chain IDs. See Get Tokens for the supported list.
Filter by streams whose target token matches any of these EVM
(chainId, address) tokens.Include the full historical
snapshots array for each returned stream. Behaves exactly as on Get Streams.Add
userCount and activeUserCount to each included snapshot object. Behaves exactly as on Get Streams.EvmToken
Decimal EVM chain ID of the target token.
Target token contract address on that chain. Matching is case-insensitive.
Query Parameters
Pagination is optional. Omit both parameters to return all matching streams in a single response, without apagination object.
Page number for the paginated result set. Providing
page or limit switches the endpoint into paginated mode. Values lower than 1 are normalized by the backend to 1.Number of streams to return per page. Providing
page or limit switches the endpoint into paginated mode. Values lower than 1 are normalized to 20. Values above 500 are rejected with 400 Invalid Argument.Response Example
When pagination is requested, the response includes apagination object. The streams array holds the same Stream objects documented in Get Streams.
The
Stream object is identical to the one returned by Get Streams. See that page for the complete field-by-field schema, including customArgs, adapters, point, lastSnapshot, committedSnapshot, snapshots, and rewardToken.Response Semantics
Filters combine with AND, values within a filter with OR
Filters combine with AND, values within a filter with OR
Sending
organizationIds and targetChainIds together returns streams that belong to one of the organizations and whose target token is on one of the chains. Within a single filter, multiple values are matched with OR (an IN lookup).Pagination is opt-in
Pagination is opt-in
If you omit both
page and limit, the endpoint returns every matching stream and no pagination object. As soon as either query parameter is present, the response is paginated and includes a pagination object.A bounded limit is required when no filter is provided
A bounded limit is required when no filter is provided
To avoid loading the entire stream table, an empty body (no
ids, organizationIds, targetChainIds, or targetTokens) must be paired with a bounded limit query parameter. Without a filter and without a limit, the request is rejected with 400 Invalid Argument.Only confirmed streams are returned
Only confirmed streams are returned
Like Get Streams, this endpoint only returns streams whose creation has been confirmed. Pending streams are never included.
An empty result is valid
An empty result is valid
If no stream matches the provided filters, the endpoint returns
streams: [] (together with a pagination object when pagination was requested) rather than failing.Response Fields
List of confirmed streams matching the provided filters. Each item is a
Stream object. See Get Streams for the full schema.Pagination metadata describing the current page and the total size of the result set. Present only when
page or limit was supplied; omitted otherwise.PaginationResponse
Current page returned by the backend after normalization.
Number of items returned per page after normalization or capping.
Total number of streams matching the filters across all pages.
Total number of available pages for the current
limit.Whether a page after the current one exists.
Whether a page before the current one exists.
Error Handling
Missing filter without a bounded limit
Missing filter without a bounded limit
Status Code: 400 Bad RequestSolution: Provide at least one filter (
ids, organizationIds, targetChainIds, or targetTokens), or supply a bounded limit query parameter.Too many filter values
Too many filter values
Status Code: 400 Bad RequestEach filter has an upper bound: 100
ids, 20 organizationIds, 5 targetChainIds, and 100 targetTokens. Exceeding any of these returns INVALID_ARGUMENT with a message such as too many stream ids (max 100).Solution: Split large requests into multiple calls that stay within the per-filter limits.Limit too high
Limit too high
Status Code: 400 Bad RequestSolution: Request a
limit of 500 or fewer and page through the result set.Unexpected internal error
Unexpected internal error
Status Code: 500 Internal Server ErrorSolution: Retry the request and contact Turtle if the issue persists.

