{"openapi":"3.1.0","info":{"title":"Living Signals API","description":"Use this read-only API to explore news-derived Claims, corroborated Signals, and related Topics by country. Start with GET /api/v1/countries to discover your access, then GET /api/v1/rubric to build filters. Explore Signals with GET /api/v1/signals and poll new Claims with GET /api/v1/claims.","version":"v1"},"tags":[{"name":"Discover","description":"Check your access and retrieve filter vocabularies."},{"name":"Explore","description":"Explore Signals and their related Topics."},{"name":"Evidence","description":"Retrieve Claims and their Sources."},{"name":"Meta","description":"Find endpoints, schemas, and documentation."}],"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","description":"API key as `Authorization: Bearer ls_live_...`. Managed at /access#keys."},"apiKeyAuth":{"type":"apiKey","in":"header","name":"X-API-Key","description":"The same API key as `X-API-Key: ls_live_...`, an alternative to the Authorization header."}},"schemas":{"Error":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","description":"Stable machine-readable code, e.g. invalid_parameter, country_not_entitled, not_found, rate_limit_exceeded."},"message":{"type":"string","description":"Human-readable explanation, often naming the offending value and how to fix it."}}}}}},"responses":{"BadRequest":{"description":"Malformed value, unsupported/retired parameter, or invalid cursor (invalid_parameter / invalid_cursor).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"Unauthorized":{"description":"Missing or unrecognized API key (missing_credentials / invalid_credentials).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"Forbidden":{"description":"Key or entitlement problem (country_not_entitled, annotation_layer_not_entitled, key_revoked, key_expired, customer_inactive).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"NotFound":{"description":"Unknown path or resource outside the retrievable corpus (not_found).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"TooManyRequests":{"description":"Customer-key rate limit exceeded (rate_limit_exceeded). See the Retry-After header.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"security":[{"bearerAuth":[]},{"apiKeyAuth":[]}],"paths":{"/api/v1":{"get":{"tags":["Meta"],"summary":"Discover the API","description":"Start with this public integration guide. It introduces the core resources and provides a recommended path from access discovery to incremental Claim polling.","security":[],"responses":{"200":{"description":"Response for status 200","content":{"application/json":{"schema":{"type":"object","required":["name","version","model","getting_started","documentation","documentation_html","documentation_note","openapi","reference","auth","rate_limit","validation","pagination","endpoints"],"properties":{"name":{"description":"API name.","type":"string"},"version":{"description":"API version.","type":"string"},"model":{"description":"Core data, browsing, and filtering concepts.","type":"object","required":["data_primitives","enrichment","filtering_and_organization"],"properties":{"data_primitives":{"description":"Claims and Signals used for durable integration.","type":"string"},"enrichment":{"description":"Topics used to browse related Signals.","type":"string"},"filtering_and_organization":{"description":"Rubric and annotation vocabularies used to filter Signals.","type":"string"}}},"getting_started":{"minItems":5,"maxItems":5,"description":"Recommended path from access discovery to incremental polling.","type":"array","items":{"type":"object","required":["step","request","purpose"],"properties":{"step":{"minimum":1,"maximum":5,"description":"Position in the integration path.","anyOf":[{"format":"integer","default":0,"type":"string"},{"minimum":1,"maximum":5,"description":"Position in the integration path.","type":"integer"}]},"request":{"description":"Request to make.","type":"string"},"purpose":{"description":"What this request helps you accomplish.","type":"string"}}}},"documentation":{"description":"Public Markdown reference path.","type":"string"},"documentation_html":{"description":"Public human-readable API documentation path.","type":"string"},"documentation_note":{"description":"Locations for related developer resources.","type":"string"},"openapi":{"description":"Public OpenAPI document path.","type":"string"},"reference":{"description":"Browsable API reference path.","type":"string"},"auth":{"type":"object","required":["scheme","customer_example","team_example","key_management","entitlements"],"properties":{"scheme":{"description":"Accepted API key headers.","type":"string"},"customer_example":{"description":"Authorization header for a customer key.","type":"string"},"team_example":{"description":"Authorization header for a team key.","type":"string"},"key_management":{"description":"Key management path.","type":"string"},"entitlements":{"description":"Country, annotation layer, and enrichment access rules.","type":"string"}}},"rate_limit":{"type":"object","required":["applies_to","default","response","headers"],"properties":{"applies_to":{"description":"Keys subject to rate limits.","type":"string"},"default":{"description":"Default request limit.","type":"string"},"response":{"description":"Response when the limit is exceeded.","type":"string"},"headers":{"description":"Rate limit response headers.","type":"string"}}},"validation":{"type":"object","required":["parameters","vocabulary","paths","methods"],"properties":{"parameters":{"description":"Query parameter validation rules.","type":"string"},"vocabulary":{"description":"Rubric and annotation code validation rules.","type":"string"},"paths":{"description":"Response for an unknown path.","type":"string"},"methods":{"description":"Responses for OPTIONS and unsupported methods.","type":"string"}}},"pagination":{"type":"object","required":["next_page","cursor","response"],"properties":{"next_page":{"description":"How to continue pagination.","type":"string"},"cursor":{"description":"Cursor usage and validation.","type":"string"},"response":{"description":"Page metadata.","type":"string"}}},"endpoints":{"description":"Available endpoints and their supported parameters.","type":"object","patternProperties":{"^(.*)$":{"type":"object","required":["description","auth","params"],"properties":{"description":{"description":"Purpose of the endpoint.","type":"string"},"auth":{"description":"Authentication requirement.","type":"string"},"params":{"description":"Supported query and path parameters.","type":"object","patternProperties":{"^(.*)$":{"type":"string"}}}}}}}},"additionalProperties":false}}}}},"operationId":"getApiV1"}},"/api/v1/countries":{"get":{"tags":["Discover"],"summary":"List country access and coverage","description":"Discover the countries and annotation layers available to your key. Each country includes Claim coverage dates and counts plus active Source coverage. Use /annotation-layers to retrieve code vocabularies.","responses":{"200":{"description":"Response for status 200","content":{"application/json":{"schema":{"type":"object","required":["countries","annotation_layers"],"properties":{"countries":{"description":"Countries available to your key, ordered by country code.","type":"array","items":{"type":"object","required":["code","name","status","claim_count","source_count","first_claim_at","last_claim_at"],"properties":{"code":{"description":"ISO 3166-1 alpha-2 country code. Customer grants remain visible when country metadata is unavailable.","type":"string"},"name":{"description":"Country display name, or null when metadata is unavailable.","anyOf":[{"type":"string"},{"type":"null"}]},"status":{"description":"Country coverage status, or null when metadata is unavailable.","anyOf":[{"type":"string"},{"type":"null"}]},"claim_count":{"minimum":0,"description":"Retrievable Claims for the country.","anyOf":[{"format":"integer","default":0,"type":"string"},{"minimum":0,"description":"Retrievable Claims for the country.","type":"integer"}]},"source_count":{"minimum":0,"description":"Distinct active Sources available for the country.","anyOf":[{"format":"integer","default":0,"type":"string"},{"minimum":0,"description":"Distinct active Sources available for the country.","type":"integer"}]},"first_claim_at":{"description":"Earliest Claim ingestion timestamp in RFC 3339 UTC, or null.","anyOf":[{"format":"date-time","type":"string"},{"type":"null"}]},"last_claim_at":{"description":"Latest Claim ingestion timestamp in RFC 3339 UTC, or null.","anyOf":[{"format":"date-time","type":"string"},{"type":"null"}]}}}},"annotation_layers":{"description":"Annotation layer ids available to your key. Team keys receive layer ids present in stored Signal annotations.","type":"array","items":{"type":"string"}}}}}}}},"operationId":"getApiV1Countries"}},"/api/v1/rubric":{"get":{"tags":["Discover"],"summary":"Get the rubric vocabulary","description":"Use the rubric to build `category`, `attribute`, and `attribute_any` filters. An attribute is a binary property that may be true for a Signal. A category groups related attributes and matches when any member attribute is true. Multiple `category` and `attribute_any` values use OR. Multiple `attribute` values use AND. This endpoint is public.","security":[],"responses":{"200":{"description":"Response for status 200","content":{"application/json":{"schema":{"type":"object","required":["version","categories","attributes"],"properties":{"version":{"description":"Rubric vocabulary version returned in each Signal's `rubric.version`.","type":"string"},"categories":{"description":"Categories group related attributes into broad filters.","type":"array","items":{"type":"object","required":["id","label","attributes"],"properties":{"id":{"description":"Category id accepted by `category` on /signals and /topics.","type":"string"},"label":{"type":"string"},"groups":{"type":"array","items":{"type":"object","required":["id","label","attributes"],"properties":{"id":{"type":"string"},"label":{"type":"string"},"attributes":{"type":"array","items":{"type":"string"}}}}},"analysis_version":{"type":"string"},"directions":{"type":"array","items":{"type":"string"}},"stages":{"type":"array","items":{"type":"string"}},"filter_syntax":{"type":"string"},"attributes":{"description":"Attributes in this category. A Signal matches when any listed attribute is true.","type":"array","items":{"type":"string"}}}}},"attributes":{"description":"Attributes are binary properties assigned to each Signal.","type":"array","items":{"type":"object","required":["id","label","description","section","categories"],"properties":{"id":{"description":"Attribute id accepted by `attribute` and `attribute_any` and returned in `rubric.attributes`.","type":"string"},"label":{"description":"Short display label when the attribute belongs to a category, or null.","anyOf":[{"type":"string"},{"type":"null"}]},"description":{"description":"Definition used to grade this attribute.","type":"string"},"section":{"description":"Group used to organize related attributes. This value is not filterable.","type":"string"},"categories":{"description":"Categories that include this attribute. An empty array means it does not belong to a category.","type":"array","items":{"type":"string"}}}}}},"additionalProperties":false}}}}},"operationId":"getApiV1Rubric"}},"/api/v1/annotation-layers":{"get":{"tags":["Discover"],"summary":"List annotation vocabularies","description":"List the annotation vocabularies available to your key. Customer keys receive only granted layers, including an empty list when none are granted. Team keys receive every registered layer.","responses":{"200":{"description":"Response for status 200","content":{"application/json":{"schema":{"type":"object","required":["layers"],"properties":{"layers":{"description":"Annotation layers available to your key. Team keys receive every registered layer.","type":"array","items":{"type":"object","required":["id","name","version","attribution","codes"],"properties":{"id":{"description":"Versioned layer id used as the Signal filter parameter and annotations key.","type":"string"},"name":{"description":"Display name for the classification vocabulary.","type":"string"},"version":{"description":"Vocabulary version.","type":"string"},"attribution":{"type":"object","required":["name","url"],"properties":{"name":{"description":"Name of the organization that maintains the vocabulary.","type":"string"},"url":{"description":"Official website for the vocabulary.","type":"string"}}},"codes":{"description":"Complete, ordered code vocabulary for this layer version.","type":"array","items":{"type":"object","required":["code","canonical","meaning"],"properties":{"code":{"description":"Exact value accepted by the filter and returned in annotations.","type":"string"},"canonical":{"description":"Canonical value or name in the external standard.","type":"string"},"meaning":{"description":"Definition of the code.","type":"string"}}}}}}}}}}}}},"operationId":"getApiV1Annotation-layers"}},"/api/v1/signals":{"get":{"tags":["Explore"],"summary":"List Signals","description":"List corroborated Signals for exploration. Responses cover the last 90 days of occurrences by default; pass `since` to widen or narrow the window, or `since=all` to remove it. Each parameter combines with the others using AND. Multiple values within `category`, `attribute_any`, or one annotation layer use OR. Multiple `attribute` values use AND. Unknown rubric ids or annotation codes return 400. Annotations appear only when your key can access stored data.","parameters":[{"name":"query","in":"query","required":false,"schema":{"description":"Search words and meaning across source Claims and places. Returns up to limit results ranked by relevance, with search.mode and search.truncated. Search does not accept cursor; narrow the query or filters when truncated. Query must be 2–500 characters.","type":"string"}},{"name":"country","in":"query","required":false,"schema":{"description":"Filter by ISO 3166-1 alpha-2 country code. Repeat or comma-separate values to use OR; matching ignores case. Omission uses your full country access, and an unentitled value returns 403.","type":"string"}},{"name":"category","in":"query","required":false,"schema":{"description":"Filter by rubric category. Repeat or comma-separate ids to match any Signal with a true attribute in any listed category. Unknown ids return 400 with a /rubric link.","type":"string"}},{"name":"attribute","in":"query","required":false,"schema":{"description":"Filter by rubric attributes that must all be true. WPS accepts id:direction[:stage] bound to the same finding. Repeat or comma-separate ids to use AND; unknown ids return 400 with a /rubric link.","type":"string"}},{"name":"attribute_any","in":"query","required":false,"schema":{"description":"Filter by rubric attributes where at least one must be true. WPS accepts id:direction[:stage] bound to the same finding. Repeat or comma-separate ids to use OR; this group combines with every other filter using AND. Unknown ids return 400.","type":"string"}},{"name":"glide_v1","in":"query","required":false,"schema":{"description":"Filter by GLIDE codes. Repeat or comma-separate codes to use OR within this layer; separate layers and rubric filters use AND. Unknown codes return 400, and an unentitled layer returns 403.","type":"string"}},{"name":"acled_v1","in":"query","required":false,"schema":{"description":"Filter by ACLED codes. Repeat or comma-separate codes to use OR within this layer; separate layers and rubric filters use AND. Unknown codes return 400, and an unentitled layer returns 403.","type":"string"}},{"name":"iasc_v1","in":"query","required":false,"schema":{"description":"Filter by IASC codes. Repeat or comma-separate codes to use OR within this layer; separate layers and rubric filters use AND. Unknown codes return 400, and an unentitled layer returns 403.","type":"string"}},{"name":"iep_positive_peace_v1","in":"query","required":false,"schema":{"description":"Filter by IEP Positive Peace pillars. Repeat or comma-separate codes to use OR within this layer; separate layers and rubric filters use AND. Append a direction to narrow one pillar, as `well_functioning_government:eroding`. Unknown codes return 400, and an unentitled layer returns 403.","type":"string"}},{"name":"iep_positive_peace_v1_direction","in":"query","required":false,"schema":{"description":"Filter by which way a pillar points: strengthening, eroding, or mixed. Repeat or comma-separate to use OR. Combined with a pillar filter the direction must hold for that pillar; alone it matches any pillar carrying it. Unknown values return 400, and an unentitled layer returns 403.","type":"string"}},{"name":"geospatial_v1","in":"query","required":false,"schema":{"description":"Filter by geospatial imagery-suitability codes. Repeat or comma-separate codes to use OR within this layer; separate layers and rubric filters use AND. Unknown codes return 400, and an unentitled layer returns 403.","type":"string"}},{"name":"topic","in":"query","required":false,"schema":{"description":"Filter by parent Topic UUID. Invalid UUIDs return 400 invalid_parameter.","type":"string"}},{"name":"since","in":"query","required":false,"schema":{"description":"Filter by Signals whose latest occurrence (`signal_end`) falls after this exclusive bound. Signals with no datable occurrence match only `all`. Defaults to 90d when omitted; pass `all` for the full corpus. Use <n>h, <n>d, <n>w, or an ISO date or timestamp; invalid values return 400.","type":"string"}},{"name":"limit","in":"query","required":false,"schema":{"description":"Set the page size to a positive integer. The default is 50; values above 500 are clamped to 500 and reflected in `pagination.limit`.","type":"string"}},{"name":"cursor","in":"query","required":false,"schema":{"description":"Continue a page walk with the opaque cursor from `nextPage`. Omit it to start; empty, malformed, or incompatible values return 400 invalid_cursor.","type":"string"}},{"name":"include_annotations","in":"query","required":false,"schema":{"description":"For team keys, set `true` to include all stored annotations; `false` or an empty value omits them. Customer responses always follow layer grants. Other values return 400.","type":"string"}}],"responses":{"200":{"description":"Response for status 200","content":{"application/json":{"schema":{"type":"object","required":["signals","nextPage","pagination"],"properties":{"search":{"type":"object","required":["query","reranked","mode","truncated","limit"],"properties":{"query":{"type":"string"},"reranked":{"type":"boolean"},"mode":{"type":"string","enum":["hybrid","lexical"]},"truncated":{"type":"boolean"},"limit":{"type":"number"}}},"signals":{"description":"Active, labeled Signals ordered for keyset pagination.","type":"array","items":{"type":"object","required":["id","label","description","country_code","signal_start","signal_end","last_claim_at","formed_at","claim_count","source_count","topic","analysis","rubric"],"properties":{"id":{"description":"Signal UUID.","type":"string"},"label":{"description":"Human-readable name for the occurrence.","type":"string"},"description":{"description":"Longer Signal description, or null.","anyOf":[{"type":"string"},{"type":"null"}]},"country_code":{"description":"ISO 3166-1 alpha-2 country code.","type":"string"},"signal_start":{"description":"Earliest effective date among the Signal's Claims, in YYYY-MM-DD format, or null.","anyOf":[{"type":"string"},{"type":"null"}]},"signal_end":{"description":"Latest effective date among the Signal's Claims, in YYYY-MM-DD format, or null.","anyOf":[{"type":"string"},{"type":"null"}]},"last_claim_at":{"description":"Most recent Claim activity timestamp in RFC 3339 UTC, or null.","anyOf":[{"format":"date-time","type":"string"},{"type":"null"}]},"formed_at":{"format":"date-time","description":"Signal formation timestamp in RFC 3339 UTC.","type":"string"},"claim_count":{"minimum":0,"description":"Claims in the Signal.","anyOf":[{"format":"integer","default":0,"type":"string"},{"minimum":0,"description":"Claims in the Signal.","type":"integer"}]},"source_count":{"minimum":0,"description":"Distinct Sources supporting the Signal.","anyOf":[{"format":"integer","default":0,"type":"string"},{"minimum":0,"description":"Distinct Sources supporting the Signal.","type":"integer"}]},"topic":{"description":"Current parent Topic, or null.","anyOf":[{"type":"object","required":["id","label"],"properties":{"id":{"description":"Current parent Topic UUID.","type":"string"},"label":{"description":"Parent Topic label.","type":"string"}}},{"type":"null"}]},"analysis":{"description":"Core WPS assessment and source-linked findings. Pending is not a negative or neutral assessment.","type":"object","required":["wps"],"properties":{"wps":{"anyOf":[{"type":"object","required":["version","status"],"properties":{"version":{"type":"string"},"status":{"const":"pending","type":"string"}}},{"type":"object","required":["version","status","evidence_fingerprint","assessed_at","model","findings"],"properties":{"version":{"type":"string"},"status":{"const":"complete","type":"string"},"evidence_fingerprint":{"type":"string"},"assessed_at":{"type":"string"},"model":{"type":"string"},"review_model":{"type":"string"},"findings":{"type":"array","items":{"type":"object","required":["attribute","direction","stage","rationale","evidence"],"properties":{"attribute":{"type":"string"},"direction":{"type":"string"},"stage":{"type":"string"},"rationale":{"type":"string"},"evidence":{"type":"array","items":{"type":"object","required":["claim_id","field","quote"],"properties":{"claim_id":{"type":"string"},"field":{"type":"string"},"quote":{"type":"string"}}}}}}}}}]}}},"rubric":{"description":"Rubric categories and attributes assigned to this Signal.","type":"object","required":["version","categories","attributes"],"properties":{"version":{"description":"Rubric version used to grade this Signal. Legacy rows use the current vocabulary.","type":"string"},"categories":{"description":"Derived category ids in canonical order. A category appears when any of its attributes is true.","type":"array","items":{"type":"string"}},"attributes":{"description":"True rubric attribute ids in stored order.","type":"array","items":{"type":"string"}}}},"annotations":{"description":"Stored annotations from external standards that your key can access. This field is absent when no annotations are included.","type":"object","patternProperties":{"^(.*)$":{"type":"object","required":["codes","rationale"],"properties":{"codes":{"description":"Codes assigned from this layer's versioned vocabulary.","type":"array","items":{"type":"string"}},"rationale":{"description":"Evidence-based explanation for the assigned codes.","type":"string"},"directions":{"description":"Which way the evidence points for each assigned code, keyed by code. Present only on layers whose codes name a condition rather than an occurrence, where the code alone would read as a verdict it does not make. Absent on layers that classify what happened.","type":"object","patternProperties":{"^(.*)$":{"anyOf":[{"const":"strengthening","type":"string"},{"const":"eroding","type":"string"},{"const":"mixed","type":"string"}]}}}}}}}}}},"nextPage":{"description":"Absolute URL for the next page, or null after the final page.","anyOf":[{"type":"string"},{"type":"null"}]},"pagination":{"type":"object","required":["limit","count"],"properties":{"limit":{"minimum":1,"maximum":500,"description":"Effective page size after applying the endpoint default and maximum.","anyOf":[{"format":"integer","default":0,"type":"string"},{"minimum":1,"maximum":500,"description":"Effective page size after applying the endpoint default and maximum.","type":"integer"}]},"count":{"minimum":0,"description":"Rows returned on this page.","anyOf":[{"format":"integer","default":0,"type":"string"},{"minimum":0,"description":"Rows returned on this page.","type":"integer"}]}}}}}}}}},"operationId":"getApiV1Signals"}},"/api/v1/signals/{id}":{"get":{"tags":["Explore"],"summary":"Retrieve a Signal","description":"Retrieve the canonical active Signal with all of its Claims, ordered by numeric Claim id. Attached imagery appears when the organization has the geospatial_v1 enrichment. Retired merge and split ids resolve through their primary successor and add resolved_from. A known id with no active successor returns 410 signal_retired; an id that never existed returns 404.","parameters":[{"name":"id","in":"path","required":true,"schema":{"description":"Signal UUID. Invalid UUIDs return 400 invalid_parameter.","type":"string"}},{"name":"include_annotations","in":"query","required":false,"schema":{"description":"For team keys, set `true` to include all stored annotations; `false` or an empty value omits them. Customer responses always follow layer grants. Other values return 400.","type":"string"}}],"responses":{"200":{"description":"Response for status 200","content":{"application/json":{"schema":{"type":"object","required":["signal"],"properties":{"signal":{"type":"object","required":["id","label","description","country_code","signal_start","signal_end","last_claim_at","formed_at","claim_count","source_count","topic","analysis","rubric","claims"],"properties":{"id":{"description":"Signal UUID.","type":"string"},"label":{"description":"Human-readable name for the occurrence.","type":"string"},"description":{"description":"Longer Signal description, or null.","anyOf":[{"type":"string"},{"type":"null"}]},"country_code":{"description":"ISO 3166-1 alpha-2 country code.","type":"string"},"signal_start":{"description":"Earliest effective date among the Signal's Claims, in YYYY-MM-DD format, or null.","anyOf":[{"type":"string"},{"type":"null"}]},"signal_end":{"description":"Latest effective date among the Signal's Claims, in YYYY-MM-DD format, or null.","anyOf":[{"type":"string"},{"type":"null"}]},"last_claim_at":{"description":"Most recent Claim activity timestamp in RFC 3339 UTC, or null.","anyOf":[{"format":"date-time","type":"string"},{"type":"null"}]},"formed_at":{"format":"date-time","description":"Signal formation timestamp in RFC 3339 UTC.","type":"string"},"claim_count":{"minimum":0,"description":"Claims in the Signal.","anyOf":[{"format":"integer","default":0,"type":"string"},{"minimum":0,"description":"Claims in the Signal.","type":"integer"}]},"source_count":{"minimum":0,"description":"Distinct Sources supporting the Signal.","anyOf":[{"format":"integer","default":0,"type":"string"},{"minimum":0,"description":"Distinct Sources supporting the Signal.","type":"integer"}]},"topic":{"description":"Current parent Topic, or null.","anyOf":[{"type":"object","required":["id","label"],"properties":{"id":{"description":"Current parent Topic UUID.","type":"string"},"label":{"description":"Parent Topic label.","type":"string"}}},{"type":"null"}]},"analysis":{"description":"Core WPS assessment and source-linked findings. Pending is not a negative or neutral assessment.","type":"object","required":["wps"],"properties":{"wps":{"anyOf":[{"type":"object","required":["version","status"],"properties":{"version":{"type":"string"},"status":{"const":"pending","type":"string"}}},{"type":"object","required":["version","status","evidence_fingerprint","assessed_at","model","findings"],"properties":{"version":{"type":"string"},"status":{"const":"complete","type":"string"},"evidence_fingerprint":{"type":"string"},"assessed_at":{"type":"string"},"model":{"type":"string"},"review_model":{"type":"string"},"findings":{"type":"array","items":{"type":"object","required":["attribute","direction","stage","rationale","evidence"],"properties":{"attribute":{"type":"string"},"direction":{"type":"string"},"stage":{"type":"string"},"rationale":{"type":"string"},"evidence":{"type":"array","items":{"type":"object","required":["claim_id","field","quote"],"properties":{"claim_id":{"type":"string"},"field":{"type":"string"},"quote":{"type":"string"}}}}}}}}}]}}},"rubric":{"description":"Rubric categories and attributes assigned to this Signal.","type":"object","required":["version","categories","attributes"],"properties":{"version":{"description":"Rubric version used to grade this Signal. Legacy rows use the current vocabulary.","type":"string"},"categories":{"description":"Derived category ids in canonical order. A category appears when any of its attributes is true.","type":"array","items":{"type":"string"}},"attributes":{"description":"True rubric attribute ids in stored order.","type":"array","items":{"type":"string"}}}},"annotations":{"description":"Stored annotations from external standards that your key can access. This field is absent when no annotations are included.","type":"object","patternProperties":{"^(.*)$":{"type":"object","required":["codes","rationale"],"properties":{"codes":{"description":"Codes assigned from this layer's versioned vocabulary.","type":"array","items":{"type":"string"}},"rationale":{"description":"Evidence-based explanation for the assigned codes.","type":"string"},"directions":{"description":"Which way the evidence points for each assigned code, keyed by code. Present only on layers whose codes name a condition rather than an occurrence, where the code alone would read as a verdict it does not make. Absent on layers that classify what happened.","type":"object","patternProperties":{"^(.*)$":{"anyOf":[{"const":"strengthening","type":"string"},{"const":"eroding","type":"string"},{"const":"mixed","type":"string"}]}}}}}}},"imagery":{"minItems":1,"description":"Attached satellite imagery available through the geospatial_v1 enrichment. The field is absent without that entitlement or attached imagery.","type":"array","items":{"type":"object","required":["kind","provider","scene_id","scene_datetime","scene_cloud_cover","aoi_cloud_fraction","bbox","width","height","attribution","caption","url"],"properties":{"kind":{"description":"Imagery purpose, such as `post_event`.","type":"string"},"provider":{"description":"Satellite imagery product provider.","type":"string"},"scene_id":{"description":"Provider scene identifier.","type":"string"},"scene_datetime":{"format":"date-time","description":"Scene acquisition timestamp in RFC 3339 UTC.","type":"string"},"scene_cloud_cover":{"description":"Provider-reported scene cloud cover, or null when unavailable.","anyOf":[{"type":"number"},{"type":"null"}]},"aoi_cloud_fraction":{"description":"Cloud fraction over the Signal area of interest, or null when unavailable.","anyOf":[{"type":"number"},{"type":"null"}]},"bbox":{"description":"Chip bounds as [west, south, east, north].","type":"array","items":[{"description":"Western longitude.","type":"number"},{"description":"Southern latitude.","type":"number"},{"description":"Eastern longitude.","type":"number"},{"description":"Northern latitude.","type":"number"}],"additionalItems":false,"minItems":4,"maxItems":4},"width":{"minimum":1,"description":"Chip width in pixels.","anyOf":[{"format":"integer","default":0,"type":"string"},{"minimum":1,"description":"Chip width in pixels.","type":"integer"}]},"height":{"minimum":1,"description":"Chip height in pixels.","anyOf":[{"format":"integer","default":0,"type":"string"},{"minimum":1,"description":"Chip height in pixels.","type":"integer"}]},"attribution":{"description":"Attribution that must accompany the imagery.","type":"string"},"caption":{"description":"Analyst-written explanation of what this chip shows for the Signal, or null when none has been written.","anyOf":[{"type":"string"},{"type":"null"}]},"url":{"description":"Authenticated REST path for the PNG chip.","type":"string"}}}},"claims":{"description":"All retrievable Claims in the Signal, ordered by numeric id.","type":"array","items":{"type":"object","required":["id","claim","event_date","occurred_on","extracted_at","country_code","geo_scope","place_name","place_country","region_code","lat","lng","signal_id","article","source"],"properties":{"id":{"description":"Immutable numeric Claim id. It is a string because the value may exceed the safe JSON integer range.","type":"string"},"claim":{"description":"Assertion extracted from the source.","type":"string"},"event_date":{"description":"Event date stated by the source in YYYY-MM-DD format, or null.","anyOf":[{"type":"string"},{"type":"null"}]},"occurred_on":{"description":"Canonical occurrence date in YYYY-MM-DD format: `event_date` when stated, else the article publish date. Null means the occurrence time is unknown; such Claims match only `since=all`. This is the date `since` filters on.","anyOf":[{"type":"string"},{"type":"null"}]},"extracted_at":{"format":"date-time","description":"Ingestion timestamp in RFC 3339 UTC. Poll with `since_extracted`.","type":"string"},"country_code":{"description":"ISO 3166-1 alpha-2 country code used to ingest and authorize access to the Claim.","type":"string"},"geo_scope":{"description":"Geographic precision of the Claim: `point`, `country`, `region`, or null.","anyOf":[{"type":"string"},{"type":"null"}]},"place_name":{"description":"Extracted place name, or null.","anyOf":[{"type":"string"},{"type":"null"}]},"place_country":{"description":"ISO 3166-1 alpha-2 code for the extracted place, or null.","anyOf":[{"type":"string"},{"type":"null"}]},"region_code":{"description":"UN M49 region code for a region-scoped Claim, or null.","anyOf":[{"type":"string"},{"type":"null"}]},"lat":{"description":"Latitude when `geo_scope` is `point` and both coordinates are available; otherwise null.","anyOf":[{"type":"number"},{"type":"null"}]},"lng":{"description":"Longitude when `geo_scope` is `point` and both coordinates are available; otherwise null.","anyOf":[{"type":"number"},{"type":"null"}]},"signal_id":{"description":"Current Signal UUID, or null before the Claim is assigned.","anyOf":[{"type":"string"},{"type":"null"}]},"article":{"description":"Article metadata, or null when source content is unavailable.","anyOf":[{"type":"object","required":["url","title","published_at"],"properties":{"url":{"description":"Canonical URL for the source content.","type":"string"},"title":{"description":"Article title with common and numeric HTML entities decoded, or null.","anyOf":[{"type":"string"},{"type":"null"}]},"published_at":{"description":"Publication timestamp in RFC 3339 UTC, or null.","anyOf":[{"format":"date-time","type":"string"},{"type":"null"}]}}},{"type":"null"}]},"source":{"description":"Source metadata, or null when the relationship is unavailable.","anyOf":[{"type":"object","required":["id","name","language","country_code"],"properties":{"id":{"description":"Source UUID.","type":"string"},"name":{"description":"Source display name, or null.","anyOf":[{"type":"string"},{"type":"null"}]},"language":{"description":"Source language code, or null.","anyOf":[{"type":"string"},{"type":"null"}]},"country_code":{"description":"ISO 3166-1 alpha-2 code for the Source headquarters, or null.","anyOf":[{"type":"string"},{"type":"null"}]}}},{"type":"null"}]}}}}}},"resolved_from":{"type":"object","required":["requested_id","relation","resolved_at_depth","overlap"],"properties":{"requested_id":{"description":"Retired Signal UUID supplied in the request.","type":"string"},"relation":{"type":"string","enum":["merged","split"]},"resolved_at_depth":{"minimum":1,"maximum":10,"description":"Number of lineage transitions followed to reach the canonical Signal.","anyOf":[{"format":"integer","default":0,"type":"string"},{"minimum":1,"maximum":10,"description":"Number of lineage transitions followed to reach the canonical Signal.","type":"integer"}]},"overlap":{"description":"Stored overlap score for the first transition, or null when unavailable.","anyOf":[{"type":"number"},{"type":"null"}]}}}}}}}},"410":{"description":"Response for status 410","content":{"application/json":{"schema":{"type":"object","required":["error","id","relation","successors"],"properties":{"error":{"const":"signal_retired","type":"string"},"id":{"description":"Requested Signal UUID.","type":"string"},"relation":{"type":"string","enum":["merged","split","dissolved"]},"last_seen":{"format":"date-time","description":"Last timestamp associated with the retired reference, when derivable.","type":"string"},"successors":{"minItems":0,"maxItems":0,"description":"Empty because no active successor is available.","type":"array","items":{"type":"string"}}}}}}}},"operationId":"getApiV1SignalsById"}},"/api/v1/topics":{"get":{"tags":["Explore"],"summary":"List Topics","description":"Topics group related Signals for browsing. Responses cover the last 90 days of occurrences by default; pass `since` to widen or narrow the window, or `since=all` to remove it. Topic ids can change between processing runs, and the API does not preserve old ids. Store Signal or Claim ids instead. Every rubric filter, annotation filter, and `since` bound must match the same active, labeled Signal within a Topic. Values within `category`, `attribute_any`, and each annotation layer use OR. Values within `attribute` and separate filter groups use AND. Topic responses do not include rubric or annotation data.","parameters":[{"name":"country","in":"query","required":false,"schema":{"description":"Filter by the Topic's ISO 3166-1 alpha-2 country code. Repeat or comma-separate values to use OR; matching ignores case. Omission uses your full country access, and an unentitled value returns 403.","type":"string"}},{"name":"category","in":"query","required":false,"schema":{"description":"Filter Topics by rubric category on a grouped Signal. Repeat or comma-separate ids to use OR; unknown ids return 400.","type":"string"}},{"name":"attribute","in":"query","required":false,"schema":{"description":"Filter Topics by attributes that one grouped Signal must all have. WPS accepts id:direction[:stage]. Repeat or comma-separate ids to use AND; unknown ids return 400.","type":"string"}},{"name":"attribute_any","in":"query","required":false,"schema":{"description":"Filter Topics by attributes where at least one must be true on the same grouped Signal. WPS accepts id:direction[:stage]. Repeat or comma-separate ids to use OR; unknown ids return 400.","type":"string"}},{"name":"glide_v1","in":"query","required":false,"schema":{"description":"Filter Topics by GLIDE codes on the same grouped Signal. Repeat or comma-separate codes to use OR within this layer. Unknown codes return 400, and an unentitled layer returns 403.","type":"string"}},{"name":"acled_v1","in":"query","required":false,"schema":{"description":"Filter Topics by ACLED codes on the same grouped Signal. Repeat or comma-separate codes to use OR within this layer. Unknown codes return 400, and an unentitled layer returns 403.","type":"string"}},{"name":"iasc_v1","in":"query","required":false,"schema":{"description":"Filter Topics by IASC codes on the same grouped Signal. Repeat or comma-separate codes to use OR within this layer. Unknown codes return 400, and an unentitled layer returns 403.","type":"string"}},{"name":"iep_positive_peace_v1","in":"query","required":false,"schema":{"description":"Filter Topics by IEP Positive Peace pillars on the same grouped Signal. Repeat or comma-separate codes to use OR within this layer. Unknown codes return 400, and an unentitled layer returns 403.","type":"string"}},{"name":"iep_positive_peace_v1_direction","in":"query","required":false,"schema":{"description":"Filter Topics by which way a pillar points on the same grouped Signal: strengthening, eroding, or mixed. Repeat or comma-separate to use OR. Unknown values return 400, and an unentitled layer returns 403.","type":"string"}},{"name":"geospatial_v1","in":"query","required":false,"schema":{"description":"Filter Topics by geospatial imagery-suitability codes on the same grouped Signal. Repeat or comma-separate codes to use OR within this layer. Unknown codes return 400, and an unentitled layer returns 403.","type":"string"}},{"name":"since","in":"query","required":false,"schema":{"description":"Filter by Topics grouping a Signal whose latest occurrence falls after this exclusive bound. Defaults to 90d when omitted; pass `all` for the full corpus. Use <n>h, <n>d, <n>w, or an ISO date or timestamp; invalid values return 400.","type":"string"}},{"name":"limit","in":"query","required":false,"schema":{"description":"Set the page size to a positive integer. The default is 50; values above 500 are clamped to 500 and reflected in `pagination.limit`.","type":"string"}},{"name":"cursor","in":"query","required":false,"schema":{"description":"Continue a page walk with the opaque cursor from `nextPage`. Omit it to start; empty, malformed, or incompatible values return 400 invalid_cursor.","type":"string"}}],"responses":{"200":{"description":"Response for status 200","content":{"application/json":{"schema":{"type":"object","required":["topics","nextPage","pagination"],"properties":{"topics":{"description":"Active, labeled Topics ordered for keyset pagination.","type":"array","items":{"type":"object","required":["id","label","description","country_code","signal_count","claim_count","last_claim_at","formed_at","is_fallback"],"properties":{"id":{"description":"Topic UUID. Do not store it; ids can change between processing runs.","type":"string"},"label":{"description":"Topic label.","type":"string"},"description":{"description":"Topic description, or null.","anyOf":[{"type":"string"},{"type":"null"}]},"country_code":{"description":"ISO 3166-1 alpha-2 country code.","type":"string"},"signal_count":{"minimum":0,"description":"Active Signals grouped into this Topic.","anyOf":[{"format":"integer","default":0,"type":"string"},{"minimum":0,"description":"Active Signals grouped into this Topic.","type":"integer"}]},"claim_count":{"minimum":0,"description":"Stored number of Claims represented by this Topic.","anyOf":[{"format":"integer","default":0,"type":"string"},{"minimum":0,"description":"Stored number of Claims represented by this Topic.","type":"integer"}]},"last_claim_at":{"description":"Most recent Topic activity timestamp in RFC 3339 UTC, or null.","anyOf":[{"format":"date-time","type":"string"},{"type":"null"}]},"formed_at":{"format":"date-time","description":"Topic formation timestamp in RFC 3339 UTC.","type":"string"},"is_fallback":{"description":"Whether this is the fallback Topic for Signals that do not form a coherent group.","type":"boolean"}}}},"nextPage":{"description":"Absolute URL for the next page, or null after the final page.","anyOf":[{"type":"string"},{"type":"null"}]},"pagination":{"type":"object","required":["limit","count"],"properties":{"limit":{"minimum":1,"maximum":500,"description":"Effective page size after applying the endpoint default and maximum.","anyOf":[{"format":"integer","default":0,"type":"string"},{"minimum":1,"maximum":500,"description":"Effective page size after applying the endpoint default and maximum.","type":"integer"}]},"count":{"minimum":0,"description":"Rows returned on this page.","anyOf":[{"format":"integer","default":0,"type":"string"},{"minimum":0,"description":"Rows returned on this page.","type":"integer"}]}}}}}}}}},"operationId":"getApiV1Topics"}},"/api/v1/claims":{"get":{"tags":["Evidence"],"summary":"List Claims","description":"List extracted Claims in numeric id order. Browsing responses cover the last 90 days of activity by default; pass `since` to change the window or `since=all` to remove it. Country, Signal, `since`, and `since_extracted` filters combine with AND. Poll with `since_extracted`, which turns the default window off so no back-dated Claim is skipped. Follow every `nextPage`. Overlap time windows and deduplicate by Claim id. New Claims may have `signal_id: null` until they are assigned to a Signal.","parameters":[{"name":"query","in":"query","required":false,"schema":{"description":"Search words and meaning across source Claims and places. Returns up to limit results ranked by relevance, with search.mode and search.truncated. Search does not accept cursor; narrow the query or filters when truncated. Query must be 2–500 characters.","type":"string"}},{"name":"country","in":"query","required":false,"schema":{"description":"Filter by ISO 3166-1 alpha-2 country code. Repeat or comma-separate values to use OR; matching ignores case. Omission uses your full country access, and an unentitled value returns 403.","type":"string"}},{"name":"signal","in":"query","required":false,"schema":{"description":"Filter by current Signal UUID. Invalid UUIDs return 400 invalid_parameter.","type":"string"}},{"name":"since","in":"query","required":false,"schema":{"description":"Filter by occurrence time (`occurred_on`: event date, else article publish date) after this exclusive bound. Claims with unknown occurrence time match only `all`. Defaults to 90d when omitted and `since_extracted` is absent; pass `all` for the full corpus. Use <n>h, <n>d, <n>w, or an ISO date or timestamp; invalid values return 400.","type":"string"}},{"name":"since_extracted","in":"query","required":false,"schema":{"description":"Filter by `extracted_at` after this exclusive bound. Never defaults, and suppresses the default `since` window so polling stays lossless. Use <n>h, <n>d, <n>w, or an ISO date or timestamp; invalid values return 400.","type":"string"}},{"name":"limit","in":"query","required":false,"schema":{"description":"Set the page size to a positive integer. The default is 50; values above 500 are clamped to 500 and reflected in `pagination.limit`.","type":"string"}},{"name":"cursor","in":"query","required":false,"schema":{"description":"Continue a page walk with the opaque cursor from `nextPage`. Omit it to start; empty, malformed, or incompatible values return 400 invalid_cursor.","type":"string"}}],"responses":{"200":{"description":"Response for status 200","content":{"application/json":{"schema":{"type":"object","required":["claims","nextPage","pagination"],"properties":{"search":{"type":"object","required":["query","reranked","mode","truncated","limit"],"properties":{"query":{"type":"string"},"reranked":{"type":"boolean"},"mode":{"type":"string","enum":["hybrid","lexical"]},"truncated":{"type":"boolean"},"limit":{"type":"number"}}},"claims":{"description":"Extracted Claims ordered by numeric id.","type":"array","items":{"type":"object","required":["id","claim","event_date","occurred_on","extracted_at","country_code","geo_scope","place_name","place_country","region_code","lat","lng","signal_id","article","source"],"properties":{"id":{"description":"Immutable numeric Claim id. It is a string because the value may exceed the safe JSON integer range.","type":"string"},"claim":{"description":"Assertion extracted from the source.","type":"string"},"event_date":{"description":"Event date stated by the source in YYYY-MM-DD format, or null.","anyOf":[{"type":"string"},{"type":"null"}]},"occurred_on":{"description":"Canonical occurrence date in YYYY-MM-DD format: `event_date` when stated, else the article publish date. Null means the occurrence time is unknown; such Claims match only `since=all`. This is the date `since` filters on.","anyOf":[{"type":"string"},{"type":"null"}]},"extracted_at":{"format":"date-time","description":"Ingestion timestamp in RFC 3339 UTC. Poll with `since_extracted`.","type":"string"},"country_code":{"description":"ISO 3166-1 alpha-2 country code used to ingest and authorize access to the Claim.","type":"string"},"geo_scope":{"description":"Geographic precision of the Claim: `point`, `country`, `region`, or null.","anyOf":[{"type":"string"},{"type":"null"}]},"place_name":{"description":"Extracted place name, or null.","anyOf":[{"type":"string"},{"type":"null"}]},"place_country":{"description":"ISO 3166-1 alpha-2 code for the extracted place, or null.","anyOf":[{"type":"string"},{"type":"null"}]},"region_code":{"description":"UN M49 region code for a region-scoped Claim, or null.","anyOf":[{"type":"string"},{"type":"null"}]},"lat":{"description":"Latitude when `geo_scope` is `point` and both coordinates are available; otherwise null.","anyOf":[{"type":"number"},{"type":"null"}]},"lng":{"description":"Longitude when `geo_scope` is `point` and both coordinates are available; otherwise null.","anyOf":[{"type":"number"},{"type":"null"}]},"signal_id":{"description":"Current Signal UUID, or null before the Claim is assigned.","anyOf":[{"type":"string"},{"type":"null"}]},"article":{"description":"Article metadata, or null when source content is unavailable.","anyOf":[{"type":"object","required":["url","title","published_at"],"properties":{"url":{"description":"Canonical URL for the source content.","type":"string"},"title":{"description":"Article title with common and numeric HTML entities decoded, or null.","anyOf":[{"type":"string"},{"type":"null"}]},"published_at":{"description":"Publication timestamp in RFC 3339 UTC, or null.","anyOf":[{"format":"date-time","type":"string"},{"type":"null"}]}}},{"type":"null"}]},"source":{"description":"Source metadata, or null when the relationship is unavailable.","anyOf":[{"type":"object","required":["id","name","language","country_code"],"properties":{"id":{"description":"Source UUID.","type":"string"},"name":{"description":"Source display name, or null.","anyOf":[{"type":"string"},{"type":"null"}]},"language":{"description":"Source language code, or null.","anyOf":[{"type":"string"},{"type":"null"}]},"country_code":{"description":"ISO 3166-1 alpha-2 code for the Source headquarters, or null.","anyOf":[{"type":"string"},{"type":"null"}]}}},{"type":"null"}]}}}},"nextPage":{"description":"Absolute URL for the next page, or null after the final page.","anyOf":[{"type":"string"},{"type":"null"}]},"pagination":{"type":"object","required":["limit","count"],"properties":{"limit":{"minimum":1,"maximum":500,"description":"Effective page size after applying the endpoint default and maximum.","anyOf":[{"format":"integer","default":0,"type":"string"},{"minimum":1,"maximum":500,"description":"Effective page size after applying the endpoint default and maximum.","type":"integer"}]},"count":{"minimum":0,"description":"Rows returned on this page.","anyOf":[{"format":"integer","default":0,"type":"string"},{"minimum":0,"description":"Rows returned on this page.","type":"integer"}]}}}}}}}}},"operationId":"getApiV1Claims"}},"/api/v1/claims/{id}":{"get":{"tags":["Evidence"],"summary":"Retrieve a Claim","description":"Retrieve one extracted Claim. Claims rejected or failed during extraction are not available and return 404. Existing Claims outside your country access return 403.","parameters":[{"name":"id","in":"path","required":true,"schema":{"description":"Numeric Claim id. Non-numeric values return 400 invalid_parameter.","type":"string"}}],"responses":{"200":{"description":"Response for status 200","content":{"application/json":{"schema":{"type":"object","required":["claim"],"properties":{"claim":{"type":"object","required":["id","claim","event_date","occurred_on","extracted_at","country_code","geo_scope","place_name","place_country","region_code","lat","lng","signal_id","article","source"],"properties":{"id":{"description":"Immutable numeric Claim id. It is a string because the value may exceed the safe JSON integer range.","type":"string"},"claim":{"description":"Assertion extracted from the source.","type":"string"},"event_date":{"description":"Event date stated by the source in YYYY-MM-DD format, or null.","anyOf":[{"type":"string"},{"type":"null"}]},"occurred_on":{"description":"Canonical occurrence date in YYYY-MM-DD format: `event_date` when stated, else the article publish date. Null means the occurrence time is unknown; such Claims match only `since=all`. This is the date `since` filters on.","anyOf":[{"type":"string"},{"type":"null"}]},"extracted_at":{"format":"date-time","description":"Ingestion timestamp in RFC 3339 UTC. Poll with `since_extracted`.","type":"string"},"country_code":{"description":"ISO 3166-1 alpha-2 country code used to ingest and authorize access to the Claim.","type":"string"},"geo_scope":{"description":"Geographic precision of the Claim: `point`, `country`, `region`, or null.","anyOf":[{"type":"string"},{"type":"null"}]},"place_name":{"description":"Extracted place name, or null.","anyOf":[{"type":"string"},{"type":"null"}]},"place_country":{"description":"ISO 3166-1 alpha-2 code for the extracted place, or null.","anyOf":[{"type":"string"},{"type":"null"}]},"region_code":{"description":"UN M49 region code for a region-scoped Claim, or null.","anyOf":[{"type":"string"},{"type":"null"}]},"lat":{"description":"Latitude when `geo_scope` is `point` and both coordinates are available; otherwise null.","anyOf":[{"type":"number"},{"type":"null"}]},"lng":{"description":"Longitude when `geo_scope` is `point` and both coordinates are available; otherwise null.","anyOf":[{"type":"number"},{"type":"null"}]},"signal_id":{"description":"Current Signal UUID, or null before the Claim is assigned.","anyOf":[{"type":"string"},{"type":"null"}]},"article":{"description":"Article metadata, or null when source content is unavailable.","anyOf":[{"type":"object","required":["url","title","published_at"],"properties":{"url":{"description":"Canonical URL for the source content.","type":"string"},"title":{"description":"Article title with common and numeric HTML entities decoded, or null.","anyOf":[{"type":"string"},{"type":"null"}]},"published_at":{"description":"Publication timestamp in RFC 3339 UTC, or null.","anyOf":[{"format":"date-time","type":"string"},{"type":"null"}]}}},{"type":"null"}]},"source":{"description":"Source metadata, or null when the relationship is unavailable.","anyOf":[{"type":"object","required":["id","name","language","country_code"],"properties":{"id":{"description":"Source UUID.","type":"string"},"name":{"description":"Source display name, or null.","anyOf":[{"type":"string"},{"type":"null"}]},"language":{"description":"Source language code, or null.","anyOf":[{"type":"string"},{"type":"null"}]},"country_code":{"description":"ISO 3166-1 alpha-2 code for the Source headquarters, or null.","anyOf":[{"type":"string"},{"type":"null"}]}}},{"type":"null"}]}}}}}}}}},"operationId":"getApiV1ClaimsById"}},"/api/v1/sources":{"get":{"tags":["Evidence"],"summary":"List Sources","description":"List active Sources by country membership. A Source appears once for each country it covers. Country and language parameters combine with AND. Multiple values within either parameter use OR. Results use stable keyset order by Source UUID and country code. `claim_count_30d` reports coverage and does not affect ordering.","parameters":[{"name":"country","in":"query","required":false,"schema":{"description":"Filter by ISO 3166-1 alpha-2 country code. Repeat or comma-separate values to use OR; matching ignores case. Omission uses your full country access, and an unentitled value returns 403.","type":"string"}},{"name":"language","in":"query","required":false,"schema":{"description":"Filter by a two- or three-letter language code. Repeat or comma-separate values to use OR; matching lowercases input. Invalid values return 400 invalid_parameter.","type":"string"}},{"name":"limit","in":"query","required":false,"schema":{"description":"Set the page size to a positive integer. The default is 100; values above 500 are clamped to 500 and reflected in `pagination.limit`.","type":"string"}},{"name":"cursor","in":"query","required":false,"schema":{"description":"Continue a page walk with the opaque cursor from `nextPage`. Omit it to start; empty, malformed, or incompatible values return 400 invalid_cursor.","type":"string"}}],"responses":{"200":{"description":"Response for status 200","content":{"application/json":{"schema":{"type":"object","required":["sources","nextPage","pagination"],"properties":{"sources":{"description":"Active Source and country pairs ordered by Source UUID and country code.","type":"array","items":{"type":"object","required":["id","name","url","domain","language","country_code","type","claim_count_30d"],"properties":{"id":{"description":"Source UUID.","type":"string"},"name":{"description":"Source display name.","type":"string"},"url":{"description":"Canonical source URL.","type":"string"},"domain":{"description":"Lowercase hostname without a leading www., or null when the URL is invalid.","anyOf":[{"type":"string"},{"type":"null"}]},"language":{"description":"Two- or three-letter source language code, or null.","anyOf":[{"type":"string"},{"type":"null"}]},"country_code":{"description":"ISO 3166-1 alpha-2 country membership represented by this row.","type":"string"},"type":{"description":"Source type, or null.","anyOf":[{"type":"string"},{"type":"null"}]},"claim_count_30d":{"minimum":0,"description":"Claims collected from this Source and country in the previous 30 days.","anyOf":[{"format":"integer","default":0,"type":"string"},{"minimum":0,"description":"Claims collected from this Source and country in the previous 30 days.","type":"integer"}]}}}},"nextPage":{"description":"Absolute URL for the next page, or null after the final page.","anyOf":[{"type":"string"},{"type":"null"}]},"pagination":{"type":"object","required":["limit","count"],"properties":{"limit":{"minimum":1,"maximum":500,"description":"Effective page size after applying the endpoint default and maximum.","anyOf":[{"format":"integer","default":0,"type":"string"},{"minimum":1,"maximum":500,"description":"Effective page size after applying the endpoint default and maximum.","type":"integer"}]},"count":{"minimum":0,"description":"Rows returned on this page.","anyOf":[{"format":"integer","default":0,"type":"string"},{"minimum":0,"description":"Rows returned on this page.","type":"integer"}]}}}}}}}}},"operationId":"getApiV1Sources"}},"/api/v1/openapi.json":{"get":{"tags":["Meta"],"summary":"Download the OpenAPI document","description":"Returns the public OpenAPI 3.1 document. Query parameters do not change the document. Browse the rendered reference at /reference.","security":[],"responses":{"200":{"description":"OpenAPI 3.1 document in JSON format.","content":{"application/json":{"schema":{"type":"object"}}}}}}},"/api/v1/docs":{"get":{"tags":["Meta"],"summary":"Read the Markdown reference","description":"Returns the public API reference as Markdown. Query parameters do not change the response.","security":[],"responses":{"200":{"description":"API reference in Markdown format.","content":{"text/markdown":{"schema":{"type":"string"}}}}}}},"/api/v1/signals/{id}/imagery/{kind}.png":{"get":{"tags":["Explore"],"summary":"Retrieve attached Signal imagery","description":"Returns an attached satellite imagery chip for the canonical active Signal when the organization has the geospatial_v1 enrichment. Retired merge and split ids resolve through their primary successor. Missing, non-attached, and unentitled imagery returns 404.","parameters":[{"name":"id","in":"path","required":true,"description":"Signal UUID.","schema":{"type":"string","format":"uuid"}},{"name":"kind","in":"path","required":true,"description":"Imagery kind, such as `post_event`.","schema":{"type":"string","example":"post_event"}}],"responses":{"200":{"description":"Attached satellite imagery chip.","headers":{"Cache-Control":{"description":"Private-cache lifetime for the chip.","schema":{"type":"string","example":"private, max-age=86400"}},"X-Imagery-Attribution":{"description":"Attribution that must accompany the imagery.","schema":{"type":"string"}}},"content":{"image/png":{"schema":{"type":"string","format":"binary"}}}},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"}}}}}}