Data API Documentation

Every endpoint below is a static file generated at build time and served from a CDN. There is no authentication, no API key, and no rate limit beyond the CDN’s own protections. U.S. government source documents are generally public domain (17 U.S.C. §105); this catalog’s metadata is provided as-is. Cataloged by the independent UAP Records Archive — not an official or government source.

Endpoints

URL Format Contents Count / source of truth
/uap/data/uap-records.json application/json Full record catalog: dataset name, license, disclaimer, count, records[] (fields below). All published records — the payload’s own count field is the source of truth (80 at time of writing).
/uap/data/uap-records.csv text/csv Same catalog flattened to one row per record; header row id,title,agencyId,recordType,decade,status,topics,officialLandingUrl,sourceUrl,archiveUrls,disclaimer. Array fields are ;-joined. All published records — one data row per record.
/uap/data/uap-records.bib text/plain (BibTeX) Bulk citation export: one BibTeX entry per record, linking the archive page and the source landing page. All published records — one entry per record.
/uap/data/uap-records.ris text/plain (RIS) Bulk citation export in RIS, importable by Zotero / EndNote. All published records — one entry per record.
/uap/data/uap-media.json application/json Inventory of media hosted on this site (videos, documents, images, audio): dataset name, license, disclaimer, count, media[] with type, record, url, label (and poster for video items). All hosted media items — see the payload’s count field.
/uap/data/uap-media.csv text/csv Same inventory as CSV; header row type,record,url,label,disclaimer. All hosted media items — one data row per item.
/uap/data/checksums.txt text/plain (sha256sum) SHA-256 checksums for every dataset artifact and feed above, regenerated on each build; sha256sum -c compatible. Also available as JSON at /uap/data/checksums.json ({ generated, algorithm, files }). One line / entry per dataset artifact (12 files).
/feed.xml application/rss+xml (RSS 2.0) Site-wide feed: one item per published record (title, link, description). All published records.
/feed.json application/feed+json (JSON Feed 1.1) Same feed as JSON Feed 1.1; items carry external_url pointing at the source landing page where available. All published records.
/feed/{agencyId}.xml application/rss+xml (RSS 2.0) Per-agency feed, filtered to one agency’s records. agencyId is one of: aaro, nara, nasa, odni (e.g. /feed/nara.xml). Published records of that agency only.
/uap/records/{id}.json application/json Single record by id: record (fields below), canonical page URL, license, disclaimer. See example payload below. One endpoint per published record; ids match the id field in uap-records.json.
/search-index.json application/json (array) Build-time search index over catalog pages (records, agencies, timeline; en + zh): id, collection, title, slug, url, locale, description, agency, type, decade, status, topics. One entry per searchable catalog page — the array length is the count.
/data.json application/json (DCAT) Project Open Data / DCAT catalog metadata describing the datasets above — discovery metadata for data portals, not record data itself. One catalog document.
/pagefind/ pagefind index (fragmented, on-demand) Full-text inverted index over reviewed extracts and machine-extracted document texts, chunked per source page. Powers the site search; consumable from any page via the pagefind JS API (/pagefind/pagefind.js). Replaced the former monolithic /doc-search-index*.json endpoints (retired 2026-06-12). Fragmented — the browser loads only the fragments a query needs.
/uap/data/cases.json application/json Case layer: verbatim official case designations (PURSUE file titles, quoted AARO record titles) with their grouped hosted assets (documents, videos, images, audio, records) and verbatim incident dates/locations from the official catalog. Groups by official designation only; asserts no conclusions. The top-level "count" field (one entry per official case designation).

Per-record endpoint

Each published record is also available as a standalone JSON file at /uap/records/{id}.json. Example — /uap/records/aaro-mission.json (truncated):

{
  "record": {
    "id": "aaro-mission",
    "title": "AARO Mission & Agency Page",
    "agencyId": "aaro",
    "recordType": "agency_landing",
    "decade": "2020s",
    "status": "official_link_only",
    "topics": [
      "agency-position-page",
      "aaro-case-resolution"
    ],
    "officialLandingUrl": "https://www.aaro.mil/",
    "sourceUrl": "https://www.aaro.mil/",
    "archiveUrls": ["…"]
  },
  "canonical": "https://uap-archive.org/uap/records/aaro-mission/",
  "license": "…",
  "disclaimer": "…"
}

Record field reference

The record object is identical in uap-records.json, uap-records.csv, and the per-record endpoint.

id
Unique slug identifier for the record (also the {id} of the per-record endpoint).
title
Short descriptive title of the record.
agencyId
Identifier of the originating agency. One of: nara, nasa, odni, aaro.
recordType
Category of the record. One of: agency_landing, collection_landing, report_landing, imagery_landing.
decade
Decade of the source document. One of: 1940s, 1970s, 1980s, 2000s, 2010s, 2020s.
status
Verification status in this archive release. One of: official_link_only, needs_review.
topics
Topic tags from the archive’s controlled vocabulary (string array in JSON; ;-joined in CSV). May be empty.
officialLandingUrl
URL of the official landing page for the source document.
sourceUrl
Direct URL to the source document (PDF, video, or web page).
archiveUrls
Third-party archive copies, e.g. Wayback Machine (string array in JSON; ;-joined in CSV). May be empty.

Usage examples

curl

# Full record catalog (JSON; payload carries license, disclaimer, count, records[])
curl -s https://uap-archive.org/uap/data/uap-records.json

# One record by id
curl -s https://uap-archive.org/uap/records/aaro-mission.json

# RSS feed for one agency (aaro | nara | nasa | odni)
curl -s https://uap-archive.org/feed/nasa.xml

JavaScript (fetch)

const res = await fetch('https://uap-archive.org/uap/data/uap-records.json');
const { count, records } = await res.json();
const reports = records.filter((r) => r.recordType === 'report_landing');
console.log(count, 'records total;', reports.length, 'report landing pages');

License & attribution

U.S. government source documents are generally public domain (17 U.S.C. §105); this catalog’s metadata is provided as-is.

Cataloged by the independent UAP Records Archive — not an official or government source.