Every API here is available over the APIs.io API and to AI agents over MCP.
openapi: 3.1.0
info:
title: ODNI Public Content API (WordPress REST)
version: wp/v2
summary: The anonymous, read-only WordPress REST API serving www.odni.gov content — newsroom posts, site pages,
and the ODNI publications/downloads catalog.
description: 'The Office of the Director of National Intelligence publishes no developer program, no API documentation
and no machine-readable specification of its own. Its public website, www.odni.gov, runs on WordPress and serves
the standard WordPress REST API anonymously, and that surface is a real, callable, machine-readable read API
over ODNI content: 156 newsroom posts (press releases, remarks, interviews and reports), the site''s structural
pages, the media library, and — most usefully — the Download Monitor catalog of ODNI publications (transparency
reports, Annual Threat Assessments, IC directives, NCTC counterterrorism guides and declassified releases).
THIS DOCUMENT IS DERIVED, NOT PUBLISHED BY ODNI. Every path, method, parameter and parameter schema below comes
from the live WordPress route discovery document at https://www.odni.gov/?rest_route=/ , saved verbatim alongside
this file as director-of-national-intelligence-wp-routes-original.json (205 routes). Every path listed here
was individually confirmed to return HTTP 200 to an unauthenticated request on 2026-09-06; the confirming URL
and status are recorded on each operation as x-verified.
ACCESS QUIRK — THE PRETTY ROUTE IS BLOCKED AT THE EDGE. The canonical WordPress REST root https://www.odni.gov/wp-json/
and every path beneath it are answered with HTTP 301 to the site homepage by the site''s Akamai edge, so the
usual base URL does not work. The API is reachable only through WordPress''s alternate query-string route form:
prefix each path below with https://www.odni.gov/?rest_route= — for example https://www.odni.gov/?rest_route=/wp/v2/posts&per_page=3
. The second entry in servers[] is that working prefix. The same edge answers every unknown path (including
/.well-known/*, /llms.txt and /openapi.json) with a 302 to the homepage, and rejects browser-shaped User-Agent
strings with 403 while allowing plain clients through.
WRITE METHODS AND ADMINISTRATIVE NAMESPACES ARE DELIBERATELY EXCLUDED. The route index advertises POST/PUT/PATCH/DELETE
and the wp/v2 administrative surface (settings, plugins, themes, widgets, templates, application-passwords)
plus plugin namespaces (download-monitor/v1, simple-history/v1, block-visibility/v1, wpchill/v1, duplicate-post/v1,
health-check/v1, wp-site-health/v1, wp-block-editor/v1, optimization-detective/v1, pgc_simply_gallery/v2). Those
exist on the host but require authentication — /wp/v2/settings returns 401 rest_forbidden anonymously, and collection
responses carry Allow: GET — so they are not a public API and are not modelled here. This is a content API.
It is not an intelligence-data API: no intelligence holdings, reporting or classified material is reachable
through it.'
contact:
name: ODNI Public Affairs
url: https://www.odni.gov/get-in-touch/
license:
name: U.S. Government Work (17 U.S.C. Sec. 105) — see ODNI website policies
url: https://www.odni.gov/policies/
x-provenance:
method: derived
source: https://www.odni.gov/?rest_route=/
derived: '2026-09-06'
verbatim_source_file: openapi/director-of-national-intelligence-wp-routes-original.json
note: Derived by API Evangelist from the live WordPress route discovery document served by www.odni.gov. Not
authored, published or endorsed by ODNI.
servers:
- url: https://www.odni.gov/wp-json
description: Canonical WordPress REST root. NOT CALLABLE as of 2026-09-06 — the Akamai edge answers 301 to https://www.odni.gov/
for /wp-json and every path beneath it.
- url: https://www.odni.gov/?rest_route=
description: Working prefix. WordPress's alternate query-string route form; concatenate the operation path directly
after this URL (https://www.odni.gov/?rest_route=/wp/v2/posts). Verified 200 on 2026-09-06.
security:
- {}
tags:
- name: News
description: ODNI newsroom posts — press releases, remarks, interviews and reports.
- name: Publications
description: The Download Monitor catalog of published ODNI documents.
- name: Pages
description: Structural site pages.
- name: Media
description: Media library uploads.
- name: Taxonomy
description: Categories and tags classifying news and publications.
- name: Search
description: Cross-type site search.
- name: Discovery
description: Content types, taxonomies, statuses, authors and oEmbed.
paths:
/wp/v2/posts:
get:
operationId: listPosts
summary: List ODNI news posts
description: Press releases, remarks, reports and interviews published to the ODNI newsroom. 156 records at
the time of harvest; classified with the `categories` taxonomy (press-releases, remarks, reports, interviews).
tags:
- News
security:
- {}
parameters:
- name: after
in: query
description: Limit response to posts published after a given ISO8601 compliant date.
required: false
schema:
type: string
format: date-time
- name: author
in: query
description: Limit result set to posts assigned to specific authors.
required: false
schema:
type: array
items:
type: integer
default: []
- name: author_exclude
in: query
description: Ensure result set excludes posts assigned to specific authors.
required: false
schema:
type: array
items:
type: integer
default: []
- name: before
in: query
description: Limit response to posts published before a given ISO8601 compliant date.
required: false
schema:
type: string
format: date-time
- name: categories
in: query
description: Limit result set to items with specific terms assigned in the categories taxonomy.
required: false
schema:
type: object
- name: categories_exclude
in: query
description: Limit result set to items except those with specific terms assigned in the categories taxonomy.
required: false
schema:
type: object
- name: context
in: query
description: Scope under which the request is made; determines fields present in response.
required: false
schema:
type: string
enum:
- view
- embed
- edit
default: view
- name: exclude
in: query
description: Ensure result set excludes specific IDs.
required: false
schema:
type: array
items:
type: integer
default: []
- name: format
in: query
description: Limit result set to items assigned one or more given formats.
required: false
schema:
type: array
items:
type: string
enum:
- standard
- aside
- chat
- gallery
- link
- image
- quote
- status
- video
- audio
- name: ignore_sticky
in: query
description: Whether to ignore sticky posts or not.
required: false
schema:
type: boolean
default: true
- name: include
in: query
description: Limit result set to specific IDs.
required: false
schema:
type: array
items:
type: integer
default: []
- name: modified_after
in: query
description: Limit response to posts modified after a given ISO8601 compliant date.
required: false
schema:
type: string
format: date-time
- name: modified_before
in: query
description: Limit response to posts modified before a given ISO8601 compliant date.
required: false
schema:
type: string
format: date-time
- name: offset
in: query
description: Offset the result set by a specific number of items.
required: false
schema:
type: integer
- name: order
in: query
description: Order sort attribute ascending or descending.
required: false
schema:
type: string
enum:
- asc
- desc
default: desc
- name: orderby
in: query
description: Sort collection by post attribute.
required: false
schema:
type: string
enum:
- author
- date
- id
- include
- modified
- parent
- relevance
- slug
- include_slugs
- title
default: date
- name: page
in: query
description: Current page of the collection.
required: false
schema:
type: integer
minimum: 1
default: 1
- name: per_page
in: query
description: Maximum number of items to be returned in result set.
required: false
schema:
type: integer
minimum: 1
maximum: 100
default: 10
- name: search
in: query
description: Limit results to those matching a string.
required: false
schema:
type: string
- name: search_columns
in: query
description: Array of column names to be searched.
required: false
schema:
type: array
items:
type: string
enum:
- post_title
- post_content
- post_excerpt
default: []
- name: search_semantics
in: query
description: How to interpret the search input.
required: false
schema:
type: string
enum:
- exact
- name: sticky
in: query
description: Limit result set to items that are sticky.
required: false
schema:
type: boolean
- name: tags
in: query
description: Limit result set to items with specific terms assigned in the tags taxonomy.
required: false
schema:
type: object
- name: tags_exclude
in: query
description: Limit result set to items except those with specific terms assigned in the tags taxonomy.
required: false
schema:
type: object
- name: tax_relation
in: query
description: Limit result set based on relationship between multiple taxonomies.
required: false
schema:
type: string
enum:
- AND
- OR
responses:
'200':
description: Successful response.
content:
application/json:
schema:
$ref: '#/components/schemas/WPCollection'
examples:
saved:
summary: Saved response captured 2026-09-06
externalValue: ../examples/director-of-national-intelligence-posts.json
headers:
X-WP-Total: &id003
description: Total number of matching records.
schema:
type: integer
X-WP-TotalPages: &id004
description: Total number of pages available at the current per_page.
schema:
type: integer
Link: &id005
description: RFC 8288 pagination links (rel="next" / rel="prev").
schema:
type: string
'400':
description: Invalid parameter. WordPress returns `rest_invalid_param` with a `data.params` map naming
the offending parameters.
content: &id001
application/json:
schema:
$ref: '#/components/schemas/WPError'
'404':
description: No matching route or record (`rest_no_route`, `rest_post_invalid_id`, `rest_term_invalid`).
content: &id002
application/json:
schema:
$ref: '#/components/schemas/WPError'
x-verified:
url: https://www.odni.gov/?rest_route=/wp/v2/posts&per_page=3
status: 200
date: '2026-09-06'
/wp/v2/posts/{id}:
get:
operationId: getPost
summary: Retrieve one ODNI news post
description: Retrieve a single newsroom post by its WordPress id.
tags:
- News
security:
- {}
parameters:
- name: id
in: path
required: true
description: WordPress post id.
schema:
type: integer
responses:
'200':
description: Successful response.
content:
application/json:
schema:
$ref: '#/components/schemas/WPObject'
'400':
description: Invalid parameter. WordPress returns `rest_invalid_param` with a `data.params` map naming
the offending parameters.
content: *id001
'404':
description: No matching route or record (`rest_no_route`, `rest_post_invalid_id`, `rest_term_invalid`).
content: *id002
x-verified:
url: https://www.odni.gov/?rest_route=/wp/v2/posts/14092
status: 200
date: '2026-09-06'
/wp/v2/pages:
get:
operationId: listPages
summary: List ODNI site pages
description: The site's structural pages — About, Leadership, Newsroom, Transparency, Accountability, the
NCTC/NCSC/OESET mission-center pages and the policy pages.
tags:
- Pages
security:
- {}
parameters:
- name: after
in: query
description: Limit response to posts published after a given ISO8601 compliant date.
required: false
schema:
type: string
format: date-time
- name: author
in: query
description: Limit result set to posts assigned to specific authors.
required: false
schema:
type: array
items:
type: integer
default: []
- name: author_exclude
in: query
description: Ensure result set excludes posts assigned to specific authors.
required: false
schema:
type: array
items:
type: integer
default: []
- name: before
in: query
description: Limit response to posts published before a given ISO8601 compliant date.
required: false
schema:
type: string
format: date-time
- name: context
in: query
description: Scope under which the request is made; determines fields present in response.
required: false
schema:
type: string
enum:
- view
- embed
- edit
default: view
- name: exclude
in: query
description: Ensure result set excludes specific IDs.
required: false
schema:
type: array
items:
type: integer
default: []
- name: include
in: query
description: Limit result set to specific IDs.
required: false
schema:
type: array
items:
type: integer
default: []
- name: menu_order
in: query
description: Limit result set to posts with a specific menu_order value.
required: false
schema:
type: integer
- name: modified_after
in: query
description: Limit response to posts modified after a given ISO8601 compliant date.
required: false
schema:
type: string
format: date-time
- name: modified_before
in: query
description: Limit response to posts modified before a given ISO8601 compliant date.
required: false
schema:
type: string
format: date-time
- name: offset
in: query
description: Offset the result set by a specific number of items.
required: false
schema:
type: integer
- name: order
in: query
description: Order sort attribute ascending or descending.
required: false
schema:
type: string
enum:
- asc
- desc
default: desc
- name: orderby
in: query
description: Sort collection by post attribute.
required: false
schema:
type: string
enum:
- author
- date
- id
- include
- modified
- parent
- relevance
- slug
- include_slugs
- title
- menu_order
default: date
- name: page
in: query
description: Current page of the collection.
required: false
schema:
type: integer
minimum: 1
default: 1
- name: parent_exclude
in: query
description: Limit result set to all items except those of a particular parent ID.
required: false
schema:
type: array
items:
type: integer
default: []
- name: per_page
in: query
description: Maximum number of items to be returned in result set.
required: false
schema:
type: integer
minimum: 1
maximum: 100
default: 10
- name: search
in: query
description: Limit results to those matching a string.
required: false
schema:
type: string
- name: search_columns
in: query
description: Array of column names to be searched.
required: false
schema:
type: array
items:
type: string
enum:
- post_title
- post_content
- post_excerpt
default: []
- name: search_semantics
in: query
description: How to interpret the search input.
required: false
schema:
type: string
enum:
- exact
responses:
'200':
description: Successful response.
content:
application/json:
schema:
$ref: '#/components/schemas/WPCollection'
headers:
X-WP-Total: *id003
X-WP-TotalPages: *id004
Link: *id005
'400':
description: Invalid parameter. WordPress returns `rest_invalid_param` with a `data.params` map naming
the offending parameters.
content: *id001
'404':
description: No matching route or record (`rest_no_route`, `rest_post_invalid_id`, `rest_term_invalid`).
content: *id002
x-verified:
url: https://www.odni.gov/?rest_route=/wp/v2/pages&per_page=1
status: 200
date: '2026-09-06'
/wp/v2/pages/{id}:
get:
operationId: getPage
summary: Retrieve one ODNI site page
description: Retrieve a single page by its WordPress id.
tags:
- Pages
security:
- {}
parameters:
- name: id
in: path
required: true
description: WordPress page id.
schema:
type: integer
responses:
'200':
description: Successful response.
content:
application/json:
schema:
$ref: '#/components/schemas/WPObject'
'400':
description: Invalid parameter. WordPress returns `rest_invalid_param` with a `data.params` map naming
the offending parameters.
content: *id001
'404':
description: No matching route or record (`rest_no_route`, `rest_post_invalid_id`, `rest_term_invalid`).
content: *id002
x-verified:
url: https://www.odni.gov/?rest_route=/wp/v2/pages/33
status: 200
date: '2026-09-06'
/wp/v2/dlm_download:
get:
operationId: listDownloads
summary: List ODNI publications and downloads
description: The Download Monitor custom post type behind ODNI's published documents — transparency reports,
Annual Threat Assessments, IC directives, counterterrorism guides and declassified releases. This is the
closest thing on the site to a document catalog.
tags:
- Publications
security:
- {}
parameters:
- name: after
in: query
description: Limit response to posts published after a given ISO8601 compliant date.
required: false
schema:
type: string
format: date-time
- name: before
in: query
description: Limit response to posts published before a given ISO8601 compliant date.
required: false
schema:
type: string
format: date-time
- name: context
in: query
description: Scope under which the request is made; determines fields present in response.
required: false
schema:
type: string
enum:
- view
- embed
- edit
default: view
- name: dlm_download_category
in: query
description: Limit result set to items with specific terms assigned in the dlm_download_category taxonomy.
required: false
schema:
type: object
- name: dlm_download_category_exclude
in: query
description: Limit result set to items except those with specific terms assigned in the dlm_download_category
taxonomy.
required: false
schema:
type: object
- name: dlm_download_tag
in: query
description: Limit result set to items with specific terms assigned in the dlm_download_tag taxonomy.
required: false
schema:
type: object
- name: dlm_download_tag_exclude
in: query
description: Limit result set to items except those with specific terms assigned in the dlm_download_tag
taxonomy.
required: false
schema:
type: object
- name: exclude
in: query
description: Ensure result set excludes specific IDs.
required: false
schema:
type: array
items:
type: integer
default: []
- name: include
in: query
description: Limit result set to specific IDs.
required: false
schema:
type: array
items:
type: integer
default: []
- name: modified_after
in: query
description: Limit response to posts modified after a given ISO8601 compliant date.
required: false
schema:
type: string
format: date-time
- name: modified_before
in: query
description: Limit response to posts modified before a given ISO8601 compliant date.
required: false
schema:
type: string
format: date-time
- name: offset
in: query
description: Offset the result set by a specific number of items.
required: false
schema:
type: integer
- name: order
in: query
description: Order sort attribute ascending or descending.
required: false
schema:
type: string
enum:
- asc
- desc
default: desc
- name: orderby
in: query
description: Sort collection by post attribute.
required: false
schema:
type: string
enum:
- author
- date
- id
- include
- modified
- parent
- relevance
- slug
- include_slugs
- title
default: date
- name: page
in: query
description: Current page of the collection.
required: false
schema:
type: integer
minimum: 1
default: 1
- name: per_page
in: query
description: Maximum number of items to be returned in result set.
required: false
schema:
type: integer
minimum: 1
maximum: 100
default: 10
- name: search
in: query
description: Limit results to those matching a string.
required: false
schema:
type: string
- name: search_columns
in: query
description: Array of column names to be searched.
required: false
schema:
type: array
items:
type: string
enum:
- post_title
- post_content
- post_excerpt
default: []
- name: search_semantics
in: query
description: How to interpret the search input.
required: false
schema:
type: string
enum:
- exact
- name: tax_relation
in: query
description: Limit result set based on relationship between multiple taxonomies.
required: false
schema:
type: string
enum:
- AND
- OR
responses:
'200':
description: Successful response.
content:
application/json:
schema:
$ref: '#/components/schemas/WPCollection'
examples:
saved:
summary: Saved response captured 2026-09-06
externalValue: ../examples/director-of-national-intelligence-downloads.json
headers:
X-WP-Total: *id003
X-WP-TotalPages: *id004
Link: *id005
'400':
description: Invalid parameter. WordPress returns `rest_invalid_param` with a `data.params` map naming
the offending parameters.
content: *id001
'404':
description: No matching route or record (`rest_no_route`, `rest_post_invalid_id`, `rest_term_invalid`).
content: *id002
x-verified:
url: https://www.odni.gov/?rest_route=/wp/v2/dlm_download&per_page=3
status: 200
date: '2026-09-06'
/wp/v2/dlm_download/{id}:
get:
operationId: getDownload
summary: Retrieve one ODNI publication
description: Retrieve a single publication/download record by id.
tags:
- Publications
security:
- {}
parameters:
- name: id
in: path
required: true
description: Download id.
schema:
type: integer
responses:
'200':
description: Successful response.
content:
application/json:
schema:
$ref: '#/components/schemas/WPObject'
'400':
description: Invalid parameter. WordPress returns `rest_invalid_param` with a `data.params` map naming
the offending parameters.
content: *id001
'404':
description: No matching route or record (`rest_no_route`, `rest_post_invalid_id`, `rest_term_invalid`).
content: *id002
x-verified:
url: https://www.odni.gov/?rest_route=/wp/v2/dlm_download/14142
status: 200
date: '2026-09-06'
/wp/v2/dlm_download_category:
get:
operationId: listDownloadCategories
summary: List publication categories
description: Taxonomy terms classifying ODNI publications (Accountability, Transparency, NCTC, NCSC, reports
and similar).
tags:
- Taxonomy
security:
- {}
parameters:
- name: context
in: query
description: Scope under which the request is made; determines fields present in response.
required: false
schema:
type: string
enum:
- view
- embed
- edit
default: view
- name: exclude
in: query
description: Ensure result set excludes specific IDs.
required: false
schema:
type: array
items:
type: integer
default: []
- name: hide_empty
in: query
description: Whether to hide terms not assigned to any posts.
required: false
schema:
type: boolean
default: false
- name: include
in: query
description: Limit result set to specific IDs.
required: false
schema:
type: array
items:
type: integer
default: []
- name: order
in: query
description: Order sort attribute ascending or descending.
required: false
schema:
type: string
enum:
- asc
- desc
default: asc
- name: orderby
in: query
description: Sort collection by term attribute.
required: false
schema:
type: string
enum:
- id
- include
- name
- slug
- include_slugs
- term_group
- description
- count
default: name
- name: page
in: query
description: Current page of the collection.
required: false
schema:
type: integer
minimum: 1
default: 1
- name: per_page
in: query
description: Maximum number of items to be returned in result set.
required: false
schema:
type: integer
minimum: 1
maximum: 100
default: 10
- name: post
in: query
description: Limit result set to terms assigned to a specific post.
required: false
schema:
type: integer
- name: search
in: query
description: Limit results to those matching a string.
required: false
schema:
type: string
responses:
'200':
description: Successful response.
content:
application/json:
schema:
$ref: '#/components/schemas/WPCollection'
examples:
saved:
summary: Saved response captured 2026-09-06
externalValue: ../examples/director-of-national-intelligence-download-categories.json
headers:
X-WP-Total: *id003
X-WP-TotalPages: *id004
Link: *id005
'400':
description: Invalid parameter. WordPress returns `rest_invalid_param` with a `data.params` map naming
the offending parameters.
content: *id001
'404':
description: No matching route or record (`rest_no_route`, `rest_post_invalid_id`, `rest_term_invalid`).
content: *id002
x-verified:
url: https://www.odni.gov/?rest_route=/wp/v2/dlm_download_category&per_page=100
status: 200
date: '2026-09-06'
/wp/v2/dlm_download_category/{id}:
get:
operationId: getDownloadCategory
summary: Retrieve one publication category
description: Retrieve a single publication-category term by id.
tags:
- Taxonomy
security:
- {}
parameters:
- name: id
in: path
required: true
description: Term id.
schema:
type: integer
responses:
'200':
description: Successful response.
content:
application/json:
schema:
$ref: '#/components/schemas/WPObject'
'400':
description: Invalid parameter. WordPress returns `rest_invalid_param` with a `data.params` map naming
the offending parameters.
content: *id001
'404':
description: No matching route or record (`rest_no_route`, `rest_post_invalid_id`, `rest_term_invalid`).
content: *id002
x-verified:
url: https://www.odni.gov/?rest_route=/wp/v2/dlm_download_category/123
status: 200
date: '2026-09-06'
/wp/v2/dlm_download_tag:
get:
operationId
# --- truncated at 32 KB (72 KB total) ---
# Full source: https://raw.githubusercontent.com/api-evangelist/director-of-national-intelligence/refs/heads/main/openapi/director-of-national-intelligence-wp-content-openapi.yml