Skip to content
JFSN

Developer

Open Archive API

Static JSON endpoints for every work in the archive. No key, no rate limit, no authentication — just plain files served over HTTPS. Stable URLs you can cite, link, and build on indefinitely.

Cataloged works
Total archive
Themes indexed
Last built
Base URLhttps://jfsn.com/api/v1/
All responses are Content-Type: application/json; charset=utf-8 with Access-Control-Allow-Origin: *. Safe to call from any browser or script.

Endpoints

GET https://jfsn.com/api/v1/meta.json Discovery & counts

Start here. Returns catalog metadata, all endpoint URLs, license, and citation string. Rebuild date is updated every time build_catalog.py runs.

{
  "api_version": "1",
  "generated": "2026-05-26T14:36:01Z",
  "artist": "Jeffrey F. S. Neumann",
  "counts": {
    "cataloged": 140,
    "total_including_stubs": 1084
  },
  "endpoints": {
    "works": "https://jfsn.com/api/v1/works.json",
    "work":  "https://jfsn.com/api/v1/works/{id}.json",
    … themes, series, motifs, palette
  },
  "license": "CC BY 4.0 — https://creativecommons.org/licenses/by/4.0/",
  "citation": "Jeffrey F. S. Neumann Archive. https://jfsn.com/api/v1/meta.json"
}
GET https://jfsn.com/api/v1/works.json All cataloged works

Full catalog as a JSON array wrapped in an envelope. Only includes works with complete metadata — excludes uncataloged stubs. Sorted by artwork ID (stable across rebuilds).

{
  "api_version": "1",
  "generated": "2026-05-26T14:36:01Z",
  "count": 140,
  "works": [
    {
      "file": "art0001.avif",
      "title": "Effigy in Red",
      "year": 1970,
      "work_type": "collage",
      "palette": ["vermilion", "gold", "ivory", "black"],
      "themes": ["Mr. Snowmann", "Totems"],
      … description, motifs, materials, series, keywords
    },
    … 139 more works
  ]
}
GET https://jfsn.com/api/v1/works/{id}.json Single work

Full metadata for a single work, with direct links to image assets. {id} is the zero-padded artwork identifier, e.g. art0001. These are the URLs to cite in papers, Wikipedia, or external databases — they will not change.

{
  "api_version": "1",
  "id": "art0005",
  "work": {
    "file": "art0005.avif",
    "title": "Dive",
    "year": 1990,
    "work_type": "collage",
    "description": "Two gold compact discs … ",
    "palette": ["gold", "black", "ivory"],
    "motifs": ["compact-disc", "warplane-topdown"],
    "themes": ["Mr. Snowmann", "Aviation"],
    "series": null,
    "keywords": ["dive-bomber-formation", "disc-halo"],
    "featured": false,
    "schema_version": "1"
  },
  "links": {
    "image": "https://jfsn.com/artworks/full/art0005.avif",
    "thumb": "https://jfsn.com/artworks/thumbs/art0005.avif",
    "mini":  "https://jfsn.com/artworks/mini/art0005.avif",
    "page":  "https://jfsn.com/artwork.html?id=art0005"
  }
}
GET https://jfsn.com/api/v1/themes.json Theme index

All 14 controlled themes with work counts and IDs. Sorted by frequency descending. Each entry includes the archive browse URL for that theme.

{
  "api_version": "1",
  "count": 14,
  "themes": [
    {
      "name": "Aviation",
      "slug": "aviation",
      "count": 60,
      "series_url": "https://jfsn.com/series.html?theme=Aviation",
      "work_ids": ["art0005", "art0006", "art0008", ]
    },
    … 13 more themes
  ]
}
GET https://jfsn.com/api/v1/series.json Named series

The three named bodies of work: XXIII, Squadron, and Guernica. Includes all member work IDs.

{
  "api_version": "1",
  "series": [
    {
      "name": "XXIII",
      "count": 38,
      "series_url": "https://jfsn.com/series.html?series=XXIII",
      "work_ids": []
    }
  ]
}
GET https://jfsn.com/api/v1/motifs.json  ·  palette.json Controlled vocabularies

Same structure as themes.json. motifs.json covers 30 motifs (e.g. compact-disc, warplane-topdown). palette.json covers 20 controlled colors (e.g. vermilion, gold, ultramarine). Each entry lists all work IDs where that term appears.

{
  "api_version": "1",
  "count": 30,
  "motifs": [
    {
      "name": "compact-disc",
      "slug": "compact-disc",
      "count": 101,
      "work_ids": []
    },
    
  ]
}

Work field reference

Field Description Type / values
fileAVIF filename, used as the stable record keystring — art{NNNN}.avif
titleWork title, max 4 words (evocative) or Untitled variantstring
yearYear extracted from visual evidence on the work; null if undatedinteger 1900–2100 or null
work_typeMediumcollage · sculpture · painting · photograph
descriptionTwo-sentence catalog prose, max 55 words, objective tonestring
paletteDominant colors, most prominent firstarray — 20-term controlled vocab, 3–5 items
motifsClearly identifiable recurring visual elementsarray — 30-term controlled vocab
materialsIdentifiable physical materialsarray — 15-term controlled vocab
compositionShort compositional description, max 8 wordsstring
themesIconographic and contextual themes, max 4array — 14-term controlled vocab
seriesNamed body of work membershipXXIII · Squadron · Guernica · null
keywordsSpecific long-tail search terms unique to this workarray, 2–4 items
featuredSelected for homepage display; set manuallyboolean
schema_versionSchema version for forward-compatibilitystring — currently "1"

Usage examples

curl

# All cataloged works
curl https://jfsn.com/api/v1/works.json

# Single work
curl https://jfsn.com/api/v1/works/art0005.json

# All Aviation works
curl https://jfsn.com/api/v1/themes.json \
  | jq '.themes[] | select(.name=="Aviation") | .work_ids'

JavaScript (fetch)

// Fetch a single work
const res = await fetch(
  'https://jfsn.com/api/v1/works/art0005.json'
);
const { work, links } = await res.json();

// All Aviation works
const t = await fetch(
  'https://jfsn.com/api/v1/themes.json'
).then(r => r.json());
const aviation = t.themes.find(
  x => x.name === 'Aviation'
);

Python

import requests, json

# List all works with palette including 'gold'
works = requests.get('https://jfsn.com/api/v1/works.json').json()['works']
gold_works = [w for w in works if 'gold' in w.get('palette', [])]
print(f"{len(gold_works)} works featuring gold")

# Download metadata for a specific work
work = requests.get('https://jfsn.com/api/v1/works/art0001.json').json()
print(work['work']['title'], '—', work['work']['description'])

Versioning & stability

URL stability guarantee — the path https://jfsn.com/api/v1/works/{id}.json will exist for as long as this archive exists. Artwork IDs are never reassigned or deleted; new works get new IDs.
Schema versioning — every response includes "api_version": "1". If the schema changes incompatibly, a new /api/v2/ path is introduced; v1 is kept frozen. The schema_version inside each work record tracks the AI cataloging schema independently.
No rate limits — all endpoints are static files served from CDN edge nodes. There is no server-side processing; you cannot overload it. Cache-Control headers suggest 1-hour freshness.

License & citation

Catalog metadata (titles, descriptions, themes, keywords, dates) is released under CC BY 4.0. You may use, redistribute, and build upon it freely with attribution. The artwork images themselves remain copyright Jeffrey F. S. Neumann — contact for licensing.

Suggested citation

Jeffrey F. S. Neumann Archive (jfsn.com). Catalog metadata, CC BY 4.0.
Retrieved from https://jfsn.com/api/v1/meta.json, [date accessed].