Справочник API · 1.0.0-preview

Справочник API, сформированный из openapi.json.

Эта страница строится из того же документа OpenAPI 3.1, который отдаёт API, поэтому расходиться с ним она не может. Каждый ответ содержит release_id и as_of. Ошибки — документы RFC 9457 со стабильным кодом.

Базовый путь
/api/v1
Аутентификация
Bearer
Формат
JSON · RFC 9457
Для машин
openapi.json

Эндпоинты

GET/api/v1/jurisdictions1 единица

List jurisdictions

Public jurisdictions with their current zone memberships (eu, eea, schengen, ch_fmop).

Ответ
{ release_id, as_of, data: Jurisdiction[] }
Ошибки
401 · 422 · 429 · 503
GET/api/v1/purposes1 единица

List purposes

The purpose taxonomy; `study` is the root of the first slice.

Ответ
{ release_id, as_of, data: Purpose[] }
Ошибки
401 · 422 · 429 · 503
GET/api/v1/requirement-concepts1 единица

List requirement concepts

The 12 requirement concepts. `eligibility` concepts affect fit; `document` and `procedural` ones are listed as to_provide.

Ответ
{ release_id, as_of, data: Concept[] }
Ошибки
401 · 422 · 429 · 503
GET/api/v1/programs1 единица

List programs

Program summaries of the live release, filtered by destination, zone and purpose.

ПараметрГдеТипОписание
destinationquerystring ^[A-Z]{2}$ISO 3166-1 alpha-2.
zonequerystring (eu | eea | schengen | ch_fmop)
purposequerystringe.g. `study` or `study.degree`; ancestors and descendants match.
releasequeryintegerPin a past release for reproducible answers. Defaults to the latest.
Ответ
{ release_id, as_of, data: ProgramSummary[] }
Ошибки
401 · 422 · 429 · 503
GET/api/v1/programs/{slug}1 единица

Get a program

One program version with every fact (identity, lifecycle, max stay, requirements, fees, processing, rights), each with freshness and evidence. `checks` lists requirement concepts that were checked, checked-but-unknown, and not yet catalogued.

ПараметрГдеТипОписание
slug *pathstring ^[a-z]{2}-[a-z0-9-]+$
releasequeryintegerPin a past release for reproducible answers. Defaults to the latest.
Ответ
{ release_id, as_of, data: ProgramDetail }
Ошибки
401 · 422 · 429 · 503
POST/api/v1/match5 единиц

Match a traveler to programs

Stateless. The body is never stored or logged. Results only for destinations whose coverage is `covered`; others are listed in `coverage.in_progress`. Missing inputs yield `unknown`, never a guess.

Тело запроса
TravelerContext
Ответ
MatchResult
Ошибки
400 · 401 · 422 · 429 · 503
GET/api/v1/coverage1 единица

Coverage per destination

§11 quality-gate status of every slice country. With `destination`, also the material-fact inventory: what is evidenced, explicitly unknown, stale, unsupported or missing.

ПараметрГдеТипОписание
destinationquerystring ^[A-Z]{2}$
Ответ
{ release_id, as_of, data: Coverage[] }
Ошибки
401 · 422 · 429 · 503
GET/api/v1/openapi.json

This document

Ответ
—
Ошибки
503

Коды ошибок

Ошибки приходят в формате application/problem+json. Поле code стабильно, а pointer указывает на ошибочный фрагмент входных данных.

codeЗначение
invalid_inputЗапрос не соответствует контракту. См. pointer.
unsupported_scopeНаправление вне опубликованной публичной области.
not_foundВ запрошенном релизе нет действующей программы с таким slug.
unauthorizedКлюч API отсутствует, недействителен или отозван.
rate_limitedПревышен лимит запросов аккаунта в минуту. Повторите через число секунд из заголовка Retry-After.
quota_exceededЕдиницы за период израсходованы на тарифе без оплаты сверх лимита. Лимит обнулится в момент из X-Units-Reset.
unavailableРелизов ещё нет или сервис данных недоступен.
no_evidenceЗарезервировано: факт нельзя отдать без подтверждения.
conflictedЗарезервировано: официальные источники сейчас противоречат друг другу.

Схемы

TravelerContext и MatchResult — замороженные контракты, которыми пользуются валидаторы, включены без изменений.

ProblemПоказать
{  "type": "object",  "description": "RFC 9457 problem details.",  "required": [    "type",    "title",    "status",    "code",    "detail"  ],  "properties": {    "type": {      "type": "string"    },    "title": {      "type": "string"    },    "status": {      "type": "integer"    },    "code": {      "type": "string",      "enum": [        "invalid_input",        "unsupported_scope",        "no_evidence",        "conflicted",        "unavailable",        "rate_limited",        "quota_exceeded",        "unauthorized",        "not_found"      ]    },    "detail": {      "type": "string"    },    "pointer": {      "type": "string",      "description": "JSON pointer to the offending input."    }  }}
JurisdictionПоказать
{  "type": "object",  "required": [    "code",    "name",    "kind",    "zones"  ],  "properties": {    "code": {      "type": "string"    },    "name": {      "type": "string"    },    "kind": {      "type": "string"    },    "zones": {      "type": "array",      "items": {        "type": "string"      }    }  }}
ZoneПоказать
{  "type": "object",  "required": [    "code",    "name",    "kind"  ],  "properties": {    "code": {      "type": "string"    },    "name": {      "type": "string"    },    "kind": {      "type": "string"    }  }}
PurposeПоказать
{  "type": "object",  "required": [    "code",    "name"  ],  "properties": {    "code": {      "type": "string"    },    "parent_code": {      "type": [        "string",        "null"      ]    },    "name": {      "type": "string"    },    "description": {      "type": [        "string",        "null"      ]    }  }}
ConceptПоказать
{  "type": "object",  "required": [    "code",    "category",    "name"  ],  "properties": {    "code": {      "type": "string"    },    "category": {      "type": "string",      "enum": [        "eligibility",        "document",        "procedural"      ]    },    "name": {      "type": "string"    },    "explanation": {      "type": [        "string",        "null"      ]    },    "param_schema": {      "type": "object",      "description": "JSON Schema of this concept's params (contracts/requirement-params.schema.json)."    }  }}
EvidenceПоказать
{  "type": "object",  "required": [    "source_url",    "origin",    "observed_at"  ],  "properties": {    "source_url": {      "type": "string",      "format": "uri"    },    "authority": {      "type": [        "string",        "null"      ]    },    "origin": {      "type": "string",      "enum": [        "official_primary",        "official_secondary",        "legacy_research",        "legacy_unverified",        "demo_derived"      ]    },    "observed_at": {      "type": "string",      "format": "date-time"    },    "section_id": {      "type": [        "string",        "null"      ]    },    "quote": {      "type": [        "string",        "null"      ],      "description": "Verbatim, in the source language. Null when the source's terms forbid quoting."    },    "quote_withheld": {      "type": "boolean"    }  }}
FactПоказать
{  "type": "object",  "required": [    "fact_key",    "kind",    "value",    "freshness",    "evidence"  ],  "properties": {    "fact_key": {      "type": "string",      "description": "identity · lifecycle · max_stay · req:<concept> · fee:<kind>:<role> · processing:<statistic> · right:<kind>"    },    "kind": {      "type": "string",      "enum": [        "program_identity",        "program_lifecycle",        "max_stay",        "fee_component",        "processing_estimate",        "program_right",        "program_requirement",        "requirement_absent",        "requirement_unknown"      ]    },    "value": {      "type": "object",      "description": "Shape per kind: contracts/candidate.schema.json $defs; requirements per requirement-params.schema.json."    },    "freshness": {      "$ref": "#/components/schemas/Common_freshness"    },    "verified_at": {      "type": [        "string",        "null"      ],      "format": "date-time"    },    "evidence": {      "type": "array",      "items": {        "$ref": "#/components/schemas/Evidence"      }    }  }}
ProgramSummaryПоказать
{  "type": "object",  "required": [    "slug",    "destination",    "official_name",    "authority",    "legal_instrument",    "channels",    "purposes",    "lifecycle",    "max_stay",    "origin",    "freshness"  ],  "properties": {    "slug": {      "type": "string"    },    "destination": {      "type": "string"    },    "official_name": {      "type": "string",      "description": "In the official language."    },    "official_name_en": {      "type": [        "string",        "null"      ]    },    "official_code": {      "type": [        "string",        "null"      ]    },    "authority": {      "type": "string"    },    "official_url": {      "type": [        "string",        "null"      ]    },    "legal_instrument": {      "type": "string"    },    "channels": {      "type": "array",      "items": {        "type": "string"      }    },    "purposes": {      "type": "array",      "items": {        "type": "string"      }    },    "lifecycle": {      "type": "string",      "enum": [        "announced",        "open",        "suspended",        "closed",        "replaced"      ]    },    "max_stay": {      "$ref": "#/components/schemas/Common_duration"    },    "origin": {      "type": "string"    },    "freshness": {      "$ref": "#/components/schemas/Common_freshness"    }  }}
ProgramDetailПоказать
{  "allOf": [    {      "$ref": "#/components/schemas/ProgramSummary"    },    {      "type": "object",      "required": [        "version",        "applicability",        "checks",        "facts"      ],      "properties": {        "version": {          "type": "object",          "required": [            "version_id",            "published_in",            "valid_during"          ],          "properties": {            "version_id": {              "type": "string",              "format": "uuid"            },            "published_in": {              "type": "integer"            },            "valid_during": {              "type": "string",              "description": "Postgres daterange, e.g. `[2026-01-01,)`."            }          }        },        "applicability": {          "$ref": "#/components/schemas/Predicate"        },        "checks": {          "type": "object",          "required": [            "checked",            "unknown",            "uncatalogued"          ],          "properties": {            "checked": {              "type": "array",              "items": {                "type": "string"              },              "description": "Bound (required/conditional/optional) or evidenced not required."            },            "unknown": {              "type": "array",              "items": {                "type": "string"              },              "description": "Checked; the official sources are silent."            },            "uncatalogued": {              "type": "array",              "items": {                "type": "string"              },              "description": "Not yet checked. Never read as 'not required'."            }          }        },        "facts": {          "type": "array",          "items": {            "$ref": "#/components/schemas/Fact"          }        }      }    }  ]}
CoverageПоказать
{  "type": "object",  "required": [    "destination",    "name",    "purpose_root",    "status",    "programs",    "material_facts",    "gate_green"  ],  "properties": {    "destination": {      "type": "string"    },    "name": {      "type": "string"    },    "purpose_root": {      "type": "string"    },    "status": {      "type": "string",      "enum": [        "in_progress",        "covered",        "withdrawn"      ]    },    "programs": {      "type": "integer"    },    "material_facts": {      "type": "object",      "properties": {        "total": {          "type": "integer"        },        "evidenced": {          "type": "integer"        },        "pct": {          "type": "number"        }      }    },    "unsupported_positives": {      "type": "integer"    },    "scenarios": {      "type": "object",      "properties": {        "total": {          "type": "integer"        },        "passing": {          "type": "integer"        }      }    },    "adapters": {      "type": "object",      "properties": {        "total": {          "type": "integer"        },        "verified": {          "type": "integer"        }      }    },    "recheck_done": {      "type": "boolean"    },    "gate_green": {      "type": "boolean"    },    "decided_at": {      "type": [        "string",        "null"      ],      "format": "date-time"    }  }}
MaterialFactПоказать
{  "type": "object",  "required": [    "slug",    "fact",    "state"  ],  "properties": {    "slug": {      "type": "string"    },    "fact": {      "type": "string"    },    "state": {      "type": "string",      "enum": [        "evidenced",        "explicit_unknown",        "stale",        "unsupported",        "missing"      ]    },    "last_support": {      "type": [        "string",        "null"      ],      "format": "date-time"    }  }}
TravelerContextПоказать
{  "title": "TravelerContext — request body of POST /v1/match and MCP match_programs",  "description": "Stateless and never persisted (only hashed usage metering). No names, document numbers, scans or exact birth dates. Every field except purpose and scope is optional; a missing field produces 'unknown' for the requirements that need it, plus an entry in missing_inputs. Spec §6.",  "type": "object",  "required": [    "purpose",    "scope"  ],  "properties": {    "purpose": {      "$ref": "#/components/schemas/Common_purpose"    },    "scope": {      "type": "object",      "description": "Destinations to evaluate. Exactly one of destinations / zone.",      "oneOf": [        {          "required": [            "destinations"          ],          "properties": {            "destinations": {              "type": "array",              "minItems": 1,              "maxItems": 31,              "uniqueItems": true,              "items": {                "$ref": "#/components/schemas/Common_iso2"              }            }          },          "additionalProperties": false        },        {          "required": [            "zone"          ],          "properties": {            "zone": {              "$ref": "#/components/schemas/Common_zone"            }          },          "additionalProperties": false        }      ]    },    "citizenships": {      "type": "array",      "maxItems": 4,      "uniqueItems": true,      "items": {        "$ref": "#/components/schemas/Common_iso2"      }    },    "citizenships_complete": {      "type": "boolean",      "default": true,      "description": "Caller asserts the list contains ALL of the person's citizenships. If false, citizenship non-matches evaluate to unknown."    },    "residence": {      "$ref": "#/components/schemas/Common_iso2"    },    "birth_year": {      "type": "integer",      "minimum": 1900,      "maximum": 2100    },    "age": {      "type": "integer",      "minimum": 0,      "maximum": 120,      "description": "Alternative to birth_year; exact age at as_of."    },    "languages": {      "type": "array",      "maxItems": 8,      "items": {        "type": "object",        "required": [          "language"        ],        "properties": {          "language": {            "$ref": "#/components/schemas/Common_language"          },          "cefr": {            "$ref": "#/components/schemas/Common_cefr"          },          "native": {            "type": "boolean",            "default": false          },          "tests": {            "type": "array",            "maxItems": 4,            "items": {              "type": "object",              "required": [                "test",                "score"              ],              "properties": {                "test": {                  "$ref": "#/components/schemas/RequirementParams_language_test"                },                "score": {                  "type": "string",                  "minLength": 1,                  "maxLength": 20                },                "taken_on": {                  "$ref": "#/components/schemas/Common_date"                }              },              "additionalProperties": false            }          }        },        "additionalProperties": false      }    },    "funds": {      "type": "object",      "description": "Liquid funds available for the stay. A range is allowed (min ≤ max); a single figure has max omitted.",      "required": [        "min",        "currency"      ],      "properties": {        "min": {          "$ref": "#/components/schemas/Common_decimal"        },        "max": {          "$ref": "#/components/schemas/Common_decimal"        },        "currency": {          "$ref": "#/components/schemas/Common_currency"        },        "forms": {          "type": "array",          "uniqueItems": true,          "items": {            "type": "string",            "enum": [              "blocked_account",              "bank_statement",              "scholarship",              "sponsor_declaration",              "deposit_guarantee",              "income_proof"            ]          }        }      },      "additionalProperties": false    },    "education_isced": {      "type": "integer",      "minimum": 0,      "maximum": 8,      "description": "Highest completed ISCED 2011 level."    },    "stay_months": {      "type": "number",      "exclusiveMinimum": 0,      "maximum": 120    },    "stay_days": {      "type": "integer",      "minimum": 1,      "maximum": 3660,      "description": "Length of stay in days; preferred for short stays. Requirements per day of stay fall back to stay_months × [28, 31] when absent."    },    "accommodation_proof": {      "$ref": "#/components/schemas/RequirementParams_accommodation_proof"    },    "salary": {      "type": "object",      "description": "Offered salary for the destination job. A range is allowed (min ≤ max).",      "required": [        "min",        "currency",        "period"      ],      "properties": {        "min": {          "$ref": "#/components/schemas/Common_decimal"        },        "max": {          "$ref": "#/components/schemas/Common_decimal"        },        "currency": {          "$ref": "#/components/schemas/Common_currency"        },        "period": {          "type": "string",          "enum": [            "per_month",            "per_year"          ]        },        "gross": {          "type": "boolean",          "default": true        }      },      "additionalProperties": false    },    "family_links": {      "type": "array",      "maxItems": 5,      "uniqueItems": true,      "description": "All of the traveller's family links to people in the destination. An empty array asserts there are none.",      "items": {        "$ref": "#/components/schemas/RequirementParams_family_relation"      }    },    "experience_years": {      "type": "number",      "minimum": 0,      "maximum": 60    },    "dependents": {      "type": "object",      "properties": {        "spouse": {          "type": "boolean"        },        "children": {          "type": "integer",          "minimum": 0,          "maximum": 12        }      },      "additionalProperties": false    },    "passport_expiry": {      "$ref": "#/components/schemas/Common_date"    },    "as_of": {      "$ref": "#/components/schemas/Common_date",      "description": "Evaluation date; defaults to today (UTC)."    },    "release": {      "type": "integer",      "minimum": 1,      "description": "Pin to a past release for reproducibility; defaults to latest."    }  },  "not": {    "required": [      "birth_year",      "age"    ]  },  "additionalProperties": false}
MatchResultПоказать
{  "title": "MatchResult — response of POST /v1/match and MCP match_programs",  "description": "Deterministic: identical (TravelerContext, release, as_of, engine_version) ⇒ byte-identical results. Never contains approval probabilities. Spec §5–§6.",  "type": "object",  "required": [    "release_id",    "as_of",    "engine_version",    "schema_version",    "missing_inputs",    "assumptions",    "results",    "coverage"  ],  "properties": {    "release_id": {      "type": "integer",      "minimum": 1    },    "as_of": {      "$ref": "#/components/schemas/Common_date"    },    "engine_version": {      "type": "string",      "pattern": "^\\d+\\.\\d+\\.\\d+$"    },    "schema_version": {      "const": "1"    },    "missing_inputs": {      "type": "array",      "uniqueItems": true,      "description": "TravelerContext fields whose absence made at least one eligibility requirement unknown, ordered by how many results they would resolve.",      "items": {        "type": "string"      }    },    "assumptions": {      "type": "array",      "description": "Every default the engine applied instead of caller input (e.g. 'dependents: none', 'as_of: today'). Never silent.",      "items": {        "type": "object",        "required": [          "field",          "assumed",          "affects"        ],        "properties": {          "field": {            "type": "string"          },          "assumed": {},          "affects": {            "type": "array",            "items": {              "type": "string"            },            "description": "program slugs whose result depends on this assumption"          }        },        "additionalProperties": false      }    },    "results": {      "type": "array",      "items": {        "$ref": "#/components/schemas/MatchResult_programResult"      }    },    "free_movement": {      "type": "array",      "description": "Destinations where a declared citizenship grants free movement (EU/EEA/CH), so no study permit program applies.",      "items": {        "type": "object",        "required": [          "destination",          "basis_zone",          "evidence"        ],        "properties": {          "destination": {            "$ref": "#/components/schemas/Common_iso2"          },          "basis_zone": {            "$ref": "#/components/schemas/Common_zone"          },          "registration_note": {            "type": "string",            "maxLength": 500          },          "evidence": {            "type": "array",            "items": {              "$ref": "#/components/schemas/Common_evidenceRef"            }          }        },        "additionalProperties": false      }    },    "coverage": {      "type": "object",      "required": [        "in_scope",        "covered",        "in_progress"      ],      "properties": {        "in_scope": {          "type": "array",          "items": {            "$ref": "#/components/schemas/Common_iso2"          }        },        "covered": {          "type": "array",          "items": {            "$ref": "#/components/schemas/Common_iso2"          }        },        "in_progress": {          "type": "array",          "items": {            "$ref": "#/components/schemas/Common_iso2"          },          "description": "In scope but not past the quality gate: no results are returned for these."        }      },      "additionalProperties": false    }  },  "additionalProperties": false}