---
title: "Unified Schengen 90/180 + per-country tax residency + tax cost, from one itinerary"
method: POST
path: "/api/residency-tracker"
---

# Unified Schengen 90/180 + per-country tax residency + tax cost, from one itinerary

`POST /api/residency-tracker`

## Request

- Base URL: `https://geo-parity.com`
- URL: `https://geo-parity.com/api/residency-tracker`
- Auth: one of:
  - none
  - HTTP bearer
  - API key in query parameter `key`

## Request body

- object
  - `stays` object[], required
    - `country` string, required
    - `entry` string, date, required
    - `exit` string, date, required
  - `income` number: optional gross annual USD — enables tax-cost projection
  - `referenceDate` string, date

## Response `200`

schengen block, per-country risk (threshold/basis/safeDaysLeft/risk, Cyprus-60 secondary, US SPT, UK, taxProjection) and a summary

## Other responses

- `400`: Required parameters missing; body includes code, message, and a worked example.
- `422`: Well-formed but invalid input; body includes a machine-readable code (e.g. UNKNOWN_TARGET) and message.
- `429`: A ceiling was exceeded. Body is { ok:false, code, message, retryAfterSeconds } where code is RATE_LIMITED (per-minute burst — back off and retry within the minute) or QUOTA_EXCEEDED (the monthly allowance is spent; retrying will not help until it resets on the 1st). Honour Retry-After.

---

[API](https://skmtc.dev/geo-parity/apis/geo-parity-api.md) · [All operations](https://skmtc.dev/geo-parity/apis/geo-parity-api/llms.txt) · [OpenAPI document](https://skmtc.dev/geo-parity/apis/geo-parity-api/revisions/8ddff47a0806?raw)
