{
  "openapi": "3.0.1",
  "info": {
    "title": "Worldfavor External API",
    "description": "The Worldfavor External API lets you read and update the data in your Worldfavor solution from your own systems.\n\n## Authentication\nThe API uses OAuth 2.0 with the client credentials grant.\nYou get a client ID and a client secret when API access is enabled in your Worldfavor solution.\nExchange them for an access token by making a **POST** request to `https://dev.auth.worldfavor.com/oauth/token` with this request body:\n```json\n{\n    \"grant_type\": \"client_credentials\",\n    \"client_id\": \"*******\",\n    \"client_secret\": \"*******\",\n    \"audience\": \"https://dev.worldfavor.com\"\n}\n```\nThe response contains an access token that is valid for 24 hours:\n```json\n{\n    \"access_token\": \"*******\",\n    \"expires_in\": \"86400\",\n    \"token_type\": \"Bearer\"\n}\n```\nSend the token in the `Authorization` header of every request, using the `Bearer` scheme. Reuse the token until it expires rather than requesting a new one for every call.\n\n## Data format\n- Requests and responses are JSON, sent over HTTPS. Field names are camelCase.\n- Timestamps are UTC in ISO 8601, `yyyy-MM-ddTHH:mm:ssZ`. Dates without a time are `yyyy-MM-dd`.\n- Country codes are ISO 3166-1 alpha-2 in lowercase, for example `se`.\n- Fields with a fixed set of values use readable text, for example `Supply chain` or `Not activated`. Each field lists its values.\n- New fields can be added to responses over time, so ignore fields you don't recognize.\n\n## Pagination\nEvery list endpoint returns one page of items in this format:\n```json\n{\n    \"pageNumber\": 1,\n    \"pageSize\": 100,\n    \"pageCount\": 3,\n    \"totalItems\": 214,\n    \"items\": [ ]\n}\n```\nUse these query parameters to choose the page:\n\n| Parameter | Default | Description |\n| --- | --- | --- |\n| `pageNumber` | `1` | The page to return, starting from 1. |\n| `pageSize` | `25` | Items per page, at most 1000. A larger value is reduced to 1000. |\n\n## Date filters\nA date filter has the same name as the date field it filters on, for example `calculatedAt` on `/riskResults`. Its value is a date, `yyyy-MM-dd`, or a timestamp with a time zone: `yyyy-MM-ddTHH:mm:ssZ` for UTC, or an offset such as `+02:00`. Encode `+` as `%2B` in a URL. A timestamp without a time zone is rejected.\n\nA prefix sets how the value is compared:\n\n| Prefix | Matches when the field is |\n| --- | --- |\n| `eq` | Equal to the value. Used when there is no prefix. |\n| `gt` | After the value |\n| `ge` | At or after the value |\n| `lt` | Before the value |\n| `le` | At or before the value |\n\nA date covers the whole day, so `gt2026-09-01` matches from the start of 2026-09-02. A timestamp is compared exactly. Some filters accept only `gt` and `ge`, as their descriptions say.\n\nTo get only what changed since your previous call, keep the latest date you have read and pass it back with `gt`, for example `/riskResults?calculatedAt=gt2026-09-01T03:00:00Z`.\n\n## Custom ids\nEach company can carry your own identifier for it, `customId`, for example its id in your ERP or procurement system.\n- Endpoints with `by-custom-id` in the path, and the `customId` filter on `/riskResults`, match it exactly. In a path, URL-encode it: a `/` is sent as `%2F`.\n- The `customId` filter on `GET /companies` matches every company whose customId contains the value.\n- Whether two companies can share a customId is a setting on your account. Where they can, the `by-custom-id` endpoints return `409` with the ids of the matching companies, and you use the company's `id` instead.\n\n## Errors\nThe API uses standard HTTP status codes. Errors have a JSON body with a `message` that describes the problem, except `429`, which has no body.\n\n| Status | When |\n| --- | --- |\n| `400` Bad Request | A query parameter is missing or not valid. |\n| `401` Unauthorized | The access token is missing, invalid or expired. |\n| `403` Forbidden | The feature is not enabled for your account. |\n| `404` Not Found | The resource doesn't exist in your solution. |\n| `409` Conflict | The request conflicts with existing data. For a customId, `companyIds` lists the companies that have it. |\n| `422` Unprocessable Content | The request body is not valid, and nothing was saved. `errors` lists each problem. |\n| `429` Too Many Requests | The rate limit was exceeded. |\n| `500` Internal Server Error | An unexpected error. It is logged on our side. |\n\nA `422` lists each problem with the field it concerns:\n```json\n{\n    \"message\": \"The provided data was not valid.\",\n    \"errors\": [\n        { \"field\": \"countryCode\", \"message\": \"The country code did not match a country.\" },\n        { \"field\": \"categories[0].tags[1]\", \"message\": \"No tag named 'Logistics' exists in category 'Supplier type'.\" }\n    ]\n}\n```\n\n## Rate limiting\nYou can make up to 1000 requests per minute with each access token. Above that, the API returns `429`; wait and try again. A large `pageSize` gets you further than many small requests.\n\n## Available resources\nThe endpoints documented here are our standard offering. Contact Worldfavor if you need data the API doesn't cover yet.\n\n## Try it from this page\nYou can call the API directly from this page, in one of two ways:\n- Authenticate once: enter your client ID and client secret in the **Authentication** box at the top of this page, click **Authorize**, then open any endpoint and click **Test Request**.\n- Authenticate per endpoint: open the endpoint you want to try, click **Test Request**, enter your client ID and client secret under **Authentication**, and send the request.",
    "version": "v1"
  },
  "servers": [
    {
      "url": "https://demo.api.worldfavor.com/v1"
    }
  ],
  "paths": {
    "/assessments": {
      "get": {
        "tags": [
          "Assessments"
        ],
        "summary": "Get assessments",
        "description": "Returns assessment results, one per company, assessment and period.",
        "parameters": [
          {
            "name": "companyId",
            "in": "query",
            "description": "Company ids, comma-separated.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "assessmentTemplateId",
            "in": "query",
            "description": "Assessment ids, comma-separated.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "period",
            "in": "query",
            "description": "The period, for example `2025`.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "level",
            "in": "query",
            "description": "The level reached, for example `3`.",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "origin",
            "in": "query",
            "description": "Where the answers behind the result came from: `AI screened` or `Self-reported`. Leave it out to get both.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "assessedAt",
            "in": "query",
            "description": "When the result was last calculated. A date or timestamp with an `eq`, `gt`, `ge`, `lt` or `le` prefix, as described under Date filters.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "pageNumber",
            "in": "query",
            "description": "The page to return, starting from 1.",
            "schema": {
              "type": "integer",
              "format": "int32",
              "default": 1
            }
          },
          {
            "name": "pageSize",
            "in": "query",
            "description": "Items per page, at most 1000. A larger value is reduced to 1000.",
            "schema": {
              "type": "integer",
              "format": "int32",
              "default": 25
            }
          }
        ],
        "responses": {
          "200": {
            "description": "A page of assessment results.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PaginatedAssessmentResult"
                }
              }
            }
          },
          "400": {
            "description": "A query parameter is not valid.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "The access token is missing, invalid or expired.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "The rate limit was exceeded. Wait and try again."
          }
        }
      }
    },
    "/categories": {
      "get": {
        "tags": [
          "Categories"
        ],
        "summary": "Get categories",
        "description": "Returns your own categories, each with its tags. Use these names in `categories` when you create or update a company.",
        "parameters": [
          {
            "name": "pageNumber",
            "in": "query",
            "description": "The page to return, starting from 1.",
            "schema": {
              "type": "integer",
              "format": "int32",
              "default": 1
            }
          },
          {
            "name": "pageSize",
            "in": "query",
            "description": "Items per page, at most 1000. A larger value is reduced to 1000.",
            "schema": {
              "type": "integer",
              "format": "int32",
              "default": 25
            }
          }
        ],
        "responses": {
          "200": {
            "description": "A page of categories.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PaginatedCategoryResult"
                }
              }
            }
          },
          "400": {
            "description": "A query parameter is not valid.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "The access token is missing, invalid or expired.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "The rate limit was exceeded. Wait and try again."
          }
        }
      }
    },
    "/companies": {
      "post": {
        "tags": [
          "Companies"
        ],
        "summary": "Create company",
        "description": "Creates a company. This starts the automations set up for your account, such as AI screening and AI enrichment of company data, and queues a risk calculation.",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "required": [
                  "countryCode",
                  "name"
                ],
                "allOf": [
                  {
                    "$ref": "#/components/schemas/CreateCompany"
                  }
                ]
              }
            }
          }
        },
        "responses": {
          "201": {
            "description": "The company was created.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Company"
                }
              }
            }
          },
          "401": {
            "description": "The access token is missing, invalid or expired.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "409": {
            "description": "A company with this customId already exists, and your account requires unique customIds.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CustomIdConflict"
                }
              }
            }
          },
          "422": {
            "description": "The provided data was not valid.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ValidationErrors"
                }
              }
            }
          },
          "429": {
            "description": "The rate limit was exceeded. Wait and try again."
          }
        }
      },
      "get": {
        "tags": [
          "Companies"
        ],
        "summary": "Get companies",
        "description": "Returns the companies in your solution.",
        "parameters": [
          {
            "name": "id",
            "in": "query",
            "description": "Worldfavor id of the company.",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "name",
            "in": "query",
            "description": "Matches companies whose name contains this.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "customId",
            "in": "query",
            "description": "Matches companies whose customId contains this. For an exact match, use `/companies/by-custom-id/{customId}`.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "vatNumber",
            "in": "query",
            "description": "Matches companies whose VAT number contains this.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "registrationNumber",
            "in": "query",
            "description": "Matches companies whose registration number contains this.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "dunsNumber",
            "in": "query",
            "description": "Matches companies whose DUNS number contains this.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "pageNumber",
            "in": "query",
            "description": "The page to return, starting from 1.",
            "schema": {
              "type": "integer",
              "format": "int32",
              "default": 1
            }
          },
          {
            "name": "pageSize",
            "in": "query",
            "description": "Items per page, at most 1000. A larger value is reduced to 1000.",
            "schema": {
              "type": "integer",
              "format": "int32",
              "default": 25
            }
          }
        ],
        "responses": {
          "200": {
            "description": "A page of companies.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PaginatedCompanyResult"
                }
              }
            }
          },
          "400": {
            "description": "A query parameter is not valid.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "The access token is missing, invalid or expired.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "The rate limit was exceeded. Wait and try again."
          }
        }
      }
    },
    "/companies/by-custom-id/{customId}": {
      "put": {
        "tags": [
          "Companies"
        ],
        "summary": "Create or update company by customId",
        "description": "Updates the company with this customId, or creates it if there is none. Repeating a call never creates a second company.\n\n`name` and `countryCode` are required on every call. A field you send is set, a field you leave out is unchanged, and a field sent as `null` is cleared. `categories` replaces the company's tags only within the categories you send. Once a company has connected its own Worldfavor account, it manages its own name and country, and an update doesn't change them.\n\nCreating a company starts the same automations as `POST /companies`. An update that changes nothing writes nothing.",
        "parameters": [
          {
            "name": "customId",
            "in": "path",
            "description": "Your own identifier for the company, URL-encoded.",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "required": [
                  "countryCode",
                  "name"
                ],
                "allOf": [
                  {
                    "$ref": "#/components/schemas/UpsertCompany"
                  }
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "The company was updated, or already matched the body.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Company"
                }
              }
            }
          },
          "201": {
            "description": "The company was created.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Company"
                }
              }
            }
          },
          "401": {
            "description": "The access token is missing, invalid or expired.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "409": {
            "description": "More than one company has this customId. Nothing was changed.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CustomIdConflict"
                }
              }
            }
          },
          "422": {
            "description": "The provided data was not valid.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ValidationErrors"
                }
              }
            }
          },
          "429": {
            "description": "The rate limit was exceeded. Wait and try again."
          }
        }
      },
      "get": {
        "tags": [
          "Companies"
        ],
        "summary": "Get company by customId",
        "description": "Returns the company with this customId.",
        "parameters": [
          {
            "name": "customId",
            "in": "path",
            "description": "Your own identifier for the company, URL-encoded.",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "The company.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Company"
                }
              }
            }
          },
          "401": {
            "description": "The access token is missing, invalid or expired.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No company has this customId.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "409": {
            "description": "More than one company has this customId. Use the company's `id` instead.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CustomIdConflict"
                }
              }
            }
          },
          "429": {
            "description": "The rate limit was exceeded. Wait and try again."
          }
        }
      }
    },
    "/companies/{id}": {
      "get": {
        "tags": [
          "Companies"
        ],
        "summary": "Get company",
        "description": "Returns the company with this Worldfavor id.",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "description": "Worldfavor id of the company.",
            "required": true,
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "The company.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Company"
                }
              }
            }
          },
          "401": {
            "description": "The access token is missing, invalid or expired.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No company has this id.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "The rate limit was exceeded. Wait and try again."
          }
        }
      }
    },
    "/companies/{id}/profile": {
      "get": {
        "tags": [
          "Company profiles"
        ],
        "summary": "Get company profile",
        "description": "Returns the company's sustainability profile, the same information as on its Profile tab in Worldfavor. Each sustainability area and topic has its risk, assessment result, disclosure score and peer benchmark. Each part carries its own date, because the parts are updated at different times. Much of the profile can come from AI screening of public sources, and each assessment result says so in `origin`.",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "description": "Worldfavor id of the company.",
            "required": true,
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "peerGroup",
            "in": "query",
            "description": "The peers to compare with: `Industry`, `Region`, `Revenue range` or `Network`. Defaults to the first of these the company has a value for, in that order. `benchmark.peerGroup` says which was used.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "The profile.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CompanyProfile"
                }
              }
            }
          },
          "400": {
            "description": "A query parameter is not valid.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "The access token is missing, invalid or expired.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "The company profile is not enabled for your account.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No company has this id.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "The rate limit was exceeded. Wait and try again."
          }
        }
      }
    },
    "/companies/by-custom-id/{customId}/profile": {
      "get": {
        "tags": [
          "Company profiles"
        ],
        "summary": "Get company profile by customId",
        "description": "Returns the company's sustainability profile, the same information as on its Profile tab in Worldfavor. Each sustainability area and topic has its risk, assessment result, disclosure score and peer benchmark. Each part carries its own date, because the parts are updated at different times. Much of the profile can come from AI screening of public sources, and each assessment result says so in `origin`.",
        "parameters": [
          {
            "name": "customId",
            "in": "path",
            "description": "Your own identifier for the company, URL-encoded.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "peerGroup",
            "in": "query",
            "description": "The peers to compare with: `Industry`, `Region`, `Revenue range` or `Network`. Defaults to the first of these the company has a value for, in that order. `benchmark.peerGroup` says which was used.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "The profile.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CompanyProfile"
                }
              }
            }
          },
          "400": {
            "description": "A query parameter is not valid.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "The access token is missing, invalid or expired.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "The company profile is not enabled for your account.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No company has this customId.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "409": {
            "description": "More than one company has this customId. Use the company's `id` instead.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CustomIdConflict"
                }
              }
            }
          },
          "429": {
            "description": "The rate limit was exceeded. Wait and try again."
          }
        }
      }
    },
    "/companies/changes": {
      "get": {
        "tags": [
          "Company profiles"
        ],
        "summary": "Get companies with a changed profile",
        "description": "Returns the companies whose profile changed after a point in time, ordered by company id, with the time each part of the profile last changed.\n\nA change is an assessment created or recalculated, a risk calculation, or a completed adverse media, sanctions or PEP check. Peer benchmarks and the company's own fields and tags don't count. A change can be to something the profile doesn't show, such as an assessment for an earlier period, so a listed profile can look the same as before. A company with no results yet is not listed.\n\n`findingsCheckedAt` is when a check started, so a check that was still running at your previous call can carry an earlier time. Pass the time your previous call started, with `ge`, so that each call overlaps the one before.",
        "parameters": [
          {
            "name": "changedAt",
            "in": "query",
            "description": "Required. When the profile changed. A date or timestamp with a `gt` or `ge` prefix, as described under Date filters.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "pageNumber",
            "in": "query",
            "description": "The page to return, starting from 1.",
            "schema": {
              "type": "integer",
              "format": "int32",
              "default": 1
            }
          },
          {
            "name": "pageSize",
            "in": "query",
            "description": "Items per page, at most 1000. A larger value is reduced to 1000.",
            "schema": {
              "type": "integer",
              "format": "int32",
              "default": 25
            }
          }
        ],
        "responses": {
          "200": {
            "description": "The changed companies.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PaginatedCompanyChangeResult"
                }
              }
            }
          },
          "400": {
            "description": "`changedAt` is missing or not valid, or has a prefix other than `gt` or `ge`.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "The access token is missing, invalid or expired.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "The company profile is not enabled for your account.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "The rate limit was exceeded. Wait and try again."
          }
        }
      }
    },
    "/contacts": {
      "get": {
        "tags": [
          "Contacts"
        ],
        "summary": "Get contacts",
        "description": "Returns the contacts at your companies.",
        "parameters": [
          {
            "name": "name",
            "in": "query",
            "description": "Matches contacts whose name contains this.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "email",
            "in": "query",
            "description": "Matches contacts whose email address contains this.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "pageNumber",
            "in": "query",
            "description": "The page to return, starting from 1.",
            "schema": {
              "type": "integer",
              "format": "int32",
              "default": 1
            }
          },
          {
            "name": "pageSize",
            "in": "query",
            "description": "Items per page, at most 1000. A larger value is reduced to 1000.",
            "schema": {
              "type": "integer",
              "format": "int32",
              "default": 25
            }
          }
        ],
        "responses": {
          "200": {
            "description": "A page of contacts.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PaginatedContactResult"
                }
              }
            }
          },
          "400": {
            "description": "A query parameter is not valid.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "The access token is missing, invalid or expired.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "The rate limit was exceeded. Wait and try again."
          }
        }
      }
    },
    "/expectations": {
      "get": {
        "tags": [
          "Expectations"
        ],
        "summary": "Get expectations",
        "description": "Returns the improvement expectations set for your companies.",
        "parameters": [
          {
            "name": "companyId",
            "in": "query",
            "description": "Company ids, comma-separated.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "assessmentTemplateId",
            "in": "query",
            "description": "Assessment ids, comma-separated.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "status",
            "in": "query",
            "description": "`Requested`, `Accepted`, `Declined`, `Delayed` or `Completed`.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "changedAt",
            "in": "query",
            "description": "When the expectation was created or last changed, for example its status or due date. A date or timestamp with a `gt` or `ge` prefix, as described under Date filters.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "pageNumber",
            "in": "query",
            "description": "The page to return, starting from 1.",
            "schema": {
              "type": "integer",
              "format": "int32",
              "default": 1
            }
          },
          {
            "name": "pageSize",
            "in": "query",
            "description": "Items per page, at most 1000. A larger value is reduced to 1000.",
            "schema": {
              "type": "integer",
              "format": "int32",
              "default": 25
            }
          }
        ],
        "responses": {
          "200": {
            "description": "A page of expectations.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PaginatedExpectationResult"
                }
              }
            }
          },
          "400": {
            "description": "A query parameter is not valid.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "The access token is missing, invalid or expired.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "The rate limit was exceeded. Wait and try again."
          }
        }
      }
    },
    "/productRelations": {
      "get": {
        "tags": [
          "Products"
        ],
        "summary": "Get product relations",
        "description": "Returns the product relations in your solution.",
        "parameters": [
          {
            "name": "gtin",
            "in": "query",
            "description": "Matches relations whose product GTIN contains this.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "productNumber",
            "in": "query",
            "description": "Matches relations whose product number contains this.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "purchaseOrder",
            "in": "query",
            "description": "Matches relations whose purchase order number contains this.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "pageNumber",
            "in": "query",
            "description": "The page to return, starting from 1.",
            "schema": {
              "type": "integer",
              "format": "int32",
              "default": 1
            }
          },
          {
            "name": "pageSize",
            "in": "query",
            "description": "Items per page, at most 1000. A larger value is reduced to 1000.",
            "schema": {
              "type": "integer",
              "format": "int32",
              "default": 25
            }
          }
        ],
        "responses": {
          "200": {
            "description": "A page of product relations.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PaginatedProductRelationResult"
                }
              }
            }
          },
          "400": {
            "description": "A query parameter is not valid.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "The access token is missing, invalid or expired.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "The rate limit was exceeded. Wait and try again."
          }
        }
      }
    },
    "/products": {
      "get": {
        "tags": [
          "Products"
        ],
        "summary": "Get products",
        "description": "Returns the products in your solution.",
        "parameters": [
          {
            "name": "id",
            "in": "query",
            "description": "Worldfavor id of the product.",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "name",
            "in": "query",
            "description": "Matches products whose name contains this.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "gtin",
            "in": "query",
            "description": "Matches products whose GTIN contains this.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "productCustomId",
            "in": "query",
            "description": "Matches products whose productCustomId contains this.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "productNumber",
            "in": "query",
            "description": "Matches products whose product number contains this.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "purchaseOrder",
            "in": "query",
            "description": "Matches products whose purchase order number contains this.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "pageNumber",
            "in": "query",
            "description": "The page to return, starting from 1.",
            "schema": {
              "type": "integer",
              "format": "int32",
              "default": 1
            }
          },
          {
            "name": "pageSize",
            "in": "query",
            "description": "Items per page, at most 1000. A larger value is reduced to 1000.",
            "schema": {
              "type": "integer",
              "format": "int32",
              "default": 25
            }
          }
        ],
        "responses": {
          "200": {
            "description": "A page of products.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PaginatedProductResult"
                }
              }
            }
          },
          "400": {
            "description": "A query parameter is not valid.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "The access token is missing, invalid or expired.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "The rate limit was exceeded. Wait and try again."
          }
        }
      },
      "post": {
        "tags": [
          "Products"
        ],
        "summary": "Create product",
        "description": "Creates a product. The combination of name and GTIN must be unique, and so must the name when GTIN is empty. Identify the company that supplies the product with `companyId` or `companyCustomId`.",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "allOf": [
                  {
                    "$ref": "#/components/schemas/CreateProduct"
                  }
                ]
              }
            }
          }
        },
        "responses": {
          "201": {
            "description": "The product was created.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Product"
                }
              }
            }
          },
          "401": {
            "description": "The access token is missing, invalid or expired.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "409": {
            "description": "A product with this name and GTIN already exists.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "422": {
            "description": "The provided data was not valid.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ValidationErrors"
                }
              }
            }
          },
          "429": {
            "description": "The rate limit was exceeded. Wait and try again."
          }
        }
      }
    },
    "/products/{id}": {
      "get": {
        "tags": [
          "Products"
        ],
        "summary": "Get product",
        "description": "Returns the product with this Worldfavor id.",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "description": "Worldfavor id of the product.",
            "required": true,
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "The product.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Product"
                }
              }
            }
          },
          "401": {
            "description": "The access token is missing, invalid or expired.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No product has this id.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "The rate limit was exceeded. Wait and try again."
          }
        }
      },
      "put": {
        "tags": [
          "Products"
        ],
        "summary": "Update product",
        "description": "Updates the product with this Worldfavor id. The combination of name and GTIN must be unique, and so must the name when GTIN is empty. Identify the company that supplies the product with `companyId` or `companyCustomId`.",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "description": "Worldfavor id of the product.",
            "required": true,
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "allOf": [
                  {
                    "$ref": "#/components/schemas/UpdateProduct"
                  }
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "The product was updated.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Product"
                }
              }
            }
          },
          "401": {
            "description": "The access token is missing, invalid or expired.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No product has this id.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "422": {
            "description": "The provided data was not valid.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ValidationErrors"
                }
              }
            }
          },
          "429": {
            "description": "The rate limit was exceeded. Wait and try again."
          }
        }
      },
      "delete": {
        "tags": [
          "Products"
        ],
        "summary": "Delete product",
        "description": "Deletes the product with this Worldfavor id.",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "description": "Worldfavor id of the product.",
            "required": true,
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "204": {
            "description": "The product was deleted."
          },
          "401": {
            "description": "The access token is missing, invalid or expired.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No product has this id.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "The rate limit was exceeded. Wait and try again."
          }
        }
      }
    },
    "/answers": {
      "get": {
        "tags": [
          "Reported answers"
        ],
        "summary": "Get reported answers",
        "description": "Returns the answers your companies have reported, one per question and response.",
        "parameters": [
          {
            "name": "companyId",
            "in": "query",
            "description": "Company ids, comma-separated.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "questionnaireId",
            "in": "query",
            "description": "Questionnaire ids, comma-separated.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "questionId",
            "in": "query",
            "description": "Question ids, comma-separated.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "questionType",
            "in": "query",
            "description": "`Text`, `Number`, `File`, `Options` or `Coordinates`.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "reportedAt",
            "in": "query",
            "description": "When the response was submitted. A date or timestamp with an `eq`, `gt`, `ge`, `lt` or `le` prefix, as described under Date filters.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "origin",
            "in": "query",
            "description": "`AI screened` for answers from AI screening of the company's public sources, `Self-reported` for answers the company submitted. Leave it out to get both.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "isLatest",
            "in": "query",
            "description": "`true` to get only answers from the latest submitted response to each request. Leave it out to get all answers.",
            "schema": {
              "type": "boolean"
            }
          },
          {
            "name": "pageNumber",
            "in": "query",
            "description": "The page to return, starting from 1.",
            "schema": {
              "type": "integer",
              "format": "int32",
              "default": 1
            }
          },
          {
            "name": "pageSize",
            "in": "query",
            "description": "Items per page, at most 1000. A larger value is reduced to 1000.",
            "schema": {
              "type": "integer",
              "format": "int32",
              "default": 25
            }
          }
        ],
        "responses": {
          "200": {
            "description": "A page of answers.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PaginatedAnswerResult"
                }
              }
            }
          },
          "400": {
            "description": "A query parameter is not valid.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "The access token is missing, invalid or expired.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "The rate limit was exceeded. Wait and try again."
          }
        }
      }
    },
    "/riskResults": {
      "get": {
        "tags": [
          "Risk results"
        ],
        "summary": "Get risk results",
        "description": "Returns the latest risk result for each company, with a risk level for the company, for each sustainability area and for each topic.",
        "parameters": [
          {
            "name": "customId",
            "in": "query",
            "description": "Custom ids, comma-separated, matched exactly. Where companies share a customId, a value matches all of them.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "companyId",
            "in": "query",
            "description": "Company ids, comma-separated.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "calculatedAt",
            "in": "query",
            "description": "When the result was calculated. A date or timestamp with an `eq`, `gt`, `ge`, `lt` or `le` prefix, as described under Date filters.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "pageNumber",
            "in": "query",
            "description": "The page to return, starting from 1.",
            "schema": {
              "type": "integer",
              "format": "int32",
              "default": 1
            }
          },
          {
            "name": "pageSize",
            "in": "query",
            "description": "Items per page, at most 1000. A larger value is reduced to 1000.",
            "schema": {
              "type": "integer",
              "format": "int32",
              "default": 25
            }
          }
        ],
        "responses": {
          "200": {
            "description": "A page of risk results.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PaginatedRiskResultResult"
                }
              }
            }
          },
          "400": {
            "description": "A query parameter is not valid.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "The access token is missing, invalid or expired.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "The rate limit was exceeded. Wait and try again."
          }
        }
      }
    }
  },
  "components": {
    "schemas": {
      "Answer": {
        "type": "object",
        "properties": {
          "id": {
            "type": "integer",
            "description": "Worldfavor id of the answer",
            "format": "int32"
          },
          "responseId": {
            "type": "integer",
            "description": "Id of the response the answer belongs to",
            "format": "int32",
            "nullable": true
          },
          "origin": {
            "type": "string",
            "description": "Where the answer came from: `AI screened` or `Self-reported`. An `AI screened` answer was produced from the company's public sources and does not mean the company has answered or confirmed anything.",
            "nullable": true
          },
          "companyId": {
            "type": "integer",
            "description": "Worldfavor id of the company that answered",
            "format": "int32",
            "nullable": true
          },
          "company": {
            "type": "string",
            "description": "Name of the company that answered",
            "nullable": true
          },
          "targetProductId": {
            "type": "integer",
            "description": "Id of the product the answer is about, when the questionnaire was sent for a product",
            "format": "int32",
            "nullable": true
          },
          "reportedAt": {
            "type": "string",
            "description": "When the response was submitted",
            "format": "date-time",
            "nullable": true
          },
          "expiresAt": {
            "type": "string",
            "description": "The date the answer expires, when it has one",
            "nullable": true
          },
          "estimatedAnswerAt": {
            "type": "string",
            "description": "For a skipped question, the date the company expects to answer it",
            "nullable": true
          },
          "questionnaireId": {
            "type": "integer",
            "description": "Id of the questionnaire",
            "format": "int32"
          },
          "questionnaire": {
            "type": "string",
            "description": "Name of the questionnaire",
            "nullable": true
          },
          "section": {
            "type": "string",
            "description": "Name of the questionnaire section",
            "nullable": true
          },
          "questionId": {
            "type": "integer",
            "description": "Id of the question",
            "format": "int32"
          },
          "question": {
            "type": "string",
            "description": "Text of the question",
            "nullable": true
          },
          "questionType": {
            "type": "string",
            "description": "`Text`, `Number`, `File`, `Options` or `Coordinates`",
            "nullable": true
          },
          "period": {
            "type": "string",
            "description": "The reporting period, for example `2025`, or `No period`",
            "nullable": true
          },
          "periodStartsAt": {
            "type": "string",
            "description": "First day of the period",
            "format": "date",
            "nullable": true
          },
          "periodEndsAt": {
            "type": "string",
            "description": "Last day of the period",
            "format": "date",
            "nullable": true
          },
          "unit": {
            "type": "string",
            "description": "Unit of a number answer, for example `kg`",
            "nullable": true
          },
          "skipped": {
            "type": "boolean",
            "description": "Whether the company skipped the question. `answerStatus` says why."
          },
          "answerStatus": {
            "type": "string",
            "description": "`Answered`, `Not applicable`, `Not available`, `Other` or `Excluded`",
            "nullable": true
          },
          "answer": {
            "type": "string",
            "description": "The answer as text. A number answer includes its unit, and several options or files are separated by ` | `.",
            "nullable": true
          },
          "numberAnswer": {
            "type": "number",
            "description": "A number answer as a number",
            "format": "double",
            "nullable": true
          },
          "fileAnswer": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Names of the files uploaded as the answer",
            "nullable": true
          },
          "optionsAnswer": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "The options selected",
            "nullable": true
          },
          "comment": {
            "type": "string",
            "description": "The company's comment on its answer",
            "nullable": true
          },
          "verification": {
            "allOf": [
              {
                "$ref": "#/components/schemas/Verification"
              }
            ],
            "description": "The latest verification of this answer",
            "nullable": true
          },
          "responseVerification": {
            "allOf": [
              {
                "$ref": "#/components/schemas/Verification"
              }
            ],
            "description": "The latest verification of the whole response",
            "nullable": true
          },
          "flagged": {
            "type": "boolean",
            "description": "Whether a flag rule flagged the answer"
          },
          "flagger": {
            "type": "string",
            "description": "`System` for a Worldfavor rule, `User` for a rule set up by your organization",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "AreaBenchmark": {
        "type": "object",
        "properties": {
          "baselineLevel": {
            "type": "number",
            "description": "The peers' median Baseline level for this area",
            "format": "double"
          }
        },
        "additionalProperties": false
      },
      "Assessment": {
        "type": "object",
        "properties": {
          "id": {
            "type": "integer",
            "description": "Worldfavor id of the assessment result",
            "format": "int32"
          },
          "companyId": {
            "type": "integer",
            "description": "Worldfavor id of the company",
            "format": "int32",
            "nullable": true
          },
          "customId": {
            "type": "string",
            "description": "Your own identifier for the company",
            "nullable": true
          },
          "company": {
            "type": "string",
            "description": "Name of the company",
            "nullable": true
          },
          "assessmentTemplateId": {
            "type": "integer",
            "description": "Id of the assessment",
            "format": "int32",
            "nullable": true
          },
          "assessmentTemplate": {
            "type": "string",
            "description": "Name of the assessment",
            "nullable": true
          },
          "period": {
            "type": "string",
            "description": "The period, for example `2025`",
            "nullable": true
          },
          "level": {
            "type": "integer",
            "description": "The level reached, from 1 up to `levels`. Null when no level could be set.",
            "format": "int32",
            "nullable": true
          },
          "levels": {
            "type": "integer",
            "description": "Number of levels on the assessment's scale, for example 5 or 3",
            "format": "int32",
            "nullable": true
          },
          "levelTitle": {
            "type": "string",
            "description": "Name of the level reached, for example `Robust`",
            "nullable": true
          },
          "origin": {
            "type": "string",
            "description": "Where the answers behind the result came from: `AI screened` or `Self-reported`. An `AI screened` result was produced from the company's public sources and does not mean the company has answered or confirmed anything.",
            "nullable": true
          },
          "assessedAt": {
            "type": "string",
            "description": "When the result was last calculated",
            "format": "date-time",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "AssessmentResult": {
        "type": "object",
        "properties": {
          "level": {
            "type": "integer",
            "description": "The level reached, from 1 up to `levels`",
            "format": "int32"
          },
          "levels": {
            "type": "integer",
            "description": "Number of levels on the assessment's scale, for example 5 or 3",
            "format": "int32",
            "nullable": true
          },
          "assessment": {
            "type": "string",
            "description": "Name of the assessment the result comes from",
            "nullable": true
          },
          "section": {
            "type": "string",
            "description": "Name of the assessment section the result comes from, when it comes from a section of a broader assessment such as the Baseline. Null for a topic-specific assessment.",
            "nullable": true
          },
          "period": {
            "type": "string",
            "nullable": true
          },
          "source": {
            "type": "string",
            "description": "The result as the platform shows it, for example `Baseline: Environmental (2025)`",
            "nullable": true
          },
          "origin": {
            "type": "string",
            "description": "Where the answers behind the result came from: `AI screened` or `Self-reported`. An `AI screened` result was produced from the company's public sources and does not mean the company has answered or confirmed anything.",
            "nullable": true
          },
          "assessedAt": {
            "type": "string",
            "description": "When the assessment result was last calculated",
            "format": "date-time",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "Category": {
        "type": "object",
        "properties": {
          "id": {
            "type": "integer",
            "format": "int32"
          },
          "name": {
            "type": "string",
            "nullable": true
          },
          "tags": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Tag"
            },
            "nullable": true
          }
        },
        "additionalProperties": false,
        "description": "One of your own categories, with its tags. Use these names in `categories` when you create or update a company."
      },
      "Company": {
        "type": "object",
        "properties": {
          "id": {
            "type": "integer",
            "description": "Worldfavor id of the company",
            "format": "int32",
            "nullable": true
          },
          "createdAt": {
            "type": "string",
            "description": "When the company was created in Worldfavor",
            "format": "date-time"
          },
          "name": {
            "type": "string",
            "nullable": true
          },
          "customId": {
            "type": "string",
            "description": "Your own identifier for the company",
            "nullable": true
          },
          "countryCode": {
            "type": "string",
            "description": "Country code, for example `se`",
            "nullable": true
          },
          "vatNumber": {
            "type": "string",
            "description": "VAT number",
            "nullable": true
          },
          "registrationNumber": {
            "type": "string",
            "description": "Company registration number",
            "nullable": true
          },
          "dunsNumber": {
            "type": "string",
            "description": "DUNS number",
            "nullable": true
          },
          "website": {
            "type": "string",
            "nullable": true
          },
          "owner": {
            "type": "string",
            "description": "Name of the user in your organization who owns the company in Worldfavor. The first one, when there are several.",
            "nullable": true
          },
          "status": {
            "type": "string",
            "description": "`Created` when added by your organization, `Invited` when invited to Worldfavor, or `Connected` when the company has connected its own Worldfavor account",
            "nullable": true
          },
          "activityStatus": {
            "type": "string",
            "description": "`Active`, `Inactive` or `Closed`. Null when not set.",
            "nullable": true
          },
          "supplierUsage": {
            "type": "string",
            "description": "`Direct` or `Indirect`. Null when not set.",
            "nullable": true
          },
          "approvalStatus": {
            "type": "string",
            "description": "`Approved`, `Approved after consideration`, `Under observation` or `Not approved`. Null when not set.",
            "nullable": true
          },
          "riskAssessment": {
            "type": "string",
            "description": "The risk rating set on the company: `Low risk`, `Medium risk`, `High risk` or `Extreme risk`. Null when not set.",
            "nullable": true
          },
          "priority": {
            "type": "string",
            "description": "`Very high`, `High`, `Medium`, `Low` or `Not a priority`. Null when not set.",
            "nullable": true
          },
          "tier": {
            "type": "string",
            "description": "The company's supply chain tier, for example `1`. Null when not set.",
            "nullable": true
          },
          "customCategories": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Deprecated. The company's tag names, without their categories. Use `categories` instead.",
            "nullable": true
          },
          "categories": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/CompanyCategory"
            },
            "description": "Your own categories and the company's tags in each, in the format the create and update endpoints accept",
            "nullable": true
          },
          "industry": {
            "allOf": [
              {
                "$ref": "#/components/schemas/Industry"
              }
            ],
            "description": "The company's industry, or null when unknown. Read-only.",
            "nullable": true
          },
          "subIndustry": {
            "allOf": [
              {
                "$ref": "#/components/schemas/Industry"
              }
            ],
            "description": "A more specific industry within `industry`, or null when unknown. Read-only.",
            "nullable": true
          },
          "region": {
            "type": "string",
            "description": "The region of the company's country, for example `Northern Europe`. The profile benchmark's `Region` peer group uses it. Read-only.",
            "nullable": true
          },
          "revenueRange": {
            "allOf": [
              {
                "$ref": "#/components/schemas/RevenueRange"
              }
            ],
            "description": "The company's annual revenue band, or null when unknown. Read-only.",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "CompanyCategory": {
        "required": [
          "category",
          "tags"
        ],
        "type": "object",
        "properties": {
          "category": {
            "type": "string",
            "description": "Name of the category",
            "nullable": true
          },
          "tags": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Names of the tags in the category",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "CompanyChange": {
        "type": "object",
        "properties": {
          "companyId": {
            "type": "integer",
            "description": "Worldfavor id of the company",
            "format": "int32"
          },
          "name": {
            "type": "string",
            "nullable": true
          },
          "customId": {
            "type": "string",
            "description": "Your own identifier for the company",
            "nullable": true
          },
          "changedAt": {
            "type": "string",
            "description": "When the profile last changed: the latest of `assessmentsChangedAt`, `riskCalculatedAt` and `findingsCheckedAt`.",
            "format": "date-time"
          },
          "assessmentsChangedAt": {
            "type": "string",
            "description": "When any of the company's assessments was last created or recalculated, including assessments for periods the profile doesn't show. Dates the profile's `baseline`, each area's `baseline`, and each topic's `assessmentResult` and `disclosureScore`. Null when the company has no assessment.",
            "format": "date-time",
            "nullable": true
          },
          "riskCalculatedAt": {
            "type": "string",
            "description": "When the risk was last calculated, the same as `risk.calculatedAt` in the profile. Dates the profile's `risk` and each area's and topic's risk. Null before the first calculation.",
            "format": "date-time",
            "nullable": true
          },
          "findingsCheckedAt": {
            "type": "string",
            "description": "When the latest completed adverse media, sanctions or PEP check started: the latest `checkedAt` in the profile's `findings`. Null when the company has not been checked.",
            "format": "date-time",
            "nullable": true
          }
        },
        "additionalProperties": false,
        "description": "A company whose profile changed, with the time each part of the profile last changed."
      },
      "CompanyProfile": {
        "type": "object",
        "properties": {
          "company": {
            "allOf": [
              {
                "$ref": "#/components/schemas/Company"
              }
            ],
            "nullable": true
          },
          "disclosureScore": {
            "type": "number",
            "description": "The average of the topics' overall disclosure scores, rounded to one decimal. Null when no topic has a score. How much the company discloses, from 0 to 100. It measures disclosure, not performance: a high score means the company reports a lot on the topic, not that it performs well on it.",
            "format": "double",
            "nullable": true
          },
          "baseline": {
            "allOf": [
              {
                "$ref": "#/components/schemas/AssessmentResult"
              }
            ],
            "description": "The company's Baseline assessment result, or null when it has none with a level. Each area's own Baseline result is on the area.",
            "nullable": true
          },
          "risk": {
            "allOf": [
              {
                "$ref": "#/components/schemas/ProfileRisk"
              }
            ],
            "description": "The company-level result of the latest risk calculation, or null before the first one. Each area's and topic's risk is on the area and topic; `/riskResults` has the full breakdown.",
            "nullable": true
          },
          "benchmark": {
            "allOf": [
              {
                "$ref": "#/components/schemas/ProfileBenchmark"
              }
            ],
            "description": "How the company compares with its peers overall, and which peers the area, topic and findings benchmarks use. Null when the peer group has fewer than 10 companies with results; every other benchmark in the profile is then null too.",
            "nullable": true
          },
          "areas": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/ProfileArea"
            },
            "description": "Sustainability areas in a fixed order: `Environment`, `Social`, `Governance`, `Supply chain`. Areas without topics or a Baseline result are left out.",
            "nullable": true
          },
          "findings": {
            "allOf": [
              {
                "$ref": "#/components/schemas/FindingsSummary"
              }
            ],
            "description": "Counts from Worldfavor's AI screening of public sources for adverse media, sanctions and politically exposed persons (PEP). A finding is a signal to look into and engage the company on, not a verdict. The Profile tab in Worldfavor shows the findings themselves.",
            "nullable": true
          }
        },
        "additionalProperties": false,
        "description": "A company's sustainability profile, as on its Profile tab in Worldfavor. Each sustainability area and topic appears once, with its assessment result, disclosure score, risk and peer benchmark. Each part carries its own date, because the parts are updated at different times."
      },
      "Contact": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string",
            "nullable": true
          },
          "email": {
            "type": "string",
            "nullable": true
          },
          "jobTitle": {
            "type": "string",
            "description": "Job title",
            "nullable": true
          },
          "phoneNumber": {
            "type": "string",
            "description": "Phone number",
            "nullable": true
          },
          "company": {
            "allOf": [
              {
                "$ref": "#/components/schemas/Company"
              }
            ],
            "description": "The company the contact belongs to",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "CountryRisk": {
        "type": "object",
        "properties": {
          "riskStatus": {
            "type": "string",
            "description": "The more severe of headquarters and operations country risk. One of `Low`, `Medium`, `High`, `Extreme`, `Pending`, `No data` or `Not activated`.",
            "nullable": true
          },
          "countries": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/CountryRiskLocation"
            },
            "description": "The countries the level comes from. Several when more than one location has the same level.",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "CountryRiskLocation": {
        "type": "object",
        "properties": {
          "countryCode": {
            "type": "string",
            "description": "Country code, for example `se`",
            "nullable": true
          },
          "basis": {
            "type": "string",
            "description": "`Headquarters` or `Operations`",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "CreateCompany": {
        "required": [
          "countryCode",
          "name"
        ],
        "type": "object",
        "properties": {
          "name": {
            "type": "string",
            "description": "Name of the company. At least two characters. Latin characters, digits and the punctuation . , & ' \" - / : ( ) are accepted.",
            "nullable": true
          },
          "countryCode": {
            "type": "string",
            "description": "Country code of the company in ISO 3166-1 alpha-2 format, for example `se`. Uppercase is accepted.",
            "nullable": true
          },
          "customId": {
            "type": "string",
            "description": "Your own identifier for the company, for example its id in your ERP or procurement system. Whether two companies can share one depends on a setting on your account.",
            "nullable": true
          },
          "website": {
            "type": "string",
            "description": "Website of the company. AI enrichment and screening use it, so it improves their results.",
            "nullable": true
          },
          "registrationNumber": {
            "type": "string",
            "description": "Company registration number",
            "nullable": true
          },
          "dunsNumber": {
            "type": "string",
            "description": "DUNS number",
            "nullable": true
          },
          "vatNumber": {
            "type": "string",
            "description": "VAT number",
            "nullable": true
          },
          "categories": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/CompanyCategory"
            },
            "description": "Your own categories and tags for the company. Each category and tag must already exist on your account, with exactly this name; `GET /categories` lists them. An unknown name is rejected, never created.",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "CreateProduct": {
        "required": [
          "name"
        ],
        "type": "object",
        "properties": {
          "name": {
            "minLength": 1,
            "type": "string",
            "description": "Name of the product"
          },
          "gtin": {
            "type": "string",
            "description": "GTIN of the product",
            "nullable": true
          },
          "productCustomId": {
            "type": "string",
            "description": "Your own identifier for the product",
            "nullable": true
          },
          "productNumber": {
            "type": "string",
            "description": "Product number",
            "nullable": true
          },
          "purchaseOrder": {
            "type": "string",
            "description": "Purchase order number",
            "nullable": true
          },
          "countryCode": {
            "type": "string",
            "description": "Country code of the product in ISO 3166-1 alpha-2 format, for example `se`",
            "nullable": true
          },
          "productStatus": {
            "type": "string",
            "description": "`Active` or `Inactive`",
            "nullable": true
          },
          "mappingStatus": {
            "type": "string",
            "description": "`Not mapped`, `Partly mapped` or `Fully mapped`",
            "nullable": true
          },
          "companyId": {
            "type": "integer",
            "description": "Worldfavor id of the company that supplies the product. Send this or `companyCustomId`.",
            "format": "int32",
            "nullable": true
          },
          "companyCustomId": {
            "type": "string",
            "description": "Your own identifier for the company that supplies the product. Send this or `companyId`.",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "CustomIdConflict": {
        "type": "object",
        "properties": {
          "message": {
            "type": "string",
            "description": "What went wrong",
            "nullable": true
          },
          "companyIds": {
            "type": "array",
            "items": {
              "type": "integer",
              "format": "int32"
            },
            "description": "Worldfavor ids of the companies that have the customId",
            "nullable": true
          }
        },
        "additionalProperties": false,
        "description": "More than one company has the customId."
      },
      "DisclosureScore": {
        "type": "object",
        "properties": {
          "overall": {
            "type": "integer",
            "description": "The whole assessment",
            "format": "int32",
            "nullable": true
          },
          "ownOperations": {
            "type": "integer",
            "description": "The assessment's own-operations section, when it has one",
            "format": "int32",
            "nullable": true
          },
          "supplyChain": {
            "type": "integer",
            "description": "The assessment's supply-chain section, when it has one",
            "format": "int32",
            "nullable": true
          }
        },
        "additionalProperties": false,
        "description": "How much the company discloses, from 0 to 100. It measures disclosure, not performance: a high score means the company reports a lot on the topic, not that it performs well on it."
      },
      "Error": {
        "type": "object",
        "properties": {
          "message": {
            "type": "string",
            "description": "What went wrong",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "Expectation": {
        "type": "object",
        "properties": {
          "id": {
            "type": "integer",
            "description": "Worldfavor id of the expectation",
            "format": "int32"
          },
          "companyId": {
            "type": "integer",
            "description": "Worldfavor id of the company",
            "format": "int32",
            "nullable": true
          },
          "customId": {
            "type": "string",
            "description": "Your own identifier for the company",
            "nullable": true
          },
          "company": {
            "type": "string",
            "description": "Name of the company",
            "nullable": true
          },
          "assessmentTemplateId": {
            "type": "integer",
            "description": "Id of the assessment",
            "format": "int32",
            "nullable": true
          },
          "assessmentTemplate": {
            "type": "string",
            "description": "Name of the assessment",
            "nullable": true
          },
          "startLevel": {
            "type": "integer",
            "description": "The company's level on the assessment when the expectation was created",
            "format": "int32",
            "nullable": true
          },
          "currentLevel": {
            "type": "integer",
            "description": "The company's current level on the assessment. The expectation is completed automatically when it reaches `targetLevel`. Null when there is no level yet.",
            "format": "int32",
            "nullable": true
          },
          "targetLevel": {
            "type": "integer",
            "description": "The level the company is expected to reach",
            "format": "int32",
            "nullable": true
          },
          "levels": {
            "type": "integer",
            "description": "Number of levels on the assessment's scale, for example 5 or 3",
            "format": "int32",
            "nullable": true
          },
          "status": {
            "type": "string",
            "description": "One of `Requested`, `Accepted`, `Declined`, `Delayed` or `Completed`",
            "nullable": true
          },
          "dueAt": {
            "type": "string",
            "description": "The date the target level is due",
            "format": "date",
            "nullable": true
          },
          "completedAt": {
            "type": "string",
            "description": "The date the expectation was completed",
            "format": "date",
            "nullable": true
          },
          "changedAt": {
            "type": "string",
            "description": "When the expectation was created or last changed",
            "format": "date-time",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "Findings": {
        "type": "object",
        "properties": {
          "checked": {
            "type": "boolean",
            "description": "Whether the company has been checked. When false, `findingCount` is 0 because nothing has been checked yet, not because nothing was found."
          },
          "findingCount": {
            "type": "integer",
            "description": "Number of findings in the latest check",
            "format": "int32"
          },
          "checkedAt": {
            "type": "string",
            "description": "When the latest check started. Null when not checked.",
            "format": "date-time",
            "nullable": true
          },
          "benchmark": {
            "allOf": [
              {
                "$ref": "#/components/schemas/FindingsBenchmark"
              }
            ],
            "description": "The median of the values next to it among the company's peers, in the peer group named in the profile's `benchmark`. Null when there is no profile benchmark or too few peers have a value.",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "FindingsBenchmark": {
        "type": "object",
        "properties": {
          "findingCount": {
            "type": "number",
            "description": "The peers' median number of findings",
            "format": "double"
          }
        },
        "additionalProperties": false
      },
      "FindingsSummary": {
        "type": "object",
        "properties": {
          "adverseMedia": {
            "allOf": [
              {
                "$ref": "#/components/schemas/Findings"
              }
            ],
            "nullable": true
          },
          "sanctions": {
            "allOf": [
              {
                "$ref": "#/components/schemas/Findings"
              }
            ],
            "nullable": true
          },
          "pep": {
            "allOf": [
              {
                "$ref": "#/components/schemas/Findings"
              }
            ],
            "nullable": true
          }
        },
        "additionalProperties": false,
        "description": "Counts from Worldfavor's AI screening of public sources for adverse media, sanctions and politically exposed persons (PEP). A finding is a signal to look into and engage the company on, not a verdict. The Profile tab in Worldfavor shows the findings themselves."
      },
      "Industry": {
        "type": "object",
        "properties": {
          "code": {
            "type": "string",
            "description": "NACE code, for example `C25.1`",
            "nullable": true
          },
          "description": {
            "type": "string",
            "description": "NACE description, for example `Manufacture of structural metal products`",
            "nullable": true
          },
          "origin": {
            "type": "string",
            "description": "Where the value comes from: `Self-reported` (the company's own Worldfavor profile, once connected), `Your organization` (entered on your record of the company) or `AI enriched` (found by Worldfavor's AI enrichment from public sources and not confirmed by the company).",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "IndustryRisk": {
        "type": "object",
        "properties": {
          "riskStatus": {
            "type": "string",
            "description": "One of `Low`, `Medium`, `High`, `Extreme`, `Pending`, `No data` or `Not activated`.",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "InherentRisk": {
        "type": "object",
        "properties": {
          "riskStatus": {
            "type": "string",
            "description": "One of `Low`, `Medium`, `High`, `Extreme`, `Pending`, `No data` or `Not activated`. Null on results calculated before inherent risk was stored.",
            "nullable": true
          },
          "countryRisk": {
            "allOf": [
              {
                "$ref": "#/components/schemas/CountryRisk"
              }
            ],
            "nullable": true
          },
          "industryRisk": {
            "allOf": [
              {
                "$ref": "#/components/schemas/IndustryRisk"
              }
            ],
            "nullable": true
          }
        },
        "additionalProperties": false,
        "description": "Where the company operates and in which sector, before any assessment result: a weighted combination of country and industry risk, not the more severe of the two. A risk that is not activated drops out."
      },
      "PaginatedAnswerResult": {
        "type": "object",
        "properties": {
          "pageNumber": {
            "type": "integer",
            "description": "The page returned, starting from 1",
            "format": "int32"
          },
          "pageSize": {
            "type": "integer",
            "description": "The maximum number of items per page",
            "format": "int32"
          },
          "pageCount": {
            "type": "integer",
            "description": "The total number of pages",
            "format": "int32"
          },
          "totalItems": {
            "type": "integer",
            "description": "The total number of items across all pages",
            "format": "int64"
          },
          "items": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Answer"
            },
            "description": "The items on this page",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "PaginatedAssessmentResult": {
        "type": "object",
        "properties": {
          "pageNumber": {
            "type": "integer",
            "description": "The page returned, starting from 1",
            "format": "int32"
          },
          "pageSize": {
            "type": "integer",
            "description": "The maximum number of items per page",
            "format": "int32"
          },
          "pageCount": {
            "type": "integer",
            "description": "The total number of pages",
            "format": "int32"
          },
          "totalItems": {
            "type": "integer",
            "description": "The total number of items across all pages",
            "format": "int64"
          },
          "items": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Assessment"
            },
            "description": "The items on this page",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "PaginatedCategoryResult": {
        "type": "object",
        "properties": {
          "pageNumber": {
            "type": "integer",
            "description": "The page returned, starting from 1",
            "format": "int32"
          },
          "pageSize": {
            "type": "integer",
            "description": "The maximum number of items per page",
            "format": "int32"
          },
          "pageCount": {
            "type": "integer",
            "description": "The total number of pages",
            "format": "int32"
          },
          "totalItems": {
            "type": "integer",
            "description": "The total number of items across all pages",
            "format": "int64"
          },
          "items": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Category"
            },
            "description": "The items on this page",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "PaginatedCompanyChangeResult": {
        "type": "object",
        "properties": {
          "pageNumber": {
            "type": "integer",
            "description": "The page returned, starting from 1",
            "format": "int32"
          },
          "pageSize": {
            "type": "integer",
            "description": "The maximum number of items per page",
            "format": "int32"
          },
          "pageCount": {
            "type": "integer",
            "description": "The total number of pages",
            "format": "int32"
          },
          "totalItems": {
            "type": "integer",
            "description": "The total number of items across all pages",
            "format": "int64"
          },
          "items": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/CompanyChange"
            },
            "description": "The items on this page",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "PaginatedCompanyResult": {
        "type": "object",
        "properties": {
          "pageNumber": {
            "type": "integer",
            "description": "The page returned, starting from 1",
            "format": "int32"
          },
          "pageSize": {
            "type": "integer",
            "description": "The maximum number of items per page",
            "format": "int32"
          },
          "pageCount": {
            "type": "integer",
            "description": "The total number of pages",
            "format": "int32"
          },
          "totalItems": {
            "type": "integer",
            "description": "The total number of items across all pages",
            "format": "int64"
          },
          "items": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Company"
            },
            "description": "The items on this page",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "PaginatedContactResult": {
        "type": "object",
        "properties": {
          "pageNumber": {
            "type": "integer",
            "description": "The page returned, starting from 1",
            "format": "int32"
          },
          "pageSize": {
            "type": "integer",
            "description": "The maximum number of items per page",
            "format": "int32"
          },
          "pageCount": {
            "type": "integer",
            "description": "The total number of pages",
            "format": "int32"
          },
          "totalItems": {
            "type": "integer",
            "description": "The total number of items across all pages",
            "format": "int64"
          },
          "items": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Contact"
            },
            "description": "The items on this page",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "PaginatedExpectationResult": {
        "type": "object",
        "properties": {
          "pageNumber": {
            "type": "integer",
            "description": "The page returned, starting from 1",
            "format": "int32"
          },
          "pageSize": {
            "type": "integer",
            "description": "The maximum number of items per page",
            "format": "int32"
          },
          "pageCount": {
            "type": "integer",
            "description": "The total number of pages",
            "format": "int32"
          },
          "totalItems": {
            "type": "integer",
            "description": "The total number of items across all pages",
            "format": "int64"
          },
          "items": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Expectation"
            },
            "description": "The items on this page",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "PaginatedProductRelationResult": {
        "type": "object",
        "properties": {
          "pageNumber": {
            "type": "integer",
            "description": "The page returned, starting from 1",
            "format": "int32"
          },
          "pageSize": {
            "type": "integer",
            "description": "The maximum number of items per page",
            "format": "int32"
          },
          "pageCount": {
            "type": "integer",
            "description": "The total number of pages",
            "format": "int32"
          },
          "totalItems": {
            "type": "integer",
            "description": "The total number of items across all pages",
            "format": "int64"
          },
          "items": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/ProductRelation"
            },
            "description": "The items on this page",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "PaginatedProductResult": {
        "type": "object",
        "properties": {
          "pageNumber": {
            "type": "integer",
            "description": "The page returned, starting from 1",
            "format": "int32"
          },
          "pageSize": {
            "type": "integer",
            "description": "The maximum number of items per page",
            "format": "int32"
          },
          "pageCount": {
            "type": "integer",
            "description": "The total number of pages",
            "format": "int32"
          },
          "totalItems": {
            "type": "integer",
            "description": "The total number of items across all pages",
            "format": "int64"
          },
          "items": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Product"
            },
            "description": "The items on this page",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "PaginatedRiskResultResult": {
        "type": "object",
        "properties": {
          "pageNumber": {
            "type": "integer",
            "description": "The page returned, starting from 1",
            "format": "int32"
          },
          "pageSize": {
            "type": "integer",
            "description": "The maximum number of items per page",
            "format": "int32"
          },
          "pageCount": {
            "type": "integer",
            "description": "The total number of pages",
            "format": "int32"
          },
          "totalItems": {
            "type": "integer",
            "description": "The total number of items across all pages",
            "format": "int64"
          },
          "items": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/RiskResult"
            },
            "description": "The items on this page",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "Product": {
        "type": "object",
        "properties": {
          "id": {
            "type": "integer",
            "description": "Worldfavor id of the product",
            "format": "int32"
          },
          "name": {
            "type": "string",
            "nullable": true
          },
          "gtin": {
            "type": "string",
            "description": "GTIN of the product",
            "nullable": true
          },
          "productCustomId": {
            "type": "string",
            "description": "Your own identifier for the product",
            "nullable": true
          },
          "productNumber": {
            "type": "string",
            "description": "Product number",
            "nullable": true
          },
          "purchaseOrder": {
            "type": "string",
            "description": "Purchase order number",
            "nullable": true
          },
          "countryCode": {
            "type": "string",
            "description": "Country code of the product, for example `se`",
            "nullable": true
          },
          "productStatus": {
            "type": "string",
            "description": "`Active` or `Inactive`. Null when not set.",
            "nullable": true
          },
          "mappingStatus": {
            "type": "string",
            "description": "`Not mapped`, `Partly mapped` or `Fully mapped`. Null when not set.",
            "nullable": true
          },
          "industry": {
            "type": "string",
            "nullable": true
          },
          "supplier": {
            "allOf": [
              {
                "$ref": "#/components/schemas/Company"
              }
            ],
            "description": "The company that supplies the product",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "ProductRelation": {
        "type": "object",
        "properties": {
          "createdAt": {
            "type": "string",
            "format": "date-time"
          },
          "tier": {
            "type": "integer",
            "format": "int32"
          },
          "product": {
            "allOf": [
              {
                "$ref": "#/components/schemas/Product"
              }
            ],
            "nullable": true
          },
          "productSupplier": {
            "allOf": [
              {
                "$ref": "#/components/schemas/Company"
              }
            ],
            "nullable": true
          },
          "fromActorType": {
            "type": "string",
            "nullable": true
          },
          "fromActorTypeGroup": {
            "type": "string",
            "nullable": true
          },
          "fromSupplier": {
            "allOf": [
              {
                "$ref": "#/components/schemas/Company"
              }
            ],
            "nullable": true
          },
          "toActorType": {
            "type": "string",
            "nullable": true
          },
          "toActorTypeGroup": {
            "type": "string",
            "nullable": true
          },
          "toSupplier": {
            "allOf": [
              {
                "$ref": "#/components/schemas/Company"
              }
            ],
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "ProfileArea": {
        "type": "object",
        "properties": {
          "area": {
            "type": "string",
            "description": "`Environment`, `Social`, `Governance` or `Supply chain`",
            "nullable": true
          },
          "overallRiskStatus": {
            "type": "string",
            "description": "The area's level in the latest risk calculation, or null when it has none. One of `Low`, `Medium`, `High`, `Extreme`, `Pending`, `No data` or `Not activated`.",
            "nullable": true
          },
          "inherentRiskStatus": {
            "type": "string",
            "description": "The most severe topic inherent risk in the area: the risk from where the company operates and its industry, before its assessments are taken into account. Null when no topic in the area has one. One of `Low`, `Medium`, `High`, `Extreme`, `Pending`, `No data` or `Not activated`.",
            "nullable": true
          },
          "baseline": {
            "allOf": [
              {
                "$ref": "#/components/schemas/AssessmentResult"
              }
            ],
            "description": "The result of the Baseline assessment section covering this area, or null when there is none.",
            "nullable": true
          },
          "benchmark": {
            "allOf": [
              {
                "$ref": "#/components/schemas/AreaBenchmark"
              }
            ],
            "description": "The median of the values next to it among the company's peers, in the peer group named in the profile's `benchmark`. Null when there is no profile benchmark or too few peers have a value.",
            "nullable": true
          },
          "topics": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/ProfileTopic"
            },
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "ProfileBenchmark": {
        "type": "object",
        "properties": {
          "peerGroup": {
            "type": "string",
            "description": "The peer group used: `Industry`, `Region`, `Revenue range` or `Network`. It can differ from the one you asked for when the company has no value for that group.",
            "nullable": true
          },
          "peerCount": {
            "type": "integer",
            "description": "Number of companies in the peer group with results",
            "format": "int32"
          },
          "percentile": {
            "type": "integer",
            "description": "Where the company ranks among its peers, from 1 to 100: the share of peers with the same or a lower disclosure score. Null when the company has no score in the benchmark period.",
            "format": "int32",
            "nullable": true
          },
          "disclosureScore": {
            "type": "integer",
            "description": "The peers' median overall disclosure score, 0 to 100",
            "format": "int32",
            "nullable": true
          },
          "baselineLevel": {
            "type": "number",
            "description": "The peers' median Baseline level, on the scale of `baseline.levels`",
            "format": "double",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "ProfileRisk": {
        "type": "object",
        "properties": {
          "overallRiskStatus": {
            "type": "string",
            "description": "The company's level: the most severe topic level, raised further if a flagged answer is more severe. One of `Low`, `Medium`, `High`, `Extreme`, `Pending`, `No data` or `Not activated`.",
            "nullable": true
          },
          "inherentRiskStatus": {
            "type": "string",
            "description": "The most severe topic inherent risk: the risk from where the company operates and its industry, before its assessments are taken into account. Null when it has no topic calculated since inherent risk was stored. One of `Low`, `Medium`, `High`, `Extreme`, `Pending`, `No data` or `Not activated`.",
            "nullable": true
          },
          "answerFlagRiskStatus": {
            "type": "string",
            "description": "The level from flagged answers in the company's assessments, when any are flagged. One of `Low`, `Medium`, `High`, `Extreme`, `Pending`, `No data` or `Not activated`.",
            "nullable": true
          },
          "calculatedAt": {
            "type": "string",
            "description": "When the risk was calculated. The same as `calculatedAt` in `/riskResults`.",
            "format": "date-time"
          }
        },
        "additionalProperties": false
      },
      "ProfileTopic": {
        "type": "object",
        "properties": {
          "topicId": {
            "type": "integer",
            "description": "Stable identifier of the sustainability topic, the same as in `/riskResults`",
            "format": "int32"
          },
          "topic": {
            "type": "string",
            "description": "Name of the sustainability topic. The name can change; use `topicId` to match.",
            "nullable": true
          },
          "overallRiskStatus": {
            "type": "string",
            "description": "The topic's level in the latest risk calculation, or null when it has none. The calculation can use a Baseline section when the topic has no assessment of its own; `/riskResults` says which. One of `Low`, `Medium`, `High`, `Extreme`, `Pending`, `No data` or `Not activated`.",
            "nullable": true
          },
          "inherentRiskStatus": {
            "type": "string",
            "description": "The topic's inherent risk in the latest risk calculation: the risk from where the company operates and its industry, before its assessments are taken into account. Null when it has none. `/riskResults` has the country and industry breakdown. One of `Low`, `Medium`, `High`, `Extreme`, `Pending`, `No data` or `Not activated`.",
            "nullable": true
          },
          "assessmentResult": {
            "allOf": [
              {
                "$ref": "#/components/schemas/AssessmentResult"
              }
            ],
            "description": "The result of the topic's own assessment, or null when the company has none with a level.",
            "nullable": true
          },
          "disclosureScore": {
            "allOf": [
              {
                "$ref": "#/components/schemas/DisclosureScore"
              }
            ],
            "description": "Null when the company has no assessment for the topic.",
            "nullable": true
          },
          "benchmark": {
            "allOf": [
              {
                "$ref": "#/components/schemas/TopicBenchmark"
              }
            ],
            "description": "The median of the values next to it among the company's peers, in the peer group named in the profile's `benchmark`. Null when there is no profile benchmark or too few peers have a value.",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "RevenueRange": {
        "type": "object",
        "properties": {
          "range": {
            "type": "string",
            "description": "One of `Micro` (under €20M), `Small` (€20M–€50M), `Medium` (€50M–€250M), `Large` (€250M–€1B) or `Giant` (€1B and over)",
            "nullable": true
          },
          "origin": {
            "type": "string",
            "description": "Where the value comes from: `Self-reported` (the company's own Worldfavor profile, once connected), `Your organization` (entered on your record of the company) or `AI enriched` (found by Worldfavor's AI enrichment from public sources and not confirmed by the company).",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "RiskResult": {
        "type": "object",
        "properties": {
          "companyId": {
            "type": "integer",
            "description": "Worldfavor id of the company",
            "format": "int32"
          },
          "customId": {
            "type": "string",
            "description": "Your own identifier for the company",
            "nullable": true
          },
          "overallRiskStatus": {
            "type": "string",
            "description": "The company's level: the most severe topic level, raised further if a flagged answer is more severe. One of `Low`, `Medium`, `High`, `Extreme`, `Pending`, `No data` or `Not activated`.",
            "nullable": true
          },
          "inherentRiskStatus": {
            "type": "string",
            "description": "The most severe topic inherent risk: the risk from where the company operates and its industry, before its assessments are taken into account. Null when it has no topic calculated since inherent risk was stored. One of `Low`, `Medium`, `High`, `Extreme`, `Pending`, `No data` or `Not activated`.",
            "nullable": true
          },
          "answerFlagRiskStatus": {
            "type": "string",
            "description": "The level from flagged answers in the company's assessments, when any are flagged. Shows whether a high company level comes from where the company operates or from an answer. One of `Low`, `Medium`, `High`, `Extreme`, `Pending`, `No data` or `Not activated`.",
            "nullable": true
          },
          "calculatedAt": {
            "type": "string",
            "description": "When this result was calculated",
            "format": "date-time"
          },
          "areas": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/RiskResultArea"
            },
            "nullable": true
          }
        },
        "additionalProperties": false,
        "description": "The latest risk result for one company. A high or extreme level is a reason to engage the supplier, not a basis for automatic rejection."
      },
      "RiskResultArea": {
        "type": "object",
        "properties": {
          "area": {
            "type": "string",
            "description": "One of `Environment`, `Social`, `Governance` or `Supply chain`",
            "nullable": true
          },
          "overallRiskStatus": {
            "type": "string",
            "description": "The most severe topic level in the area. One of `Low`, `Medium`, `High`, `Extreme`, `Pending`, `No data` or `Not activated`.",
            "nullable": true
          },
          "inherentRiskStatus": {
            "type": "string",
            "description": "The most severe topic inherent risk in the area: the risk from where the company operates and its industry, before its assessments are taken into account. Null when no topic in the area has one. One of `Low`, `Medium`, `High`, `Extreme`, `Pending`, `No data` or `Not activated`.",
            "nullable": true
          },
          "topics": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/RiskResultTopic"
            },
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "RiskResultTopic": {
        "type": "object",
        "properties": {
          "topicId": {
            "type": "integer",
            "description": "Stable id of the topic. Use it rather than the name, which can be renamed.",
            "format": "int32"
          },
          "topic": {
            "type": "string",
            "description": "Name of the topic, as configured in Worldfavor",
            "nullable": true
          },
          "overallRiskStatus": {
            "type": "string",
            "description": "The inherent risk adjusted by the assessment result: strong performance lowers it, weak performance raises it. One of `Low`, `Medium`, `High`, `Extreme`, `Pending`, `No data` or `Not activated`.",
            "nullable": true
          },
          "inherentRisk": {
            "allOf": [
              {
                "$ref": "#/components/schemas/InherentRisk"
              }
            ],
            "description": "Where the company operates and in which sector, before any assessment result: a weighted combination of country and industry risk, not the more severe of the two. A risk that is not activated drops out.",
            "nullable": true
          },
          "assessmentResult": {
            "allOf": [
              {
                "$ref": "#/components/schemas/AssessmentResult"
              }
            ],
            "description": "The assessment result that adjusts the inherent risk. Null when no result applies yet, or when a result had too little data to be reliable; the topic level is then the inherent level.",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "Tag": {
        "type": "object",
        "properties": {
          "id": {
            "type": "integer",
            "format": "int32"
          },
          "name": {
            "type": "string",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "TopicBenchmark": {
        "type": "object",
        "properties": {
          "disclosureScore": {
            "allOf": [
              {
                "$ref": "#/components/schemas/DisclosureScore"
              }
            ],
            "description": "The peers' median disclosure scores for the topic",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "UpdateProduct": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string",
            "description": "Name of the product",
            "nullable": true
          },
          "gtin": {
            "type": "string",
            "description": "GTIN of the product",
            "nullable": true
          },
          "productCustomId": {
            "type": "string",
            "description": "Your own identifier for the product",
            "nullable": true
          },
          "productNumber": {
            "type": "string",
            "description": "Product number",
            "nullable": true
          },
          "purchaseOrder": {
            "type": "string",
            "description": "Purchase order number",
            "nullable": true
          },
          "countryCode": {
            "type": "string",
            "description": "Country code of the product in ISO 3166-1 alpha-2 format, for example `se`",
            "nullable": true
          },
          "productStatus": {
            "type": "string",
            "description": "`Active` or `Inactive`",
            "nullable": true
          },
          "mappingStatus": {
            "type": "string",
            "description": "`Not mapped`, `Partly mapped` or `Fully mapped`",
            "nullable": true
          },
          "companyId": {
            "type": "integer",
            "description": "Worldfavor id of the company that supplies the product. Send this or `companyCustomId`.",
            "format": "int32",
            "nullable": true
          },
          "companyCustomId": {
            "type": "string",
            "description": "Your own identifier for the company that supplies the product. Send this or `companyId`.",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "UpsertCompany": {
        "required": [
          "countryCode",
          "name"
        ],
        "type": "object",
        "properties": {
          "name": {
            "type": "string",
            "description": "Name of the company, with the same rules as for `POST /companies`",
            "nullable": true
          },
          "countryCode": {
            "type": "string",
            "description": "Country code of the company in ISO 3166-1 alpha-2 format, for example `se`. Uppercase is accepted.",
            "nullable": true
          },
          "customId": {
            "type": "string",
            "description": "Optional. Taken from the path. When sent, it must be the same value.",
            "nullable": true
          },
          "website": {
            "type": "string",
            "description": "Website of the company. AI enrichment and screening use it, so it improves their results.",
            "nullable": true
          },
          "registrationNumber": {
            "type": "string",
            "description": "Company registration number",
            "nullable": true
          },
          "dunsNumber": {
            "type": "string",
            "description": "DUNS number",
            "nullable": true
          },
          "vatNumber": {
            "type": "string",
            "description": "VAT number",
            "nullable": true
          },
          "categories": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/CompanyCategory"
            },
            "description": "Your own categories and tags for the company, matched as for `POST /companies`. Replaces the company's tags only within the categories you send.",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "ValidationErrorItem": {
        "type": "object",
        "properties": {
          "field": {
            "type": "string",
            "description": "The field, as a path such as `categories[0].tags[1]`",
            "nullable": true
          },
          "message": {
            "type": "string",
            "description": "What is wrong with it",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "ValidationErrors": {
        "type": "object",
        "properties": {
          "message": {
            "type": "string",
            "nullable": true,
            "readOnly": true
          },
          "errors": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/ValidationErrorItem"
            },
            "description": "Each problem, with the field it concerns",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "Verification": {
        "type": "object",
        "properties": {
          "externalStatus": {
            "type": "string",
            "description": "The status shared with the company: `Approved` or `Correction needed`",
            "nullable": true
          },
          "externalComment": {
            "type": "string",
            "description": "The comment shared with the company",
            "nullable": true
          },
          "internalStatus": {
            "type": "string",
            "description": "The status kept within your organization: `Approved` or `Not approved`",
            "nullable": true
          },
          "internalComment": {
            "type": "string",
            "description": "The comment kept within your organization",
            "nullable": true
          }
        },
        "additionalProperties": false
      }
    },
    "securitySchemes": {
      "OAuth2": {
        "type": "oauth2",
        "flows": {
          "clientCredentials": {
            "tokenUrl": "https://dev.auth.worldfavor.com/oauth/token",
            "scopes": { }
          }
        }
      }
    }
  },
  "security": [
    {
      "OAuth2": [ ]
    }
  ],
  "tags": [
    {
      "name": "Companies",
      "description": "The companies in your Worldfavor solution."
    },
    {
      "name": "Company profiles",
      "description": "Each company's sustainability profile, and which companies have new results."
    },
    {
      "name": "Contacts",
      "description": "The contacts in your Worldfavor solution."
    },
    {
      "name": "Categories",
      "description": "The categories and tags you can set on companies."
    },
    {
      "name": "Assessments",
      "description": "Assessment results in your Worldfavor solution."
    },
    {
      "name": "Risk results",
      "description": "The latest risk result for each company."
    },
    {
      "name": "Expectations",
      "description": "Improvement expectations set for your suppliers."
    },
    {
      "name": "Reported answers",
      "description": "Answers reported in your Worldfavor solution."
    },
    {
      "name": "Products",
      "description": "Products and product relations. You can also create, update and delete products."
    }
  ]
}