--- title: Endpoints summary: Five GET endpoints, one query envelope, and the country codes to address them with. description: Every World of Regions Platform API endpoint — the query envelope they share, their required fields, and what each one returns. order: 2 updated: "2026-09-14" --- Five endpoints, all `GET`, all under `https://world-of-regions.com/api/External/`. Each one takes its arguments the same way, which is the first thing to get right. ## One query envelope, not query parameters Arguments arrive as **a single `query` parameter holding URL-encoded JSON** — not as separate query-string parameters. This is the same envelope every other reader in the service uses. ```bash # The JSON: {"language":"EN","originCountryCode":"PL","destinationCountryCode":"DE"} curl -H "apikey: YOUR_KEY" \ "https://world-of-regions.com/api/External/TravelInformation?query=%7B%22language%22%3A%22EN%22%2C%22originCountryCode%22%3A%22PL%22%2C%22destinationCountryCode%22%3A%22DE%22%7D" ``` In practice you build the JSON and let your HTTP client encode it: ```javascript const query = JSON.stringify({ language: 'EN', originCountryCode: 'PL', destinationCountryCode: 'DE', }) const response = await fetch( `https://world-of-regions.com/api/External/TravelInformation?query=${encodeURIComponent(query)}`, {headers: {apikey: process.env.WOR_API_KEY}}, ) ``` A request whose `query` is missing, is not valid JSON, or omits a required field is answered with a malformed-query message rather than an empty result. Unknown fields in the envelope are ignored, so sending one object shape to several endpoints is fine. ## The five endpoints | Endpoint | Required fields | Answers | |---|---|---| | `TravelInformation` | `language`, `originCountryCode`, `destinationCountryCode` | The entry requirements for one country pair. | | `TravelBriefing` | `language`, `originCountryCode`, `destinationCountryCode` | The same answer under `visaData`, plus the identity of both countries — so a trip header renders without a second call. | | `TravelInformationCountryList` | `language` | The countries you may ask about, grouped by continent, with the nationalities that have answers. | | `TravelInformationConfiguration` | `language` | The field configuration behind the answer: which fields exist, and the options each one can take. | | `TravelInformationTranslatedList` | `language` (`countryId` narrows it) | Every visa record for a nationality, translated. | ## The call you will make most `TravelInformation` is the one nearly every integration is built on: one passport, one destination, one answer. ```endpoint method: GET path: /External/TravelInformation note: Requires an API key fields: - name: language type: string required: true text: Language of the labels and translated names in the answer. It does not change which pairs exist. - name: originCountryCode type: string required: true text: The traveller's passport. Use an `objectId` from `TravelInformationCountryList`. - name: destinationCountryCode type: string required: true text: Where they are going, addressed the same way. ``` ## Country codes and languages Take country codes from `TravelInformationCountryList` rather than assuming a standard. Each entry carries an `objectId`, and that value is what `originCountryCode`, `destinationCountryCode` and `countryId` expect. The same response tells you which nationalities are answerable at all — `availableNationalities` — so a picker built from it can never offer a pair with no answer behind it. `language` selects the language of the *labels and translated names* in the response, not which pairs exist. ## What an answer looks like The public travel-requirements page is built from this endpoint, so it doubles as a preview of the data: everything below is one `TravelInformation` response, laid out. ![The Poland to Thailand travel-requirements page, showing a visa-free result with a 60-day maximum stay, accepted entry documents, required passport validity and the government source it was verified against.](/docs/media/api-visa-answer.webp) ```json { "isVisaFree": true, "entryDocumentType": ["passport", "identityCard"], "entryPermissionType": "", "permissionValidity": 0, "visaRequiredAfterDays": 90, "passportValidity": 0, "vaccinationsSuggested": [], "vaccinationsMandatory": [], "insuranceStatus": "suggested", "financialGuarantee": ["none"], "minorTraveling": ["letterOfParentalConsent"], "visaIssuanceLocation": [], "informationBasedOnWebsite": "https://...", "embassy": { "url": "https://...", "nearestCountry": {"name": "Germany", "code": "DE"} } } ``` Two fields are worth reading carefully. `informationBasedOnWebsite` is the official source the record was written from — quote it, or link it, wherever you show the answer to a traveller. And `embassy.nearestCountry` may name a country other than the destination: where the destination has no embassy for that nationality, the answer points at the nearest one that does. **Coded values are not display text.** `entryDocumentType`, `financialGuarantee`, `minorTraveling` and their neighbours are stable codes; the human labels for them come from `TravelInformationConfiguration` in the language you asked for. Resolve them through that response rather than deriving a label from the code, and a new option added on our side appears in your UI without a release on yours.