Signal AI Content Search API
The Content Search API from Signal AI — 2 operation(s) for content search.
The Content Search API from Signal AI — 2 operation(s) for content search.
openapi: 3.1.0
info:
title: Signal AI Affinity Content Search API
description: "# Overview\n\nThe Signal AI API is an HTTP+JSON API offering programmatic access to Signal AI's decision augmentation platform.\nSignal AI has the world's largest dataset of real-time, global news and regulatory information. Our proprietary AIQ framework understands, enriches and surfaces relevant news and regulatory data in real-time, and at scale.\n\nOur API offers three powerful capabilities:\n\n1. **Content Search**: Create hyper-relevant content feeds using Signal's AI-powered search\n1. **Content Metrics**: Get coverage & sentiment metrics at a glance to power Business Intelligence & data visualisation solutions\n1. **Affinity**: Uncover unknowns through the Signal AI Knowledge Graph\n1. **Events**: Identify significant clusters of news coverage about entities and topics of interest\n\nTo be able to interact with the Signal AI API endpoints and get the most value out of them, it is useful to understand the metadata concepts that our AI enriches content with.\n\n# Concepts\n\n## Topics\n\nSignal AI experts have trained over 300 topics (or themes), from Health to Blockchain to provide clients an easy way to track emerging trends relevant to their businesses.\nClients can also train their own topics with help from our experts for use in our API.\nThe API provides the ability to query for documents pertaining to one or many topics. Examples of topics include: `Renewable Energy`, `Autonomous Vehicles`, `Corporate Responsibility`, `Artificial Intelligence`, etc.\n\n## Entities\n\nOur world-leading entity extraction ensures you never miss updates about the people, places or companies you or your clients care about most. Signal AI uses machine learning to identify and disambiguate these entities so it can discern between _‘Iceland’_ the supermarket and _‘Iceland’_ the country.\nThe API provides the ability to query for mentions of one or many entities. Examples of entities include: `Tim Cook`, `Apple Inc.`, `United States`, `Hong Kong`, etc.\n\n### Sentiment\n\nOur proprietary AIQ framework looks at the context within articles to identify the sentiment around every mention of an entity in the article's content.\nFor example, if an article mentions _“Volvo’s new electric vehicles provide better range than the Tesla Model 3”_, Signal AI will recognise Volvo as having a positive sentiment while Tesla as negative.\nEach mention is then given a `negative`, `neutral`, or `positive` label which is included in the metadata returned with each document. In addition, an aggregated document-level sentiment label is also computed for each entity, indicating the overall sentiment around this entity in the document.\nSentiment labels are only attached to entities and their mentions, and not to topics.\n\n### Salience\n\nA salience score is computed for every entity found in an article. It provides information about the importance or centrality of that entity to the entire article text. The higher the score, the more the article is ‘about’ the entity. We expose this as a `salient` boolean attribute if the score is above a threshold.\nThe `salience-rank` of the entity is the rank order of each entity's salience score. The entity of rank 1 is the most central to the article. It is possible that an article contains no salient entities.\n\nWhen querying by entity, it is also possible to increase the relevance of results by restricting the search to documents for which these entities are salient, using the `where.entities.salient-only` flag.\n\nNext, we describe the different API endpoints that enable these capabilities\n\n# Authorization\n\nAccess to the API is authorized using OAuth2 Bearer Tokens.\n\n<!-- ReDoc-Inject: <security-definitions> -->\n\n# Endpoints\n\n## Concept Discovery\n\nThe following endpoints allow the exploration of Signal AI's trained concepts (topics and entities), and publication sources, for the purpose of crafting content search and affinity-related queries.\n\n### `/topics`\n\n```bash\ncurl \\\n -H \"Authorization: Bearer eyJhbGciOi…\" \\\n -H \"Content-Type: application/json\" \\\n https://api.signal-ai.com/topics?name=environment&size=10\n```\n\n### `/categories/iptc-media-topics`\n\n```bash\ncurl \\\n -H \"Authorization: Bearer eyJhbGciOi…\" \\\n -H \"Content-Type: application/json\" \\\n https://api.signal-ai.com/categories/iptc-media-topics\n```\n\n### `/entities`\n\n```bash\ncurl \\\n -H \"Authorization: Bearer eyJhbGciOi…\" \\\n -H \"Content-Type: application/json\" \\\n https://api.signal-ai.com/entities?type=person&name=cook&size=10\n```\n\n### `/sources`\n\n```bash\ncurl \\\n -H \"Authorization: Bearer eyJhbGciOi…\" \\\n -H \"Content-Type: application/json\" \\\n https://api.signal-ai.com/sources?name=times&size=10\n```\n\n### `/source-locations`\n\n```bash\ncurl \\\n -H \"Authorization: Bearer eyJhbGciOi…\" \\\n -H \"Content-Type: application/json\" \\\n https://api.signal-ai.com/source-locations\n```\n\n## Content Search\n\nThis endpoint allows searching through Signal AI's vast content datasets, using a sophisticated query language.\n\n### `/search`\n\n```bash\ncurl \\\n -H \"Authorization: Bearer eyJhbGciOi…\" \\\n -H \"Content-Type: application/json\" \\\n -X POST \\\n -d '{ \"where\": { \"entities\": { \"id\": { \"eq\": \"11cab8df-4be1-470f-8f49-8f7f0863ec95\" } } } }' \\\n https://api.signal-ai.com/search\n```\n\n## Content Metrics\n\nThis endpoint provides aggregated metrics over all our news & regulatory content.\n\n### `/metrics`\n\n```bash\ncurl \\\n -H \"Authorization: Bearer eyJhbGciOi…\" \\\n -H \"Content-Type: application/json\" \\\n -X POST \\\n -d '{ \"where\": { \"entities\": { \"id\": { \"eq\": \"11cab8df-4be1-470f-8f49-8f7f0863ec95\" } } },\n \"aggregations\": { \"group-by\": [\"published-at\", \"country\"], \"metrics\": [\"document-count\"] } }' \\\n https://api.signal-ai.com/metrics\n```\n\n## Affinity\n\nThe Affinity API allows users to discover connections between entities (e.g.\ncompanies) and topics, understand their proximity, and how it develops over\ntime, providing them with actionable intelligence about reputational risks and\ncommunication opportunities. It is powered by the Signal AI Knowledge Graph,\nwhich is generated by analyzing millions of documents every day.\n\n```bash\ncurl \\\n -H \"Authorization: Bearer eyJhbGciOi…\" \\\n -H \"Content-Type: application/json\" \\\n -X POST \\\n -d '{ \"relationship\": { \"type\": \"proximity\", \"date\": { \"start\": \"2022-01\", \"end\": \"2022-01\" }, \"interval\": \"month\", \"limit-per-interval\": 10 },\n \"source-concept\": {\"id\": \"11cab8df-4be1-470f-8f49-8f7f0863ec95\"},\n \"target-concepts\": { \"types\": [\"topic\"] } }' \\\n https://api.signal-ai.com/affinity\n```\n\n## Events\n\nThe Events API enables monitoring of major news events, allowing users to easily identify changes that could impact them or their business. By leveraging the 15-month archive, users can easily get up to speed on the recent developments involving specific companies, industries or topics.\n\n```bash\ncurl \\\n-H 'Authorization: Bearer eyJhbGc...' \\\n-H 'Content-Type: application/json' \\\n-X POST \\\n-d '{\n \"where\": {\n \"date\": {\n \"gte\": \"2022-05-01\",\n \"lte\": \"2022-05-30\"\n },\n \"entities\": {\n \"id\": {\"any\": [\"aee5dfa5-cf7e-4bcd-80c3-79b0125effc8\"]}\n }\n },\n \"size\": 50\n}' \\\nhttps://api.signal-ai.com/events\n```\n\n# Pagination\n\nSome of our endpoints such as `/search` and `/entities` limit the number of results returned in the response. Often there is a `size` parameter that controls how many results should be returned per page. To get additional results you will need to use pagination.\n\nEndpoints that have pagination will include a `next-cursor` field in the response. This can be used to fetch additional results by issuing further requests with the same query and specifying a `from-cursor` parameter. The value of `next-cursor` from the last response should be used to set the `from-cursor` parameter. For `GET` requests this will need to be specified in the query parameter. For `POST` requests this will need to be specified in the request body.\n\nThe absence of `next-cursor` in the response indicates that you have consumed all results matching the query.\n\n# Rate Limiting\n\nWe put limits on all API requests to protect our system from receiving more requests than it can handle, and to ensure an equitable distribution of the system resources across API clients.\nThe following API rate limits apply on a per-endpoint, per-Client ID basis:\n\n| Endpoint | requests/second | requests/minute |\n| ---------------- | --------------- | --------------- |\n| Content search | 2 | 30 |\n| Content metrics | 2 | 15 |\n| Concept affinity | 2 | 30 |\n| All others | 5 | 60 |\n\n# Error responses\n\n### 400 – Bad request\n\nThe request is invalid. This could be due to invalid parameters or invalid\nvalues. The error response will contain a top level field called `errors`\nlisting the errors. Each error is reported as a tuple:\n\n- the first element indicates which element is invalid, potentially providing a\n path to the incorrect field in the form `#/{type}/path/to/error` with `{type}`\n one of:\n - `query-params` for errors in URL parameters (or query string parameters)\n - `path-params` for errors in the URL (usually invalid resource ID)\n - `body` for errors in the body (for `POST` requests)\n- the second element contains an indication about the error\n\nExample of an error message:\n\n```json\n{\n \"errors\": [\n [\"#/query-params/sizee\", \"Invalid parameter\"],\n [\"#/path-params/id\", \"String does not match format \\\"uuid\\\"\"],\n [\n \"#/body/relationship/date/start\",\n \"must not be older than 15 months ago (2000-01)\"\n ]\n ]\n}\n```\n\n### 401 – Unauthorized\n\nIncorrect credentials, refer to the [Authorization](#section/Authorization)\nsection for more information.\n\n### 404 – Not found\n\nInvalid endpoint or unknown resource. For \"GET\" requests in particular (e.g.\n`GET /entities/{id}`) the body of the response will hold the invalid field.\n\n### 429 – Too many requests\n\nThe server received too many requests in the last second or minute. The [rate\nlimiting](#section/Rate-Limiting) section lists the limits for each endpoints.\n\n### 500 – Internal server error\n\nThe server encountered a problem while processing the request and failed\nunexpectedly. These errors are actively monitored and are automatically reported\nto our team so they can be investigated and fixed.\n\n### 502/503/504 – Gateway error / service unavailable\n\nThese error responses mean that the server either returned an invalid response\nor could not respond in time. For example, this could be due to unexpected high\nload on the server. It is usually safe to retry the request after some time.\n\n# Dates & Time Zones\n\nThe time zone that dictates the publication date is UTC. To be more precise, dates should respect the ISO 8601 format, where “Z” indicates UTC+0.\n\n# Changelog\n\n## v1.4 - 04/04/2023\n\n- Events GA\n - Added support for pagination\n - Added `/events/{hash}` endpoint\n\n## v1.3 - 28/07/2022\n\n- New Events capability\n - Added the new `events` endpoint for monitoring major news events\n - Enabled story-level metrics in the `metrics` endpoint to support volume and sentiment analysis of events\n\n## v1.2 - 08/06/2022\n\n- Improved Search capability\n - Added support for `story-id` as a search query criterion\n - Added support for `source.region` and `source.subregion` as search query criteria\n\n## v1.1 - 17/02/2022\n\n- Improved Affinity capability\n\n - Added the new `affinity` endpoint for querying relationships between concepts\n - Deprecated the existing `affinity/entities` and `affinity/topics` endpoints\n - Improved the `proximity-score` and `sentiment-score` models for better explainability and precision\n\n New endpoint:\n\n - `POST /affinity`\n\n Deprecated endpoints:\n\n - `GET /affinity/entities`\n - `GET /affinity/topics`\n"
version: v1.3
servers:
- url: https://api.signal-ai.com
security:
- OAuth2:
- default
tags:
- name: Content Search
paths:
/search:
post:
operationId: search-documents
security:
- OAuth2:
- search
tags:
- Content Search
summary: Smart content search powered by Signal AI's trained concepts
description: "\nWith our smart content search, you can find documents of interest to you from Signal AI's live indexed content (the world's largest dataset of real-time, global news and regulatory information). You are able to search over the last 15 months of indexed content.\n\nA search response will contain a page of `documents` metadata matching the search query.\n\n\n### Search query criteria\nConstruct a query to find documents of your interest, by specifying some matching criteria. In particular, you can use the `where`, and the `exclude` clauses in the request body (see below).\nThe `where` clause defines criteria that the documents returned should match, whereas the `exclude` clause is the opposite and defines criteria that documents must not match (i.e. it filters out documents that match those criteria)\n\nThe criteria that can be used for matching documents in the query include:\n* the entities mentioned in the document (up to 200 per query)\n* the topics that the document relates to (up to 100 per query)\n* the publication sources or countries, regions or subregions of publication (up to 500 sources per query)\n* the IPTC categories that the document relates to\n* the publication date & time\n* the language of the document\n* the media type of the document (online or print)\n* the document story ID (up to 200 per query)\n\nNote that for the `exclude` clause, only the the first three criteria can be used (entities, topics and sources)\n\n### Documents metadata returned\nThe metadata returned for each document matching the query includes:\n * unique document ID\n * story ID\n * document title\n * native language document title (for non-english content)\n * Signal url (for online content only)\n * publication source and location (country, subregion & region)\n * publication date & time\n * the media type of the document (e.g. online)\n * the language of the document\n * the full list of topics that the document pertains to\n * the full list of IPTC categories that the document pertains to\n * the full list of entities mentioned in the document, with the content position, saliency and associated sentiment label for each mention\n\n### Sorting\nDocuments can be sorted by:\n * `published-at` - publication date (default)\n * `score` - relevance score\n\nThe direction of sorting can be specified as:\n * `desc` - descending (default)\n * `asc` - ascending\n\n### Pagination limitations\n\n⚠️ **Pagination is not supported when sorting results by relevance score**\n\nYou can only get one page of documents (up to the maximum page size of 500), and the response will not include a `next-cursor` field.\n\n### Story deduplication\nSignal AI identifies syndicated articles pertaining to the same story and assigns them the same `story-id`. This can be useful for the purpose of deduplicating articles if you are interested in unique stories only. Because the publication of syndicated articles on the same story can span several hours or sometimes even days, there is no guarantee that all articles on the same story will be listed contiguously in the API response.\n\n### Keyword limitations\nIn order to use the inclusion keywords, you must include **at least** one of `entities`, `source` or `topics` in the `where` clause of the request.\n\nThere is a **50 word** limit on keywords across inclusion and exclusion. A keyword can be made up of sevaral words, i.e. the keyword `Big Tech` would count as **2 words**.\n"
parameters: []
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/DocumentSearchQuery'
examples:
entity-search:
$ref: '#/components/examples/document-search-by-entity'
source-country-search:
$ref: '#/components/examples/document-search-by-country-and-entity'
entities-source-search:
$ref: '#/components/examples/document-search-by-source-and-entities'
entity-topics-search:
$ref: '#/components/examples/document-search-by-entity-and-topics'
sort-by-relevance:
$ref: '#/components/examples/document-search-sort-by-relevance'
responses:
'200':
description: Returns a list of documents matching the search query
content:
application/json:
schema:
$ref: '#/components/schemas/DocumentSearchResponse'
/documents/{id}:
get:
operationId: get-document
tags:
- Content Search
summary: Get a document by id
parameters:
- name: id
required: true
in: path
schema:
$ref: '#/components/schemas/ResourceId'
responses:
'200':
description: Returns the document for this id
content:
application/json:
schema:
$ref: '#/components/schemas/DocumentResponse'
components:
schemas:
EntityWithMentions:
type: object
allOf:
- $ref: '#/components/schemas/Entity'
- required:
- sentiment
- mentions
properties:
sentiment:
$ref: '#/components/schemas/SentimentLabel'
salient:
type: boolean
description: Indicates if this entity is truly central to the content of the document
salience-rank:
type: integer
minimum: 1
description: Indicates how close this entity is to the topic of discussion in the article, in relation to other entities mentioned. A lower rank means a higher salience.
mentions:
type: array
items:
$ref: '#/components/schemas/Mention'
description: The positions of the entity in the document
SourceExclusion:
type: object
additionalProperties: false
required:
- id
properties:
id:
allOf:
- $ref: '#/components/schemas/AnyResourceIds'
- properties:
any:
maxItems: 500
Mention:
type: object
required:
- position
additionalProperties: false
properties:
position:
type: string
enum:
- content
- summary
- title
- quote
sentiment:
$ref: '#/components/schemas/SentimentLabel'
PartialTopic:
type: object
required:
- id
- name
properties:
id:
$ref: '#/components/schemas/ResourceId'
name:
type: string
AnyTerms:
type: object
additionalProperties: false
required:
- any
properties:
any:
type: array
items:
type: string
EqualsResourceId:
type: object
additionalProperties: false
required:
- eq
properties:
eq:
$ref: '#/components/schemas/ResourceId'
MediaType:
type: string
enum:
- online
- print
EqualsOrAnyResourceIdsMatch:
oneOf:
- $ref: '#/components/schemas/EqualsResourceId'
- $ref: '#/components/schemas/AnyResourceIds'
EqualsTerm:
type: object
additionalProperties: false
required:
- eq
properties:
eq:
type: string
DateTime:
type: string
format: date-time
description: "A date and time based on the IETF RFC 3339 format (e.g.\n `2023-01-01T13:37:00` or `2023-01-01T13:37:00Z` for UTC,\n `2023-01-01T09:37:00-05:00` for EST). Note that UTC is used by default."
example: '2023-01-01T13:37:00'
Source:
type: object
required:
- id
- name
properties:
id:
$ref: '#/components/schemas/ResourceId'
name:
type: string
country:
type: string
subregion:
type: string
region:
type: string
example:
id: 61e158b0-f3a4-468c-9857-03841aa90ef4
name: The Newspaper
country: United Kingdom
subregion: Northern Europe
region: Europe
ResourceIds:
type: array
items:
$ref: '#/components/schemas/ResourceId'
MediaTypeMatch:
oneOf:
- $ref: '#/components/schemas/EqualsMediaType'
- $ref: '#/components/schemas/AnyMediaType'
EqualsMediaType:
type: object
additionalProperties: false
required:
- eq
properties:
eq:
$ref: '#/components/schemas/MediaType'
EntitiesExclusion:
type: object
additionalProperties: false
required:
- id
properties:
id:
allOf:
- $ref: '#/components/schemas/AnyResourceIds'
- properties:
any:
maxItems: 100
Document:
type: object
required:
- id
- title
- published-at
- source
- media-type
- topics
- entities
additionalProperties: false
properties:
story-id:
$ref: '#/components/schemas/ResourceId'
signal-url:
type: string
regulatory-document:
$ref: '#/components/schemas/RegulatoryDocumentType'
entities:
type: array
items:
$ref: '#/components/schemas/EntityWithMentions'
published-at:
type: string
format: date-time
source:
$ref: '#/components/schemas/Source'
title:
type: string
topics:
type: array
items:
$ref: '#/components/schemas/PartialTopic'
categories:
type: object
deprecated: true
properties:
iptc-media-topics:
type: array
items:
$ref: '#/components/schemas/Category'
language:
type: string
id:
$ref: '#/components/schemas/ResourceId'
native-title:
type: string
description: Document title in its native language (for non english content)
media-type:
$ref: '#/components/schemas/MediaType'
SourceMatch:
type: object
additionalProperties: false
properties:
id:
allOf:
- $ref: '#/components/schemas/EqualsOrAnyResourceIdsMatch'
- properties:
any:
maxItems: 500
country:
$ref: '#/components/schemas/EqualsOrAnyTermsMatch'
region:
$ref: '#/components/schemas/EqualsOrAnyTermsMatch'
subregion:
$ref: '#/components/schemas/EqualsOrAnyTermsMatch'
Entity:
type: object
required:
- id
- name
- type
properties:
id:
$ref: '#/components/schemas/ResourceId'
type:
$ref: '#/components/schemas/EntityType'
name:
type: string
ResourceIdsMatch:
oneOf:
- $ref: '#/components/schemas/EqualsResourceId'
- $ref: '#/components/schemas/AnyResourceIds'
- $ref: '#/components/schemas/AllResourceIds'
DateTimeRangeMatch:
type: object
properties:
gt:
$ref: '#/components/schemas/DateOrDateTime'
gte:
$ref: '#/components/schemas/DateOrDateTime'
lt:
$ref: '#/components/schemas/DateOrDateTime'
lte:
$ref: '#/components/schemas/DateOrDateTime'
additionalProperties: false
minProperties: 1
dependentSchemas:
gt:
not:
required:
- gte
gte:
not:
required:
- gt
lt:
not:
required:
- lte
lte:
not:
required:
- lt
SortClause:
type: array
prefixItems:
- $ref: '#/components/schemas/SortField'
- $ref: '#/components/schemas/SortOrder'
items: false
DocumentPosition:
type: string
enum:
- title
- title or summary
- full content
- quotes only
SentimentLabel:
type: string
enum:
- positive
- negative
- neutral
LanguageMatch:
oneOf:
- type: object
additionalProperties: false
required:
- eq
properties:
eq:
type: string
description: Language (e.g. `English`, `Chinese`, `Spanish`, `German`, `Japanese`...)
- type: object
name: AnyLanguage
additionalProperties: false
required:
- any
properties:
any:
type: array
items:
type: string
description: A list of languages (e.g. `English`, `Chinese`, `Spanish`, `German`, `Japanese`...)
ResourceId:
type: string
format: uuid
pattern: ^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$
example: bcd2d868-ed38-4382-b94a-622a30fc3215
AnyResourceIds:
type: object
additionalProperties: false
required:
- any
properties:
any:
$ref: '#/components/schemas/ResourceIds'
AnyMediaType:
type: object
additionalProperties: false
required:
- any
properties:
any:
type: array
items:
$ref: '#/components/schemas/MediaType'
DocumentTopicsMatch:
type: object
additionalProperties: false
required:
- id
properties:
id:
allOf:
- $ref: '#/components/schemas/ResourceIdsMatch'
- properties:
any:
maxItems: 100
all:
maxItems: 100
EqualsOrAnyTermsMatch:
oneOf:
- $ref: '#/components/schemas/EqualsTerm'
- $ref: '#/components/schemas/AnyTerms'
Date:
type: string
format: date
description: "A date based on the IETF RFC 3339 format (e.g. `2023-01-01`).\n Note that a day is the span of time between 00:00:00 and 23:59:59 based on\n the UTC timezone. You may prefer using the `date-time` option to match days\n in a different timezone."
example: '2023-01-01'
SortOrder:
type: string
enum:
- asc
- desc
AllTerms:
type: object
additionalProperties: false
required:
- all
properties:
all:
type: array
items:
type: string
Base64String:
type: string
pattern: ^([A-Za-z0-9+/]{4})*([A-Za-z0-9+/]{3}=|[A-Za-z0-9+/]{2}==)?$
example: RjQ2RTRBQUEtQTNGRi00MEI3LUE1NEYtNTA0NEQxMjc5NkU3
SearchStats:
type: object
required:
- total
properties:
total:
type: integer
description: Approximate total number of documents matching this search
DocumentKeywordsMatch:
type: object
required:
- value
properties:
value:
allOf:
- $ref: '#/components/schemas/EqualsOrAnyOrAllTermsMatch'
- description: There is a 50 word limit for keywords across inclusion and exclusion. See the section **Keyword limitations** above for more details.
mentions:
$ref: '#/components/schemas/MentionPositionMatch'
description: Note that to use inclusion keywords, you will also need to include one of `entities`, `sources` or `topics` in your `where` clause.
ExcludeClause:
type: object
additionalProperties: false
properties:
entities:
$ref: '#/components/schemas/EntitiesExclusion'
topics:
$ref: '#/components/schemas/TopicsExclusion'
source:
oneOf:
- $ref: '#/components/schemas/SourceExclusion'
- $ref: '#/components/schemas/CountryExclusion'
keywords:
$ref: '#/components/schemas/KeywordsExclusion'
EntityType:
type: string
enum:
- person
- organisation
- location
- substance
- disease
- product
- regulation
Category:
type: object
required:
- id
- name
properties:
id:
$ref: '#/components/schemas/ResourceId'
name:
type: string
AllResourceIds:
type: object
additionalProperties: false
required:
- all
properties:
all:
$ref: '#/components/schemas/ResourceIds'
DocumentSearchResponse:
type: object
required:
- stats
- documents
properties:
stats:
$ref: '#/components/schemas/SearchStats'
documents:
type: array
items:
$ref: '#/components/schemas/Document'
next-cursor:
$ref: '#/components/schemas/Base64String'
DateOrDateTime:
oneOf:
- $ref: '#/components/schemas/Date'
- $ref: '#/components/schemas/DateTime'
DocumentSearchQuery:
type: object
required:
- where
additionalProperties: false
properties:
where:
$ref: '#/components/schemas/DocumentMatch'
exclude:
$ref: '#/components/schemas/ExcludeClause'
size:
type: integer
default: 10
minimum: 0
maximum: 500
sort:
type: array
items:
$ref: '#/components/schemas/SortClause'
minItems: 1
default:
- - published-at
- desc
description: 'format: `[[SORT_FIELD, SORT_ORDER], ...]` where `SORT_FIELD` can be one of `"published-at"` or `"score"`, and `SORT_ORDER` one of `"asc"` or `"desc"`'
from-cursor:
$ref: '#/components/schemas/Base64String'
description: Use the `next-cursor` field from a previous response to get the next page of results (see [Pagination](#section/Pagination))
DocumentMatch:
type: object
additionalProperties: false
properties:
story-id:
allOf:
- $ref: '#/components/schemas/EqualsOrAnyResourceIdsMatch'
- properties:
any:
maxItems: 200
entities:
$ref: '#/components/schemas/DocumentEntitiesMatch'
published-at:
$ref: '#/components/schemas/DateTimeRangeMatch'
source:
$ref: '#/components/schemas/SourceMatch'
keywords:
$ref: '#/components/schemas/DocumentKeywordsMatch'
topics:
$ref: '#/components/schemas/DocumentTopicsMatch'
categories:
$ref: '#/components/schemas/CategoriesMatch'
language:
$ref: '#/components/schemas/LanguageMatch'
media-type:
$ref: '#/components/schemas/MediaTypeMatch'
DocumentResponse:
type: object
required:
- document
properties:
document:
$ref: '#/components/schemas/Document'
CountryExclusion:
type: object
additionalProperties: false
required:
- country
properties:
country:
$ref: '#/components/schemas/AnyTerms'
SortField:
type: string
enum:
- published-at
- score
CategoriesMatch:
type: object
deprecated: true
additionalProperties: false
required:
- id
properties:
id:
allOf:
- $ref: '#/components/schemas/ResourceIdsMatch'
- properties:
any:
maxItems: 100
all:
maxItems: 100
MentionPositionMatch:
type: object
additionalProperties: false
required:
- position
properties:
position:
$ref: '#/components/schemas/DocumentPosition'
description: Note that mentions found in `summary` or `quotation` are a subset of the mentions found in the `full content`.
RegulatoryDocumentType:
type: string
enum:
- alert
# --- truncated at 32 KB (37 KB total) ---
# Full source: https://raw.githubusercontent.com/api-evangelist/signal-ai/refs/heads/main/openapi/signal-ai-content-search-api-openapi.yml