Check passport validity for a travel date
Use this passport validity checker to compare an expiry date with a planned departure and return.
Run — free
It applies a common travel-screening rule: the passport must remain valid for at least six calendar months after the return date. The result shows the exact threshold, whether the passport meets it, how many days of validity remain after return, and any shortfall. This is a planning check, not an official entry decision; requirements can differ by destination, nationality, document type, route, and transit country.
Enter the three dates from your actual itinerary
Start with the expiry date printed on the passport, then enter the planned departure and return dates in YYYY-MM-DD format. Use the date on which the traveler expects to finish the international trip, not the date a booking was purchased or the date an application is submitted. The checker rejects an itinerary when the departure is after the return because that order cannot describe the planned trip. It also validates every date as a real Gregorian calendar date, so values such as February 30 do not silently produce a misleading answer. Names, passport numbers, nationality, and other personal details are neither needed nor requested. If a journey has several international segments, use the final return date for this conservative six-month check, then separately review every destination and transit point. Run the calculation again whenever the itinerary changes, since moving the return by even a few days also moves the minimum acceptable expiry date. The calculation is deterministic and does not use the current date, so the same three inputs always produce the same result.
Understand the calendar-month threshold
The required validity date is calculated by adding six calendar months to the planned return date. This is not treated as a fixed number of days, because calendar months have different lengths. For example, a return on October 15 produces a threshold of April 15. When the corresponding day does not exist in the target month, the calculation uses that month’s final valid day: six months after August 31 is the last day of February, including February 29 in a leap year. A passport meets the rule when its expiry date is on or after the calculated threshold. The response also reports the total number of calendar days between return and expiry, which can be negative if the passport expires before the traveler returns. The shortfall is zero when the rule is met; otherwise it states how many additional days are needed to reach the threshold. These fields make the decision auditable while keeping the central answer straightforward: a true or false result against one clearly displayed date.
Treat the result as a planning screen, not official advice
Six months beyond travel is a widely used rule of thumb, but it is not universal and the relevant reference point may differ. A country may require validity beyond arrival rather than return, accept a shorter period, impose blank-page rules, distinguish ordinary from emergency passports, or apply different terms according to citizenship and visa status. Airlines and transit countries can also perform their own document checks. For that reason, a passing result means only that the dates satisfy the calendar rule implemented here; it does not guarantee boarding, transit, admission, or visa approval. After checking the dates, confirm the current requirement with the destination government, every transit-country authority, and the operating carrier. Renew early if the result fails or sits close to the boundary, especially when tickets are changeable or delays could extend the trip. The browser calculation can be used without an account, while automated checks through the API cost $0.002 per request. No network lookup is performed, so this tool never substitutes an outdated rules database for an official source.
What you can do with it
Screen a passport before booking
Compare the printed expiry date with a proposed itinerary before committing to flights or accommodation.
Check travelers in a group
Run the same consistent six-calendar-month test for each traveler without collecting passport numbers or names.
Recheck after an itinerary change
Calculate the new threshold when a return date moves and see the exact number of shortfall days.
FAQ
Does every country require six months of passport validity?
No. Rules vary by destination, citizenship, route, document type, and visa status. Confirm current requirements with official authorities and the carrier.
Is the six-month period counted from departure or return?
This checker deliberately uses the planned return date as a conservative common-rule screen and adds six calendar months to it.
How are month-end dates handled?
If the same day does not exist six months later, the threshold becomes the last valid day of that target month.
Does a passport expiring exactly on the threshold pass?
Yes. An expiry date equal to or later than required_valid_until meets the rule implemented by this checker.
Does a passing result guarantee entry or boarding?
No. It checks only the three supplied dates against one calendar rule and cannot account for current government, visa, transit, airline, or passport-condition requirements.
What does the API request cost?
Each API request costs $0.002. The same deterministic calculation is also available free in the browser.
For developers — API access
Everything on this page is available programmatically. This section is for teams who want to wire it into their own systems; everyone else can just use the tool above.
API endpoint
Prefer to automate it? One authenticated POST creates the task; the result comes back by webhook or a signed link. The same capability also runs here on the web, by email and from Telegram — and soon from our app too.
Call it from your stack
curl -X POST https://api.kit.forhosting.com/travel2/passport-expiry-travel-check \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"passport_expiry_date":"2027-04-20","travel_date":"2026-09-10","return_date":"2026-09-20"}'const res = await fetch("https://api.kit.forhosting.com/travel2/passport-expiry-travel-check", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"passport_expiry_date": "2027-04-20",
"travel_date": "2026-09-10",
"return_date": "2026-09-20"
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/travel2/passport-expiry-travel-check",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"passport_expiry_date": "2027-04-20",
"travel_date": "2026-09-10",
"return_date": "2026-09-20"
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/travel2/passport-expiry-travel-check", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"passport_expiry_date":"2027-04-20","travel_date":"2026-09-10","return_date":"2026-09-20"}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"passport_expiry_date":"2027-04-20","travel_date":"2026-09-10","return_date":"2026-09-20"}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/travel2/passport-expiry-travel-check", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)Example request
{
"passport_expiry_date": "2027-04-20",
"travel_date": "2026-09-10",
"return_date": "2026-09-20"
}Example response
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "travel2.passport_expiry_travel_check",
"status": "queued",
"_links": {
"result": "/tasks/tsk_…/result"
}
}The API is asynchronous: the call returns a task_id immediately and the result arrives by webhook. Polling is capped at 1 req/s per task.
Pricing
Published price — no tokens, no invented credits. A failed task is never charged.
Errors
| HTTP | Code | Meaning |
|---|---|---|
401 | unauthorized | Missing or invalid API key. |
402 | insufficient_balance | Your balance doesn't cover the task price. |
404 | unknown_type | That task type doesn't exist. |
429 | rate_limited | Too many requests. Use the webhook instead of polling. |