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
FreeSearch stories
StoriesReturns 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
entityqueryarrayCanonical names mentioned anywhere; repeat or comma-separate for OR.
aboutqueryarrayCanonical names centrally covered; older records without `about` do not match.
entity_idqueryarrayFans United IDs mentioned anywhere; unresolved IDs safely match nothing.
about_idqueryarrayFans United IDs centrally covered; unresolved IDs safely match nothing.
sportqueryarrayRepeat or comma-separate for OR.
story_typequeryarrayRepeat or comma-separate for OR.
certaintyqueryarrayRepeat or comma-separate for OR.
betting_suitabilityqueryarrayRepeat or comma-separate deterministic suitability values for OR.
countryqueryarrayISO 3166-1 alpha-2 publisher country; repeat or comma-separate for OR.
languagequeryarrayLowercase ISO 639-1 article language; repeat or comma-separate for OR.
sourcequeryarrayPublisher slug to include; repeat or comma-separate for OR.
exclude_sourcequeryarrayPrevent listed publishers' rows from qualifying a story. Does not remove those publishers from a story that qualifies through another member.
exclude_sensitivequerybooleanSet 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_formatqueryarrayContent format; repeat or comma-separate for OR. Rich predicates must match the same canonical member.
has_quotesquerybooleanOptional request parameter.
has_videoquerybooleanOptional request parameter.
has_official_statementquerybooleanOptional request parameter.
paywalledquerybooleanOptional request parameter.
content_lengthqueryarrayOptional request parameter.
reading_time_minqueryintegerInclusive minimum reading time in minutes.
reading_time_maxqueryintegerInclusive maximum reading time in minutes.
is_officialquerybooleanMatch an explicitly official or non-official source; unknown matches neither value.
window_hoursquerynumberRolling age in hours; boundary is exclusive.
published_afterquerystringInclusive publication/discovery lower bound; mutually exclusive with window_hours.
published_beforequerystringInclusive publication/discovery upper bound; mutually exclusive with window_hours.
min_publishersqueryintegerMinimum distinct publishers in the matching candidate-member subset.
primary_reporting_onlyquerybooleanRequire at least one original-reporting member in the matching candidate-member subset. Only literal `true` enables it.
limitqueryintegerPage size. Clients must send an integer from 1 through 500.
cursorqueryintegerOpaque search cursor returned by the previous page.
includequerystringUse `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
FreeSearch stories with a JSON filter
StoriesSupports 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
includequerystringUse `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}
ProGet one story with every member
StoriesPro and Business only: full all-member Facts observations and references. Legacy snapshot coverage is unknown, with no backfill guarantee.
Parameters
story_idpathinteger · requiredExample: 65756061
If-None-MatchheaderstringA 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
BusinessRead the change feed using query filters
ChangesGateway 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
entityqueryarrayCanonical names mentioned anywhere; repeat or comma-separate for OR.
aboutqueryarrayCanonical names centrally covered; older records without `about` do not match.
entity_idqueryarrayFans United IDs mentioned anywhere; unresolved IDs safely match nothing.
about_idqueryarrayFans United IDs centrally covered; unresolved IDs safely match nothing.
sportqueryarrayRepeat or comma-separate for OR.
story_typequeryarrayRepeat or comma-separate for OR.
certaintyqueryarrayRepeat or comma-separate for OR.
betting_suitabilityqueryarrayRepeat or comma-separate deterministic suitability values for OR.
countryqueryarrayISO 3166-1 alpha-2 publisher country; repeat or comma-separate for OR.
languagequeryarrayLowercase ISO 639-1 article language; repeat or comma-separate for OR.
sourcequeryarrayPublisher slug to include; repeat or comma-separate for OR.
exclude_sourcequeryarrayPrevent listed publishers' rows from qualifying a story. Does not remove those publishers from a story that qualifies through another member.
exclude_sensitivequerybooleanSet 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_hoursquerynumberRolling age in hours; boundary is exclusive.
published_afterquerystringInclusive publication/discovery lower bound; mutually exclusive with window_hours.
published_beforequerystringInclusive publication/discovery upper bound; mutually exclusive with window_hours.
min_publishersqueryintegerMinimum distinct publishers in the matching candidate-member subset.
primary_reporting_onlyquerybooleanRequire at least one original-reporting member in the matching candidate-member subset. Only literal `true` enables it.
content_formatqueryarrayContent format; repeat or comma-separate for OR. Rich predicates must match the same canonical member.
has_quotesquerybooleanOptional request parameter.
has_videoquerybooleanOptional request parameter.
has_official_statementquerybooleanOptional request parameter.
paywalledquerybooleanOptional request parameter.
content_lengthqueryarrayOptional request parameter.
reading_time_minqueryintegerInclusive minimum reading time in minutes.
reading_time_maxqueryintegerInclusive maximum reading time in minutes.
is_officialquerybooleanMatch an explicitly official or non-official source; unknown matches neither value.
sincequeryintegerPrevious changes cursor; use 0 for the beginning of retained history.
limitqueryintegerMatching 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
BusinessConsume 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
sincequeryintegerPrevious changes cursor; use 0 for the beginning of retained history.
limitqueryintegerMatching 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
ProGet up to 100 documents
DocumentsUnknown 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}
ProGet one complete source document
DocumentsReturns 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 · requiredExample: 65756061
If-None-MatchheaderstringA 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
FreeSearch canonical entity names
EntitiesUse 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
qquerystringCase-insensitive SQL LIKE pattern; `%` and `_` are wildcards.
sportquerySportCanonical sport in which the entity appeared.
kindquerystringExample: teams
limitqueryintegerPage 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
FreeList publishers represented in the visible corpus
EntitiesParameters
sportquerySportExample: football
countryquerystringOptional request parameter.
cURL example
curl 'https://api.rabonaintel.com/v1/sources' \
-H 'Authorization: Bearer ***' \
-H 'Accept: application/json'
Responses200401403429500503
GET/v1/stats
FreeGet corpus totals and retention policy
SystemcURL example
curl 'https://api.rabonaintel.com/v1/stats' \
-H 'Authorization: Bearer ***' \
-H 'Accept: application/json'
Responses200401403429500503
GET/v1/feeds
ProList saved Feeds
FeedsPro 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
ProCreate a saved Feed
FeedsSave 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}
ProRead a saved Feed
FeedsReturn the saved filter and its current inherited resolved_filter.
Parameters
slugpathstring · requiredOrganization-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}
ProUpdate a saved Feed
FeedsPartially update name, parent or filter; slug is immutable. Parent edits affect children on their next read.
Parameters
slugpathstring · requiredOrganization-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}
ProDelete a saved Feed
FeedsA parent with children cannot be deleted.
Parameters
slugpathstring · requiredOrganization-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
ProRun a saved Feed
FeedsExecute 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 · requiredOrganization-scoped Feed slug.
limitqueryintegerCapped by the caller plan; the public maximum is 500.
cursorqueryintegerSearch pagination position, not a durable update cursor.
includequerystringFull 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
BusinessPoll changes to a saved Feed
FeedsBusiness 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 · requiredOrganization-scoped Feed slug.
sincequerystringContinuation cursor. Omit only for activation; otherwise required together with feed_version.
feed_versionquerystringRequired with since on every poll. Omit only for activation.
limitqueryintegerPolling 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.
objectErrorResponse
2 properties
errorcode
objectContentMetadata
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
objectResolvedEntityId
5 properties
idtypesportconfidencename
objectStoryMember
20 properties
document_idsourcesource_namecountryurltitlesummarylanguagepublished_atcertaintyprimary_reportingbetting_suitabilitybetting_suitability_reasonssensitive_topicssensitivitybrand_safesensitivity_versioncontent_metadatais_rootimage
objectStoryFacts
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
objectStory
20 properties
story_idcursorsportstory_typecertaintybetting_suitabilitybetting_suitability_reasonssensitive_topicssensitivitybrand_safesensitivity_versiontitlesummaryfactsentitiescountsfirst_publishedlast_publisheddocumentsentity_ids
objectStorySearchResponse
3 properties
storiesnext_cursorversions
objectChangesResponse
4 properties
storiesnext_cursormoreversions
objectStoryFilter
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
objectChangesFilter
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
objectClassification
15 properties
story_typesportcertaintyprimary_reportingbetting_suitabilitybetting_suitability_reasonssensitive_topicssensitivitybrand_safesensitivity_versionteamspeoplecompetitionsaboutentity_ids
objectDocumentFacts
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
objectDocument
19 properties
document_idurlsourcesource_namecountrytitlelanguagepublished_atsummarycontent_metadatafactsstoryclassificationblockstextbody_availablebody_retained_untilimageprovenance
objectFreeStoryFacts
Free search aggregate only: no document identifiers, references or provenance.
2 properties
member_countfields
objectSavedFeedFilter
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
objectSavedFeedDraft
4 properties
slugnameextendsfilter
objectSavedFeed
6 properties
slugnameextendsfilterorganizationIdresolved_filter