Atlys APIapi.atlys.com ↗
Get earliest available visa appointment slot dates by residence country, destination, and application centre via the Atlys API. One endpoint, real-time slot data.
What is the Atlys API?
The Atlys Visa Appointment Slots API exposes 5 response fields per application centre — including earliest_date, slot_type, and a list of known available dates — for visa appointment availability worldwide. The single list_slots endpoint accepts a residence country code and an optional destination filter, returning all reachable application centres grouped by destination country.
curl -X GET 'https://api.parse.bot/scraper/1191f0c3-adff-47d9-abe0-a8155da12958/list_slots?residence=IN' \ -H 'X-API-Key: $PARSE_API_KEY'
Typed, relational, agent-ready
A generated client with real types, enums, and the links between objects — the structure a flat JSON response can't carry. Autocompletes in your editor and reads cleanly to coding agents.
- Fully typed · autocompletes
- Objects link to objects
- Typed errors & pagination
Typed Python client. Set up the SDK in your uv project, then pull this API’s typed client:
uv add parse-sdk uv run parse init uv run parse add --marketplace api-atlys-com-api
uv run parse add --marketplace pulls a pinned snapshot of this canonical API — it won’t change underneath you. To customize it, subscribe and swap to your own copy.
"""Walkthrough: Atlys visa appointment slots — find earliest dates by destination."""
from parse_apis.api_atlys_com_api import Atlys, InputFormatInvalid
client = Atlys()
# List all destination slots for applicants residing in India.
try:
for slot in client.slots.list(residence="IN", limit=5):
print(slot.destination_country_code, slot.visa_category, f"centres: {len(slot.centres)}")
for centre in slot.centres:
print(f" {centre.centre_name} — earliest: {centre.earliest_date}")
except InputFormatInvalid:
print("Invalid residence code provided")
# Narrow to a single destination country.
de_slot = client.slots.list(residence="IN", destination="DE", limit=1).first()
if de_slot is not None:
for centre in de_slot.centres:
print(centre.centre_name, centre.earliest_date, centre.slot_type)
print(f" actual dates: {centre.actual_dates[:3]}")
print("exercised: slots.list / slots.list(destination=) / Centre fields")
Returns, for applicants residing in the given country, the destination countries that currently have visa appointment slots, and for each destination the application centres with their earliest available date and known slot dates. One upstream call, no pagination; the whole result is returned in a single response. Dates are strings in DD-MM-YYYY form. An optional destination filter narrows the list locally to one destination country code; a destination with no slots yields an empty `slots` array while `total_destinations` still reports the unfiltered count. A residence code the site does not know returns generic entries whose centre_id is 'any'.
| Param | Type | Description |
|---|---|---|
| residencerequired | string | 2-letter ISO country code of the applicant's country of residence (e.g. IN, US, GB). Case-insensitive. |
| destination | string | Optional 2-letter ISO country code of the destination country; keeps only that destination's entry. Omitted = all destinations. |
{
"type": "object",
"fields": {
"slots": "array of destination entries, each with destination_country_code, visa_category, applicant_count and a centres array",
"residence": "normalized uppercase residence code used for the lookup",
"slots[].centres": "array of application centres: centre_id (slug), centre_name (display), earliest_date (DD-MM-YYYY), slot_type, and date lists actual_dates / predicted_dates / bouncer_dates / all_dates (DD-MM-YYYY strings)",
"destination_filter": "uppercase destination code applied, or null when no filter",
"total_destinations": "integer count of destination entries before any destination filter"
},
"sample": {
"data": {
"slots": [
{
"centres": [
{
"all_dates": [
"19-10-2026"
],
"centre_id": "bangalore",
"slot_type": "actual",
"centre_name": "Bangalore",
"actual_dates": [],
"bouncer_dates": [],
"earliest_date": "19-10-2026",
"predicted_dates": []
},
{
"all_dates": [
"07-10-2026"
],
"centre_id": "delhi",
"slot_type": "actual",
"centre_name": "Delhi",
"actual_dates": [],
"bouncer_dates": [],
"earliest_date": "07-10-2026",
"predicted_dates": []
}
],
"visa_category": "TOURIST",
"applicant_count": 1,
"destination_country_code": "DE"
}
],
"residence": "IN",
"destination_filter": "DE",
"total_destinations": 18
},
"status": "success"
}
}About the Atlys API
What the API Returns
The list_slots endpoint returns a slots array where each entry represents a destination country for which appointment slots are currently available. Each entry includes destination_country_code, visa_category, and applicant_count, alongside a centres array. Each centre object carries centre_id (a slug), centre_name, earliest_date (formatted DD-MM-YYYY), slot_type, and date lists of actual available appointments.
Filtering by Residence and Destination
The required residence parameter accepts a 2-letter ISO country code (e.g., IN, US, GB) and is case-insensitive; it is normalized to uppercase and echoed back as the residence field in the response. The optional destination parameter narrows results to a single destination country. When omitted, all destinations with open slots for that residence country are returned. The response always includes total_destinations — the count of destination entries before any destination filter — and destination_filter, which is either the uppercase destination code or null.
Coverage and Freshness
The endpoint reflects current slot availability at the time of the request; there is no pagination and no cursor — a single call returns the full result set. Data is scoped to applicants residing in the specified country, so the same destination may show different centre availability depending on the residence value used. The visa_category field indicates the type of visa the slot pertains to, and applicant_count reflects the number of applicants the slot accommodates.
The Atlys API is a managed, monitored endpoint for api.atlys.com — not a raw scraper you maintain. Every endpoint is automatically health-checked on a schedule, and when api.atlys.com changes and a check fails, the API is automatically queued for repair and re-verified. It is built to keep working as the site underneath it changes.
This isn't an official api.atlys.com API — it's an independent, maintained REST wrapper over public data. Where the source has no official API (or only a limited one), Parse gives you a stable contract over a source that never promised one, and keeps it current. Need a new endpoint or field? You can revise it yourself in plain English and the agent rebuilds it against the live site in minutes — contributing the change back to the shared API is free.
Will this API break when the source site changes?+
Is this an official API from the source site?+
Can I fix or extend this API myself if I need a new endpoint or field?+
What happens if I call an endpoint that has an issue?+
- Alert travellers when the earliest_date for a specific visa application centre drops below a threshold
- Build a dashboard tracking slot availability across multiple destination countries for a given residence country
- Notify immigration consultants when new slot dates appear in the date lists for high-demand destinations
- Compare applicant_count across centres to identify lower-contention appointment options
- Monitor visa_category availability for specific travel corridors such as IN→GB or US→IN
- Aggregate total_destinations counts over time to track how overall slot availability changes by season
- Power a travel planning tool that surfaces the earliest_date across all reachable destinations for a user's residence country
| Tier | Price | Credits/month | Rate limit |
|---|---|---|---|
| Free | $0/mo | 200 | 5 req/min |
| Hobby | $30/mo | 1,000 | 20 req/min |
| Developer | $100/mo | 5,000 | 100 req/min |
| Team | $300/mo | 20,000 | 300 req/min |
| Company | $1,000/mo | 100,000 | 500 req/min |
Each endpoint has a fixed posted price per successful call — most fall between 1 and 10 credits — shown on this API's page before you run it. Exceeding the rate limit returns a 429 response. Authenticate with the X-API-Key header.