Signal AI Affinity API

The Affinity API endpoints allow API users to leverage the power of the Signal AI Knowledge Graph, derived from billions of documents and updated regularly. The Signal AI Knowledge Graph consists of: * **nodes** which represent concepts such as entities and topics * **edges** represent connections describing relationships between these concepts Using the Affinity API, users can retrieve data for hundreds of thousands of entities and topics. The sole relationship type currently accessible via the Affinity API is proximity. ## Proximity Proximity represents how closely entities and topics are associated in the news and other types of content processed by Signal AI. ### What is proximity? The proximity between an entity (e.g. Tesla) and a topic (e.g. Product recall) is a measure of how they are related over a period of time (e.g. a certain month) as perceived in the news (almost all sources we ingest into the Signal platform). It reflects the likelihood of the entity and topic in question being mentioned together, with 0 meaning the two are very unlikely to appear together, and 1 meaning they are most likely to appear together (NB: the scale is not linear.) We measure this by observing the mentions of the topic, the (salient) mentions of the entity and their (salient) co-mentions. As opposed to relying only on the volume of co-mentions, the proximity score captures how significant these co-mentions are based on the overall volume of coverage for both the entity and the topic. **For example, if the entity has a high number of co-mentions with a topic, but the topic is very common (e.g Social Media), we may assign a low proximity score. On the other hand if there are only a few co-mentions with a very niche topic, we may assign a high proximity score.** The proximity score is based on the normalized Google Distance (from Information distance theory) and it has a value between 0 and 1: - A score of 0 means the two concepts are not related and never or rarely co-mentioned together; - The higher the score is, the more related the concepts are and the higher the chance is of observing significant co-mentions. - A proximity close to 1 means that if one of the concepts is mentioned in an article, it is most likely that the other concept will also be mentioned in the article. To illustrate how proximity is implemented, consider this conceptual representation of the Signal AI Knowledge Graph below: ![](/assets/img/affinity_example.svg) In this graph, we see four nodes: two organizations (PepsiCo and American Chemical Society) and two topics (Food and Beverage and Chemicals). We also see three edges each representing a proximity relationship: (PepsiCo and Food and Beverage), (PepsiCo and Chemicals) and (American Chemical Society and Chemicals). We can infer from these edges that PepsiCo has a closer association to Food and Beverage than Chemicals. Also we can infer that American Chemical Society has a stronger connection to Chemicals than PepsiCo. ### Using the proximity score The proximity score can be used in different ways: #### 1. Discovery We can identify the closest topics to an entity by ranking them according to their proximity score. Note that if we simply use the volume of co-mentions to rank topics, we will end up with the common topics (which might be considered noise). Likewise, we can do the opposite and identify the organizations (or any other type of entities) that are closest to a certain topic. Note, if we simply use the volume of co-mentions to rank organizations, we will end up with the common ones which are often mentioned in news articles, e.g. BBC, NASDAQ, UK, US #### 2. Comparison - **Comparing Entities**: We can compare two entities on how they are related to certain topics, ie. which one is more related. A higher proximity score means more relatedness to a topic. Note that this is different from comparing them based on the volume (number of articles on topic). For example one big company may have way more articles on a topic than a smaller company, but the smaller company may have a higher proximity. This is because it has way fewer mentions than the big company overall and a few articles on the topic contribute to a higher proximity score. - **Comparing Topics**: Likewise, we can compare two topics on how they are related to certain entities. A higher proximity score means more relatedness to an entity. - **Comparison over time**: We can say if the proximity between an entity and topic has increased or decreased from one month to another by comparing their proximity score in those months. NB: While the proximity scores are ordered, they are not linear. *This means you can't easily interpret the difference between proximity scores i.e. the difference between 0 and 0.1 proximity is not the same as the difference between 0.4 and 0.5 proximity.* ### Proximity metadata Each proximity relationship returned contains the following metadata: - `proximity-score`: the proximity score in the range `[0..1]` as described above - `sentiment-score`: for a proximity relationship between an entity and a topic, this score represents the sentiment towards the entity with regards to its relationship to the topic. The sentiment score ranges between `[-1..1]` and is computed as follows (taking into account salient entity mentions only: ``` #(positive entity/topic co-mentions) - #(negative entity/topic co-mentions) / #(entity/topic co-mentions) ``` ### Using proximity Using proximity relationships, one can uncover unknowns and insights on a large scale. The API offers one endpoint to allow the users to query and explore proximity relationships. Please note that only the last 15 months of data can be queried.

OpenAPI Specification

signal-ai-affinity-api-openapi.yml Raw ↑
openapi: 3.1.0
info:
  title: Signal AI Affinity 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: Affinity
  description: "The Affinity API endpoints allow API users to leverage the power of the Signal\nAI Knowledge Graph, derived from billions of documents and updated regularly.\n\nThe Signal AI Knowledge Graph consists of:\n* **nodes** which represent concepts such as entities and topics\n* **edges** represent connections describing relationships between these concepts\n\nUsing the Affinity API, users can retrieve data for hundreds of thousands of\nentities and topics. The sole relationship type currently accessible via the\nAffinity API is proximity.\n\n## Proximity\n\nProximity represents how closely entities and topics are associated in the news\nand other types of content processed by Signal AI.\n\n### What is proximity?\n\nThe proximity between an entity (e.g. Tesla) and a topic (e.g. Product recall) is a measure of how they are related over a period of time (e.g. a certain month) as perceived in the news (almost all sources we ingest into the Signal platform). It reflects the likelihood of the entity and topic in question being mentioned together, with 0 meaning the two are very unlikely to appear together, and 1 meaning they are most likely to appear together (NB: the scale is not linear.) We measure this by observing the mentions of the topic, the (salient) mentions of the entity and their (salient) co-mentions. As opposed to relying only on the volume of co-mentions, the proximity score captures how significant these co-mentions are based on the overall volume of coverage for both the entity and the topic. **For example, if the entity has a high number of co-mentions with a topic, but the topic is very common (e.g Social Media), we may assign a low proximity score. On the other hand if there are only a few co-mentions with a very niche topic, we may assign a high proximity score.**\n\nThe proximity score is based on the normalized Google Distance (from Information distance theory) and it has a value between 0 and 1:\n- A score of 0 means the two concepts are not related and never or rarely co-mentioned together;\n- The higher the score is, the more related the concepts are and the higher the chance is of observing significant co-mentions.\n- A proximity close to 1 means that if one of the concepts is mentioned in an article, it is most likely that the other concept will also be mentioned in the article.\n\nTo illustrate how proximity is implemented, consider this conceptual representation of the Signal AI Knowledge Graph below:\n\n![](/assets/img/affinity_example.svg)\n\nIn this graph, we see four nodes: two organizations (PepsiCo and American Chemical Society) and two topics (Food and Beverage and Chemicals).\n\nWe also see three edges each representing a proximity relationship: (PepsiCo and Food and Beverage), (PepsiCo and Chemicals) and (American Chemical Society and Chemicals). We can infer from these edges that PepsiCo has a closer association to Food and Beverage than Chemicals. Also we can infer that American Chemical Society has a stronger connection to Chemicals than PepsiCo.\n\n### Using the proximity score\n\nThe proximity score can be used in different ways:\n\n#### 1. Discovery\n\nWe can identify the closest topics to an entity by ranking them according to their proximity score. Note that if we simply use the volume of co-mentions to rank topics, we will end up with the common topics (which might be considered noise).\n\nLikewise, we can do the opposite and identify the organizations (or any other type of entities) that are closest to a certain topic. Note, if we simply use the volume of co-mentions to rank organizations, we will end up with the common ones which are often mentioned in news articles, e.g. BBC, NASDAQ, UK, US\n\n\n#### 2. Comparison\n\n- **Comparing Entities**: We can compare two entities on how they are related to certain topics, ie. which one is more related. A higher proximity score means more relatedness to a topic. Note that this is different from comparing them based on the volume (number of articles on topic). For example one big company may have way more articles on a topic than a smaller company, but the smaller company may have a higher proximity. This is  because it has way fewer mentions than the big company overall and a few articles on the topic contribute to a higher proximity score.\n- **Comparing Topics**: Likewise, we can compare two topics on how they are related to certain entities. A higher proximity score means more relatedness to an entity.\n- **Comparison over time**: We can say if the proximity between an entity and topic has increased or decreased from one month to another by comparing their proximity score in those months.\n\nNB: While the proximity scores are ordered, they are not linear. *This means you can't easily interpret the difference between proximity scores i.e. the difference between 0 and 0.1 proximity is not the same as the difference between 0.4 and 0.5 proximity.*\n\n### Proximity metadata\n\nEach proximity relationship returned contains the following metadata:\n- `proximity-score`: the proximity score in the range `[0..1]` as described above\n- `sentiment-score`: for a proximity relationship between an entity and a topic, this score represents the sentiment towards the entity with regards to its relationship to the topic. The sentiment score ranges between `[-1..1]` and is computed as follows (taking into account salient entity mentions only:\n  ```\n  #(positive entity/topic co-mentions) - #(negative entity/topic co-mentions) /  #(entity/topic co-mentions)\n  ```\n\n### Using proximity\n\nUsing proximity relationships, one can uncover unknowns and insights on a large scale. The API offers one endpoint to allow the users to query and explore proximity relationships.\n\nPlease note that only the last 15 months of data can be queried.\n"
paths:
  /affinity:
    post:
      operationId: post-affinity
      security:
      - OAuth2:
        - affinity
      tags:
      - Affinity
      summary: Explore concept connections (powered by the Signal AI Knowledge Graph)
      description: 'This endpoint allows you to query the relationships from a source concept (entity or topic) to a set of target concepts (topics or entities) and how these relationships evolve over different months.


        The `relationship.type` parameter allows you to specify the type of relationships you are interested in.

        Currently, the only type of relationship supported is `proximity`


        There are two ways to use this endpoint:


        a. **Querying for specific concepts**: you need to provide as input a list of target-concepts IDs (`target-concepts.ids`) for known concepts that you want to query.


        b. **Discovery**: when you don''t specify an explicit list of target-concepts IDs, the results will be the top relationships in order of proximity to the source-concept for any given month (these entities might differ month-on-month).

        You can also filter the results by concept type(s) of interest (`target-concepts.types` with values: `topic`, `entity/organisation`, `entity/people`, `entity/location`, etc.)

        You can also exclude specific concepts from the results (`target-concepts.exclude.ids`).

        '
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/PostAffinityQuery'
            examples:
              affinity-request:
                $ref: '#/components/examples/post-affinity-request'
      responses:
        '200':
          description: Returns a list of relationships matching the query
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PostAffinityResponse'
              examples:
                affinity-response:
                  $ref: '#/components/examples/post-affinity-response'
components:
  schemas:
    RelationshipType:
      type: string
      enum:
      - proximity
    ConceptTypeEnum:
      type: string
      enum:
      - entity
      - entity/person
      - entity/organisation
      - entity/location
      - entity/substance
      - entity/disease
      - entity/product
      - entity/regulation
      - topic
    PostAffinityResponse:
      type: object
      required:
      - source-concept
      - results
      additionalProperties: false
      properties:
        source-concept:
          $ref: '#/components/schemas/Concept'
        results:
          type: array
          items:
            type: object
            required:
            - relationship
            - target-concept
            additionalProperties: false
            properties:
              relationship:
                type: object
                required:
                - date
                - type
                - proximity-score
                - sentiment-score
                additionalProperties: false
                properties:
                  date:
                    $ref: '#/components/schemas/YearMonth'
                  type:
                    $ref: '#/components/schemas/RelationshipType'
                  proximity-score:
                    type: number
                    minimum: 0.0
                    maximum: 1.0
                  sentiment-score:
                    type: number
                    minimum: -1.0
                    maximum: 1.0
              target-concept:
                $ref: '#/components/schemas/Concept'
    Concept:
      type: object
      additionalProperties: false
      required:
      - id
      - type
      - name
      properties:
        id:
          $ref: '#/components/schemas/ResourceId'
        type:
          $ref: '#/components/schemas/ConceptTypeEnum'
        name:
          type: string
    IntervalType:
      type: string
      enum:
      - month
    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
    YearMonth:
      type: string
      pattern: ^20[0-9]{2}-(0[1-9]|1[0-2])$
      description: A year and month encoded as `YYYY-MM` (e.g. `2023-01`)
      example: 2023-01
    ConceptIdsObject:
      type: object
      required:
      - ids
      additionalProperties: false
      properties:
        ids:
          type: array
          items:
            $ref: '#/components/schemas/ResourceId'
          uniqueItems: true
          minItems: 1
          maxItems: 100
    PostAffinityQuery:
      type: object
      required:
      - relationship
      - source-concept
      additionalProperties: false
      properties:
        relationship:
          type: object
          required:
          - type
          - date
          - interval
          properties:
            type:
              $ref: '#/components/schemas/RelationshipType'
            date:
              type: object
              required:
              - start
              - end
              properties:
                start:
                  $ref: '#/components/schemas/YearMonth'
                end:
                  $ref: '#/components/schemas/YearMonth'
            interval:
              $ref: '#/components/schemas/IntervalType'
            limit-per-interval:
              type: integer
              default: 10
              minimum: 1
              maximum: 100
        source-concept:
          type: object
          required:
          - id
          properties:
            id:
              $ref: '#/components/schemas/ResourceId'
        target-concepts:
          anyOf:
          - $ref: '#/components/schemas/ConceptIdsObject'
          - type: object
            anyOf:
            - required:
              - types
            - required:
              - exclude
            additionalProperties: false
            properties:
              types:
                type: array
                items:
                  $ref: '#/components/schemas/ConceptTypeEnum'
                uniqueItems: true
                minItems: 1
              exclude:
                $ref: '#/components/schemas/ConceptIdsObject'
  examples:
    post-affinity-request:
      summary: Affinity request
      value:
        relationship:
          type: proximity
          date:
            start: 2022-01
            end: 2022-02
          interval: month
          limit-per-interval: 10
        source-concept:
          id: d6341968-83df-441c-a869-fa7ae9c22c73
        target-concepts:
          ids:
          - fc31abf2-7b11-4ed5-a7d2-35266057c0dd
    post-affinity-response:
      summary: Affinity response
      value:
        source-concept:
          id: d6341968-83df-441c-a869-fa7ae9c22c73
          name: Toyota
          type: entity/organisation
        results:
        - relationship:
            date: 2022-01
            type: proximity
            proximity-score: 0.29267539274752596
            sentiment-score: 0.8865404714899547
          target-concept:
            id: fc31abf2-7b11-4ed5-a7d2-35266057c0dd
            name: Innovation
            type: topic
        - relationship:
            date: 2022-02
            type: proximity
            proximity-score: 0.2751201557751357
            sentiment-score: 0.8560551124002901
          target-concept:
            id: fc31abf2-7b11-4ed5-a7d2-35266057c0dd
            name: Innovation
            type: topic
  securitySchemes:
    OAuth2:
      type: oauth2
      description: "To obtain the Bearer Token using the Client ID / Secret pair provided to you:\n\n```bash\ncurl -X POST \\\n  -d 'grant_type=client_credentials' \\\n  -d 'client_id=YOUR_CLIENT_ID' \\\n  -d 'client_secret=YOUR_CLIENT_SECRET' \\\n  https://api.signal-ai.com/auth/token\n```\n\nThis will return the following JSON response:\n\n```json\n{\n    \"access_token\": \"eyJhbGciOi…\",\n    \"expires_in\": 86400,\n    …\n}\n```\n\nYou must send the `access_token` from this response in the Authorization header when making requests to other API endpoints:\n\n```bash\ncurl -H \"Authorization: Bearer eyJhbGciOi…\" \\\n  https://api.signal-ai.com/…\n```\n\nAccess tokens will expire 24 hours from the time they were issued.\n"
      flows:
        clientCredentials:
          tokenUrl: https://api.signal-ai.com/auth/token
          scopes:
            default: Access to discovery endpoints
            search: Access to content search endpoint
            metrics: Access to content metrics endpoint
            affinity: Access to concept affinity endpoints
            events: Access to events endpoint
            risk-events: Access to risk events
x-tagGroups:
- name: Concept Discovery
  tags:
  - Publication sources
  - Topics
  - Entities
  - Categories
- name: Search
  tags:
  - Content Search
- name: Metrics
  tags:
  - Content Metrics
- name: Affinity
  x-displayName: Affinity
  tags:
  - Affinity
- name: Events
  x-displayName: Events
  tags:
  - Events
- name: Risk (Alpha)
  tags:
  - Risk Events