{"openapi":"3.1.0","jsonSchemaDialect":"https:\/\/json-schema.org\/draft\/2020-12\/schema","info":{"title":"FeelDB Emotions API","version":"1.1.0","description":"Get up to three dominant emotions, exactly the ones FeelDB shows on a published title page. Almost all emotion data today is an AI estimate refined by viewer votes, not a measured audience survey. Always take title, icon, attribution and documentation URLs from responses: they will move to feeldb.com at the domain cutover. Default language is Georgian (ka). Public endpoints are read-only, keyless and cookie-free; secret bearer keys are for server-to-server access only.","contact":{"name":"FeelDB integrations","url":"https:\/\/feeldb.resoftware.ai\/integrations"},"termsOfService":"https:\/\/feeldb.resoftware.ai\/integrations","x-changelog":[{"version":"1.1.0","date":"2026-10-14","changes":["Origin-bound publishable widget lookup and entitled compact arcs.","Stateless widget failure report beacon.","Secret-key account billing; configurable keyless lookup sunset (SEC-18)."]},{"version":"1.0.0","date":"2026-10-13","changes":["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."]}]},"servers":[{"url":"https:\/\/feeldb.resoftware.ai","description":"Current host; becomes https:\/\/feeldb.com at cutover. Use URLs returned by the API."}],"tags":[{"name":"Titles","description":"Published title emotion lookup."},{"name":"Batch","description":"Server-to-server batch title lookup."},{"name":"Catalog","description":"Public taxonomy, icons and API contract."},{"name":"Account","description":"Authenticated partner limits and usage."}],"paths":{"\/api\/public\/v1\/titles\/{imdb_id}\/emotions":{"get":{"operationId":"getPublicTitleEmotions","summary":"Get dominant emotions by IMDb id","description":"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.","tags":["Titles"],"security":[[],{"publishableKey":[]}],"responses":{"200":{"description":"Successful response.","headers":{"ETag":{"description":"Payload validator; send it as If-None-Match for a bodyless 304.","schema":{"type":"string","description":"Payload validator; send it as If-None-Match for a bodyless 304."}},"Cache-Control":{"description":"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.","schema":{"type":"string","description":"HTTP caching policy; public surfaces are edge-cacheable, keyed responses are private."}},"X-Request-Id":{"description":"Request identifier for diagnostics.","schema":{"type":"string","description":"Request identifier for diagnostics."}},"Vary":{"description":"Accept-Encoding on the pk alias.","schema":{"type":"string"}},"Access-Control-Allow-Origin":{"description":"Wildcard public CORS without credentials.","schema":{"type":"string","enum":["*"]}}},"content":{"application\/json":{"schema":{"oneOf":[{"$ref":"#\/components\/schemas\/SingleResponse"},{"$ref":"#\/components\/schemas\/WidgetCompact"}]},"examples":{"title-ok":{"$ref":"#\/components\/examples\/title-ok"},"title-insufficient":{"$ref":"#\/components\/examples\/title-insufficient"},"widget":{"value":{"t":"tt1375666","s":"ok","e":[[7,42],[12,31],[3,18]],"u":"\/movies\/18213-inception-2010","x":2}}}}}},"304":{"description":"Not modified; no response body. Reuse the cached representation.","headers":{"ETag":{"description":"Payload validator; send it as If-None-Match for a bodyless 304.","schema":{"type":"string","description":"Payload validator; send it as If-None-Match for a bodyless 304."}},"Cache-Control":{"description":"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.","schema":{"type":"string","description":"HTTP caching policy; public surfaces are edge-cacheable, keyed responses are private."}},"X-Request-Id":{"description":"Request identifier for diagnostics.","schema":{"type":"string","description":"Request identifier for diagnostics."}},"Vary":{"description":"Accept-Encoding on the pk alias.","schema":{"type":"string"}},"Access-Control-Allow-Origin":{"description":"Wildcard public CORS without credentials.","schema":{"type":"string","enum":["*"]}}}},"404":{"description":"Uniform not_found for unknown, malformed, hidden and pending titles, or missing resources.","headers":{"ETag":{"description":"Payload validator; send it as If-None-Match for a bodyless 304.","schema":{"type":"string","description":"Payload validator; send it as If-None-Match for a bodyless 304."}},"Cache-Control":{"description":"HTTP caching policy; public surfaces are edge-cacheable, keyed responses are private.","schema":{"type":"string","description":"HTTP caching policy; public surfaces are edge-cacheable, keyed responses are private."}},"X-RateLimit-Limit":{"description":"Requests allowed per minute.","schema":{"type":"integer","description":"Requests allowed per minute."}},"X-RateLimit-Remaining":{"description":"Requests remaining in the minute window.","schema":{"type":"integer","description":"Requests remaining in the minute window."}},"X-RateLimit-Reset":{"description":"Unix timestamp at which the rate-limit window resets.","schema":{"type":"integer","description":"Unix timestamp at which the rate-limit window resets."}},"X-Request-Id":{"description":"Request identifier for diagnostics.","schema":{"type":"string","description":"Request identifier for diagnostics."}}},"content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"},"examples":{"error-not_found":{"$ref":"#\/components\/examples\/error-not_found"}}}}},"405":{"description":"HTTP method not supported.","headers":{"ETag":{"description":"Payload validator; send it as If-None-Match for a bodyless 304.","schema":{"type":"string","description":"Payload validator; send it as If-None-Match for a bodyless 304."}},"Cache-Control":{"description":"HTTP caching policy; public surfaces are edge-cacheable, keyed responses are private.","schema":{"type":"string","description":"HTTP caching policy; public surfaces are edge-cacheable, keyed responses are private."}},"X-RateLimit-Limit":{"description":"Requests allowed per minute.","schema":{"type":"integer","description":"Requests allowed per minute."}},"X-RateLimit-Remaining":{"description":"Requests remaining in the minute window.","schema":{"type":"integer","description":"Requests remaining in the minute window."}},"X-RateLimit-Reset":{"description":"Unix timestamp at which the rate-limit window resets.","schema":{"type":"integer","description":"Unix timestamp at which the rate-limit window resets."}},"X-Request-Id":{"description":"Request identifier for diagnostics.","schema":{"type":"string","description":"Request identifier for diagnostics."}}},"content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"},"examples":[]}}},"422":{"description":"Invalid request structure or more than 100 batch ids.","headers":{"ETag":{"description":"Payload validator; send it as If-None-Match for a bodyless 304.","schema":{"type":"string","description":"Payload validator; send it as If-None-Match for a bodyless 304."}},"Cache-Control":{"description":"HTTP caching policy; public surfaces are edge-cacheable, keyed responses are private.","schema":{"type":"string","description":"HTTP caching policy; public surfaces are edge-cacheable, keyed responses are private."}},"X-RateLimit-Limit":{"description":"Requests allowed per minute.","schema":{"type":"integer","description":"Requests allowed per minute."}},"X-RateLimit-Remaining":{"description":"Requests remaining in the minute window.","schema":{"type":"integer","description":"Requests remaining in the minute window."}},"X-RateLimit-Reset":{"description":"Unix timestamp at which the rate-limit window resets.","schema":{"type":"integer","description":"Unix timestamp at which the rate-limit window resets."}},"X-Request-Id":{"description":"Request identifier for diagnostics.","schema":{"type":"string","description":"Request identifier for diagnostics."}}},"content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"},"examples":{"error-invalid_imdb_id":{"$ref":"#\/components\/examples\/error-invalid_imdb_id"},"error-batch_too_large":{"$ref":"#\/components\/examples\/error-batch_too_large"}}}}},"429":{"description":"Rate limit or daily lookup quota exceeded; obey Retry-After.","headers":{"ETag":{"description":"Payload validator; send it as If-None-Match for a bodyless 304.","schema":{"type":"string","description":"Payload validator; send it as If-None-Match for a bodyless 304."}},"Cache-Control":{"description":"HTTP caching policy; public surfaces are edge-cacheable, keyed responses are private.","schema":{"type":"string","description":"HTTP caching policy; public surfaces are edge-cacheable, keyed responses are private."}},"X-RateLimit-Limit":{"description":"Requests allowed per minute.","schema":{"type":"integer","description":"Requests allowed per minute."}},"X-RateLimit-Remaining":{"description":"Requests remaining in the minute window.","schema":{"type":"integer","description":"Requests remaining in the minute window."}},"X-RateLimit-Reset":{"description":"Unix timestamp at which the rate-limit window resets.","schema":{"type":"integer","description":"Unix timestamp at which the rate-limit window resets."}},"X-Request-Id":{"description":"Request identifier for diagnostics.","schema":{"type":"string","description":"Request identifier for diagnostics."}},"Retry-After":{"description":"Seconds until a retry is permitted; quota errors wait until next UTC midnight.","schema":{"type":"integer","description":"Seconds until a retry is permitted; quota errors wait until next UTC midnight."}}},"content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"},"examples":{"error-rate_limited":{"$ref":"#\/components\/examples\/error-rate_limited"},"error-quota_exceeded":{"$ref":"#\/components\/examples\/error-quota_exceeded"}}}}},"500":{"description":"Internal server error without stack traces.","headers":{"ETag":{"description":"Payload validator; send it as If-None-Match for a bodyless 304.","schema":{"type":"string","description":"Payload validator; send it as If-None-Match for a bodyless 304."}},"Cache-Control":{"description":"HTTP caching policy; public surfaces are edge-cacheable, keyed responses are private.","schema":{"type":"string","description":"HTTP caching policy; public surfaces are edge-cacheable, keyed responses are private."}},"X-RateLimit-Limit":{"description":"Requests allowed per minute.","schema":{"type":"integer","description":"Requests allowed per minute."}},"X-RateLimit-Remaining":{"description":"Requests remaining in the minute window.","schema":{"type":"integer","description":"Requests remaining in the minute window."}},"X-RateLimit-Reset":{"description":"Unix timestamp at which the rate-limit window resets.","schema":{"type":"integer","description":"Unix timestamp at which the rate-limit window resets."}},"X-Request-Id":{"description":"Request identifier for diagnostics.","schema":{"type":"string","description":"Request identifier for diagnostics."}}},"content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"},"examples":[]}}},"503":{"description":"Temporarily unavailable; keyed endpoints fail closed when Redis or DB is unavailable.","headers":{"ETag":{"description":"Payload validator; send it as If-None-Match for a bodyless 304.","schema":{"type":"string","description":"Payload validator; send it as If-None-Match for a bodyless 304."}},"Cache-Control":{"description":"HTTP caching policy; public surfaces are edge-cacheable, keyed responses are private.","schema":{"type":"string","description":"HTTP caching policy; public surfaces are edge-cacheable, keyed responses are private."}},"X-RateLimit-Limit":{"description":"Requests allowed per minute.","schema":{"type":"integer","description":"Requests allowed per minute."}},"X-RateLimit-Remaining":{"description":"Requests remaining in the minute window.","schema":{"type":"integer","description":"Requests remaining in the minute window."}},"X-RateLimit-Reset":{"description":"Unix timestamp at which the rate-limit window resets.","schema":{"type":"integer","description":"Unix timestamp at which the rate-limit window resets."}},"X-Request-Id":{"description":"Request identifier for diagnostics.","schema":{"type":"string","description":"Request identifier for diagnostics."}}},"content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"},"examples":{"error-service_unavailable":{"$ref":"#\/components\/examples\/error-service_unavailable"}}}}},"401":{"description":"Missing, invalid or revoked publishable key.","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"},"examples":{"error-key_required":{"$ref":"#\/components\/examples\/error-key_required"}}}},"headers":{"Cache-Control":{"description":"no-store, private","schema":{"type":"string","enum":["no-store, private"]}}}},"402":{"description":"Prepaid balance exhausted.","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"},"examples":{"error-balance_exhausted":{"$ref":"#\/components\/examples\/error-balance_exhausted"}}}},"headers":{"Cache-Control":{"description":"no-store, private","schema":{"type":"string","enum":["no-store, private"]}}}},"403":{"description":"Origin not allowed or partner suspended.","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"},"examples":{"error-origin_not_allowed":{"$ref":"#\/components\/examples\/error-origin_not_allowed"}}}},"headers":{"Cache-Control":{"description":"no-store, private","schema":{"type":"string","enum":["no-store, private"]}}}}},"parameters":[{"name":"imdb_id","in":"path","required":true,"description":"IMDb title id. Malformed, unknown, hidden and pending ids receive the same 404 envelope.","schema":{"type":"string","description":"IMDb identifier.","pattern":"^tt[0-9]{7,10}$"}},{"name":"lang","in":"query","required":false,"description":"Label and title language; defaults to ka. Unsupported values normalize to en; all labels retain both languages.","schema":{"type":"string","description":"Supported language.","enum":["ka","en"],"default":"ka"}},{"name":"If-None-Match","in":"header","required":false,"description":"Previously received ETag; a match returns 304 without a body.","schema":{"type":"string","description":"ETag validator."}},{"name":"pk","in":"query","required":false,"schema":{"type":"string","pattern":"^fdb_pk_[a-z2-7]{12}_[A-Za-z0-9]{24}$"}}],"x-keyless-sunset":{"flag":"partners.keyless_lookup","default":true,"true":"Legacy keyless SingleResponse and same-404; public max-age=600, s-maxage=3600.","false":"Uniform 401 key_required for every id without pk; no-store, private.","pk":"With pk, widget alias in either state, matching Origin required; compact WidgetCompact and C-6 headers.","flip":"S5, after house origin-bound billing-exempt pk exists; flag remains true in S2."}}},"\/api\/v1\/titles\/{imdb_id}\/emotions":{"get":{"operationId":"getTitleEmotions","summary":"Get dominant emotions by IMDb id","description":"Server-to-server bearer authentication; no browser CORS and no cookies. Cache-Control: private, max-age=300.","tags":["Titles"],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Successful response.","headers":{"ETag":{"description":"Payload validator; send it as If-None-Match for a bodyless 304.","schema":{"type":"string","description":"Payload validator; send it as If-None-Match for a bodyless 304."}},"Cache-Control":{"description":"HTTP caching policy; public surfaces are edge-cacheable, keyed responses are private.","schema":{"type":"string","description":"HTTP caching policy; public surfaces are edge-cacheable, keyed responses are private."}},"X-RateLimit-Limit":{"description":"Requests allowed per minute.","schema":{"type":"integer","description":"Requests allowed per minute."}},"X-RateLimit-Remaining":{"description":"Requests remaining in the minute window.","schema":{"type":"integer","description":"Requests remaining in the minute window."}},"X-RateLimit-Reset":{"description":"Unix timestamp at which the rate-limit window resets.","schema":{"type":"integer","description":"Unix timestamp at which the rate-limit window resets."}},"X-Request-Id":{"description":"Request identifier for diagnostics.","schema":{"type":"string","description":"Request identifier for diagnostics."}}},"content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/SingleResponse"},"examples":{"title-ok":{"$ref":"#\/components\/examples\/title-ok"},"title-insufficient":{"$ref":"#\/components\/examples\/title-insufficient"}}}}},"304":{"description":"Not modified; no response body. Reuse the cached representation.","headers":{"ETag":{"description":"Payload validator; send it as If-None-Match for a bodyless 304.","schema":{"type":"string","description":"Payload validator; send it as If-None-Match for a bodyless 304."}},"Cache-Control":{"description":"HTTP caching policy; public surfaces are edge-cacheable, keyed responses are private.","schema":{"type":"string","description":"HTTP caching policy; public surfaces are edge-cacheable, keyed responses are private."}},"X-RateLimit-Limit":{"description":"Requests allowed per minute.","schema":{"type":"integer","description":"Requests allowed per minute."}},"X-RateLimit-Remaining":{"description":"Requests remaining in the minute window.","schema":{"type":"integer","description":"Requests remaining in the minute window."}},"X-RateLimit-Reset":{"description":"Unix timestamp at which the rate-limit window resets.","schema":{"type":"integer","description":"Unix timestamp at which the rate-limit window resets."}},"X-Request-Id":{"description":"Request identifier for diagnostics.","schema":{"type":"string","description":"Request identifier for diagnostics."}}}},"404":{"description":"Uniform not_found for unknown, malformed, hidden and pending titles, or missing resources.","headers":{"ETag":{"description":"Payload validator; send it as If-None-Match for a bodyless 304.","schema":{"type":"string","description":"Payload validator; send it as If-None-Match for a bodyless 304."}},"Cache-Control":{"description":"HTTP caching policy; public surfaces are edge-cacheable, keyed responses are private.","schema":{"type":"string","description":"HTTP caching policy; public surfaces are edge-cacheable, keyed responses are private."}},"X-RateLimit-Limit":{"description":"Requests allowed per minute.","schema":{"type":"integer","description":"Requests allowed per minute."}},"X-RateLimit-Remaining":{"description":"Requests remaining in the minute window.","schema":{"type":"integer","description":"Requests remaining in the minute window."}},"X-RateLimit-Reset":{"description":"Unix timestamp at which the rate-limit window resets.","schema":{"type":"integer","description":"Unix timestamp at which the rate-limit window resets."}},"X-Request-Id":{"description":"Request identifier for diagnostics.","schema":{"type":"string","description":"Request identifier for diagnostics."}}},"content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"},"examples":{"error-not_found":{"$ref":"#\/components\/examples\/error-not_found"}}}}},"405":{"description":"HTTP method not supported.","headers":{"ETag":{"description":"Payload validator; send it as If-None-Match for a bodyless 304.","schema":{"type":"string","description":"Payload validator; send it as If-None-Match for a bodyless 304."}},"Cache-Control":{"description":"HTTP caching policy; public surfaces are edge-cacheable, keyed responses are private.","schema":{"type":"string","description":"HTTP caching policy; public surfaces are edge-cacheable, keyed responses are private."}},"X-RateLimit-Limit":{"description":"Requests allowed per minute.","schema":{"type":"integer","description":"Requests allowed per minute."}},"X-RateLimit-Remaining":{"description":"Requests remaining in the minute window.","schema":{"type":"integer","description":"Requests remaining in the minute window."}},"X-RateLimit-Reset":{"description":"Unix timestamp at which the rate-limit window resets.","schema":{"type":"integer","description":"Unix timestamp at which the rate-limit window resets."}},"X-Request-Id":{"description":"Request identifier for diagnostics.","schema":{"type":"string","description":"Request identifier for diagnostics."}}},"content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"},"examples":[]}}},"422":{"description":"Invalid request structure or more than 100 batch ids.","headers":{"ETag":{"description":"Payload validator; send it as If-None-Match for a bodyless 304.","schema":{"type":"string","description":"Payload validator; send it as If-None-Match for a bodyless 304."}},"Cache-Control":{"description":"HTTP caching policy; public surfaces are edge-cacheable, keyed responses are private.","schema":{"type":"string","description":"HTTP caching policy; public surfaces are edge-cacheable, keyed responses are private."}},"X-RateLimit-Limit":{"description":"Requests allowed per minute.","schema":{"type":"integer","description":"Requests allowed per minute."}},"X-RateLimit-Remaining":{"description":"Requests remaining in the minute window.","schema":{"type":"integer","description":"Requests remaining in the minute window."}},"X-RateLimit-Reset":{"description":"Unix timestamp at which the rate-limit window resets.","schema":{"type":"integer","description":"Unix timestamp at which the rate-limit window resets."}},"X-Request-Id":{"description":"Request identifier for diagnostics.","schema":{"type":"string","description":"Request identifier for diagnostics."}}},"content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"},"examples":{"error-invalid_imdb_id":{"$ref":"#\/components\/examples\/error-invalid_imdb_id"},"error-batch_too_large":{"$ref":"#\/components\/examples\/error-batch_too_large"}}}}},"429":{"description":"Rate limit or daily lookup quota exceeded; obey Retry-After.","headers":{"ETag":{"description":"Payload validator; send it as If-None-Match for a bodyless 304.","schema":{"type":"string","description":"Payload validator; send it as If-None-Match for a bodyless 304."}},"Cache-Control":{"description":"HTTP caching policy; public surfaces are edge-cacheable, keyed responses are private.","schema":{"type":"string","description":"HTTP caching policy; public surfaces are edge-cacheable, keyed responses are private."}},"X-RateLimit-Limit":{"description":"Requests allowed per minute.","schema":{"type":"integer","description":"Requests allowed per minute."}},"X-RateLimit-Remaining":{"description":"Requests remaining in the minute window.","schema":{"type":"integer","description":"Requests remaining in the minute window."}},"X-RateLimit-Reset":{"description":"Unix timestamp at which the rate-limit window resets.","schema":{"type":"integer","description":"Unix timestamp at which the rate-limit window resets."}},"X-Request-Id":{"description":"Request identifier for diagnostics.","schema":{"type":"string","description":"Request identifier for diagnostics."}},"Retry-After":{"description":"Seconds until a retry is permitted; quota errors wait until next UTC midnight.","schema":{"type":"integer","description":"Seconds until a retry is permitted; quota errors wait until next UTC midnight."}}},"content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"},"examples":{"error-rate_limited":{"$ref":"#\/components\/examples\/error-rate_limited"},"error-quota_exceeded":{"$ref":"#\/components\/examples\/error-quota_exceeded"}}}}},"500":{"description":"Internal server error without stack traces.","headers":{"ETag":{"description":"Payload validator; send it as If-None-Match for a bodyless 304.","schema":{"type":"string","description":"Payload validator; send it as If-None-Match for a bodyless 304."}},"Cache-Control":{"description":"HTTP caching policy; public surfaces are edge-cacheable, keyed responses are private.","schema":{"type":"string","description":"HTTP caching policy; public surfaces are edge-cacheable, keyed responses are private."}},"X-RateLimit-Limit":{"description":"Requests allowed per minute.","schema":{"type":"integer","description":"Requests allowed per minute."}},"X-RateLimit-Remaining":{"description":"Requests remaining in the minute window.","schema":{"type":"integer","description":"Requests remaining in the minute window."}},"X-RateLimit-Reset":{"description":"Unix timestamp at which the rate-limit window resets.","schema":{"type":"integer","description":"Unix timestamp at which the rate-limit window resets."}},"X-Request-Id":{"description":"Request identifier for diagnostics.","schema":{"type":"string","description":"Request identifier for diagnostics."}}},"content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"},"examples":[]}}},"503":{"description":"Temporarily unavailable; keyed endpoints fail closed when Redis or DB is unavailable.","headers":{"ETag":{"description":"Payload validator; send it as If-None-Match for a bodyless 304.","schema":{"type":"string","description":"Payload validator; send it as If-None-Match for a bodyless 304."}},"Cache-Control":{"description":"HTTP caching policy; public surfaces are edge-cacheable, keyed responses are private.","schema":{"type":"string","description":"HTTP caching policy; public surfaces are edge-cacheable, keyed responses are private."}},"X-RateLimit-Limit":{"description":"Requests allowed per minute.","schema":{"type":"integer","description":"Requests allowed per minute."}},"X-RateLimit-Remaining":{"description":"Requests remaining in the minute window.","schema":{"type":"integer","description":"Requests remaining in the minute window."}},"X-RateLimit-Reset":{"description":"Unix timestamp at which the rate-limit window resets.","schema":{"type":"integer","description":"Unix timestamp at which the rate-limit window resets."}},"X-Request-Id":{"description":"Request identifier for diagnostics.","schema":{"type":"string","description":"Request identifier for diagnostics."}}},"content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"},"examples":{"error-service_unavailable":{"$ref":"#\/components\/examples\/error-service_unavailable"}}}}},"401":{"description":"Missing, invalid or revoked bearer key.","headers":{"ETag":{"description":"Payload validator; send it as If-None-Match for a bodyless 304.","schema":{"type":"string","description":"Payload validator; send it as If-None-Match for a bodyless 304."}},"Cache-Control":{"description":"HTTP caching policy; public surfaces are edge-cacheable, keyed responses are private.","schema":{"type":"string","description":"HTTP caching policy; public surfaces are edge-cacheable, keyed responses are private."}},"X-RateLimit-Limit":{"description":"Requests allowed per minute.","schema":{"type":"integer","description":"Requests allowed per minute."}},"X-RateLimit-Remaining":{"description":"Requests remaining in the minute window.","schema":{"type":"integer","description":"Requests remaining in the minute window."}},"X-RateLimit-Reset":{"description":"Unix timestamp at which the rate-limit window resets.","schema":{"type":"integer","description":"Unix timestamp at which the rate-limit window resets."}},"X-Request-Id":{"description":"Request identifier for diagnostics.","schema":{"type":"string","description":"Request identifier for diagnostics."}}},"content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"},"examples":{"error-unauthorized":{"$ref":"#\/components\/examples\/error-unauthorized"}}}}},"403":{"description":"Partner account suspended.","headers":{"ETag":{"description":"Payload validator; send it as If-None-Match for a bodyless 304.","schema":{"type":"string","description":"Payload validator; send it as If-None-Match for a bodyless 304."}},"Cache-Control":{"description":"HTTP caching policy; public surfaces are edge-cacheable, keyed responses are private.","schema":{"type":"string","description":"HTTP caching policy; public surfaces are edge-cacheable, keyed responses are private."}},"X-RateLimit-Limit":{"description":"Requests allowed per minute.","schema":{"type":"integer","description":"Requests allowed per minute."}},"X-RateLimit-Remaining":{"description":"Requests remaining in the minute window.","schema":{"type":"integer","description":"Requests remaining in the minute window."}},"X-RateLimit-Reset":{"description":"Unix timestamp at which the rate-limit window resets.","schema":{"type":"integer","description":"Unix timestamp at which the rate-limit window resets."}},"X-Request-Id":{"description":"Request identifier for diagnostics.","schema":{"type":"string","description":"Request identifier for diagnostics."}}},"content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"},"examples":{"error-partner_suspended":{"$ref":"#\/components\/examples\/error-partner_suspended"}}}}},"402":{"description":"balance_exhausted: prepaid balance exhausted.","headers":{"Cache-Control":{"description":"no-store, private","schema":{"type":"string","enum":["no-store, private"]}}},"content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}}},"parameters":[{"name":"imdb_id","in":"path","required":true,"description":"IMDb title id. Malformed, unknown, hidden and pending ids receive the same 404 envelope.","schema":{"type":"string","description":"IMDb identifier.","pattern":"^tt[0-9]{7,10}$"}},{"name":"lang","in":"query","required":false,"description":"Label and title language; defaults to ka. Unsupported values normalize to en; all labels retain both languages.","schema":{"type":"string","description":"Supported language.","enum":["ka","en"],"default":"ka"}},{"name":"If-None-Match","in":"header","required":false,"description":"Previously received ETag; a match returns 304 without a body.","schema":{"type":"string","description":"ETag validator."}}]}},"\/api\/v1\/emotions\/batch":{"post":{"operationId":"batchTitleEmotions","summary":"Look up up to 100 IMDb ids","description":"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.","tags":["Batch"],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Successful response.","headers":{"ETag":{"description":"Payload validator; send it as If-None-Match for a bodyless 304.","schema":{"type":"string","description":"Payload validator; send it as If-None-Match for a bodyless 304."}},"Cache-Control":{"description":"HTTP caching policy; public surfaces are edge-cacheable, keyed responses are private.","schema":{"type":"string","description":"HTTP caching policy; public surfaces are edge-cacheable, keyed responses are private."}},"X-RateLimit-Limit":{"description":"Requests allowed per minute.","schema":{"type":"integer","description":"Requests allowed per minute."}},"X-RateLimit-Remaining":{"description":"Requests remaining in the minute window.","schema":{"type":"integer","description":"Requests remaining in the minute window."}},"X-RateLimit-Reset":{"description":"Unix timestamp at which the rate-limit window resets.","schema":{"type":"integer","description":"Unix timestamp at which the rate-limit window resets."}},"X-Request-Id":{"description":"Request identifier for diagnostics.","schema":{"type":"string","description":"Request identifier for diagnostics."}}},"content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/BatchResponse"},"examples":{"batch":{"$ref":"#\/components\/examples\/batch"}}}}},"401":{"description":"Missing, invalid or revoked bearer key.","headers":{"ETag":{"description":"Payload validator; send it as If-None-Match for a bodyless 304.","schema":{"type":"string","description":"Payload validator; send it as If-None-Match for a bodyless 304."}},"Cache-Control":{"description":"HTTP caching policy; public surfaces are edge-cacheable, keyed responses are private.","schema":{"type":"string","description":"HTTP caching policy; public surfaces are edge-cacheable, keyed responses are private."}},"X-RateLimit-Limit":{"description":"Requests allowed per minute.","schema":{"type":"integer","description":"Requests allowed per minute."}},"X-RateLimit-Remaining":{"description":"Requests remaining in the minute window.","schema":{"type":"integer","description":"Requests remaining in the minute window."}},"X-RateLimit-Reset":{"description":"Unix timestamp at which the rate-limit window resets.","schema":{"type":"integer","description":"Unix timestamp at which the rate-limit window resets."}},"X-Request-Id":{"description":"Request identifier for diagnostics.","schema":{"type":"string","description":"Request identifier for diagnostics."}}},"content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"},"examples":{"error-unauthorized":{"$ref":"#\/components\/examples\/error-unauthorized"}}}}},"403":{"description":"Partner account suspended.","headers":{"ETag":{"description":"Payload validator; send it as If-None-Match for a bodyless 304.","schema":{"type":"string","description":"Payload validator; send it as If-None-Match for a bodyless 304."}},"Cache-Control":{"description":"HTTP caching policy; public surfaces are edge-cacheable, keyed responses are private.","schema":{"type":"string","description":"HTTP caching policy; public surfaces are edge-cacheable, keyed responses are private."}},"X-RateLimit-Limit":{"description":"Requests allowed per minute.","schema":{"type":"integer","description":"Requests allowed per minute."}},"X-RateLimit-Remaining":{"description":"Requests remaining in the minute window.","schema":{"type":"integer","description":"Requests remaining in the minute window."}},"X-RateLimit-Reset":{"description":"Unix timestamp at which the rate-limit window resets.","schema":{"type":"integer","description":"Unix timestamp at which the rate-limit window resets."}},"X-Request-Id":{"description":"Request identifier for diagnostics.","schema":{"type":"string","description":"Request identifier for diagnostics."}}},"content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"},"examples":{"error-partner_suspended":{"$ref":"#\/components\/examples\/error-partner_suspended"}}}}},"405":{"description":"HTTP method not supported.","headers":{"ETag":{"description":"Payload validator; send it as If-None-Match for a bodyless 304.","schema":{"type":"string","description":"Payload validator; send it as If-None-Match for a bodyless 304."}},"Cache-Control":{"description":"HTTP caching policy; public surfaces are edge-cacheable, keyed responses are private.","schema":{"type":"string","description":"HTTP caching policy; public surfaces are edge-cacheable, keyed responses are private."}},"X-RateLimit-Limit":{"description":"Requests allowed per minute.","schema":{"type":"integer","description":"Requests allowed per minute."}},"X-RateLimit-Remaining":{"description":"Requests remaining in the minute window.","schema":{"type":"integer","description":"Requests remaining in the minute window."}},"X-RateLimit-Reset":{"description":"Unix timestamp at which the rate-limit window resets.","schema":{"type":"integer","description":"Unix timestamp at which the rate-limit window resets."}},"X-Request-Id":{"description":"Request identifier for diagnostics.","schema":{"type":"string","description":"Request identifier for diagnostics."}}},"content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"},"examples":[]}}},"413":{"description":"Payload exceeds the 16 KiB body limit.","headers":{"ETag":{"description":"Payload validator; send it as If-None-Match for a bodyless 304.","schema":{"type":"string","description":"Payload validator; send it as If-None-Match for a bodyless 304."}},"Cache-Control":{"description":"HTTP caching policy; public surfaces are edge-cacheable, keyed responses are private.","schema":{"type":"string","description":"HTTP caching policy; public surfaces are edge-cacheable, keyed responses are private."}},"X-RateLimit-Limit":{"description":"Requests allowed per minute.","schema":{"type":"integer","description":"Requests allowed per minute."}},"X-RateLimit-Remaining":{"description":"Requests remaining in the minute window.","schema":{"type":"integer","description":"Requests remaining in the minute window."}},"X-RateLimit-Reset":{"description":"Unix timestamp at which the rate-limit window resets.","schema":{"type":"integer","description":"Unix timestamp at which the rate-limit window resets."}},"X-Request-Id":{"description":"Request identifier for diagnostics.","schema":{"type":"string","description":"Request identifier for diagnostics."}}},"content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"},"examples":[]}}},"422":{"description":"Invalid request structure or more than 100 batch ids.","headers":{"ETag":{"description":"Payload validator; send it as If-None-Match for a bodyless 304.","schema":{"type":"string","description":"Payload validator; send it as If-None-Match for a bodyless 304."}},"Cache-Control":{"description":"HTTP caching policy; public surfaces are edge-cacheable, keyed responses are private.","schema":{"type":"string","description":"HTTP caching policy; public surfaces are edge-cacheable, keyed responses are private."}},"X-RateLimit-Limit":{"description":"Requests allowed per minute.","schema":{"type":"integer","description":"Requests allowed per minute."}},"X-RateLimit-Remaining":{"description":"Requests remaining in the minute window.","schema":{"type":"integer","description":"Requests remaining in the minute window."}},"X-RateLimit-Reset":{"description":"Unix timestamp at which the rate-limit window resets.","schema":{"type":"integer","description":"Unix timestamp at which the rate-limit window resets."}},"X-Request-Id":{"description":"Request identifier for diagnostics.","schema":{"type":"string","description":"Request identifier for diagnostics."}}},"content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"},"examples":{"error-batch_too_large":{"$ref":"#\/components\/examples\/error-batch_too_large"},"error-validation_error":{"$ref":"#\/components\/examples\/error-validation_error"}}}}},"429":{"description":"Rate limit or daily lookup quota exceeded; obey Retry-After.","headers":{"ETag":{"description":"Payload validator; send it as If-None-Match for a bodyless 304.","schema":{"type":"string","description":"Payload validator; send it as If-None-Match for a bodyless 304."}},"Cache-Control":{"description":"HTTP caching policy; public surfaces are edge-cacheable, keyed responses are private.","schema":{"type":"string","description":"HTTP caching policy; public surfaces are edge-cacheable, keyed responses are private."}},"X-RateLimit-Limit":{"description":"Requests allowed per minute.","schema":{"type":"integer","description":"Requests allowed per minute."}},"X-RateLimit-Remaining":{"description":"Requests remaining in the minute window.","schema":{"type":"integer","description":"Requests remaining in the minute window."}},"X-RateLimit-Reset":{"description":"Unix timestamp at which the rate-limit window resets.","schema":{"type":"integer","description":"Unix timestamp at which the rate-limit window resets."}},"X-Request-Id":{"description":"Request identifier for diagnostics.","schema":{"type":"string","description":"Request identifier for diagnostics."}},"Retry-After":{"description":"Seconds until a retry is permitted; quota errors wait until next UTC midnight.","schema":{"type":"integer","description":"Seconds until a retry is permitted; quota errors wait until next UTC midnight."}}},"content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"},"examples":{"error-rate_limited":{"$ref":"#\/components\/examples\/error-rate_limited"},"error-quota_exceeded":{"$ref":"#\/components\/examples\/error-quota_exceeded"}}}}},"500":{"description":"Internal server error without stack traces.","headers":{"ETag":{"description":"Payload validator; send it as If-None-Match for a bodyless 304.","schema":{"type":"string","description":"Payload validator; send it as If-None-Match for a bodyless 304."}},"Cache-Control":{"description":"HTTP caching policy; public surfaces are edge-cacheable, keyed responses are private.","schema":{"type":"string","description":"HTTP caching policy; public surfaces are edge-cacheable, keyed responses are private."}},"X-RateLimit-Limit":{"description":"Requests allowed per minute.","schema":{"type":"integer","description":"Requests allowed per minute."}},"X-RateLimit-Remaining":{"description":"Requests remaining in the minute window.","schema":{"type":"integer","description":"Requests remaining in the minute window."}},"X-RateLimit-Reset":{"description":"Unix timestamp at which the rate-limit window resets.","schema":{"type":"integer","description":"Unix timestamp at which the rate-limit window resets."}},"X-Request-Id":{"description":"Request identifier for diagnostics.","schema":{"type":"string","description":"Request identifier for diagnostics."}}},"content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"},"examples":[]}}},"503":{"description":"Temporarily unavailable; keyed endpoints fail closed when Redis or DB is unavailable.","headers":{"ETag":{"description":"Payload validator; send it as If-None-Match for a bodyless 304.","schema":{"type":"string","description":"Payload validator; send it as If-None-Match for a bodyless 304."}},"Cache-Control":{"description":"HTTP caching policy; public surfaces are edge-cacheable, keyed responses are private.","schema":{"type":"string","description":"HTTP caching policy; public surfaces are edge-cacheable, keyed responses are private."}},"X-RateLimit-Limit":{"description":"Requests allowed per minute.","schema":{"type":"integer","description":"Requests allowed per minute."}},"X-RateLimit-Remaining":{"description":"Requests remaining in the minute window.","schema":{"type":"integer","description":"Requests remaining in the minute window."}},"X-RateLimit-Reset":{"description":"Unix timestamp at which the rate-limit window resets.","schema":{"type":"integer","description":"Unix timestamp at which the rate-limit window resets."}},"X-Request-Id":{"description":"Request identifier for diagnostics.","schema":{"type":"string","description":"Request identifier for diagnostics."}}},"content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"},"examples":{"error-service_unavailable":{"$ref":"#\/components\/examples\/error-service_unavailable"}}}}},"402":{"description":"balance_exhausted: prepaid balance exhausted.","headers":{"Cache-Control":{"description":"no-store, private","schema":{"type":"string","enum":["no-store, private"]}}},"content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}}},"requestBody":{"required":true,"description":"JSON batch body, at most 16 KiB.","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/BatchRequest"},"example":{"imdb_ids":["tt0092929","tt9999999","abc"],"lang":"en"}}}}}},"\/api\/v1\/emotions":{"get":{"operationId":"getEmotionCatalog","summary":"Get the emotion taxonomy","description":"Keyless, CORS * without credentials, public cache for one day; no cookies. Taxonomy version 2 has 28 entries.","tags":["Catalog"],"security":[],"responses":{"200":{"description":"Successful response.","headers":{"ETag":{"description":"Payload validator; send it as If-None-Match for a bodyless 304.","schema":{"type":"string","description":"Payload validator; send it as If-None-Match for a bodyless 304."}},"Cache-Control":{"description":"HTTP caching policy; public surfaces are edge-cacheable, keyed responses are private.","schema":{"type":"string","description":"HTTP caching policy; public surfaces are edge-cacheable, keyed responses are private."}},"X-RateLimit-Limit":{"description":"Requests allowed per minute.","schema":{"type":"integer","description":"Requests allowed per minute."}},"X-RateLimit-Remaining":{"description":"Requests remaining in the minute window.","schema":{"type":"integer","description":"Requests remaining in the minute window."}},"X-RateLimit-Reset":{"description":"Unix timestamp at which the rate-limit window resets.","schema":{"type":"integer","description":"Unix timestamp at which the rate-limit window resets."}},"X-Request-Id":{"description":"Request identifier for diagnostics.","schema":{"type":"string","description":"Request identifier for diagnostics."}}},"content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Catalog"},"examples":{"catalog":{"$ref":"#\/components\/examples\/catalog"}}}}},"304":{"description":"Not modified; no response body. Reuse the cached representation.","headers":{"ETag":{"description":"Payload validator; send it as If-None-Match for a bodyless 304.","schema":{"type":"string","description":"Payload validator; send it as If-None-Match for a bodyless 304."}},"Cache-Control":{"description":"HTTP caching policy; public surfaces are edge-cacheable, keyed responses are private.","schema":{"type":"string","description":"HTTP caching policy; public surfaces are edge-cacheable, keyed responses are private."}},"X-RateLimit-Limit":{"description":"Requests allowed per minute.","schema":{"type":"integer","description":"Requests allowed per minute."}},"X-RateLimit-Remaining":{"description":"Requests remaining in the minute window.","schema":{"type":"integer","description":"Requests remaining in the minute window."}},"X-RateLimit-Reset":{"description":"Unix timestamp at which the rate-limit window resets.","schema":{"type":"integer","description":"Unix timestamp at which the rate-limit window resets."}},"X-Request-Id":{"description":"Request identifier for diagnostics.","schema":{"type":"string","description":"Request identifier for diagnostics."}}}},"405":{"description":"HTTP method not supported.","headers":{"ETag":{"description":"Payload validator; send it as If-None-Match for a bodyless 304.","schema":{"type":"string","description":"Payload validator; send it as If-None-Match for a bodyless 304."}},"Cache-Control":{"description":"HTTP caching policy; public surfaces are edge-cacheable, keyed responses are private.","schema":{"type":"string","description":"HTTP caching policy; public surfaces are edge-cacheable, keyed responses are private."}},"X-RateLimit-Limit":{"description":"Requests allowed per minute.","schema":{"type":"integer","description":"Requests allowed per minute."}},"X-RateLimit-Remaining":{"description":"Requests remaining in the minute window.","schema":{"type":"integer","description":"Requests remaining in the minute window."}},"X-RateLimit-Reset":{"description":"Unix timestamp at which the rate-limit window resets.","schema":{"type":"integer","description":"Unix timestamp at which the rate-limit window resets."}},"X-Request-Id":{"description":"Request identifier for diagnostics.","schema":{"type":"string","description":"Request identifier for diagnostics."}}},"content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"},"examples":[]}}},"429":{"description":"Rate limit or daily lookup quota exceeded; obey Retry-After.","headers":{"ETag":{"description":"Payload validator; send it as If-None-Match for a bodyless 304.","schema":{"type":"string","description":"Payload validator; send it as If-None-Match for a bodyless 304."}},"Cache-Control":{"description":"HTTP caching policy; public surfaces are edge-cacheable, keyed responses are private.","schema":{"type":"string","description":"HTTP caching policy; public surfaces are edge-cacheable, keyed responses are private."}},"X-RateLimit-Limit":{"description":"Requests allowed per minute.","schema":{"type":"integer","description":"Requests allowed per minute."}},"X-RateLimit-Remaining":{"description":"Requests remaining in the minute window.","schema":{"type":"integer","description":"Requests remaining in the minute window."}},"X-RateLimit-Reset":{"description":"Unix timestamp at which the rate-limit window resets.","schema":{"type":"integer","description":"Unix timestamp at which the rate-limit window resets."}},"X-Request-Id":{"description":"Request identifier for diagnostics.","schema":{"type":"string","description":"Request identifier for diagnostics."}},"Retry-After":{"description":"Seconds until a retry is permitted; quota errors wait until next UTC midnight.","schema":{"type":"integer","description":"Seconds until a retry is permitted; quota errors wait until next UTC midnight."}}},"content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"},"examples":{"error-rate_limited":{"$ref":"#\/components\/examples\/error-rate_limited"},"error-quota_exceeded":{"$ref":"#\/components\/examples\/error-quota_exceeded"}}}}},"500":{"description":"Internal server error without stack traces.","headers":{"ETag":{"description":"Payload validator; send it as If-None-Match for a bodyless 304.","schema":{"type":"string","description":"Payload validator; send it as If-None-Match for a bodyless 304."}},"Cache-Control":{"description":"HTTP caching policy; public surfaces are edge-cacheable, keyed responses are private.","schema":{"type":"string","description":"HTTP caching policy; public surfaces are edge-cacheable, keyed responses are private."}},"X-RateLimit-Limit":{"description":"Requests allowed per minute.","schema":{"type":"integer","description":"Requests allowed per minute."}},"X-RateLimit-Remaining":{"description":"Requests remaining in the minute window.","schema":{"type":"integer","description":"Requests remaining in the minute window."}},"X-RateLimit-Reset":{"description":"Unix timestamp at which the rate-limit window resets.","schema":{"type":"integer","description":"Unix timestamp at which the rate-limit window resets."}},"X-Request-Id":{"description":"Request identifier for diagnostics.","schema":{"type":"string","description":"Request identifier for diagnostics."}}},"content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"},"examples":[]}}},"503":{"description":"Temporarily unavailable; keyed endpoints fail closed when Redis or DB is unavailable.","headers":{"ETag":{"description":"Payload validator; send it as If-None-Match for a bodyless 304.","schema":{"type":"string","description":"Payload validator; send it as If-None-Match for a bodyless 304."}},"Cache-Control":{"description":"HTTP caching policy; public surfaces are edge-cacheable, keyed responses are private.","schema":{"type":"string","description":"HTTP caching policy; public surfaces are edge-cacheable, keyed responses are private."}},"X-RateLimit-Limit":{"description":"Requests allowed per minute.","schema":{"type":"integer","description":"Requests allowed per minute."}},"X-RateLimit-Remaining":{"description":"Requests remaining in the minute window.","schema":{"type":"integer","description":"Requests remaining in the minute window."}},"X-RateLimit-Reset":{"description":"Unix timestamp at which the rate-limit window resets.","schema":{"type":"integer","description":"Unix timestamp at which the rate-limit window resets."}},"X-Request-Id":{"description":"Request identifier for diagnostics.","schema":{"type":"string","description":"Request identifier for diagnostics."}}},"content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"},"examples":{"error-service_unavailable":{"$ref":"#\/components\/examples\/error-service_unavailable"}}}}}},"parameters":[{"name":"lang","in":"query","required":false,"description":"Label and title language; defaults to ka. Unsupported values normalize to en; all labels retain both languages.","schema":{"type":"string","description":"Supported language.","enum":["ka","en"],"default":"ka"}},{"name":"If-None-Match","in":"header","required":false,"description":"Previously received ETag; a match returns 304 without a body.","schema":{"type":"string","description":"ETag validator."}}]}},"\/api\/public\/v1\/icons\/{slug}.svg":{"get":{"operationId":"getEmotionIcon","summary":"Get an emotion SVG icon","description":"Keyless whitelisted icon; no raw input path joins. Cache-Control: public, max-age=31536000, immutable; X-Content-Type-Options: nosniff.","tags":["Catalog"],"security":[],"responses":{"200":{"description":"Successful response.","headers":{"ETag":{"description":"Payload validator; send it as If-None-Match for a bodyless 304.","schema":{"type":"string","description":"Payload validator; send it as If-None-Match for a bodyless 304."}},"Cache-Control":{"description":"HTTP caching policy; public surfaces are edge-cacheable, keyed responses are private.","schema":{"type":"string","description":"HTTP caching policy; public surfaces are edge-cacheable, keyed responses are private."}},"X-RateLimit-Limit":{"description":"Requests allowed per minute.","schema":{"type":"integer","description":"Requests allowed per minute."}},"X-RateLimit-Remaining":{"description":"Requests remaining in the minute window.","schema":{"type":"integer","description":"Requests remaining in the minute window."}},"X-RateLimit-Reset":{"description":"Unix timestamp at which the rate-limit window resets.","schema":{"type":"integer","description":"Unix timestamp at which the rate-limit window resets."}},"X-Request-Id":{"description":"Request identifier for diagnostics.","schema":{"type":"string","description":"Request identifier for diagnostics."}},"X-Content-Type-Options":{"description":"Prevents MIME sniffing.","schema":{"type":"string","description":"Always nosniff.","enum":["nosniff"]}}},"content":{"image\/svg+xml":{"schema":{"type":"string","description":"SVG markup."}}}},"404":{"description":"Uniform not_found for unknown, malformed, hidden and pending titles, or missing resources.","headers":{"ETag":{"description":"Payload validator; send it as If-None-Match for a bodyless 304.","schema":{"type":"string","description":"Payload validator; send it as If-None-Match for a bodyless 304."}},"Cache-Control":{"description":"HTTP caching policy; public surfaces are edge-cacheable, keyed responses are private.","schema":{"type":"string","description":"HTTP caching policy; public surfaces are edge-cacheable, keyed responses are private."}},"X-RateLimit-Limit":{"description":"Requests allowed per minute.","schema":{"type":"integer","description":"Requests allowed per minute."}},"X-RateLimit-Remaining":{"description":"Requests remaining in the minute window.","schema":{"type":"integer","description":"Requests remaining in the minute window."}},"X-RateLimit-Reset":{"description":"Unix timestamp at which the rate-limit window resets.","schema":{"type":"integer","description":"Unix timestamp at which the rate-limit window resets."}},"X-Request-Id":{"description":"Request identifier for diagnostics.","schema":{"type":"string","description":"Request identifier for diagnostics."}}},"content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"},"examples":{"error-not_found":{"$ref":"#\/components\/examples\/error-not_found"}}}}},"405":{"description":"HTTP method not supported.","headers":{"ETag":{"description":"Payload validator; send it as If-None-Match for a bodyless 304.","schema":{"type":"string","description":"Payload validator; send it as If-None-Match for a bodyless 304."}},"Cache-Control":{"description":"HTTP caching policy; public surfaces are edge-cacheable, keyed responses are private.","schema":{"type":"string","description":"HTTP caching policy; public surfaces are edge-cacheable, keyed responses are private."}},"X-RateLimit-Limit":{"description":"Requests allowed per minute.","schema":{"type":"integer","description":"Requests allowed per minute."}},"X-RateLimit-Remaining":{"description":"Requests remaining in the minute window.","schema":{"type":"integer","description":"Requests remaining in the minute window."}},"X-RateLimit-Reset":{"description":"Unix timestamp at which the rate-limit window resets.","schema":{"type":"integer","description":"Unix timestamp at which the rate-limit window resets."}},"X-Request-Id":{"description":"Request identifier for diagnostics.","schema":{"type":"string","description":"Request identifier for diagnostics."}}},"content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"},"examples":[]}}},"500":{"description":"Internal server error without stack traces.","headers":{"ETag":{"description":"Payload validator; send it as If-None-Match for a bodyless 304.","schema":{"type":"string","description":"Payload validator; send it as If-None-Match for a bodyless 304."}},"Cache-Control":{"description":"HTTP caching policy; public surfaces are edge-cacheable, keyed responses are private.","schema":{"type":"string","description":"HTTP caching policy; public surfaces are edge-cacheable, keyed responses are private."}},"X-RateLimit-Limit":{"description":"Requests allowed per minute.","schema":{"type":"integer","description":"Requests allowed per minute."}},"X-RateLimit-Remaining":{"description":"Requests remaining in the minute window.","schema":{"type":"integer","description":"Requests remaining in the minute window."}},"X-RateLimit-Reset":{"description":"Unix timestamp at which the rate-limit window resets.","schema":{"type":"integer","description":"Unix timestamp at which the rate-limit window resets."}},"X-Request-Id":{"description":"Request identifier for diagnostics.","schema":{"type":"string","description":"Request identifier for diagnostics."}}},"content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"},"examples":[]}}}},"parameters":[{"name":"slug","in":"path","required":true,"description":"Whitelisted catalog emotion slug. Unknown slugs return 404.","schema":{"type":"string","description":"Emotion slug.","pattern":"^[a-z][a-z0-9-]*$"}}]}},"\/api\/v1\/openapi.json":{"get":{"operationId":"getOpenApiDocument","summary":"Get the OpenAPI 3.1 contract","description":"Single source of the API contract and changelog; keyless, CORS *, public cache for one hour.","tags":["Catalog"],"security":[],"responses":{"200":{"description":"Successful response.","headers":{"ETag":{"description":"Payload validator; send it as If-None-Match for a bodyless 304.","schema":{"type":"string","description":"Payload validator; send it as If-None-Match for a bodyless 304."}},"Cache-Control":{"description":"HTTP caching policy; public surfaces are edge-cacheable, keyed responses are private.","schema":{"type":"string","description":"HTTP caching policy; public surfaces are edge-cacheable, keyed responses are private."}},"X-RateLimit-Limit":{"description":"Requests allowed per minute.","schema":{"type":"integer","description":"Requests allowed per minute."}},"X-RateLimit-Remaining":{"description":"Requests remaining in the minute window.","schema":{"type":"integer","description":"Requests remaining in the minute window."}},"X-RateLimit-Reset":{"description":"Unix timestamp at which the rate-limit window resets.","schema":{"type":"integer","description":"Unix timestamp at which the rate-limit window resets."}},"X-Request-Id":{"description":"Request identifier for diagnostics.","schema":{"type":"string","description":"Request identifier for diagnostics."}}},"content":{"application\/json":{"schema":{"type":"object","description":"OpenAPI 3.1 document, including info, paths and components."}}}},"404":{"description":"Uniform not_found for unknown, malformed, hidden and pending titles, or missing resources.","headers":{"ETag":{"description":"Payload validator; send it as If-None-Match for a bodyless 304.","schema":{"type":"string","description":"Payload validator; send it as If-None-Match for a bodyless 304."}},"Cache-Control":{"description":"HTTP caching policy; public surfaces are edge-cacheable, keyed responses are private.","schema":{"type":"string","description":"HTTP caching policy; public surfaces are edge-cacheable, keyed responses are private."}},"X-RateLimit-Limit":{"description":"Requests allowed per minute.","schema":{"type":"integer","description":"Requests allowed per minute."}},"X-RateLimit-Remaining":{"description":"Requests remaining in the minute window.","schema":{"type":"integer","description":"Requests remaining in the minute window."}},"X-RateLimit-Reset":{"description":"Unix timestamp at which the rate-limit window resets.","schema":{"type":"integer","description":"Unix timestamp at which the rate-limit window resets."}},"X-Request-Id":{"description":"Request identifier for diagnostics.","schema":{"type":"string","description":"Request identifier for diagnostics."}}},"content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"},"examples":{"error-not_found":{"$ref":"#\/components\/examples\/error-not_found"}}}}},"405":{"description":"HTTP method not supported.","headers":{"ETag":{"description":"Payload validator; send it as If-None-Match for a bodyless 304.","schema":{"type":"string","description":"Payload validator; send it as If-None-Match for a bodyless 304."}},"Cache-Control":{"description":"HTTP caching policy; public surfaces are edge-cacheable, keyed responses are private.","schema":{"type":"string","description":"HTTP caching policy; public surfaces are edge-cacheable, keyed responses are private."}},"X-RateLimit-Limit":{"description":"Requests allowed per minute.","schema":{"type":"integer","description":"Requests allowed per minute."}},"X-RateLimit-Remaining":{"description":"Requests remaining in the minute window.","schema":{"type":"integer","description":"Requests remaining in the minute window."}},"X-RateLimit-Reset":{"description":"Unix timestamp at which the rate-limit window resets.","schema":{"type":"integer","description":"Unix timestamp at which the rate-limit window resets."}},"X-Request-Id":{"description":"Request identifier for diagnostics.","schema":{"type":"string","description":"Request identifier for diagnostics."}}},"content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"},"examples":[]}}},"500":{"description":"Internal server error without stack traces.","headers":{"ETag":{"description":"Payload validator; send it as If-None-Match for a bodyless 304.","schema":{"type":"string","description":"Payload validator; send it as If-None-Match for a bodyless 304."}},"Cache-Control":{"description":"HTTP caching policy; public surfaces are edge-cacheable, keyed responses are private.","schema":{"type":"string","description":"HTTP caching policy; public surfaces are edge-cacheable, keyed responses are private."}},"X-RateLimit-Limit":{"description":"Requests allowed per minute.","schema":{"type":"integer","description":"Requests allowed per minute."}},"X-RateLimit-Remaining":{"description":"Requests remaining in the minute window.","schema":{"type":"integer","description":"Requests remaining in the minute window."}},"X-RateLimit-Reset":{"description":"Unix timestamp at which the rate-limit window resets.","schema":{"type":"integer","description":"Unix timestamp at which the rate-limit window resets."}},"X-Request-Id":{"description":"Request identifier for diagnostics.","schema":{"type":"string","description":"Request identifier for diagnostics."}}},"content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"},"examples":[]}}}}}},"\/api\/v1\/me":{"get":{"operationId":"getPartnerAccount","summary":"Get current partner limits and usage","description":"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.","tags":["Account"],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Successful response.","headers":{"Cache-Control":{"description":"HTTP caching policy; public surfaces are edge-cacheable, keyed responses are private.","schema":{"type":"string","description":"HTTP caching policy; public surfaces are edge-cacheable, keyed responses are private."}},"X-RateLimit-Limit":{"description":"Requests allowed per minute.","schema":{"type":"integer","description":"Requests allowed per minute."}},"X-RateLimit-Remaining":{"description":"Requests remaining in the minute window.","schema":{"type":"integer","description":"Requests remaining in the minute window."}},"X-RateLimit-Reset":{"description":"Unix timestamp at which the rate-limit window resets.","schema":{"type":"integer","description":"Unix timestamp at which the rate-limit window resets."}},"X-Request-Id":{"description":"Request identifier for diagnostics.","schema":{"type":"string","description":"Request identifier for diagnostics."}}},"content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Me"},"examples":[]}}},"401":{"description":"Missing, invalid or revoked bearer key.","headers":{"ETag":{"description":"Payload validator; send it as If-None-Match for a bodyless 304.","schema":{"type":"string","description":"Payload validator; send it as If-None-Match for a bodyless 304."}},"Cache-Control":{"description":"HTTP caching policy; public surfaces are edge-cacheable, keyed responses are private.","schema":{"type":"string","description":"HTTP caching policy; public surfaces are edge-cacheable, keyed responses are private."}},"X-RateLimit-Limit":{"description":"Requests allowed per minute.","schema":{"type":"integer","description":"Requests allowed per minute."}},"X-RateLimit-Remaining":{"description":"Requests remaining in the minute window.","schema":{"type":"integer","description":"Requests remaining in the minute window."}},"X-RateLimit-Reset":{"description":"Unix timestamp at which the rate-limit window resets.","schema":{"type":"integer","description":"Unix timestamp at which the rate-limit window resets."}},"X-Request-Id":{"description":"Request identifier for diagnostics.","schema":{"type":"string","description":"Request identifier for diagnostics."}}},"content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"},"examples":{"error-unauthorized":{"$ref":"#\/components\/examples\/error-unauthorized"}}}}},"403":{"description":"Partner account suspended.","headers":{"ETag":{"description":"Payload validator; send it as If-None-Match for a bodyless 304.","schema":{"type":"string","description":"Payload validator; send it as If-None-Match for a bodyless 304."}},"Cache-Control":{"description":"HTTP caching policy; public surfaces are edge-cacheable, keyed responses are private.","schema":{"type":"string","description":"HTTP caching policy; public surfaces are edge-cacheable, keyed responses are private."}},"X-RateLimit-Limit":{"description":"Requests allowed per minute.","schema":{"type":"integer","description":"Requests allowed per minute."}},"X-RateLimit-Remaining":{"description":"Requests remaining in the minute window.","schema":{"type":"integer","description":"Requests remaining in the minute window."}},"X-RateLimit-Reset":{"description":"Unix timestamp at which the rate-limit window resets.","schema":{"type":"integer","description":"Unix timestamp at which the rate-limit window resets."}},"X-Request-Id":{"description":"Request identifier for diagnostics.","schema":{"type":"string","description":"Request identifier for diagnostics."}}},"content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"},"examples":{"error-partner_suspended":{"$ref":"#\/components\/examples\/error-partner_suspended"}}}}},"405":{"description":"HTTP method not supported.","headers":{"ETag":{"description":"Payload validator; send it as If-None-Match for a bodyless 304.","schema":{"type":"string","description":"Payload validator; send it as If-None-Match for a bodyless 304."}},"Cache-Control":{"description":"HTTP caching policy; public surfaces are edge-cacheable, keyed responses are private.","schema":{"type":"string","description":"HTTP caching policy; public surfaces are edge-cacheable, keyed responses are private."}},"X-RateLimit-Limit":{"description":"Requests allowed per minute.","schema":{"type":"integer","description":"Requests allowed per minute."}},"X-RateLimit-Remaining":{"description":"Requests remaining in the minute window.","schema":{"type":"integer","description":"Requests remaining in the minute window."}},"X-RateLimit-Reset":{"description":"Unix timestamp at which the rate-limit window resets.","schema":{"type":"integer","description":"Unix timestamp at which the rate-limit window resets."}},"X-Request-Id":{"description":"Request identifier for diagnostics.","schema":{"type":"string","description":"Request identifier for diagnostics."}}},"content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"},"examples":[]}}},"429":{"description":"Rate limit or daily lookup quota exceeded; obey Retry-After.","headers":{"ETag":{"description":"Payload validator; send it as If-None-Match for a bodyless 304.","schema":{"type":"string","description":"Payload validator; send it as If-None-Match for a bodyless 304."}},"Cache-Control":{"description":"HTTP caching policy; public surfaces are edge-cacheable, keyed responses are private.","schema":{"type":"string","description":"HTTP caching policy; public surfaces are edge-cacheable, keyed responses are private."}},"X-RateLimit-Limit":{"description":"Requests allowed per minute.","schema":{"type":"integer","description":"Requests allowed per minute."}},"X-RateLimit-Remaining":{"description":"Requests remaining in the minute window.","schema":{"type":"integer","description":"Requests remaining in the minute window."}},"X-RateLimit-Reset":{"description":"Unix timestamp at which the rate-limit window resets.","schema":{"type":"integer","description":"Unix timestamp at which the rate-limit window resets."}},"X-Request-Id":{"description":"Request identifier for diagnostics.","schema":{"type":"string","description":"Request identifier for diagnostics."}},"Retry-After":{"description":"Seconds until a retry is permitted; quota errors wait until next UTC midnight.","schema":{"type":"integer","description":"Seconds until a retry is permitted; quota errors wait until next UTC midnight."}}},"content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"},"examples":{"error-rate_limited":{"$ref":"#\/components\/examples\/error-rate_limited"},"error-quota_exceeded":{"$ref":"#\/components\/examples\/error-quota_exceeded"}}}}},"500":{"description":"Internal server error without stack traces.","headers":{"ETag":{"description":"Payload validator; send it as If-None-Match for a bodyless 304.","schema":{"type":"string","description":"Payload validator; send it as If-None-Match for a bodyless 304."}},"Cache-Control":{"description":"HTTP caching policy; public surfaces are edge-cacheable, keyed responses are private.","schema":{"type":"string","description":"HTTP caching policy; public surfaces are edge-cacheable, keyed responses are private."}},"X-RateLimit-Limit":{"description":"Requests allowed per minute.","schema":{"type":"integer","description":"Requests allowed per minute."}},"X-RateLimit-Remaining":{"description":"Requests remaining in the minute window.","schema":{"type":"integer","description":"Requests remaining in the minute window."}},"X-RateLimit-Reset":{"description":"Unix timestamp at which the rate-limit window resets.","schema":{"type":"integer","description":"Unix timestamp at which the rate-limit window resets."}},"X-Request-Id":{"description":"Request identifier for diagnostics.","schema":{"type":"string","description":"Request identifier for diagnostics."}}},"content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"},"examples":[]}}},"503":{"description":"Temporarily unavailable; keyed endpoints fail closed when Redis or DB is unavailable.","headers":{"ETag":{"description":"Payload validator; send it as If-None-Match for a bodyless 304.","schema":{"type":"string","description":"Payload validator; send it as If-None-Match for a bodyless 304."}},"Cache-Control":{"description":"HTTP caching policy; public surfaces are edge-cacheable, keyed responses are private.","schema":{"type":"string","description":"HTTP caching policy; public surfaces are edge-cacheable, keyed responses are private."}},"X-RateLimit-Limit":{"description":"Requests allowed per minute.","schema":{"type":"integer","description":"Requests allowed per minute."}},"X-RateLimit-Remaining":{"description":"Requests remaining in the minute window.","schema":{"type":"integer","description":"Requests remaining in the minute window."}},"X-RateLimit-Reset":{"description":"Unix timestamp at which the rate-limit window resets.","schema":{"type":"integer","description":"Unix timestamp at which the rate-limit window resets."}},"X-Request-Id":{"description":"Request identifier for diagnostics.","schema":{"type":"string","description":"Request identifier for diagnostics."}}},"content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"},"examples":{"error-service_unavailable":{"$ref":"#\/components\/examples\/error-service_unavailable"}}}}}}}},"\/api\/v1\/widget\/{imdb_id}":{"get":{"operationId":"getWidgetEmotions","summary":"Get compact emotions with a publishable key","tags":["Titles"],"security":[{"publishableKey":[]}],"parameters":[{"name":"imdb_id","in":"path","required":true,"description":"IMDb title id. Malformed, unknown, hidden and pending ids receive the same 404 envelope.","schema":{"type":"string","description":"IMDb identifier.","pattern":"^tt[0-9]{7,10}$"}},{"name":"pk","in":"query","required":true,"schema":{"type":"string","pattern":"^fdb_pk_[a-z2-7]{12}_[A-Za-z0-9]{24}$"}},{"name":"lang","in":"query","required":false,"schema":{"type":"string","enum":["ka","en"]}}],"responses":{"200":{"description":"Compact public emotion payload.","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/WidgetCompact"},"example":{"t":"tt1375666","s":"ok","e":[[7,42],[12,31],[3,18]],"u":"\/movies\/18213-inception-2010","x":2}}},"headers":{"Cache-Control":{"description":"public, max-age=120, s-maxage=120","schema":{"type":"string","enum":["public, max-age=120, s-maxage=120"]}},"ETag":{"description":"Weak payload validator; 304 still consumes a metered lookup.","schema":{"type":"string"}},"Access-Control-Allow-Origin":{"description":"*","schema":{"type":"string","enum":["*"]}},"Vary":{"description":"Accept-Encoding","schema":{"type":"string","enum":["Accept-Encoding"]}}}},"304":{"description":"Not modified; no response body.","headers":{"Cache-Control":{"description":"public, max-age=120, s-maxage=120","schema":{"type":"string","enum":["public, max-age=120, s-maxage=120"]}},"ETag":{"description":"Weak payload validator; 304 still consumes a metered lookup.","schema":{"type":"string"}},"Access-Control-Allow-Origin":{"description":"*","schema":{"type":"string","enum":["*"]}},"Vary":{"description":"Accept-Encoding","schema":{"type":"string","enum":["Accept-Encoding"]}}}},"401":{"description":"Missing, invalid or revoked publishable key.","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"},"examples":{"error-key_required":{"$ref":"#\/components\/examples\/error-key_required"}}}},"headers":{"Cache-Control":{"description":"no-store, private","schema":{"type":"string","enum":["no-store, private"]}}}},"402":{"description":"Prepaid balance exhausted.","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"},"examples":{"error-balance_exhausted":{"$ref":"#\/components\/examples\/error-balance_exhausted"}}}},"headers":{"Cache-Control":{"description":"no-store, private","schema":{"type":"string","enum":["no-store, private"]}}}},"403":{"description":"Origin not allowed or partner suspended.","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"},"examples":{"error-origin_not_allowed":{"$ref":"#\/components\/examples\/error-origin_not_allowed"}}}},"headers":{"Cache-Control":{"description":"no-store, private","schema":{"type":"string","enum":["no-store, private"]}}}},"404":{"description":"Title not found.","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}},"headers":{"Cache-Control":{"description":"no-store, private","schema":{"type":"string","enum":["no-store, private"]}}}},"429":{"description":"Quota or rate limit exceeded.","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}},"headers":{"Cache-Control":{"description":"no-store, private","schema":{"type":"string","enum":["no-store, private"]}}}},"503":{"description":"Billing service unavailable.","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}},"headers":{"Cache-Control":{"description":"no-store, private","schema":{"type":"string","enum":["no-store, private"]}}}},"500":{"description":"Unexpected server error.","headers":{"Cache-Control":{"description":"no-store, private","schema":{"type":"string","enum":["no-store, private"]}}},"content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}}},"description":"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."}},"\/api\/v1\/titles\/{imdb_id}\/arc":{"get":{"operationId":"getTitleArc","summary":"Get an entitled compact emotion arc","tags":["Titles"],"security":[{"publishableKey":[]},{"bearerAuth":[]}],"parameters":[{"name":"imdb_id","in":"path","required":true,"description":"IMDb title id. Malformed, unknown, hidden and pending ids receive the same 404 envelope.","schema":{"type":"string","description":"IMDb identifier.","pattern":"^tt[0-9]{7,10}$"}},{"name":"pk","in":"query","required":false,"schema":{"type":"string","pattern":"^fdb_pk_[a-z2-7]{12}_[A-Za-z0-9]{24}$"}}],"responses":{"200":{"description":"Compact public emotion payload.","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/ArcCompact"},"example":{"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]]}}},"headers":{"Cache-Control":{"description":"Publishable: public, max-age=120, s-maxage=120. Secret: private, max-age=300.","schema":{"type":"string"}},"ETag":{"description":"Weak payload validator; 304 still consumes a metered lookup.","schema":{"type":"string"}},"Access-Control-Allow-Origin":{"description":"Present only for publishable-key requests.","schema":{"type":"string","enum":["*"]}},"Vary":{"description":"Accept-Encoding","schema":{"type":"string","enum":["Accept-Encoding"]}}}},"304":{"description":"Not modified; no response body.","headers":{"Cache-Control":{"description":"Publishable: public, max-age=120, s-maxage=120. Secret: private, max-age=300.","schema":{"type":"string"}},"ETag":{"description":"Weak payload validator; 304 still consumes a metered lookup.","schema":{"type":"string"}},"Access-Control-Allow-Origin":{"description":"Present only for publishable-key requests.","schema":{"type":"string","enum":["*"]}},"Vary":{"description":"Accept-Encoding","schema":{"type":"string","enum":["Accept-Encoding"]}}}},"401":{"description":"Missing, invalid or revoked publishable key.","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"},"examples":{"error-key_required":{"$ref":"#\/components\/examples\/error-key_required"}}}},"headers":{"Cache-Control":{"description":"no-store, private","schema":{"type":"string","enum":["no-store, private"]}}}},"402":{"description":"Prepaid balance exhausted.","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"},"examples":{"error-balance_exhausted":{"$ref":"#\/components\/examples\/error-balance_exhausted"}}}},"headers":{"Cache-Control":{"description":"no-store, private","schema":{"type":"string","enum":["no-store, private"]}}}},"403":{"description":"addon_required, origin_not_allowed or partner_suspended.","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"},"examples":{"error-addon_required":{"$ref":"#\/components\/examples\/error-addon_required"}}}},"headers":{"Cache-Control":{"description":"no-store, private","schema":{"type":"string","enum":["no-store, private"]}}}},"404":{"description":"Title not found.","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}},"headers":{"Cache-Control":{"description":"no-store, private","schema":{"type":"string","enum":["no-store, private"]}}}},"429":{"description":"Quota or rate limit exceeded.","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}},"headers":{"Cache-Control":{"description":"no-store, private","schema":{"type":"string","enum":["no-store, private"]}}}},"503":{"description":"Billing service unavailable.","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}},"headers":{"Cache-Control":{"description":"no-store, private","schema":{"type":"string","enum":["no-store, private"]}}}},"500":{"description":"Unexpected server error.","headers":{"Cache-Control":{"description":"no-store, private","schema":{"type":"string","enum":["no-store, private"]}}},"content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}}},"description":"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."}},"\/api\/public\/v1\/widget\/report":{"post":{"operationId":"reportWidgetFailure","summary":"Report a widget failure","tags":["Widget"],"security":[],"description":"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.","requestBody":{"required":true,"content":{"text\/plain":{"schema":{"type":"string","pattern":"^(fdb_pk_[a-z2-7]{12}_[A-Za-z0-9]{24}) (no_imdb_id|no_mount|network|script_error|taxonomy_mismatch)( tt[0-9]{7,10})?$(?![\\s\\S])","maxLength":512,"description":"ASCII grammar; byte limit 512. Invalid bodies are silently discarded."},"example":"fdb_pk_abcdefghijkl_ABCDEFGHIJKLMNOPQRSTUVWX network tt1375666"}}},"responses":{"204":{"description":"Accepted or silently discarded invalid report. No body.","headers":{"Cache-Control":{"description":"no-store, private","schema":{"type":"string","enum":["no-store, private"]}},"Access-Control-Allow-Origin":{"description":"*","schema":{"type":"string","enum":["*"]}}}},"429":{"description":"rate_limited: report rejected by limiter; nothing recorded.","headers":{"Cache-Control":{"description":"no-store, private","schema":{"type":"string","enum":["no-store, private"]}}},"content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"500":{"description":"Unexpected server error.","headers":{"Cache-Control":{"description":"no-store, private","schema":{"type":"string","enum":["no-store, private"]}}},"content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"503":{"description":"Service unavailable.","headers":{"Cache-Control":{"description":"no-store, private","schema":{"type":"string","enum":["no-store, private"]}}},"content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}}}}}},"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"fdb_live_…","description":"Secret server-to-server key: fdb_live_<12 lowercase base32 key id>_<40 base62 secret>. Never expose it in a browser. Only its hash is stored; revocable, rate-limited and quota-bound."},"publishableKey":{"type":"apiKey","in":"query","name":"pk","description":"Origin-bound browser key: fdb_pk_<12 lowercase base32>_<24 base62>. A matching Origin is required. Never send as a bearer token."}},"schemas":{"Labels":{"type":"object","description":"Bilingual emotion labels.","properties":{"ka":{"type":"string","description":"Georgian label."},"en":{"type":"string","description":"English label."}},"required":["ka","en"],"additionalProperties":false},"Title":{"type":"object","description":"Title names; a missing Georgian translation is null, never invented.","properties":{"original":{"type":"string","description":"Original title, falling back to English."},"en":{"type":"string","description":"English title."},"ka":{"type":["string","null"],"description":"Georgian title, or null if unavailable."}},"required":["original","en","ka"],"additionalProperties":false},"Urls":{"type":"object","description":"Canonical title page URLs. Always use these returned URLs; the domain will change at cutover.","properties":{"ka":{"type":"string","description":"Canonical Georgian title page URL."},"en":{"type":"string","description":"Canonical English title page URL."}},"required":["ka","en"],"additionalProperties":false},"Attribution":{"type":"object","description":"Visible attribution required when displaying emotion data.","properties":{"text":{"type":"string","description":"Localized attribution text.","enum":["Emotion data: FeelDB","ემოციების მონაცემები: FeelDB"]},"url":{"type":"string","description":"FeelDB title page backlink; use this returned URL."},"terms":{"type":"string","description":"URL of attribution terms; use this returned URL."}},"required":["text","url","terms"],"additionalProperties":false},"Emotion":{"type":"object","description":"One of up to three dominant emotions FeelDB shows on the title page, in rank order.","properties":{"rank":{"type":"integer","description":"One-based rank among the returned dominant emotions.","minimum":1,"maximum":3},"key":{"type":"string","description":"Stable emotion slug."},"label":{"type":"string","description":"Emotion label in requested language."},"labels":{"$ref":"#\/components\/schemas\/Labels","description":"Labels in both supported languages."},"family":{"type":"string","description":"Emotion family grouping in the FeelDB taxonomy."},"color":{"type":"string","description":"Family display colour as a hexadecimal RGB value.","pattern":"^#[0-9A-Fa-f]{6}$"},"icon":{"type":"string","description":"Absolute SVG icon URL; use the returned URL rather than constructing one."},"share":{"type":"number","description":"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}},"required":["rank","key","label","labels","family","color","icon","share"],"additionalProperties":false},"Source":{"type":"object","description":"Honest provenance: almost all current data is an AI estimate refined by viewer votes.","properties":{"kind":{"type":"string","description":"ai = AI estimate only; blended = AI estimate plus viewer ballots; viewers = viewer ballots only; none = no emotion evidence.","enum":["ai","blended","viewers","none"]},"viewers":{"type":"integer","description":"Distinct viewers who submitted ballots; never a synthetic vote count.","minimum":0},"confidence":{"type":"string","description":"High when viewers >= 10; medium when an AI estimate is present or viewers are 3–9; low otherwise. Confidence describes evidence, not a probability.","enum":["high","medium","low"]}},"required":["kind","viewers","confidence"],"additionalProperties":false},"TitleEmotions":{"type":"object","description":"Published title and its dominant emotions. Hidden, pending and unknown titles are never exposed.","properties":{"imdb_id":{"type":"string","description":"IMDb identifier of the published title.","pattern":"^tt[0-9]{7,10}$"},"type":{"type":"string","description":"Movie or series; animation is a separate flag.","enum":["movie","series"]},"year":{"type":["integer","null"],"description":"Release year, or null when unknown."},"title":{"$ref":"#\/components\/schemas\/Title","description":"Original and translated title names."},"name":{"type":"string","description":"Title in requested language, falling back to English."},"animation":{"type":"boolean","description":"Whether the title is animated."},"status":{"type":"string","description":"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.","enum":["ok","insufficient_data"]},"emotions":{"type":"array","description":"Top up to three emotions with share at least the configured minimum (default 5%), using the same ordering as the title page.","items":{"$ref":"#\/components\/schemas\/Emotion"},"maxItems":3},"tied_with_next":{"type":"boolean","description":"Whether rank 3 has the same share as rank 4, signalling a tie at the display cutoff."},"source":{"$ref":"#\/components\/schemas\/Source","description":"Evidence origin, viewer count and confidence."},"url":{"type":"string","description":"Canonical title page URL in the requested language."},"urls":{"$ref":"#\/components\/schemas\/Urls","description":"Canonical title page URLs in both languages."},"attribution":{"$ref":"#\/components\/schemas\/Attribution","description":"Required display attribution and backlink."},"updated_at":{"type":"string","description":"UTC ISO-8601 timestamp of the latest AI estimate or viewer ballot, falling back to title updated_at."}},"required":["imdb_id","type","year","title","name","animation","status","emotions","tied_with_next","source","url","urls","attribution","updated_at"],"additionalProperties":false},"SingleResponse":{"type":"object","description":"Single-title response envelope.","properties":{"data":{"$ref":"#\/components\/schemas\/TitleEmotions","description":"Published title emotion data."}},"required":["data"],"additionalProperties":false},"BatchResponse":{"type":"object","description":"Batch results in request order, deduplicated case-insensitively. Malformed ids are listed, not rejected individually.","properties":{"data":{"type":"array","description":"Found published titles in request order.","items":{"$ref":"#\/components\/schemas\/TitleEmotions"},"maxItems":100},"not_found":{"type":"array","description":"Unknown, hidden or pending IMDb ids, without distinguishing those cases.","items":{"type":"string","description":"IMDb id not found.","pattern":"^tt[0-9]{7,10}$"},"maxItems":100},"invalid":{"type":"array","description":"Malformed input ids in request order.","items":{"type":"string","description":"Original invalid identifier."},"maxItems":100}},"required":["data","not_found","invalid"],"additionalProperties":false},"CatalogEmotion":{"type":"object","description":"Emotion taxonomy entry.","properties":{"key":{"type":"string","description":"Stable emotion slug."},"label":{"type":"string","description":"Emotion label in requested language."},"labels":{"$ref":"#\/components\/schemas\/Labels","description":"Labels in both supported languages."},"family":{"type":"string","description":"Emotion family grouping in the FeelDB taxonomy."},"color":{"type":"string","description":"Family display colour as a hexadecimal RGB value.","pattern":"^#[0-9A-Fa-f]{6}$"},"icon":{"type":"string","description":"Absolute SVG icon URL; use the returned URL rather than constructing one."}},"required":["key","label","labels","family","color","icon"],"additionalProperties":false},"Catalog":{"type":"object","description":"Emotion taxonomy ordered by catalog position.","properties":{"data":{"type":"array","description":"Current taxonomy entries (28 in version 2).","items":{"$ref":"#\/components\/schemas\/CatalogEmotion"}},"taxonomy_version":{"type":"integer","description":"Version of the taxonomy used by these entries.","minimum":1}},"required":["data","taxonomy_version"],"additionalProperties":false},"Me":{"type":"object","description":"Partner account and current UTC-day usage, visible only with a secret key.","properties":{"client":{"type":"object","description":"Partner account identity.","properties":{"name":{"type":"string","description":"Partner organisation name."}},"required":["name"],"additionalProperties":false},"key":{"type":"object","description":"Safe key metadata; no secret is returned.","properties":{"prefix":{"type":"string","description":"Identifiable public key prefix."},"created_at":{"type":"string","description":"UTC ISO-8601 key issuance timestamp."}},"required":["prefix","created_at"],"additionalProperties":false},"limits":{"type":"object","description":"Limits configured for this partner.","properties":{"per_minute":{"type":"integer","description":"Request limit per minute.","minimum":1},"daily_quota":{"type":"integer","description":"IMDb lookup quota per UTC day.","minimum":1}},"required":["per_minute","daily_quota"],"additionalProperties":false},"usage":{"type":"object","description":"Buffered usage counters for today.","properties":{"today_requests":{"type":"integer","description":"Requests recorded today.","minimum":0},"today_ids":{"type":"integer","description":"IMDb lookups consumed today.","minimum":0},"remaining_ids":{"type":"integer","description":"Lookups remaining in the daily quota.","minimum":0}},"required":["today_requests","today_ids","remaining_ids"],"additionalProperties":false},"billing":{"$ref":"#\/components\/schemas\/Billing"}},"required":["client","key","limits","usage","billing"],"additionalProperties":false},"Error":{"type":"object","description":"Uniform JSON error envelope. Never includes stack traces or private title information.","properties":{"error":{"type":"object","description":"Stable machine-readable error and human help.","properties":{"code":{"type":"string","description":"Stable error code. not_found covers absent routes and malformed, unknown, hidden or pending single-title ids. validation_error covers malformed batch bodies.","enum":["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"]},"message":{"type":"string","description":"Human-readable explanation; do not parse this for control flow."},"docs":{"type":"string","description":"Absolute English error documentation URL."}},"required":["code","message","docs"],"additionalProperties":false}},"required":["error"],"additionalProperties":false},"BatchRequest":{"type":"object","description":"At most 100 identifiers and optional language; the whole body must be at most 16 KiB.","properties":{"imdb_ids":{"type":"array","description":"IMDb identifiers; malformed strings are reported in invalid, valid ids use ^tt[0-9]{7,10}$.","items":{"type":"string","description":"IMDb identifier supplied by caller."},"maxItems":100},"lang":{"type":"string","description":"Requested language; defaults to ka.","enum":["ka","en"],"default":"ka"}},"required":["imdb_ids"],"additionalProperties":false},"WidgetCompact":{"type":"object","required":["t","s","e","u","x"],"additionalProperties":false,"properties":{"t":{"type":"string","pattern":"^tt[0-9]{7,10}$"},"s":{"type":"string","enum":["ok","insufficient_data"]},"e":{"type":"array","maxItems":3,"items":{"type":"array","minItems":2,"maxItems":2,"prefixItems":[{"type":"integer","minimum":2,"maximum":29},{"type":"integer","minimum":0,"maximum":100}],"items":{"type":"integer","minimum":0,"maximum":100}}},"u":{"type":"string","pattern":"^\/"},"x":{"type":"integer","minimum":1}},"oneOf":[{"properties":{"s":{"enum":["ok"]}}},{"properties":{"s":{"enum":["insufficient_data"]},"e":{"maxItems":0}}}]},"WidgetTaxonomy":{"type":"object","description":"Compact SDK taxonomy representation of Catalog, with [id, slug, English label, Georgian label, colour] rows.","required":["x","e"],"additionalProperties":false,"properties":{"x":{"type":"integer","minimum":1},"e":{"type":"array","items":{"type":"array","minItems":5,"maxItems":5,"prefixItems":[{"type":"integer","minimum":2,"maximum":29},{"type":"string"},{"type":"string"},{"type":"string"},{"type":"string","pattern":"^#[0-9A-Fa-f]{6}$"}]}}}},"ArcCompact":{"type":"object","properties":{"v":{"type":"integer","enum":[1]},"b":{"type":"integer","enum":[20]},"d":{"type":"array","minItems":20,"maxItems":20,"items":{"type":["integer","null"],"minimum":2,"maximum":29},"description":"Taxonomy emotion ids; unsupported bins are null."},"i":{"type":"array","minItems":20,"maxItems":20,"items":{"type":["integer","null"],"minimum":0,"maximum":100},"description":"Round-half-up integer percent; unsupported bins are null at the same positions as d."},"t":{"type":"array","maxItems":3,"items":{"type":"array","minItems":2,"maxItems":2,"prefixItems":[{"type":"string","enum":["peak","valley","rise","fall"]},{"type":"integer","minimum":0,"maximum":19}],"items":false}}},"required":["v","b","d","i","t"],"additionalProperties":false},"Billing":{"type":"object","properties":{"balance":{"type":"integer","minimum":0,"description":"Integer currency minor units (e.g. tetri)."},"allowance_remaining":{"type":"integer","minimum":0,"description":"Remaining free emotion lookup units; arcs do not consume this allowance."},"currency":{"type":"string"},"tariffs":{"type":"array","minItems":2,"maxItems":2,"prefixItems":[{"$ref":"#\/components\/schemas\/EmotionTariff"},{"$ref":"#\/components\/schemas\/ArcTariff"}],"items":false,"description":"Current emotions then arcs tariffs; effective_from is UTC ISO-8601."},"addons":{"type":"array","items":{"type":"string","description":"Enabled add-on identifier; arcs grants compact arc access."}}},"required":["balance","allowance_remaining","currency","tariffs","addons"],"additionalProperties":false},"EmotionTariff":{"type":"object","properties":{"product":{"type":"string","enum":["emotions"]},"price_per_1000":{"type":"integer","minimum":0,"description":"Integer currency minor units per 1000 lookups."},"currency":{"type":"string"},"effective_from":{"type":"string","format":"date-time"}},"required":["product","price_per_1000","currency","effective_from"],"additionalProperties":false},"ArcTariff":{"type":"object","properties":{"product":{"type":"string","enum":["arcs"]},"price_per_1000":{"type":"integer","minimum":0,"description":"Integer currency minor units per 1000 lookups."},"currency":{"type":"string"},"effective_from":{"type":"string","format":"date-time"}},"required":["product","price_per_1000","currency","effective_from"],"additionalProperties":false}},"examples":{"error-service_unavailable":{"summary":"error service_unavailable","value":{"error":{"code":"service_unavailable","message":"Temporarily unavailable, retry later.","docs":"https:\/\/feeldb.resoftware.ai\/integrations\/docs#errors"}}},"batch":{"summary":"batch","value":{"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.0,"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.0,"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"]}},"error-batch_too_large":{"summary":"error batch_too_large","value":{"error":{"code":"batch_too_large","message":"At most 100 ids per batch.","docs":"https:\/\/feeldb.resoftware.ai\/integrations\/docs#errors"}}},"error-rate_limited":{"summary":"error rate_limited","value":{"error":{"code":"rate_limited","message":"Too many requests.","docs":"https:\/\/feeldb.resoftware.ai\/integrations\/docs#errors"}}},"catalog":{"summary":"catalog","value":{"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}},"error-quota_exceeded":{"summary":"error quota_exceeded","value":{"error":{"code":"quota_exceeded","message":"Daily quota exceeded.","docs":"https:\/\/feeldb.resoftware.ai\/integrations\/docs#errors"}}},"title-insufficient":{"summary":"title insufficient","value":{"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}}},"error-unauthorized":{"summary":"error unauthorized","value":{"error":{"code":"unauthorized","message":"Missing or invalid API key.","docs":"https:\/\/feeldb.resoftware.ai\/integrations\/docs#errors"}}},"error-not_found":{"summary":"error not_found","value":{"error":{"code":"not_found","message":"No published title has this IMDb id.","docs":"https:\/\/feeldb.resoftware.ai\/integrations\/docs#errors"}}},"title-ok":{"summary":"title ok","value":{"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.0,"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.0,"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}}},"error-invalid_imdb_id":{"summary":"error invalid_imdb_id","value":{"error":{"code":"invalid_imdb_id","message":"IMDb ids look like tt0111161.","docs":"https:\/\/feeldb.resoftware.ai\/integrations\/docs#errors"}}},"error-partner_suspended":{"summary":"error partner_suspended","value":{"error":{"code":"partner_suspended","message":"This partner account is suspended.","docs":"https:\/\/feeldb.resoftware.ai\/integrations\/docs#errors"}}},"error-validation_error":{"summary":"Malformed batch body","value":{"error":{"code":"validation_error","message":"Invalid request body.","docs":"https:\/\/feeldb.resoftware.ai\/integrations\/docs#errors"}}},"error-key_required":{"summary":"key_required","value":{"error":{"code":"key_required","message":"A publishable key is required: add ?pk=… (see docs)","docs":"https:\/\/feeldb.resoftware.ai\/integrations\/docs#errors"}}},"error-balance_exhausted":{"summary":"balance_exhausted","value":{"error":{"code":"balance_exhausted","message":"Prepaid balance exhausted","docs":"https:\/\/feeldb.resoftware.ai\/integrations\/docs#errors"}}},"error-origin_not_allowed":{"summary":"origin_not_allowed","value":{"error":{"code":"origin_not_allowed","message":"This key is not allowed from this origin","docs":"https:\/\/feeldb.resoftware.ai\/integrations\/docs#errors"}}},"error-addon_required":{"summary":"addon_required","value":{"error":{"code":"addon_required","message":"This add-on is not enabled for your key","docs":"https:\/\/feeldb.resoftware.ai\/integrations\/docs#errors"}}}}}}