DEV Community

Jones William
Jones William

Posted on

How I built a self-updating visa database from 13,507 passport-destination pairs

For 12 years I handled international onboarding at a company that shipped hardware to 90+ countries. Every month someone asked me the same thing: "Do we need a visa for our engineer going to Brazil? What about the client in Singapore on an Indian passport?"

And every month I'd open five tabs, cross-reference three outdated travel sites, and still guess wrong on stay limits.

So instead of Googling it, I built a dataset.

The problem with visa data

Visa rules are the dictionary definition of "it depends":

  • A US passport entering Japan = visa-free for 90 days
  • An Indian passport entering Singapore = 30 days visa-free, but you must apply for an e-Visa before arrival if staying longer
  • A Brazilian passport entering Schengen = needs a Schengen visa
  • A UK passport entering some Schengen states = visa-free, but the stay limit resets on exit

Same destination, different passports, completely different answers. And the rules change constantly — countries add eVisas, drop visa-free access, or cap stay lengths with a week's notice.

Most travel sites update this data once a year. That's not fast enough for anyone doing real travel planning or logistics.

What I built

A passport-index dataset with 13,507 passport→destination pairs, covering every combination across passports and destination countries. Each pair stores:

  • Visa-free entry and the exact stay limit
  • eTA / ESTA requirements
  • eVisa availability (and whether it's required pre-arrival)
  • Visa-required flag with a link to the application portal
  • Digital nomad visa support

The whole thing is driven by a policy-monitoring script that watches US Federal Register and government visa-policy sources, so updates get flagged as they happen instead of once a year.

The gotcha nobody tells you about

The hardest part wasn't the data itself — it was the stay-limit and entry-type ambiguity. For example, "visa-free" means different things depending on passport: American travelers to Europe have a hard 90/180-day cap, while passport holders from some Asia-Pacific countries entering the same states face a different rule.

Get one of those wrong and someone shows up at immigration with the wrong assumptions. That's why the dataset keeps visa-free and visa-on-arrival as distinct types, and stores stay limits as first-class fields rather than free-text notes.

Turning it into a live tool

A dataset is only useful if you can query it without a PhD in data wrangling, so I wrapped it in a public lookup:

It's bilingual (EN + ES), because Spanish speakers make up a huge share of the visa-application traffic that nobody else serves well.

If you want the raw data

The dataset is open and machine-readable — handy for travel platforms, migration researchers, or anyone building their own check:

A note on accuracy

Visa rules move fast and details vary by nationality. Always confirm with the destination embassy or consulate before you travel — this dataset is a high-signal starting point, not a substitute for a visa officer's call. I keep the update script running precisely because "check back later" is not an acceptable answer for a travel planner.

If you build passports or visa tooling, or you've got a storage complaint about the dataset schema — grab the data and tell me what you'd change. I'm always happy to make the source better.

Top comments (0)