Authentication
Browser widget routes use a publishable key in ?pk= and a matching Origin. Arcs accept either a publishable key or a secret bearer. The public title alias has a legacy transition mode described by x-keyless-sunset. After configured retirement, requests without pk return uniform 401 key_required for existing, unknown, hidden and malformed IDs, with no-store. Taxonomy, icons and this contract stay keyless. No keyless arc or batch exists. Secret keys are for server-to-server calls only. Send Authorization: Bearer <your-key> over HTTPS. Never expose a secret in browser code, a query string or logs. Publishable-key routes allow browser CORS. Secret-bearer routes are server-only. A key grants volume, never access to non-public titles.
Keyless title lookup is retired on this deployment: requests without pk return uniform 401 key_required, with no-store. Our previews use an origin-bound house pk.
Rate limits & quota
- Keyless: 60 requests per minute per IP.
- Default per key: 120 requests per minute and 50,000 lookups per UTC day.
- Batch: at most 100 IMDb IDs and a 16 KiB JSON body.
Limits can be configured per partner. A batch spends lookup quota for valid unique IDs, including IDs that are not found. Requests and lookups are separate units. Secret-key routes expose rate headers; publishable routes do not expose X-RateLimit-*. For secret-key calls, read X-RateLimit-Limit, X-RateLimit-Remaining and X-RateLimit-Reset. On 429, wait for Retry-After; do not retry in a tight loop. Authenticated conditional requests still count toward request limits.
Caching & ETag
Publishable widget responses and the pk title alias: public, max-age=120, s-maxage=120. Secret-bearer title responses: private, max-age=300. Legacy keyless title responses only while the flag is enabled: public, max-age=600, s-maxage=3600. All errors are no-store. Follow each endpoint’s Cache-Control, as catalog, icons and contract freshness differ. Never share secret-bearer responses through a public cache. Publishable compact responses contain no partner account data.
Retain the ETag and send it as If-None-Match. A matching validator returns 304 without a body; reuse your stored response. Cache by API origin, key, IMDb ID and language. API-served 304 responses still spend a unit; local browser cache hits do not reach the API. Use the returned URLs for attribution and icons so a domain move does not break your integration.
Errors
Errors use { "error": { "code", "message", "docs" } }. Handle the stable code, rather than parsing a message. Unknown, malformed, hidden and pending single-title IDs share a uniform 404 not_found response. A published title with no qualifying emotions is a 200 response with compact s: insufficient_data (or verbose status for server calls), not a 404.
| Code | Meaning |
|---|---|
not_found | No published title has this IMDb id. |
invalid_imdb_id | IMDb ids look like tt0111161. |
unauthorized | Missing or invalid API key. |
key_revoked | See the response descriptions below each operation. |
partner_suspended | This partner account is suspended. |
rate_limited | Too many requests. |
quota_exceeded | Daily quota exceeded. |
batch_too_large | At most 100 ids per batch. |
payload_too_large | See the response descriptions below each operation. |
method_not_allowed | See the response descriptions below each operation. |
server_error | See the response descriptions below each operation. |
service_unavailable | Temporarily unavailable, retry later. |
validation_error | Invalid request body. |
key_required | A publishable key is required: add ?pk=… (see docs) |
balance_exhausted | Prepaid balance exhausted |
origin_not_allowed | This key is not allowed from this origin |
addon_required | This add-on is not enabled for your key |
Keep X-Request-Id when reporting an issue. Never include your secret key.
Versioning & changelog
API paths and SDK downloads are versioned. Current contract: 1.1.0. Store stable emotion key values; translated labels and response URLs may change.
1.1.0
- Origin-bound publishable widget lookup and entitled compact arcs.
- Stateless widget failure report beacon.
- Secret-key account billing; configurable keyless lookup sunset (SEC-18).
1.0.0
- Initial versioned partner emotions API with public and keyed title lookup, batch lookup, taxonomy, SVG icons and account usage.
- Shared JavaScript and PHP SDK fixtures; documented AI provenance, attribution and canonical URLs.
SDKs
JavaScript / TypeScript: zero dependencies, ESM and CommonJS, Node ≥18 and modern browsers. PHP ≥8.1: framework-free client, retries, ETag revalidation and Badge::html() for a server-rendered attribution link. The web component uses the origin-bound publishable API, lazy-loads when visible and reserves layout space. The compact schema carries t, s, e, u, x; arcs carry v, b, d, i, t. Failure reporting is a best-effort text/plain beacon, not a secret-bearing request.
npm and Packagist publication is pending. Download the versioned archives below and install them locally. Keep secret-key SDK calls on your server. Browser SDK calls use publishableKey and a registered Origin. Quickstart examples →
Titles
/api/public/v1/titles/{imdb_id}/emotionsPublishable key in ?pk= · browser · keyless retiredGet dominant emotions by IMDb id
Legacy keyless lookup only while partners.keyless_lookup is true. With pk this is the widget alias, using compact payload and publishable headers. No cookies. See x-keyless-sunset for both flag states.
Parameters
| Name / location | Type | Required | Description |
|---|---|---|---|
imdb_id / path | string | Yes | IMDb title id. Malformed, unknown, hidden and pending ids receive the same 404 envelope. |
lang / query | string (ka, en) | No | Label and title language; defaults to ka. Unsupported values normalize to en; all labels retain both languages. |
If-None-Match / header | string | No | Previously received ETag; a match returns 304 without a body. |
pk / query | string | No |
Responses
200 Successful response.
application/json
| Field | Type | Required | Description |
|---|---|---|---|
data | object | Yes | Published title emotion data. |
data.imdb_id | string | Yes | IMDb identifier of the published title. pattern: ^tt[0-9]{7,10}$ |
data.type | string (movie, series) | Yes | Movie or series; animation is a separate flag. |
data.year | integer | null | Yes | Release year, or null when unknown. |
data.title | object | Yes | Original and translated title names. |
data.title.original | string | Yes | Original title, falling back to English. |
data.title.en | string | Yes | English title. |
data.title.ka | string | null | Yes | Georgian title, or null if unavailable. |
data.name | string | Yes | Title in requested language, falling back to English. |
data.animation | boolean | Yes | Whether the title is animated. |
data.status | string (ok, insufficient_data) | Yes | ok when at least one emotion qualifies; insufficient_data when none reach the configured minimum share (default 5%). This is a 200 response with an empty emotions array. |
data.emotions | array<object> | Yes | Top up to three emotions with share at least the configured minimum (default 5%), using the same ordering as the title page. maxItems: 3 |
data.emotions[].rank | integer | Yes | One-based rank among the returned dominant emotions. minimum: 1; maximum: 3 |
data.emotions[].key | string | Yes | Stable emotion slug. |
data.emotions[].label | string | Yes | Emotion label in requested language. |
data.emotions[].labels | object | Yes | Labels in both supported languages. |
data.emotions[].labels.ka | string | Yes | Georgian label. |
data.emotions[].labels.en | string | Yes | English label. |
data.emotions[].family | string | Yes | Emotion family grouping in the FeelDB taxonomy. |
data.emotions[].color | string | Yes | Family display colour as a hexadecimal RGB value. pattern: ^#[0-9A-Fa-f]{6}$ |
data.emotions[].icon | string | Yes | Absolute SVG icon URL; use the returned URL rather than constructing one. |
data.emotions[].share | number | Yes | Share of the title's emotional signal in percent, not % of people; rounded to one decimal. The returned top emotions need not sum to 100. minimum: 0; maximum: 100 |
data.tied_with_next | boolean | Yes | Whether rank 3 has the same share as rank 4, signalling a tie at the display cutoff. |
data.source | object | Yes | Evidence origin, viewer count and confidence. |
data.source.kind | string (ai, blended, viewers, none) | Yes | ai = AI estimate only; blended = AI estimate plus viewer ballots; viewers = viewer ballots only; none = no emotion evidence. |
data.source.viewers | integer | Yes | Distinct viewers who submitted ballots; never a synthetic vote count. minimum: 0 |
data.source.confidence | string (high, medium, low) | Yes | High when viewers >= 10; medium when an AI estimate is present or viewers are 3–9; low otherwise. Confidence describes evidence, not a probability. |
data.url | string | Yes | Canonical title page URL in the requested language. |
data.urls | object | Yes | Canonical title page URLs in both languages. |
data.urls.ka | string | Yes | Canonical Georgian title page URL. |
data.urls.en | string | Yes | Canonical English title page URL. |
data.attribution | object | Yes | Required display attribution and backlink. |
data.attribution.text | string (Emotion data: FeelDB, ემოციების მონაცემები: FeelDB) | Yes | Localized attribution text. |
data.attribution.url | string | Yes | FeelDB title page backlink; use this returned URL. |
data.attribution.terms | string | Yes | URL of attribution terms; use this returned URL. |
data.updated_at | string | Yes | UTC ISO-8601 timestamp of the latest AI estimate or viewer ballot, falling back to title updated_at. |
t | string | Yes | pattern: ^tt[0-9]{7,10}$ |
s | string (ok, insufficient_data) | Yes | |
e | array<tuple<integer, integer>> | Yes | maxItems: 3 |
u | string | Yes | pattern: ^/ |
x | integer | Yes | minimum: 1 |
s | any (ok) | No | |
s | any (insufficient_data) | No | |
e | any | No | maxItems: 0 |
{
"data": {
"imdb_id": "tt0092929",
"type": "movie",
"year": 1988,
"title": {
"original": "Drowning by Numbers",
"en": "Drowning by Numbers",
"ka": null
},
"status": "ok",
"emotions": [
{
"rank": 1,
"key": "confusion",
"label": "Confusion",
"labels": {
"ka": "დაბნეულობა",
"en": "Confusion"
},
"share": 18,
"family": "play",
"color": "#B8E04A",
"icon": "https://feeldb.resoftware.ai/api/public/v1/icons/confusion.svg"
},
{
"rank": 2,
"key": "humor",
"label": "Humor",
"labels": {
"ka": "იუმორი",
"en": "Humor"
},
"share": 15,
"family": "play",
"color": "#B8E04A",
"icon": "https://feeldb.resoftware.ai/api/public/v1/icons/humor.svg"
},
{
"rank": 3,
"key": "joy",
"label": "Joy",
"labels": {
"ka": "სიხარული",
"en": "Joy"
},
"share": 13.3,
"family": "joy",
"color": "#FFC53D",
"icon": "https://feeldb.resoftware.ai/api/public/v1/icons/joy.svg"
}
],
"source": {
"kind": "blended",
"viewers": 2,
"confidence": "medium"
},
"url": "https://feeldb.resoftware.ai/movies/10000-drowning-by-numbers-1988",
"urls": {
"ka": "https://feeldb.resoftware.ai/ka/movies/10000-drowning-by-numbers-1988",
"en": "https://feeldb.resoftware.ai/movies/10000-drowning-by-numbers-1988"
},
"attribution": {
"text": "Emotion data: FeelDB",
"url": "https://feeldb.resoftware.ai/movies/10000-drowning-by-numbers-1988",
"terms": "https://feeldb.resoftware.ai/integrations#attribution"
},
"updated_at": "2026-10-12T00:25:17Z",
"name": "Drowning by Numbers",
"animation": false,
"tied_with_next": true
}
}
{
"data": {
"imdb_id": "tt0000001",
"type": "series",
"year": 2024,
"title": {
"original": "Example",
"en": "Example",
"ka": null
},
"status": "insufficient_data",
"emotions": [],
"source": {
"kind": "none",
"viewers": 0,
"confidence": "low"
},
"url": "https://feeldb.resoftware.ai/series/1-example-2024",
"urls": {
"ka": "https://feeldb.resoftware.ai/ka/series/1-example-2024",
"en": "https://feeldb.resoftware.ai/series/1-example-2024"
},
"attribution": {
"text": "Emotion data: FeelDB",
"url": "https://feeldb.resoftware.ai/series/1-example-2024",
"terms": "https://feeldb.resoftware.ai/integrations#attribution"
},
"updated_at": "2026-10-12T00:00:00Z",
"name": "Example",
"animation": false,
"tied_with_next": false
}
}
{
"t": "tt1375666",
"s": "ok",
"e": [
[
7,
42
],
[
12,
31
],
[
3,
18
]
],
"u": "/movies/18213-inception-2010",
"x": 2
}
Response headers
ETag- Payload validator; send it as If-None-Match for a bodyless 304.
Cache-Control- Without pk and flag true: public, max-age=600, s-maxage=3600, stale-while-revalidate=86400. With pk: public, max-age=120, s-maxage=120.
X-Request-Id- Request identifier for diagnostics.
Vary- Accept-Encoding on the pk alias.
Access-Control-Allow-Origin- Wildcard public CORS without credentials.
304 Not modified; no response body. Reuse the cached representation.
Response headers
ETag- Payload validator; send it as If-None-Match for a bodyless 304.
Cache-Control- Without pk and flag true: public, max-age=600, s-maxage=3600, stale-while-revalidate=86400. With pk: public, max-age=120, s-maxage=120.
X-Request-Id- Request identifier for diagnostics.
Vary- Accept-Encoding on the pk alias.
Access-Control-Allow-Origin- Wildcard public CORS without credentials.
No JSON response body.
404 Uniform not_found for unknown, malformed, hidden and pending titles, or missing resources.
application/json
Uniform JSON error envelope. Never includes stack traces or private title information.
| Field | Type | Required | Description |
|---|---|---|---|
error | object | Yes | Stable machine-readable error and human help. |
error.code | string (not_found, invalid_imdb_id, unauthorized, key_revoked, partner_suspended, rate_limited, quota_exceeded, batch_too_large, payload_too_large, method_not_allowed, server_error, service_unavailable, validation_error, key_required, balance_exhausted, origin_not_allowed, addon_required) | Yes | Stable error code. not_found covers absent routes and malformed, unknown, hidden or pending single-title ids. validation_error covers malformed batch bodies. |
error.message | string | Yes | Human-readable explanation; do not parse this for control flow. |
error.docs | string | Yes | Absolute English error documentation URL. |
{
"error": {
"code": "not_found",
"message": "No published title has this IMDb id.",
"docs": "https://feeldb.resoftware.ai/integrations/docs#errors"
}
}
Response headers
ETag- Payload validator; send it as If-None-Match for a bodyless 304.
Cache-Control- HTTP caching policy; public surfaces are edge-cacheable, keyed responses are private.
X-RateLimit-Limit- Requests allowed per minute.
X-RateLimit-Remaining- Requests remaining in the minute window.
X-RateLimit-Reset- Unix timestamp at which the rate-limit window resets.
X-Request-Id- Request identifier for diagnostics.
405 HTTP method not supported.
application/json
Uniform JSON error envelope. Never includes stack traces or private title information.
| Field | Type | Required | Description |
|---|---|---|---|
error | object | Yes | Stable machine-readable error and human help. |
error.code | string (not_found, invalid_imdb_id, unauthorized, key_revoked, partner_suspended, rate_limited, quota_exceeded, batch_too_large, payload_too_large, method_not_allowed, server_error, service_unavailable, validation_error, key_required, balance_exhausted, origin_not_allowed, addon_required) | Yes | Stable error code. not_found covers absent routes and malformed, unknown, hidden or pending single-title ids. validation_error covers malformed batch bodies. |
error.message | string | Yes | Human-readable explanation; do not parse this for control flow. |
error.docs | string | Yes | Absolute English error documentation URL. |
Response headers
ETag- Payload validator; send it as If-None-Match for a bodyless 304.
Cache-Control- HTTP caching policy; public surfaces are edge-cacheable, keyed responses are private.
X-RateLimit-Limit- Requests allowed per minute.
X-RateLimit-Remaining- Requests remaining in the minute window.
X-RateLimit-Reset- Unix timestamp at which the rate-limit window resets.
X-Request-Id- Request identifier for diagnostics.
422 Invalid request structure or more than 100 batch ids.
application/json
Uniform JSON error envelope. Never includes stack traces or private title information.
| Field | Type | Required | Description |
|---|---|---|---|
error | object | Yes | Stable machine-readable error and human help. |
error.code | string (not_found, invalid_imdb_id, unauthorized, key_revoked, partner_suspended, rate_limited, quota_exceeded, batch_too_large, payload_too_large, method_not_allowed, server_error, service_unavailable, validation_error, key_required, balance_exhausted, origin_not_allowed, addon_required) | Yes | Stable error code. not_found covers absent routes and malformed, unknown, hidden or pending single-title ids. validation_error covers malformed batch bodies. |
error.message | string | Yes | Human-readable explanation; do not parse this for control flow. |
error.docs | string | Yes | Absolute English error documentation URL. |
{
"error": {
"code": "invalid_imdb_id",
"message": "IMDb ids look like tt0111161.",
"docs": "https://feeldb.resoftware.ai/integrations/docs#errors"
}
}
{
"error": {
"code": "batch_too_large",
"message": "At most 100 ids per batch.",
"docs": "https://feeldb.resoftware.ai/integrations/docs#errors"
}
}
Response headers
ETag- Payload validator; send it as If-None-Match for a bodyless 304.
Cache-Control- HTTP caching policy; public surfaces are edge-cacheable, keyed responses are private.
X-RateLimit-Limit- Requests allowed per minute.
X-RateLimit-Remaining- Requests remaining in the minute window.
X-RateLimit-Reset- Unix timestamp at which the rate-limit window resets.
X-Request-Id- Request identifier for diagnostics.
429 Rate limit or daily lookup quota exceeded; obey Retry-After.
application/json
Uniform JSON error envelope. Never includes stack traces or private title information.
| Field | Type | Required | Description |
|---|---|---|---|
error | object | Yes | Stable machine-readable error and human help. |
error.code | string (not_found, invalid_imdb_id, unauthorized, key_revoked, partner_suspended, rate_limited, quota_exceeded, batch_too_large, payload_too_large, method_not_allowed, server_error, service_unavailable, validation_error, key_required, balance_exhausted, origin_not_allowed, addon_required) | Yes | Stable error code. not_found covers absent routes and malformed, unknown, hidden or pending single-title ids. validation_error covers malformed batch bodies. |
error.message | string | Yes | Human-readable explanation; do not parse this for control flow. |
error.docs | string | Yes | Absolute English error documentation URL. |
{
"error": {
"code": "rate_limited",
"message": "Too many requests.",
"docs": "https://feeldb.resoftware.ai/integrations/docs#errors"
}
}
{
"error": {
"code": "quota_exceeded",
"message": "Daily quota exceeded.",
"docs": "https://feeldb.resoftware.ai/integrations/docs#errors"
}
}
Response headers
ETag- Payload validator; send it as If-None-Match for a bodyless 304.
Cache-Control- HTTP caching policy; public surfaces are edge-cacheable, keyed responses are private.
X-RateLimit-Limit- Requests allowed per minute.
X-RateLimit-Remaining- Requests remaining in the minute window.
X-RateLimit-Reset- Unix timestamp at which the rate-limit window resets.
X-Request-Id- Request identifier for diagnostics.
Retry-After- Seconds until a retry is permitted; quota errors wait until next UTC midnight.
500 Internal server error without stack traces.
application/json
Uniform JSON error envelope. Never includes stack traces or private title information.
| Field | Type | Required | Description |
|---|---|---|---|
error | object | Yes | Stable machine-readable error and human help. |
error.code | string (not_found, invalid_imdb_id, unauthorized, key_revoked, partner_suspended, rate_limited, quota_exceeded, batch_too_large, payload_too_large, method_not_allowed, server_error, service_unavailable, validation_error, key_required, balance_exhausted, origin_not_allowed, addon_required) | Yes | Stable error code. not_found covers absent routes and malformed, unknown, hidden or pending single-title ids. validation_error covers malformed batch bodies. |
error.message | string | Yes | Human-readable explanation; do not parse this for control flow. |
error.docs | string | Yes | Absolute English error documentation URL. |
Response headers
ETag- Payload validator; send it as If-None-Match for a bodyless 304.
Cache-Control- HTTP caching policy; public surfaces are edge-cacheable, keyed responses are private.
X-RateLimit-Limit- Requests allowed per minute.
X-RateLimit-Remaining- Requests remaining in the minute window.
X-RateLimit-Reset- Unix timestamp at which the rate-limit window resets.
X-Request-Id- Request identifier for diagnostics.
503 Temporarily unavailable; keyed endpoints fail closed when Redis or DB is unavailable.
application/json
Uniform JSON error envelope. Never includes stack traces or private title information.
| Field | Type | Required | Description |
|---|---|---|---|
error | object | Yes | Stable machine-readable error and human help. |
error.code | string (not_found, invalid_imdb_id, unauthorized, key_revoked, partner_suspended, rate_limited, quota_exceeded, batch_too_large, payload_too_large, method_not_allowed, server_error, service_unavailable, validation_error, key_required, balance_exhausted, origin_not_allowed, addon_required) | Yes | Stable error code. not_found covers absent routes and malformed, unknown, hidden or pending single-title ids. validation_error covers malformed batch bodies. |
error.message | string | Yes | Human-readable explanation; do not parse this for control flow. |
error.docs | string | Yes | Absolute English error documentation URL. |
{
"error": {
"code": "service_unavailable",
"message": "Temporarily unavailable, retry later.",
"docs": "https://feeldb.resoftware.ai/integrations/docs#errors"
}
}
Response headers
ETag- Payload validator; send it as If-None-Match for a bodyless 304.
Cache-Control- HTTP caching policy; public surfaces are edge-cacheable, keyed responses are private.
X-RateLimit-Limit- Requests allowed per minute.
X-RateLimit-Remaining- Requests remaining in the minute window.
X-RateLimit-Reset- Unix timestamp at which the rate-limit window resets.
X-Request-Id- Request identifier for diagnostics.
401 Missing, invalid or revoked publishable key.
application/json
Uniform JSON error envelope. Never includes stack traces or private title information.
| Field | Type | Required | Description |
|---|---|---|---|
error | object | Yes | Stable machine-readable error and human help. |
error.code | string (not_found, invalid_imdb_id, unauthorized, key_revoked, partner_suspended, rate_limited, quota_exceeded, batch_too_large, payload_too_large, method_not_allowed, server_error, service_unavailable, validation_error, key_required, balance_exhausted, origin_not_allowed, addon_required) | Yes | Stable error code. not_found covers absent routes and malformed, unknown, hidden or pending single-title ids. validation_error covers malformed batch bodies. |
error.message | string | Yes | Human-readable explanation; do not parse this for control flow. |
error.docs | string | Yes | Absolute English error documentation URL. |
{
"error": {
"code": "key_required",
"message": "A publishable key is required: add ?pk=… (see docs)",
"docs": "https://feeldb.resoftware.ai/integrations/docs#errors"
}
}
Response headers
Cache-Control- no-store, private
402 Prepaid balance exhausted.
application/json
Uniform JSON error envelope. Never includes stack traces or private title information.
| Field | Type | Required | Description |
|---|---|---|---|
error | object | Yes | Stable machine-readable error and human help. |
error.code | string (not_found, invalid_imdb_id, unauthorized, key_revoked, partner_suspended, rate_limited, quota_exceeded, batch_too_large, payload_too_large, method_not_allowed, server_error, service_unavailable, validation_error, key_required, balance_exhausted, origin_not_allowed, addon_required) | Yes | Stable error code. not_found covers absent routes and malformed, unknown, hidden or pending single-title ids. validation_error covers malformed batch bodies. |
error.message | string | Yes | Human-readable explanation; do not parse this for control flow. |
error.docs | string | Yes | Absolute English error documentation URL. |
{
"error": {
"code": "balance_exhausted",
"message": "Prepaid balance exhausted",
"docs": "https://feeldb.resoftware.ai/integrations/docs#errors"
}
}
Response headers
Cache-Control- no-store, private
403 Origin not allowed or partner suspended.
application/json
Uniform JSON error envelope. Never includes stack traces or private title information.
| Field | Type | Required | Description |
|---|---|---|---|
error | object | Yes | Stable machine-readable error and human help. |
error.code | string (not_found, invalid_imdb_id, unauthorized, key_revoked, partner_suspended, rate_limited, quota_exceeded, batch_too_large, payload_too_large, method_not_allowed, server_error, service_unavailable, validation_error, key_required, balance_exhausted, origin_not_allowed, addon_required) | Yes | Stable error code. not_found covers absent routes and malformed, unknown, hidden or pending single-title ids. validation_error covers malformed batch bodies. |
error.message | string | Yes | Human-readable explanation; do not parse this for control flow. |
error.docs | string | Yes | Absolute English error documentation URL. |
{
"error": {
"code": "origin_not_allowed",
"message": "This key is not allowed from this origin",
"docs": "https://feeldb.resoftware.ai/integrations/docs#errors"
}
}
Response headers
Cache-Control- no-store, private
/api/v1/titles/{imdb_id}/emotionsSecret bearer · serverGet dominant emotions by IMDb id
Server-to-server bearer authentication; no browser CORS and no cookies. Cache-Control: private, max-age=300.
Parameters
| Name / location | Type | Required | Description |
|---|---|---|---|
imdb_id / path | string | Yes | IMDb title id. Malformed, unknown, hidden and pending ids receive the same 404 envelope. |
lang / query | string (ka, en) | No | Label and title language; defaults to ka. Unsupported values normalize to en; all labels retain both languages. |
If-None-Match / header | string | No | Previously received ETag; a match returns 304 without a body. |
Responses
200 Successful response.
application/json
Single-title response envelope.
| Field | Type | Required | Description |
|---|---|---|---|
data | object | Yes | Published title emotion data. |
data.imdb_id | string | Yes | IMDb identifier of the published title. pattern: ^tt[0-9]{7,10}$ |
data.type | string (movie, series) | Yes | Movie or series; animation is a separate flag. |
data.year | integer | null | Yes | Release year, or null when unknown. |
data.title | object | Yes | Original and translated title names. |
data.title.original | string | Yes | Original title, falling back to English. |
data.title.en | string | Yes | English title. |
data.title.ka | string | null | Yes | Georgian title, or null if unavailable. |
data.name | string | Yes | Title in requested language, falling back to English. |
data.animation | boolean | Yes | Whether the title is animated. |
data.status | string (ok, insufficient_data) | Yes | ok when at least one emotion qualifies; insufficient_data when none reach the configured minimum share (default 5%). This is a 200 response with an empty emotions array. |
data.emotions | array<object> | Yes | Top up to three emotions with share at least the configured minimum (default 5%), using the same ordering as the title page. maxItems: 3 |
data.emotions[].rank | integer | Yes | One-based rank among the returned dominant emotions. minimum: 1; maximum: 3 |
data.emotions[].key | string | Yes | Stable emotion slug. |
data.emotions[].label | string | Yes | Emotion label in requested language. |
data.emotions[].labels | object | Yes | Labels in both supported languages. |
data.emotions[].labels.ka | string | Yes | Georgian label. |
data.emotions[].labels.en | string | Yes | English label. |
data.emotions[].family | string | Yes | Emotion family grouping in the FeelDB taxonomy. |
data.emotions[].color | string | Yes | Family display colour as a hexadecimal RGB value. pattern: ^#[0-9A-Fa-f]{6}$ |
data.emotions[].icon | string | Yes | Absolute SVG icon URL; use the returned URL rather than constructing one. |
data.emotions[].share | number | Yes | Share of the title's emotional signal in percent, not % of people; rounded to one decimal. The returned top emotions need not sum to 100. minimum: 0; maximum: 100 |
data.tied_with_next | boolean | Yes | Whether rank 3 has the same share as rank 4, signalling a tie at the display cutoff. |
data.source | object | Yes | Evidence origin, viewer count and confidence. |
data.source.kind | string (ai, blended, viewers, none) | Yes | ai = AI estimate only; blended = AI estimate plus viewer ballots; viewers = viewer ballots only; none = no emotion evidence. |
data.source.viewers | integer | Yes | Distinct viewers who submitted ballots; never a synthetic vote count. minimum: 0 |
data.source.confidence | string (high, medium, low) | Yes | High when viewers >= 10; medium when an AI estimate is present or viewers are 3–9; low otherwise. Confidence describes evidence, not a probability. |
data.url | string | Yes | Canonical title page URL in the requested language. |
data.urls | object | Yes | Canonical title page URLs in both languages. |
data.urls.ka | string | Yes | Canonical Georgian title page URL. |
data.urls.en | string | Yes | Canonical English title page URL. |
data.attribution | object | Yes | Required display attribution and backlink. |
data.attribution.text | string (Emotion data: FeelDB, ემოციების მონაცემები: FeelDB) | Yes | Localized attribution text. |
data.attribution.url | string | Yes | FeelDB title page backlink; use this returned URL. |
data.attribution.terms | string | Yes | URL of attribution terms; use this returned URL. |
data.updated_at | string | Yes | UTC ISO-8601 timestamp of the latest AI estimate or viewer ballot, falling back to title updated_at. |
{
"data": {
"imdb_id": "tt0092929",
"type": "movie",
"year": 1988,
"title": {
"original": "Drowning by Numbers",
"en": "Drowning by Numbers",
"ka": null
},
"status": "ok",
"emotions": [
{
"rank": 1,
"key": "confusion",
"label": "Confusion",
"labels": {
"ka": "დაბნეულობა",
"en": "Confusion"
},
"share": 18,
"family": "play",
"color": "#B8E04A",
"icon": "https://feeldb.resoftware.ai/api/public/v1/icons/confusion.svg"
},
{
"rank": 2,
"key": "humor",
"label": "Humor",
"labels": {
"ka": "იუმორი",
"en": "Humor"
},
"share": 15,
"family": "play",
"color": "#B8E04A",
"icon": "https://feeldb.resoftware.ai/api/public/v1/icons/humor.svg"
},
{
"rank": 3,
"key": "joy",
"label": "Joy",
"labels": {
"ka": "სიხარული",
"en": "Joy"
},
"share": 13.3,
"family": "joy",
"color": "#FFC53D",
"icon": "https://feeldb.resoftware.ai/api/public/v1/icons/joy.svg"
}
],
"source": {
"kind": "blended",
"viewers": 2,
"confidence": "medium"
},
"url": "https://feeldb.resoftware.ai/movies/10000-drowning-by-numbers-1988",
"urls": {
"ka": "https://feeldb.resoftware.ai/ka/movies/10000-drowning-by-numbers-1988",
"en": "https://feeldb.resoftware.ai/movies/10000-drowning-by-numbers-1988"
},
"attribution": {
"text": "Emotion data: FeelDB",
"url": "https://feeldb.resoftware.ai/movies/10000-drowning-by-numbers-1988",
"terms": "https://feeldb.resoftware.ai/integrations#attribution"
},
"updated_at": "2026-10-12T00:25:17Z",
"name": "Drowning by Numbers",
"animation": false,
"tied_with_next": true
}
}
{
"data": {
"imdb_id": "tt0000001",
"type": "series",
"year": 2024,
"title": {
"original": "Example",
"en": "Example",
"ka": null
},
"status": "insufficient_data",
"emotions": [],
"source": {
"kind": "none",
"viewers": 0,
"confidence": "low"
},
"url": "https://feeldb.resoftware.ai/series/1-example-2024",
"urls": {
"ka": "https://feeldb.resoftware.ai/ka/series/1-example-2024",
"en": "https://feeldb.resoftware.ai/series/1-example-2024"
},
"attribution": {
"text": "Emotion data: FeelDB",
"url": "https://feeldb.resoftware.ai/series/1-example-2024",
"terms": "https://feeldb.resoftware.ai/integrations#attribution"
},
"updated_at": "2026-10-12T00:00:00Z",
"name": "Example",
"animation": false,
"tied_with_next": false
}
}
Response headers
ETag- Payload validator; send it as If-None-Match for a bodyless 304.
Cache-Control- HTTP caching policy; public surfaces are edge-cacheable, keyed responses are private.
X-RateLimit-Limit- Requests allowed per minute.
X-RateLimit-Remaining- Requests remaining in the minute window.
X-RateLimit-Reset- Unix timestamp at which the rate-limit window resets.
X-Request-Id- Request identifier for diagnostics.
304 Not modified; no response body. Reuse the cached representation.
Response headers
ETag- Payload validator; send it as If-None-Match for a bodyless 304.
Cache-Control- HTTP caching policy; public surfaces are edge-cacheable, keyed responses are private.
X-RateLimit-Limit- Requests allowed per minute.
X-RateLimit-Remaining- Requests remaining in the minute window.
X-RateLimit-Reset- Unix timestamp at which the rate-limit window resets.
X-Request-Id- Request identifier for diagnostics.
No JSON response body.
404 Uniform not_found for unknown, malformed, hidden and pending titles, or missing resources.
application/json
Uniform JSON error envelope. Never includes stack traces or private title information.
| Field | Type | Required | Description |
|---|---|---|---|
error | object | Yes | Stable machine-readable error and human help. |
error.code | string (not_found, invalid_imdb_id, unauthorized, key_revoked, partner_suspended, rate_limited, quota_exceeded, batch_too_large, payload_too_large, method_not_allowed, server_error, service_unavailable, validation_error, key_required, balance_exhausted, origin_not_allowed, addon_required) | Yes | Stable error code. not_found covers absent routes and malformed, unknown, hidden or pending single-title ids. validation_error covers malformed batch bodies. |
error.message | string | Yes | Human-readable explanation; do not parse this for control flow. |
error.docs | string | Yes | Absolute English error documentation URL. |
{
"error": {
"code": "not_found",
"message": "No published title has this IMDb id.",
"docs": "https://feeldb.resoftware.ai/integrations/docs#errors"
}
}
Response headers
ETag- Payload validator; send it as If-None-Match for a bodyless 304.
Cache-Control- HTTP caching policy; public surfaces are edge-cacheable, keyed responses are private.
X-RateLimit-Limit- Requests allowed per minute.
X-RateLimit-Remaining- Requests remaining in the minute window.
X-RateLimit-Reset- Unix timestamp at which the rate-limit window resets.
X-Request-Id- Request identifier for diagnostics.
405 HTTP method not supported.
application/json
Uniform JSON error envelope. Never includes stack traces or private title information.
| Field | Type | Required | Description |
|---|---|---|---|
error | object | Yes | Stable machine-readable error and human help. |
error.code | string (not_found, invalid_imdb_id, unauthorized, key_revoked, partner_suspended, rate_limited, quota_exceeded, batch_too_large, payload_too_large, method_not_allowed, server_error, service_unavailable, validation_error, key_required, balance_exhausted, origin_not_allowed, addon_required) | Yes | Stable error code. not_found covers absent routes and malformed, unknown, hidden or pending single-title ids. validation_error covers malformed batch bodies. |
error.message | string | Yes | Human-readable explanation; do not parse this for control flow. |
error.docs | string | Yes | Absolute English error documentation URL. |
Response headers
ETag- Payload validator; send it as If-None-Match for a bodyless 304.
Cache-Control- HTTP caching policy; public surfaces are edge-cacheable, keyed responses are private.
X-RateLimit-Limit- Requests allowed per minute.
X-RateLimit-Remaining- Requests remaining in the minute window.
X-RateLimit-Reset- Unix timestamp at which the rate-limit window resets.
X-Request-Id- Request identifier for diagnostics.
422 Invalid request structure or more than 100 batch ids.
application/json
Uniform JSON error envelope. Never includes stack traces or private title information.
| Field | Type | Required | Description |
|---|---|---|---|
error | object | Yes | Stable machine-readable error and human help. |
error.code | string (not_found, invalid_imdb_id, unauthorized, key_revoked, partner_suspended, rate_limited, quota_exceeded, batch_too_large, payload_too_large, method_not_allowed, server_error, service_unavailable, validation_error, key_required, balance_exhausted, origin_not_allowed, addon_required) | Yes | Stable error code. not_found covers absent routes and malformed, unknown, hidden or pending single-title ids. validation_error covers malformed batch bodies. |
error.message | string | Yes | Human-readable explanation; do not parse this for control flow. |
error.docs | string | Yes | Absolute English error documentation URL. |
{
"error": {
"code": "invalid_imdb_id",
"message": "IMDb ids look like tt0111161.",
"docs": "https://feeldb.resoftware.ai/integrations/docs#errors"
}
}
{
"error": {
"code": "batch_too_large",
"message": "At most 100 ids per batch.",
"docs": "https://feeldb.resoftware.ai/integrations/docs#errors"
}
}
Response headers
ETag- Payload validator; send it as If-None-Match for a bodyless 304.
Cache-Control- HTTP caching policy; public surfaces are edge-cacheable, keyed responses are private.
X-RateLimit-Limit- Requests allowed per minute.
X-RateLimit-Remaining- Requests remaining in the minute window.
X-RateLimit-Reset- Unix timestamp at which the rate-limit window resets.
X-Request-Id- Request identifier for diagnostics.
429 Rate limit or daily lookup quota exceeded; obey Retry-After.
application/json
Uniform JSON error envelope. Never includes stack traces or private title information.
| Field | Type | Required | Description |
|---|---|---|---|
error | object | Yes | Stable machine-readable error and human help. |
error.code | string (not_found, invalid_imdb_id, unauthorized, key_revoked, partner_suspended, rate_limited, quota_exceeded, batch_too_large, payload_too_large, method_not_allowed, server_error, service_unavailable, validation_error, key_required, balance_exhausted, origin_not_allowed, addon_required) | Yes | Stable error code. not_found covers absent routes and malformed, unknown, hidden or pending single-title ids. validation_error covers malformed batch bodies. |
error.message | string | Yes | Human-readable explanation; do not parse this for control flow. |
error.docs | string | Yes | Absolute English error documentation URL. |
{
"error": {
"code": "rate_limited",
"message": "Too many requests.",
"docs": "https://feeldb.resoftware.ai/integrations/docs#errors"
}
}
{
"error": {
"code": "quota_exceeded",
"message": "Daily quota exceeded.",
"docs": "https://feeldb.resoftware.ai/integrations/docs#errors"
}
}
Response headers
ETag- Payload validator; send it as If-None-Match for a bodyless 304.
Cache-Control- HTTP caching policy; public surfaces are edge-cacheable, keyed responses are private.
X-RateLimit-Limit- Requests allowed per minute.
X-RateLimit-Remaining- Requests remaining in the minute window.
X-RateLimit-Reset- Unix timestamp at which the rate-limit window resets.
X-Request-Id- Request identifier for diagnostics.
Retry-After- Seconds until a retry is permitted; quota errors wait until next UTC midnight.
500 Internal server error without stack traces.
application/json
Uniform JSON error envelope. Never includes stack traces or private title information.
| Field | Type | Required | Description |
|---|---|---|---|
error | object | Yes | Stable machine-readable error and human help. |
error.code | string (not_found, invalid_imdb_id, unauthorized, key_revoked, partner_suspended, rate_limited, quota_exceeded, batch_too_large, payload_too_large, method_not_allowed, server_error, service_unavailable, validation_error, key_required, balance_exhausted, origin_not_allowed, addon_required) | Yes | Stable error code. not_found covers absent routes and malformed, unknown, hidden or pending single-title ids. validation_error covers malformed batch bodies. |
error.message | string | Yes | Human-readable explanation; do not parse this for control flow. |
error.docs | string | Yes | Absolute English error documentation URL. |
Response headers
ETag- Payload validator; send it as If-None-Match for a bodyless 304.
Cache-Control- HTTP caching policy; public surfaces are edge-cacheable, keyed responses are private.
X-RateLimit-Limit- Requests allowed per minute.
X-RateLimit-Remaining- Requests remaining in the minute window.
X-RateLimit-Reset- Unix timestamp at which the rate-limit window resets.
X-Request-Id- Request identifier for diagnostics.
503 Temporarily unavailable; keyed endpoints fail closed when Redis or DB is unavailable.
application/json
Uniform JSON error envelope. Never includes stack traces or private title information.
| Field | Type | Required | Description |
|---|---|---|---|
error | object | Yes | Stable machine-readable error and human help. |
error.code | string (not_found, invalid_imdb_id, unauthorized, key_revoked, partner_suspended, rate_limited, quota_exceeded, batch_too_large, payload_too_large, method_not_allowed, server_error, service_unavailable, validation_error, key_required, balance_exhausted, origin_not_allowed, addon_required) | Yes | Stable error code. not_found covers absent routes and malformed, unknown, hidden or pending single-title ids. validation_error covers malformed batch bodies. |
error.message | string | Yes | Human-readable explanation; do not parse this for control flow. |
error.docs | string | Yes | Absolute English error documentation URL. |
{
"error": {
"code": "service_unavailable",
"message": "Temporarily unavailable, retry later.",
"docs": "https://feeldb.resoftware.ai/integrations/docs#errors"
}
}
Response headers
ETag- Payload validator; send it as If-None-Match for a bodyless 304.
Cache-Control- HTTP caching policy; public surfaces are edge-cacheable, keyed responses are private.
X-RateLimit-Limit- Requests allowed per minute.
X-RateLimit-Remaining- Requests remaining in the minute window.
X-RateLimit-Reset- Unix timestamp at which the rate-limit window resets.
X-Request-Id- Request identifier for diagnostics.
401 Missing, invalid or revoked bearer key.
application/json
Uniform JSON error envelope. Never includes stack traces or private title information.
| Field | Type | Required | Description |
|---|---|---|---|
error | object | Yes | Stable machine-readable error and human help. |
error.code | string (not_found, invalid_imdb_id, unauthorized, key_revoked, partner_suspended, rate_limited, quota_exceeded, batch_too_large, payload_too_large, method_not_allowed, server_error, service_unavailable, validation_error, key_required, balance_exhausted, origin_not_allowed, addon_required) | Yes | Stable error code. not_found covers absent routes and malformed, unknown, hidden or pending single-title ids. validation_error covers malformed batch bodies. |
error.message | string | Yes | Human-readable explanation; do not parse this for control flow. |
error.docs | string | Yes | Absolute English error documentation URL. |
{
"error": {
"code": "unauthorized",
"message": "Missing or invalid API key.",
"docs": "https://feeldb.resoftware.ai/integrations/docs#errors"
}
}
Response headers
ETag- Payload validator; send it as If-None-Match for a bodyless 304.
Cache-Control- HTTP caching policy; public surfaces are edge-cacheable, keyed responses are private.
X-RateLimit-Limit- Requests allowed per minute.
X-RateLimit-Remaining- Requests remaining in the minute window.
X-RateLimit-Reset- Unix timestamp at which the rate-limit window resets.
X-Request-Id- Request identifier for diagnostics.
403 Partner account suspended.
application/json
Uniform JSON error envelope. Never includes stack traces or private title information.
| Field | Type | Required | Description |
|---|---|---|---|
error | object | Yes | Stable machine-readable error and human help. |
error.code | string (not_found, invalid_imdb_id, unauthorized, key_revoked, partner_suspended, rate_limited, quota_exceeded, batch_too_large, payload_too_large, method_not_allowed, server_error, service_unavailable, validation_error, key_required, balance_exhausted, origin_not_allowed, addon_required) | Yes | Stable error code. not_found covers absent routes and malformed, unknown, hidden or pending single-title ids. validation_error covers malformed batch bodies. |
error.message | string | Yes | Human-readable explanation; do not parse this for control flow. |
error.docs | string | Yes | Absolute English error documentation URL. |
{
"error": {
"code": "partner_suspended",
"message": "This partner account is suspended.",
"docs": "https://feeldb.resoftware.ai/integrations/docs#errors"
}
}
Response headers
ETag- Payload validator; send it as If-None-Match for a bodyless 304.
Cache-Control- HTTP caching policy; public surfaces are edge-cacheable, keyed responses are private.
X-RateLimit-Limit- Requests allowed per minute.
X-RateLimit-Remaining- Requests remaining in the minute window.
X-RateLimit-Reset- Unix timestamp at which the rate-limit window resets.
X-Request-Id- Request identifier for diagnostics.
402 balance_exhausted: prepaid balance exhausted.
application/json
Uniform JSON error envelope. Never includes stack traces or private title information.
| Field | Type | Required | Description |
|---|---|---|---|
error | object | Yes | Stable machine-readable error and human help. |
error.code | string (not_found, invalid_imdb_id, unauthorized, key_revoked, partner_suspended, rate_limited, quota_exceeded, batch_too_large, payload_too_large, method_not_allowed, server_error, service_unavailable, validation_error, key_required, balance_exhausted, origin_not_allowed, addon_required) | Yes | Stable error code. not_found covers absent routes and malformed, unknown, hidden or pending single-title ids. validation_error covers malformed batch bodies. |
error.message | string | Yes | Human-readable explanation; do not parse this for control flow. |
error.docs | string | Yes | Absolute English error documentation URL. |
Response headers
Cache-Control- no-store, private
/api/v1/widget/{imdb_id}Publishable key in ?pk= · browserGet compact emotions with a publishable key
Requires a matching Origin. No cookies or X-RateLimit-* headers. Ranked emotion tuples contain at most three entries; insufficient_data has an empty e. Canonical u has no host. 200 and 304 consume quota and a metered lookup.
Parameters
| Name / location | Type | Required | Description |
|---|---|---|---|
imdb_id / path | string | Yes | IMDb title id. Malformed, unknown, hidden and pending ids receive the same 404 envelope. |
pk / query | string | Yes | |
lang / query | string (ka, en) | No |
Responses
200 Compact public emotion payload.
application/json
| Field | Type | Required | Description |
|---|---|---|---|
t | string | Yes | pattern: ^tt[0-9]{7,10}$ |
s | string (ok, insufficient_data) | Yes | |
e | array<tuple<integer, integer>> | Yes | maxItems: 3 |
u | string | Yes | pattern: ^/ |
x | integer | Yes | minimum: 1 |
s | any (ok) | No | |
s | any (insufficient_data) | No | |
e | any | No | maxItems: 0 |
{
"t": "tt1375666",
"s": "ok",
"e": [
[
7,
42
],
[
12,
31
],
[
3,
18
]
],
"u": "/movies/18213-inception-2010",
"x": 2
}
Response headers
Cache-Control- public, max-age=120, s-maxage=120
ETag- Weak payload validator; 304 still consumes a metered lookup.
Access-Control-Allow-Origin- *
Vary- Accept-Encoding
304 Not modified; no response body.
Response headers
Cache-Control- public, max-age=120, s-maxage=120
ETag- Weak payload validator; 304 still consumes a metered lookup.
Access-Control-Allow-Origin- *
Vary- Accept-Encoding
No JSON response body.
401 Missing, invalid or revoked publishable key.
application/json
Uniform JSON error envelope. Never includes stack traces or private title information.
| Field | Type | Required | Description |
|---|---|---|---|
error | object | Yes | Stable machine-readable error and human help. |
error.code | string (not_found, invalid_imdb_id, unauthorized, key_revoked, partner_suspended, rate_limited, quota_exceeded, batch_too_large, payload_too_large, method_not_allowed, server_error, service_unavailable, validation_error, key_required, balance_exhausted, origin_not_allowed, addon_required) | Yes | Stable error code. not_found covers absent routes and malformed, unknown, hidden or pending single-title ids. validation_error covers malformed batch bodies. |
error.message | string | Yes | Human-readable explanation; do not parse this for control flow. |
error.docs | string | Yes | Absolute English error documentation URL. |
{
"error": {
"code": "key_required",
"message": "A publishable key is required: add ?pk=… (see docs)",
"docs": "https://feeldb.resoftware.ai/integrations/docs#errors"
}
}
Response headers
Cache-Control- no-store, private
402 Prepaid balance exhausted.
application/json
Uniform JSON error envelope. Never includes stack traces or private title information.
| Field | Type | Required | Description |
|---|---|---|---|
error | object | Yes | Stable machine-readable error and human help. |
error.code | string (not_found, invalid_imdb_id, unauthorized, key_revoked, partner_suspended, rate_limited, quota_exceeded, batch_too_large, payload_too_large, method_not_allowed, server_error, service_unavailable, validation_error, key_required, balance_exhausted, origin_not_allowed, addon_required) | Yes | Stable error code. not_found covers absent routes and malformed, unknown, hidden or pending single-title ids. validation_error covers malformed batch bodies. |
error.message | string | Yes | Human-readable explanation; do not parse this for control flow. |
error.docs | string | Yes | Absolute English error documentation URL. |
{
"error": {
"code": "balance_exhausted",
"message": "Prepaid balance exhausted",
"docs": "https://feeldb.resoftware.ai/integrations/docs#errors"
}
}
Response headers
Cache-Control- no-store, private
403 Origin not allowed or partner suspended.
application/json
Uniform JSON error envelope. Never includes stack traces or private title information.
| Field | Type | Required | Description |
|---|---|---|---|
error | object | Yes | Stable machine-readable error and human help. |
error.code | string (not_found, invalid_imdb_id, unauthorized, key_revoked, partner_suspended, rate_limited, quota_exceeded, batch_too_large, payload_too_large, method_not_allowed, server_error, service_unavailable, validation_error, key_required, balance_exhausted, origin_not_allowed, addon_required) | Yes | Stable error code. not_found covers absent routes and malformed, unknown, hidden or pending single-title ids. validation_error covers malformed batch bodies. |
error.message | string | Yes | Human-readable explanation; do not parse this for control flow. |
error.docs | string | Yes | Absolute English error documentation URL. |
{
"error": {
"code": "origin_not_allowed",
"message": "This key is not allowed from this origin",
"docs": "https://feeldb.resoftware.ai/integrations/docs#errors"
}
}
Response headers
Cache-Control- no-store, private
404 Title not found.
application/json
Uniform JSON error envelope. Never includes stack traces or private title information.
| Field | Type | Required | Description |
|---|---|---|---|
error | object | Yes | Stable machine-readable error and human help. |
error.code | string (not_found, invalid_imdb_id, unauthorized, key_revoked, partner_suspended, rate_limited, quota_exceeded, batch_too_large, payload_too_large, method_not_allowed, server_error, service_unavailable, validation_error, key_required, balance_exhausted, origin_not_allowed, addon_required) | Yes | Stable error code. not_found covers absent routes and malformed, unknown, hidden or pending single-title ids. validation_error covers malformed batch bodies. |
error.message | string | Yes | Human-readable explanation; do not parse this for control flow. |
error.docs | string | Yes | Absolute English error documentation URL. |
Response headers
Cache-Control- no-store, private
429 Quota or rate limit exceeded.
application/json
Uniform JSON error envelope. Never includes stack traces or private title information.
| Field | Type | Required | Description |
|---|---|---|---|
error | object | Yes | Stable machine-readable error and human help. |
error.code | string (not_found, invalid_imdb_id, unauthorized, key_revoked, partner_suspended, rate_limited, quota_exceeded, batch_too_large, payload_too_large, method_not_allowed, server_error, service_unavailable, validation_error, key_required, balance_exhausted, origin_not_allowed, addon_required) | Yes | Stable error code. not_found covers absent routes and malformed, unknown, hidden or pending single-title ids. validation_error covers malformed batch bodies. |
error.message | string | Yes | Human-readable explanation; do not parse this for control flow. |
error.docs | string | Yes | Absolute English error documentation URL. |
Response headers
Cache-Control- no-store, private
503 Billing service unavailable.
application/json
Uniform JSON error envelope. Never includes stack traces or private title information.
| Field | Type | Required | Description |
|---|---|---|---|
error | object | Yes | Stable machine-readable error and human help. |
error.code | string (not_found, invalid_imdb_id, unauthorized, key_revoked, partner_suspended, rate_limited, quota_exceeded, batch_too_large, payload_too_large, method_not_allowed, server_error, service_unavailable, validation_error, key_required, balance_exhausted, origin_not_allowed, addon_required) | Yes | Stable error code. not_found covers absent routes and malformed, unknown, hidden or pending single-title ids. validation_error covers malformed batch bodies. |
error.message | string | Yes | Human-readable explanation; do not parse this for control flow. |
error.docs | string | Yes | Absolute English error documentation URL. |
Response headers
Cache-Control- no-store, private
500 Unexpected server error.
application/json
Uniform JSON error envelope. Never includes stack traces or private title information.
| Field | Type | Required | Description |
|---|---|---|---|
error | object | Yes | Stable machine-readable error and human help. |
error.code | string (not_found, invalid_imdb_id, unauthorized, key_revoked, partner_suspended, rate_limited, quota_exceeded, batch_too_large, payload_too_large, method_not_allowed, server_error, service_unavailable, validation_error, key_required, balance_exhausted, origin_not_allowed, addon_required) | Yes | Stable error code. not_found covers absent routes and malformed, unknown, hidden or pending single-title ids. validation_error covers malformed batch bodies. |
error.message | string | Yes | Human-readable explanation; do not parse this for control flow. |
error.docs | string | Yes | Absolute English error documentation URL. |
Response headers
Cache-Control- no-store, private
/api/v1/titles/{imdb_id}/arcPublishable key in ?pk= · browser OR Secret bearer · serverGet an entitled compact emotion arc
Requires the arcs add-on before billing. Use pk query with matching Origin or secret bearer. Unsupported bins encode null in d and i. Unknown, hidden, pending and ineligible titles share a 404. Warm eligible payloads may remain cached for up to 600 seconds. Every 200/304 is metered, including immediate revocation checks. Publishable responses use C-6 headers and no cookies or X-RateLimit-*; secret responses use private, max-age=300 and no CORS.
Parameters
| Name / location | Type | Required | Description |
|---|---|---|---|
imdb_id / path | string | Yes | IMDb title id. Malformed, unknown, hidden and pending ids receive the same 404 envelope. |
pk / query | string | No |
Responses
200 Compact public emotion payload.
application/json
| Field | Type | Required | Description |
|---|---|---|---|
v | integer (1) | Yes | |
b | integer (20) | Yes | |
d | array<integer | null> | Yes | Taxonomy emotion ids; unsupported bins are null. minItems: 20; maxItems: 20 |
i | array<integer | null> | Yes | Round-half-up integer percent; unsupported bins are null at the same positions as d. minItems: 20; maxItems: 20 |
t | array<tuple<string (peak, valley, rise, fall), integer>> | Yes | maxItems: 3 |
{
"v": 1,
"b": 20,
"d": [
7,
29,
29,
29,
29,
29,
29,
29,
29,
29,
29,
29,
29,
29,
29,
29,
29,
29,
29,
29
],
"i": [
20,
23,
25,
28,
30,
33,
35,
38,
40,
43,
45,
48,
50,
53,
55,
58,
60,
63,
65,
68
],
"t": [
[
"peak",
7
],
[
"valley",
13
]
]
}
Response headers
Cache-Control- Publishable: public, max-age=120, s-maxage=120. Secret: private, max-age=300.
ETag- Weak payload validator; 304 still consumes a metered lookup.
Access-Control-Allow-Origin- Present only for publishable-key requests.
Vary- Accept-Encoding
304 Not modified; no response body.
Response headers
Cache-Control- Publishable: public, max-age=120, s-maxage=120. Secret: private, max-age=300.
ETag- Weak payload validator; 304 still consumes a metered lookup.
Access-Control-Allow-Origin- Present only for publishable-key requests.
Vary- Accept-Encoding
No JSON response body.
401 Missing, invalid or revoked publishable key.
application/json
Uniform JSON error envelope. Never includes stack traces or private title information.
| Field | Type | Required | Description |
|---|---|---|---|
error | object | Yes | Stable machine-readable error and human help. |
error.code | string (not_found, invalid_imdb_id, unauthorized, key_revoked, partner_suspended, rate_limited, quota_exceeded, batch_too_large, payload_too_large, method_not_allowed, server_error, service_unavailable, validation_error, key_required, balance_exhausted, origin_not_allowed, addon_required) | Yes | Stable error code. not_found covers absent routes and malformed, unknown, hidden or pending single-title ids. validation_error covers malformed batch bodies. |
error.message | string | Yes | Human-readable explanation; do not parse this for control flow. |
error.docs | string | Yes | Absolute English error documentation URL. |
{
"error": {
"code": "key_required",
"message": "A publishable key is required: add ?pk=… (see docs)",
"docs": "https://feeldb.resoftware.ai/integrations/docs#errors"
}
}
Response headers
Cache-Control- no-store, private
402 Prepaid balance exhausted.
application/json
Uniform JSON error envelope. Never includes stack traces or private title information.
| Field | Type | Required | Description |
|---|---|---|---|
error | object | Yes | Stable machine-readable error and human help. |
error.code | string (not_found, invalid_imdb_id, unauthorized, key_revoked, partner_suspended, rate_limited, quota_exceeded, batch_too_large, payload_too_large, method_not_allowed, server_error, service_unavailable, validation_error, key_required, balance_exhausted, origin_not_allowed, addon_required) | Yes | Stable error code. not_found covers absent routes and malformed, unknown, hidden or pending single-title ids. validation_error covers malformed batch bodies. |
error.message | string | Yes | Human-readable explanation; do not parse this for control flow. |
error.docs | string | Yes | Absolute English error documentation URL. |
{
"error": {
"code": "balance_exhausted",
"message": "Prepaid balance exhausted",
"docs": "https://feeldb.resoftware.ai/integrations/docs#errors"
}
}
Response headers
Cache-Control- no-store, private
403 addon_required, origin_not_allowed or partner_suspended.
application/json
Uniform JSON error envelope. Never includes stack traces or private title information.
| Field | Type | Required | Description |
|---|---|---|---|
error | object | Yes | Stable machine-readable error and human help. |
error.code | string (not_found, invalid_imdb_id, unauthorized, key_revoked, partner_suspended, rate_limited, quota_exceeded, batch_too_large, payload_too_large, method_not_allowed, server_error, service_unavailable, validation_error, key_required, balance_exhausted, origin_not_allowed, addon_required) | Yes | Stable error code. not_found covers absent routes and malformed, unknown, hidden or pending single-title ids. validation_error covers malformed batch bodies. |
error.message | string | Yes | Human-readable explanation; do not parse this for control flow. |
error.docs | string | Yes | Absolute English error documentation URL. |
{
"error": {
"code": "addon_required",
"message": "This add-on is not enabled for your key",
"docs": "https://feeldb.resoftware.ai/integrations/docs#errors"
}
}
Response headers
Cache-Control- no-store, private
404 Title not found.
application/json
Uniform JSON error envelope. Never includes stack traces or private title information.
| Field | Type | Required | Description |
|---|---|---|---|
error | object | Yes | Stable machine-readable error and human help. |
error.code | string (not_found, invalid_imdb_id, unauthorized, key_revoked, partner_suspended, rate_limited, quota_exceeded, batch_too_large, payload_too_large, method_not_allowed, server_error, service_unavailable, validation_error, key_required, balance_exhausted, origin_not_allowed, addon_required) | Yes | Stable error code. not_found covers absent routes and malformed, unknown, hidden or pending single-title ids. validation_error covers malformed batch bodies. |
error.message | string | Yes | Human-readable explanation; do not parse this for control flow. |
error.docs | string | Yes | Absolute English error documentation URL. |
Response headers
Cache-Control- no-store, private
429 Quota or rate limit exceeded.
application/json
Uniform JSON error envelope. Never includes stack traces or private title information.
| Field | Type | Required | Description |
|---|---|---|---|
error | object | Yes | Stable machine-readable error and human help. |
error.code | string (not_found, invalid_imdb_id, unauthorized, key_revoked, partner_suspended, rate_limited, quota_exceeded, batch_too_large, payload_too_large, method_not_allowed, server_error, service_unavailable, validation_error, key_required, balance_exhausted, origin_not_allowed, addon_required) | Yes | Stable error code. not_found covers absent routes and malformed, unknown, hidden or pending single-title ids. validation_error covers malformed batch bodies. |
error.message | string | Yes | Human-readable explanation; do not parse this for control flow. |
error.docs | string | Yes | Absolute English error documentation URL. |
Response headers
Cache-Control- no-store, private
503 Billing service unavailable.
application/json
Uniform JSON error envelope. Never includes stack traces or private title information.
| Field | Type | Required | Description |
|---|---|---|---|
error | object | Yes | Stable machine-readable error and human help. |
error.code | string (not_found, invalid_imdb_id, unauthorized, key_revoked, partner_suspended, rate_limited, quota_exceeded, batch_too_large, payload_too_large, method_not_allowed, server_error, service_unavailable, validation_error, key_required, balance_exhausted, origin_not_allowed, addon_required) | Yes | Stable error code. not_found covers absent routes and malformed, unknown, hidden or pending single-title ids. validation_error covers malformed batch bodies. |
error.message | string | Yes | Human-readable explanation; do not parse this for control flow. |
error.docs | string | Yes | Absolute English error documentation URL. |
Response headers
Cache-Control- no-store, private
500 Unexpected server error.
application/json
Uniform JSON error envelope. Never includes stack traces or private title information.
| Field | Type | Required | Description |
|---|---|---|---|
error | object | Yes | Stable machine-readable error and human help. |
error.code | string (not_found, invalid_imdb_id, unauthorized, key_revoked, partner_suspended, rate_limited, quota_exceeded, batch_too_large, payload_too_large, method_not_allowed, server_error, service_unavailable, validation_error, key_required, balance_exhausted, origin_not_allowed, addon_required) | Yes | Stable error code. not_found covers absent routes and malformed, unknown, hidden or pending single-title ids. validation_error covers malformed batch bodies. |
error.message | string | Yes | Human-readable explanation; do not parse this for control flow. |
error.docs | string | Yes | Absolute English error documentation URL. |
Response headers
Cache-Control- no-store, private
Batch
/api/v1/emotions/batchSecret bearer · serverLook up up to 100 IMDb ids
Keyed only; no keyless batch endpoint. Deduplicates ids case-insensitively and preserves request order. Default quota 50,000 lookups per UTC day; default keyed rate 120 requests/minute. No browser CORS.
Request body
JSON batch body, at most 16 KiB.
application/json
At most 100 identifiers and optional language; the whole body must be at most 16 KiB.
| Field | Type | Required | Description |
|---|---|---|---|
imdb_ids | array<string> | Yes | IMDb identifiers; malformed strings are reported in invalid, valid ids use ^tt[0-9]{7,10}$. maxItems: 100 |
lang | string (ka, en) | No | Requested language; defaults to ka. |
{
"imdb_ids": [
"tt0092929",
"tt9999999",
"abc"
],
"lang": "en"
}
Responses
200 Successful response.
application/json
Batch results in request order, deduplicated case-insensitively. Malformed ids are listed, not rejected individually.
| Field | Type | Required | Description |
|---|---|---|---|
data | array<object> | Yes | Found published titles in request order. maxItems: 100 |
data[].imdb_id | string | Yes | IMDb identifier of the published title. pattern: ^tt[0-9]{7,10}$ |
data[].type | string (movie, series) | Yes | Movie or series; animation is a separate flag. |
data[].year | integer | null | Yes | Release year, or null when unknown. |
data[].title | object | Yes | Original and translated title names. |
data[].title.original | string | Yes | Original title, falling back to English. |
data[].title.en | string | Yes | English title. |
data[].title.ka | string | null | Yes | Georgian title, or null if unavailable. |
data[].name | string | Yes | Title in requested language, falling back to English. |
data[].animation | boolean | Yes | Whether the title is animated. |
data[].status | string (ok, insufficient_data) | Yes | ok when at least one emotion qualifies; insufficient_data when none reach the configured minimum share (default 5%). This is a 200 response with an empty emotions array. |
data[].emotions | array<object> | Yes | Top up to three emotions with share at least the configured minimum (default 5%), using the same ordering as the title page. maxItems: 3 |
data[].emotions[].rank | integer | Yes | One-based rank among the returned dominant emotions. minimum: 1; maximum: 3 |
data[].emotions[].key | string | Yes | Stable emotion slug. |
data[].emotions[].label | string | Yes | Emotion label in requested language. |
data[].emotions[].labels | object | Yes | Labels in both supported languages. |
data[].emotions[].labels.ka | string | Yes | Georgian label. |
data[].emotions[].labels.en | string | Yes | English label. |
data[].emotions[].family | string | Yes | Emotion family grouping in the FeelDB taxonomy. |
data[].emotions[].color | string | Yes | Family display colour as a hexadecimal RGB value. pattern: ^#[0-9A-Fa-f]{6}$ |
data[].emotions[].icon | string | Yes | Absolute SVG icon URL; use the returned URL rather than constructing one. |
data[].emotions[].share | number | Yes | Share of the title's emotional signal in percent, not % of people; rounded to one decimal. The returned top emotions need not sum to 100. minimum: 0; maximum: 100 |
data[].tied_with_next | boolean | Yes | Whether rank 3 has the same share as rank 4, signalling a tie at the display cutoff. |
data[].source | object | Yes | Evidence origin, viewer count and confidence. |
data[].source.kind | string (ai, blended, viewers, none) | Yes | ai = AI estimate only; blended = AI estimate plus viewer ballots; viewers = viewer ballots only; none = no emotion evidence. |
data[].source.viewers | integer | Yes | Distinct viewers who submitted ballots; never a synthetic vote count. minimum: 0 |
data[].source.confidence | string (high, medium, low) | Yes | High when viewers >= 10; medium when an AI estimate is present or viewers are 3–9; low otherwise. Confidence describes evidence, not a probability. |
data[].url | string | Yes | Canonical title page URL in the requested language. |
data[].urls | object | Yes | Canonical title page URLs in both languages. |
data[].urls.ka | string | Yes | Canonical Georgian title page URL. |
data[].urls.en | string | Yes | Canonical English title page URL. |
data[].attribution | object | Yes | Required display attribution and backlink. |
data[].attribution.text | string (Emotion data: FeelDB, ემოციების მონაცემები: FeelDB) | Yes | Localized attribution text. |
data[].attribution.url | string | Yes | FeelDB title page backlink; use this returned URL. |
data[].attribution.terms | string | Yes | URL of attribution terms; use this returned URL. |
data[].updated_at | string | Yes | UTC ISO-8601 timestamp of the latest AI estimate or viewer ballot, falling back to title updated_at. |
not_found | array<string> | Yes | Unknown, hidden or pending IMDb ids, without distinguishing those cases. maxItems: 100 |
invalid | array<string> | Yes | Malformed input ids in request order. maxItems: 100 |
{
"data": [
{
"imdb_id": "tt0092929",
"type": "movie",
"year": 1988,
"title": {
"original": "Drowning by Numbers",
"en": "Drowning by Numbers",
"ka": null
},
"status": "ok",
"emotions": [
{
"rank": 1,
"key": "confusion",
"label": "Confusion",
"labels": {
"ka": "დაბნეულობა",
"en": "Confusion"
},
"share": 18,
"family": "play",
"color": "#B8E04A",
"icon": "https://feeldb.resoftware.ai/api/public/v1/icons/confusion.svg"
},
{
"rank": 2,
"key": "humor",
"label": "Humor",
"labels": {
"ka": "იუმორი",
"en": "Humor"
},
"share": 15,
"family": "play",
"color": "#B8E04A",
"icon": "https://feeldb.resoftware.ai/api/public/v1/icons/humor.svg"
},
{
"rank": 3,
"key": "joy",
"label": "Joy",
"labels": {
"ka": "სიხარული",
"en": "Joy"
},
"share": 13.3,
"family": "joy",
"color": "#FFC53D",
"icon": "https://feeldb.resoftware.ai/api/public/v1/icons/joy.svg"
}
],
"source": {
"kind": "blended",
"viewers": 2,
"confidence": "medium"
},
"url": "https://feeldb.resoftware.ai/movies/10000-drowning-by-numbers-1988",
"urls": {
"ka": "https://feeldb.resoftware.ai/ka/movies/10000-drowning-by-numbers-1988",
"en": "https://feeldb.resoftware.ai/movies/10000-drowning-by-numbers-1988"
},
"attribution": {
"text": "Emotion data: FeelDB",
"url": "https://feeldb.resoftware.ai/movies/10000-drowning-by-numbers-1988",
"terms": "https://feeldb.resoftware.ai/integrations#attribution"
},
"updated_at": "2026-10-12T00:25:17Z",
"name": "Drowning by Numbers",
"animation": false,
"tied_with_next": true
}
],
"not_found": [
"tt9999999"
],
"invalid": [
"abc"
]
}
Response headers
ETag- Payload validator; send it as If-None-Match for a bodyless 304.
Cache-Control- HTTP caching policy; public surfaces are edge-cacheable, keyed responses are private.
X-RateLimit-Limit- Requests allowed per minute.
X-RateLimit-Remaining- Requests remaining in the minute window.
X-RateLimit-Reset- Unix timestamp at which the rate-limit window resets.
X-Request-Id- Request identifier for diagnostics.
401 Missing, invalid or revoked bearer key.
application/json
Uniform JSON error envelope. Never includes stack traces or private title information.
| Field | Type | Required | Description |
|---|---|---|---|
error | object | Yes | Stable machine-readable error and human help. |
error.code | string (not_found, invalid_imdb_id, unauthorized, key_revoked, partner_suspended, rate_limited, quota_exceeded, batch_too_large, payload_too_large, method_not_allowed, server_error, service_unavailable, validation_error, key_required, balance_exhausted, origin_not_allowed, addon_required) | Yes | Stable error code. not_found covers absent routes and malformed, unknown, hidden or pending single-title ids. validation_error covers malformed batch bodies. |
error.message | string | Yes | Human-readable explanation; do not parse this for control flow. |
error.docs | string | Yes | Absolute English error documentation URL. |
{
"error": {
"code": "unauthorized",
"message": "Missing or invalid API key.",
"docs": "https://feeldb.resoftware.ai/integrations/docs#errors"
}
}
Response headers
ETag- Payload validator; send it as If-None-Match for a bodyless 304.
Cache-Control- HTTP caching policy; public surfaces are edge-cacheable, keyed responses are private.
X-RateLimit-Limit- Requests allowed per minute.
X-RateLimit-Remaining- Requests remaining in the minute window.
X-RateLimit-Reset- Unix timestamp at which the rate-limit window resets.
X-Request-Id- Request identifier for diagnostics.
403 Partner account suspended.
application/json
Uniform JSON error envelope. Never includes stack traces or private title information.
| Field | Type | Required | Description |
|---|---|---|---|
error | object | Yes | Stable machine-readable error and human help. |
error.code | string (not_found, invalid_imdb_id, unauthorized, key_revoked, partner_suspended, rate_limited, quota_exceeded, batch_too_large, payload_too_large, method_not_allowed, server_error, service_unavailable, validation_error, key_required, balance_exhausted, origin_not_allowed, addon_required) | Yes | Stable error code. not_found covers absent routes and malformed, unknown, hidden or pending single-title ids. validation_error covers malformed batch bodies. |
error.message | string | Yes | Human-readable explanation; do not parse this for control flow. |
error.docs | string | Yes | Absolute English error documentation URL. |
{
"error": {
"code": "partner_suspended",
"message": "This partner account is suspended.",
"docs": "https://feeldb.resoftware.ai/integrations/docs#errors"
}
}
Response headers
ETag- Payload validator; send it as If-None-Match for a bodyless 304.
Cache-Control- HTTP caching policy; public surfaces are edge-cacheable, keyed responses are private.
X-RateLimit-Limit- Requests allowed per minute.
X-RateLimit-Remaining- Requests remaining in the minute window.
X-RateLimit-Reset- Unix timestamp at which the rate-limit window resets.
X-Request-Id- Request identifier for diagnostics.
405 HTTP method not supported.
application/json
Uniform JSON error envelope. Never includes stack traces or private title information.
| Field | Type | Required | Description |
|---|---|---|---|
error | object | Yes | Stable machine-readable error and human help. |
error.code | string (not_found, invalid_imdb_id, unauthorized, key_revoked, partner_suspended, rate_limited, quota_exceeded, batch_too_large, payload_too_large, method_not_allowed, server_error, service_unavailable, validation_error, key_required, balance_exhausted, origin_not_allowed, addon_required) | Yes | Stable error code. not_found covers absent routes and malformed, unknown, hidden or pending single-title ids. validation_error covers malformed batch bodies. |
error.message | string | Yes | Human-readable explanation; do not parse this for control flow. |
error.docs | string | Yes | Absolute English error documentation URL. |
Response headers
ETag- Payload validator; send it as If-None-Match for a bodyless 304.
Cache-Control- HTTP caching policy; public surfaces are edge-cacheable, keyed responses are private.
X-RateLimit-Limit- Requests allowed per minute.
X-RateLimit-Remaining- Requests remaining in the minute window.
X-RateLimit-Reset- Unix timestamp at which the rate-limit window resets.
X-Request-Id- Request identifier for diagnostics.
413 Payload exceeds the 16 KiB body limit.
application/json
Uniform JSON error envelope. Never includes stack traces or private title information.
| Field | Type | Required | Description |
|---|---|---|---|
error | object | Yes | Stable machine-readable error and human help. |
error.code | string (not_found, invalid_imdb_id, unauthorized, key_revoked, partner_suspended, rate_limited, quota_exceeded, batch_too_large, payload_too_large, method_not_allowed, server_error, service_unavailable, validation_error, key_required, balance_exhausted, origin_not_allowed, addon_required) | Yes | Stable error code. not_found covers absent routes and malformed, unknown, hidden or pending single-title ids. validation_error covers malformed batch bodies. |
error.message | string | Yes | Human-readable explanation; do not parse this for control flow. |
error.docs | string | Yes | Absolute English error documentation URL. |
Response headers
ETag- Payload validator; send it as If-None-Match for a bodyless 304.
Cache-Control- HTTP caching policy; public surfaces are edge-cacheable, keyed responses are private.
X-RateLimit-Limit- Requests allowed per minute.
X-RateLimit-Remaining- Requests remaining in the minute window.
X-RateLimit-Reset- Unix timestamp at which the rate-limit window resets.
X-Request-Id- Request identifier for diagnostics.
422 Invalid request structure or more than 100 batch ids.
application/json
Uniform JSON error envelope. Never includes stack traces or private title information.
| Field | Type | Required | Description |
|---|---|---|---|
error | object | Yes | Stable machine-readable error and human help. |
error.code | string (not_found, invalid_imdb_id, unauthorized, key_revoked, partner_suspended, rate_limited, quota_exceeded, batch_too_large, payload_too_large, method_not_allowed, server_error, service_unavailable, validation_error, key_required, balance_exhausted, origin_not_allowed, addon_required) | Yes | Stable error code. not_found covers absent routes and malformed, unknown, hidden or pending single-title ids. validation_error covers malformed batch bodies. |
error.message | string | Yes | Human-readable explanation; do not parse this for control flow. |
error.docs | string | Yes | Absolute English error documentation URL. |
{
"error": {
"code": "batch_too_large",
"message": "At most 100 ids per batch.",
"docs": "https://feeldb.resoftware.ai/integrations/docs#errors"
}
}
{
"error": {
"code": "validation_error",
"message": "Invalid request body.",
"docs": "https://feeldb.resoftware.ai/integrations/docs#errors"
}
}
Response headers
ETag- Payload validator; send it as If-None-Match for a bodyless 304.
Cache-Control- HTTP caching policy; public surfaces are edge-cacheable, keyed responses are private.
X-RateLimit-Limit- Requests allowed per minute.
X-RateLimit-Remaining- Requests remaining in the minute window.
X-RateLimit-Reset- Unix timestamp at which the rate-limit window resets.
X-Request-Id- Request identifier for diagnostics.
429 Rate limit or daily lookup quota exceeded; obey Retry-After.
application/json
Uniform JSON error envelope. Never includes stack traces or private title information.
| Field | Type | Required | Description |
|---|---|---|---|
error | object | Yes | Stable machine-readable error and human help. |
error.code | string (not_found, invalid_imdb_id, unauthorized, key_revoked, partner_suspended, rate_limited, quota_exceeded, batch_too_large, payload_too_large, method_not_allowed, server_error, service_unavailable, validation_error, key_required, balance_exhausted, origin_not_allowed, addon_required) | Yes | Stable error code. not_found covers absent routes and malformed, unknown, hidden or pending single-title ids. validation_error covers malformed batch bodies. |
error.message | string | Yes | Human-readable explanation; do not parse this for control flow. |
error.docs | string | Yes | Absolute English error documentation URL. |
{
"error": {
"code": "rate_limited",
"message": "Too many requests.",
"docs": "https://feeldb.resoftware.ai/integrations/docs#errors"
}
}
{
"error": {
"code": "quota_exceeded",
"message": "Daily quota exceeded.",
"docs": "https://feeldb.resoftware.ai/integrations/docs#errors"
}
}
Response headers
ETag- Payload validator; send it as If-None-Match for a bodyless 304.
Cache-Control- HTTP caching policy; public surfaces are edge-cacheable, keyed responses are private.
X-RateLimit-Limit- Requests allowed per minute.
X-RateLimit-Remaining- Requests remaining in the minute window.
X-RateLimit-Reset- Unix timestamp at which the rate-limit window resets.
X-Request-Id- Request identifier for diagnostics.
Retry-After- Seconds until a retry is permitted; quota errors wait until next UTC midnight.
500 Internal server error without stack traces.
application/json
Uniform JSON error envelope. Never includes stack traces or private title information.
| Field | Type | Required | Description |
|---|---|---|---|
error | object | Yes | Stable machine-readable error and human help. |
error.code | string (not_found, invalid_imdb_id, unauthorized, key_revoked, partner_suspended, rate_limited, quota_exceeded, batch_too_large, payload_too_large, method_not_allowed, server_error, service_unavailable, validation_error, key_required, balance_exhausted, origin_not_allowed, addon_required) | Yes | Stable error code. not_found covers absent routes and malformed, unknown, hidden or pending single-title ids. validation_error covers malformed batch bodies. |
error.message | string | Yes | Human-readable explanation; do not parse this for control flow. |
error.docs | string | Yes | Absolute English error documentation URL. |
Response headers
ETag- Payload validator; send it as If-None-Match for a bodyless 304.
Cache-Control- HTTP caching policy; public surfaces are edge-cacheable, keyed responses are private.
X-RateLimit-Limit- Requests allowed per minute.
X-RateLimit-Remaining- Requests remaining in the minute window.
X-RateLimit-Reset- Unix timestamp at which the rate-limit window resets.
X-Request-Id- Request identifier for diagnostics.
503 Temporarily unavailable; keyed endpoints fail closed when Redis or DB is unavailable.
application/json
Uniform JSON error envelope. Never includes stack traces or private title information.
| Field | Type | Required | Description |
|---|---|---|---|
error | object | Yes | Stable machine-readable error and human help. |
error.code | string (not_found, invalid_imdb_id, unauthorized, key_revoked, partner_suspended, rate_limited, quota_exceeded, batch_too_large, payload_too_large, method_not_allowed, server_error, service_unavailable, validation_error, key_required, balance_exhausted, origin_not_allowed, addon_required) | Yes | Stable error code. not_found covers absent routes and malformed, unknown, hidden or pending single-title ids. validation_error covers malformed batch bodies. |
error.message | string | Yes | Human-readable explanation; do not parse this for control flow. |
error.docs | string | Yes | Absolute English error documentation URL. |
{
"error": {
"code": "service_unavailable",
"message": "Temporarily unavailable, retry later.",
"docs": "https://feeldb.resoftware.ai/integrations/docs#errors"
}
}
Response headers
ETag- Payload validator; send it as If-None-Match for a bodyless 304.
Cache-Control- HTTP caching policy; public surfaces are edge-cacheable, keyed responses are private.
X-RateLimit-Limit- Requests allowed per minute.
X-RateLimit-Remaining- Requests remaining in the minute window.
X-RateLimit-Reset- Unix timestamp at which the rate-limit window resets.
X-Request-Id- Request identifier for diagnostics.
402 balance_exhausted: prepaid balance exhausted.
application/json
Uniform JSON error envelope. Never includes stack traces or private title information.
| Field | Type | Required | Description |
|---|---|---|---|
error | object | Yes | Stable machine-readable error and human help. |
error.code | string (not_found, invalid_imdb_id, unauthorized, key_revoked, partner_suspended, rate_limited, quota_exceeded, batch_too_large, payload_too_large, method_not_allowed, server_error, service_unavailable, validation_error, key_required, balance_exhausted, origin_not_allowed, addon_required) | Yes | Stable error code. not_found covers absent routes and malformed, unknown, hidden or pending single-title ids. validation_error covers malformed batch bodies. |
error.message | string | Yes | Human-readable explanation; do not parse this for control flow. |
error.docs | string | Yes | Absolute English error documentation URL. |
Response headers
Cache-Control- no-store, private
Catalog
/api/v1/emotionsKeyless · publicGet the emotion taxonomy
Keyless, CORS * without credentials, public cache for one day; no cookies. Taxonomy version 2 has 28 entries.
Parameters
| Name / location | Type | Required | Description |
|---|---|---|---|
lang / query | string (ka, en) | No | Label and title language; defaults to ka. Unsupported values normalize to en; all labels retain both languages. |
If-None-Match / header | string | No | Previously received ETag; a match returns 304 without a body. |
Responses
200 Successful response.
application/json
Emotion taxonomy ordered by catalog position.
| Field | Type | Required | Description |
|---|---|---|---|
data | array<object> | Yes | Current taxonomy entries (28 in version 2). |
data[].key | string | Yes | Stable emotion slug. |
data[].label | string | Yes | Emotion label in requested language. |
data[].labels | object | Yes | Labels in both supported languages. |
data[].labels.ka | string | Yes | Georgian label. |
data[].labels.en | string | Yes | English label. |
data[].family | string | Yes | Emotion family grouping in the FeelDB taxonomy. |
data[].color | string | Yes | Family display colour as a hexadecimal RGB value. pattern: ^#[0-9A-Fa-f]{6}$ |
data[].icon | string | Yes | Absolute SVG icon URL; use the returned URL rather than constructing one. |
taxonomy_version | integer | Yes | Version of the taxonomy used by these entries. minimum: 1 |
{
"data": [
{
"key": "joy",
"labels": {
"ka": "სიხარული",
"en": "Joy"
},
"label": "Joy",
"family": "joy",
"color": "#FFC53D",
"icon": "https://feeldb.resoftware.ai/api/public/v1/icons/joy.svg"
}
],
"taxonomy_version": 2
}
Response headers
ETag- Payload validator; send it as If-None-Match for a bodyless 304.
Cache-Control- HTTP caching policy; public surfaces are edge-cacheable, keyed responses are private.
X-RateLimit-Limit- Requests allowed per minute.
X-RateLimit-Remaining- Requests remaining in the minute window.
X-RateLimit-Reset- Unix timestamp at which the rate-limit window resets.
X-Request-Id- Request identifier for diagnostics.
304 Not modified; no response body. Reuse the cached representation.
Response headers
ETag- Payload validator; send it as If-None-Match for a bodyless 304.
Cache-Control- HTTP caching policy; public surfaces are edge-cacheable, keyed responses are private.
X-RateLimit-Limit- Requests allowed per minute.
X-RateLimit-Remaining- Requests remaining in the minute window.
X-RateLimit-Reset- Unix timestamp at which the rate-limit window resets.
X-Request-Id- Request identifier for diagnostics.
No JSON response body.
405 HTTP method not supported.
application/json
Uniform JSON error envelope. Never includes stack traces or private title information.
| Field | Type | Required | Description |
|---|---|---|---|
error | object | Yes | Stable machine-readable error and human help. |
error.code | string (not_found, invalid_imdb_id, unauthorized, key_revoked, partner_suspended, rate_limited, quota_exceeded, batch_too_large, payload_too_large, method_not_allowed, server_error, service_unavailable, validation_error, key_required, balance_exhausted, origin_not_allowed, addon_required) | Yes | Stable error code. not_found covers absent routes and malformed, unknown, hidden or pending single-title ids. validation_error covers malformed batch bodies. |
error.message | string | Yes | Human-readable explanation; do not parse this for control flow. |
error.docs | string | Yes | Absolute English error documentation URL. |
Response headers
ETag- Payload validator; send it as If-None-Match for a bodyless 304.
Cache-Control- HTTP caching policy; public surfaces are edge-cacheable, keyed responses are private.
X-RateLimit-Limit- Requests allowed per minute.
X-RateLimit-Remaining- Requests remaining in the minute window.
X-RateLimit-Reset- Unix timestamp at which the rate-limit window resets.
X-Request-Id- Request identifier for diagnostics.
429 Rate limit or daily lookup quota exceeded; obey Retry-After.
application/json
Uniform JSON error envelope. Never includes stack traces or private title information.
| Field | Type | Required | Description |
|---|---|---|---|
error | object | Yes | Stable machine-readable error and human help. |
error.code | string (not_found, invalid_imdb_id, unauthorized, key_revoked, partner_suspended, rate_limited, quota_exceeded, batch_too_large, payload_too_large, method_not_allowed, server_error, service_unavailable, validation_error, key_required, balance_exhausted, origin_not_allowed, addon_required) | Yes | Stable error code. not_found covers absent routes and malformed, unknown, hidden or pending single-title ids. validation_error covers malformed batch bodies. |
error.message | string | Yes | Human-readable explanation; do not parse this for control flow. |
error.docs | string | Yes | Absolute English error documentation URL. |
{
"error": {
"code": "rate_limited",
"message": "Too many requests.",
"docs": "https://feeldb.resoftware.ai/integrations/docs#errors"
}
}
{
"error": {
"code": "quota_exceeded",
"message": "Daily quota exceeded.",
"docs": "https://feeldb.resoftware.ai/integrations/docs#errors"
}
}
Response headers
ETag- Payload validator; send it as If-None-Match for a bodyless 304.
Cache-Control- HTTP caching policy; public surfaces are edge-cacheable, keyed responses are private.
X-RateLimit-Limit- Requests allowed per minute.
X-RateLimit-Remaining- Requests remaining in the minute window.
X-RateLimit-Reset- Unix timestamp at which the rate-limit window resets.
X-Request-Id- Request identifier for diagnostics.
Retry-After- Seconds until a retry is permitted; quota errors wait until next UTC midnight.
500 Internal server error without stack traces.
application/json
Uniform JSON error envelope. Never includes stack traces or private title information.
| Field | Type | Required | Description |
|---|---|---|---|
error | object | Yes | Stable machine-readable error and human help. |
error.code | string (not_found, invalid_imdb_id, unauthorized, key_revoked, partner_suspended, rate_limited, quota_exceeded, batch_too_large, payload_too_large, method_not_allowed, server_error, service_unavailable, validation_error, key_required, balance_exhausted, origin_not_allowed, addon_required) | Yes | Stable error code. not_found covers absent routes and malformed, unknown, hidden or pending single-title ids. validation_error covers malformed batch bodies. |
error.message | string | Yes | Human-readable explanation; do not parse this for control flow. |
error.docs | string | Yes | Absolute English error documentation URL. |
Response headers
ETag- Payload validator; send it as If-None-Match for a bodyless 304.
Cache-Control- HTTP caching policy; public surfaces are edge-cacheable, keyed responses are private.
X-RateLimit-Limit- Requests allowed per minute.
X-RateLimit-Remaining- Requests remaining in the minute window.
X-RateLimit-Reset- Unix timestamp at which the rate-limit window resets.
X-Request-Id- Request identifier for diagnostics.
503 Temporarily unavailable; keyed endpoints fail closed when Redis or DB is unavailable.
application/json
Uniform JSON error envelope. Never includes stack traces or private title information.
| Field | Type | Required | Description |
|---|---|---|---|
error | object | Yes | Stable machine-readable error and human help. |
error.code | string (not_found, invalid_imdb_id, unauthorized, key_revoked, partner_suspended, rate_limited, quota_exceeded, batch_too_large, payload_too_large, method_not_allowed, server_error, service_unavailable, validation_error, key_required, balance_exhausted, origin_not_allowed, addon_required) | Yes | Stable error code. not_found covers absent routes and malformed, unknown, hidden or pending single-title ids. validation_error covers malformed batch bodies. |
error.message | string | Yes | Human-readable explanation; do not parse this for control flow. |
error.docs | string | Yes | Absolute English error documentation URL. |
{
"error": {
"code": "service_unavailable",
"message": "Temporarily unavailable, retry later.",
"docs": "https://feeldb.resoftware.ai/integrations/docs#errors"
}
}
Response headers
ETag- Payload validator; send it as If-None-Match for a bodyless 304.
Cache-Control- HTTP caching policy; public surfaces are edge-cacheable, keyed responses are private.
X-RateLimit-Limit- Requests allowed per minute.
X-RateLimit-Remaining- Requests remaining in the minute window.
X-RateLimit-Reset- Unix timestamp at which the rate-limit window resets.
X-Request-Id- Request identifier for diagnostics.
/api/public/v1/icons/{slug}.svgKeyless · publicGet an emotion SVG icon
Keyless whitelisted icon; no raw input path joins. Cache-Control: public, max-age=31536000, immutable; X-Content-Type-Options: nosniff.
Parameters
| Name / location | Type | Required | Description |
|---|---|---|---|
slug / path | string | Yes | Whitelisted catalog emotion slug. Unknown slugs return 404. |
Responses
200 Successful response.
image/svg+xml
SVG markup.
Type: string
Response headers
ETag- Payload validator; send it as If-None-Match for a bodyless 304.
Cache-Control- HTTP caching policy; public surfaces are edge-cacheable, keyed responses are private.
X-RateLimit-Limit- Requests allowed per minute.
X-RateLimit-Remaining- Requests remaining in the minute window.
X-RateLimit-Reset- Unix timestamp at which the rate-limit window resets.
X-Request-Id- Request identifier for diagnostics.
X-Content-Type-Options- Prevents MIME sniffing.
404 Uniform not_found for unknown, malformed, hidden and pending titles, or missing resources.
application/json
Uniform JSON error envelope. Never includes stack traces or private title information.
| Field | Type | Required | Description |
|---|---|---|---|
error | object | Yes | Stable machine-readable error and human help. |
error.code | string (not_found, invalid_imdb_id, unauthorized, key_revoked, partner_suspended, rate_limited, quota_exceeded, batch_too_large, payload_too_large, method_not_allowed, server_error, service_unavailable, validation_error, key_required, balance_exhausted, origin_not_allowed, addon_required) | Yes | Stable error code. not_found covers absent routes and malformed, unknown, hidden or pending single-title ids. validation_error covers malformed batch bodies. |
error.message | string | Yes | Human-readable explanation; do not parse this for control flow. |
error.docs | string | Yes | Absolute English error documentation URL. |
{
"error": {
"code": "not_found",
"message": "No published title has this IMDb id.",
"docs": "https://feeldb.resoftware.ai/integrations/docs#errors"
}
}
Response headers
ETag- Payload validator; send it as If-None-Match for a bodyless 304.
Cache-Control- HTTP caching policy; public surfaces are edge-cacheable, keyed responses are private.
X-RateLimit-Limit- Requests allowed per minute.
X-RateLimit-Remaining- Requests remaining in the minute window.
X-RateLimit-Reset- Unix timestamp at which the rate-limit window resets.
X-Request-Id- Request identifier for diagnostics.
405 HTTP method not supported.
application/json
Uniform JSON error envelope. Never includes stack traces or private title information.
| Field | Type | Required | Description |
|---|---|---|---|
error | object | Yes | Stable machine-readable error and human help. |
error.code | string (not_found, invalid_imdb_id, unauthorized, key_revoked, partner_suspended, rate_limited, quota_exceeded, batch_too_large, payload_too_large, method_not_allowed, server_error, service_unavailable, validation_error, key_required, balance_exhausted, origin_not_allowed, addon_required) | Yes | Stable error code. not_found covers absent routes and malformed, unknown, hidden or pending single-title ids. validation_error covers malformed batch bodies. |
error.message | string | Yes | Human-readable explanation; do not parse this for control flow. |
error.docs | string | Yes | Absolute English error documentation URL. |
Response headers
ETag- Payload validator; send it as If-None-Match for a bodyless 304.
Cache-Control- HTTP caching policy; public surfaces are edge-cacheable, keyed responses are private.
X-RateLimit-Limit- Requests allowed per minute.
X-RateLimit-Remaining- Requests remaining in the minute window.
X-RateLimit-Reset- Unix timestamp at which the rate-limit window resets.
X-Request-Id- Request identifier for diagnostics.
500 Internal server error without stack traces.
application/json
Uniform JSON error envelope. Never includes stack traces or private title information.
| Field | Type | Required | Description |
|---|---|---|---|
error | object | Yes | Stable machine-readable error and human help. |
error.code | string (not_found, invalid_imdb_id, unauthorized, key_revoked, partner_suspended, rate_limited, quota_exceeded, batch_too_large, payload_too_large, method_not_allowed, server_error, service_unavailable, validation_error, key_required, balance_exhausted, origin_not_allowed, addon_required) | Yes | Stable error code. not_found covers absent routes and malformed, unknown, hidden or pending single-title ids. validation_error covers malformed batch bodies. |
error.message | string | Yes | Human-readable explanation; do not parse this for control flow. |
error.docs | string | Yes | Absolute English error documentation URL. |
Response headers
ETag- Payload validator; send it as If-None-Match for a bodyless 304.
Cache-Control- HTTP caching policy; public surfaces are edge-cacheable, keyed responses are private.
X-RateLimit-Limit- Requests allowed per minute.
X-RateLimit-Remaining- Requests remaining in the minute window.
X-RateLimit-Reset- Unix timestamp at which the rate-limit window resets.
X-Request-Id- Request identifier for diagnostics.
/api/v1/openapi.jsonKeyless · publicGet the OpenAPI 3.1 contract
Single source of the API contract and changelog; keyless, CORS *, public cache for one hour.
Responses
200 Successful response.
application/json
OpenAPI 3.1 document, including info, paths and components.
Type: object
Response headers
ETag- Payload validator; send it as If-None-Match for a bodyless 304.
Cache-Control- HTTP caching policy; public surfaces are edge-cacheable, keyed responses are private.
X-RateLimit-Limit- Requests allowed per minute.
X-RateLimit-Remaining- Requests remaining in the minute window.
X-RateLimit-Reset- Unix timestamp at which the rate-limit window resets.
X-Request-Id- Request identifier for diagnostics.
404 Uniform not_found for unknown, malformed, hidden and pending titles, or missing resources.
application/json
Uniform JSON error envelope. Never includes stack traces or private title information.
| Field | Type | Required | Description |
|---|---|---|---|
error | object | Yes | Stable machine-readable error and human help. |
error.code | string (not_found, invalid_imdb_id, unauthorized, key_revoked, partner_suspended, rate_limited, quota_exceeded, batch_too_large, payload_too_large, method_not_allowed, server_error, service_unavailable, validation_error, key_required, balance_exhausted, origin_not_allowed, addon_required) | Yes | Stable error code. not_found covers absent routes and malformed, unknown, hidden or pending single-title ids. validation_error covers malformed batch bodies. |
error.message | string | Yes | Human-readable explanation; do not parse this for control flow. |
error.docs | string | Yes | Absolute English error documentation URL. |
{
"error": {
"code": "not_found",
"message": "No published title has this IMDb id.",
"docs": "https://feeldb.resoftware.ai/integrations/docs#errors"
}
}
Response headers
ETag- Payload validator; send it as If-None-Match for a bodyless 304.
Cache-Control- HTTP caching policy; public surfaces are edge-cacheable, keyed responses are private.
X-RateLimit-Limit- Requests allowed per minute.
X-RateLimit-Remaining- Requests remaining in the minute window.
X-RateLimit-Reset- Unix timestamp at which the rate-limit window resets.
X-Request-Id- Request identifier for diagnostics.
405 HTTP method not supported.
application/json
Uniform JSON error envelope. Never includes stack traces or private title information.
| Field | Type | Required | Description |
|---|---|---|---|
error | object | Yes | Stable machine-readable error and human help. |
error.code | string (not_found, invalid_imdb_id, unauthorized, key_revoked, partner_suspended, rate_limited, quota_exceeded, batch_too_large, payload_too_large, method_not_allowed, server_error, service_unavailable, validation_error, key_required, balance_exhausted, origin_not_allowed, addon_required) | Yes | Stable error code. not_found covers absent routes and malformed, unknown, hidden or pending single-title ids. validation_error covers malformed batch bodies. |
error.message | string | Yes | Human-readable explanation; do not parse this for control flow. |
error.docs | string | Yes | Absolute English error documentation URL. |
Response headers
ETag- Payload validator; send it as If-None-Match for a bodyless 304.
Cache-Control- HTTP caching policy; public surfaces are edge-cacheable, keyed responses are private.
X-RateLimit-Limit- Requests allowed per minute.
X-RateLimit-Remaining- Requests remaining in the minute window.
X-RateLimit-Reset- Unix timestamp at which the rate-limit window resets.
X-Request-Id- Request identifier for diagnostics.
500 Internal server error without stack traces.
application/json
Uniform JSON error envelope. Never includes stack traces or private title information.
| Field | Type | Required | Description |
|---|---|---|---|
error | object | Yes | Stable machine-readable error and human help. |
error.code | string (not_found, invalid_imdb_id, unauthorized, key_revoked, partner_suspended, rate_limited, quota_exceeded, batch_too_large, payload_too_large, method_not_allowed, server_error, service_unavailable, validation_error, key_required, balance_exhausted, origin_not_allowed, addon_required) | Yes | Stable error code. not_found covers absent routes and malformed, unknown, hidden or pending single-title ids. validation_error covers malformed batch bodies. |
error.message | string | Yes | Human-readable explanation; do not parse this for control flow. |
error.docs | string | Yes | Absolute English error documentation URL. |
Response headers
ETag- Payload validator; send it as If-None-Match for a bodyless 304.
Cache-Control- HTTP caching policy; public surfaces are edge-cacheable, keyed responses are private.
X-RateLimit-Limit- Requests allowed per minute.
X-RateLimit-Remaining- Requests remaining in the minute window.
X-RateLimit-Reset- Unix timestamp at which the rate-limit window resets.
X-Request-Id- Request identifier for diagnostics.
Account
/api/v1/meSecret bearer · serverGet current partner limits and usage
Secret bearer only. Query pk and bearer publishable keys are refused without billing data. Integer money is in currency minor units; two current tariffs with UTC effective timestamps. No internal statement pending/state fields are exposed.
Responses
200 Successful response.
application/json
Partner account and current UTC-day usage, visible only with a secret key.
| Field | Type | Required | Description |
|---|---|---|---|
client | object | Yes | Partner account identity. |
client.name | string | Yes | Partner organisation name. |
key | object | Yes | Safe key metadata; no secret is returned. |
key.prefix | string | Yes | Identifiable public key prefix. |
key.created_at | string | Yes | UTC ISO-8601 key issuance timestamp. |
limits | object | Yes | Limits configured for this partner. |
limits.per_minute | integer | Yes | Request limit per minute. minimum: 1 |
limits.daily_quota | integer | Yes | IMDb lookup quota per UTC day. minimum: 1 |
usage | object | Yes | Buffered usage counters for today. |
usage.today_requests | integer | Yes | Requests recorded today. minimum: 0 |
usage.today_ids | integer | Yes | IMDb lookups consumed today. minimum: 0 |
usage.remaining_ids | integer | Yes | Lookups remaining in the daily quota. minimum: 0 |
billing | object | Yes | |
billing.balance | integer | Yes | Integer currency minor units (e.g. tetri). minimum: 0 |
billing.allowance_remaining | integer | Yes | Remaining free emotion lookup units; arcs do not consume this allowance. minimum: 0 |
billing.currency | string | Yes | |
billing.tariffs | tuple<object, object> | Yes | Current emotions then arcs tariffs; effective_from is UTC ISO-8601. minItems: 2; maxItems: 2 |
billing.tariffs[0].product | string (emotions) | Yes | |
billing.tariffs[0].price_per_1000 | integer | Yes | Integer currency minor units per 1000 lookups. minimum: 0 |
billing.tariffs[0].currency | string | Yes | |
billing.tariffs[0].effective_from | string | Yes | format: date-time |
billing.tariffs[1].product | string (arcs) | Yes | |
billing.tariffs[1].price_per_1000 | integer | Yes | Integer currency minor units per 1000 lookups. minimum: 0 |
billing.tariffs[1].currency | string | Yes | |
billing.tariffs[1].effective_from | string | Yes | format: date-time |
billing.addons | array<string> | Yes |
Response headers
Cache-Control- HTTP caching policy; public surfaces are edge-cacheable, keyed responses are private.
X-RateLimit-Limit- Requests allowed per minute.
X-RateLimit-Remaining- Requests remaining in the minute window.
X-RateLimit-Reset- Unix timestamp at which the rate-limit window resets.
X-Request-Id- Request identifier for diagnostics.
401 Missing, invalid or revoked bearer key.
application/json
Uniform JSON error envelope. Never includes stack traces or private title information.
| Field | Type | Required | Description |
|---|---|---|---|
error | object | Yes | Stable machine-readable error and human help. |
error.code | string (not_found, invalid_imdb_id, unauthorized, key_revoked, partner_suspended, rate_limited, quota_exceeded, batch_too_large, payload_too_large, method_not_allowed, server_error, service_unavailable, validation_error, key_required, balance_exhausted, origin_not_allowed, addon_required) | Yes | Stable error code. not_found covers absent routes and malformed, unknown, hidden or pending single-title ids. validation_error covers malformed batch bodies. |
error.message | string | Yes | Human-readable explanation; do not parse this for control flow. |
error.docs | string | Yes | Absolute English error documentation URL. |
{
"error": {
"code": "unauthorized",
"message": "Missing or invalid API key.",
"docs": "https://feeldb.resoftware.ai/integrations/docs#errors"
}
}
Response headers
ETag- Payload validator; send it as If-None-Match for a bodyless 304.
Cache-Control- HTTP caching policy; public surfaces are edge-cacheable, keyed responses are private.
X-RateLimit-Limit- Requests allowed per minute.
X-RateLimit-Remaining- Requests remaining in the minute window.
X-RateLimit-Reset- Unix timestamp at which the rate-limit window resets.
X-Request-Id- Request identifier for diagnostics.
403 Partner account suspended.
application/json
Uniform JSON error envelope. Never includes stack traces or private title information.
| Field | Type | Required | Description |
|---|---|---|---|
error | object | Yes | Stable machine-readable error and human help. |
error.code | string (not_found, invalid_imdb_id, unauthorized, key_revoked, partner_suspended, rate_limited, quota_exceeded, batch_too_large, payload_too_large, method_not_allowed, server_error, service_unavailable, validation_error, key_required, balance_exhausted, origin_not_allowed, addon_required) | Yes | Stable error code. not_found covers absent routes and malformed, unknown, hidden or pending single-title ids. validation_error covers malformed batch bodies. |
error.message | string | Yes | Human-readable explanation; do not parse this for control flow. |
error.docs | string | Yes | Absolute English error documentation URL. |
{
"error": {
"code": "partner_suspended",
"message": "This partner account is suspended.",
"docs": "https://feeldb.resoftware.ai/integrations/docs#errors"
}
}
Response headers
ETag- Payload validator; send it as If-None-Match for a bodyless 304.
Cache-Control- HTTP caching policy; public surfaces are edge-cacheable, keyed responses are private.
X-RateLimit-Limit- Requests allowed per minute.
X-RateLimit-Remaining- Requests remaining in the minute window.
X-RateLimit-Reset- Unix timestamp at which the rate-limit window resets.
X-Request-Id- Request identifier for diagnostics.
405 HTTP method not supported.
application/json
Uniform JSON error envelope. Never includes stack traces or private title information.
| Field | Type | Required | Description |
|---|---|---|---|
error | object | Yes | Stable machine-readable error and human help. |
error.code | string (not_found, invalid_imdb_id, unauthorized, key_revoked, partner_suspended, rate_limited, quota_exceeded, batch_too_large, payload_too_large, method_not_allowed, server_error, service_unavailable, validation_error, key_required, balance_exhausted, origin_not_allowed, addon_required) | Yes | Stable error code. not_found covers absent routes and malformed, unknown, hidden or pending single-title ids. validation_error covers malformed batch bodies. |
error.message | string | Yes | Human-readable explanation; do not parse this for control flow. |
error.docs | string | Yes | Absolute English error documentation URL. |
Response headers
ETag- Payload validator; send it as If-None-Match for a bodyless 304.
Cache-Control- HTTP caching policy; public surfaces are edge-cacheable, keyed responses are private.
X-RateLimit-Limit- Requests allowed per minute.
X-RateLimit-Remaining- Requests remaining in the minute window.
X-RateLimit-Reset- Unix timestamp at which the rate-limit window resets.
X-Request-Id- Request identifier for diagnostics.
429 Rate limit or daily lookup quota exceeded; obey Retry-After.
application/json
Uniform JSON error envelope. Never includes stack traces or private title information.
| Field | Type | Required | Description |
|---|---|---|---|
error | object | Yes | Stable machine-readable error and human help. |
error.code | string (not_found, invalid_imdb_id, unauthorized, key_revoked, partner_suspended, rate_limited, quota_exceeded, batch_too_large, payload_too_large, method_not_allowed, server_error, service_unavailable, validation_error, key_required, balance_exhausted, origin_not_allowed, addon_required) | Yes | Stable error code. not_found covers absent routes and malformed, unknown, hidden or pending single-title ids. validation_error covers malformed batch bodies. |
error.message | string | Yes | Human-readable explanation; do not parse this for control flow. |
error.docs | string | Yes | Absolute English error documentation URL. |
{
"error": {
"code": "rate_limited",
"message": "Too many requests.",
"docs": "https://feeldb.resoftware.ai/integrations/docs#errors"
}
}
{
"error": {
"code": "quota_exceeded",
"message": "Daily quota exceeded.",
"docs": "https://feeldb.resoftware.ai/integrations/docs#errors"
}
}
Response headers
ETag- Payload validator; send it as If-None-Match for a bodyless 304.
Cache-Control- HTTP caching policy; public surfaces are edge-cacheable, keyed responses are private.
X-RateLimit-Limit- Requests allowed per minute.
X-RateLimit-Remaining- Requests remaining in the minute window.
X-RateLimit-Reset- Unix timestamp at which the rate-limit window resets.
X-Request-Id- Request identifier for diagnostics.
Retry-After- Seconds until a retry is permitted; quota errors wait until next UTC midnight.
500 Internal server error without stack traces.
application/json
Uniform JSON error envelope. Never includes stack traces or private title information.
| Field | Type | Required | Description |
|---|---|---|---|
error | object | Yes | Stable machine-readable error and human help. |
error.code | string (not_found, invalid_imdb_id, unauthorized, key_revoked, partner_suspended, rate_limited, quota_exceeded, batch_too_large, payload_too_large, method_not_allowed, server_error, service_unavailable, validation_error, key_required, balance_exhausted, origin_not_allowed, addon_required) | Yes | Stable error code. not_found covers absent routes and malformed, unknown, hidden or pending single-title ids. validation_error covers malformed batch bodies. |
error.message | string | Yes | Human-readable explanation; do not parse this for control flow. |
error.docs | string | Yes | Absolute English error documentation URL. |
Response headers
ETag- Payload validator; send it as If-None-Match for a bodyless 304.
Cache-Control- HTTP caching policy; public surfaces are edge-cacheable, keyed responses are private.
X-RateLimit-Limit- Requests allowed per minute.
X-RateLimit-Remaining- Requests remaining in the minute window.
X-RateLimit-Reset- Unix timestamp at which the rate-limit window resets.
X-Request-Id- Request identifier for diagnostics.
503 Temporarily unavailable; keyed endpoints fail closed when Redis or DB is unavailable.
application/json
Uniform JSON error envelope. Never includes stack traces or private title information.
| Field | Type | Required | Description |
|---|---|---|---|
error | object | Yes | Stable machine-readable error and human help. |
error.code | string (not_found, invalid_imdb_id, unauthorized, key_revoked, partner_suspended, rate_limited, quota_exceeded, batch_too_large, payload_too_large, method_not_allowed, server_error, service_unavailable, validation_error, key_required, balance_exhausted, origin_not_allowed, addon_required) | Yes | Stable error code. not_found covers absent routes and malformed, unknown, hidden or pending single-title ids. validation_error covers malformed batch bodies. |
error.message | string | Yes | Human-readable explanation; do not parse this for control flow. |
error.docs | string | Yes | Absolute English error documentation URL. |
{
"error": {
"code": "service_unavailable",
"message": "Temporarily unavailable, retry later.",
"docs": "https://feeldb.resoftware.ai/integrations/docs#errors"
}
}
Response headers
ETag- Payload validator; send it as If-None-Match for a bodyless 304.
Cache-Control- HTTP caching policy; public surfaces are edge-cacheable, keyed responses are private.
X-RateLimit-Limit- Requests allowed per minute.
X-RateLimit-Remaining- Requests remaining in the minute window.
X-RateLimit-Reset- Unix timestamp at which the rate-limit window resets.
X-Request-Id- Request identifier for diagnostics.
Widget
/api/public/v1/widget/reportKeyless · publicReport a widget failure
Stateless aggregate beacon, no authentication or billing. Only text/plain bodies at most 512 bytes matching the grammar are recorded. Accepted and invalid reports return 204; limiter rejects with 429 without storage (10/min/IP, 600/min/pk). At most 50 domain|code fields per key/day; no raw title id, IP, URL or token is stored. No cookies.
Request body
text/plain
ASCII grammar; byte limit 512. Invalid bodies are silently discarded.
Type: string
"fdb_pk_abcdefghijkl_ABCDEFGHIJKLMNOPQRSTUVWX network tt1375666"
Responses
204 Accepted or silently discarded invalid report. No body.
Response headers
Cache-Control- no-store, private
Access-Control-Allow-Origin- *
No JSON response body.
429 rate_limited: report rejected by limiter; nothing recorded.
application/json
Uniform JSON error envelope. Never includes stack traces or private title information.
| Field | Type | Required | Description |
|---|---|---|---|
error | object | Yes | Stable machine-readable error and human help. |
error.code | string (not_found, invalid_imdb_id, unauthorized, key_revoked, partner_suspended, rate_limited, quota_exceeded, batch_too_large, payload_too_large, method_not_allowed, server_error, service_unavailable, validation_error, key_required, balance_exhausted, origin_not_allowed, addon_required) | Yes | Stable error code. not_found covers absent routes and malformed, unknown, hidden or pending single-title ids. validation_error covers malformed batch bodies. |
error.message | string | Yes | Human-readable explanation; do not parse this for control flow. |
error.docs | string | Yes | Absolute English error documentation URL. |
Response headers
Cache-Control- no-store, private
500 Unexpected server error.
application/json
Uniform JSON error envelope. Never includes stack traces or private title information.
| Field | Type | Required | Description |
|---|---|---|---|
error | object | Yes | Stable machine-readable error and human help. |
error.code | string (not_found, invalid_imdb_id, unauthorized, key_revoked, partner_suspended, rate_limited, quota_exceeded, batch_too_large, payload_too_large, method_not_allowed, server_error, service_unavailable, validation_error, key_required, balance_exhausted, origin_not_allowed, addon_required) | Yes | Stable error code. not_found covers absent routes and malformed, unknown, hidden or pending single-title ids. validation_error covers malformed batch bodies. |
error.message | string | Yes | Human-readable explanation; do not parse this for control flow. |
error.docs | string | Yes | Absolute English error documentation URL. |
Response headers
Cache-Control- no-store, private
503 Service unavailable.
application/json
Uniform JSON error envelope. Never includes stack traces or private title information.
| Field | Type | Required | Description |
|---|---|---|---|
error | object | Yes | Stable machine-readable error and human help. |
error.code | string (not_found, invalid_imdb_id, unauthorized, key_revoked, partner_suspended, rate_limited, quota_exceeded, batch_too_large, payload_too_large, method_not_allowed, server_error, service_unavailable, validation_error, key_required, balance_exhausted, origin_not_allowed, addon_required) | Yes | Stable error code. not_found covers absent routes and malformed, unknown, hidden or pending single-title ids. validation_error covers malformed batch bodies. |
error.message | string | Yes | Human-readable explanation; do not parse this for control flow. |
error.docs | string | Yes | Absolute English error documentation URL. |
Response headers
Cache-Control- no-store, private