---
title: "Images by id (Tenor v2-compatible)"
method: GET
path: "/v2/posts"
tags: ["Developer API"]
---

# Images by id (Tenor v2-compatible)

`GET /v2/posts`

## Request

- Base URL: `https://api.memestack.ai`
- URL: `https://api.memestack.ai/v2/posts`
- Auth: one of:
  - API key in query parameter `key`
  - API key in header `X-API-Key`

Up to 50 images by id, in the order asked; an unknown or unpublished id is left out. A by-id read always answers and carries memestack.controversial. Counts against your quota (the free 100 calls a day, else your packs); only a 2xx answer counts — any other answer gives the call back.

## Query parameters

- `ids` string, required
- `media_filter` string

## Response `200`

Results.

- object
  - `results` TenorResult[]
    - `id` string, uuid, required
    - `title` string
    - `content_description` string
    - `created` number: Unix seconds.
    - `itemurl` string, uri
    - `url` string, uri
    - `tags` string[]
    - `flags` 'static', required
    - `hasaudio` boolean
    - `hascaption` boolean
    - `bg_color` string
    - `media_formats` object, required: Keys: gif, mediumgif, tinygif, nanogif, preview, and one of png / jpg / webp. Filtered by media_filter.
    - `memestack` object: MemeStack extensions: caption, alt_text, ocr_text, width, height, mime_type, match (strong|closest|null), controversial, ai_generated, meme_template, source_url (https only), page_url, attribution {text, url}, rights (what you may do with the image), chart (chart facts, when known), similarity (reverse search).
      - `match` 'strong' | 'closest' | 'null', nullable: strong = evidence the image answers the query; closest = the nearest miss, served after the strong ones; null when the answer carries no labels (featured, posts, reverse search).
      - `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.

## Other responses

- `400`: INVALID_ARGUMENT — a missing or malformed parameter (reason names it).
- `401`: UNAUTHENTICATED — no key (API_KEY_MISSING) or a key that does not exist (API_KEY_INVALID).
- `403`: PERMISSION_DENIED — a revoked key (API_KEY_REVOKED) or a suspended account (ACCOUNT_SUSPENDED).
- `429`: RESOURCE_EXHAUSTED — QUOTA_EXHAUSTED (the free calls or the packs are used up; Retry-After = seconds to 00:00 UTC) or RATE_LIMITED (a burst cap; Retry-After).
- `503`: UNAVAILABLE — temporarily unavailable; retry after Retry-After.

---

[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)
