Skip to main content

For developers

The same engine, as an API and an MCP server

Every answer the calculator gives is available as JSON. No key, no account, open CORS, and nothing you send is stored. It is a helping tool, not a decision by a border authority.

OpenAPI 3.1 document (/api/openapi.json) · MCP server source

POST /api/v1/check

Days used and left on a date, latest legal exit, next legal entry, overstays; optionally whether a planned trip fits.

curl -s -X POST https://ninety-coral.vercel.app/api/v1/check \
  -H 'content-type: application/json' \
  -d '{"trips":[{"entry":"2026-05-01","exit":"2026-06-15"},{"entry":"2026-08-20","exit":"2026-09-30"}],"on":"2026-10-19"}'

Answer:

{
 "on": "2026-10-19",
 "daysUsed": 88,
 "daysLeft": 2,
 "present": false,
 "latestExit": "2026-10-20",
 "nextLegalEntry": "2026-10-19",
 "overstays": []
}

POST /api/v1/ees-reconcile

Compare the EES days-used figure (and records, if you have them) with your trips, and name the days that differ.

curl -s -X POST https://ninety-coral.vercel.app/api/v1/ees-reconcile \
  -H 'content-type: application/json' \
  -d '{"trips":[{"entry":"2026-06-01","exit":"2026-06-10"}],"ees":{"daysUsed":30,"on":"2026-06-30","records":[{"entry":"2026-06-01","exit":null}]}}'

Answer (long text shortened):

{
 "on": "2026-06-30",
 "windowStart": "2026-01-02",
 "travellerDaysUsed": 10,
 "eesDaysUsed": 30,
 "figureGap": 20,
 "codes": [
  "figure-differs",
  "likely-missing-exit"
 ],
 "differences": [
  {
   "from": "2026-06-11",
   "to": "2026-06-30",
   "side": "ees-only",
   "count": 20
  }
 ],
 "explanation": "Compared on 2026-06-30, over the 180-day period 2026-01-02 to 2026-06-30. The tr…"
}

POST /api/v1/letter

Draft the Article 52 (Regulation (EU) 2017/2226) request to rectify EES data, from your details and the comparison.

curl -s -X POST https://ninety-coral.vercel.app/api/v1/letter \
  -H 'content-type: application/json' \
  -d '{"trips":[{"entry":"2026-06-01","exit":"2026-06-10"}],"ees":{"daysUsed":30,"on":"2026-06-30","records":[{"entry":"2026-06-01","exit":null}]},"identity":{"fullName":"Jane Doe","dateOfBirth":"1990-05-04","nationality":"Egyptian","documentNumber":"A1234567","email":"jane@example.com","memberState":"France"}}'

Answer (long text shortened):

{
 "title": "Request for rectification of Entry/Exit System data under Article 52 of Regulation (EU) 2017/2226",
 "evidence": {
  "on": "2026-06-30",
  "windowStart": "2026-01-02",
  "ours": 10,
  "ees": 30,
  "gap": 20
 },
 "text": "Request for rectification of Entry/Exit System data under Article 52 of Regulation (EU) 2017/2226\n\nTo the competent auth…"
}

Errors

400 invalid JSON or a field failed validation (each issue names its field path), 413 body over 64 KB, 415 not JSON, 422 valid shape but the dates cannot be counted (for example an exit before its entry).

MCP server

packages/ninety-mcp runs over stdio and exposes three tools, schengen_check, ees_reconcile and article52_letter, which call the same functions as the API. Install steps are in its README. The same tools are served over streamable HTTP at POST /api/mcp (stateless JSON-RPC: initialize, tools/list, tools/call), so an MCP client can use them without installing anything. Back to the calculator.