Cultural analysis, ready for your application.

Query the Wokeometer catalog, published woke scores, cast, authors, and streaming availability through a read-only REST API.

One successful request uses one API credit. Buy credits at $0.05 each, with no subscription or automatic top-up.

Your first catalog request

# Keep this ID when retrying the curl command.
request_id="$(uuidgen)"
curl 'https://wokeometer.app/api/v1/media?type=movie&limit=5' \
  -H "Authorization: Bearer $WOKEOMETER_API_KEY" \
  -H "Idempotency-Key: $request_id"

Use keys on your server. Keep the same idempotency key when retrying the same request to avoid a second charge.

Quickstart

  1. Sign in to the developer dashboard, accept the API purchase terms, and buy a credit pack.
  2. Create an API key and save it in your server's secret manager. The full key is shown once. Each account can have up to 10 active keys.
  3. Send a GET request to https://wokeometer.app/api/v1 with Authorization: Bearer YOUR_KEY. The x-api-key header is also supported.

Never put API keys in browser code, mobile applications, URLs, or public repositories. This API reads existing data; it does not create or refresh analyses.

JavaScript (Node.js)
import { randomUUID } from 'node:crypto';

// Save this value if you need to retry this request.
const requestId = randomUUID();
const response = await fetch('https://wokeometer.app/api/v1/media?limit=5', {
  headers: {
    Authorization: `Bearer ${process.env.WOKEOMETER_API_KEY}`,
    'Idempotency-Key': requestId,
  },
});
if (!response.ok) throw new Error(await response.text());
console.log(await response.json());
Python (standard library)
import json, os, uuid
from urllib.request import Request, urlopen

# Save this value if you need to retry this request.
request_id = str(uuid.uuid4())
request = Request(
    'https://wokeometer.app/api/v1/media?limit=5',
    headers={
        'Authorization': 'Bearer ' + os.environ['WOKEOMETER_API_KEY'],
        'Idempotency-Key': request_id,
    },
)
with urlopen(request, timeout=30) as response:
    print(json.load(response))

Endpoints

All data endpoints return JSON and require an API key. Each resource supports GET /api/v1/RESOURCE and GET /api/v1/RESOURCE/UUID.

Available API resources
ResourceAvailable data
mediaMovies, TV shows and seasons, games, and books; catalog metadata, published analysis, and aggregate audience sentiment.
actorsPublic actor biographies and catalog identifiers.
authorsPublic book author profiles.
studiosPublic studio and production company metadata.
collectionsCollections and franchises in the catalog.

Media relationships

Use /api/v1/media/UUID/ followed by cast, authors, studios, platforms, score-history, or seasons. Each relationship page is a separate request.

Response format

Lists return data as an array and next_cursor as a UUID or null when there are no more results. Details return data as an object. Both include request_id and credits_charged. Catalog IDs are UUIDs; external source IDs are separate fields.

The X-Request-ID header identifies the current application request attempt for support. On a replay, the body keeps the original billed request_id. Keep both IDs when reporting a problem. Edge-generated errors may not include this header.

Detail fields
  • Media: id, title, media_type, release_date, woke_score, summary_reasoning, tldr, poster_url, overview, certification, genre_ids, slug, is_analyzed, last_updated, external_id, external_source, season_number, parent_id, tmdb_id, igdb_id, collection_id, original_language, audience_score, audience_rating_count, popularity, trailer_youtube_key, budget, revenue.
  • Actors: id, name, slug, tmdb_person_id, profile_path, biography, known_for_department.
  • Authors: id, name, slug, bio, photo_url, google_books_id.
  • Studios: id, name, slug, tmdb_company_id, logo_path, origin_country.
  • Collections: id, name, slug, tmdb_collection_id, poster_path, backdrop_path, overview.

Fields may be null when source data is unavailable. Lists use compact projections; request the detail endpoint for the full fields above.

Scores

Woke scores use the 0–10 scale. A null score means no score is available. Audience sentiment is provided as aggregate counts and ratings, without individual ratings or reviews.

The OpenAPI specification is free to access without an API key and describes the current response schemas.

Filters and pagination

List requests accept limit from 1 to 50 (default 20), and after as a UUID cursor. Keep your filters unchanged while paging and use the returned cursor for the next page. Relationship endpoints also accept limit and after.

Results are ordered by UUID, not relevance or date. Paging is not a fixed snapshot. The updated_since filter uses the media timestamp; it does not capture every metadata or relationship edit, or report deletions. Reconcile periodically if maintaining a local catalog.

Media filters

  • type: movie, tv, game, or book.
  • q: a title search between 3 and 100 characters.
  • min_score and max_score: scores from 0 to 10.
  • updated_since: an ISO 8601 timestamp, for example 2026-09-01T00:00:00Z.
  • parent_id or collection_id: a UUID from the catalog.
  • external_source and external_id: external catalog identifiers; supply both together.

Actors, authors, studios, and collections

Use q (3–100 characters) to search names, or slug for an exact slug match. Unsupported parameters return an error.

GET /api/v1/media?type=movie&min_score=0&max_score=3&limit=20
GET /api/v1/actors?q=Keanu
GET /api/v1/media?updated_since=2026-09-01T00%3A00%3A00Z

Credits and billing

API credits are separate from website analysis credits and Pro subscriptions. One successful GET request costs one credit ($0.05), including an empty results page. Each pagination request costs one credit. Errors and missing resources are not charged.

Prepaid API credit packs in US dollars
CreditsPrice (USD)
100$5
1,000$50
10,000$500

Buy credits through Stripe Checkout in your dashboard. Credits become available after payment confirmation and do not expire. There are no automatic top-ups: when your balance is exhausted, requests return 402.

When a payment is refunded, credits are removed in proportion to the amount refunded, rounded up to the next whole credit. Credits from a disputed purchase are held pending support review. Once the payment dispute is resolved, contact support to review restoration eligibility; it is not automatic.

Safe retries

Send an optional Idempotency-Key UUID for each logical request. For 24 hours, repeating it with the same account, API key, path, and query replays the saved successful result without another charge. Reusing it for a different request returns 409.

A replay returns the original response body, including its original credits_charged: 1. Read the X-API-Credits-Charged response header for the current call's charge: 0 for a replay, 1 for a newly billed request.

A connection can fail after a request is charged. Retry with the same idempotency key, path, and query. A new key or a request without this header can incur another charge.

Your account is limited to 60 requests per minute across its API keys. Cloudflare also limits each IP address to 60 requests per minute at each edge location, shared with other website API traffic from that address. Exceeding this limit triggers a 60-second cooldown. Keep retries bounded and respect Retry-After, or wait 60 seconds if that header is absent.

Errors

Responses are limited to 512,000 bytes. A 503 with code response_too_large requires a smaller list limit; repeating the same oversized request will not help. Contact support if a detail response exceeds the cap. No credit is charged for this error.

Application errors contain {"error":{"code":"…","message":"…"}}. Edge rate limits return {"error":"Too many requests. Retry in 60 seconds.","code":"rate_limited","retry_after":60}. Check the HTTP status before reading either format.

API HTTP error statuses
HTTP statusMeaning
400Invalid parameters or request. Correct the request before retrying.
401Missing, invalid, or revoked API key.
402Insufficient API credits. Add credits in your dashboard.
403API access is suspended.
404Resource or endpoint not found.
409Idempotency key conflicts with another request, or the original request is still processing.
429Rate limit reached. Respect Retry-After, or wait 60 seconds if absent.
503Service temporarily unavailable. Retry with the same idempotency key.

Data access and privacy

We keep private request diagnostics for 30 days, removed in bounded periodic cleanup batches: account/key identifiers, route template, filter names, outcome, charge/replay state, row/byte counts and duration. Diagnostics omit query values, request/response bodies, credentials and IP addresses. They cover admitted authenticated requests; validation, authentication and rate-limit rejections may not have a diagnostic record. Credit history is retained separately and can be paged in your dashboard.

The API exposes a defined set of catalog fields. It excludes user profiles, emails, individual votes and ratings, comments and review text, payment details, moderation data, and internal AI prompts or responses. It does not provide arbitrary database queries, writes, or CSV exports.

Access does not transfer ownership or grant a blanket redistribution license for third-party descriptions, artwork, or metadata. Review the terms of service, privacy policy, and applicable source rights before publishing or redistributing data.

Manage API keys and credits