---
title: "Get image metadata"
method: GET
path: "/v1/images/{id}/meta"
tags: ["Images"]
---

# Get image metadata

`GET /v1/images/{id}/meta`

## Request

- Base URL: `https://api.memestack.ai`
- URL: `https://api.memestack.ai/v1/images/{id}/meta`
- Auth: none declared

Public image metadata. Authenticated callers additionally get the per-viewer overlay fields (user_reported, user_claim_status); anonymous callers get false/null for them. Per-viewer, so never publicly cacheable.

## Path parameters

- `id` string, uuid, required

## Response `200`

Image metadata

- object
  - `id` string, uuid
  - `uploader_id` string
  - `status` 'pending' | 'approved' | 'needs_review' | 'rejected'
  - `mime_type` string
  - `size` integer: Bytes of the original upload.
  - `width` integer: Width of the ORIGINAL upload, not of the canonical or thumbnail bytes.
  - `height` integer: Height of the ORIGINAL upload.
  - `thumb_width` integer
  - `thumb_height` integer
  - `caption` string, nullable
  - `alt_text` string, nullable
  - `tags` ScoredTag[], nullable: Controlled tags — objects, never bare strings.
    - `tag` string, required: The tag's slug.
    - `name` string: The tag's display name.
    - `score` integer, required: How prominent the tag is in the image, 1 to 10.
  - `free_tags` ScoredTag[], nullable: Free (AI-written) tags — objects, never bare strings. Disjoint from `tags`.
    - `tag` string, required: The tag's slug.
    - `name` string: The tag's display name.
    - `score` integer, required: How prominent the tag is in the image, 1 to 10.
  - `text_in_image` string, nullable: The text printed inside the image (OCR).
  - `meme_template_name` string, nullable: The meme template the image matched, if any.
  - `meme_template_id` string, uuid, nullable
  - `source_url` string, nullable: Where an imported image came from: a URL for a publisher import (Our World in Data, Eurostat, …), a prefix such as `imgflip:` or `telegram:` otherwise; null for a direct upload.
  - `zap_count` integer
  - `zap_total_sats` union: Total sats zapped to the image. A 64-bit counter, serialised as a decimal STRING by most routes — parse it, do not assume a JSON number.
    - string
    - integer
  - `save_count` integer
  - `like_count` integer
  - `view_count` integer: Views in the last 30 days.
  - `view_count_total` integer: Views older than 30 days; add `view_count` for all recorded views.
  - `attribution_url` string, nullable
  - `attribution_name` string, nullable
  - `uploader_display_name` string, nullable
  - `uploader_pubkey` string, nullable
  - `uploader_has_avatar` boolean
  - `uploader_is_creator` boolean: Whether the uploader is a Verified Creator now.
  - `uploaded_as_creator` boolean: Whether the image was uploaded as the uploader's own work.
  - `uploader_website_url` string, nullable: The uploader's own website URL — populated only for Verified Creator uploads (null otherwise).
  - `uploader_accepts_zaps` boolean: Whether the uploader can be zapped: they have a Lightning address on their profile, or they are a system uploader (zaps on imported content go to the platform's address). Absent when the row was not joined to its uploader; treat absent as enabled.
  - `controversial` boolean: True when the image is classified controversial. Such images appear only with `content=all`.
  - `is_ai_generated` boolean
  - `has_thumbnail` boolean
  - `has_canonical` boolean: False when the original already fits the canonical size, so /canonical serves the original bytes.
  - `has_social_card` boolean
  - `mutation_group_id` string, uuid, nullable: The variant group of a meme with tracked variants.
  - `is_dominant` boolean: Whether this is the variant group's representative image.
  - `chart` ChartMeta: Chart metadata for an image (spec 2026-09-19 chart-metadata §2.1, extended by spec 2026-09-25 chart sources §4 for series editions). Present on `/meta` only when MemeStack holds a stored chart-metadata row for the image; every field mirrors packages/shared/src/chart-meta.ts's ChartMetaPublic.
    - `source` string: The upstream source key, e.g. 'owid', 'usda_ers', 'eurostat', 'eea'.
    - `provenance` 'authoritative' | 'extracted': 'authoritative' when the publisher's own metadata proved the fields; 'extracted' when a grounded-LLM pass derived them.
    - `title` string, nullable
    - `unit` string, nullable
    - `regions` string[]
    - `citation_short` string, nullable
    - `citation_long` string, nullable
    - `source_url` string, nullable
    - `dataset_ids` integer[]: Upstream indicator ids (e.g. OWID's owidVariableId).
    - `render_view` string, nullable: The chart type actually rendered, e.g. 'LineChart', 'map'. Publisher rows carry null (no grapher view).
    - `coverage_kind` 'single_year' | 'range' | 'unknown'
    - `rendered_period` object, nullable: A PROVEN period, grounded on the image's own OCR title text. Null when the period could not be proven — never guessed from the dataset's wider history.
      - `start` integer
      - `end` integer
      - `evidence` string: The OCR substring the period claim was grounded on.
    - `dataset_timespan` object, nullable: The INDICATOR's full history — display only. Never a period claim about what THIS image shows; use rendered_period for that.
      - `start` integer, nullable
      - `end` integer, nullable
      - `raw` string, nullable
    - `snapshot_fetched_at` string, date-time
    - `data_last_updated` string, nullable: YYYY-MM-DD
    - `data_next_update` string, nullable: YYYY-MM-DD
    - `upstream_last_updated` string, nullable: YYYY-MM-DD
    - `upstream_checked_at` string, date-time, nullable
    - `superseded` boolean: True when the upstream source has published data newer than this snapshot.
    - `indicators` object[]
      - `title` string, nullable
      - `description` string, nullable
      - `unit` string, nullable
      - `timespan` string, nullable
    - `series_key` string, nullable: Editions of one chart (e.g. the same indicator republished in a later year) share this key. Null when the row is not part of a series.
    - `published_at` string, nullable: The publisher's release date for this edition, YYYY-MM-DD.
    - `series` object[]: Every visible edition of this chart's series, newest first — attached by /meta only, and only when series_key is present. Safe mode, at most 20.
      - `id` string, uuid
      - `rendered_period` object, nullable
        - `start` integer
        - `end` integer
      - `published_at` string, nullable
  - `rights` ImageRights: What an integrator may do with an image, from what MemeStack truly knows — `unknown` wherever it knows nothing, never a guess. `publisher` = imported from a licence-clean publisher (Our World in Data, USDA ERS, Eurostat, EEA; `publisher_only=true` returns only these); `creator` = a Verified Creator's own upload (all rights reserved); `community` = everything else — uploads (including the operators' own uploads of other people's memes and charts), Telegram, X and 4chan saves, Imgflip templates, AI-generated and agent-submitted images: MemeStack grants no licence to them. Commercial use is `yes` only for USDA ERS, Eurostat and EEA charts, whose importer admits only the publisher's own material; Our World in Data is `unknown` because a chart may plot third-party data under its own terms (some non-commercial).
    - `source` 'publisher' | 'creator' | 'community', required
    - `publisher` object, nullable, required: The publisher of a `publisher` image; null otherwise.
      - `key` 'owid' | 'usda_ers' | 'eurostat' | 'eea'
      - `name` string
    - `license` 'CC-BY-4.0' | 'US-PD' | 'all-rights-reserved' | 'null', nullable, required: Machine id of the licence; `US-PD` = U.S. federal public domain. Null = MemeStack knows of no licence.
    - `license_name` string, nullable, required: Human label, e.g. "CC BY 4.0".
    - `license_url` string, uri, nullable, required: The licence text, or MemeStack's creator terms for creator work.
    - `attribution` string, required: The credit line to show beside the image: for a publisher chart the line its licence asks for; otherwise where the image came from, never who owns it.
    - `attribution_required` boolean, required: True when the licence or the rights holder requires the credit (publisher charts, creator work).
    - `commercial_use` 'yes' | 'no' | 'unknown', required
    - `note` string, nullable, required: The one condition or caveat that changes what you may do (e.g. CC BY's notice of MemeStack's changes, or OWID's third-party data), or null.
  - `created_at` string, date-time
  - `updated_at` string, date-time
  - `user_claim_status` 'pending', nullable: 'pending' when the authenticated caller has an open work claim on this image; null otherwise, and always null for anonymous callers.

## Other responses

- `404`: Image not found

---

[API](https://skmtc.dev/memestack/apis/memestack-api.md) · [All operations](https://skmtc.dev/memestack/apis/memestack-api/llms.txt) · [OpenAPI document](https://skmtc.dev/memestack/apis/memestack-api/revisions/9d3a19565f75?raw)
