Skip to content

Batch series metadata lookup

POST
/api/b2b/series/batch
curl --request POST \
--url https://api.stockalloy.com/api/b2b/series/batch \
--header 'Content-Type: application/json' \
--header 'X-API-Key: <X-API-Key>' \
--data '{ "ids": [ "01J5KXW8YB6R2T9V3N4M7Q8Z1A" ] }'

Fetch metadata (and pre-built chart blob URLs) for up to 100 series by series_id. Results preserve request order; unknown IDs are omitted.

Media typeapplication/json
object
ids
required

Series IDs (also accepted as series_ids).

Array<string>
<= 100 items
Example
{
"ids": [
"01J5KXW8YB6R2T9V3N4M7Q8Z1A"
]
}

Series metadata rows.

Media typeapplication/json
object
series
Array<object>
object
series_id
string
series_key
string | null
cik
string
ticker
string | null
current_ticker
string | null
company_name
string | null
metric_id
string
dims_hash
string
dims_key
string | null
unit_signature
string
title
string | null
subtitle
string | null
y_label
string | null
preferred_scale
string | null
series_kind
string | null
is_active
boolean
first_period_end
string | null
last_period_end
string | null
point_count
integer | null
meaning_hint
string | null
meaning_disclaimer
string | null
meaning_tooltip
string | null
needs_meaning_tooltip
boolean
serving
object
series_version
integer | null
etag
string | null
points_count
integer | null
first_period
string | null
last_period
string | null
built_at
string | null
blob_url

Pre-built series data blob (/s/series/{series_id}/{version}), immutable and cacheable.

string | null
Examplegenerated
{
"series": [
{
"series_id": "example",
"series_key": "example",
"cik": "example",
"ticker": "example",
"current_ticker": "example",
"company_name": "example",
"metric_id": "example",
"dims_hash": "example",
"dims_key": "example",
"unit_signature": "example",
"title": "example",
"subtitle": "example",
"y_label": "example",
"preferred_scale": "example",
"series_kind": "example",
"is_active": true,
"first_period_end": "example",
"last_period_end": "example",
"point_count": 1,
"meaning_hint": "example",
"meaning_disclaimer": "example",
"meaning_tooltip": "example",
"needs_meaning_tooltip": true,
"serving": {
"series_version": 1,
"etag": "example",
"points_count": 1,
"first_period": "example",
"last_period": "example",
"built_at": "example",
"blob_url": "example"
}
}
]
}
X-RateLimit-Limit
integer

Requests allowed per minute for this key.

X-RateLimit-Remaining
integer

Requests remaining in the current minute window.

X-RateLimit-Reset
integer

Unix timestamp (seconds) when the window resets.

Invalid request — missing/invalid fields, malformed JSON, or an unsupported scope combination.

Media typeapplication/json
object
error
required

Human-readable error message.

string
Example
{
"error": "query is required"
}

Missing or invalid API key.

Media typeapplication/json
object
error
required

Human-readable error message.

string
Example
{
"error": "API key required"
}

Key revoked/disabled/expired, account disabled, key not entitled for this product, or cross-company search not enabled for this key.

Media typeapplication/json
object
error
required

Human-readable error message.

string
Example
{
"error": "API key has expired"
}

Rate limit exceeded (per-minute) or quota exceeded (daily/monthly, account-level or per-key). Distinguish by body shape.

Media typeapplication/json
One of:
object
error
required
string
Allowed value: Rate limit exceeded
retryAfter
required

Seconds until the window resets.

integer
limit
required

Requests allowed per minute for this key.

integer
windowMs
required
integer
Allowed value: 60000
Examples

Per-minute rate limit

{
"error": "Rate limit exceeded",
"retryAfter": 31,
"limit": 60,
"windowMs": 60000
}
X-RateLimit-Limit
integer

Requests allowed per minute for this key.

X-RateLimit-Remaining
integer

Requests remaining in the current minute window.

X-RateLimit-Reset
integer

Unix timestamp (seconds) when the window resets.

Retry-After
integer

Seconds to wait before retrying (429 only).

Unexpected server error.

Media typeapplication/json
object
error
required

Human-readable error message.

string
Example
{
"error": "Facts lookup failed"
}

The verified-facts backend is temporarily unavailable. Transient — retry with backoff. This is an infrastructure condition, not a data gap.

Media typeapplication/json
object
error
required

Human-readable error message.

string
Example
{
"error": "Facts backend unavailable"
}