{
  "openapi": "3.0.1",
  "info": {
    "title": "Worldfavor External API",
    "description": "The Worldfavor API lets your own systems work with the data in your Worldfavor account. Keep your companies in sync, fetch their risk levels, profiles and assessment results, read the answers they have reported, and manage products. Your integration can use as much or as little of it as it needs.\n\nYou don't need a connector. Any integration platform, ERP, procurement system or BI tool that can call an HTTP API can use it directly.\n\n## At a glance\n| | |\n| --- | --- |\n| Format | REST over HTTPS, JSON |\n| Authentication | OAuth 2.0 client credentials, tokens valid for 24 hours |\n| Pages | Up to 1000 items per request |\n| Rate limit | 1000 requests per minute per access token |\n\n## Get access\nAsk your customer success manager to enable API access. You'll get a client ID and a client secret, which give access to your account's data only.\n\nKeep the secret in your integration's server-side configuration, never in code that runs in a browser or an app. If you think it has been exposed, contact us and we'll rotate it.\n\n## Quickstart\n**1. Get a token.**\n```bash\ncurl --request POST 'https://dev.auth.worldfavor.com/oauth/token' \\\n  --header 'Content-Type: application/json' \\\n  --data '{\n    \"grant_type\": \"client_credentials\",\n    \"client_id\": \"YOUR_CLIENT_ID\",\n    \"client_secret\": \"YOUR_CLIENT_SECRET\",\n    \"audience\": \"https://dev.worldfavor.com\"\n  }'\n```\nThe response contains an `access_token` that is valid for 24 hours. Reuse it until it expires.\n\n**2. Call the API.** Replace `BASE_URL` with the address in the **Base URL** box.\n```bash\ncurl 'BASE_URL/companies?pageSize=10' \\\n  --header 'Authorization: Bearer YOUR_ACCESS_TOKEN'\n```\n\n## Concepts\n- **Identifiers.** Most records have a Worldfavor `id`, and data that belongs to a company includes its `companyId`. You can give a company your own identifier too, `customId`, such as its id in your ERP. Endpoints with `by-custom-id` in the path match it exactly. URL-encode it when you put it in a path.\n- **Origin.** Some data can come from Worldfavor's AI screening of public sources rather than from the company itself. Fields named `origin` tell you which: `AI screened` values are not confirmed by the company, and `Self-reported` values come from the company.\n\n## Data format\nField names are camelCase. Timestamps are in UTC, `yyyy-MM-ddTHH:mm:ssZ`. Country codes are lowercase ISO 3166-1 alpha-2, such as `se`. New fields can be added to responses, so ignore fields you don't recognize.\n\n## Pagination\nList endpoints take two paging parameters:\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 |\n\nEach response is one page in this format:\n```json\n{\n    \"pageNumber\": 1,\n    \"pageSize\": 100,\n    \"pageCount\": 3,\n    \"totalItems\": 214,\n    \"items\": [ ]\n}\n```\n\n## Date filters\nA date filter takes a date or a timestamp. A date, such as `2026-09-01`, covers the whole day in UTC. A timestamp needs a time zone, such as `2026-09-01T03:00:00Z` or `2026-09-01T05:00:00+02:00`; encode the `+` as `%2B`. Any other format returns `400`.\n\nPut a prefix in front of the value to choose how it's compared:\n\n| Prefix | Meaning |\n| --- | --- |\n| `eq` | Equal to (the default) |\n| `gt` | Greater than |\n| `ge` | Greater than or equal to |\n| `lt` | Less than |\n| `le` | Less than or equal to |\n\nTo get only what changed since your previous call, pass the latest date you have read with `gt`, for example `/riskResults?calculatedAt=gt2026-09-01T03:00:00Z`.\n\n## Status codes\nThe API uses standard HTTP status codes.\n\n| Status | Meaning |\n| --- | --- |\n| `200` `201` `204` | Succeeded, created, deleted |\n| `400` | A query parameter is missing or not valid |\n| `401` | The access token is missing, invalid or expired |\n| `403` | The feature is not enabled for your account |\n| `404` | Not found in your account |\n| `409` | Conflicts with existing data, such as a customId shared by several companies |\n| `422` | The request body is not valid. Nothing was saved, and `errors` lists each problem. |\n| `429` | Rate limit exceeded. Wait and try again. |\n| `500` | An unexpected error, logged on our side |\n\n## Try it from this page\nEnter your client ID and secret in the **Authentication** box and click **Authorize**. Then open any endpoint and click **Test Request**. The page keeps your credentials only until you close or reload it, and sends the secret only to the token endpoint.",
    "version": "v1"
  },
  "servers": [
    {
      "url": "https://developers.worldfavor.com/api/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 and starts its due diligence process in Worldfavor, as set up for your account. That can include AI screening, AI enrichment of company data and a first 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 account.",
        "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, its name, country, industry and revenue range are maintained there, and an update doesn't change its name or country.\n\nCreating a company starts its due diligence process in Worldfavor, as set up for your account. That can include AI screening, AI enrichment of company data and a first risk calculation. 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.",
        "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.",
        "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 account.",
        "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 account.",
        "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": "`AI screened` for an answer from AI screening of the company's public sources, `Self-reported` for an answer the company submitted",
            "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": "`AI screened` when the answers behind the result come from AI screening of the company's public sources, `Self-reported` when the company submitted them",
            "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": "`AI screened` when the answers behind the result come from AI screening of the company's public sources, `Self-reported` when the company submitted them",
            "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
          },
          "profileUrl": {
            "type": "string",
            "description": "A link to the company's profile in Worldfavor",
            "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"
      },
      "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`.",
            "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"
          }
        },
        "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"
          }
        },
        "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"
          }
        },
        "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"
          }
        },
        "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"
          }
        },
        "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"
          }
        },
        "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"
          }
        },
        "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"
          }
        },
        "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"
          }
        },
        "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"
          }
        },
        "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. 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. 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 the topic has no risk result. `/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. 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 company, 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. 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 account."
    },
    {
      "name": "Company profiles",
      "description": "Each company's sustainability profile, and which companies have new results."
    },
    {
      "name": "Contacts",
      "description": "The contacts at your companies."
    },
    {
      "name": "Categories",
      "description": "The categories and tags you can set on companies."
    },
    {
      "name": "Assessments",
      "description": "Assessment results for your companies."
    },
    {
      "name": "Risk results",
      "description": "The latest risk result for each company."
    },
    {
      "name": "Expectations",
      "description": "Improvement expectations set for your companies."
    },
    {
      "name": "Reported answers",
      "description": "Answers your companies have reported."
    },
    {
      "name": "Products",
      "description": "Products and product relations. You can also create, update and delete products."
    }
  ]
}