Browse endpoints and schemas
Generated from OpenAPI

Endpoints

Stories are the primary unit. Search responses include ranked story summaries and document metadata; full story and document access depends on the customer tier. All /v1 operations require a customer API key. Origin-backed data routes follow the origin implementation; organization-owned saved Feeds are gateway-native on-demand searches. Only routes exposed by the gateway appear here. This public contract describes the customer gateway. Undocumented origin routes are not reachable through the gateway. Facts are forward-only classifier observations, not verified event evidence. Historical documents without a current snapshot remain unknown; there is no backfill guarantee. Free search returns aggregate Facts without document IDs or provenance only when every canonical member meets both the 24-hour delay and seven-day history window. Free cannot fetch direct story or document detail. Pro and Business can access full story Facts and document-scoped Facts with provenance. Search cursors are pagination positions, not snapshots or late-update streams: concurrent changes can reorder or repeat stories. The Business /v1/changes cursor tracks newly ready story/member assignments, not classification-only or Facts snapshot updates; periodically reconcile with a full search.

GET/v1/stories
Free

Search stories

Stories

Returns matching stories by newest member ingest/change sequence. Up to three source documents accompany each story by default. Add `include=members` for every member. Array filters are OR within one field and different fields are ANDed. Array query values may be repeated or comma-separated. Non-safety filter fields must match the same candidate member. A story qualifies when a nonduplicate member matches those fields, but safety filters additionally inspect the complete canonical story: `exclude_sensitive=true` and `brand_safe=true` require every member to pass, while `brand_safe=false` requires a known unsafe member. Returned aggregates and members describe the complete story and are not pruned by the filter. Pass a non-null `next_cursor` as the next request's `cursor`. Deduplicate across search pages by `story_id`, because an older member can make a multi-member story appear again. Search pagination is not snapshot-isolated: Facts snapshots can change between pages. Deduplicate by story_id and periodically restart full search; next_cursor is not a late-update feed. Free returns aggregate Facts only for stories whose every canonical member meets both the 24-hour delay and seven-day history window. Missing or outdated legacy snapshots remain unknown.

Parameters

entityqueryarray

Canonical names mentioned anywhere; repeat or comma-separate for OR.

aboutqueryarray

Canonical names centrally covered; older records without `about` do not match.

entity_idqueryarray

Fans United IDs mentioned anywhere; unresolved IDs safely match nothing.

about_idqueryarray

Fans United IDs centrally covered; unresolved IDs safely match nothing.

sportqueryarray

Repeat or comma-separate for OR.

story_typequeryarray

Repeat or comma-separate for OR.

certaintyqueryarray

Repeat or comma-separate for OR.

betting_suitabilityqueryarray

Repeat or comma-separate deterministic suitability values for OR.

countryqueryarray

ISO 3166-1 alpha-2 publisher country; repeat or comma-separate for OR.

languagequeryarray

Lowercase ISO 639-1 article language; repeat or comma-separate for OR.

sourcequeryarray

Publisher slug to include; repeat or comma-separate for OR.

exclude_sourcequeryarray

Prevent listed publishers' rows from qualifying a story. Does not remove those publishers from a story that qualifies through another member.

exclude_sensitivequeryboolean

Set to `true` only when every canonical story member has a current affirmative `none` sensitivity assessment. Unknown or older assessments are excluded. `false` does not filter.

brand_safequeryboolean

`true` requires every canonical story member to have a current affirmative safe assessment; `false` selects a story with at least one known unsafe member. Unknown is neither true nor false.

content_formatqueryarray

Content format; repeat or comma-separate for OR. Rich predicates must match the same canonical member.

has_quotesqueryboolean

Optional request parameter.

has_videoqueryboolean

Optional request parameter.

has_official_statementqueryboolean

Optional request parameter.

paywalledqueryboolean

Optional request parameter.

content_lengthqueryarray

Optional request parameter.

reading_time_minqueryinteger

Inclusive minimum reading time in minutes.

reading_time_maxqueryinteger

Inclusive maximum reading time in minutes.

is_officialqueryboolean

Match an explicitly official or non-official source; unknown matches neither value.

window_hoursquerynumber

Rolling age in hours; boundary is exclusive.

published_afterquerystring

Inclusive publication/discovery lower bound; mutually exclusive with window_hours.

published_beforequerystring

Inclusive publication/discovery upper bound; mutually exclusive with window_hours.

min_publishersqueryinteger

Minimum distinct publishers in the matching candidate-member subset.

primary_reporting_onlyqueryboolean

Require at least one original-reporting member in the matching candidate-member subset. Only literal `true` enables it.

limitqueryinteger

Page size. Clients must send an integer from 1 through 500.

cursorqueryinteger

Opaque search cursor returned by the previous page.

includequerystring

Use `members` to include all documents instead of at most three.

cURL example
curl 'https://api.rabonaintel.com/v1/stories?sport=football&certainty=confirmed&limit=5' \
  -H 'Authorization: Bearer ***' \
  -H 'Accept: application/json'
Responses200400401403429500503
POST/v1/stories
Free

Search stories with a JSON filter

Stories

Supports the query filters plus absolute `published_after` and `published_before` timestamps. Use this form for long entity lists. `include=members` remains a query parameter. Search pagination is not snapshot-isolated: Facts snapshots can change between pages. Deduplicate by story_id and periodically restart full search; next_cursor is not a late-update feed. Free returns aggregate Facts only for stories whose every canonical member meets both the 24-hour delay and seven-day history window. Missing or outdated legacy snapshots remain unknown.

Parameters

includequerystring

Use `members` to include all documents instead of at most three.

JSON body: StoryFilter

cURL example
curl 'https://api.rabonaintel.com/v1/stories' \
  -H 'Authorization: Bearer ***' \
  -H 'Accept: application/json' \
  -H 'Content-Type: application/json' \
  --data '{"sports":["football"],"certainty":["confirmed"],"limit":5}'
Responses200400401403429500503
GET/v1/stories/{story_id}
Pro

Get one story with every member

Stories

Pro and Business only: full all-member Facts observations and references. Legacy snapshot coverage is unknown, with no backfill guarantee.

Parameters

story_idpathinteger · required

Example: 65756061

If-None-Matchheaderstring

A prior response ETag. A matching validator returns `304` with no body.

cURL example
curl 'https://api.rabonaintel.com/v1/stories/18421' \
  -H 'Authorization: Bearer ***' \
  -H 'Accept: application/json'
Responses200304401403404429500503
GET/v1/changes
Business

Read the change feed using query filters

Changes

Gateway convenience form. Filters are canonicalized into the origin POST request. Business tier only. This cursor follows newly ready story/member assignments, not classification-only or Facts snapshot updates; it is not a late-update feed. Periodically reconcile consumers with a full story search.

Parameters

entityqueryarray

Canonical names mentioned anywhere; repeat or comma-separate for OR.

aboutqueryarray

Canonical names centrally covered; older records without `about` do not match.

entity_idqueryarray

Fans United IDs mentioned anywhere; unresolved IDs safely match nothing.

about_idqueryarray

Fans United IDs centrally covered; unresolved IDs safely match nothing.

sportqueryarray

Repeat or comma-separate for OR.

story_typequeryarray

Repeat or comma-separate for OR.

certaintyqueryarray

Repeat or comma-separate for OR.

betting_suitabilityqueryarray

Repeat or comma-separate deterministic suitability values for OR.

countryqueryarray

ISO 3166-1 alpha-2 publisher country; repeat or comma-separate for OR.

languagequeryarray

Lowercase ISO 639-1 article language; repeat or comma-separate for OR.

sourcequeryarray

Publisher slug to include; repeat or comma-separate for OR.

exclude_sourcequeryarray

Prevent listed publishers' rows from qualifying a story. Does not remove those publishers from a story that qualifies through another member.

exclude_sensitivequeryboolean

Set to `true` only when every canonical story member has a current affirmative `none` sensitivity assessment. Unknown or older assessments are excluded. `false` does not filter.

brand_safequeryboolean

`true` requires every canonical story member to have a current affirmative safe assessment; `false` selects a story with at least one known unsafe member. Unknown is neither true nor false.

window_hoursquerynumber

Rolling age in hours; boundary is exclusive.

published_afterquerystring

Inclusive publication/discovery lower bound; mutually exclusive with window_hours.

published_beforequerystring

Inclusive publication/discovery upper bound; mutually exclusive with window_hours.

min_publishersqueryinteger

Minimum distinct publishers in the matching candidate-member subset.

primary_reporting_onlyqueryboolean

Require at least one original-reporting member in the matching candidate-member subset. Only literal `true` enables it.

content_formatqueryarray

Content format; repeat or comma-separate for OR. Rich predicates must match the same canonical member.

has_quotesqueryboolean

Optional request parameter.

has_videoqueryboolean

Optional request parameter.

has_official_statementqueryboolean

Optional request parameter.

paywalledqueryboolean

Optional request parameter.

content_lengthqueryarray

Optional request parameter.

reading_time_minqueryinteger

Inclusive minimum reading time in minutes.

reading_time_maxqueryinteger

Inclusive maximum reading time in minutes.

is_officialqueryboolean

Match an explicitly official or non-official source; unknown matches neither value.

sincequeryinteger

Previous changes cursor; use 0 for the beginning of retained history.

limitqueryinteger

Matching stories per page. Clients must send an integer from 1 through 500.

cURL example
curl 'https://api.rabonaintel.com/v1/changes' \
  -H 'Authorization: Bearer ***' \
  -H 'Accept: application/json'
Responses200400401403429500503
POST/v1/changes
Business

Consume filtered changes using JSON

Changes

`since` and page `limit` remain query parameters. Body `cursor` and `limit` fields are intentionally not part of this operation. As with GET, assessment-only updates do not advance the cursor; periodically reconcile filtered consumers with a full search. This ingest-readiness cursor does not advance on Facts snapshot-only updates; it is not a late-update feed.

Parameters

sincequeryinteger

Previous changes cursor; use 0 for the beginning of retained history.

limitqueryinteger

Matching stories per page. Clients must send an integer from 1 through 500.

JSON body: ChangesFilter

cURL example
curl 'https://api.rabonaintel.com/v1/changes' \
  -H 'Authorization: Bearer ***' \
  -H 'Accept: application/json' \
  -H 'Content-Type: application/json' \
  --data '{"sports":["football"],"certainty":["confirmed"]}'
Responses200400401403429500503
POST/v1/documents/batch
Pro

Get up to 100 documents

Documents

Unknown and duplicate-canonicalized IDs are omitted. Missing retained body objects do not omit a document; they produce `body_available=false`. Output order is not guaranteed to match input order, and repeated input IDs do not guarantee repeated output records.

JSON body: object { ids }

cURL example
curl 'https://api.rabonaintel.com/v1/documents/batch' \
  -H 'Authorization: Bearer ***' \
  -H 'Accept: application/json' \
  -H 'Content-Type: application/json' \
  --data '{"ids":[12345,12346]}'
Responses200400401403429500503
GET/v1/documents/{document_id}
Pro

Get one complete source document

Documents

Returns metadata, classification, entity IDs, annotated blocks, plain article text, story membership, and provenance. After object retention a document can still return 200 with `body_available: false`, `blocks: null`, and `text: null`. Pro and Business only: document-scoped Facts and provenance for current snapshots; legacy or mismatched snapshots remain unknown.

Parameters

document_idpathinteger · required

Example: 65756061

If-None-Matchheaderstring

A prior response ETag. A matching validator returns `304` with no body.

cURL example
curl 'https://api.rabonaintel.com/v1/documents/12345' \
  -H 'Authorization: Bearer ***' \
  -H 'Accept: application/json'
Responses200304401403404429500503
GET/v1/entities
Free

Search canonical entity names

Entities

Use this before saving name filters. `q` uses case-insensitive SQL `LIKE` semantics, where `%` matches any character run and `_` matches one character. Results are ordered by document frequency and then name. External ID fields are null when no trustworthy Fans United mapping exists.

Parameters

qquerystring

Case-insensitive SQL LIKE pattern; `%` and `_` are wildcards.

sportquerySport

Canonical sport in which the entity appeared.

kindquerystring

Example: teams

limitqueryinteger

Page size. Clients must send an integer from 1 through 500.

cURL example
curl 'https://api.rabonaintel.com/v1/entities' \
  -H 'Authorization: Bearer ***' \
  -H 'Accept: application/json'
Responses200400401403429500503
GET/v1/sources
Free

List publishers represented in the visible corpus

Entities

Parameters

sportquerySport

Example: football

countryquerystring

Optional request parameter.

cURL example
curl 'https://api.rabonaintel.com/v1/sources' \
  -H 'Authorization: Bearer ***' \
  -H 'Accept: application/json'
Responses200401403429500503
GET/v1/stats
Free

Get corpus totals and retention policy

System
cURL example
curl 'https://api.rabonaintel.com/v1/stats' \
  -H 'Authorization: Bearer ***' \
  -H 'Accept: application/json'
Responses200401403429500503
GET/v1/feeds
Pro

List saved Feeds

Feeds

Pro and Business API keys can list up to 100 organization-owned saved searches with each current resolved_filter.

cURL example
curl 'https://api.rabonaintel.com/v1/feeds' \
  -H 'Authorization: Bearer ***' \
  -H 'Accept: application/json'
Responses200401403429503
POST/v1/feeds
Pro

Create a saved Feed

Feeds

Save filters for later on-demand execution. Up to 100 Feeds per organization. No alert or change feed is created.

JSON body: SavedFeedDraft

cURL example
curl 'https://api.rabonaintel.com/v1/feeds' \
  -H 'Authorization: Bearer ***' \
  -H 'Accept: application/json' \
  -H 'Content-Type: application/json' \
  --data '{"slug":"football-watch","name":"Football watch","filter":{"sports":["football"]}}'
Responses201400401403404409429503
GET/v1/feeds/{slug}
Pro

Read a saved Feed

Feeds

Return the saved filter and its current inherited resolved_filter.

Parameters

slugpathstring · required

Organization-scoped Feed slug.

cURL example
curl 'https://api.rabonaintel.com/v1/feeds/football-watch' \
  -H 'Authorization: Bearer ***' \
  -H 'Accept: application/json'
Responses200401403404429503
PUT/v1/feeds/{slug}
Pro

Update a saved Feed

Feeds

Partially update name, parent or filter; slug is immutable. Parent edits affect children on their next read.

Parameters

slugpathstring · required

Organization-scoped Feed slug.

JSON body: SavedFeedUpdate

cURL example
curl 'https://api.rabonaintel.com/v1/feeds/football-watch' \
  -X PUT \
  -H 'Authorization: Bearer ***' \
  -H 'Accept: application/json' \
  -H 'Content-Type: application/json' \
  --data '{"name":"Football desk"}'
Responses200400401403404409429503
DELETE/v1/feeds/{slug}
Pro

Delete a saved Feed

Feeds

A parent with children cannot be deleted.

Parameters

slugpathstring · required

Organization-scoped Feed slug.

cURL example
curl 'https://api.rabonaintel.com/v1/feeds/football-watch' \
  -X DELETE \
  -H 'Authorization: Bearer ***' \
  -H 'Accept: application/json'
Responses204401403404409429503
GET/v1/feeds/{slug}/stories
Pro

Run a saved Feed

Feeds

Execute the current inherited filter as a fresh story search. This is on-demand, not an alert or lossless change feed; repeat full searches to reconcile later updates. Responses are not stored by the gateway. Free keys are denied.

Parameters

slugpathstring · required

Organization-scoped Feed slug.

limitqueryinteger

Capped by the caller plan; the public maximum is 500.

cursorqueryinteger

Search pagination position, not a durable update cursor.

includequerystring

Full member detail only when the plan allows it.

cURL example
curl 'https://api.rabonaintel.com/v1/feeds/football-watch/stories' \
  -H 'Authorization: Bearer ***' \
  -H 'Accept: application/json'
Responses200400401403404413429502503
GET/v1/feeds/{slug}/changes
Business

Poll changes to a saved Feed

Feeds

Business only. This is a pull-only, commit-ordered change stream: Rabona does not send notifications, Slack messages, email, webhooks, queue deliveries, or automatic retries. Activate by omitting both since and feed_version; activation returns the current next_cursor and an sfv1 feed_version with no historical operations. Build a fresh baseline with /v1/feeds/{slug}/stories, then poll with both values. Each upsert adds or completely replaces a schema-valid complete Story in the local projection; each remove deletes story_id. limit measures scanned origin events, not returned operations, so a filtered page can be empty and next_cursor can still advance. Always persist next_cursor, including on empty pages, and continue immediately while more is true. Saved Feed changes currently reject filters using about_ids, entity_ids, countries, languages, sources, exclude_sources, published_after, published_before, or window_hours with feed_not_streamable; use supported fields or run the Feed on demand. A 409 feed_changed means the saved definition or applicable policy changed: discard the local projection and continuation state, reactivate without since, rebuild a fresh snapshot, and resume with the new cursor and version. A 410 cursor_expired means retention passed the cursor and requires the same fresh-snapshot recovery. A 503 stream_inactive is a safe origin response indicating that the journal is not active; other origin unavailability is mapped to origin_unavailable. All responses use Cache-Control: no-store.

Parameters

slugpathstring · required

Organization-scoped Feed slug.

sincequerystring

Continuation cursor. Omit only for activation; otherwise required together with feed_version.

feed_versionquerystring

Required with since on every poll. Omit only for activation.

limitqueryinteger

Polling only. Requested origin-event scan budget, clamped to the Business plan maximum. It does not limit the number of matching operations.

cURL example
curl 'https://api.rabonaintel.com/v1/feeds/football-watch/changes' \
  -H 'Authorization: Bearer ***' \
  -H 'Accept: application/json'
Responses200400401403404409410429502503
Data model

Core schemas

Stories are canonical grouped events; members are source documents; classifications and resolved IDs carry the intelligence layer.

object

ErrorResponse

2 properties
errorcode
object

ContentMetadata

Optional forward-only rich metadata; nullable evidence fields are unknown and historical rows are not backfilled.

10 properties
versionformathas_quoteshas_videohas_official_statementpaywalledword_countreading_time_minuteslengthis_official
object

ResolvedEntityId

5 properties
idtypesportconfidencename
object

StoryMember

20 properties
document_idsourcesource_namecountryurltitlesummarylanguagepublished_atcertaintyprimary_reportingbetting_suitabilitybetting_suitability_reasonssensitive_topicssensitivitybrand_safesensitivity_versioncontent_metadatais_rootimage
object

StoryFacts

Forward-only observations across all canonical members (not the document preview). Missing or outdated snapshots remain unknown; disagreements are not resolved by a root vote. No document summaries or block/event evidence are included.

2 properties
member_countfields
object

Story

20 properties
story_idcursorsportstory_typecertaintybetting_suitabilitybetting_suitability_reasonssensitive_topicssensitivitybrand_safesensitivity_versiontitlesummaryfactsentitiescountsfirst_publishedlast_publisheddocumentsentity_ids
object

StorySearchResponse

3 properties
storiesnext_cursorversions
object

ChangesResponse

4 properties
storiesnext_cursormoreversions
object

StoryFilter

30 properties
entitiesaboutentity_idsabout_idssportsstory_typescertaintybetting_suitabilitycountrieslanguagessourcesexclude_sourcesexclude_sensitivebrand_safecontent_formatshas_quoteshas_videohas_official_statementpaywalledcontent_lengthsreading_time_minreading_time_maxis_officialwindow_hourspublished_afterpublished_beforemin_publishersprimary_reporting_onlylimitcursor
object

ChangesFilter

Same filtering fields as StoryFilter, excluding `limit` and `cursor`.

28 properties
entitiesaboutentity_idsabout_idssportsstory_typescertaintybetting_suitabilitycountrieslanguagessourcesexclude_sourcesexclude_sensitivebrand_safecontent_formatshas_quoteshas_videohas_official_statementpaywalledcontent_lengthsreading_time_minreading_time_maxis_officialwindow_hourspublished_afterpublished_beforemin_publishersprimary_reporting_only
object

Classification

15 properties
story_typesportcertaintyprimary_reportingbetting_suitabilitybetting_suitability_reasonssensitive_topicssensitivitybrand_safesensitivity_versionteamspeoplecompetitionsaboutentity_ids
object

DocumentFacts

Document-scoped classifier observations. Missing, outdated, or mismatched current-revision snapshots are unknown; no field-to-block or event citations are asserted.

3 properties
statusfieldsprovenance
object

Document

19 properties
document_idurlsourcesource_namecountrytitlelanguagepublished_atsummarycontent_metadatafactsstoryclassificationblockstextbody_availablebody_retained_untilimageprovenance
object

FreeStoryFacts

Free search aggregate only: no document identifiers, references or provenance.

2 properties
member_countfields
object

SavedFeedFilter

A saved story search. Child arrays add to parent arrays; scalar values override. Time fields are mutually exclusive with window_hours.

28 properties
entitiesaboutentity_idsabout_idssourcesexclude_sourcessportsstory_typescertaintybetting_suitabilitycontent_formatscontent_lengthscountrieslanguageswindow_hourspublished_afterpublished_beforemin_publishersprimary_reporting_onlyexclude_sensitivebrand_safehas_quoteshas_videohas_official_statementpaywalledis_officialreading_time_minreading_time_max
object

SavedFeedDraft

4 properties
slugnameextendsfilter
object

SavedFeed

6 properties
slugnameextendsfilterorganizationIdresolved_filter

Stop sending editors out to look.

Start with yesterday’s coverage for free. Upgrade when your desk needs it live.