Catalog · GET /images/{id} · POST /images/batch

Image detail & batch metadata

Resolve a single asset with GET https://epochalstock.com/api/v1/images/{image_id} or load up to 100 unique IDs with POST https://epochalstock.com/api/v1/images/batch in one authenticated request. Responses include catalog fields plus thumbnail_url and watermarked preview_url—original filesystem paths are never returned.

Overview

After discovery via GET /images, design apps typically store image IDs and fetch full records when a user focuses a card, opens an inspector, or prepares an export. Use the single-image endpoint for one-off lookups; use batch when a selection, cart, or layout holds many IDs.

Complete metadata

ID, slug, title, description, collection, dimensions, size, extension, tags, timestamps, and safe preview URLs.

Batch = one request

1–100 unique IDs count as a single API call toward the 30 requests/minute account limit.

Partial matches

Missing IDs are omitted. requested and found make incomplete sets explicit.

No original paths

Originals are delivered only through the two-step download flow—never as static file paths in metadata.

Requires a valid Bearer key. See Authentication for header format and key lifecycle.

GET /images/{image_id}

Returns the complete catalog record for one image. Unknown IDs return HTTP 404 with image_not_found.

Item Value
Method / path GET /images/{image_id}
Full URL example https://epochalstock.com/api/v1/images/es_001_example
Auth Authorization: Bearer … + Accept: application/json
Path parameter image_id — stable catalog identifier (string)
Success HTTP 200 · image object under data
Not found HTTP 404 · image_not_found

The response includes ID, slug, title, description, collection, width, height, file size, file extension, tags, creation time, thumbnail URL, and watermarked preview URL. Original filesystem paths are never exposed.

Field reference

Field names below match the shape used across list, detail, and batch responses. Treat any additional fields as optional and ignore unknown keys for forward compatibility.

Field Type Description
id string Stable image identifier. Use this for batch, downloads, and local caches.
slug string URL-friendly label for human-readable UI routes (not a substitute for id).
title string Display title.
description string Longer catalog description suitable for inspectors and accessibility copy.
collection string Collection or category label within the catalog.
width integer Original pixel width.
height integer Original pixel height.
file_size integer Original file size in bytes (when provided).
file_extension string File type extension such as jpg or png.
tags string[] Normalized tags attached to the image.
created_at string (ISO-8601) Catalog creation / index timestamp for the asset.
thumbnail_url string (URL) Small preview safe for grids and pickers.
preview_url string (URL) Larger watermarked preview for canvas/inspector UIs.

Security: Do not expect or request original disk paths. Fetch binaries only via POST /downloads (mint a short-lived token) then GET /downloads/{token}.

POST /images/batch

Accepts 1–100 unique image IDs and counts as one API request. Missing IDs are omitted from the result set; use requested and found to detect partial matches.

Item Value
Method / path POST /images/batch
Content-Type application/json
Body {"ids":["es_001_example","es_002_example"]}
ids Array of strings · min 1 · max 100 · unique items required
Rate limit impact Counts as ONE authenticated request (not one per ID)
Missing IDs Omitted from the returned images; not fatal for the whole call

Batch response fields

Field Type Description
images object[] Found image records (same field shape as GET one).
requested integer Number of IDs submitted after validation.
found integer Number of records returned. If found < requested, some IDs were missing.
  • Deduplicate IDs client-side before calling; the schema expects unique items.
  • Chunk selections larger than 100 into sequential batch calls.
  • Do not treat a partial batch as a hard error—update UI for missing assets and continue.
  • Invalid body shape (empty array, >100, non-unique) returns validation errors (HTTP 422).

Single vs batch efficiency

At the account limit of 30 requests per minute, N individual GET detail calls cost N requests. One batch call resolves up to 100 IDs for the price of a single request—critical for selection panels and multi-asset layouts.

When to use GET one

Deep-link open, inspector refresh, cache miss for a single asset, webhook-style callbacks with one ID.

When to use batch

Multi-select toolbars, board/layout hydration, shopping-cart style export lists, rehydrate local caches after offline work.

Combine with search

List with GET /images, store IDs, then batch-fill details only when the UI needs them.

Then download

Mint tokens serially via downloads—one concurrent original transfer per account.

Code examples · get one image

Load complete metadata for es_001_example. Read the API key from the environment only.

cURL
curl -sS "https://epochalstock.com/api/v1/images/es_001_example" \
  -H "Authorization: Bearer $EPOCHAL_API_KEY" \
  -H "Accept: application/json"

Code examples · batch metadata

Resolve multiple IDs in one request. Compare found to requested before assuming every ID exists.

cURL
curl -sS -X POST "https://epochalstock.com/api/v1/images/batch" \
  -H "Authorization: Bearer $EPOCHAL_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Accept: application/json" \
  -d '{"ids":["es_001_example","es_002_example"]}'

Sample JSON responses

GET /images/{image_id}

Successful detail payload. Original paths are never included.

{
  "data": {
    "id": "es_001_example",
    "slug": "golden-forest-canopy",
    "title": "Golden Forest Canopy",
    "description": "Sunlit woodland canopy with warm gold highlights.",
    "collection": "nature",
    "width": 6000,
    "height": 4000,
    "file_size": 4821934,
    "file_extension": "jpg",
    "tags": ["nature", "trees", "forest", "gold"],
    "created_at": "2025-11-02T14:22:10Z",
    "thumbnail_url": "https://epochalstock.com/…/thumb.jpg",
    "preview_url": "https://epochalstock.com/…/preview.jpg"
  },
  "meta": {
    "request_id": "req_01HZX…"
  }
}

POST /images/batch

Two IDs requested; one missing. found is 1 and only the existing record appears in images.

{
  "data": {
    "images": [
      {
        "id": "es_001_example",
        "slug": "golden-forest-canopy",
        "title": "Golden Forest Canopy",
        "description": "Sunlit woodland canopy with warm gold highlights.",
        "collection": "nature",
        "width": 6000,
        "height": 4000,
        "file_size": 4821934,
        "file_extension": "jpg",
        "tags": ["nature", "trees", "forest", "gold"],
        "created_at": "2025-11-02T14:22:10Z",
        "thumbnail_url": "https://epochalstock.com/…/thumb.jpg",
        "preview_url": "https://epochalstock.com/…/preview.jpg"
      }
    ],
    "requested": 2,
    "found": 1
  },
  "meta": {
    "request_id": "req_01HZY…"
  }
}

Next steps

  • Discover candidates with GET /images search, tags, and cursors.
  • Hydrate multi-select UIs with POST /images/batch instead of N detail calls.
  • Show thumbnail_url / watermarked preview_url in editors; never assume originals are public URLs.
  • Export full-resolution files through the two-step download flow.
  • Log meta.request_id / X-Request-ID when debugging 404s or partial batches.