---
title: "Read one public image template or opt-in GIF template"
method: GET
path: "/api/templates/{slug}"
tags: ["templates"]
---

# Read one public image template or opt-in GIF template

`GET /api/templates/{slug}`

The path remains the canonical slug for compatibility. Pass the stable id returned by search in the id query parameter for collision-free exact lookup. Pass mediaType=gif to read a GIF template with GIF metadata.

## Path parameters

- `slug` string, required

## Query parameters

- `id` string
- `mediaType` 'image' | 'gif' | 'all'

## Response `200`

Template details

- PublicTemplateMediaItem
  - `id` string, required — Opaque public identity used for deduplication and exact detail lookup.
  - `sourceTemplateId` string, nullable, required — Stored source identity, preserved without slug normalization.
  - `variantOf` string, nullable
  - `slug` string, required — Canonical URL and publishing slug. Use this field, not id, with legacy publishing APIs.
  - `name` string, required
  - `description` string, required
  - `mediaType` 'image' | 'gif' — Present for explicit mediaType requests; omitted by legacy default image routes.
  - `imageUrl` string, required
  - `sourceUrl` string, required
  - `canonicalUrl` string, required
  - `detailUrl` string, required
  - `exampleImageUrl` string, nullable
  - `previewImageUrl` string
  - `posterImageUrl` string
  - `width` number, nullable, required
  - `height` number, nullable, required
  - `captionCount` integer, required
  - `boxCount` integer, required
  - `captions` MemeCaption[], required
    - `id` string, required
    - `text` string, required
    - `x` number, required
    - `y` number, required
    - `fontSize` number, required
    - `rotationDeg` number
    - `hidden` boolean
    - `locked` boolean
    - `boxWidthPct` number
    - `boxHeightPct` number
    - `paddingPct` number
    - `maxLines` integer
    - `lineHeight` number
    - `backgroundEnabled` boolean
    - `backgroundColor` string
    - `backgroundOpacity` number
    - `letterSpacingEm` number
    - `shadowStrength` number
    - `color` string
    - `stroke` string
    - `fontFamily` 'impact' | 'arial' | 'poster'
    - `textAlign` 'left' | 'center' | 'right'
    - `semanticRole` 'setup' | 'contrast' | 'punchline' | 'reaction' | 'label'
    - `preferredCase` 'uppercase' | 'sentence' | 'title' | 'preserve'
    - `exampleText` string
    - `recommendedWordsMin` integer
    - `recommendedWordsMax` integer
    - `recommendedCharsMin` integer
    - `recommendedCharsMax` integer
  - `tags` string[], required
  - `categories` string[]
  - `assetContentType` string
  - `animated` boolean
  - `durationMs` integer, nullable
  - `frameCount` integer, nullable
  - `assetBytes` integer, nullable
  - `qualityStatus` 'approved' | 'quarantined' | 'rejected' | 'pending'

## Other responses

- `400` — Invalid slug or stable id
- `404` — Template not found

---

[API](https://skmtc.net/memesio/apis/memesio-api-contracts.md) · [All operations](https://skmtc.net/memesio/apis/memesio-api-contracts/llms.txt) · [OpenAPI document](https://skmtc-service-staging.skmtc.workers.dev/v1/apis/memesio/memesio-api-contracts/revisions/826e6edbf294/schema)
