> ## Documentation Index
> Fetch the complete documentation index at: https://docs.gdeltcloud.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Value reference

> Every value the API validates against — closed vocabularies, observed vocabularies, and identifier spaces.

Every filter value the API understands, generated from the same objects the server validates against. This page cannot describe a value the API does not accept, or omit one it does.

## How to read this page

Values come in three kinds, and the difference decides what you can safely build on. Mixing them up is not a documentation nicety — it is the difference between a filter that is exhaustive and one that quietly is not.

| Kind           | What it means                                           | If your value is not listed                                                |
| -------------- | ------------------------------------------------------- | -------------------------------------------------------------------------- |
| **Closed**     | The complete, authoritative set.                        | It is invalid — you get `400 INVALID_ENUM` with `details.accepted_values`. |
| **Observed**   | A dated measurement of what the corpus currently holds. | It may still be valid. The API accepts it; you may just get no rows.       |
| **Identifier** | A key with a format, not a vocabulary.                  | Resolve it through the endpoint named on the entry.                        |

Live, machine-readable version of this whole page, including a `sha256` you can pin against: `GET /api/v2/meta/enums`. It is **unmetered** — checking a value before you spend a query unit on a request that would fail should not itself cost a query unit.

## Closed vocabularies

### `region`

<Info>**Closed vocabulary — 19 values.** This is the authoritative set. Anything else is rejected with `400 INVALID_REGION`, and the error carries `details.accepted_values` so a caller can self-correct without reading this page.</Info>

`Africa` · `Asia` · `Middle East` · `Northern Africa` · `Western Africa` · `Eastern Africa` · `Middle Africa` · `Southern Africa` · `Europe` · `Eastern Europe` · `South Asia` · `Southeast Asia` · `East Asia` · `Central Asia` · `North America` · `Central America` · `Caribbean` · `South America` · `Oceania`

**Accepted by:** `region`

**On:** `/api/v2/events` · `/api/v2/stories` · `/api/v2/events/summary` · `/api/v2/stories/summary` · `/api/v2/facilities`

### `continent`

<Info>**Closed vocabulary — 6 values.** This is the authoritative set. Anything else is rejected with `400 INVALID_CONTINENT`, and the error carries `details.accepted_values` so a caller can self-correct without reading this page.</Info>

`Africa` · `Asia` · `Europe` · `North America` · `South America` · `Oceania`

**Accepted by:** `continent`

**On:** `/api/v2/events` · `/api/v2/stories` · `/api/v2/events/summary` · `/api/v2/stories/summary` · `/api/v2/facilities`

### `event_category`

<Info>**Closed vocabulary — 16 values.** This is the authoritative set. Anything else is rejected with `400 INVALID_CATEGORY`, and the error carries `details.accepted_values` so a caller can self-correct without reading this page.</Info>

The union of the 6 ACLED event types (Conflict family) and the 10 CAMEO+ domains. The family is implied by the category, which is why `event_family` is deprecated.

`Battles` · `Protests` · `Riots` · `Explosions/Remote violence` · `Violence against civilians` · `Strategic developments` · `POLITICAL` · `CRIME` · `ECONOMIC` · `CORPORATE` · `TECHNOLOGY` · `INFRASTRUCTURE` · `ENVIRONMENT` · `HEALTH` · `DEMOGRAPHIC` · `INFORMATION`

**Accepted by:** `category`, `event_category`

**On:** `/api/v2/events` · `/api/v2/stories` · `/api/v2/events/summary` · `/api/v2/stories/summary`

### `story_category`

<Info>**Closed vocabulary — 22 values.** This is the authoritative set. Anything else is rejected with `400 INVALID_ENUM`, and the error carries `details.accepted_values` so a caller can self-correct without reading this page.</Info>

Two spellings of ONE vocabulary. The `cameoplus_*` / `conflict_security` forms are what the story layer stores and what a response echoes back; the bare CAMEO+ domain forms (`CORPORATE`, `CONFLICT`, …) are what the event taxonomy and the published examples use. Send either — they resolve to the same filter. `/api/v2/share-of-voice?category=` takes the identical set.

`conflict_security` · `cameoplus_political` · `cameoplus_crime` · `cameoplus_economic` · `cameoplus_corporate` · `cameoplus_technology` · `cameoplus_infrastructure` · `cameoplus_environment` · `cameoplus_health` · `cameoplus_demographic` · `cameoplus_information` · `CONFLICT` · `CORPORATE` · `CRIME` · `DEMOGRAPHIC` · `ECONOMIC` · `ENVIRONMENT` · `HEALTH` · `INFORMATION` · `INFRASTRUCTURE` · `POLITICAL` · `TECHNOLOGY`

**Accepted by:** `story_category`

**On:** `/api/v2/stories` · `/api/v2/stories/summary`

### `event_family`

<Info>**Closed vocabulary — 2 values.** This is the authoritative set. Anything else is rejected with `400 INVALID_ENUM`, and the error carries `details.accepted_values` so a caller can self-correct without reading this page.</Info>

`conflict` · `cameoplus`

**Accepted by:** `event_family`

**On:** `/api/v2/events` · `/api/v2/stories` · `/api/v2/events/summary`

### `cameoplus_domain`

<Info>**Closed vocabulary — 10 values.** This is the authoritative set. Anything else is rejected with `400 INVALID_ENUM`, and the error carries `details.accepted_values` so a caller can self-correct without reading this page.</Info>

`POLITICAL` · `CRIME` · `ECONOMIC` · `CORPORATE` · `TECHNOLOGY` · `INFRASTRUCTURE` · `ENVIRONMENT` · `HEALTH` · `DEMOGRAPHIC` · `INFORMATION`

**Accepted by:** `domain`

**On:** `/api/v2/events` · `/api/v2/stories` · `/api/v2/events/summary` · `/api/v2/stories/summary`

### `sort`

<Info>**Closed vocabulary — 2 values.** This is the authoritative set. Anything else is rejected with `400 INVALID_ENUM`, and the error carries `details.accepted_values` so a caller can self-correct without reading this page.</Info>

`significance` · `recent`

**Accepted by:** `sort`

**On:** `/api/v2/events` · `/api/v2/stories`

### `event_group_by`

<Info>**Closed vocabulary — 8 values.** This is the authoritative set. Anything else is rejected with `400 INVALID_ENUM`, and the error carries `details.accepted_values` so a caller can self-correct without reading this page.</Info>

The bucket key `/api/v2/events/summary` groups by. `source_actor_country` and `target_actor_country` bucket by actor ORIGIN — which country the acting or receiving side represents — rather than by where the event happened, which is what `country` does. `/api/v2/stories/summary` spells `group_by` over a SHORTER list (a Story has no actors of its own); other surfaces have their own dimensions and are not this list.

`date` · `country` · `region` · `continent` · `category` · `subcategory` · `source_actor_country` · `target_actor_country`

**Accepted by:** `group_by`

**On:** `/api/v2/events/summary`

### `story_group_by`

<Info>**Closed vocabulary — 6 values.** This is the authoritative set. Anything else is rejected with `400 INVALID_ENUM`, and the error carries `details.accepted_values` so a caller can self-correct without reading this page.</Info>

The bucket key `/api/v2/stories/summary` groups by. Deliberately shorter than the Events list: a Story carries no source/target actor, only an undirected set of its linked events' actor origins, so it cannot bucket by acting versus receiving side.

`date` · `country` · `region` · `continent` · `category` · `subcategory`

**Accepted by:** `group_by`

**On:** `/api/v2/stories/summary`

### `country_match`

<Info>**Closed vocabulary — 2 values.** This is the authoritative set. Anything else is rejected with `400 INVALID_ENUM`, and the error carries `details.accepted_values` so a caller can self-correct without reading this page.</Info>

Which definition of "in this country" the `country`, `region` and `continent` filters apply. The default is deliberately the wide one — a French company sanctioned in Washington is a French story — so a caller who never sets it keeps the answer they have always had. Measured on 2026-08-12, a `country=United States` event summary returned 13.7% of its events located outside the United States under the default; `country_match=location` is how you exclude them. The value in force is echoed back as `applied_filters.country_match` whether or not you sent it.

| Value                      | Meaning                                                                           |
| -------------------------- | --------------------------------------------------------------------------------- |
| `location_or_actor_origin` | The event happened in the country, OR either actor originates there. The default. |
| `location`                 | The event happened in the country. Actor origin is not considered.                |

**Accepted by:** `country_match`

**On:** `/api/v2/events` · `/api/v2/stories` · `/api/v2/events/summary` · `/api/v2/stories/summary`

### `entity_match`

<Info>**Closed vocabulary — 3 values.** This is the authoritative set. Anything else is rejected with `400 INVALID_ENUM`, and the error carries `details.accepted_values` so a caller can self-correct without reading this page.</Info>

Controls why an entity-scoped Event or Story is eligible. Failed or unavailable material attribution never falls back to broad coverage: the request returns `503 ENTITY_ATTRIBUTION_UNAVAILABLE`. Use `entity_match=coverage` only when broad story co-occurrence actually answers the intended question.

| Value      | Meaning                                                                        |
| ---------- | ------------------------------------------------------------------------------ |
| `material` | Material involvement supported by persisted attribution evidence. The default. |
| `actor`    | The entity is a coded actor in the event.                                      |
| `coverage` | Broad story co-occurrence; the entity may only appear in surrounding coverage. |

**Accepted by:** `entity_match`

**On:** `/api/v2/events` · `/api/v2/stories` · `/api/v2/events/summary` · `/api/v2/stories/summary`

### `entity_type`

<Info>**Closed vocabulary — 3 values.** This is the authoritative set. Anything else is rejected with `400 INVALID_ENUM`, and the error carries `details.accepted_values` so a caller can self-correct without reading this page.</Info>

Stored and published here in upper case, but MATCHED CASE-INSENSITIVELY — `parseEntityTypes` lowercases the input, and the endpoint's own 400 message tells you to send lower case. Both work. This list is the value space, not the required spelling.

`PERSON` · `ORGANIZATION` · `PLACE`

**Accepted by:** `type`

**On:** `/api/v2/entities` · `/api/v2/search`

### `facility_type`

<Info>**Closed vocabulary — 21 values.** This is the authoritative set. Anything else is rejected with `400 INVALID_ENUM`, and the error carries `details.accepted_values` so a caller can self-correct without reading this page.</Info>

`coal_plant` · `oil_gas_plant` · `nuclear_plant` · `geothermal_plant` · `bioenergy_plant` · `hydropower_plant` · `solar_farm` · `wind_farm` · `coal_mine` · `oil_gas_field` · `iron_ore_mine` · `coal_terminal` · `lng_terminal` · `gas_pipeline` · `oil_pipeline` · `lng_carrier` · `port` · `steel_plant` · `cement_plant` · `chemical_plant` · `data_center`

**Accepted by:** `type`

**On:** `/api/v2/facilities`

### `facility_class`

<Info>**Closed vocabulary — 6 values.** This is the authoritative set. Anything else is rejected with `400 INVALID_ENUM`, and the error carries `details.accepted_values` so a caller can self-correct without reading this page.</Info>

`power` · `extraction` · `transport_logistics` · `ports` · `heavy_industry` · `digital_infrastructure`

**Accepted by:** `class`

**On:** `/api/v2/facilities`

### `facility_source_silo`

<Info>**Closed vocabulary — 3 values.** This is the authoritative set. Anything else is rejected with `400 INVALID_ENUM`, and the error carries `details.accepted_values` so a caller can self-correct without reading this page.</Info>

`gem` · `maritime_ports` · `epoch`

**Accepted by:** `source`

**On:** `/api/v2/facilities`

### `facility_context_include`

<Info>**Closed vocabulary — 1 values.** This is the authoritative set. Anything else is rejected with `400 INVALID_ENUM`, and the error carries `details.accepted_values` so a caller can self-correct without reading this page.</Info>

`gov`

**Accepted by:** `include`

**On:** `/api/v2/facilities/{facility_id}/context`

### `chokepoint`

<Info>**Closed vocabulary — 11 values.** This is the authoritative set. Anything else is rejected with `400 INVALID_ENUM`, and the error carries `details.accepted_values` so a caller can self-correct without reading this page.</Info>

A curated set of maritime chokepoints, each defined by a bounding box that the AIS ingest subscribes to — so a position is TAGGED with one of these at write time and the warehouse can never hold a value outside the list. Open water carries an empty tag and is excluded from transits. Adding one is a code change plus new ingest coverage, not a data change.

`hormuz` · `bab_el_mandeb` · `malacca` · `suez` · `panama` · `bosphorus` · `gibraltar` · `dover` · `kerch` · `taiwan` · `danish_straits`

**Accepted by:** `chokepoint`

**On:** `/api/v2/maritime/transits` · `/api/v2/maritime/vessels` · `/api/v2/maritime/dwell` · `/api/v2/maritime/gaps` · `/api/v2/maritime/activity` · `/api/v2/maritime/tracks` · `/api/v2/maritime/chokepoint-watch`

### `min_harbor_size`

<Info>**Closed vocabulary — 4 values.** This is the authoritative set. Anything else is rejected with `400 INVALID_ENUM`, and the error carries `details.accepted_values` so a caller can self-correct without reading this page.</Info>

A MINIMUM, not an exact match — `medium` returns medium and large. The API spelling is ours; the World Port Index column it ranks is Titlecase (`Very Small`…`Large`). A fifth WPI size would rank 0 and become unreachable, so this list is only closed for as long as WPI's is.

`very_small` · `small` · `medium` · `large`

**Accepted by:** `min_harbor_size`

**On:** `/api/v2/maritime/ports`

### `maritime_activity_bucket`

<Info>**Closed vocabulary — 2 values.** This is the authoritative set. Anything else is rejected with `400 INVALID_ENUM`, and the error carries `details.accepted_values` so a caller can self-correct without reading this page.</Info>

The time grain of the aggregation. OMITTING it is a third, legitimate request — an automatic grain, hourly for spans of 2 days or less and daily beyond — so the default is not one of these values and the response echoes whichever was chosen. Until 2026-08-10 an unknown value was silently coerced to that automatic grain: `bucket=week` returned 200 with DAILY rows echoed as `bucket: "day"`, while this enum was already published as though it were enforced. It is now enforced, which is what makes publishing it true.

`hour` · `day`

**Accepted by:** `bucket`

**On:** `/api/v2/maritime/activity`

### `maritime_dwell_status`

<Info>**Closed vocabulary — 2 values.** This is the authoritative set. Anything else is rejected with `400 INVALID_ENUM`, and the error carries `details.accepted_values` so a caller can self-correct without reading this page.</Info>

Whether a dwell episode had ended at the rollup edge. Two failure modes worth knowing: a VALID value can return 409 STATUS\_UNAVAILABLE while the port\_dwell status-column rebuild is pending (the rows then carry `status: null`), and rows written before that rebuild carry the column default — an empty string that is not in this vocabulary.

`ongoing` · `completed`

**Accepted by:** `status`

**On:** `/api/v2/maritime/dwell`

### `gem_tracker`

<Info>**Closed vocabulary — 15 values.** This is the authoritative set. Anything else is rejected with `400 INVALID_TRACKER`, and the error carries `details.accepted_values` so a caller can self-correct without reading this page.</Info>

The fifteen Global Energy Monitor registries behind `gem.assets_view`. Genuinely closed — a tracker exists only when a loader and a table exist for it. Three sharp edges: the same code returns 400 on `/energy/assets` and 404 on the `/energy/assets/&#123;tracker}/&#123;gem_id}` path param; the four Heavy-Industry trackers are a SEPARATE vocabulary accepted only on /energy/assets and /energy/assets/summary; and capacity units are NOT a function of the tracker — see `gem_capacity_unit`.

| Value                | Meaning              |
| -------------------- | -------------------- |
| `coal_plants`        | Coal Plants          |
| `coal_mines`         | Coal Mines           |
| `coal_terminals`     | Coal Terminals       |
| `oil_gas_plants`     | Oil & Gas Plants     |
| `oil_gas_extraction` | Oil & Gas Extraction |
| `lng_terminals`      | LNG Terminals        |
| `nuclear`            | Nuclear              |
| `geothermal`         | Geothermal           |
| `bioenergy`          | Bioenergy            |
| `hydropower`         | Hydropower           |
| `solar`              | Solar                |
| `wind`               | Wind                 |
| `gas_pipelines`      | Gas Pipelines        |
| `oil_pipelines`      | Oil & NGL Pipelines  |
| `lng_carriers`       | LNG Carriers         |

**Accepted by:** `tracker`

**On:** `/api/v2/energy/assets` · `/api/v2/energy/assets/summary` · `/api/v2/energy/assets/map` · `/api/v2/energy/assets/{tracker}/{gem_id}`

### `gem_heavy_industry_tracker`

<Info>**Closed vocabulary — 4 values.** This is the authoritative set. Anything else is rejected with `400 UNSUPPORTED_FILTER`, and the error carries `details.accepted_values` so a caller can self-correct without reading this page.</Info>

GEM's Materials program, kept out of `gem_tracker` because these report capacity in ttpa / mtpa rather than MW and cannot share a rollup with the energy trackers. Accepted ONE AT A TIME, never mixed with an energy tracker, and never with `fuel` or `tier` — each of those is a 400 UNSUPPORTED\_FILTER. They are also reachable only through the `tracker` spelling: the `trackers` alias routes to the energy lane and 400s INVALID\_TRACKER.

`iron_steel_plants` · `cement_plants` · `chemical_plants` · `iron_ore_mines`

**Accepted by:** `tracker`

**On:** `/api/v2/energy/assets` · `/api/v2/energy/assets/summary`

### `energy_status`

<Info>**Closed vocabulary — 24 values.** This is the authoritative set. Anything else is rejected with `400 INVALID_ENUM`, and the error carries `details.accepted_values` so a caller can self-correct without reading this page.</Info>

Seven lifecycle FAMILIES plus every member spelling they expand to — sending a family name matches all of its members. Matched case-insensitively. This is a hand-maintained partition over a column GEM owns, so it is closed only until GEM ships a status nobody has mapped: the sibling vocabulary on `/api/v2/facilities` (`facility_status`) reads the same class of data and is published as a measurement for exactly that reason.

`operating` · `construction` · `proposed` · `permitted` · `cancelled` · `mothballed` · `retired` · `active` · `underground gas storage` · `on order` · `mixed status` · `announced` · `pre-construction` · `pre-permit` · `in-development` · `discovered` · `exploration` · `shelved` · `cancelled - inferred 4 y` · `shelved - inferred 2 y` · `abandoned` · `idle` · `idled` · `decommissioning`

**Accepted by:** `status`

**On:** `/api/v2/energy/assets` · `/api/v2/energy/assets/summary` · `/api/v2/energy/assets/map`

### `energy_fuel`

<Info>**Closed vocabulary — 9 values.** This is the authoritative set. Anything else is rejected with `400 INVALID_ENUM`, and the error carries `details.accepted_values` so a caller can self-correct without reading this page.</Info>

Fuel CATEGORIES, each expanding to a set of synonyms found in the source data. Not accepted on a Heavy-Industry request — that combination is a 400 UNSUPPORTED\_FILTER.

`gas` · `oil` · `bioenergy` · `coal` · `solar` · `wind` · `nuclear` · `hydropower` · `geothermal`

**Accepted by:** `fuel`

**On:** `/api/v2/energy/assets` · `/api/v2/energy/assets/summary` · `/api/v2/energy/assets/map`

### `energy_sort`

<Info>**Closed vocabulary — 6 values.** This is the authoritative set. Anything else is rejected with `400 INVALID_ENUM`, and the error carries `details.accepted_values` so a caller can self-correct without reading this page.</Info>

Distinct from the events/stories `sort` vocabulary, which is `significance \| recent`. Same param name, different value-space — they are registered separately rather than merged, because merging them would publish a value one of the two endpoints rejects.

`capacity_desc` · `capacity_asc` · `start_year_desc` · `start_year_asc` · `recent` · `name`

**Accepted by:** `sort`

**On:** `/api/v2/energy/assets`

### `energy_asset_class`

<Info>**Closed vocabulary — 3 values.** This is the authoritative set. Anything else is rejected with `400 INVALID_ENUM`, and the error carries `details.accepted_values` so a caller can self-correct without reading this page.</Info>

Fixed assets (plants, mines, pipelines) versus mobile ones (LNG carriers). Defaults to `fixed`, and flips to `all` on its own when the request asks for `lng_carriers` alone — so the effective default is not always the declared one.

`fixed` · `mobile` · `all`

**Accepted by:** `asset_class`

**On:** `/api/v2/energy/assets` · `/api/v2/energy/assets/summary` · `/api/v2/energy/assets/map`

### `energy_group_by`

<Info>**Closed vocabulary — 8 values.** This is the authoritative set. Anything else is rejected with `400 INVALID_ENUM`, and the error carries `details.accepted_values` so a caller can self-correct without reading this page.</Info>

Bucket dimension for the energy summary. Two further spellings — `start_year` and `decade` — are intercepted before this enum is consulted and therefore work without appearing here; a Heavy-Industry request accepts a different, smaller set.

`country` · `region` · `continent` · `tracker` · `status` · `start_year_decade` · `fuel` · `tier`

**Accepted by:** `group_by`

**On:** `/api/v2/energy/assets/summary`

### `epoch_hardware_type`

<Info>**Closed vocabulary — 11 values.** This is the authoritative set. Anything else is rejected with `400 INVALID_ENUM`, and the error carries `details.accepted_values` so a caller can self-correct without reading this page.</Info>

Accelerator class. Epoch's vocabulary, not ours, and the comparison is exact-after-lowercasing rather than substring — so the compound token `dcu (gpgpu)` must be sent whole (a bare `dcu` is a 400), and `gpu` cannot reach a `gpgpu` row. Any casing is accepted; the values are published lowercase because that is the form the server compares and the form its 400 returns in `accepted_values`. Rows with no type are unreachable by any value here.

`gpu` · `tpu` · `xpu-r` · `npu` · `gpgpu` · `other` · `xpu` · `asic` · `lpu` · `hybrid cpu` · `dcu (gpgpu)`

**Accepted by:** `type`

**On:** `/api/v2/epoch/hardware`

### `epoch_model_accessibility`

<Info>**Closed vocabulary — 6 values.** This is the authoritative set. Anything else is rejected with `400 INVALID_ENUM`, and the error carries `details.accepted_values` so a caller can self-correct without reading this page.</Info>

How the model's weights are released. Matched case-insensitively but otherwise exactly, parentheses and all. Epoch's vocabulary — it currently matches the corpus one-for-one, and will need re-measuring whenever Epoch republishes.

`Open weights (unrestricted)` · `Open weights (restricted use)` · `Open weights (non-commercial)` · `API access` · `Hosted access (no API)` · `Unreleased`

**Accepted by:** `model_accessibility`

**On:** `/api/v2/epoch/models`

### `epoch_model_domain`

<Info>**Closed vocabulary — 19 values.** This is the authoritative set. Anything else is rejected with `400 INVALID_ENUM`, and the error carries `details.accepted_values` so a caller can self-correct without reading this page.</Info>

★ KNOWN GAP, stated rather than hidden. The stored field is COMPOSITE — a model spans several domains, comma-joined — so the filter substring-matches, and each token you send is validated against this list. The list is CURATED and has fallen behind the dataset: measured 2026-08-10, `epoch.ai_models.domain` also contains Psychology, Astronomy and Cybersecurity, and sending any of the three returns 400 INVALID\_ENUM even though rows carry it. It is published as closed because that is what the server enforces today; widening it (or reopening it as a measurement) is a deliberate contract change, not a documentation fix.

`Language` · `Vision` · `Biology` · `Multimodal` · `Image generation` · `Video` · `Speech` · `Robotics` · `Games` · `Audio` · `Medicine` · `Mathematics` · `Materials science` · `Earth science` · `Recommendation` · `Driving` · `Search` · `3D modeling` · `Other`

**Accepted by:** `domain`

**On:** `/api/v2/epoch/models`

### `filings_sort`

<Info>**Closed vocabulary — 2 values.** This is the authoritative set. Anything else is rejected with `400 INVALID_ENUM`, and the error carries `details.accepted_values` so a caller can self-correct without reading this page.</Info>

`recent` · `filer`

**Accepted by:** `sort`

**On:** `/api/v2/filings`

### `filings_summary_group_by`

<Info>**Closed vocabulary — 3 values.** This is the authoritative set. Anything else is rejected with `400 INVALID_ENUM`, and the error carries `details.accepted_values` so a caller can self-correct without reading this page.</Info>

Also the discovery path for `form_type`, which is an open vocabulary — see `sec_form_type`.

`form_type` · `date` · `filer`

**Accepted by:** `group_by`

**On:** `/api/v2/filings/summary`

### `filings_event_type`

<Info>**Closed vocabulary — 11 values.** This is the authoritative set. Anything else is rejected with `400 INVALID_ENUM`, and the error carries `details.accepted_values` so a caller can self-correct without reading this page.</Info>

The 8-K material-event kinds. Genuinely closed because it is the CLOSED OUTPUT VOCABULARY of our own extractor, with `other` as the residual — the column can only ever hold what the extractor was allowed to emit. Case-sensitive.

`material_agreement` · `executive_change` · `results` · `acquisition` · `disposition` · `guidance` · `restructuring` · `impairment` · `delisting` · `bankruptcy` · `other`

**Accepted by:** `event_type`

**On:** `/api/v2/filings/events`

### `filings_rel_type`

<Info>**Closed vocabulary — 7 values.** This is the authoritative set. Anything else is rejected with `400 INVALID_ENUM`, and the error carries `details.accepted_values` so a caller can self-correct without reading this page.</Info>

Counterparty relation kinds extracted from filing text. Closed for the same reason as `filings_event_type`: it is the extractor's own output vocabulary. Note `risk_factor` is a first-class member — two hand-written doc pages list only six of these seven and drop it.

`subsidiary` · `supplier` · `customer` · `counterparty` · `partner` · `jurisdiction_exposure` · `risk_factor`

**Accepted by:** `rel_type`

**On:** `/api/v2/filings/{cik}/relations`

### `macro_frequency`

<Info>**Closed vocabulary — 10 values.** This is the authoritative set. Anything else is rejected with `400 INVALID_ENUM`, and the error carries `details.accepted_values` so a caller can self-correct without reading this page.</Info>

BOTH spellings of each cadence are accepted — the word (prefix-matched against FRED's messy `frequency` string, so `Weekly` reaches "Weekly, Ending Friday") and the short code (exact against `frequency_short`). Case-insensitive. Two published tellings each got this half right: the spec declared the codes only, the 400 advertises the words only. `Annual`/`A` is legal and currently matches no series.

`Daily` · `D` · `Weekly` · `W` · `Monthly` · `M` · `Quarterly` · `Q` · `Annual` · `A`

**Accepted by:** `frequency`

**On:** `/api/v2/macro/series`

### `macro_seasonal_adjustment`

<Info>**Closed vocabulary — 3 values.** This is the authoritative set. Anything else is rejected with `400 INVALID_ENUM`, and the error carries `details.accepted_values` so a caller can self-correct without reading this page.</Info>

Matched case-insensitively. ★ This is a FRED vocabulary that we nonetheless REJECT on, measured across fewer than a hundred series — so the day ALFRED emits a fourth adjustment string, this 400s a value the warehouse holds. Closed here because that is the behaviour today; the fix is to stop rejecting, which is a contract change of its own.

`Not Seasonally Adjusted` · `Seasonally Adjusted` · `Seasonally Adjusted Annual Rate`

**Accepted by:** `seasonal_adjustment`

**On:** `/api/v2/macro/series`

### `macro_agency`

<Info>**Closed vocabulary — 11 values.** This is the authoritative set. Anything else is rejected with `400 INVALID_ENUM`, and the error carries `details.accepted_values` so a caller can self-correct without reading this page.</Info>

DERIVED from the featured-series catalogue rather than hand-listed, so it cannot fall below what the catalogue actually serves. Case-insensitive.

`BEA` · `BLS` · `CBOE` · `Census` · `DOL` · `EIA` · `FHFA` · `FRB` · `Freddie Mac` · `Treasury` · `U. Michigan`

**Accepted by:** `agency`

**On:** `/api/v2/macro/series` · `/api/v2/macro/releases`

### `list_change_type`

<Info>**Closed vocabulary — 3 values.** This is the authoritative set. Anything else is rejected with `400 INVALID_ENUM`, and the error carries `details.accepted_values` so a caller can self-correct without reading this page.</Info>

Emitted by our own list differ, so the column cannot hold anything else. Case-sensitive.

`added` · `removed` · `changed`

**Accepted by:** `change_type`

**On:** `/api/v2/lists/changes`

### `list_entries_sort`

<Info>**Closed vocabulary — 2 values.** This is the authoritative set. Anything else is rejected with `400 INVALID_ENUM`, and the error carries `details.accepted_values` so a caller can self-correct without reading this page.</Info>

`name` · `recent`

**Accepted by:** `sort`

**On:** `/api/v2/lists/entries`

### `list_source_key`

<Info>**Closed vocabulary — 14 values.** This is the authoritative set. Anything else is rejected with `400 INVALID_LIST_SOURCE`, and the error carries `details.accepted_values` so a caller can self-correct without reading this page.</Info>

The restricted-party lists we have ACTUALLY ingested. `LIST_SOURCES` declares 22; these 14 are the ones with rows, and the other 8 (csl\_ofac\_plc, uflpa, fcc\_covered, sec\_hfcaa, cbp\_wro, mofcom\_uel, au\_dfat, eu\_fsf) are rejected with `details.reason = "declared_but_not_ingested"` rather than answering an empty 200 — "we do not carry this list" and "nothing matched on this list" are opposite answers to a screening question. Every rejection carries `details.reason`: `declared_but_not_ingested` or `unknown_source_key`. Matching is case-insensitive.

| Value                | Meaning                                            |
| -------------------- | -------------------------------------------------- |
| `csl_ofac_sdn`       | OFAC Specially Designated Nationals (SDN)          |
| `csl_ofac_ssi`       | OFAC Sectoral Sanctions Identifications (SSI)      |
| `csl_ofac_cmic`      | Non-SDN Chinese Military-Industrial Complex (CMIC) |
| `csl_ofac_nsmbs`     | Non-SDN Menu-Based Sanctions (NS-MBS)              |
| `csl_ofac_capta`     | OFAC Capta List                                    |
| `csl_bis_entity`     | BIS Entity List                                    |
| `csl_bis_meu`        | BIS Military End User (MEU) List                   |
| `csl_bis_uvl`        | BIS Unverified List (UVL)                          |
| `csl_bis_dpl`        | BIS Denied Persons List (DPL)                      |
| `csl_state_debarred` | State ITAR Debarred                                |
| `csl_state_isn`      | State Nonproliferation Sanctions (ISN)             |
| `dod_1260h`          | DoD Section 1260H Chinese Military Companies       |
| `un_consolidated`    | UN Security Council Consolidated List              |
| `uk_uksl`            | UK Sanctions List (UKSL)                           |

**Accepted by:** `list`, `source`

**On:** `/api/v2/lists` · `/api/v2/lists/entries` · `/api/v2/lists/changes`

### `exposure_lens`

<Info>**Closed vocabulary — 3 values.** This is the authoritative set. Anything else is rejected with `400 INVALID_ENUM`, and the error carries `details.accepted_values` so a caller can self-correct without reading this page.</Info>

The three exposure classifications the spine computes. Declared beside the INGEST that writes the column, so the reader and the writer cannot disagree.

`sanctions` · `china` · `state_owned`

**Accepted by:** `lens`

**On:** `/api/v2/exposure`

### `exposure_subject`

<Info>**Closed vocabulary — 2 values.** This is the authoritative set. Anything else is rejected with `400 INVALID_ENUM`, and the error carries `details.accepted_values` so a caller can self-correct without reading this page.</Info>

Whether the answer is about assets or about entities. The DECLARED default is `assets`, but the OBSERVED default is not: with an entity handle and no asset selector the endpoint silently switches to `entities` and says so in `subject_note`. Worth sending explicitly. On the entities path, `group_by` and `sort` are accepted, ignored, and echoed back as applied.

`assets` · `entities`

**Accepted by:** `subject`

**On:** `/api/v2/exposure`

### `exposure_group_by`

<Info>**Closed vocabulary — 3 values.** This is the authoritative set. Anything else is rejected with `400 INVALID_ENUM`, and the error carries `details.accepted_values` so a caller can self-correct without reading this page.</Info>

Validated only on the assets path — see `exposure_subject`.

`none` · `country` · `tracker`

**Accepted by:** `group_by`

**On:** `/api/v2/exposure`

### `exposure_sort`

<Info>**Closed vocabulary — 2 values.** This is the authoritative set. Anything else is rejected with `400 INVALID_ENUM`, and the error carries `details.accepted_values` so a caller can self-correct without reading this page.</Info>

Validated only on the assets path — see `exposure_subject`.

`capacity_desc` · `stake_desc`

**Accepted by:** `sort`

**On:** `/api/v2/exposure`

### `exposure_list`

<Info>**Closed vocabulary — 16 values.** This is the authoritative set. Anything else is rejected with `400 INVALID_LIST_SOURCE`, and the error carries `details.accepted_values` so a caller can self-correct without reading this page.</Info>

What made an exposure row exposed. A deliberate SUPERSET of `list_source_key`: the 14 ingested lists plus two labels that are not lists at all — `state_owned` (the state\_owned lens) and `cn_state` (a Chinese state owner under the china lens). Both are RETURNED inside `contributing_lists`, so rejecting them would 400 a value the endpoint had just handed back; measured 2026-08-10 they match 3,690 and 104 asset rows. They are meaningless on /api/v2/lists, which is why this is a second enum rather than one over-promising union. The china lens STORES a list edge prefixed (`list_csl_ofac_cmic`); send either spelling — the serve layer matches both, so one value works across all three lenses.

| Value                | Meaning                                            |
| -------------------- | -------------------------------------------------- |
| `csl_ofac_sdn`       | OFAC Specially Designated Nationals (SDN)          |
| `csl_ofac_ssi`       | OFAC Sectoral Sanctions Identifications (SSI)      |
| `csl_ofac_cmic`      | Non-SDN Chinese Military-Industrial Complex (CMIC) |
| `csl_ofac_nsmbs`     | Non-SDN Menu-Based Sanctions (NS-MBS)              |
| `csl_ofac_capta`     | OFAC Capta List                                    |
| `csl_bis_entity`     | BIS Entity List                                    |
| `csl_bis_meu`        | BIS Military End User (MEU) List                   |
| `csl_bis_uvl`        | BIS Unverified List (UVL)                          |
| `csl_bis_dpl`        | BIS Denied Persons List (DPL)                      |
| `csl_state_debarred` | State ITAR Debarred                                |
| `csl_state_isn`      | State Nonproliferation Sanctions (ISN)             |
| `dod_1260h`          | DoD Section 1260H Chinese Military Companies       |
| `un_consolidated`    | UN Security Council Consolidated List              |
| `uk_uksl`            | UK Sanctions List (UKSL)                           |
| `state_owned`        | State-owned (any country)                          |
| `cn_state`           | Chinese state owner                                |

**Accepted by:** `list`

**On:** `/api/v2/exposure`

### `atlas_level`

<Info>**Closed vocabulary — 4 values.** This is the authoritative set. Anything else is rejected with `400 INVALID_ENUM`, and the error carries `details.accepted_values` so a caller can self-correct without reading this page.</Info>

Geographic aggregation level. Shared by GPR, Posture and Coverage — but the DEFAULT is not: Posture defaults to `country`.

`world` · `continent` · `region` · `country`

**Accepted by:** `level`

**On:** `/api/v2/intelligence/gpr`

### `atlas_posture_scope`

<Info>**Closed vocabulary — 3 values.** This is the authoritative set. Anything else is rejected with `400 INVALID_ENUM`, and the error carries `details.accepted_values` so a caller can self-correct without reading this page.</Info>

Which posture blocks to return. Omitting the param is NOT the same as sending `all`: absent returns both the internal and external blocks in their own right.

`all` · `internal` · `external`

**Accepted by:** `scope`

**On:** `/api/v2/intelligence/posture`

### `atlas_posture_window`

<Info>**Closed vocabulary — 3 values.** This is the authoritative set. Anything else is rejected with `400 INVALID_ENUM`, and the error carries `details.accepted_values` so a caller can self-correct without reading this page.</Info>

★ Posture's `window` is a TOKEN, not a number of days — `30d`, not `30`. It is the only `window` in the v2 surface that works this way (GPR's is an integer that is silently clamped), and a bare integer here is a 400 INVALID\_ENUM.

`7d` · `30d` · `90d`

**Accepted by:** `window`

**On:** `/api/v2/intelligence/posture`

### `atlas_weighting`

<Info>**Closed vocabulary — 2 values.** This is the authoritative set. Anything else is rejected with `400 INVALID_ENUM`, and the error carries `details.accepted_values` so a caller can self-correct without reading this page.</Info>

Corpus weighting. On Posture, `gdp` can silently DEGRADE to `attention` when the GDP basis is unavailable — the response says which was actually used in `weighting.effective` plus a reason.

`attention` · `gdp`

**Accepted by:** `weighting`

**On:** `/api/v2/intelligence/gpr`

### `atlas_gpr_construction`

<Info>**Closed vocabulary — 2 values.** This is the authoritative set. Anything else is rejected with `400 INVALID_ENUM`, and the error carries `details.accepted_values` so a caller can self-correct without reading this page.</Info>

Which denominator the index is normalized against: our own coverage, or the world corpus. Not interchangeable — two series built on different constructions must never be compared.

`own_coverage` · `world_corpus`

**Accepted by:** `construction`

**On:** `/api/v2/intelligence/gpr`

### `atlas_gpr_variant`

<Info>**Closed vocabulary — 4 values.** This is the authoritative set. Anything else is rejected with `400 INVALID_ENUM`, and the error carries `details.accepted_values` so a caller can self-correct without reading this page.</Info>

The two GPR lenses are `events` and `attention`. `fullspectrum` and `gpr` are the internal storage names, still accepted as legacy aliases — they are published here because the server accepts them, while the 400 deliberately advertises only the two product names.

`events` · `attention` · `fullspectrum` · `gpr`

**Accepted by:** `variant`

**On:** `/api/v2/intelligence/gpr`

### `atlas_gpr_component`

<Info>**Closed vocabulary — 5 values.** This is the authoritative set. Anything else is rejected with `400 INVALID_ENUM`, and the error carries `details.accepted_values` so a caller can self-correct without reading this page.</Info>

Which decomposition of the index to return. Membership in this list is NECESSARY BUT NOT SUFFICIENT — see the per-variant sets below; sending a component the variant does not carry is a 400 INVALID\_ENUM whose accepted\_values is that variant's set, not this union.

`all` · `threats` · `acts` · `verbal` · `material`

<Warning>**The legal values depend on `variant`.** The list above is the union across every `variant`; membership in it does NOT mean a value is accepted with the `variant` you are sending. A mismatch returns `400 INVALID_ENUM` whose `details.accepted_values` is the row below, not the union.</Warning>

The events lens (and its `fullspectrum` storage alias) carries all five; the `gpr` lens is built from the threat/act partition only, so `verbal` and `material` do not exist for it; the attention lens is a single undecomposed series, so `all` is its only component. Measured against prod: 6 of the 15 pairs a flat 5-value enum implies cannot return a row.

| `variant`      | Legal `component` values                           |
| -------------- | -------------------------------------------------- |
| `events`       | `all` · `threats` · `acts` · `verbal` · `material` |
| `attention`    | `all`                                              |
| `fullspectrum` | `all` · `threats` · `acts` · `verbal` · `material` |
| `gpr`          | `all` · `threats` · `acts`                         |

**Accepted by:** `component`

**On:** `/api/v2/intelligence/gpr`

### `atlas_gpr_metric`

<Info>**Closed vocabulary — 3 values.** This is the authoritative set. Anything else is rejected with `400 INVALID_ENUM`, and the error carries `details.accepted_values` so a caller can self-correct without reading this page.</Info>

`gpr` is the product name for the index; `pulse` is its legacy internal alias.

`gpr` · `pulse` · `attention_share`

**Accepted by:** `metric`

**On:** `/api/v2/intelligence/gpr`

### `atlas_coverage_tier`

<Info>**Closed vocabulary — 3 values.** This is the authoritative set. Anything else is rejected with `400 INVALID_ENUM`, and the error carries `details.accepted_values` so a caller can self-correct without reading this page.</Info>

`depth` · `thin` · `none`

**Accepted by:** `tier`

**On:** `/api/v2/intelligence/coverage`

### `china_projects_sort`

<Info>**Closed vocabulary — 2 values.** This is the authoritative set. Anything else is rejected with `400 INVALID_ENUM`, and the error carries `details.accepted_values` so a caller can self-correct without reading this page.</Info>

`amount_desc` · `recent`

**Accepted by:** `sort`

**On:** `/api/v2/china/projects`

### `china_projects_group_by`

<Info>**Closed vocabulary — 6 values.** This is the authoritative set. Anything else is rejected with `400 INVALID_ENUM`, and the error carries `details.accepted_values` so a caller can self-correct without reading this page.</Info>

Four of these buckets — sector, status, flow\_class, intent — are the ONLY discovery path for the corresponding open filter vocabularies. There is deliberately no `region` bucket, which is why the AidData region a row carries has none; see `china_recipient_region`.

`country` · `sector` · `status` · `year` · `flow_class` · `intent`

**Accepted by:** `group_by`

**On:** `/api/v2/china/projects/summary`

### `search_universe`

<Info>**Closed vocabulary — 4 values.** This is the authoritative set. Anything else is rejected with `400 INVALID_ENUM`, and the error carries `details.accepted_values` so a caller can self-correct without reading this page.</Info>

`registry` is the raw GLEIF LEI universe in its own lane and additionally requires the GLEIF entitlement — an unentitled caller gets 403 PLAN\_REQUIRED, not 400. It is a legal value regardless of plan, which is why it is listed here.

`all` · `news` · `reference` · `registry`

**Accepted by:** `universe`

**On:** `/api/v2/search`

### `search_entity_type`

<Info>**Closed vocabulary — 3 values.** This is the authoritative set. Anything else is rejected with `400 INVALID_ENUM`, and the error carries `details.accepted_values` so a caller can self-correct without reading this page.</Info>

★ LOWERCASE, and deliberately a DIFFERENT value-space from `entity_type` (UPPERCASE), which `/api/v2/entities` accepts. Same concept, two spellings, two endpoints — registered separately rather than merged, because publishing one casing for both would advertise a value one of them rejects. `place` is a first-class member on both; a filter that offers only person and organization silently hides every geography.

`person` · `organization` · `place`

**Accepted by:** `type`

**On:** `/api/v2/search`

### `entity_hierarchy_direction`

<Info>**Closed vocabulary — 3 values.** This is the authoritative set. Anything else is rejected with `400 INVALID_ENUM`, and the error carries `details.accepted_values` so a caller can self-correct without reading this page.</Info>

Which way to walk the ownership tree from the anchor entity. Defaults to `both`.

`up` · `down` · `both`

**Accepted by:** `direction`

**On:** `/api/v2/entities/{entity_id}/hierarchy`

### `gleif_entity_status`

<Info>**Closed vocabulary — 3 values.** This is the authoritative set. Anything else is rejected with `400 INVALID_ENUM`, and the error carries `details.accepted_values` so a caller can self-correct without reading this page.</Info>

From the LEI-CDF specification. `NULL` is a real, sendable value — GLEIF publishes it as a string for records where the status is genuinely unknown, so it is not the absence of a value.

`ACTIVE` · `INACTIVE` · `NULL`

**Accepted by:** `entity_status`

**On:** `/api/v2/gleif/entities`

### `gleif_registration_status`

<Info>**Closed vocabulary — 12 values.** This is the authoritative set. Anything else is rejected with `400 INVALID_ENUM`, and the error carries `details.accepted_values` so a caller can self-correct without reading this page.</Info>

The LEI record's own lifecycle, distinct from whether the legal entity is active. Twelve values, of which `MERGED` is deprecated upstream and retained for historical records.

`ISSUED` · `LAPSED` · `PENDING_TRANSFER` · `PENDING_ARCHIVAL` · `DUPLICATE` · `RETIRED` · `ANNULLED` · `CANCELLED` · `TRANSFERRED` · `PENDING_VALIDATION` · `PUBLISHED` · `MERGED`

**Accepted by:** `registration_status`

**On:** `/api/v2/gleif/entities`

### `gleif_entity_category`

<Info>**Closed vocabulary — 6 values.** This is the authoritative set. Anything else is rejected with `400 INVALID_ENUM`, and the error carries `details.accepted_values` so a caller can self-correct without reading this page.</Info>

`GENERAL` · `BRANCH` · `FUND` · `SOLE_PROPRIETOR` · `RESIDENT_GOVERNMENT_ENTITY` · `INTERNATIONAL_ORGANIZATION`

**Accepted by:** `entity_category`

**On:** `/api/v2/gleif/entities`

### `gleif_relationship_type`

<Info>**Closed vocabulary — 6 values.** This is the authoritative set. Anything else is rejected with `400 INVALID_ENUM`, and the error carries `details.accepted_values` so a caller can self-correct without reading this page.</Info>

From the RR-CDF specification. Accounting consolidation, branch, and the three fund relationships. Note `IS_FUND-MANAGED_BY` carries a hyphen inside the token.

`IS_DIRECTLY_CONSOLIDATED_BY` · `IS_ULTIMATELY_CONSOLIDATED_BY` · `IS_INTERNATIONAL_BRANCH_OF` · `IS_FUND-MANAGED_BY` · `IS_SUBFUND_OF` · `IS_FEEDER_TO`

**Accepted by:** `relationship_type`

**On:** `/api/v2/gleif/relationships`

### `actor_type`

<Info>**Closed vocabulary — 9 values.** This is the authoritative set. Anything else is rejected with `400 INVALID_ENUM`, and the error carries `details.accepted_values` so a caller can self-correct without reading this page.</Info>

The actor classification carried on conflict events as `inter1` (the acting side) and `inter2` (the receiving side). `None` applies only to `inter2`, in a one-sided event with no second actor.

`None` · `State forces` · `Rebel groups` · `Political militias` · `Identity militias` · `Rioters` · `Protesters` · `Civilians` · `External/Other forces`

### `quality`

<Info>**Closed vocabulary — 3 values.** This is the authoritative set. Anything else is rejected with `400 INVALID_ENUM`, and the error carries `details.accepted_values` so a caller can self-correct without reading this page.</Info>

How much scoring confidence a row must clear to be returned. `production_ready` is the default and the one to build on; `reviewable` widens to rows we would show a human but not a customer; `all` disables the filter entirely and will include rows we do not stand behind.

`production_ready` · `reviewable` · `all`

**Accepted by:** `quality`

**On:** `/api/v2/entities/{entity_id}/tone`

### `geo_precision`

<Info>**Closed vocabulary — 3 values.** This is the authoritative set. Anything else is rejected with `400 INVALID_ENUM`, and the error carries `details.accepted_values` so a caller can self-correct without reading this page.</Info>

How exactly the event was located: `1` an exact named place, `2` a nearby or general area, `3` a country or region centroid. The companion `geo_precision_label` field carries these as `exact_place`, `nearby_area` and `country_or_region`. This is the difference between an event AT an asset and an event somewhere in the same country — check it before triggering on a coordinate.

`1` · `2` · `3`

### `time_precision`

<Info>**Closed vocabulary — 3 values.** This is the authoritative set. Anything else is rejected with `400 INVALID_ENUM`, and the error carries `details.accepted_values` so a caller can self-correct without reading this page.</Info>

How exactly the event was dated: `1` the exact day is known, `2` within a week, `3` within a month. There is no `time_precision_label` field — the number is what is served. A `3` on a daily time series is a month-wide event pinned to one bucket, not a same-day observation.

`1` · `2` · `3`

### `actor_role`

<Info>**Closed vocabulary — 4 values.** This is the authoritative set. Anything else is rejected with `400 INVALID_ENUM`, and the error carries `details.accepted_values` so a caller can self-correct without reading this page.</Info>

The part an actor played in the event. WHICH PAIR YOU GET IS DECIDED BY `family`, and the two pairs never mix on one card. CAMEO+ events are DIRECTED and carry `source` (who acted) and `target` (who was acted upon) — this is the direction bilateral questions turn on. Conflict (ACLED) events are UNDIRECTED — two parties to a clash — and carry `actor1` and `actor2`, which imply no initiator. `actor1`/`actor2` is not a legacy spelling of `source`/`target`: filtering on actor direction cannot return conflict events, because that family does not record one.

`source` · `target` · `actor1` · `actor2`

### `incident_resolution`

<Info>**Closed vocabulary — 3 values.** This is the authoritative set. Anything else is rejected with `400 INVALID_ENUM`, and the error carries `details.accepted_values` so a caller can self-correct without reading this page.</Info>

Whether this event was checked for being a duplicate of another, and what the check found. `llm` — an independent adversarial judge CONFIRMED a duplicate, and `incident.uid` names the survivor. `self` — adjudicated and found unique. `unadjudicated` — never checked, which is a DIFFERENT claim from `self`, not a weaker one: "we did not look" is not "we found nothing". Coverage is partial by design, so filter to `llm,self` when you need to count incidents rather than rows.

`unadjudicated` · `self` · `llm`

**Accepted by:** `incident_resolution`

**On:** `/api/v2/events` · `/api/v2/events/summary`

### `event_match_type`

<Info>**Closed vocabulary — 2 values.** This is the authoritative set. Anything else is rejected with `400 INVALID_ENUM`, and the error carries `details.accepted_values` so a caller can self-correct without reading this page.</Info>

How a row was retrieved by `search=`, on Event and Story cards. `semantic` means the row came back from embedding similarity and carries a `search_score`; `name` means it matched literally and carries `search_score: null` — deliberately, because faking a distance would assert a cosine similarity nobody computed. The field is OMITTED entirely on non-search requests rather than served as null. NOT the same vocabulary as `match_type` on /api/v2/search.

`semantic` · `name`

### `brief_time_window`

<Info>**Closed vocabulary — 5 values.** This is the authoritative set. Anything else is rejected with `400 INVALID_ENUM`, and the error carries `details.accepted_values` so a caller can self-correct without reading this page.</Info>

How far back the brief looks for evidence.

`6h` · `24h` · `72h` · `7d` · `30d`

**Accepted by:** `time_window`

**On:** `/api/v2/briefs`

### `brief_baseline_window`

<Info>**Closed vocabulary — 3 values.** This is the authoritative set. Anything else is rejected with `400 INVALID_ENUM`, and the error carries `details.accepted_values` so a caller can self-correct without reading this page.</Info>

The comparison period a reading is called normal or abnormal against. It is separate from `time_window` on purpose: a 24h brief still needs weeks of history to know what 24 hours of this looks like.

`7d` · `14d` · `30d`

**Accepted by:** `baseline_window`

**On:** `/api/v2/briefs`

### `brief_audience`

<Info>**Closed vocabulary — 3 values.** This is the authoritative set. Anything else is rejected with `400 INVALID_ENUM`, and the error carries `details.accepted_values` so a caller can self-correct without reading this page.</Info>

Who the brief is written for. It changes the register and what is foregrounded, never the evidence.

`executive` · `analyst` · `operator`

**Accepted by:** `audience`

**On:** `/api/v2/briefs`

### `brief_depth`

<Info>**Closed vocabulary — 3 values.** This is the authoritative set. Anything else is rejected with `400 INVALID_ENUM`, and the error carries `details.accepted_values` so a caller can self-correct without reading this page.</Info>

How much the brief does. Not a quality setting — a `skim` is complete and cited, just narrower. Distinct from the numeric `depth` on the entity-hierarchy endpoint, which counts ownership levels.

`skim` · `standard` · `detailed`

**Accepted by:** `depth`

**On:** `/api/v2/briefs`

## Observed vocabularies

These are measurements. We publish them because guessing is worse, and we date them because an undated measurement is indistinguishable from a promise.

### `sec_form_type`

<Warning>**Observed vocabulary — a measurement, not an allowlist.** These are the 262 values present in the corpus as of **2026-08-10**. The API **accepts values outside this list** — the corpus grows between refreshes, and refusing a value the warehouse can answer would be worse than an empty result. Treat an unlisted value as *possibly valid*, not invalid.</Warning>

SEC form types are an open vocabulary: 264 distinct values appeared in a single 30-day window, and 424B2 alone was 36.3% of them. Any closed list here would be wrong within a quarter, so this filter accepts anything and returns an empty result for a form type the window does not contain.

`424B2` · `4` · `8-K` · `13F-HR` · `NPORT-P` · `FWP` · `D` · `10-Q` · `144` · `SCHEDULE 13G/A` · `6-K` · `N-PX` · `497K` · `SCHEDULE 13G` · `3` · `D/A` · `497` · `424B3` · `485BXT` · `10-D` · `ABS-EE` · `DEFA14A` · `13F-NT` · `425` · `N-MFP3` · `485BPOS` · `497J` · `24F-2NT` · `EFFECT` · `SCHEDULE 13D/A` · `N-CSR` · `S-8` · `S-8 POS` · `424B5` · `485APOS` · `DEF 14A` · `N-CSRS` · `4/A` · `8-A12B` · `CERT` · `ABS-15G` · `8-K/A` · `497VPU` · `25-NSE` · `S-1/A` · `497VPI` · `40-17G` · `ARS` · `10-K` · `S-1` · `PRE 14A` · `S-6` · `NPORT-P/A` · `13F-HR/A` · `N-CEN` · `POS AM` · `SCHEDULE 13D` · `486BPOS` · `MA-I/A` · `487` · `SC TO-I/A` · `C/A` · `S-3ASR` · `1-U` · `S-3` · `C` · `DFAN14A` · `20-F` · `424B8` · `C-U` · `SC TO-I` · `F-1/A` · `S-4/A` · `AW` · `15-12G` · `424B4` · `X-17A-5` · `3/A` · `6-K/A` · `10-D/A` · `253G2` · `POS EX` · `10-K/A` · `497AD` · `DEF 14C` · `N-23C3A` · `N-VP/A` · `F-6EF` · `144/A` · `N-2` · `F-1` · `N-2/A` · `40-APP/A` · `F-3` · `N-PX/A` · `N-MFP3/A` · `N-14` · `C-AR` · `S-4` · `S-3/A` · `40-APP` · `F-4/A` · `1-A POS` · `NT 20-F` · `PRE 14C` · `10-Q/A` · `RW` · `DEFM14A` · `424B7` · `SC TO-T/A` · `MA-I` · `1-A` · `S-6/A` · `NT 10-Q` · `PREM14A` · `5` · `APP NTC` · `1/A` · `25` · `QUALIF` · `424H` · `F-X` · `40-17F2` · `15-15D` · `POSASR` · `IRANNOTICE` · `N-CSR/A` · `ABS-15G/A` · `SC 14D9/A` · `NT 10-K` · `F-6 POS` · `N-23C-2` · `20-F/A` · `ATS-N/UA` · `1-A/A` · `SEC STAFF ACTION` · `N-8F` · `11-K` · `8-K12B` · `F-3/A` · `18-K/A` · `F-3ASR` · `APP ORDR` · `305B2` · `PRER14A` · `DRS` · `MA-A` · `10-12G/A` · `SD` · `F-6` · `10-12G` · `POS AMI` · `N-8A` · `S-1MEF` · `SBSE-A/A` · `PX14A6G` · `DSTRBRPT` · `N-8F ORDR` · `N-54A` · `MA/A` · `DEFC14A` · `N-CSRS/A` · `40-8B25` · `N-14/A` · `PREC14A` · `1-A-W` · `8-A12B/A` · `10-12B/A` · `1-SA` · `TA-1/A` · `F-10` · `ATS-N/MA` · `8-A12G` · `18-K` · `F-4` · `N-CEN/A` · `40-33` · `SUPPL` · `CB` · `TA-2` · `N-1A/A` · `F-10EF` · `40-6B` · `1-K` · `40-24B2` · `C-W` · `DEFA14C` · `SEC STAFF LETTER` · `486BXT` · `SC TO-C` · `15-12G/A` · `F-10/A` · `NRSRO-UPD` · `SC 13D/A` · `N-2ASR` · `REVOKED` · `424B1` · `6B ORDR` · `NT-NCEN` · `C-TR` · `SC 14F1` · `DEL AM` · `S-B/A` · `10-12B` · `N-14 8C` · `DEFR14A` · `SC 13E3/A` · `F-N` · `SC14D9C` · `SC 14D9` · `DEFM14C` · `S-11` · `253G1` · `N-30B-2` · `NT N-CEN` · `ANNLRPT` · `SF-3` · `N-8F NTC` · `40-17F1` · `ATS-N/CA` · `15F-12B` · `S-3DPOS` · `SC TO-T` · `F-10POS` · `S-B` · `20FR12B/A` · `N-8F/A` · `N-1A` · `8-K12G3` · `APP WD` · `CFPORTAL/A` · `6B NTC` · `SF-3/A` · `SD/A` · `APP WDG` · `S-4 POS` · `UPLOAD` · `8-K15D5` · `DEFR14C` · `N-54C` · `20FR12B` · `N-6` · `DFRN14A` · `PRRN14A` · `N-4/A` · `PREN14A` · `POS462B` · `C-TR-W` · `40FR12B/A` · `DRS/A` · `C/A-W` · `40FR12B` · `S-3D` · `QRTLYRPT` · `SC 13E3` · `13F-NT/A` · `X-17A-5/A` · `S-11/A` · `40-F` · `N-30D` · `N-6F/A` · `SC13E4F`

Discover the current set: `GET /api/v2/filings/summary?group_by=form_type`

**Accepted by:** `form_type`

**On:** `/api/v2/filings` · `/api/v2/filings/summary`

### `facility_status`

<Warning>**Observed vocabulary — a measurement, not an allowlist.** These are the 32 values present in the corpus as of **2026-08-10**. The API **accepts values outside this list** — the corpus grows between refreshes, and refusing a value the warehouse can answer would be worse than an empty result. Treat an unlisted value as *possibly valid*, not invalid.</Warning>

GEM lifecycle statuses arrive mixed-case and carry inferred variants (e.g. "shelved - inferred 2 y"), so the served vocabulary is what the registry actually holds rather than a curated list. Matching is case-insensitive.

`operating` · `pre-construction` · `cancelled` · `announced` · `construction` · `retired` · `Operating` · `cancelled - inferred 4 y` · `shelved - inferred 2 y` · `shelved` · `proposed` · `mothballed` · `active` · `Proposed` · `Mothballed` · `discovered` · `on order` · `permitted` · `pre-permit` · `in-development` · `Cancelled` · `Shelved` · `idle` · `Retired` · `abandoned` · `decommissioning` · `idled` · `operating pre-retirement` · `underground gas storage` · `Construction` · `mixed status` · `exploration`

Discover the current set: `GET /api/v2/facilities?limit=1 (see applied_filters) or /api/v2/meta/enums`

**Accepted by:** `status`

**On:** `/api/v2/facilities`

### `gem_capacity_unit`

<Warning>**Observed vocabulary — a measurement, not an allowlist.** These are the 37 values present in the corpus as of **2026-08-10**. The API **accepts values outside this list** — the corpus grows between refreshes, and refusing a value the warehouse can answer would be worse than an empty result. Treat an unlisted value as *possibly valid*, not invalid.</Warning>

The unit of `capacity.value` on a GEM asset. It is NOT a function of the tracker: for lng\_terminals, gas\_pipelines, oil\_pipelines and lng\_carriers the loader passes GEM's own per-row CapacityUnits string through verbatim, so one tracker returns several units and the casing varies (`mtpa` and `Mtpa` are both present). Measured 2026-08-10: lng\_terminals carries 10 distinct units across 1,206 rows and gas\_pipelines carries 17 across 4,246, of which 1,604 carry no unit at all. NEVER sum capacity.value across rows without grouping by this field; `capacity.mw` is the only cross-tracker-summable number, and it is populated only for the power trackers.

`MW` · `Mtpa` · `mtpa` · `bcm/y` · `cbm` · `MMcf/d` · `bpd` · `Mt` · `MMSCMD` · `TJ/d` · `mill.Sm3/day` · `bcf/d` · `GWh/d` · `m3/day` · `Mcf/d` · `scm/y` · `m3/month` · `lpy` · `m3/h` · `Tn/d` · `gal/day` · `GWh/h` · `tpa` · `thousand m3/year` · `Mb/d` · `m3/year` · `PJ/y` · `Dth/d` · `Tn/day` · `scm/yr` · `m3/d` · `bph` · `tn/h` · `BCF/y` · `MWh/d` · `Tsd. m³/h` · `MMBtu/d`

Discover the current set: `GET /api/v2/energy/assets?tracker=<tracker>&limit=1 (read capacity.unit on each row)`

**Accepted by:** `capacity_unit (response field)`

**On:** `/api/v2/energy/assets`

### `energy_tier`

<Warning>**Observed vocabulary — a measurement, not an allowlist.** These are the 5 values present in the corpus as of **2026-08-10**. The API **accepts values outside this list** — the corpus grows between refreshes, and refusing a value the warehouse can answer would be worse than an empty result. Treat an unlisted value as *possibly valid*, not invalid.</Warning>

GEM's own coverage tier for an asset row (main sheet vs below-threshold vs closed, and the utility/distributed split on solar). The serve layer accepts it as a free comma list and does not validate it, so an unknown tier returns an empty 200 rather than a 400 — which is why it is published as a measurement rather than as an allowlist.

`utility` · `main` · `below_threshold` · `closed` · `sub_threshold`

Discover the current set: `GET /api/v2/energy/assets/summary?group_by=tier`

**Accepted by:** `tier`

**On:** `/api/v2/energy/assets`

### `gem_owner_entity_type`

<Warning>**Observed vocabulary — a measurement, not an allowlist.** These are the 6 values present in the corpus as of **2026-08-10**. The API **accepts values outside this list** — the corpus grows between refreshes, and refusing a value the warehouse can answer would be worse than an empty result. Treat an unlisted value as *possibly valid*, not invalid.</Warning>

The corporate-registry classification GEM assigns an ownership entity. Unvalidated at the serve layer — `/api/v2/energy/owners?entity_type=` is applied as a plain IN list, so an unlisted value returns an empty 200.

`legal entity` · `state` · `state body` · `arrangement` · `unknown entity` · `person`

Discover the current set: `GET /api/v2/energy/owners?limit=1 (read entity_type)`

**Accepted by:** `entity_type`

**On:** `/api/v2/energy/owners`

### `china_sector`

<Warning>**Observed vocabulary — a measurement, not an allowlist.** These are the 24 values present in the corpus as of **2026-08-10**. The API **accepts values outside this list** — the corpus grows between refreshes, and refusing a value the warehouse can answer would be worse than an empty result. Treat an unlisted value as *possibly valid*, not invalid.</Warning>

AidData's OECD-DAC sector name, stored verbatim and matched case-insensitively. Ours to serve, not ours to define — it changes when AidData republishes GCDF. The filter does not validate, so an unlisted sector returns an empty 200.

`HEALTH` · `EDUCATION` · `GOVERNMENT AND CIVIL SOCIETY` · `TRANSPORT AND STORAGE` · `ENERGY` · `OTHER SOCIAL INFRASTRUCTURE AND SERVICES` · `EMERGENCY RESPONSE` · `UNALLOCATED/UNSPECIFIED` · `INDUSTRY, MINING, CONSTRUCTION` · `AGRICULTURE, FORESTRY, FISHING` · `COMMUNICATIONS` · `OTHER MULTISECTOR` · `BANKING AND FINANCIAL SERVICES` · `ACTION RELATING TO DEBT` · `WATER SUPPLY AND SANITATION` · `DEVELOPMENTAL FOOD AID/FOOD SECURITY ASSISTANCE` · `BUSINESS AND OTHER SERVICES` · `TRADE POLICIES AND REGULATIONS` · `GENERAL BUDGET SUPPORT` · `GENERAL ENVIRONMENTAL PROTECTION` · `OTHER COMMODITY ASSISTANCE` · `RECONSTRUCTION RELIEF AND REHABILITATION` · `DISASTER PREVENTION AND PREPAREDNESS` · `POPULATION POLICIES/PROGRAMMES AND REPRODUCTIVE HEALTH`

Discover the current set: `GET /api/v2/china/projects/summary?group_by=sector`

**Accepted by:** `sector`

**On:** `/api/v2/china/projects` · `/api/v2/china/projects/summary`

### `china_status`

<Warning>**Observed vocabulary — a measurement, not an allowlist.** These are the 6 values present in the corpus as of **2026-08-10**. The API **accepts values outside this list** — the corpus grows between refreshes, and refusing a value the warehouse can answer would be worse than an empty result. Treat an unlisted value as *possibly valid*, not invalid.</Warning>

AidData's project status. Note the two `Pipeline: …` values contain a colon and a space — a picker that offers a slugified form will silently match nothing.

`Completion` · `Pipeline: Commitment` · `Implementation` · `Pipeline: Pledge` · `Cancelled` · `Suspended`

Discover the current set: `GET /api/v2/china/projects/summary?group_by=status`

**Accepted by:** `status`

**On:** `/api/v2/china/projects` · `/api/v2/china/projects/summary`

### `china_flow_class`

<Warning>**Observed vocabulary — a measurement, not an allowlist.** These are the 3 values present in the corpus as of **2026-08-10**. The API **accepts values outside this list** — the corpus grows between refreshes, and refusing a value the warehouse can answer would be worse than an empty result. Treat an unlisted value as *possibly valid*, not invalid.</Warning>

AidData's ODA-like / OOF-like concessionality class. Unvalidated at the serve layer.

`ODA-like` · `OOF-like` · `Vague (Official Finance)`

Discover the current set: `GET /api/v2/china/projects/summary?group_by=flow_class`

**Accepted by:** `flow_class`

**On:** `/api/v2/china/projects` · `/api/v2/china/projects/summary`

### `china_intent`

<Warning>**Observed vocabulary — a measurement, not an allowlist.** These are the 4 values present in the corpus as of **2026-08-10**. The API **accepts values outside this list** — the corpus grows between refreshes, and refusing a value the warehouse can answer would be worse than an empty result. Treat an unlisted value as *possibly valid*, not invalid.</Warning>

AidData's donor-intent classification. Unvalidated at the serve layer.

`Development` · `Mixed` · `Commercial` · `Representational`

Discover the current set: `GET /api/v2/china/projects/summary?group_by=intent`

**Accepted by:** `intent`

**On:** `/api/v2/china/projects` · `/api/v2/china/projects/summary`

### `china_recipient_region`

<Warning>**Observed vocabulary — a measurement, not an allowlist.** These are the 7 values present in the corpus as of **2026-08-10**. The API **accepts values outside this list** — the corpus grows between refreshes, and refusing a value the warehouse can answer would be worse than an empty result. Treat an unlisted value as *possibly valid*, not invalid.</Warning>

The recipient region a project row CARRIES, which is AidData's regional grouping — NOT the vocabulary the `region=` filter accepts. The filter validates against the API-wide 19-value `region` enum, so a value read out of a row (`America`, `Multi-Region`) is rejected with 400 INVALID\_REGION if you send it straight back. Filter by `country` instead, or map the AidData region onto one of ours yourself.

`Africa` · `Asia` · `America` · `Oceania` · `Europe` · `Middle East` · `Multi-Region`

Discover the current set: `GET /api/v2/china/projects?limit=1 (read region; there is no group_by=region bucket)`

**Accepted by:** `region (response field — NOT the filter)`

**On:** `/api/v2/china/projects`

### `list_cadence`

<Warning>**Observed vocabulary — a measurement, not an allowlist.** These are the 2 values present in the corpus as of **2026-08-10**. The API **accepts values outside this list** — the corpus grows between refreshes, and refusing a value the warehouse can answer would be worse than an empty result. Treat an unlisted value as *possibly valid*, not invalid.</Warning>

How often a screening list is refreshed. Read straight off the catalogue and matched CASE-SENSITIVELY with no validation, so `cadence=Daily` returns zero rows while `cadence=daily` returns twelve. The sibling `jurisdiction` filter was made case-insensitive for exactly this reason; `cadence` was not.

`daily` · `episodic`

Discover the current set: `GET /api/v2/lists (read cadence on each catalogue entry)`

**Accepted by:** `cadence`

**On:** `/api/v2/lists`

### `gleif_jurisdiction`

<Warning>**Observed vocabulary — a measurement, not an allowlist.** These are the 250 values present in the corpus as of **2026-08-10** (307 distinct in total; the most frequent are listed). The API **accepts values outside this list** — the corpus grows between refreshes, and refusing a value the warehouse can answer would be worse than an empty result. Treat an unlisted value as *possibly valid*, not invalid.</Warning>

GLEIF's legal jurisdiction as published — ISO 3166-1 alpha-2 plus alpha-2/subdivision forms such as `US-CA`. Uppercased but NOT validated by the serve layer, unlike the three GLEIF status enums beside it, so an unlisted jurisdiction returns an empty 200.

`IN` · `IT` · `DE` · `GB` · `NL` · `ES` · `FR` · `US-DE` · `SE` · `DK` · `CN` · `LU` · `BE` · `NO` · `FI` · `AU` · `AT` · `KY` · `PL` · `IE` · `VG` · `CZ` · `EE` · `CH` · `HU` · `US` · `CA` · `US-CA` · `JP` · `PT` · `US-NY` · `LI` · `CY` · `CA-ON` · `SG` · `US-FL` · `JE` · `US-TX` · `HK` · `TR` · `US-OH` · `US-PA` · `RO` · `US-MA` · `GG` · `US-IL` · `CA-QC` · `GR` · `SK` · `MX` · `MT` · `US-MI` · `US-NJ` · `CA-BC` · `PA` · `BG` · `SA` · `IS` · `BS` · `LT` · `US-GA` · `SI` · `AE` · `US-MD` · `MU` · `US-NC` · `BR` · `US-WI` · `US-VA` · `LV` · `IM` · `NZ` · `BM` · `US-IN` · `CA-AB` · `US-NV` · `US-WA` · `ZA` · `US-CT` · `US-CO` · `HR` · `MH` · `US-MN` · `KR` · `AE-DU` · `US-TN` · `GI` · `US-MO` · `IL` · `TH` · `US-AZ` · `SC` · `MY` · `US-SC` · `US-OR` · `RU` · `TW` · `US-IA` · `CL` · `US-AL` · `US-LA` · `ID` · `BZ` · `US-KY` · `US-UT` · `US-OK` · `US-WY` · `US-NE` · `US-KS` · `US-NH` · `CA-MB` · `CO` · `CW` · `LR` · `NG` · `MC` · `US-ME` · `WS` · `AR` · `AE-AZ` · `US-AR` · `VC` · `US-RI` · `CA-SK` · `CA-NS` · `PH` · `US-DC` · `US-SD` · `US-ID` · `UY` · `PE` · `US-MS` · `KN` · `US-ND` · `CA-NB` · `AD` · `GB-NIR` · `PR` · `FO` · `US-NM` · `US-WV` · `KN-N` · `US-VT` · `US-HI` · `AI` · `VN` · `QA` · `CK` · `EG` · `GB-SCT` · `BB` · `KZ` · `US-MT` · `TC` · `KE` · `BH` · `RS` · `UA` · `LB` · `CR` · `US-AK` · `AE-RK` · `OM` · `MY-15` · `PY` · `BD` · `DO` · `KW` · `LC` · `MA` · `LK` · `VE` · `JO` · `GT` · `MK` · `VU` · `PK` · `GE` · `AE-SH` · `TN` · `EC` · `GH` · `BA` · `NC` · `DM` · `SM` · `CA-NL` · `PS` · `MO` · `SV` · `AE-AJ` · `AG` · `NA` · `CA-PE` · `KM` · `TT` · `UG` · `AL` · `KG` · `ZW` · `HN` · `AM` · `AO` · `PF` · `TZ` · `ME` · `GL` · `UZ` · `BW` · `AZ` · `ZM` · `VI` · `MN` · `BQ` · `JM` · `AW` · `MD` · `BY` · `IQ` · `XX` · `BO` · `CI` · `XK` · `AE-UQ` · `MV` · `FJ` · `NP` · `BN` · `KH` · `CD` · `AE-FU` · `NI` · `SN` · `MZ` · `GU` · `RW` · `YE` · `UN` · `SX` · `SR` · `CM` · `DZ` · `LA` · `TG` · `BF` · `PG` · `BE-VLG` · `ML` · `MR` · `FK`

Discover the current set: `GET /api/v2/gleif/entities?country=<iso3>&limit=1 (read legal_jurisdiction)`

**Accepted by:** `jurisdiction`

**On:** `/api/v2/gleif/entities`

### `gleif_relationship_status`

<Warning>**Observed vocabulary — a measurement, not an allowlist.** These are the 3 values present in the corpus as of **2026-08-10**. The API **accepts values outside this list** — the corpus grows between refreshes, and refusing a value the warehouse can answer would be worse than an empty result. Treat an unlisted value as *possibly valid*, not invalid.</Warning>

The status of a GLEIF relationship record. Unlike `relationship_type` beside it, this one is uppercased and passed through unvalidated, so it is published as measured.

`ACTIVE` · `NULL` · `INACTIVE`

Discover the current set: `GET /api/v2/gleif/relationships?lei=<lei> (read status)`

**Accepted by:** `relationship_status`

**On:** `/api/v2/gleif/relationships`

### `fara_country`

<Warning>**Observed vocabulary — a measurement, not an allowlist.** These are the 250 values present in the corpus as of **2026-08-10** (265 distinct in total; the most frequent are listed). The API **accepts values outside this list** — the corpus grows between refreshes, and refusing a value the warehouse can answer would be worse than an empty result. Treat an unlisted value as *possibly valid*, not invalid.</Warning>

The foreign principal's country AS FARA SPELLS IT — `KOREA, SOUTH`, `MYANMAR (BURMA)`, `GREAT BRITAIN`. The `country=` filter resolves your input to ISO-3 and then matches every stored spelling that maps to it, so you may send an ISO code or an English name; these are the raw values you will see in a response.

`JAPAN` · `CANADA` · `MEXICO` · `GREAT BRITAIN` · `FRANCE` · `KOREA, SOUTH` · `GERMANY, FEDERAL REPUBLIC OF` · `INTERNATIONAL` · `ISRAEL` · `USSR` · `CHINA` · `SAUDI ARABIA` · `TAIWAN` · `RUSSIA` · `DOMINICAN REPUBLIC` · `ITALY` · `NETHERLANDS` · `SWITZERLAND` · `TURKEY` · `AUSTRALIA` · `VENEZUELA` · `CUBA` · `GERMANY` · `HAITI` · `UKRAINE` · `POLAND` · `SPAIN` · `BRAZIL` · `PHILIPPINES` · `UNITED ARAB EMIRATES` · `PANAMA` · `SOUTH AFRICA` · `NIGERIA` · `COLOMBIA` · `SWEDEN` · `QATAR` · `ARGENTINA` · `ROMANIA` · `JAMAICA` · `PAKISTAN` · `INDIA` · `HONG KONG` · `IRAQ` · `INDONESIA` · `CZECHOSLOVAKIA` · `AUSTRIA` · `GUATEMALA` · `MOROCCO` · `BELGIUM` · `THAILAND` · `NICARAGUA` · `HUNGARY` · `BAHAMAS` · `NORWAY` · `IRELAND` · `LIBERIA` · `EGYPT` · `GREECE` · `DENMARK` · `EL SALVADOR` · `CHILE` · `LIBYA` · `PERU` · `ANGOLA` · `BERMUDA` · `ECUADOR` · `CONGO, DEMOCRATIC REPUBLIC OF THE` · `UNITED KINGDOM` · `CAYMAN ISLANDS` · `GEORGIA` · `COSTA RICA` · `IRAN` · `CONGO, REPUBLIC OF THE` · `YUGOSLAVIA` · `MALAYSIA` · `BULGARIA` · `GERMAN DEMOCRATIC REPUBLIC` · `COTE D'IVOIRE (IVORY COAST)` · `KAZAKHSTAN` · `ETHIOPIA` · `LEBANON` · `HONDURAS` · `FINLAND` · `KUWAIT` · `AZERBAIJAN` · `SINGAPORE` · `PORTUGAL` · `CYPRUS` · `BARBADOS` · `JORDAN` · `NEW ZEALAND` · `SOMALI DEMOCRATIC REPUBLIC` · `NETHERLANDS ANTILLES` · `AFGHANISTAN` · `KENYA` · `ALGERIA` · `GABON` · `SCOTLAND` · `BANGLADESH` · `SUDAN` · `VIETNAM` · `SERBIA` · `BOLIVIA` · `TRINIDAD AND TOBAGO` · `UZBEKISTAN` · `ALBANIA` · `SRI LANKA` · `CAMBODIA` · `BAHRAIN` · `ICELAND` · `BOSNIA & HERZEGOVINA` · `PALESTINE` · `MARSHALL ISLANDS` · `GUYANA` · `UGANDA` · `TUNISIA` · `NORTHERN IRELAND` · `CAMEROON` · `GHANA` · `LUXEMBOURG` · `CROATIA` · `ZIMBABWE` · `CURACAO` · `TOGO` · `ARUBA` · `KOSOVA` · `ANTIGUA & BARBUDA` · `ZAIRE` · `MOZAMBIQUE` · `GRENADA` · `YEMEN` · `SYRIA` · `ZAMBIA` · `OMAN` · `MONGOLIA` · `SIERRA LEONE` · `BRITISH VIRGIN ISLANDS` · `UNITED STATES` · `SAINT LUCIA` · `EQUATORIAL GUINEA` · `LATVIA` · `MALAWI` · `SENEGAL` · `NAMIBIA` · `MYANMAR (BURMA)` · `PARAGUAY` · `RWANDA` · `LITHUANIA` · `ARMENIA` · `TANZANIA` · `GUINEA` · `URUGUAY` · `MOLDOVA` · `MAURITANIA` · `DOMINICA` · `MACEDONIA` · `LIECHTENSTEIN` · `ERITREA` · `BENIN` · `SURINAME` · `MONACO` · `BELIZE` · `MALTA` · `ST. KITTS AND NEVIS` · `TURKS AND CAICOS ISLANDS` · `SLOVENIA` · `BELARUS` · `PALAU` · `SWAZILAND` · `PAPUA NEW GUINEA` · `CZECHIA` · `SOMALIA` · `FIJI` · `BOTSWANA` · `BURKINA FASO` · `MONTENEGRO` · `MAURITIUS` · `SLOVAKIA` · `ANGUILLA` · `KYRGYZSTAN` · `MALDIVES` · `BURUNDI` · `BIAFRA` · `GAMBIA, THE` · `BRUNEI` · `LAOS` · `MALI` · `SAINT VINCENT AND THE GRENADINES` · `BOPHUTHATSWANA` · `CABO VERDE` · `MONTSERRAT` · `SEYCHELLES` · `SOUTH SUDAN` · `NIGER` · `CHAD` · `TRANSKEI` · `NAURU` · `TIBET` · `TONGA` · `CEYLON (SRI LANKA)` · `REPUBLIC OF SOUTH SUDAN` · `MADAGASCAR` · `ISLE OF MAN` · `VIRGIN ISLANDS` · `PUERTO RICO` · `MICRONESIA` · `NEPAL` · `MACAU` · `VANUATU` · `LESOTHO` · `GUADELOUPE & MARTINIQUE` · `SOMALILAND` · `ESTONIA` · `TAHITI` · `SOUTH MOLUCCAS, REPUBLIC OF` · `CENTRAL AFRICAN REPUBLIC` · `CHANNEL ISLANDS` · `TAJIKISTAN` · `KOREA, NORTH` · `DJIBOUTI` · `UNKNOWN` · `ST. EUSTATIUS` · `TURKMENISTAN` · `ST. MARTIN` · `GUINEA-BISSAU` · `NAGORNO KARABAKH` · `GUERNSEY` · `BONAIRE` · `CISKEI` · `BURMA` · `SAHARAWI ARAB DEMOCRATIC REPUBLIC` · `UNITED STATES, MISCELLANEOUS CARIBBEAN ISLANDS` · `YEMEN, PEOPLES DEMOCRATIC REPUBLIC OF YEMEN` · `TIMOR-LESTE (EAST TIMOR)` · `WEST BERLIN` · `NEW CALEDONIA` · `WESTERN SAMOA` · `NORTH MACEDONIA` · `SAN MARINO` · `ENGLAND` · `DAHOMEY` · `UNITED KINGDOM OF CORALLAND` · `CENTRAL AND SOUTHERN LINE ISLANDS` · `BRITISH SOLOMON ISLANDS` · `SULU AND NORTH BORNEO` · `SAO TOME AND PRINCIPE` · `BRITISH WEST INDIES` · `VATICAN CITY` · `SOUTHERN YEMAN` · `GREENLAND`

Discover the current set: `GET /api/v2/gov/fara?entity=<id> (read country on each foreign principal)`

**Accepted by:** `country`

**On:** `/api/v2/gov/fara`

### `epoch_foundry`

<Warning>**Observed vocabulary — a measurement, not an allowlist.** These are the 5 values present in the corpus as of **2026-08-10**. The API **accepts values outside this list** — the corpus grows between refreshes, and refusing a value the warehouse can answer would be worse than an empty result. Treat an unlisted value as *possibly valid*, not invalid.</Warning>

The fab that manufactured the accelerator, as Epoch publishes it. Matched as a case-insensitive SUBSTRING with no validation, so a typo returns an empty 200 rather than a 400. Note some rows carry a comma-joined pair (`SMIC,TSMC`).

`TSMC` · `Samsung` · `SMIC` · `Intel` · `SMIC,TSMC`

Discover the current set: `GET /api/v2/epoch/hardware?limit=1 (read foundry)`

**Accepted by:** `foundry`

**On:** `/api/v2/epoch/hardware`

### `epoch_organization_categorization`

<Warning>**Observed vocabulary — a measurement, not an allowlist.** These are the 126 values present in the corpus as of **2026-08-10**. The API **accepts values outside this list** — the corpus grows between refreshes, and refusing a value the warehouse can answer would be worse than an empty result. Treat an unlisted value as *possibly valid*, not invalid.</Warning>

Epoch's classification of the publishing organization. The stored field is COMPOSITE — a paper with several organizations carries their categories comma-joined, which is why 126 distinct strings appear (measured 2026-08-10) behind four underlying categories, including repeats such as `Academia,Academia`. Substring-matched and unvalidated, so filtering on a single category works and an unlisted value is an empty 200 rather than a 400.

`Industry` · `Academia` · `Academia,Academia` · `Industry,Academia` · `Academia,Industry` · `Academia,Academia,Academia` · `Industry,Industry` · `Academia,Industry,Academia` · `Industry,Academia,Academia` · `Academia,Academia,Industry` · `Research collective` · `Government` · `Industry,Government` · `Industry,Academia,Academia,Academia` · `Research collective,Academia` · `Academia,Academia,Academia,Academia` · `Academia,Government` · `Academia,Industry,Industry` · `Industry,Industry,Industry` · `Academia,Research collective` · `Industry,Academia,Industry` · `Research collective,Industry,Academia,Academia,Industry,Industry,Academia` · `Academia,Academia,Academia,Industry,Academia` · `Industry,Research collective` · `Academia,Academia,Academia,Industry` · `Academia,Industry,Academia,Academia` · `Academia,Academia,Research collective` · `Academia,Academia,Academia,Academia,Academia` · `Industry,Industry,Academia` · `Industry,Academia,Academia,Academia,Academia` · `Academia,Academia,Industry,Academia` · `Academia,Academia,Academia,Academia,Industry` · `Industry,Academia,Academia,Academia,Academia,Academia` · `Research collective,Academia,Academia,Academia,Academia,Academia,Academia,Academia,Academia` · `Academia,Academia,Academia,Industry,Government,Academia` · `Academia,Industry,Research collective` · `Academia,Industry,Industry,Academia` · `Academia,Academia,Academia,Academia,Academia,Academia` · `Academia,Academia,Academia,Academia,Industry,Academia` · `Research collective,Academia,Academia` · `Academia,Academia,Research collective,Industry` · `Academia,Industry,Academia,Academia,Academia,Academia,Academia` · `Academia,Academia,Government` · `Academia,Industry,Government,Industry,Academia` · `Academia,Academia,Industry,Academia,Research collective` · `Industry,Research collective,Academia` · `Industry,Academia,Academia,Industry` · `Academia,Industry,Industry,Academia,Academia,Academia` · `Academia,Government,Academia` · `Academia,Academia,Academia,Government` · `Academia,Academia,Industry,Research collective` · `Academia,Research collective,Academia` · `Academia,Industry,Industry,Research collective` · `Academia,Industry,Academia,Industry,Government` · `Industry,Industry,Academia,Academia` · `Industry,Government,Academia,Academia,Government,Academia,Academia,Academia,Academia,Academia,Government` · `Academia,Academia,Industry,Academia,Academia` · `Research collective,Research collective,Academia,Academia,Government,Academia,Academia,Industry,Academia,Academia,Academia,Academia,Academia,Academia` · `Academia,Industry,Academia,Academia,Academia` · `Academia,Academia,Academia,Academia,Academia,Research collective` · `Academia,Industry,Academia,Academia,Academia,Academia,Research collective` · `Industry,Academia,Industry,Academia,Academia` · `Academia,Research collective,Industry` · `Academia,Industry,Academia,Industry` · `Industry,Government,Academia` · `Academia,Industry,Academia,Industry,Academia` · `Academia,Research collective,Research collective,Academia,Academia,Academia` · `Academia,Research collective,Academia,Research collective,Academia` · `Industry,Industry,Industry,Academia,Academia,Academia` · `Government,Industry,Academia,Industry,Academia` · `Industry,Academia,Academia,Academia,Government,Government` · `Industry,Industry,Academia,Academia,Academia,Academia,Academia,Academia,Industry,Academia,Academia,Government,Government,Academia,Academia,Academia,Academia,Industry,Academia,Industry,Academia,Academia,Academia,Academia,Industry,Industry,Industry,Academia,Academia,Government,Academia,Research collective,Government` · `Academia,Industry,Industry,Industry` · `Academia,Academia,Academia,Academia,Academia,Academia,Research collective` · `Industry,Government,Government,Government` · `Academia,Academia,Academia,Academia,Academia,Academia,Research collective,Industry,Academia,Academia,Academia` · `Academia,Industry,Government` · `Academia,Industry,Research collective,Academia,Academia` · `Research collective,Academia,Academia,Industry` · `Research collective,Industry` · `Academia,Industry,Academia,Academia,Academia,Academia` · `Academia,Academia,Academia,Academia,Industry,Industry,Academia,Academia` · `Industry,Industry,Academia,Academia,Research collective,Industry,Academia` · `Academia,Academia,Academia,Research collective` · `Academia,Academia,Academia,Academia,Research collective,Academia` · `Industry,Industry,Government,Government` · `Industry,Academia,Industry,Industry` · `Academia,Industry,Academia,Industry,Academia,Industry` · `Academia,Academia,Academia,Academia,Academia,Industry,Academia` · `Industry,Academia,Government,Academia` · `Academia,Academia,Research collective,Industry,Academia,Academia` · `Industry,Academia,Academia,Industry,Academia,Academia` · `Academia,Academia,Industry,Industry,Industry` · `Academia,Academia,Government,Academia,Academia,Academia,Academia,Government,Industry,Academia,Industry,Academia,Academia,Academia,Academia,Academia,Academia,Academia,Academia,Industry,Academia` · `Industry,Research collective,Academia,Academia,Academia,Academia` · `Industry,Academia,Academia,Academia,Industry,Academia` · `Research collective,Industry,Government,Academia` · `Industry,Academia,Research collective` · `Academia,Academia,Academia,Academia,Academia,Academia,Academia,Industry` · `Academia,Academia,Industry,Industry,Academia` · `Research collective,Research collective` · `Government,Academia,Academia` · `Academia,Research collective,Academia,Academia,Academia,Academia,Academia` · `Research collective,Industry,Academia,Academia` · `Government,Research collective` · `Academia,Academia,Academia,Industry,Industry` · `Industry,Government,Academia,Academia,Academia,Academia` · `Academia,Academia,Industry,Industry,Academia,Industry` · `Academia,Academia,Industry,Industry` · `Academia,Academia,Academia,Industry,Academia,Research collective` · `Academia,Industry,Academia,Research collective` · `Academia,Academia,Academia,Research collective,Academia,Academia` · `Academia,Academia,Academia,Research collective,Academia,Academia,Academia` · `Government,Academia,Government,Academia` · `Research collective,Academia,Industry` · `Industry,Government,Industry,Government` · `Academia,Academia,Academia,Academia,Academia,Industry,Academia,Research collective` · `Academia,Academia,Research collective,Academia,Academia,Industry,Academia` · `Industry,Government,Industry` · `Government,Academia` · `Industry,Academia,Industry,Academia` · `Government,Industry` · `Academia,Academia,Academia,Academia,Research collective` · `Academia,Research collective,Academia,Academia` · `Academia,Industry,Academia,Industry,Academia,Academia` · `Government,Academia,Industry`

Discover the current set: `GET /api/v2/epoch/models?limit=1 (read organization_categorization)`

**Accepted by:** `organization_categorization`

**On:** `/api/v2/epoch/models`

### `epoch_chip_manufacturer`

<Warning>**Observed vocabulary — a measurement, not an allowlist.** These are the 6 values present in the corpus as of **2026-08-10**. The API **accepts values outside this list** — the corpus grows between refreshes, and refusing a value the warehouse can answer would be worse than an empty result. Treat an unlisted value as *possibly valid*, not invalid.</Warning>

The accelerator designer in Epoch's chip-sales series. Lower-cased exact match with no validation — an unlisted manufacturer returns an empty 200.

`Nvidia` · `Google` · `Amazon` · `Huawei` · `AMD` · `Cambricon`

Discover the current set: `GET /api/v2/epoch/chip-sales?limit=1 (read chip_manufacturer)`

**Accepted by:** `chip_manufacturer`

**On:** `/api/v2/epoch/chip-sales`

### `coverage_language`

<Warning>**Observed vocabulary — a measurement, not an allowlist.** These are the 77 values present in the corpus as of **2026-08-10**. The API **accepts values outside this list** — the corpus grows between refreshes, and refusing a value the warehouse can answer would be worse than an empty result. Treat an unlisted value as *possibly valid*, not invalid.</Warning>

The languages the corpus actually carries, canonicalized toward ISO 639-1 (639-2 codes are folded to their 2-letter form, and a long tail of 639-3 codes survives for outlets that have no 639-1 code, e.g. `tet`, `crs`). The filter validates SHAPE, not membership: it rejects only a token that cannot be an ISO code — a normalized value longer than 3 characters, so `languages=english` is a 400 while `languages=zz` is an accepted, empty 200. A code absent from this list may still be valid; it just had no coverage in the measured window. THREE entries are upstream spellings that are NOT folded: `axe` is Azerbaijani (1,619 rows over 30 days, so `languages=az` currently returns nothing), `glg` is Galician, and `mon` is Mongolian, which is therefore split against the folded `mn`. Filter on the spelling you see here until they are folded and backfilled together.

| Value | Meaning                                             |
| ----- | --------------------------------------------------- |
| `en`  | English                                             |
| `es`  | Spanish                                             |
| `ar`  | Arabic                                              |
| `ru`  | Russian                                             |
| `el`  | Greek                                               |
| `it`  | Italian                                             |
| `pt`  | Portuguese                                          |
| `fr`  | French                                              |
| `zh`  | Chinese                                             |
| `id`  | Indonesian                                          |
| `uk`  | Ukrainian                                           |
| `tr`  | Turkish                                             |
| `ro`  | Romanian                                            |
| `de`  | German                                              |
| `sq`  | Albanian                                            |
| `sr`  | Serbian                                             |
| `ko`  | Korean                                              |
| `bn`  | Bengali                                             |
| `hi`  | Hindi                                               |
| `bg`  | Bulgarian                                           |
| `pl`  | Polish                                              |
| `bs`  | Bosnian                                             |
| `lt`  | Lithuanian                                          |
| `hu`  | Hungarian                                           |
| `cs`  | Czech                                               |
| `ne`  | Nepali                                              |
| `fi`  | Finnish                                             |
| `hr`  | Croatian                                            |
| `sl`  | Slovenian                                           |
| `mk`  | Macedonian                                          |
| `sv`  | Swedish                                             |
| `sk`  | Slovak                                              |
| `nl`  | Dutch                                               |
| `no`  | Norwegian                                           |
| `da`  | Danish                                              |
| `hy`  | Armenian                                            |
| `lv`  | Latvian                                             |
| `he`  | Hebrew                                              |
| `th`  | Thai                                                |
| `ur`  | Urdu                                                |
| `et`  | Estonian                                            |
| `is`  | Icelandic                                           |
| `mr`  | Marathi                                             |
| `ca`  | Catalan                                             |
| `axe` | Azerbaijani — upstream spelling, NOT folded to `az` |
| `vi`  | Vietnamese                                          |
| `ml`  | Malayalam                                           |
| `te`  | Telugu                                              |
| `ms`  | Malay                                               |
| `dv`  | Dhivehi                                             |
| `pa`  | Punjabi                                             |
| `ka`  | Georgian                                            |
| `gu`  | Gujarati                                            |
| `ta`  | Tamil                                               |
| `fa`  | Persian                                             |
| `glg` | Galician — upstream spelling, NOT folded to `gl`    |
| `my`  | Burmese                                             |
| `mn`  | Mongolian                                           |
| `so`  | Somali                                              |
| `sw`  | Swahili                                             |
| `kn`  | Kannada                                             |
| `mt`  | Maltese                                             |
| `si`  | Sinhala                                             |
| `uz`  | Uzbek                                               |
| `be`  | Belarusian                                          |
| `kk`  | Kazakh                                              |
| `rw`  | Kinyarwanda                                         |
| `tet` | Tetum                                               |
| `ky`  | Kyrgyz                                              |
| `am`  | Amharic                                             |
| `fo`  | Faroese                                             |
| `mon` | Mongolian — upstream spelling, NOT folded to `mn`   |
| `ja`  | Japanese                                            |
| `af`  | Afrikaans                                           |
| `tk`  | Turkmen                                             |
| `km`  | Khmer                                               |
| `crs` | Seychellois Creole                                  |

Discover the current set: `GET /api/v2/stories?limit=1 (read coverage.languages)`

**Accepted by:** `languages`

**On:** `/api/v2/events` · `/api/v2/stories` · `/api/v2/entities/{entity_id}/tone`

### `admin1`

<Warning>**Observed vocabulary — a measurement, not an allowlist.** These are the 120 values present in the corpus as of **2026-08-10** (3229 distinct in total; the most frequent are listed). The API **accepts values outside this list** — the corpus grows between refreshes, and refusing a value the warehouse can answer would be worse than an empty result. Treat an unlisted value as *possibly valid*, not invalid.</Warning>

Sub-national admin1 NAMES as the corpus spells them — not codes. This is a per-country vocabulary, so the list here is the most-covered slice of a much larger set (the artifact's distinct count is the real total); resolve the full set for one country through the discovery endpoint. Matching is case-insensitive and folds a trailing administrative suffix on both sides, so `Kharkiv Oblast` and `kharkiv` reach the same rows. The filter never rejects an unknown value.

`District of Columbia` · `California` · `Delhi` · `Texas` · `New York` · `Maharashtra` · `England` · `Ontario` · `Florida` · `Federal Capital Territory` · `Gauteng` · `Karnataka` · `Uttar Pradesh` · `Ohio` · `Pennsylvania` · `Tamil Nadu` · `British Columbia` · `Michigan` · `Punjab` · `Washington` · `Illinois` · `New South Wales` · `Jakarta` · `Georgia` · `Maryland` · `North Carolina` · `Kerala` · `Telangana` · `West Bengal` · `Oregon` · `Arizona` · `West Bank` · `Scotland` · `Massachusetts` · `Wisconsin` · `São Paulo` · `Lazio` · `Lagos State` · `Lombardy` · `Madhya Pradesh` · `Tennessee` · `Indiana` · `Missouri` · `Virginia` · `Colorado` · `Jammu and Kashmir` · `South Carolina` · `Community of Madrid` · `Bihar` · `Gujarat` · `Minnesota` · `Victoria` · `Hong Kong` · `Gaza Strip` · `New Jersey` · `Alberta` · `Kentucky` · `Louisiana` · `Maine` · `Andalusia` · `Odisha` · `Rajasthan` · `Central Region` · `Osun State` · `Guangdong` · `East Java` · `Western Cape` · `Oklahoma` · `Andhra Pradesh` · `Istanbul` · `Alabama` · `Île-de-France` · `Metro Manila` · `Nevada` · `West Java` · `Quebec` · `Catalonia` · `Haryana` · `Attica` · `Emilia-Romagna` · `Mexico City` · `Assam` · `Buenos Aires Province` · `Iowa` · `Sicily` · `Idaho` · `Lagos` · `Arkansas` · `Federal District` · `Campania` · `Dhaka Division` · `Wales` · `Kansas` · `Jharkhand` · `Utah` · `West Virginia` · `Bavaria` · `Masovian Voivodeship` · `Hawaii` · `KwaZulu-Natal` · `New Mexico` · `Nebraska` · `Nairobi County` · `Shanghai` · `Queensland` · `North Rhine-Westphalia` · `Republika Srpska` · `Sindh` · `Dubai` · `Western Australia` · `Buenos Aires` · `Mississippi` · `Uttarakhand` · `Western Province` · `Bucharest Municipality` · `Vilnius County` · `Connecticut` · `Kaduna State` · `Kano State` · `Galicia`

Discover the current set: `GET /api/v2/geo/admin1?country=<name|ISO-2|ISO-3|FIPS>`

**Accepted by:** `admin1`

**On:** `/api/v2/events` · `/api/v2/stories`

## Identifier spaces

### `entity_handle`

<Info>**Identifier space — not a vocabulary.** This is a key with a format and a resolver, not a list you can enumerate.</Info>

A key with a format, not a vocabulary — resolve one with `GET /api/v2/search` rather than constructing it. Several identifier spaces coexist (spine `e_…`, news `wiki:…`, `cik:`, `llm:`, GEM entity ids, LEI, UEI) and **the set an endpoint accepts differs by endpoint**. Sending an id from the wrong space generally returns an empty 200 rather than an error, so check the per-endpoint table at [https://docs.gdeltcloud.com/reference/parameters#identifier-parameters](https://docs.gdeltcloud.com/reference/parameters#identifier-parameters) before chaining two endpoints.

Resolve one with: `GET /api/v2/search?q=<name>`

**Accepted by:** `entity`

**On:** `/api/v2/events` · `/api/v2/stories` · `/api/v2/events/summary` · `/api/v2/stories/summary` · `/api/v2/facilities`

### `country`

<Info>**Identifier space — not a vocabulary.** This is a key with a format and a resolver, not a list you can enumerate.</Info>

A country KEY in any of four spellings: ISO 3166-1 alpha-3 (`UKR`), alpha-2 (`UA`), FIPS 10-4 (`UP`), or an English display name or alias (`Ukraine`). Comma-separate for OR. Two-letter input resolves as ISO-2 FIRST and FIPS second, so `CN` is China rather than Comoros. An unresolvable value returns 400 INVALID\_COUNTRY. `region` and `continent` are separate params and ARE closed vocabularies — they expand to a country set.

Resolve one with: `GET /api/v2/events?group_by=country — returns the ISO-3 codes with display names`

**Accepted by:** `actor_country`, `source_actor_country`, `target_actor_country`

**On:** `/api/v2/events` · `/api/v2/events/summary`
