UNKNOWN_PARAM | 400 | A strict descriptor-backed endpoint received a query parameter it does not declare. | Read details.param, details.did_you_mean and details.accepted_params; correct or remove the parameter. |
UNSUPPORTED_FILTER | 400 | A parameter this endpoint deliberately does not support. Rejected rather than ignored. | Read details.alternatives — the reference lists a replacement for every rejected parameter. |
INVALID_CURSOR | 400 | The pagination cursor could not be read. Cursors are opaque — construct them only by copying pagination.next_cursor. | Restart the walk from the first page and follow pagination.next_cursor. |
CURSOR_STALE | 400 | The cursor is valid but no longer describes this result set: it was issued against a pre-built daily snapshot, and this request is either being answered live or against a snapshot that has since been rebuilt. Continuing would repeat some rows and skip others, so the request is refused rather than answered plausibly. details.reason is row_source_changed or snapshot_rebuilt. | Restart the walk from the first page. A walk that must not be interrupted can pin itself to the live path by including a filter only the live path answers, such as sort=recent. |
UNSUPPORTED_PARAM | 400 | A parameter that is not part of this endpoint at all. | Check the parameter reference for the endpoint you are calling. |
INVALID_DATE | 400 | A date is not YYYY-MM-DD. | Use ISO dates. Times are not accepted on date parameters. |
INVALID_DATE_RANGE | 400 | date_start is after date_end. | Swap them. |
DATE_WINDOW_TOO_LARGE | 400 | The window exceeds this endpoint’s maximum span. | Narrow the window and page through it. Unbounded scans are refused, not served slowly. |
DATE_RANGE_REQUIRED | 400 | This endpoint will not run unbounded. | Pass days or an explicit date_start/date_end. |
INVALID_LIMIT | 400 | limit is outside the accepted range. | Use the documented maximum and paginate with cursor. |
INVALID_BBOX | 400 | A bounding box is malformed or inverted. | The axis order differs by family, and a swapped box usually returns an empty or wrong 200 rather than this error. Events, stories, facilities and energy take latitude first — lat_min,lon_min,lat_max,lon_max. Maritime takes longitude first — min_lon,min_lat,max_lon,max_lat. The per-parameter description in the spec is authoritative for the path you are calling. |
INVALID_NEAR | 400 | The near grammar does not match this endpoint’s. | Events and stories take lat,lon with a separate radius_km; facilities and energy take a single lat,lon,radius_km triple. The spec carries the right example per path. |
INVALID_ENTITY_ID | 400 | A bare name was sent where a resolved id is required. | Resolve it first with GET /api/v2/search, then pass the e_… id. |
AMBIGUOUS_LEGACY_ID | 409 | A legacy facility-unit id maps to more than one canonical physical site. | Use a canonical s_… site id returned by GET /api/v2/facilities; candidate ids are in details.canonical_site_ids. |
ENTITY_REQUIRED | 400 | This endpoint is per-entity and no entity was named. | Pass entity. |
FILTER_REQUIRED | 400 | This endpoint needs at least one narrowing filter. | Add a geography, taxonomy or entity filter. |
INVALID_LIST_SOURCE | 400 | An unknown screening list, or one we declare but do not yet carry. | Branch on details.reason: unknown_source_key vs declared_but_not_ingested. Never an empty success — on a sanctions surface that would read as a clean result. |
EVENT_FAMILY_CATEGORY_CONFLICT | 400 | A deprecated event_family contradicts the category sent with it. | Drop event_family; category implies the family. |
SUBCATEGORY_REQUIRES_CATEGORY | 400 | subcategory was sent with no category. Sub-event types are scoped by category and several labels are ambiguous without one. | Send category too. details.accepted_categories lists the categories that have subcategories. |
INVALID_SUBCATEGORY_FOR_CATEGORY | 400 | The subcategory is a real taxonomy code but not one that belongs to the category sent with it. | Read details.accepted_values — it is the subcategory list for the category you actually asked for. |
STORY_CATEGORY_CONFLICT | 400 | story_category and the deprecated category spelling of it were both sent, naming different values. | Send one. story_category is the current spelling. |
INVALID_NUMBER_RANGE | 400 | A metric _min is greater than its _max, so the range is empty. Refused rather than served as a (correct but useless) empty result. | Read details.min_value / details.max_value and swap them. |
EVENT_FAMILY_METRIC_CONFLICT | 400 | A metric only one event family publishes (magnitude, systemic_importance, propagation_potential, market_sensitivity — all CAMEO+) was combined with a taxonomy filter that commits the request to the other family. Unsatisfiable by construction: the conflict detail table has no such column. | Read details.metric_family and details.implied_family — they disagree. Drop the metric filter, move the taxonomy filter into details.metric_family, or use a metric both families publish (details.accepted_metrics_for_family). |