{
  "openapi": "3.1.0",
  "info": {
    "title": "Subsido API",
    "version": "1.0.0",
    "contact": {
      "email": "hello@subsido.be",
      "url": "https://subsido.be"
    },
    "description": "Belgian and EU support measures for businesses and citizens (grants, premiums, loans, guarantees, tax measures), normalised: one record shape across every source, with provenance and a licence mode for every field, versions and a change feed, and a matcher that says why a measure fits a company or a household and what it still needs to know.\n\nAuthenticate with `Authorization: Bearer sb_live_...` (or `X-API-Key`). Every response carries the request id; errors have a stable `code`, including a method a path does not take (`method_not_allowed`, 405) and a request that takes longer than 30 seconds (`timeout`, 504). Times are RFC 3339 in Brussels time.\n\nIndependent service. Not affiliated with, endorsed by, or operated by any government or public authority. Eligibility and awards are decided by the competent authority."
  },
  "servers": [
    {
      "url": "https://api.subsido.be"
    }
  ],
  "security": [
    {
      "bearer": []
    },
    {
      "apiKey": []
    }
  ],
  "tags": [
    {
      "name": "Subsidies"
    },
    {
      "name": "Matching"
    },
    {
      "name": "Changes"
    },
    {
      "name": "History"
    },
    {
      "name": "Watchlists"
    },
    {
      "name": "Webhooks"
    },
    {
      "name": "Sources"
    },
    {
      "name": "Export"
    },
    {
      "name": "MCP"
    },
    {
      "name": "Service"
    }
  ],
  "paths": {
    "/v1/health": {
      "get": {
        "tags": [
          "Service"
        ],
        "summary": "Health",
        "description": "Database, sources not fresh, and what sign-in the site offers.",
        "parameters": [],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          }
        },
        "security": []
      }
    },
    "/v1/plans": {
      "get": {
        "tags": [
          "Service"
        ],
        "summary": "Plans and prices",
        "description": "The entitlement table the API enforces, with list prices in euros.",
        "parameters": [],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "data": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/PlanOffer"
                      }
                    }
                  }
                }
              }
            }
          }
        },
        "security": []
      }
    },
    "/v1/taxonomy": {
      "get": {
        "tags": [
          "Service"
        ],
        "summary": "Vocabularies",
        "description": "Every closed vocabulary with labels in Dutch, French and English: topics, regions, provinces, instrument types, statuses, sizes, applicant types, cost types, rule fields (with the question asked when one is unknown), operators and event types.",
        "parameters": [],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "400": {
            "description": "invalid_parameter",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "invalid_parameter": {
                    "value": {
                      "error": {
                        "code": "invalid_parameter",
                        "message": "Invalid value for region (\"bavaria\" is not one of flanders, brussels, wallonia).",
                        "request_id": "req_01hxyz",
                        "details": {}
                      }
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "rate_limit_exceeded",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "rate_limit_exceeded": {
                    "value": {
                      "error": {
                        "code": "rate_limit_exceeded",
                        "message": "Too many requests. Slow down and retry after the interval in Retry-After.",
                        "request_id": "req_01hxyz",
                        "details": {}
                      }
                    }
                  }
                }
              }
            }
          }
        },
        "security": []
      }
    },
    "/v1/coverage": {
      "get": {
        "tags": [
          "Service"
        ],
        "summary": "Coverage",
        "description": "How many measures, by status, source, instrument, level, region and topic.",
        "parameters": [],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "400": {
            "description": "invalid_parameter",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "invalid_parameter": {
                    "value": {
                      "error": {
                        "code": "invalid_parameter",
                        "message": "Invalid value for region (\"bavaria\" is not one of flanders, brussels, wallonia).",
                        "request_id": "req_01hxyz",
                        "details": {}
                      }
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "rate_limit_exceeded",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "rate_limit_exceeded": {
                    "value": {
                      "error": {
                        "code": "rate_limit_exceeded",
                        "message": "Too many requests. Slow down and retry after the interval in Retry-After.",
                        "request_id": "req_01hxyz",
                        "details": {}
                      }
                    }
                  }
                }
              }
            }
          }
        },
        "security": []
      }
    },
    "/v1/sources": {
      "get": {
        "tags": [
          "Sources"
        ],
        "summary": "Sources",
        "description": "Every source the API serves measures from, its licence and reuse mode, and how fresh it is. A source that is switched off is not listed.",
        "parameters": [],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "data": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/Source"
                      }
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "invalid_parameter",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "invalid_parameter": {
                    "value": {
                      "error": {
                        "code": "invalid_parameter",
                        "message": "Invalid value for region (\"bavaria\" is not one of flanders, brussels, wallonia).",
                        "request_id": "req_01hxyz",
                        "details": {}
                      }
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "rate_limit_exceeded",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "rate_limit_exceeded": {
                    "value": {
                      "error": {
                        "code": "rate_limit_exceeded",
                        "message": "Too many requests. Slow down and retry after the interval in Retry-After.",
                        "request_id": "req_01hxyz",
                        "details": {}
                      }
                    }
                  }
                }
              }
            }
          }
        },
        "security": []
      }
    },
    "/v1/sources/{id}": {
      "get": {
        "tags": [
          "Sources"
        ],
        "summary": "One source",
        "description": "A source with its recent runs.",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "schema": {
              "type": "string"
            },
            "description": "A source id.",
            "required": true
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data",
                    "meta"
                  ],
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/Source"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/Meta"
                    }
                  }
                }
              }
            }
          },
          "404": {
            "description": "source_not_found",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "source_not_found": {
                    "value": {
                      "error": {
                        "code": "source_not_found",
                        "message": "No source has the id \"nope\". GET /v1/sources lists them.",
                        "request_id": "req_01hxyz",
                        "details": {}
                      }
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "invalid_parameter",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "invalid_parameter": {
                    "value": {
                      "error": {
                        "code": "invalid_parameter",
                        "message": "Invalid value for region (\"bavaria\" is not one of flanders, brussels, wallonia).",
                        "request_id": "req_01hxyz",
                        "details": {}
                      }
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "rate_limit_exceeded",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "rate_limit_exceeded": {
                    "value": {
                      "error": {
                        "code": "rate_limit_exceeded",
                        "message": "Too many requests. Slow down and retry after the interval in Retry-After.",
                        "request_id": "req_01hxyz",
                        "details": {}
                      }
                    }
                  }
                }
              }
            }
          }
        },
        "security": []
      }
    },
    "/v1/key": {
      "get": {
        "tags": [
          "Service"
        ],
        "summary": "The calling key",
        "description": "The key's plan, what it allows, and this month's requests and match evaluations, in the `{data, meta}` envelope. The right first request.",
        "parameters": [],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data",
                    "meta"
                  ],
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/KeyInfo"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/Meta"
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "unauthorized",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "unauthorized": {
                    "value": {
                      "error": {
                        "code": "unauthorized",
                        "message": "The API key (or session) is missing, malformed or has been revoked.",
                        "request_id": "req_01hxyz",
                        "details": {}
                      }
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "rate_limit_exceeded, quota_exceeded",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "rate_limit_exceeded": {
                    "value": {
                      "error": {
                        "code": "rate_limit_exceeded",
                        "message": "Too many requests. Slow down and retry after the interval in Retry-After.",
                        "request_id": "req_01hxyz",
                        "details": {}
                      }
                    }
                  },
                  "quota_exceeded": {
                    "value": {
                      "error": {
                        "code": "quota_exceeded",
                        "message": "This month's request quota has been used.",
                        "request_id": "req_01hxyz",
                        "details": {}
                      }
                    }
                  }
                }
              }
            }
          },
          "500": {
            "description": "internal_error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "internal_error": {
                    "value": {
                      "error": {
                        "code": "internal_error",
                        "message": "Something went wrong on our side.",
                        "request_id": "req_01hxyz",
                        "details": {}
                      }
                    }
                  }
                }
              }
            }
          },
          "504": {
            "description": "timeout",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "timeout": {
                    "value": {
                      "error": {
                        "code": "timeout",
                        "message": "The request took too long and was stopped. Retry it; a narrower filter or a smaller page is quicker.",
                        "request_id": "req_01hxyz",
                        "details": {}
                      }
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/v1/subsidies": {
      "get": {
        "tags": [
          "Subsidies"
        ],
        "summary": "List and search measures",
        "description": "Filter, search and page through every servable measure. Cursor paging; every list is ordered and complete.",
        "parameters": [
          {
            "name": "q",
            "in": "query",
            "schema": {
              "type": "string"
            },
            "description": "Words in any language; each must match the start of a word (prefix search, accents ignored)."
          },
          {
            "name": "region",
            "in": "query",
            "schema": {
              "type": "string",
              "description": "comma list of: flanders, brussels, wallonia"
            },
            "description": "Measures available to a company in these regions: the region's own plus national and EU measures, which apply everywhere."
          },
          {
            "name": "topic",
            "in": "query",
            "schema": {
              "type": "string",
              "description": "comma list of: digitalisation, cybersecurity, artificial_intelligence, innovation, research_development, energy_efficiency, renewable_energy, energy, climate_environment, circular_economy, sustainable_mobility, investment, training, advice_consultancy, internationalisation, hiring_employment, starting_business, growth_scaleup, financing, transformation, agriculture, fisheries, tourism_hospitality, culture_creative, construction_renovation, health_life_sciences, social_economy, retail_commerce, water, manufacturing, intellectual_property, inclusion_diversity, cooperation, space_defence, crisis_support, housing, family_care, education"
            },
            "description": "Measures tagged with any of these topics."
          },
          {
            "name": "company_size",
            "in": "query",
            "schema": {
              "type": "string",
              "enum": [
                "micro",
                "small",
                "medium",
                "large"
              ]
            },
            "description": "The company's size: measures naming it, and those that do not restrict size."
          },
          {
            "name": "instrument_type",
            "in": "query",
            "schema": {
              "type": "string",
              "description": "comma list of: grant, rebate, voucher, tax_credit, tax_deduction, tax_exemption, social_security_reduction, wage_subsidy, loan, guarantee, repayable_advance, equity, in_kind, prize, other"
            },
            "description": ""
          },
          {
            "name": "status",
            "in": "query",
            "schema": {
              "type": "string",
              "description": "comma list of: forthcoming, open, continuous, paused, budget_exhausted, closed, unknown"
            },
            "description": "Default: every status. `open,continuous,forthcoming` is what can be applied for."
          },
          {
            "name": "government_level",
            "in": "query",
            "schema": {
              "type": "string",
              "description": "comma list of: eu, federal, community, region, province, municipality, agency, other"
            },
            "description": ""
          },
          {
            "name": "scope",
            "in": "query",
            "schema": {
              "type": "string",
              "description": "comma list of: eu, national, regional, provincial, local"
            },
            "description": ""
          },
          {
            "name": "source",
            "in": "query",
            "schema": {
              "type": "string"
            },
            "description": "Comma list of source ids (GET /v1/sources)."
          },
          {
            "name": "issuer",
            "in": "query",
            "schema": {
              "type": "string"
            },
            "description": "Comma list of issuer ids (`vlaio`, `european-commission`, ...)."
          },
          {
            "name": "nace",
            "in": "query",
            "schema": {
              "type": "string"
            },
            "description": "A company's NACE code (62.010): measures with no sector restriction, or one covering it."
          },
          {
            "name": "programme",
            "in": "query",
            "schema": {
              "type": "string"
            },
            "description": "EU programme code: HORIZON, DIGITAL, LIFE, SMP, ..."
          },
          {
            "name": "deadline_before",
            "in": "query",
            "schema": {
              "type": "string"
            },
            "description": "RFC 3339, or YYYY-MM-DD meaning the end of that Brussels day."
          },
          {
            "name": "deadline_after",
            "in": "query",
            "schema": {
              "type": "string"
            },
            "description": ""
          },
          {
            "name": "updated_since",
            "in": "query",
            "schema": {
              "type": "string"
            },
            "description": "Changed on or after this instant."
          },
          {
            "name": "include_withdrawn",
            "in": "query",
            "schema": {
              "type": "boolean"
            },
            "description": "Include measures the source no longer lists."
          },
          {
            "name": "sort",
            "in": "query",
            "schema": {
              "type": "string",
              "enum": [
                "relevance",
                "deadline",
                "updated",
                "title"
              ]
            },
            "description": "Default: relevance with `q`, deadline (soonest first, none last) without."
          },
          {
            "name": "view",
            "in": "query",
            "schema": {
              "type": "string",
              "enum": [
                "compact",
                "full"
              ]
            },
            "description": "Default compact."
          },
          {
            "name": "lang",
            "in": "query",
            "schema": {
              "type": "string",
              "enum": [
                "nl",
                "fr",
                "en"
              ]
            },
            "description": "Language of `title`, `summary` and links. Default en."
          },
          {
            "name": "limit",
            "in": "query",
            "schema": {
              "type": "integer",
              "minimum": 1
            },
            "description": "Page size, up to the plan's maximum (Developer 100, Pro and Business 200, Enterprise 500). Above it is an error, never a silent truncation."
          },
          {
            "name": "cursor",
            "in": "query",
            "schema": {
              "type": "string"
            },
            "description": "From `pagination.next_cursor`. Opaque."
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data",
                    "pagination",
                    "meta"
                  ],
                  "properties": {
                    "data": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/SubsidyCompact"
                      }
                    },
                    "pagination": {
                      "$ref": "#/components/schemas/Pagination"
                    },
                    "meta": {
                      "allOf": [
                        {
                          "$ref": "#/components/schemas/Meta"
                        },
                        {
                          "type": "object",
                          "required": [
                            "attribution",
                            "disclaimer",
                            "total"
                          ],
                          "properties": {
                            "attribution": {
                              "type": "array",
                              "items": {
                                "type": "string"
                              },
                              "description": "The attribution lines the rows on this page require."
                            },
                            "disclaimer": {
                              "type": "string"
                            },
                            "total": {
                              "type": "integer",
                              "description": "How many measures match the filters in all, counted up to 10,000."
                            }
                          }
                        }
                      ]
                    }
                  }
                },
                "example": {
                  "data": [
                    {
                      "id": "eu:HORIZON-EIC-2026-ACCELERATOR-01",
                      "slug": "eic-accelerator-2026-short-proposal",
                      "title": "EIC Accelerator 2026 - Short proposal",
                      "status": "open",
                      "instrument_type": "grant"
                    }
                  ],
                  "pagination": {
                    "has_more": true,
                    "next_cursor": "eyJzIjoi...",
                    "limit": 20
                  },
                  "meta": {
                    "request_id": "req_01hxyz",
                    "warnings": [],
                    "attribution": [],
                    "disclaimer": "Independent service. Not affiliated with, endorsed by, or operated by any government or public authority. Eligibility and awards are decided by the competent authority.",
                    "total": 1
                  }
                }
              }
            }
          },
          "400": {
            "description": "invalid_parameter, invalid_cursor",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "invalid_parameter": {
                    "value": {
                      "error": {
                        "code": "invalid_parameter",
                        "message": "Invalid value for region (\"bavaria\" is not one of flanders, brussels, wallonia).",
                        "request_id": "req_01hxyz",
                        "details": {}
                      }
                    }
                  },
                  "invalid_cursor": {
                    "value": {
                      "error": {
                        "code": "invalid_cursor",
                        "message": "The cursor is not valid for this request. Start again without one rather than assuming page 1.",
                        "request_id": "req_01hxyz",
                        "details": {}
                      }
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "unauthorized",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "unauthorized": {
                    "value": {
                      "error": {
                        "code": "unauthorized",
                        "message": "The API key (or session) is missing, malformed or has been revoked.",
                        "request_id": "req_01hxyz",
                        "details": {}
                      }
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "rate_limit_exceeded, quota_exceeded",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "rate_limit_exceeded": {
                    "value": {
                      "error": {
                        "code": "rate_limit_exceeded",
                        "message": "Too many requests. Slow down and retry after the interval in Retry-After.",
                        "request_id": "req_01hxyz",
                        "details": {}
                      }
                    }
                  },
                  "quota_exceeded": {
                    "value": {
                      "error": {
                        "code": "quota_exceeded",
                        "message": "This month's request quota has been used.",
                        "request_id": "req_01hxyz",
                        "details": {}
                      }
                    }
                  }
                }
              }
            }
          },
          "500": {
            "description": "internal_error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "internal_error": {
                    "value": {
                      "error": {
                        "code": "internal_error",
                        "message": "Something went wrong on our side.",
                        "request_id": "req_01hxyz",
                        "details": {}
                      }
                    }
                  }
                }
              }
            }
          },
          "504": {
            "description": "timeout",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "timeout": {
                    "value": {
                      "error": {
                        "code": "timeout",
                        "message": "The request took too long and was stopped. Retry it; a narrower filter or a smaller page is quicker.",
                        "request_id": "req_01hxyz",
                        "details": {}
                      }
                    }
                  }
                }
              }
            }
          }
        },
        "operationId": "listSubsidies"
      }
    },
    "/v1/subsidies/{id}": {
      "get": {
        "tags": [
          "Subsidies"
        ],
        "summary": "One measure",
        "description": "The full record. `as_of` (Pro and above) returns the version that was current at that instant.",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "schema": {
              "type": "string"
            },
            "description": "The measure's id (`vlaio:kmo-portefeuille`, `eu:HORIZON-EIC-2026-ACCELERATOR-01`) or slug.",
            "required": true
          },
          {
            "name": "lang",
            "in": "query",
            "schema": {
              "type": "string",
              "enum": [
                "nl",
                "fr",
                "en"
              ]
            },
            "description": "Language of `title`, `summary` and links. Default en."
          },
          {
            "name": "as_of",
            "in": "query",
            "schema": {
              "type": "string"
            },
            "description": "RFC 3339, or YYYY-MM-DD meaning the end of that Brussels day. Pro and above."
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data",
                    "meta"
                  ],
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/SubsidyFull"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/Meta"
                    }
                  }
                }
              }
            }
          },
          "404": {
            "description": "subsidy_not_found, version_not_found",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "subsidy_not_found": {
                    "value": {
                      "error": {
                        "code": "subsidy_not_found",
                        "message": "No measure has the id or slug \"vlaio:nope\". GET /v1/subsidies lists them.",
                        "request_id": "req_01hxyz",
                        "details": {}
                      }
                    }
                  },
                  "version_not_found": {
                    "value": {
                      "error": {
                        "code": "version_not_found",
                        "message": "vlaio:kmo-portefeuille has no version 99; it is at version 4.",
                        "request_id": "req_01hxyz",
                        "details": {}
                      }
                    }
                  }
                }
              }
            }
          },
          "403": {
            "description": "plan_required",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "plan_required": {
                    "value": {
                      "error": {
                        "code": "plan_required",
                        "message": "'history' requires the pro plan or above.",
                        "request_id": "req_01hxyz",
                        "details": {}
                      }
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "invalid_parameter",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "invalid_parameter": {
                    "value": {
                      "error": {
                        "code": "invalid_parameter",
                        "message": "Invalid value for region (\"bavaria\" is not one of flanders, brussels, wallonia).",
                        "request_id": "req_01hxyz",
                        "details": {}
                      }
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "unauthorized",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "unauthorized": {
                    "value": {
                      "error": {
                        "code": "unauthorized",
                        "message": "The API key (or session) is missing, malformed or has been revoked.",
                        "request_id": "req_01hxyz",
                        "details": {}
                      }
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "rate_limit_exceeded, quota_exceeded",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "rate_limit_exceeded": {
                    "value": {
                      "error": {
                        "code": "rate_limit_exceeded",
                        "message": "Too many requests. Slow down and retry after the interval in Retry-After.",
                        "request_id": "req_01hxyz",
                        "details": {}
                      }
                    }
                  },
                  "quota_exceeded": {
                    "value": {
                      "error": {
                        "code": "quota_exceeded",
                        "message": "This month's request quota has been used.",
                        "request_id": "req_01hxyz",
                        "details": {}
                      }
                    }
                  }
                }
              }
            }
          },
          "500": {
            "description": "internal_error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "internal_error": {
                    "value": {
                      "error": {
                        "code": "internal_error",
                        "message": "Something went wrong on our side.",
                        "request_id": "req_01hxyz",
                        "details": {}
                      }
                    }
                  }
                }
              }
            }
          },
          "504": {
            "description": "timeout",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "timeout": {
                    "value": {
                      "error": {
                        "code": "timeout",
                        "message": "The request took too long and was stopped. Retry it; a narrower filter or a smaller page is quicker.",
                        "request_id": "req_01hxyz",
                        "details": {}
                      }
                    }
                  }
                }
              }
            }
          }
        },
        "operationId": "getSubsidy"
      }
    },
    "/v1/subsidies/{id}/versions": {
      "get": {
        "tags": [
          "History"
        ],
        "summary": "Versions of a measure",
        "description": "Every version, newest first, with the field-level changes that made it. Pro and above.",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "schema": {
              "type": "string"
            },
            "description": "The measure's id (`vlaio:kmo-portefeuille`, `eu:HORIZON-EIC-2026-ACCELERATOR-01`) or slug.",
            "required": true
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "data": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/Version"
                      }
                    },
                    "subsidy_id": {
                      "type": "string"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/Meta"
                    }
                  }
                }
              }
            }
          },
          "404": {
            "description": "subsidy_not_found",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "subsidy_not_found": {
                    "value": {
                      "error": {
                        "code": "subsidy_not_found",
                        "message": "No measure has the id or slug \"vlaio:nope\". GET /v1/subsidies lists them.",
                        "request_id": "req_01hxyz",
                        "details": {}
                      }
                    }
                  }
                }
              }
            }
          },
          "403": {
            "description": "plan_required",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "plan_required": {
                    "value": {
                      "error": {
                        "code": "plan_required",
                        "message": "'history' requires the pro plan or above.",
                        "request_id": "req_01hxyz",
                        "details": {}
                      }
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "invalid_parameter",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "invalid_parameter": {
                    "value": {
                      "error": {
                        "code": "invalid_parameter",
                        "message": "Invalid value for region (\"bavaria\" is not one of flanders, brussels, wallonia).",
                        "request_id": "req_01hxyz",
                        "details": {}
                      }
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "unauthorized",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "unauthorized": {
                    "value": {
                      "error": {
                        "code": "unauthorized",
                        "message": "The API key (or session) is missing, malformed or has been revoked.",
                        "request_id": "req_01hxyz",
                        "details": {}
                      }
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "rate_limit_exceeded, quota_exceeded",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "rate_limit_exceeded": {
                    "value": {
                      "error": {
                        "code": "rate_limit_exceeded",
                        "message": "Too many requests. Slow down and retry after the interval in Retry-After.",
                        "request_id": "req_01hxyz",
                        "details": {}
                      }
                    }
                  },
                  "quota_exceeded": {
                    "value": {
                      "error": {
                        "code": "quota_exceeded",
                        "message": "This month's request quota has been used.",
                        "request_id": "req_01hxyz",
                        "details": {}
                      }
                    }
                  }
                }
              }
            }
          },
          "500": {
            "description": "internal_error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "internal_error": {
                    "value": {
                      "error": {
                        "code": "internal_error",
                        "message": "Something went wrong on our side.",
                        "request_id": "req_01hxyz",
                        "details": {}
                      }
                    }
                  }
                }
              }
            }
          },
          "504": {
            "description": "timeout",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "timeout": {
                    "value": {
                      "error": {
                        "code": "timeout",
                        "message": "The request took too long and was stopped. Retry it; a narrower filter or a smaller page is quicker.",
                        "request_id": "req_01hxyz",
                        "details": {}
                      }
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/v1/subsidies/{id}/versions/{version}": {
      "get": {
        "tags": [
          "History"
        ],
        "summary": "One version",
        "description": "The record as it was in that version. Pro and above.",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "schema": {
              "type": "string"
            },
            "description": "The measure's id (`vlaio:kmo-portefeuille`, `eu:HORIZON-EIC-2026-ACCELERATOR-01`) or slug.",
            "required": true
          },
          {
            "name": "version",
            "in": "path",
            "schema": {
              "type": "integer"
            },
            "description": "The version number.",
            "required": true
          },
          {
            "name": "lang",
            "in": "query",
            "schema": {
              "type": "string",
              "enum": [
                "nl",
                "fr",
                "en"
              ]
            },
            "description": "Language of `title`, `summary` and links. Default en."
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data",
                    "meta"
                  ],
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/SubsidyFull"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/Meta"
                    }
                  }
                }
              }
            }
          },
          "404": {
            "description": "subsidy_not_found, version_not_found",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "subsidy_not_found": {
                    "value": {
                      "error": {
                        "code": "subsidy_not_found",
                        "message": "No measure has the id or slug \"vlaio:nope\". GET /v1/subsidies lists them.",
                        "request_id": "req_01hxyz",
                        "details": {}
                      }
                    }
                  },
                  "version_not_found": {
                    "value": {
                      "error": {
                        "code": "version_not_found",
                        "message": "vlaio:kmo-portefeuille has no version 99; it is at version 4.",
                        "request_id": "req_01hxyz",
                        "details": {}
                      }
                    }
                  }
                }
              }
            }
          },
          "403": {
            "description": "plan_required",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "plan_required": {
                    "value": {
                      "error": {
                        "code": "plan_required",
                        "message": "'history' requires the pro plan or above.",
                        "request_id": "req_01hxyz",
                        "details": {}
                      }
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "invalid_parameter",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "invalid_parameter": {
                    "value": {
                      "error": {
                        "code": "invalid_parameter",
                        "message": "Invalid value for region (\"bavaria\" is not one of flanders, brussels, wallonia).",
                        "request_id": "req_01hxyz",
                        "details": {}
                      }
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "unauthorized",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "unauthorized": {
                    "value": {
                      "error": {
                        "code": "unauthorized",
                        "message": "The API key (or session) is missing, malformed or has been revoked.",
                        "request_id": "req_01hxyz",
                        "details": {}
                      }
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "rate_limit_exceeded, quota_exceeded",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "rate_limit_exceeded": {
                    "value": {
                      "error": {
                        "code": "rate_limit_exceeded",
                        "message": "Too many requests. Slow down and retry after the interval in Retry-After.",
                        "request_id": "req_01hxyz",
                        "details": {}
                      }
                    }
                  },
                  "quota_exceeded": {
                    "value": {
                      "error": {
                        "code": "quota_exceeded",
                        "message": "This month's request quota has been used.",
                        "request_id": "req_01hxyz",
                        "details": {}
                      }
                    }
                  }
                }
              }
            }
          },
          "500": {
            "description": "internal_error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "internal_error": {
                    "value": {
                      "error": {
                        "code": "internal_error",
                        "message": "Something went wrong on our side.",
                        "request_id": "req_01hxyz",
                        "details": {}
                      }
                    }
                  }
                }
              }
            }
          },
          "504": {
            "description": "timeout",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "timeout": {
                    "value": {
                      "error": {
                        "code": "timeout",
                        "message": "The request took too long and was stopped. Retry it; a narrower filter or a smaller page is quicker.",
                        "request_id": "req_01hxyz",
                        "details": {}
                      }
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/v1/changes": {
      "get": {
        "tags": [
          "Changes"
        ],
        "summary": "The change feed",
        "description": "Every new measure, every version (typed by its most significant change, with every category it touched), closing-soon reminders and source freshness events, in order. Page with `cursor` while `has_more` is true. Every page carries `next_cursor`, the last one too: `has_more: false` with a cursor means nothing more for now, so poll again later with that cursor and get only what is new. An empty page returns the cursor it was given (or, on a first call, one at the newest event). Developer and above.",
        "parameters": [
          {
            "name": "since",
            "in": "query",
            "schema": {
              "type": "string"
            },
            "description": "Start here on a first call (at most 400 days back); afterwards use the cursor."
          },
          {
            "name": "type",
            "in": "query",
            "schema": {
              "type": "string",
              "description": "comma list of event types; matches the primary type or any category"
            },
            "description": ""
          },
          {
            "name": "subsidy",
            "in": "query",
            "schema": {
              "type": "string"
            },
            "description": "One measure's events."
          },
          {
            "name": "source",
            "in": "query",
            "schema": {
              "type": "string"
            },
            "description": ""
          },
          {
            "name": "region",
            "in": "query",
            "schema": {
              "type": "string",
              "description": "comma list of: flanders, brussels, wallonia"
            },
            "description": ""
          },
          {
            "name": "limit",
            "in": "query",
            "schema": {
              "type": "integer",
              "minimum": 1
            },
            "description": "Page size, up to the plan's maximum (Developer 100, Pro and Business 200, Enterprise 500). Above it is an error, never a silent truncation."
          },
          {
            "name": "cursor",
            "in": "query",
            "schema": {
              "type": "string"
            },
            "description": "From `pagination.next_cursor` of any page, the last one included. Opaque."
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data",
                    "pagination",
                    "meta"
                  ],
                  "properties": {
                    "data": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/Change"
                      }
                    },
                    "pagination": {
                      "$ref": "#/components/schemas/Pagination"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/Meta"
                    }
                  }
                }
              }
            }
          },
          "403": {
            "description": "plan_required",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "plan_required": {
                    "value": {
                      "error": {
                        "code": "plan_required",
                        "message": "'history' requires the pro plan or above.",
                        "request_id": "req_01hxyz",
                        "details": {}
                      }
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "invalid_parameter, invalid_cursor",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "invalid_parameter": {
                    "value": {
                      "error": {
                        "code": "invalid_parameter",
                        "message": "Invalid value for region (\"bavaria\" is not one of flanders, brussels, wallonia).",
                        "request_id": "req_01hxyz",
                        "details": {}
                      }
                    }
                  },
                  "invalid_cursor": {
                    "value": {
                      "error": {
                        "code": "invalid_cursor",
                        "message": "The cursor is not valid for this request. Start again without one rather than assuming page 1.",
                        "request_id": "req_01hxyz",
                        "details": {}
                      }
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "unauthorized",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "unauthorized": {
                    "value": {
                      "error": {
                        "code": "unauthorized",
                        "message": "The API key (or session) is missing, malformed or has been revoked.",
                        "request_id": "req_01hxyz",
                        "details": {}
                      }
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "rate_limit_exceeded, quota_exceeded",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "rate_limit_exceeded": {
                    "value": {
                      "error": {
                        "code": "rate_limit_exceeded",
                        "message": "Too many requests. Slow down and retry after the interval in Retry-After.",
                        "request_id": "req_01hxyz",
                        "details": {}
                      }
                    }
                  },
                  "quota_exceeded": {
                    "value": {
                      "error": {
                        "code": "quota_exceeded",
                        "message": "This month's request quota has been used.",
                        "request_id": "req_01hxyz",
                        "details": {}
                      }
                    }
                  }
                }
              }
            }
          },
          "500": {
            "description": "internal_error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "internal_error": {
                    "value": {
                      "error": {
                        "code": "internal_error",
                        "message": "Something went wrong on our side.",
                        "request_id": "req_01hxyz",
                        "details": {}
                      }
                    }
                  }
                }
              }
            }
          },
          "504": {
            "description": "timeout",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "timeout": {
                    "value": {
                      "error": {
                        "code": "timeout",
                        "message": "The request took too long and was stopped. Retry it; a narrower filter or a smaller page is quicker.",
                        "request_id": "req_01hxyz",
                        "details": {}
                      }
                    }
                  }
                }
              }
            }
          }
        },
        "operationId": "listChanges"
      }
    },
    "/v1/match": {
      "post": {
        "tags": [
          "Matching"
        ],
        "summary": "Match a company and a project",
        "description": "Which measures plausibly fit, why (every rule's pass, fail or unknown with its provenance), what is still unknown (as questions, ranked by how many matches they would settle), and an indicative amount. Statuses: likely_eligible, possibly_eligible, needs_review, not_eligible (only with include_not_eligible). Never \"eligible\": the competent authority decides. Best first: likely_eligible, then possibly_eligible and needs_review together, then not_eligible; within each by `score`, which weighs topic fit, the match status, rule confidence, whether the measure can be applied for now (open and continuous alike), and how close to the company it is decided (its own region, then national, then EU), less a little per unanswered question; the soonest deadline breaks a tie. `company.nace` takes NACE codes of at least two digits; a section letter is refused. One match evaluation.",
        "parameters": [],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/MatchResponse"
                }
              }
            }
          },
          "422": {
            "description": "invalid_body",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "invalid_body": {
                    "value": {
                      "error": {
                        "code": "invalid_body",
                        "message": "company.postcode: company.postcode is not a Belgian postcode",
                        "request_id": "req_01hxyz",
                        "details": {}
                      }
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "invalid_parameter",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "invalid_parameter": {
                    "value": {
                      "error": {
                        "code": "invalid_parameter",
                        "message": "Invalid value for region (\"bavaria\" is not one of flanders, brussels, wallonia).",
                        "request_id": "req_01hxyz",
                        "details": {}
                      }
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "match_quota_exceeded, rate_limit_exceeded, quota_exceeded",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "match_quota_exceeded": {
                    "value": {
                      "error": {
                        "code": "match_quota_exceeded",
                        "message": "This month's 25 match evaluations have been used.",
                        "request_id": "req_01hxyz",
                        "details": {}
                      }
                    }
                  },
                  "rate_limit_exceeded": {
                    "value": {
                      "error": {
                        "code": "rate_limit_exceeded",
                        "message": "Too many requests. Slow down and retry after the interval in Retry-After.",
                        "request_id": "req_01hxyz",
                        "details": {}
                      }
                    }
                  },
                  "quota_exceeded": {
                    "value": {
                      "error": {
                        "code": "quota_exceeded",
                        "message": "This month's request quota has been used.",
                        "request_id": "req_01hxyz",
                        "details": {}
                      }
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "unauthorized",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "unauthorized": {
                    "value": {
                      "error": {
                        "code": "unauthorized",
                        "message": "The API key (or session) is missing, malformed or has been revoked.",
                        "request_id": "req_01hxyz",
                        "details": {}
                      }
                    }
                  }
                }
              }
            }
          },
          "500": {
            "description": "internal_error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "internal_error": {
                    "value": {
                      "error": {
                        "code": "internal_error",
                        "message": "Something went wrong on our side.",
                        "request_id": "req_01hxyz",
                        "details": {}
                      }
                    }
                  }
                }
              }
            }
          },
          "504": {
            "description": "timeout",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "timeout": {
                    "value": {
                      "error": {
                        "code": "timeout",
                        "message": "The request took too long and was stopped. Retry it; a narrower filter or a smaller page is quicker.",
                        "request_id": "req_01hxyz",
                        "details": {}
                      }
                    }
                  }
                }
              }
            }
          }
        },
        "operationId": "match",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/MatchRequest"
              },
              "example": {
                "company": {
                  "postcode": "9000",
                  "employees": 12,
                  "turnover_eur": 1500000,
                  "legal_form": "bv",
                  "nace": [
                    "62.010"
                  ],
                  "founded_on": "2019-05-01"
                },
                "project": {
                  "topics": [
                    "digitalisation",
                    "cybersecurity"
                  ],
                  "budget_eur": 25000,
                  "planned_start": "2026-11-01"
                },
                "language": "nl",
                "limit": 10
              }
            }
          }
        }
      }
    },
    "/v1/match/bulk": {
      "post": {
        "tags": [
          "Matching"
        ],
        "summary": "Match many companies",
        "description": "Up to 500 companies (Business) or 5,000 (Enterprise) in one request. One evaluation per valid company; an invalid one is answered with its own error. Business and above.",
        "parameters": [],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "422": {
            "description": "invalid_body",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "invalid_body": {
                    "value": {
                      "error": {
                        "code": "invalid_body",
                        "message": "company.postcode: company.postcode is not a Belgian postcode",
                        "request_id": "req_01hxyz",
                        "details": {}
                      }
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "invalid_parameter",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "invalid_parameter": {
                    "value": {
                      "error": {
                        "code": "invalid_parameter",
                        "message": "Invalid value for region (\"bavaria\" is not one of flanders, brussels, wallonia).",
                        "request_id": "req_01hxyz",
                        "details": {}
                      }
                    }
                  }
                }
              }
            }
          },
          "403": {
            "description": "plan_required",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "plan_required": {
                    "value": {
                      "error": {
                        "code": "plan_required",
                        "message": "'history' requires the pro plan or above.",
                        "request_id": "req_01hxyz",
                        "details": {}
                      }
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "match_quota_exceeded, rate_limit_exceeded, quota_exceeded",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "match_quota_exceeded": {
                    "value": {
                      "error": {
                        "code": "match_quota_exceeded",
                        "message": "This month's 25 match evaluations have been used.",
                        "request_id": "req_01hxyz",
                        "details": {}
                      }
                    }
                  },
                  "rate_limit_exceeded": {
                    "value": {
                      "error": {
                        "code": "rate_limit_exceeded",
                        "message": "Too many requests. Slow down and retry after the interval in Retry-After.",
                        "request_id": "req_01hxyz",
                        "details": {}
                      }
                    }
                  },
                  "quota_exceeded": {
                    "value": {
                      "error": {
                        "code": "quota_exceeded",
                        "message": "This month's request quota has been used.",
                        "request_id": "req_01hxyz",
                        "details": {}
                      }
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "unauthorized",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "unauthorized": {
                    "value": {
                      "error": {
                        "code": "unauthorized",
                        "message": "The API key (or session) is missing, malformed or has been revoked.",
                        "request_id": "req_01hxyz",
                        "details": {}
                      }
                    }
                  }
                }
              }
            }
          },
          "500": {
            "description": "internal_error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "internal_error": {
                    "value": {
                      "error": {
                        "code": "internal_error",
                        "message": "Something went wrong on our side.",
                        "request_id": "req_01hxyz",
                        "details": {}
                      }
                    }
                  }
                }
              }
            }
          },
          "504": {
            "description": "timeout",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "timeout": {
                    "value": {
                      "error": {
                        "code": "timeout",
                        "message": "The request took too long and was stopped. Retry it; a narrower filter or a smaller page is quicker.",
                        "request_id": "req_01hxyz",
                        "details": {}
                      }
                    }
                  }
                }
              }
            }
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/BulkRequest"
              },
              "example": {
                "companies": [
                  {
                    "reference": "client-0042",
                    "company": {
                      "postcode": "9000",
                      "employees": 12,
                      "turnover_eur": 1500000,
                      "legal_form": "bv",
                      "nace": [
                        "62.010"
                      ],
                      "founded_on": "2019-05-01"
                    },
                    "project": {
                      "topics": [
                        "digitalisation",
                        "cybersecurity"
                      ],
                      "budget_eur": 25000,
                      "planned_start": "2026-11-01"
                    },
                    "language": "nl",
                    "limit": 10
                  }
                ]
              }
            }
          }
        }
      }
    },
    "/v1/export/subsidies.ndjson": {
      "get": {
        "tags": [
          "Export"
        ],
        "summary": "The whole catalogue",
        "description": "Every current measure as one full record per line. Business and above.",
        "parameters": [
          {
            "name": "lang",
            "in": "query",
            "schema": {
              "type": "string",
              "enum": [
                "nl",
                "fr",
                "en"
              ]
            },
            "description": "Language of `title`, `summary` and links. Default en."
          },
          {
            "name": "include_withdrawn",
            "in": "query",
            "schema": {
              "type": "boolean"
            },
            "description": ""
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/x-ndjson": {
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "403": {
            "description": "plan_required",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "plan_required": {
                    "value": {
                      "error": {
                        "code": "plan_required",
                        "message": "'history' requires the pro plan or above.",
                        "request_id": "req_01hxyz",
                        "details": {}
                      }
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "invalid_parameter",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "invalid_parameter": {
                    "value": {
                      "error": {
                        "code": "invalid_parameter",
                        "message": "Invalid value for region (\"bavaria\" is not one of flanders, brussels, wallonia).",
                        "request_id": "req_01hxyz",
                        "details": {}
                      }
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "unauthorized",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "unauthorized": {
                    "value": {
                      "error": {
                        "code": "unauthorized",
                        "message": "The API key (or session) is missing, malformed or has been revoked.",
                        "request_id": "req_01hxyz",
                        "details": {}
                      }
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "rate_limit_exceeded, quota_exceeded",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "rate_limit_exceeded": {
                    "value": {
                      "error": {
                        "code": "rate_limit_exceeded",
                        "message": "Too many requests. Slow down and retry after the interval in Retry-After.",
                        "request_id": "req_01hxyz",
                        "details": {}
                      }
                    }
                  },
                  "quota_exceeded": {
                    "value": {
                      "error": {
                        "code": "quota_exceeded",
                        "message": "This month's request quota has been used.",
                        "request_id": "req_01hxyz",
                        "details": {}
                      }
                    }
                  }
                }
              }
            }
          },
          "500": {
            "description": "internal_error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "internal_error": {
                    "value": {
                      "error": {
                        "code": "internal_error",
                        "message": "Something went wrong on our side.",
                        "request_id": "req_01hxyz",
                        "details": {}
                      }
                    }
                  }
                }
              }
            }
          },
          "504": {
            "description": "timeout",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "timeout": {
                    "value": {
                      "error": {
                        "code": "timeout",
                        "message": "The request took too long and was stopped. Retry it; a narrower filter or a smaller page is quicker.",
                        "request_id": "req_01hxyz",
                        "details": {}
                      }
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/v1/watchlists": {
      "get": {
        "tags": [
          "Watchlists"
        ],
        "summary": "List watchlists",
        "description": "Business and above.",
        "parameters": [],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data",
                    "pagination",
                    "meta"
                  ],
                  "properties": {
                    "data": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/Watchlist"
                      }
                    },
                    "pagination": {
                      "$ref": "#/components/schemas/Pagination"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/Meta"
                    }
                  }
                }
              }
            }
          },
          "403": {
            "description": "plan_required",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "plan_required": {
                    "value": {
                      "error": {
                        "code": "plan_required",
                        "message": "'history' requires the pro plan or above.",
                        "request_id": "req_01hxyz",
                        "details": {}
                      }
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "invalid_parameter",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "invalid_parameter": {
                    "value": {
                      "error": {
                        "code": "invalid_parameter",
                        "message": "Invalid value for region (\"bavaria\" is not one of flanders, brussels, wallonia).",
                        "request_id": "req_01hxyz",
                        "details": {}
                      }
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "unauthorized",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "unauthorized": {
                    "value": {
                      "error": {
                        "code": "unauthorized",
                        "message": "The API key (or session) is missing, malformed or has been revoked.",
                        "request_id": "req_01hxyz",
                        "details": {}
                      }
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "rate_limit_exceeded, quota_exceeded",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "rate_limit_exceeded": {
                    "value": {
                      "error": {
                        "code": "rate_limit_exceeded",
                        "message": "Too many requests. Slow down and retry after the interval in Retry-After.",
                        "request_id": "req_01hxyz",
                        "details": {}
                      }
                    }
                  },
                  "quota_exceeded": {
                    "value": {
                      "error": {
                        "code": "quota_exceeded",
                        "message": "This month's request quota has been used.",
                        "request_id": "req_01hxyz",
                        "details": {}
                      }
                    }
                  }
                }
              }
            }
          },
          "500": {
            "description": "internal_error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "internal_error": {
                    "value": {
                      "error": {
                        "code": "internal_error",
                        "message": "Something went wrong on our side.",
                        "request_id": "req_01hxyz",
                        "details": {}
                      }
                    }
                  }
                }
              }
            }
          },
          "504": {
            "description": "timeout",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "timeout": {
                    "value": {
                      "error": {
                        "code": "timeout",
                        "message": "The request took too long and was stopped. Retry it; a narrower filter or a smaller page is quicker.",
                        "request_id": "req_01hxyz",
                        "details": {}
                      }
                    }
                  }
                }
              }
            }
          }
        }
      },
      "post": {
        "tags": [
          "Watchlists"
        ],
        "summary": "Create a watchlist",
        "description": "A portfolio of companies re-evaluated whenever a measure changes; each difference is a match.* webhook event. Business and above.",
        "parameters": [],
        "responses": {
          "201": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data",
                    "meta"
                  ],
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/Watchlist"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/Meta"
                    }
                  }
                }
              }
            }
          },
          "422": {
            "description": "invalid_body",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "invalid_body": {
                    "value": {
                      "error": {
                        "code": "invalid_body",
                        "message": "company.postcode: company.postcode is not a Belgian postcode",
                        "request_id": "req_01hxyz",
                        "details": {}
                      }
                    }
                  }
                }
              }
            }
          },
          "403": {
            "description": "plan_required",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "plan_required": {
                    "value": {
                      "error": {
                        "code": "plan_required",
                        "message": "'history' requires the pro plan or above.",
                        "request_id": "req_01hxyz",
                        "details": {}
                      }
                    }
                  }
                }
              }
            }
          },
          "409": {
            "description": "conflict",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "conflict": {
                    "value": {
                      "error": {
                        "code": "conflict",
                        "message": "That cannot be done in the current state.",
                        "request_id": "req_01hxyz",
                        "details": {}
                      }
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "unauthorized",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "unauthorized": {
                    "value": {
                      "error": {
                        "code": "unauthorized",
                        "message": "The API key (or session) is missing, malformed or has been revoked.",
                        "request_id": "req_01hxyz",
                        "details": {}
                      }
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "rate_limit_exceeded, quota_exceeded",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "rate_limit_exceeded": {
                    "value": {
                      "error": {
                        "code": "rate_limit_exceeded",
                        "message": "Too many requests. Slow down and retry after the interval in Retry-After.",
                        "request_id": "req_01hxyz",
                        "details": {}
                      }
                    }
                  },
                  "quota_exceeded": {
                    "value": {
                      "error": {
                        "code": "quota_exceeded",
                        "message": "This month's request quota has been used.",
                        "request_id": "req_01hxyz",
                        "details": {}
                      }
                    }
                  }
                }
              }
            }
          },
          "500": {
            "description": "internal_error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "internal_error": {
                    "value": {
                      "error": {
                        "code": "internal_error",
                        "message": "Something went wrong on our side.",
                        "request_id": "req_01hxyz",
                        "details": {}
                      }
                    }
                  }
                }
              }
            }
          },
          "504": {
            "description": "timeout",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "timeout": {
                    "value": {
                      "error": {
                        "code": "timeout",
                        "message": "The request took too long and was stopped. Retry it; a narrower filter or a smaller page is quicker.",
                        "request_id": "req_01hxyz",
                        "details": {}
                      }
                    }
                  }
                }
              }
            }
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "name"
                ],
                "properties": {
                  "name": {
                    "type": "string"
                  },
                  "options": {
                    "$ref": "#/components/schemas/MatchOptions"
                  },
                  "language": {
                    "type": "string"
                  }
                }
              },
              "example": {
                "name": "Manufacturing clients",
                "language": "nl"
              }
            }
          }
        }
      }
    },
    "/v1/watchlists/{id}": {
      "get": {
        "tags": [
          "Watchlists"
        ],
        "summary": "One watchlist",
        "description": "",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "schema": {
              "type": "string"
            },
            "description": "A `wl_` id.",
            "required": true
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data",
                    "meta"
                  ],
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/Watchlist"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/Meta"
                    }
                  }
                }
              }
            }
          },
          "404": {
            "description": "watchlist_not_found",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "watchlist_not_found": {
                    "value": {
                      "error": {
                        "code": "watchlist_not_found",
                        "message": "No watchlist with that id belongs to this account.",
                        "request_id": "req_01hxyz",
                        "details": {}
                      }
                    }
                  }
                }
              }
            }
          },
          "403": {
            "description": "plan_required",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "plan_required": {
                    "value": {
                      "error": {
                        "code": "plan_required",
                        "message": "'history' requires the pro plan or above.",
                        "request_id": "req_01hxyz",
                        "details": {}
                      }
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "unauthorized",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "unauthorized": {
                    "value": {
                      "error": {
                        "code": "unauthorized",
                        "message": "The API key (or session) is missing, malformed or has been revoked.",
                        "request_id": "req_01hxyz",
                        "details": {}
                      }
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "rate_limit_exceeded, quota_exceeded",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "rate_limit_exceeded": {
                    "value": {
                      "error": {
                        "code": "rate_limit_exceeded",
                        "message": "Too many requests. Slow down and retry after the interval in Retry-After.",
                        "request_id": "req_01hxyz",
                        "details": {}
                      }
                    }
                  },
                  "quota_exceeded": {
                    "value": {
                      "error": {
                        "code": "quota_exceeded",
                        "message": "This month's request quota has been used.",
                        "request_id": "req_01hxyz",
                        "details": {}
                      }
                    }
                  }
                }
              }
            }
          },
          "500": {
            "description": "internal_error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "internal_error": {
                    "value": {
                      "error": {
                        "code": "internal_error",
                        "message": "Something went wrong on our side.",
                        "request_id": "req_01hxyz",
                        "details": {}
                      }
                    }
                  }
                }
              }
            }
          },
          "504": {
            "description": "timeout",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "timeout": {
                    "value": {
                      "error": {
                        "code": "timeout",
                        "message": "The request took too long and was stopped. Retry it; a narrower filter or a smaller page is quicker.",
                        "request_id": "req_01hxyz",
                        "details": {}
                      }
                    }
                  }
                }
              }
            }
          }
        }
      },
      "patch": {
        "tags": [
          "Watchlists"
        ],
        "summary": "Rename or change options",
        "description": "",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "schema": {
              "type": "string"
            },
            "description": "A `wl_` id.",
            "required": true
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data",
                    "meta"
                  ],
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/Watchlist"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/Meta"
                    }
                  }
                }
              }
            }
          },
          "404": {
            "description": "watchlist_not_found",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "watchlist_not_found": {
                    "value": {
                      "error": {
                        "code": "watchlist_not_found",
                        "message": "No watchlist with that id belongs to this account.",
                        "request_id": "req_01hxyz",
                        "details": {}
                      }
                    }
                  }
                }
              }
            }
          },
          "422": {
            "description": "invalid_body",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "invalid_body": {
                    "value": {
                      "error": {
                        "code": "invalid_body",
                        "message": "company.postcode: company.postcode is not a Belgian postcode",
                        "request_id": "req_01hxyz",
                        "details": {}
                      }
                    }
                  }
                }
              }
            }
          },
          "403": {
            "description": "plan_required",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "plan_required": {
                    "value": {
                      "error": {
                        "code": "plan_required",
                        "message": "'history' requires the pro plan or above.",
                        "request_id": "req_01hxyz",
                        "details": {}
                      }
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "unauthorized",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "unauthorized": {
                    "value": {
                      "error": {
                        "code": "unauthorized",
                        "message": "The API key (or session) is missing, malformed or has been revoked.",
                        "request_id": "req_01hxyz",
                        "details": {}
                      }
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "rate_limit_exceeded, quota_exceeded",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "rate_limit_exceeded": {
                    "value": {
                      "error": {
                        "code": "rate_limit_exceeded",
                        "message": "Too many requests. Slow down and retry after the interval in Retry-After.",
                        "request_id": "req_01hxyz",
                        "details": {}
                      }
                    }
                  },
                  "quota_exceeded": {
                    "value": {
                      "error": {
                        "code": "quota_exceeded",
                        "message": "This month's request quota has been used.",
                        "request_id": "req_01hxyz",
                        "details": {}
                      }
                    }
                  }
                }
              }
            }
          },
          "500": {
            "description": "internal_error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "internal_error": {
                    "value": {
                      "error": {
                        "code": "internal_error",
                        "message": "Something went wrong on our side.",
                        "request_id": "req_01hxyz",
                        "details": {}
                      }
                    }
                  }
                }
              }
            }
          },
          "504": {
            "description": "timeout",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "timeout": {
                    "value": {
                      "error": {
                        "code": "timeout",
                        "message": "The request took too long and was stopped. Retry it; a narrower filter or a smaller page is quicker.",
                        "request_id": "req_01hxyz",
                        "details": {}
                      }
                    }
                  }
                }
              }
            }
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "name": {
                    "type": "string"
                  },
                  "options": {
                    "$ref": "#/components/schemas/MatchOptions"
                  },
                  "language": {
                    "type": "string"
                  }
                }
              },
              "example": {
                "name": "Renamed"
              }
            }
          }
        }
      },
      "delete": {
        "tags": [
          "Watchlists"
        ],
        "summary": "Delete a watchlist",
        "description": "",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "schema": {
              "type": "string"
            },
            "description": "A `wl_` id.",
            "required": true
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "404": {
            "description": "watchlist_not_found",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "watchlist_not_found": {
                    "value": {
                      "error": {
                        "code": "watchlist_not_found",
                        "message": "No watchlist with that id belongs to this account.",
                        "request_id": "req_01hxyz",
                        "details": {}
                      }
                    }
                  }
                }
              }
            }
          },
          "403": {
            "description": "plan_required",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "plan_required": {
                    "value": {
                      "error": {
                        "code": "plan_required",
                        "message": "'history' requires the pro plan or above.",
                        "request_id": "req_01hxyz",
                        "details": {}
                      }
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "unauthorized",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "unauthorized": {
                    "value": {
                      "error": {
                        "code": "unauthorized",
                        "message": "The API key (or session) is missing, malformed or has been revoked.",
                        "request_id": "req_01hxyz",
                        "details": {}
                      }
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "rate_limit_exceeded, quota_exceeded",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "rate_limit_exceeded": {
                    "value": {
                      "error": {
                        "code": "rate_limit_exceeded",
                        "message": "Too many requests. Slow down and retry after the interval in Retry-After.",
                        "request_id": "req_01hxyz",
                        "details": {}
                      }
                    }
                  },
                  "quota_exceeded": {
                    "value": {
                      "error": {
                        "code": "quota_exceeded",
                        "message": "This month's request quota has been used.",
                        "request_id": "req_01hxyz",
                        "details": {}
                      }
                    }
                  }
                }
              }
            }
          },
          "500": {
            "description": "internal_error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "internal_error": {
                    "value": {
                      "error": {
                        "code": "internal_error",
                        "message": "Something went wrong on our side.",
                        "request_id": "req_01hxyz",
                        "details": {}
                      }
                    }
                  }
                }
              }
            }
          },
          "504": {
            "description": "timeout",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "timeout": {
                    "value": {
                      "error": {
                        "code": "timeout",
                        "message": "The request took too long and was stopped. Retry it; a narrower filter or a smaller page is quicker.",
                        "request_id": "req_01hxyz",
                        "details": {}
                      }
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/v1/watchlists/{id}/companies": {
      "get": {
        "tags": [
          "Watchlists"
        ],
        "summary": "Companies on a watchlist",
        "description": "",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "schema": {
              "type": "string"
            },
            "description": "A `wl_` id.",
            "required": true
          },
          {
            "name": "limit",
            "in": "query",
            "schema": {
              "type": "integer",
              "minimum": 1
            },
            "description": "Page size, up to the plan's maximum (Developer 100, Pro and Business 200, Enterprise 500). Above it is an error, never a silent truncation."
          },
          {
            "name": "cursor",
            "in": "query",
            "schema": {
              "type": "string"
            },
            "description": "From `pagination.next_cursor`. Opaque."
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "404": {
            "description": "watchlist_not_found",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "watchlist_not_found": {
                    "value": {
                      "error": {
                        "code": "watchlist_not_found",
                        "message": "No watchlist with that id belongs to this account.",
                        "request_id": "req_01hxyz",
                        "details": {}
                      }
                    }
                  }
                }
              }
            }
          },
          "403": {
            "description": "plan_required",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "plan_required": {
                    "value": {
                      "error": {
                        "code": "plan_required",
                        "message": "'history' requires the pro plan or above.",
                        "request_id": "req_01hxyz",
                        "details": {}
                      }
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "invalid_parameter",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "invalid_parameter": {
                    "value": {
                      "error": {
                        "code": "invalid_parameter",
                        "message": "Invalid value for region (\"bavaria\" is not one of flanders, brussels, wallonia).",
                        "request_id": "req_01hxyz",
                        "details": {}
                      }
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "unauthorized",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "unauthorized": {
                    "value": {
                      "error": {
                        "code": "unauthorized",
                        "message": "The API key (or session) is missing, malformed or has been revoked.",
                        "request_id": "req_01hxyz",
                        "details": {}
                      }
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "rate_limit_exceeded, quota_exceeded",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "rate_limit_exceeded": {
                    "value": {
                      "error": {
                        "code": "rate_limit_exceeded",
                        "message": "Too many requests. Slow down and retry after the interval in Retry-After.",
                        "request_id": "req_01hxyz",
                        "details": {}
                      }
                    }
                  },
                  "quota_exceeded": {
                    "value": {
                      "error": {
                        "code": "quota_exceeded",
                        "message": "This month's request quota has been used.",
                        "request_id": "req_01hxyz",
                        "details": {}
                      }
                    }
                  }
                }
              }
            }
          },
          "500": {
            "description": "internal_error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "internal_error": {
                    "value": {
                      "error": {
                        "code": "internal_error",
                        "message": "Something went wrong on our side.",
                        "request_id": "req_01hxyz",
                        "details": {}
                      }
                    }
                  }
                }
              }
            }
          },
          "504": {
            "description": "timeout",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "timeout": {
                    "value": {
                      "error": {
                        "code": "timeout",
                        "message": "The request took too long and was stopped. Retry it; a narrower filter or a smaller page is quicker.",
                        "request_id": "req_01hxyz",
                        "details": {}
                      }
                    }
                  }
                }
              }
            }
          }
        }
      },
      "post": {
        "tags": [
          "Watchlists"
        ],
        "summary": "Add or replace companies",
        "description": "Up to 1,000 per request, by your own reference. Each is evaluated at once and counts one match evaluation; invalid ones are listed in `rejected` and not stored.",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "schema": {
              "type": "string"
            },
            "description": "A `wl_` id.",
            "required": true
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "404": {
            "description": "watchlist_not_found",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "watchlist_not_found": {
                    "value": {
                      "error": {
                        "code": "watchlist_not_found",
                        "message": "No watchlist with that id belongs to this account.",
                        "request_id": "req_01hxyz",
                        "details": {}
                      }
                    }
                  }
                }
              }
            }
          },
          "422": {
            "description": "invalid_body",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "invalid_body": {
                    "value": {
                      "error": {
                        "code": "invalid_body",
                        "message": "company.postcode: company.postcode is not a Belgian postcode",
                        "request_id": "req_01hxyz",
                        "details": {}
                      }
                    }
                  }
                }
              }
            }
          },
          "403": {
            "description": "plan_required",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "plan_required": {
                    "value": {
                      "error": {
                        "code": "plan_required",
                        "message": "'history' requires the pro plan or above.",
                        "request_id": "req_01hxyz",
                        "details": {}
                      }
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "match_quota_exceeded, rate_limit_exceeded, quota_exceeded",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "match_quota_exceeded": {
                    "value": {
                      "error": {
                        "code": "match_quota_exceeded",
                        "message": "This month's 25 match evaluations have been used.",
                        "request_id": "req_01hxyz",
                        "details": {}
                      }
                    }
                  },
                  "rate_limit_exceeded": {
                    "value": {
                      "error": {
                        "code": "rate_limit_exceeded",
                        "message": "Too many requests. Slow down and retry after the interval in Retry-After.",
                        "request_id": "req_01hxyz",
                        "details": {}
                      }
                    }
                  },
                  "quota_exceeded": {
                    "value": {
                      "error": {
                        "code": "quota_exceeded",
                        "message": "This month's request quota has been used.",
                        "request_id": "req_01hxyz",
                        "details": {}
                      }
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "unauthorized",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "unauthorized": {
                    "value": {
                      "error": {
                        "code": "unauthorized",
                        "message": "The API key (or session) is missing, malformed or has been revoked.",
                        "request_id": "req_01hxyz",
                        "details": {}
                      }
                    }
                  }
                }
              }
            }
          },
          "500": {
            "description": "internal_error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "internal_error": {
                    "value": {
                      "error": {
                        "code": "internal_error",
                        "message": "Something went wrong on our side.",
                        "request_id": "req_01hxyz",
                        "details": {}
                      }
                    }
                  }
                }
              }
            }
          },
          "504": {
            "description": "timeout",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "timeout": {
                    "value": {
                      "error": {
                        "code": "timeout",
                        "message": "The request took too long and was stopped. Retry it; a narrower filter or a smaller page is quicker.",
                        "request_id": "req_01hxyz",
                        "details": {}
                      }
                    }
                  }
                }
              }
            }
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "companies"
                ],
                "properties": {
                  "companies": {
                    "type": "array",
                    "items": {
                      "$ref": "#/components/schemas/BulkCompany"
                    }
                  }
                }
              },
              "example": {
                "companies": [
                  {
                    "reference": "client-0042",
                    "company": {
                      "postcode": "9000",
                      "employees": 12,
                      "turnover_eur": 1500000,
                      "legal_form": "bv",
                      "nace": [
                        "62.010"
                      ],
                      "founded_on": "2019-05-01"
                    },
                    "project": {
                      "topics": [
                        "digitalisation",
                        "cybersecurity"
                      ],
                      "budget_eur": 25000,
                      "planned_start": "2026-11-01"
                    }
                  }
                ]
              }
            }
          }
        }
      }
    },
    "/v1/watchlists/{id}/companies/{reference}": {
      "delete": {
        "tags": [
          "Watchlists"
        ],
        "summary": "Remove a company",
        "description": "",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "schema": {
              "type": "string"
            },
            "description": "A `wl_` id.",
            "required": true
          },
          {
            "name": "reference",
            "in": "path",
            "schema": {
              "type": "string"
            },
            "description": "Your reference.",
            "required": true
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "404": {
            "description": "watchlist_not_found, not_found",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "watchlist_not_found": {
                    "value": {
                      "error": {
                        "code": "watchlist_not_found",
                        "message": "No watchlist with that id belongs to this account.",
                        "request_id": "req_01hxyz",
                        "details": {}
                      }
                    }
                  },
                  "not_found": {
                    "value": {
                      "error": {
                        "code": "not_found",
                        "message": "Not found.",
                        "request_id": "req_01hxyz",
                        "details": {}
                      }
                    }
                  }
                }
              }
            }
          },
          "403": {
            "description": "plan_required",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "plan_required": {
                    "value": {
                      "error": {
                        "code": "plan_required",
                        "message": "'history' requires the pro plan or above.",
                        "request_id": "req_01hxyz",
                        "details": {}
                      }
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "unauthorized",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "unauthorized": {
                    "value": {
                      "error": {
                        "code": "unauthorized",
                        "message": "The API key (or session) is missing, malformed or has been revoked.",
                        "request_id": "req_01hxyz",
                        "details": {}
                      }
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "rate_limit_exceeded, quota_exceeded",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "rate_limit_exceeded": {
                    "value": {
                      "error": {
                        "code": "rate_limit_exceeded",
                        "message": "Too many requests. Slow down and retry after the interval in Retry-After.",
                        "request_id": "req_01hxyz",
                        "details": {}
                      }
                    }
                  },
                  "quota_exceeded": {
                    "value": {
                      "error": {
                        "code": "quota_exceeded",
                        "message": "This month's request quota has been used.",
                        "request_id": "req_01hxyz",
                        "details": {}
                      }
                    }
                  }
                }
              }
            }
          },
          "500": {
            "description": "internal_error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "internal_error": {
                    "value": {
                      "error": {
                        "code": "internal_error",
                        "message": "Something went wrong on our side.",
                        "request_id": "req_01hxyz",
                        "details": {}
                      }
                    }
                  }
                }
              }
            }
          },
          "504": {
            "description": "timeout",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "timeout": {
                    "value": {
                      "error": {
                        "code": "timeout",
                        "message": "The request took too long and was stopped. Retry it; a narrower filter or a smaller page is quicker.",
                        "request_id": "req_01hxyz",
                        "details": {}
                      }
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/v1/watchlists/{id}/matches": {
      "get": {
        "tags": [
          "Watchlists"
        ],
        "summary": "Current matches",
        "description": "Every company's current matches, best first.",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "schema": {
              "type": "string"
            },
            "description": "A `wl_` id.",
            "required": true
          },
          {
            "name": "company",
            "in": "query",
            "schema": {
              "type": "string"
            },
            "description": "One company's reference."
          },
          {
            "name": "include_not_eligible",
            "in": "query",
            "schema": {
              "type": "boolean"
            },
            "description": ""
          },
          {
            "name": "limit",
            "in": "query",
            "schema": {
              "type": "integer"
            },
            "description": "Up to 5,000."
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data",
                    "meta",
                    "disclaimer"
                  ],
                  "properties": {
                    "data": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "required": [
                          "company_reference",
                          "subsidy_id",
                          "match_status",
                          "score",
                          "result",
                          "subsidy_version",
                          "first_matched_at",
                          "updated_at",
                          "subsidy"
                        ],
                        "properties": {
                          "company_reference": {
                            "type": "string"
                          },
                          "subsidy_id": {
                            "type": "string"
                          },
                          "match_status": {
                            "type": "string",
                            "enum": [
                              "likely_eligible",
                              "possibly_eligible",
                              "needs_review",
                              "not_eligible"
                            ]
                          },
                          "score": {
                            "type": "number"
                          },
                          "result": {
                            "type": "object",
                            "description": "The full match result, as POST /v1/match returns it."
                          },
                          "subsidy_version": {
                            "type": "integer"
                          },
                          "first_matched_at": {
                            "type": "string",
                            "format": "date-time"
                          },
                          "updated_at": {
                            "type": "string",
                            "format": "date-time"
                          },
                          "subsidy": {
                            "type": "object",
                            "required": [
                              "id",
                              "slug",
                              "title",
                              "status",
                              "closes_at",
                              "web"
                            ],
                            "description": "The measure as it is now, in the watchlist's language.",
                            "properties": {
                              "id": {
                                "type": "string"
                              },
                              "slug": {
                                "type": "string"
                              },
                              "title": {
                                "type": "string"
                              },
                              "status": {
                                "type": "string"
                              },
                              "closes_at": {
                                "type": [
                                  "string",
                                  "null"
                                ],
                                "format": "date-time"
                              },
                              "web": {
                                "type": "string"
                              }
                            }
                          }
                        }
                      }
                    },
                    "meta": {
                      "$ref": "#/components/schemas/Meta"
                    },
                    "disclaimer": {
                      "type": "string"
                    }
                  }
                }
              }
            }
          },
          "404": {
            "description": "watchlist_not_found",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "watchlist_not_found": {
                    "value": {
                      "error": {
                        "code": "watchlist_not_found",
                        "message": "No watchlist with that id belongs to this account.",
                        "request_id": "req_01hxyz",
                        "details": {}
                      }
                    }
                  }
                }
              }
            }
          },
          "403": {
            "description": "plan_required",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "plan_required": {
                    "value": {
                      "error": {
                        "code": "plan_required",
                        "message": "'history' requires the pro plan or above.",
                        "request_id": "req_01hxyz",
                        "details": {}
                      }
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "invalid_parameter",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "invalid_parameter": {
                    "value": {
                      "error": {
                        "code": "invalid_parameter",
                        "message": "Invalid value for region (\"bavaria\" is not one of flanders, brussels, wallonia).",
                        "request_id": "req_01hxyz",
                        "details": {}
                      }
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "unauthorized",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "unauthorized": {
                    "value": {
                      "error": {
                        "code": "unauthorized",
                        "message": "The API key (or session) is missing, malformed or has been revoked.",
                        "request_id": "req_01hxyz",
                        "details": {}
                      }
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "rate_limit_exceeded, quota_exceeded",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "rate_limit_exceeded": {
                    "value": {
                      "error": {
                        "code": "rate_limit_exceeded",
                        "message": "Too many requests. Slow down and retry after the interval in Retry-After.",
                        "request_id": "req_01hxyz",
                        "details": {}
                      }
                    }
                  },
                  "quota_exceeded": {
                    "value": {
                      "error": {
                        "code": "quota_exceeded",
                        "message": "This month's request quota has been used.",
                        "request_id": "req_01hxyz",
                        "details": {}
                      }
                    }
                  }
                }
              }
            }
          },
          "500": {
            "description": "internal_error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "internal_error": {
                    "value": {
                      "error": {
                        "code": "internal_error",
                        "message": "Something went wrong on our side.",
                        "request_id": "req_01hxyz",
                        "details": {}
                      }
                    }
                  }
                }
              }
            }
          },
          "504": {
            "description": "timeout",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "timeout": {
                    "value": {
                      "error": {
                        "code": "timeout",
                        "message": "The request took too long and was stopped. Retry it; a narrower filter or a smaller page is quicker.",
                        "request_id": "req_01hxyz",
                        "details": {}
                      }
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/v1/webhooks": {
      "get": {
        "tags": [
          "Webhooks"
        ],
        "summary": "List webhooks",
        "description": "Pro and above.",
        "parameters": [
          {
            "name": "limit",
            "in": "query",
            "schema": {
              "type": "integer",
              "minimum": 1
            },
            "description": "Page size, up to the plan's maximum (Developer 100, Pro and Business 200, Enterprise 500). Above it is an error, never a silent truncation."
          },
          {
            "name": "cursor",
            "in": "query",
            "schema": {
              "type": "string"
            },
            "description": "From `pagination.next_cursor`. Opaque."
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data",
                    "pagination",
                    "meta"
                  ],
                  "properties": {
                    "data": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/Webhook"
                      }
                    },
                    "pagination": {
                      "$ref": "#/components/schemas/Pagination"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/Meta"
                    }
                  }
                }
              }
            }
          },
          "403": {
            "description": "plan_required",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "plan_required": {
                    "value": {
                      "error": {
                        "code": "plan_required",
                        "message": "'history' requires the pro plan or above.",
                        "request_id": "req_01hxyz",
                        "details": {}
                      }
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "invalid_parameter",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "invalid_parameter": {
                    "value": {
                      "error": {
                        "code": "invalid_parameter",
                        "message": "Invalid value for region (\"bavaria\" is not one of flanders, brussels, wallonia).",
                        "request_id": "req_01hxyz",
                        "details": {}
                      }
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "unauthorized",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "unauthorized": {
                    "value": {
                      "error": {
                        "code": "unauthorized",
                        "message": "The API key (or session) is missing, malformed or has been revoked.",
                        "request_id": "req_01hxyz",
                        "details": {}
                      }
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "rate_limit_exceeded, quota_exceeded",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "rate_limit_exceeded": {
                    "value": {
                      "error": {
                        "code": "rate_limit_exceeded",
                        "message": "Too many requests. Slow down and retry after the interval in Retry-After.",
                        "request_id": "req_01hxyz",
                        "details": {}
                      }
                    }
                  },
                  "quota_exceeded": {
                    "value": {
                      "error": {
                        "code": "quota_exceeded",
                        "message": "This month's request quota has been used.",
                        "request_id": "req_01hxyz",
                        "details": {}
                      }
                    }
                  }
                }
              }
            }
          },
          "500": {
            "description": "internal_error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "internal_error": {
                    "value": {
                      "error": {
                        "code": "internal_error",
                        "message": "Something went wrong on our side.",
                        "request_id": "req_01hxyz",
                        "details": {}
                      }
                    }
                  }
                }
              }
            }
          },
          "504": {
            "description": "timeout",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "timeout": {
                    "value": {
                      "error": {
                        "code": "timeout",
                        "message": "The request took too long and was stopped. Retry it; a narrower filter or a smaller page is quicker.",
                        "request_id": "req_01hxyz",
                        "details": {}
                      }
                    }
                  }
                }
              }
            }
          }
        }
      },
      "post": {
        "tags": [
          "Webhooks"
        ],
        "summary": "Create a webhook",
        "description": "Deliveries are signed (Subsido-Signature: t=,v1=), retried at 1, 5, 30, 120 and 720 minutes, and the endpoint is switched off after 20 failures in a row (POST /v1/webhooks/{id}/enable turns it back on). The plan sets how many endpoints an account may have (`webhook_endpoints` in GET /v1/plans). Filters: event_types, sources, regions, topics, subsidy_ids, watchlists. Pro and above.",
        "parameters": [],
        "responses": {
          "201": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data",
                    "meta"
                  ],
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/WebhookWithSecret"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/Meta"
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "invalid_parameter",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "invalid_parameter": {
                    "value": {
                      "error": {
                        "code": "invalid_parameter",
                        "message": "Invalid value for region (\"bavaria\" is not one of flanders, brussels, wallonia).",
                        "request_id": "req_01hxyz",
                        "details": {}
                      }
                    }
                  }
                }
              }
            }
          },
          "403": {
            "description": "plan_required",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "plan_required": {
                    "value": {
                      "error": {
                        "code": "plan_required",
                        "message": "'history' requires the pro plan or above.",
                        "request_id": "req_01hxyz",
                        "details": {}
                      }
                    }
                  }
                }
              }
            }
          },
          "404": {
            "description": "source_not_found, watchlist_not_found",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "source_not_found": {
                    "value": {
                      "error": {
                        "code": "source_not_found",
                        "message": "No source has the id \"nope\". GET /v1/sources lists them.",
                        "request_id": "req_01hxyz",
                        "details": {}
                      }
                    }
                  },
                  "watchlist_not_found": {
                    "value": {
                      "error": {
                        "code": "watchlist_not_found",
                        "message": "No watchlist with that id belongs to this account.",
                        "request_id": "req_01hxyz",
                        "details": {}
                      }
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "unauthorized",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "unauthorized": {
                    "value": {
                      "error": {
                        "code": "unauthorized",
                        "message": "The API key (or session) is missing, malformed or has been revoked.",
                        "request_id": "req_01hxyz",
                        "details": {}
                      }
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "rate_limit_exceeded, quota_exceeded",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "rate_limit_exceeded": {
                    "value": {
                      "error": {
                        "code": "rate_limit_exceeded",
                        "message": "Too many requests. Slow down and retry after the interval in Retry-After.",
                        "request_id": "req_01hxyz",
                        "details": {}
                      }
                    }
                  },
                  "quota_exceeded": {
                    "value": {
                      "error": {
                        "code": "quota_exceeded",
                        "message": "This month's request quota has been used.",
                        "request_id": "req_01hxyz",
                        "details": {}
                      }
                    }
                  }
                }
              }
            }
          },
          "500": {
            "description": "internal_error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "internal_error": {
                    "value": {
                      "error": {
                        "code": "internal_error",
                        "message": "Something went wrong on our side.",
                        "request_id": "req_01hxyz",
                        "details": {}
                      }
                    }
                  }
                }
              }
            }
          },
          "504": {
            "description": "timeout",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "timeout": {
                    "value": {
                      "error": {
                        "code": "timeout",
                        "message": "The request took too long and was stopped. Retry it; a narrower filter or a smaller page is quicker.",
                        "request_id": "req_01hxyz",
                        "details": {}
                      }
                    }
                  }
                }
              }
            }
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "url"
                ],
                "properties": {
                  "url": {
                    "type": "string"
                  },
                  "filters": {
                    "type": "object"
                  }
                }
              },
              "example": {
                "url": "https://hooks.example.com/subsidies",
                "filters": {
                  "event_types": [
                    "subsidy.deadline_changed",
                    "subsidy.status_changed"
                  ],
                  "regions": [
                    "flanders"
                  ]
                }
              }
            }
          }
        }
      }
    },
    "/v1/webhooks/{id}": {
      "delete": {
        "tags": [
          "Webhooks"
        ],
        "summary": "Delete a webhook",
        "description": "",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "schema": {
              "type": "string"
            },
            "description": "A `wh_` id.",
            "required": true
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "404": {
            "description": "webhook_not_found",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "webhook_not_found": {
                    "value": {
                      "error": {
                        "code": "webhook_not_found",
                        "message": "No webhook with that id belongs to this account.",
                        "request_id": "req_01hxyz",
                        "details": {}
                      }
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "invalid_parameter",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "invalid_parameter": {
                    "value": {
                      "error": {
                        "code": "invalid_parameter",
                        "message": "Invalid value for region (\"bavaria\" is not one of flanders, brussels, wallonia).",
                        "request_id": "req_01hxyz",
                        "details": {}
                      }
                    }
                  }
                }
              }
            }
          },
          "403": {
            "description": "plan_required",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "plan_required": {
                    "value": {
                      "error": {
                        "code": "plan_required",
                        "message": "'history' requires the pro plan or above.",
                        "request_id": "req_01hxyz",
                        "details": {}
                      }
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "unauthorized",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "unauthorized": {
                    "value": {
                      "error": {
                        "code": "unauthorized",
                        "message": "The API key (or session) is missing, malformed or has been revoked.",
                        "request_id": "req_01hxyz",
                        "details": {}
                      }
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "rate_limit_exceeded, quota_exceeded",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "rate_limit_exceeded": {
                    "value": {
                      "error": {
                        "code": "rate_limit_exceeded",
                        "message": "Too many requests. Slow down and retry after the interval in Retry-After.",
                        "request_id": "req_01hxyz",
                        "details": {}
                      }
                    }
                  },
                  "quota_exceeded": {
                    "value": {
                      "error": {
                        "code": "quota_exceeded",
                        "message": "This month's request quota has been used.",
                        "request_id": "req_01hxyz",
                        "details": {}
                      }
                    }
                  }
                }
              }
            }
          },
          "500": {
            "description": "internal_error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "internal_error": {
                    "value": {
                      "error": {
                        "code": "internal_error",
                        "message": "Something went wrong on our side.",
                        "request_id": "req_01hxyz",
                        "details": {}
                      }
                    }
                  }
                }
              }
            }
          },
          "504": {
            "description": "timeout",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "timeout": {
                    "value": {
                      "error": {
                        "code": "timeout",
                        "message": "The request took too long and was stopped. Retry it; a narrower filter or a smaller page is quicker.",
                        "request_id": "req_01hxyz",
                        "details": {}
                      }
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/v1/webhooks/{id}/enable": {
      "post": {
        "tags": [
          "Webhooks"
        ],
        "summary": "Switch a webhook back on",
        "description": "After 20 failed deliveries in a row an endpoint is switched off (`active: false`). This switches it on again with its failure count at zero, and answers the endpoint. Deliveries given up on while it was off are not resent; read them from the change feed.",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "schema": {
              "type": "string"
            },
            "description": "A `wh_` id.",
            "required": true
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data",
                    "meta"
                  ],
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/Webhook"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/Meta"
                    }
                  }
                }
              }
            }
          },
          "404": {
            "description": "webhook_not_found",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "webhook_not_found": {
                    "value": {
                      "error": {
                        "code": "webhook_not_found",
                        "message": "No webhook with that id belongs to this account.",
                        "request_id": "req_01hxyz",
                        "details": {}
                      }
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "invalid_parameter",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "invalid_parameter": {
                    "value": {
                      "error": {
                        "code": "invalid_parameter",
                        "message": "Invalid value for region (\"bavaria\" is not one of flanders, brussels, wallonia).",
                        "request_id": "req_01hxyz",
                        "details": {}
                      }
                    }
                  }
                }
              }
            }
          },
          "403": {
            "description": "plan_required",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "plan_required": {
                    "value": {
                      "error": {
                        "code": "plan_required",
                        "message": "'history' requires the pro plan or above.",
                        "request_id": "req_01hxyz",
                        "details": {}
                      }
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "unauthorized",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "unauthorized": {
                    "value": {
                      "error": {
                        "code": "unauthorized",
                        "message": "The API key (or session) is missing, malformed or has been revoked.",
                        "request_id": "req_01hxyz",
                        "details": {}
                      }
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "rate_limit_exceeded, quota_exceeded",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "rate_limit_exceeded": {
                    "value": {
                      "error": {
                        "code": "rate_limit_exceeded",
                        "message": "Too many requests. Slow down and retry after the interval in Retry-After.",
                        "request_id": "req_01hxyz",
                        "details": {}
                      }
                    }
                  },
                  "quota_exceeded": {
                    "value": {
                      "error": {
                        "code": "quota_exceeded",
                        "message": "This month's request quota has been used.",
                        "request_id": "req_01hxyz",
                        "details": {}
                      }
                    }
                  }
                }
              }
            }
          },
          "500": {
            "description": "internal_error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "internal_error": {
                    "value": {
                      "error": {
                        "code": "internal_error",
                        "message": "Something went wrong on our side.",
                        "request_id": "req_01hxyz",
                        "details": {}
                      }
                    }
                  }
                }
              }
            }
          },
          "504": {
            "description": "timeout",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "timeout": {
                    "value": {
                      "error": {
                        "code": "timeout",
                        "message": "The request took too long and was stopped. Retry it; a narrower filter or a smaller page is quicker.",
                        "request_id": "req_01hxyz",
                        "details": {}
                      }
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/v1/webhooks/{id}/rotate": {
      "post": {
        "tags": [
          "Webhooks"
        ],
        "summary": "Rotate the signing secret",
        "description": "The old secret stops verifying at once.",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "schema": {
              "type": "string"
            },
            "description": "A `wh_` id.",
            "required": true
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data",
                    "meta"
                  ],
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/WebhookWithSecret"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/Meta"
                    }
                  }
                }
              }
            }
          },
          "404": {
            "description": "webhook_not_found",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "webhook_not_found": {
                    "value": {
                      "error": {
                        "code": "webhook_not_found",
                        "message": "No webhook with that id belongs to this account.",
                        "request_id": "req_01hxyz",
                        "details": {}
                      }
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "invalid_parameter",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "invalid_parameter": {
                    "value": {
                      "error": {
                        "code": "invalid_parameter",
                        "message": "Invalid value for region (\"bavaria\" is not one of flanders, brussels, wallonia).",
                        "request_id": "req_01hxyz",
                        "details": {}
                      }
                    }
                  }
                }
              }
            }
          },
          "403": {
            "description": "plan_required",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "plan_required": {
                    "value": {
                      "error": {
                        "code": "plan_required",
                        "message": "'history' requires the pro plan or above.",
                        "request_id": "req_01hxyz",
                        "details": {}
                      }
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "unauthorized",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "unauthorized": {
                    "value": {
                      "error": {
                        "code": "unauthorized",
                        "message": "The API key (or session) is missing, malformed or has been revoked.",
                        "request_id": "req_01hxyz",
                        "details": {}
                      }
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "rate_limit_exceeded, quota_exceeded",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "rate_limit_exceeded": {
                    "value": {
                      "error": {
                        "code": "rate_limit_exceeded",
                        "message": "Too many requests. Slow down and retry after the interval in Retry-After.",
                        "request_id": "req_01hxyz",
                        "details": {}
                      }
                    }
                  },
                  "quota_exceeded": {
                    "value": {
                      "error": {
                        "code": "quota_exceeded",
                        "message": "This month's request quota has been used.",
                        "request_id": "req_01hxyz",
                        "details": {}
                      }
                    }
                  }
                }
              }
            }
          },
          "500": {
            "description": "internal_error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "internal_error": {
                    "value": {
                      "error": {
                        "code": "internal_error",
                        "message": "Something went wrong on our side.",
                        "request_id": "req_01hxyz",
                        "details": {}
                      }
                    }
                  }
                }
              }
            }
          },
          "504": {
            "description": "timeout",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "timeout": {
                    "value": {
                      "error": {
                        "code": "timeout",
                        "message": "The request took too long and was stopped. Retry it; a narrower filter or a smaller page is quicker.",
                        "request_id": "req_01hxyz",
                        "details": {}
                      }
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/v1/webhooks/{id}/test": {
      "post": {
        "tags": [
          "Webhooks"
        ],
        "summary": "Send a test delivery",
        "description": "Queues a signed ping.",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "schema": {
              "type": "string"
            },
            "description": "A `wh_` id.",
            "required": true
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "404": {
            "description": "webhook_not_found",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "webhook_not_found": {
                    "value": {
                      "error": {
                        "code": "webhook_not_found",
                        "message": "No webhook with that id belongs to this account.",
                        "request_id": "req_01hxyz",
                        "details": {}
                      }
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "invalid_parameter",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "invalid_parameter": {
                    "value": {
                      "error": {
                        "code": "invalid_parameter",
                        "message": "Invalid value for region (\"bavaria\" is not one of flanders, brussels, wallonia).",
                        "request_id": "req_01hxyz",
                        "details": {}
                      }
                    }
                  }
                }
              }
            }
          },
          "403": {
            "description": "plan_required",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "plan_required": {
                    "value": {
                      "error": {
                        "code": "plan_required",
                        "message": "'history' requires the pro plan or above.",
                        "request_id": "req_01hxyz",
                        "details": {}
                      }
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "unauthorized",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "unauthorized": {
                    "value": {
                      "error": {
                        "code": "unauthorized",
                        "message": "The API key (or session) is missing, malformed or has been revoked.",
                        "request_id": "req_01hxyz",
                        "details": {}
                      }
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "rate_limit_exceeded, quota_exceeded",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "rate_limit_exceeded": {
                    "value": {
                      "error": {
                        "code": "rate_limit_exceeded",
                        "message": "Too many requests. Slow down and retry after the interval in Retry-After.",
                        "request_id": "req_01hxyz",
                        "details": {}
                      }
                    }
                  },
                  "quota_exceeded": {
                    "value": {
                      "error": {
                        "code": "quota_exceeded",
                        "message": "This month's request quota has been used.",
                        "request_id": "req_01hxyz",
                        "details": {}
                      }
                    }
                  }
                }
              }
            }
          },
          "500": {
            "description": "internal_error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "internal_error": {
                    "value": {
                      "error": {
                        "code": "internal_error",
                        "message": "Something went wrong on our side.",
                        "request_id": "req_01hxyz",
                        "details": {}
                      }
                    }
                  }
                }
              }
            }
          },
          "504": {
            "description": "timeout",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "timeout": {
                    "value": {
                      "error": {
                        "code": "timeout",
                        "message": "The request took too long and was stopped. Retry it; a narrower filter or a smaller page is quicker.",
                        "request_id": "req_01hxyz",
                        "details": {}
                      }
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/v1/webhooks/{id}/deliveries": {
      "get": {
        "tags": [
          "Webhooks"
        ],
        "summary": "Recent deliveries",
        "description": "The last 50, newest first.",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "schema": {
              "type": "string"
            },
            "description": "A `wh_` id.",
            "required": true
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "404": {
            "description": "webhook_not_found",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "webhook_not_found": {
                    "value": {
                      "error": {
                        "code": "webhook_not_found",
                        "message": "No webhook with that id belongs to this account.",
                        "request_id": "req_01hxyz",
                        "details": {}
                      }
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "invalid_parameter",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "invalid_parameter": {
                    "value": {
                      "error": {
                        "code": "invalid_parameter",
                        "message": "Invalid value for region (\"bavaria\" is not one of flanders, brussels, wallonia).",
                        "request_id": "req_01hxyz",
                        "details": {}
                      }
                    }
                  }
                }
              }
            }
          },
          "403": {
            "description": "plan_required",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "plan_required": {
                    "value": {
                      "error": {
                        "code": "plan_required",
                        "message": "'history' requires the pro plan or above.",
                        "request_id": "req_01hxyz",
                        "details": {}
                      }
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "unauthorized",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "unauthorized": {
                    "value": {
                      "error": {
                        "code": "unauthorized",
                        "message": "The API key (or session) is missing, malformed or has been revoked.",
                        "request_id": "req_01hxyz",
                        "details": {}
                      }
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "rate_limit_exceeded, quota_exceeded",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "rate_limit_exceeded": {
                    "value": {
                      "error": {
                        "code": "rate_limit_exceeded",
                        "message": "Too many requests. Slow down and retry after the interval in Retry-After.",
                        "request_id": "req_01hxyz",
                        "details": {}
                      }
                    }
                  },
                  "quota_exceeded": {
                    "value": {
                      "error": {
                        "code": "quota_exceeded",
                        "message": "This month's request quota has been used.",
                        "request_id": "req_01hxyz",
                        "details": {}
                      }
                    }
                  }
                }
              }
            }
          },
          "500": {
            "description": "internal_error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "internal_error": {
                    "value": {
                      "error": {
                        "code": "internal_error",
                        "message": "Something went wrong on our side.",
                        "request_id": "req_01hxyz",
                        "details": {}
                      }
                    }
                  }
                }
              }
            }
          },
          "504": {
            "description": "timeout",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "timeout": {
                    "value": {
                      "error": {
                        "code": "timeout",
                        "message": "The request took too long and was stopped. Retry it; a narrower filter or a smaller page is quicker.",
                        "request_id": "req_01hxyz",
                        "details": {}
                      }
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/mcp": {
      "post": {
        "tags": [
          "MCP"
        ],
        "summary": "Model Context Protocol server",
        "description": "Streamable HTTP, stateless: POST one JSON-RPC message (or a batch). Tools: search_subsidies, get_subsidy, match_company, explain_eligibility, list_changes, list_sources. Same key, limits and answers as the REST API.",
        "parameters": [],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "401": {
            "description": "unauthorized",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "unauthorized": {
                    "value": {
                      "error": {
                        "code": "unauthorized",
                        "message": "The API key (or session) is missing, malformed or has been revoked.",
                        "request_id": "req_01hxyz",
                        "details": {}
                      }
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "rate_limit_exceeded, quota_exceeded",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "rate_limit_exceeded": {
                    "value": {
                      "error": {
                        "code": "rate_limit_exceeded",
                        "message": "Too many requests. Slow down and retry after the interval in Retry-After.",
                        "request_id": "req_01hxyz",
                        "details": {}
                      }
                    }
                  },
                  "quota_exceeded": {
                    "value": {
                      "error": {
                        "code": "quota_exceeded",
                        "message": "This month's request quota has been used.",
                        "request_id": "req_01hxyz",
                        "details": {}
                      }
                    }
                  }
                }
              }
            }
          },
          "500": {
            "description": "internal_error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "internal_error": {
                    "value": {
                      "error": {
                        "code": "internal_error",
                        "message": "Something went wrong on our side.",
                        "request_id": "req_01hxyz",
                        "details": {}
                      }
                    }
                  }
                }
              }
            }
          },
          "504": {
            "description": "timeout",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "timeout": {
                    "value": {
                      "error": {
                        "code": "timeout",
                        "message": "The request took too long and was stopped. Retry it; a narrower filter or a smaller page is quicker.",
                        "request_id": "req_01hxyz",
                        "details": {}
                      }
                    }
                  }
                }
              }
            }
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object"
              },
              "example": {
                "jsonrpc": "2.0",
                "id": 1,
                "method": "tools/list"
              }
            }
          }
        }
      }
    }
  },
  "components": {
    "securitySchemes": {
      "bearer": {
        "type": "http",
        "scheme": "bearer",
        "description": "sb_live_... or sb_test_..."
      },
      "apiKey": {
        "type": "apiKey",
        "in": "header",
        "name": "X-API-Key"
      }
    },
    "schemas": {
      "Status": {
        "type": "string",
        "enum": [
          "forthcoming",
          "open",
          "continuous",
          "paused",
          "budget_exhausted",
          "closed",
          "unknown"
        ]
      },
      "StatusBasis": {
        "type": "string",
        "enum": [
          "source",
          "dates",
          "rolling",
          "unknown"
        ]
      },
      "InstrumentType": {
        "type": "string",
        "enum": [
          "grant",
          "rebate",
          "voucher",
          "tax_credit",
          "tax_deduction",
          "tax_exemption",
          "social_security_reduction",
          "wage_subsidy",
          "loan",
          "guarantee",
          "repayable_advance",
          "equity",
          "in_kind",
          "prize",
          "other"
        ]
      },
      "GovernmentLevel": {
        "type": "string",
        "enum": [
          "eu",
          "federal",
          "community",
          "region",
          "province",
          "municipality",
          "agency",
          "other"
        ]
      },
      "Region": {
        "type": "string",
        "enum": [
          "flanders",
          "brussels",
          "wallonia"
        ]
      },
      "Province": {
        "type": "string",
        "enum": [
          "antwerp",
          "limburg",
          "east_flanders",
          "west_flanders",
          "flemish_brabant",
          "walloon_brabant",
          "hainaut",
          "liege",
          "luxembourg",
          "namur"
        ]
      },
      "Scope": {
        "type": "string",
        "enum": [
          "eu",
          "national",
          "regional",
          "provincial",
          "local"
        ]
      },
      "CompanySize": {
        "type": "string",
        "enum": [
          "micro",
          "small",
          "medium",
          "large"
        ]
      },
      "ApplicantType": {
        "type": "string",
        "enum": [
          "company",
          "self_employed",
          "non_profit",
          "public_body",
          "research_organisation",
          "individual",
          "farmer",
          "social_enterprise"
        ]
      },
      "ApplicationChannel": {
        "type": "string",
        "enum": [
          "online",
          "email",
          "portal",
          "paper",
          "automatic",
          "unknown"
        ]
      },
      "RightsMode": {
        "type": "string",
        "enum": [
          "open_licence",
          "facts_only",
          "link_only",
          "blocked"
        ]
      },
      "SummaryBasis": {
        "type": "string",
        "enum": [
          "generated",
          "source"
        ]
      },
      "RulesBasis": {
        "type": "string",
        "enum": [
          "none",
          "derived",
          "extracted",
          "curated"
        ]
      },
      "CostType": {
        "type": "string",
        "enum": [
          "training",
          "consultancy",
          "equipment",
          "buildings",
          "software",
          "personnel",
          "research",
          "prototyping",
          "marketing",
          "trade_fairs",
          "travel",
          "intellectual_property",
          "certification",
          "recruitment",
          "vehicles",
          "energy",
          "subcontracting",
          "other"
        ]
      },
      "NaceMode": {
        "type": "string",
        "enum": [
          "included",
          "excluded"
        ]
      },
      "SourceRole": {
        "type": "string",
        "enum": [
          "primary",
          "secondary"
        ]
      },
      "ExtractionMethod": {
        "type": "string",
        "enum": [
          "structured",
          "html_section",
          "text_pattern",
          "source_category",
          "keywords",
          "curated",
          "derived"
        ]
      },
      "Topic": {
        "type": "string",
        "enum": [
          "digitalisation",
          "cybersecurity",
          "artificial_intelligence",
          "innovation",
          "research_development",
          "energy_efficiency",
          "renewable_energy",
          "energy",
          "climate_environment",
          "circular_economy",
          "sustainable_mobility",
          "investment",
          "training",
          "advice_consultancy",
          "internationalisation",
          "hiring_employment",
          "starting_business",
          "growth_scaleup",
          "financing",
          "transformation",
          "agriculture",
          "fisheries",
          "tourism_hospitality",
          "culture_creative",
          "construction_renovation",
          "health_life_sciences",
          "social_economy",
          "retail_commerce",
          "water",
          "manufacturing",
          "intellectual_property",
          "inclusion_diversity",
          "cooperation",
          "space_defence",
          "crisis_support",
          "housing",
          "family_care",
          "education"
        ]
      },
      "Field": {
        "type": "string",
        "enum": [
          "company.regions",
          "company.province",
          "company.size",
          "company.employees",
          "company.turnover_eur",
          "company.balance_sheet_eur",
          "company.nace",
          "company.legal_form",
          "company.applicant_type",
          "company.age_years",
          "company.has_legal_personality",
          "company.de_minimis_received_eur",
          "company.in_difficulty",
          "project.topics",
          "project.budget_eur",
          "project.started",
          "project.region",
          "project.cost_types",
          "project.duration_months",
          "project.partners"
        ]
      },
      "Op": {
        "type": "string",
        "enum": [
          "eq",
          "ne",
          "in",
          "not_in",
          "contains_any",
          "contains_all",
          "contains_none",
          "gte",
          "gt",
          "lte",
          "lt",
          "between",
          "is_true",
          "is_false",
          "nace_any",
          "nace_none"
        ]
      },
      "ReviewStatus": {
        "type": "string",
        "enum": [
          "auto",
          "unreviewed",
          "verified"
        ]
      },
      "Outcome": {
        "type": "string",
        "enum": [
          "pass",
          "fail",
          "unknown"
        ]
      },
      "EventType": {
        "type": "string",
        "enum": [
          "subsidy.created",
          "subsidy.updated",
          "subsidy.status_changed",
          "subsidy.deadline_changed",
          "subsidy.funding_changed",
          "subsidy.eligibility_changed",
          "subsidy.closing_soon",
          "subsidy.removed",
          "match.created",
          "match.removed",
          "match.status_changed",
          "source.stale",
          "source.recovered"
        ]
      },
      "MatchStatus": {
        "type": "string",
        "enum": [
          "likely_eligible",
          "possibly_eligible",
          "needs_review",
          "not_eligible"
        ]
      },
      "Lang": {
        "type": "string",
        "enum": [
          "nl",
          "fr",
          "en",
          "de"
        ]
      },
      "ExternalId": {
        "type": "object",
        "properties": {
          "source": {
            "type": "string"
          },
          "id": {
            "type": "string"
          }
        },
        "required": [
          "source",
          "id"
        ],
        "description": "An identifier a source uses for this measure."
      },
      "Issuer": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "description": "A stable slug for the authority (`vlaio`, `innoviris`, `spw-economie`, `european-commission`)."
          },
          "name": {
            "type": "string"
          },
          "government_level": {
            "$ref": "#/components/schemas/GovernmentLevel"
          },
          "jurisdiction": {
            "type": "string",
            "description": "`be`, `flanders`, `brussels`, `wallonia`, `eu`, `german_community`, ..."
          },
          "url": {
            "type": [
              "string",
              "null"
            ]
          }
        },
        "required": [
          "id",
          "name",
          "government_level",
          "jurisdiction",
          "url"
        ]
      },
      "Programme": {
        "type": "object",
        "properties": {
          "name": {
            "type": [
              "string",
              "null"
            ]
          },
          "code": {
            "type": [
              "string",
              "null"
            ]
          },
          "call_id": {
            "type": [
              "string",
              "null"
            ]
          },
          "call_title": {
            "type": [
              "string",
              "null"
            ]
          },
          "topic_id": {
            "type": [
              "string",
              "null"
            ]
          },
          "types_of_action": {
            "type": "array",
            "items": {
              "type": "string"
            }
          }
        },
        "required": [
          "name",
          "code",
          "call_id",
          "call_title",
          "topic_id",
          "types_of_action"
        ],
        "description": "An EU call, or a numbered programme a national measure belongs to."
      },
      "Deadline": {
        "type": "object",
        "properties": {
          "at": {
            "type": "string",
            "format": "date-time"
          },
          "date_only": {
            "type": "boolean",
            "description": "The source gave a date and no time; `at` is then 23:59:59 Brussels time that day."
          },
          "label": {
            "type": [
              "string",
              "null"
            ],
            "description": "\"First stage\", \"Cut-off 2\", ..."
          }
        },
        "required": [
          "at",
          "date_only",
          "label"
        ]
      },
      "ApplicationWindow": {
        "type": "object",
        "properties": {
          "opens_at": {
            "type": [
              "string",
              "null"
            ],
            "format": "date-time"
          },
          "closes_at": {
            "type": [
              "string",
              "null"
            ],
            "format": "date-time",
            "description": "The next deadline still ahead, or the last one when all have passed."
          },
          "deadlines": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Deadline"
            },
            "description": "Every deadline, earliest first (multi-stage calls and cut-offs have several)."
          },
          "rolling": {
            "type": "boolean",
            "description": "Applications are accepted at any time."
          },
          "budget_exhaustion_possible": {
            "type": "boolean",
            "description": "First come, first served: the scheme can close before any deadline when the budget runs out, so a deadline alone does not say how long there is."
          }
        },
        "required": [
          "opens_at",
          "closes_at",
          "deadlines",
          "rolling",
          "budget_exhaustion_possible"
        ]
      },
      "RateTier": {
        "type": "object",
        "properties": {
          "company_size": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/CompanySize"
              },
              {
                "type": "null"
              }
            ]
          },
          "rate": {
            "type": "number",
            "description": "Percent of eligible costs."
          },
          "note": {
            "type": [
              "string",
              "null"
            ]
          }
        },
        "required": [
          "company_size",
          "rate",
          "note"
        ],
        "description": "A support rate that depends on who applies."
      },
      "Funding": {
        "type": "object",
        "properties": {
          "currency": {
            "type": "string"
          },
          "rate_min": {
            "type": [
              "number",
              "null"
            ],
            "description": "Percent of eligible costs, 0 to 100."
          },
          "rate_max": {
            "type": [
              "number",
              "null"
            ]
          },
          "rates": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/RateTier"
            }
          },
          "amount_min": {
            "type": [
              "number",
              "null"
            ]
          },
          "amount_max": {
            "type": [
              "number",
              "null"
            ]
          },
          "annual_cap": {
            "type": [
              "number",
              "null"
            ],
            "description": "A ceiling per beneficiary per year (the SME wallet's €7,500)."
          },
          "programme_budget": {
            "type": [
              "number",
              "null"
            ],
            "description": "The whole call's or scheme's budget."
          },
          "expected_grants": {
            "type": [
              "integer",
              "null"
            ],
            "minimum": 0
          },
          "min_project_cost": {
            "type": [
              "number",
              "null"
            ],
            "description": "A minimum project size to qualify at all."
          },
          "calculation_basis": {
            "allOf": [
              {
                "$ref": "#/components/schemas/Localized"
              }
            ],
            "description": "Generated text explaining how the amount is computed, when that is known."
          },
          "de_minimis": {
            "type": [
              "boolean",
              "null"
            ],
            "description": "Granted under the de minimis regulation (EU 2023/2831, €300,000 over three years). `None`: the source does not say."
          }
        },
        "required": [
          "currency",
          "rate_min",
          "rate_max",
          "rates",
          "amount_min",
          "amount_max",
          "annual_cap",
          "programme_budget",
          "expected_grants",
          "min_project_cost",
          "calculation_basis",
          "de_minimis"
        ]
      },
      "Geography": {
        "type": "object",
        "properties": {
          "scope": {
            "$ref": "#/components/schemas/Scope"
          },
          "countries": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "ISO 3166-1 alpha-2. `[\"BE\"]` for every Belgian measure; for an EU call, the member states are implied and the list is empty."
          },
          "regions": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Region"
            }
          },
          "provinces": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Province"
            }
          },
          "municipalities": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "nis_codes": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "nuts_codes": {
            "type": "array",
            "items": {
              "type": "string"
            }
          }
        },
        "required": [
          "scope",
          "countries",
          "regions",
          "provinces",
          "municipalities",
          "nis_codes",
          "nuts_codes"
        ]
      },
      "NaceRule": {
        "type": "object",
        "properties": {
          "version": {
            "type": "string",
            "description": "`2025` (NACE-BEL 2025) or `2008`."
          },
          "code": {
            "type": "string",
            "description": "A code or a prefix of one, dots removed: `62`, `6201`, `62010`. A section letter (`A`) covers the whole section."
          },
          "mode": {
            "$ref": "#/components/schemas/NaceMode"
          }
        },
        "required": [
          "version",
          "code",
          "mode"
        ]
      },
      "Eligibility": {
        "type": "object",
        "properties": {
          "applicant_types": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/ApplicantType"
            },
            "description": "Empty means the source does not restrict (or does not say)."
          },
          "company_sizes": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/CompanySize"
            }
          },
          "nace": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/NaceRule"
            }
          },
          "topics": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Topic"
            },
            "description": "Keys from [`crate::taxonomy::Topic`], for search and relevance. Not rules."
          },
          "eligible_costs": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/CostType"
            }
          },
          "rules": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/RuleNode"
            },
            "description": "Machine-evaluable conditions, all of which must hold. See [`crate::rules`]."
          },
          "rules_basis": {
            "$ref": "#/components/schemas/RulesBasis"
          },
          "confidence": {
            "type": "number",
            "description": "How much of what decides eligibility the rules capture, 0 to 1. Curated rules score high; a measure whose conditions are only prose scores low, and its matches say `needs_review` rather than `likely_eligible`."
          }
        },
        "required": [
          "applicant_types",
          "company_sizes",
          "nace",
          "topics",
          "eligible_costs",
          "rules",
          "rules_basis",
          "confidence"
        ]
      },
      "Application": {
        "type": "object",
        "properties": {
          "url": {
            "type": [
              "string",
              "null"
            ],
            "description": "Where to apply, or the official page describing how."
          },
          "channel": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/ApplicationChannel"
              },
              {
                "type": "null"
              }
            ]
          },
          "portal": {
            "type": [
              "string",
              "null"
            ],
            "description": "The portal's name, when there is one (`VLAIO e-loket`)."
          },
          "documents": {
            "type": "array",
            "items": {
              "type": "string"
            }
          }
        },
        "required": [
          "url",
          "channel",
          "portal",
          "documents"
        ]
      },
      "SourceRef": {
        "type": "object",
        "properties": {
          "source_id": {
            "type": "string"
          },
          "external_id": {
            "type": "string"
          },
          "url": {
            "type": "string"
          },
          "role": {
            "$ref": "#/components/schemas/SourceRole"
          }
        },
        "required": [
          "source_id",
          "external_id",
          "url",
          "role"
        ]
      },
      "FieldSource": {
        "type": "object",
        "properties": {
          "source_id": {
            "type": "string"
          },
          "method": {
            "$ref": "#/components/schemas/ExtractionMethod"
          },
          "section": {
            "type": [
              "string",
              "null"
            ],
            "description": "The source's section heading or field name."
          }
        },
        "required": [
          "source_id",
          "method",
          "section"
        ],
        "description": "Where one field's value came from."
      },
      "Provenance": {
        "type": "object",
        "properties": {
          "source_id": {
            "type": "string"
          },
          "source_url": {
            "type": "string"
          },
          "source_license": {
            "type": [
              "string",
              "null"
            ]
          },
          "rights_mode": {
            "$ref": "#/components/schemas/RightsMode"
          },
          "attribution": {
            "type": [
              "string",
              "null"
            ],
            "description": "The attribution the licence asks for, when it asks."
          },
          "source_last_modified_at": {
            "type": [
              "string",
              "null"
            ],
            "format": "date-time",
            "description": "The source's own \"last modified\" statement, which is not when we fetched it."
          },
          "first_seen_at": {
            "type": "string",
            "format": "date-time"
          },
          "last_checked_at": {
            "type": "string",
            "format": "date-time",
            "description": "When a source was last fetched and still said this. Volatile: excluded from the content hash, so that checking does not look like changing."
          },
          "content_hash": {
            "type": "string",
            "description": "SHA-256 of the record without its volatile fields. Filled in by the store."
          },
          "sources": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/SourceRef"
            },
            "description": "Every source that describes this measure, the primary first."
          },
          "fields": {
            "type": "object",
            "additionalProperties": {
              "$ref": "#/components/schemas/FieldSource"
            },
            "description": "Field path -> where its value came from, for the fields a decision rests on."
          }
        },
        "required": [
          "source_id",
          "source_url",
          "source_license",
          "rights_mode",
          "attribution",
          "source_last_modified_at",
          "first_seen_at",
          "last_checked_at",
          "content_hash",
          "sources",
          "fields"
        ]
      },
      "Subsidy": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "description": "`<source>:<source's own id or slug>`, minted once and never changed."
          },
          "slug": {
            "type": "string",
            "description": "For URLs on the website, in the measure's primary language."
          },
          "external_ids": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/ExternalId"
            }
          },
          "titles": {
            "$ref": "#/components/schemas/Localized"
          },
          "summaries": {
            "$ref": "#/components/schemas/Localized"
          },
          "summary_basis": {
            "$ref": "#/components/schemas/SummaryBasis"
          },
          "status": {
            "$ref": "#/components/schemas/Status"
          },
          "status_basis": {
            "$ref": "#/components/schemas/StatusBasis"
          },
          "status_note": {
            "allOf": [
              {
                "$ref": "#/components/schemas/Localized"
              }
            ],
            "description": "Why the status is what it is, when the source said so in words (a suspension, a budget notice)."
          },
          "instrument_type": {
            "$ref": "#/components/schemas/InstrumentType"
          },
          "issuer": {
            "$ref": "#/components/schemas/Issuer"
          },
          "programme": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/Programme"
              },
              {
                "type": "null"
              }
            ]
          },
          "application_window": {
            "$ref": "#/components/schemas/ApplicationWindow"
          },
          "funding": {
            "$ref": "#/components/schemas/Funding"
          },
          "geography": {
            "$ref": "#/components/schemas/Geography"
          },
          "eligibility": {
            "$ref": "#/components/schemas/Eligibility"
          },
          "application": {
            "$ref": "#/components/schemas/Application"
          },
          "legal_basis": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "provenance": {
            "$ref": "#/components/schemas/Provenance"
          }
        },
        "required": [
          "id",
          "slug",
          "external_ids",
          "titles",
          "summaries",
          "summary_basis",
          "status",
          "status_basis",
          "status_note",
          "instrument_type",
          "issuer",
          "programme",
          "application_window",
          "funding",
          "geography",
          "eligibility",
          "application",
          "legal_basis",
          "provenance"
        ]
      },
      "Localized": {
        "type": "object",
        "properties": {
          "nl": {
            "type": [
              "string",
              "null"
            ]
          },
          "fr": {
            "type": [
              "string",
              "null"
            ]
          },
          "en": {
            "type": [
              "string",
              "null"
            ]
          },
          "de": {
            "type": [
              "string",
              "null"
            ]
          }
        },
        "required": [
          "nl",
          "fr",
          "en",
          "de"
        ],
        "description": "One string per language. Absent means the source did not provide it."
      },
      "RuleProvenance": {
        "type": "object",
        "properties": {
          "method": {
            "$ref": "#/components/schemas/ExtractionMethod"
          },
          "source_url": {
            "type": [
              "string",
              "null"
            ]
          },
          "source_section": {
            "type": [
              "string",
              "null"
            ],
            "description": "The heading of the section the rule was read from (\"Wie komt in aanmerking?\")."
          },
          "review_status": {
            "$ref": "#/components/schemas/ReviewStatus"
          },
          "reviewed_at": {
            "type": [
              "string",
              "null"
            ],
            "description": "`YYYY-MM-DD`, for verified rules."
          },
          "note": {
            "type": [
              "string",
              "null"
            ]
          }
        },
        "required": [
          "method",
          "source_url",
          "source_section",
          "review_status",
          "reviewed_at",
          "note"
        ]
      },
      "Condition": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "description": "Stable within its measure (`region`, `size`, `age`), so a change feed can say which rule changed."
          },
          "field": {
            "$ref": "#/components/schemas/Field"
          },
          "op": {
            "$ref": "#/components/schemas/Op"
          },
          "value": {},
          "label": {
            "allOf": [
              {
                "$ref": "#/components/schemas/Localized"
              }
            ],
            "description": "A label brought by the rule; when empty, one is generated."
          },
          "provenance": {
            "$ref": "#/components/schemas/RuleProvenance"
          }
        },
        "required": [
          "id",
          "field",
          "op",
          "value",
          "provenance"
        ]
      },
      "ConditionResult": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string"
          },
          "field": {
            "$ref": "#/components/schemas/Field"
          },
          "op": {
            "$ref": "#/components/schemas/Op"
          },
          "value": {},
          "label": {
            "type": "string"
          },
          "result": {
            "$ref": "#/components/schemas/Outcome"
          },
          "actual": {
            "description": "What the company's fact was, when there was one."
          },
          "provenance": {
            "$ref": "#/components/schemas/RuleProvenance"
          }
        },
        "required": [
          "id",
          "field",
          "op",
          "value",
          "label",
          "result",
          "actual",
          "provenance"
        ],
        "description": "One evaluated condition, for the \"reasons\" of a match."
      },
      "RuleNode": {
        "description": "A rule tree node: a condition, or all/any/not of nodes. A measure's `rules` list is an implicit all.",
        "oneOf": [
          {
            "$ref": "#/components/schemas/Condition"
          },
          {
            "type": "object",
            "required": [
              "all"
            ],
            "properties": {
              "all": {
                "type": "array",
                "items": {
                  "$ref": "#/components/schemas/RuleNode"
                }
              }
            }
          },
          {
            "type": "object",
            "required": [
              "any"
            ],
            "properties": {
              "any": {
                "type": "array",
                "items": {
                  "$ref": "#/components/schemas/RuleNode"
                }
              }
            }
          },
          {
            "type": "object",
            "required": [
              "not"
            ],
            "properties": {
              "not": {
                "$ref": "#/components/schemas/RuleNode"
              }
            }
          }
        ]
      },
      "CompanyInput": {
        "type": "object",
        "properties": {
          "enterprise_number": {
            "type": [
              "string",
              "null"
            ],
            "description": "KBO/BCE number, validated (mod 97) and echoed back normalised. An identifier only: no register is consulted, so it adds no facts by itself."
          },
          "postcode": {
            "type": [
              "string",
              "null"
            ],
            "description": "The postcode of the seat or the operating unit concerned; decides region and province when those are not given."
          },
          "region": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/Region"
              },
              {
                "type": "null"
              }
            ],
            "description": "Shorthand for `regions: [region]`."
          },
          "regions": {
            "type": [
              "array",
              "null"
            ],
            "items": {
              "$ref": "#/components/schemas/Region"
            },
            "description": "Every region the company has an establishment in."
          },
          "province": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/Province"
              },
              {
                "type": "null"
              }
            ]
          },
          "size": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/CompanySize"
              },
              {
                "type": "null"
              }
            ],
            "description": "`micro`, `small`, `medium`, `large`. Derived from the figures below when absent."
          },
          "employees": {
            "type": [
              "number",
              "null"
            ]
          },
          "turnover_eur": {
            "type": [
              "number",
              "null"
            ]
          },
          "balance_sheet_eur": {
            "type": [
              "number",
              "null"
            ]
          },
          "nace": {
            "type": [
              "array",
              "null"
            ],
            "items": {
              "type": "string"
            },
            "description": "NACE codes, with or without dots (`62.010`, `62010`), at least the two-digit division. A section letter (`J`) is refused: it cannot say which division's rules apply."
          },
          "legal_form": {
            "type": [
              "string",
              "null"
            ],
            "description": "`bv`, `nv`, `cv`, `vzw`, `eenmanszaak`, ... (Dutch or French abbreviations)."
          },
          "applicant_type": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/ApplicantType"
              },
              {
                "type": "null"
              }
            ]
          },
          "founded_on": {
            "type": [
              "string",
              "null"
            ],
            "format": "date"
          },
          "age_years": {
            "type": [
              "number",
              "null"
            ]
          },
          "has_legal_personality": {
            "type": [
              "boolean",
              "null"
            ]
          },
          "de_minimis_received_eur": {
            "type": [
              "number",
              "null"
            ]
          },
          "in_difficulty": {
            "type": [
              "boolean",
              "null"
            ]
          }
        },
        "required": [],
        "description": "What a caller tells us about the company. Every field is optional; what is missing is unknown, and the response says what it would have needed.",
        "additionalProperties": false
      },
      "ProjectInput": {
        "type": "object",
        "properties": {
          "topics": {
            "type": [
              "array",
              "null"
            ],
            "items": {
              "$ref": "#/components/schemas/Topic"
            }
          },
          "budget_eur": {
            "type": [
              "number",
              "null"
            ]
          },
          "started": {
            "type": [
              "boolean",
              "null"
            ]
          },
          "planned_start": {
            "type": [
              "string",
              "null"
            ],
            "format": "date",
            "description": "Derives `started` when that is not given."
          },
          "region": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/Region"
              },
              {
                "type": "null"
              }
            ]
          },
          "cost_types": {
            "type": [
              "array",
              "null"
            ],
            "items": {
              "$ref": "#/components/schemas/CostType"
            }
          },
          "duration_months": {
            "type": [
              "number",
              "null"
            ]
          },
          "partners": {
            "type": [
              "number",
              "null"
            ]
          }
        },
        "required": [],
        "additionalProperties": false
      },
      "Derivation": {
        "type": "object",
        "properties": {
          "field": {
            "$ref": "#/components/schemas/Field"
          },
          "value": {},
          "from": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "The request properties it came from."
          },
          "estimate": {
            "type": "boolean",
            "description": "True when it rests on an assumption (a size from headcount alone, a project region taken from the company's only region)."
          }
        },
        "required": [
          "field",
          "value",
          "from",
          "estimate"
        ],
        "description": "A fact we worked out rather than were given."
      },
      "Unknown": {
        "type": "object",
        "properties": {
          "field": {
            "$ref": "#/components/schemas/Field"
          },
          "request_path": {
            "type": "string",
            "description": "The request property that would supply it."
          },
          "question": {
            "type": "string"
          }
        },
        "required": [
          "field",
          "request_path",
          "question"
        ],
        "description": "A missing fact, as a question."
      },
      "Estimate": {
        "type": "object",
        "properties": {
          "max_amount_eur": {
            "type": [
              "number",
              "null"
            ],
            "description": "What the measure could be worth for the project, in euros: the budget times the rate for this company's size, capped by the maximum amount. Indicative."
          },
          "rate_applied": {
            "type": [
              "number",
              "null"
            ]
          },
          "basis": {
            "type": "string"
          }
        },
        "required": [
          "max_amount_eur",
          "rate_applied",
          "basis"
        ]
      },
      "MatchOptions": {
        "type": "object",
        "properties": {
          "include_not_eligible": {
            "type": "boolean",
            "description": "Include measures a rule rules out, with the reason. Off by default."
          },
          "statuses": {
            "type": [
              "array",
              "null"
            ],
            "items": {
              "$ref": "#/components/schemas/Status"
            },
            "description": "Statuses to consider. Default: open, continuous, forthcoming and unknown."
          },
          "instrument_types": {
            "type": [
              "array",
              "null"
            ],
            "items": {
              "$ref": "#/components/schemas/InstrumentType"
            }
          },
          "include_unrelated": {
            "type": "boolean",
            "description": "With project topics given, a measure sharing none of them is left out unless this is set."
          }
        },
        "required": [],
        "description": "What a request asks to see.",
        "additionalProperties": false
      },
      "MatchResult": {
        "type": "object",
        "properties": {
          "subsidy_id": {
            "type": "string"
          },
          "match_status": {
            "$ref": "#/components/schemas/MatchStatus"
          },
          "confidence": {
            "type": "number",
            "description": "0 to 1: how far the rules we hold capture what decides eligibility for this measure."
          },
          "relevance": {
            "type": "number",
            "description": "0 to 1: how well the measure's topics fit the project's."
          },
          "score": {
            "type": "number",
            "description": "0 to 1: the ranking within a match status group. Topic fit, the match status, rule confidence, whether the measure can be applied for now, and how close to the company it is decided, less a little for every fact still unknown."
          },
          "reasons": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/ConditionResult"
            }
          },
          "unknowns": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Unknown"
            }
          },
          "matched_topics": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Topic"
            }
          },
          "estimate": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/Estimate"
              },
              {
                "type": "null"
              }
            ]
          }
        },
        "required": [
          "subsidy_id",
          "match_status",
          "confidence",
          "relevance",
          "score",
          "reasons",
          "unknowns",
          "matched_topics",
          "estimate"
        ]
      },
      "FieldChange": {
        "type": "object",
        "properties": {
          "field": {
            "type": "string",
            "description": "Dotted path: `application_window.closes_at`, `funding.amount_max`, `eligibility.rules[size]`."
          },
          "before": {},
          "after": {}
        },
        "required": [
          "field",
          "before",
          "after"
        ]
      },
      "Freshness": {
        "type": "object",
        "required": [
          "state",
          "last_successful_fetch",
          "expected_refresh_seconds",
          "stale_after_seconds"
        ],
        "properties": {
          "state": {
            "type": "string",
            "enum": [
              "fresh",
              "delayed",
              "stale",
              "source_unavailable",
              "parse_error",
              "needs_review",
              "disabled",
              "never_run"
            ]
          },
          "last_successful_fetch": {
            "type": [
              "string",
              "null"
            ],
            "format": "date-time"
          },
          "expected_refresh_seconds": {
            "type": "integer"
          },
          "stale_after_seconds": {
            "type": "integer"
          }
        }
      },
      "Links": {
        "type": "object",
        "required": [
          "self",
          "versions",
          "official",
          "web"
        ],
        "properties": {
          "self": {
            "type": "string"
          },
          "versions": {
            "type": "string"
          },
          "official": {
            "type": "string",
            "description": "The authority's own page."
          },
          "web": {
            "type": "string",
            "description": "This measure on the website, in the language asked for."
          }
        }
      },
      "SubsidyFull": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "description": "`<source>:<source's own id or slug>`, minted once and never changed."
          },
          "slug": {
            "type": "string",
            "description": "For URLs on the website, in the measure's primary language."
          },
          "external_ids": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/ExternalId"
            }
          },
          "titles": {
            "$ref": "#/components/schemas/Localized"
          },
          "summaries": {
            "$ref": "#/components/schemas/Localized"
          },
          "summary_basis": {
            "$ref": "#/components/schemas/SummaryBasis"
          },
          "status": {
            "$ref": "#/components/schemas/Status"
          },
          "status_basis": {
            "$ref": "#/components/schemas/StatusBasis"
          },
          "status_note": {
            "allOf": [
              {
                "$ref": "#/components/schemas/Localized"
              }
            ],
            "description": "Why the status is what it is, when the source said so in words (a suspension, a budget notice)."
          },
          "instrument_type": {
            "$ref": "#/components/schemas/InstrumentType"
          },
          "issuer": {
            "$ref": "#/components/schemas/Issuer"
          },
          "programme": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/Programme"
              },
              {
                "type": "null"
              }
            ]
          },
          "application_window": {
            "$ref": "#/components/schemas/ApplicationWindow"
          },
          "funding": {
            "$ref": "#/components/schemas/Funding"
          },
          "geography": {
            "$ref": "#/components/schemas/Geography"
          },
          "eligibility": {
            "$ref": "#/components/schemas/Eligibility"
          },
          "application": {
            "$ref": "#/components/schemas/Application"
          },
          "legal_basis": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "provenance": {
            "$ref": "#/components/schemas/Provenance"
          },
          "title": {
            "type": "string",
            "description": "The title in the language asked for, falling back to the languages the source provides."
          },
          "summary": {
            "type": [
              "string",
              "null"
            ]
          },
          "summary_origin": {
            "type": "string",
            "enum": [
              "source",
              "generated"
            ],
            "description": "Where the summary served in this language comes from: the source's own text (open-licence sources only) or generated by us from the facts. `summary_basis` speaks for the record as a whole."
          },
          "language": {
            "$ref": "#/components/schemas/Lang"
          },
          "version": {
            "type": "integer"
          },
          "first_seen_at": {
            "type": "string",
            "format": "date-time"
          },
          "last_changed_at": {
            "type": "string",
            "format": "date-time"
          },
          "withdrawn_at": {
            "type": [
              "string",
              "null"
            ],
            "format": "date-time",
            "description": "The source stopped listing it."
          },
          "freshness": {
            "$ref": "#/components/schemas/Freshness"
          },
          "links": {
            "$ref": "#/components/schemas/Links"
          },
          "disclaimer": {
            "type": "string"
          },
          "rules_readable": {
            "type": "object",
            "required": [
              "conditions",
              "text"
            ],
            "description": "The eligibility rules in the language asked for: every condition with a generated label and its provenance, and each top-level rule as one sentence. The tree itself stays in `eligibility.rules`.",
            "properties": {
              "conditions": {
                "type": "array",
                "items": {
                  "type": "object",
                  "required": [
                    "id",
                    "field",
                    "op",
                    "value",
                    "label",
                    "provenance"
                  ],
                  "properties": {
                    "id": {
                      "type": "string"
                    },
                    "field": {
                      "type": "string"
                    },
                    "op": {
                      "type": "string"
                    },
                    "value": {},
                    "label": {
                      "type": "string"
                    },
                    "provenance": {
                      "type": "object"
                    }
                  }
                }
              },
              "text": {
                "type": "array",
                "items": {
                  "type": "string"
                }
              }
            }
          }
        },
        "required": [
          "id",
          "slug",
          "external_ids",
          "titles",
          "summaries",
          "summary_basis",
          "status",
          "status_basis",
          "status_note",
          "instrument_type",
          "issuer",
          "programme",
          "application_window",
          "funding",
          "geography",
          "eligibility",
          "application",
          "legal_basis",
          "provenance",
          "title",
          "summary",
          "summary_origin",
          "language",
          "version",
          "first_seen_at",
          "last_changed_at",
          "withdrawn_at",
          "freshness",
          "links",
          "disclaimer",
          "rules_readable"
        ],
        "description": "A support measure, normalised. The canonical record plus what the read path knows about it."
      },
      "SubsidyCompact": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string"
          },
          "slug": {
            "type": "string"
          },
          "title": {
            "type": "string"
          },
          "summary": {
            "type": [
              "string",
              "null"
            ]
          },
          "summary_origin": {
            "type": "string",
            "enum": [
              "source",
              "generated"
            ]
          },
          "titles": {
            "$ref": "#/components/schemas/Localized"
          },
          "status": {
            "$ref": "#/components/schemas/Status"
          },
          "instrument_type": {
            "$ref": "#/components/schemas/InstrumentType"
          },
          "issuer": {
            "$ref": "#/components/schemas/Issuer"
          },
          "scope": {
            "$ref": "#/components/schemas/Scope"
          },
          "regions": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Region"
            }
          },
          "topics": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Topic"
            }
          },
          "company_sizes": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/CompanySize"
            }
          },
          "opens_at": {
            "type": [
              "string",
              "null"
            ],
            "format": "date-time"
          },
          "closes_at": {
            "type": [
              "string",
              "null"
            ],
            "format": "date-time"
          },
          "rolling": {
            "type": "boolean"
          },
          "rate_max": {
            "type": [
              "number",
              "null"
            ]
          },
          "amount_max": {
            "type": [
              "number",
              "null"
            ]
          },
          "annual_cap": {
            "type": [
              "number",
              "null"
            ]
          },
          "rules_basis": {
            "$ref": "#/components/schemas/RulesBasis"
          },
          "source_id": {
            "type": "string"
          },
          "rights_mode": {
            "$ref": "#/components/schemas/RightsMode"
          },
          "version": {
            "type": "integer"
          },
          "last_changed_at": {
            "type": "string",
            "format": "date-time"
          },
          "last_checked_at": {
            "type": "string",
            "format": "date-time"
          },
          "freshness": {
            "$ref": "#/components/schemas/Freshness"
          },
          "links": {
            "$ref": "#/components/schemas/Links"
          }
        },
        "required": [
          "id",
          "slug",
          "title",
          "summary",
          "summary_origin",
          "titles",
          "status",
          "instrument_type",
          "issuer",
          "scope",
          "regions",
          "topics",
          "company_sizes",
          "opens_at",
          "closes_at",
          "rolling",
          "rate_max",
          "amount_max",
          "annual_cap",
          "rules_basis",
          "source_id",
          "rights_mode",
          "version",
          "last_changed_at",
          "last_checked_at",
          "freshness",
          "links"
        ],
        "description": "The fields a list needs. `view=full` returns SubsidyFull instead."
      },
      "Meta": {
        "type": "object",
        "required": [
          "request_id",
          "warnings"
        ],
        "properties": {
          "request_id": {
            "type": "string"
          },
          "warnings": {
            "type": "array",
            "items": {
              "type": "string"
            }
          }
        }
      },
      "Pagination": {
        "type": "object",
        "required": [
          "has_more",
          "next_cursor",
          "limit"
        ],
        "properties": {
          "has_more": {
            "type": "boolean"
          },
          "next_cursor": {
            "type": [
              "string",
              "null"
            ],
            "description": "Pass back as `cursor` for the next page. Null on the last page of a list; the change feed sets it on every page, the last one included."
          },
          "limit": {
            "type": "integer"
          }
        }
      },
      "Error": {
        "type": "object",
        "required": [
          "error"
        ],
        "properties": {
          "error": {
            "type": "object",
            "required": [
              "code",
              "message",
              "request_id",
              "details"
            ],
            "properties": {
              "code": {
                "type": "string",
                "description": "Stable. Branch on this."
              },
              "message": {
                "type": "string"
              },
              "request_id": {
                "type": "string"
              },
              "details": {
                "type": "object"
              },
              "required_plan": {
                "type": "string"
              }
            }
          }
        }
      },
      "Version": {
        "type": "object",
        "required": [
          "version",
          "valid_from",
          "valid_to",
          "cause",
          "content_hash",
          "changes"
        ],
        "properties": {
          "version": {
            "type": "integer"
          },
          "valid_from": {
            "type": "string",
            "format": "date-time"
          },
          "valid_to": {
            "type": [
              "string",
              "null"
            ],
            "format": "date-time"
          },
          "cause": {
            "type": "string",
            "enum": [
              "source_change",
              "date_passed",
              "reprocess",
              "curation",
              "withdrawn",
              "closed_at_source",
              "restored",
              "merge"
            ]
          },
          "content_hash": {
            "type": "string"
          },
          "changes": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/FieldChange"
            }
          }
        }
      },
      "Change": {
        "type": "object",
        "required": [
          "id",
          "seq",
          "type",
          "categories",
          "subject",
          "subject_id",
          "version",
          "changes",
          "summary",
          "occurred_at"
        ],
        "properties": {
          "id": {
            "type": "string"
          },
          "seq": {
            "type": "integer",
            "description": "Monotonic; the cursor is built on it."
          },
          "type": {
            "$ref": "#/components/schemas/EventType"
          },
          "categories": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/EventType"
            }
          },
          "subject": {
            "type": "string",
            "enum": [
              "subsidy",
              "source"
            ]
          },
          "subject_id": {
            "type": "string"
          },
          "version": {
            "type": [
              "integer",
              "null"
            ]
          },
          "changes": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/FieldChange"
            }
          },
          "summary": {
            "type": "object",
            "description": "Title, status, deadline, regions, topics, url: enough to act without a second request."
          },
          "occurred_at": {
            "type": "string",
            "format": "date-time"
          }
        }
      },
      "Source": {
        "type": "object",
        "required": [
          "id",
          "name",
          "publisher",
          "homepage",
          "access",
          "rights",
          "enabled",
          "freshness",
          "measures"
        ],
        "properties": {
          "id": {
            "type": "string"
          },
          "name": {
            "type": "string"
          },
          "publisher": {
            "type": "string"
          },
          "homepage": {
            "type": "string"
          },
          "access": {
            "type": "string",
            "enum": [
              "open_dataset",
              "official_api",
              "html",
              "curated"
            ]
          },
          "rights": {
            "type": "object",
            "properties": {
              "mode": {
                "$ref": "#/components/schemas/RightsMode"
              },
              "licence": {
                "type": [
                  "string",
                  "null"
                ]
              },
              "licence_url": {
                "type": [
                  "string",
                  "null"
                ]
              },
              "attribution": {
                "type": [
                  "string",
                  "null"
                ]
              },
              "commercial_reuse": {
                "type": [
                  "string",
                  "null"
                ]
              }
            }
          },
          "enabled": {
            "type": "boolean"
          },
          "freshness": {
            "$ref": "#/components/schemas/Freshness"
          },
          "measures": {
            "type": "integer"
          }
        }
      },
      "MatchedSubsidy": {
        "type": "object",
        "description": "The measure's facts a match carries.",
        "properties": {
          "id": {
            "type": "string"
          },
          "title": {
            "type": "string"
          },
          "summary": {
            "type": [
              "string",
              "null"
            ]
          },
          "status": {
            "$ref": "#/components/schemas/Status"
          },
          "instrument_type": {
            "$ref": "#/components/schemas/InstrumentType"
          },
          "issuer": {
            "type": "string"
          },
          "closes_at": {
            "type": [
              "string",
              "null"
            ],
            "format": "date-time"
          },
          "funding": {
            "type": "object"
          },
          "source": {
            "type": "object"
          },
          "links": {
            "type": "object"
          }
        }
      },
      "Match": {
        "type": "object",
        "properties": {
          "subsidy_id": {
            "type": "string"
          },
          "match_status": {
            "$ref": "#/components/schemas/MatchStatus"
          },
          "confidence": {
            "type": "number",
            "description": "0 to 1: how far the rules we hold capture what decides eligibility for this measure."
          },
          "relevance": {
            "type": "number",
            "description": "0 to 1: how well the measure's topics fit the project's."
          },
          "score": {
            "type": "number",
            "description": "0 to 1: the ranking within a match status group. Topic fit, the match status, rule confidence, whether the measure can be applied for now, and how close to the company it is decided, less a little for every fact still unknown."
          },
          "reasons": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/ConditionResult"
            }
          },
          "unknowns": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Unknown"
            }
          },
          "matched_topics": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Topic"
            }
          },
          "estimate": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/Estimate"
              },
              {
                "type": "null"
              }
            ]
          },
          "subsidy": {
            "$ref": "#/components/schemas/MatchedSubsidy"
          }
        },
        "required": [
          "subsidy_id",
          "match_status",
          "confidence",
          "relevance",
          "score",
          "reasons",
          "unknowns",
          "matched_topics",
          "estimate",
          "subsidy"
        ]
      },
      "MissingInformation": {
        "type": "object",
        "required": [
          "field",
          "request_path",
          "question",
          "would_settle"
        ],
        "properties": {
          "field": {
            "$ref": "#/components/schemas/Field"
          },
          "request_path": {
            "type": "string"
          },
          "question": {
            "type": "string"
          },
          "would_settle": {
            "type": "integer",
            "description": "How many of the returned matches this fact would settle."
          }
        }
      },
      "MatchRequest": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "company": {
            "$ref": "#/components/schemas/CompanyInput"
          },
          "project": {
            "$ref": "#/components/schemas/ProjectInput"
          },
          "options": {
            "$ref": "#/components/schemas/MatchOptions"
          },
          "language": {
            "type": "string",
            "enum": [
              "nl",
              "fr",
              "en"
            ]
          },
          "limit": {
            "type": "integer",
            "minimum": 1,
            "maximum": 100
          }
        }
      },
      "MatchResponse": {
        "type": "object",
        "required": [
          "matches",
          "matched",
          "evaluated",
          "profile",
          "missing_information",
          "language",
          "disclaimer",
          "meta"
        ],
        "properties": {
          "matches": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Match"
            }
          },
          "matched": {
            "type": "integer"
          },
          "evaluated": {
            "type": "integer"
          },
          "profile": {
            "type": "object",
            "properties": {
              "facts": {
                "type": "object"
              },
              "derived": {
                "type": "array",
                "items": {
                  "$ref": "#/components/schemas/Derivation"
                }
              },
              "enterprise_number": {
                "type": [
                  "string",
                  "null"
                ]
              },
              "warnings": {
                "type": "array",
                "items": {
                  "type": "string"
                }
              }
            }
          },
          "missing_information": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/MissingInformation"
            }
          },
          "language": {
            "$ref": "#/components/schemas/Lang"
          },
          "disclaimer": {
            "type": "string"
          },
          "meta": {
            "$ref": "#/components/schemas/Meta"
          }
        }
      },
      "BulkCompany": {
        "type": "object",
        "required": [
          "reference"
        ],
        "additionalProperties": false,
        "properties": {
          "reference": {
            "type": "string",
            "description": "Your own identifier, echoed back."
          },
          "company": {
            "$ref": "#/components/schemas/CompanyInput"
          },
          "project": {
            "$ref": "#/components/schemas/ProjectInput"
          }
        }
      },
      "BulkRequest": {
        "type": "object",
        "required": [
          "companies"
        ],
        "additionalProperties": false,
        "properties": {
          "companies": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/BulkCompany"
            }
          },
          "options": {
            "$ref": "#/components/schemas/MatchOptions"
          },
          "language": {
            "type": "string",
            "enum": [
              "nl",
              "fr",
              "en"
            ]
          },
          "limit_per_company": {
            "type": "integer",
            "minimum": 1,
            "maximum": 100
          }
        }
      },
      "Watchlist": {
        "type": "object",
        "required": [
          "id",
          "name",
          "options",
          "language",
          "companies",
          "matches",
          "created_at",
          "updated_at",
          "last_evaluated_at"
        ],
        "properties": {
          "id": {
            "type": "string"
          },
          "name": {
            "type": "string"
          },
          "options": {
            "$ref": "#/components/schemas/MatchOptions"
          },
          "language": {
            "type": "string"
          },
          "companies": {
            "type": "integer"
          },
          "matches": {
            "type": "integer"
          },
          "created_at": {
            "type": "string",
            "format": "date-time"
          },
          "updated_at": {
            "type": "string",
            "format": "date-time"
          },
          "last_evaluated_at": {
            "type": [
              "string",
              "null"
            ],
            "format": "date-time"
          }
        }
      },
      "Webhook": {
        "type": "object",
        "required": [
          "id",
          "url",
          "filters",
          "active",
          "created_at",
          "last_success_at",
          "consecutive_failures"
        ],
        "properties": {
          "id": {
            "type": "string"
          },
          "url": {
            "type": "string"
          },
          "filters": {
            "type": "object"
          },
          "active": {
            "type": "boolean",
            "description": "False once 20 deliveries in a row have failed. POST /v1/webhooks/{id}/enable switches it back on."
          },
          "created_at": {
            "type": "string",
            "format": "date-time"
          },
          "last_success_at": {
            "type": [
              "string",
              "null"
            ],
            "format": "date-time"
          },
          "consecutive_failures": {
            "type": "integer"
          }
        }
      },
      "WebhookWithSecret": {
        "type": "object",
        "required": [
          "id",
          "url",
          "filters",
          "active",
          "created_at",
          "last_success_at",
          "consecutive_failures",
          "secret"
        ],
        "properties": {
          "id": {
            "type": "string"
          },
          "url": {
            "type": "string"
          },
          "filters": {
            "type": "object"
          },
          "active": {
            "type": "boolean",
            "description": "False once 20 deliveries in a row have failed. POST /v1/webhooks/{id}/enable switches it back on."
          },
          "created_at": {
            "type": "string",
            "format": "date-time"
          },
          "last_success_at": {
            "type": [
              "string",
              "null"
            ],
            "format": "date-time"
          },
          "consecutive_failures": {
            "type": "integer"
          },
          "secret": {
            "type": "string",
            "description": "Shown once. Verify Subsido-Signature: t=<unix>,v1=<hex HMAC-SHA256 of \"<t>.<body>\">."
          }
        }
      },
      "KeyInfo": {
        "type": "object",
        "required": [
          "live",
          "plan",
          "requests_this_month",
          "match_evaluations_this_month"
        ],
        "properties": {
          "live": {
            "type": "boolean",
            "description": "Whether the key was minted live or test. Both are metered alike."
          },
          "plan": {
            "$ref": "#/components/schemas/PlanOffer"
          },
          "requests_this_month": {
            "type": "integer",
            "description": "This request included."
          },
          "match_evaluations_this_month": {
            "type": "integer"
          }
        }
      },
      "PlanOffer": {
        "type": "object",
        "properties": {
          "plan": {},
          "label": {},
          "price_monthly_eur": {},
          "price_yearly_eur": {},
          "price_from_monthly_eur": {},
          "self_serve": {},
          "purchasable": {},
          "monthly_requests": {},
          "monthly_match_evaluations": {},
          "rate_limit_rps": {},
          "api_keys": {},
          "max_page_size": {},
          "max_bulk_companies": {},
          "watchlist_companies": {},
          "webhook_endpoints": {},
          "capabilities": {}
        }
      }
    }
  }
}
