The dataset behind this site
Every figure on img-fix comes from this one dataset, and the dataset itself is downloadable — free, no key, no signup, CC BY 4.0.
Download
- Passport, visa and ID photo specs by country JSON · 47 rows
- Exam & government portal upload limits JSON · 23 rows
- Passport, visa and ID photo specs by country CSV · 47 rows
| Passport/visa/ID rows published | 47 |
|---|---|
| Portal rows published | 23 |
| Rows withheld (no official source) | 19 |
| Licence | CC BY 4.0 |
| Compiled | 2026-07-28 |
Field schema
| Field | Type | Meaning |
|---|---|---|
| slug | string | Stable identifier, matches the page at /passport-photo/<slug>. |
| country / countryCode | string | Country name and ISO code, or a region name (e.g. "Schengen Area") where no single code applies. |
| documentType | passport | visa | id | Which document the photo is for. |
| photoTakenOnSite | boolean | null | True where the issuing authority photographs the applicant and does not accept a supplied photo, at least for the standard route. |
| object | widthMm, heightMm, widthIn, heightIn, count — the physical printed photo size, where one is published. | |
| head | object | minMm/maxMm or pctMin/pctMax — the permitted crown-to-chin head height, in millimetres or as a percentage of image height. |
| digital | object | required, widthPx/heightPx or min/maxWidthPx/HeightPx, dpiMin, format, minKB/maxKB — the digital upload spec, where one exists. |
| background | string | null | The published background requirement, verbatim or closely paraphrased — not assumed to be "white". |
| recencyMonths | number | null | How old the photo is allowed to be, in months. |
| rules | object | glasses, headCovering, expression, children — prose rules, quoted from the source rather than summarised into a category. |
| sourceTier | primary | official-secondary | unavailable | Whether this came from the issuing authority’s own page or a secondary official mirror. |
| source | object | name, url, accessed — the official page this row was read from, and the date it was read. |
| conflicts | array | Cases where two official sources disagree, with both values and both URLs. |
The JSON endpoints wrap the rows in an object carrying license,
attribution, source, compiled,
schemaVersion, rowCount and a gaps array — see
below for why gaps are published rather than omitted. The CSV carries the same licence
and attribution as #-prefixed comment lines above the header row.
How this is compiled
Every row starts from the issuing authority's own specification page or PDF — a passport agency, an interior ministry, an immigration service, an exam board. Nothing is copied from a photo-shop site, a visa agency or a forum answer, no matter how often the same figure circulates there. The URL and the date it was read are recorded on every row, and the sources page lists every one of them in one place, including the handful read from an official secondary source rather than the primary page.
Why rows are withheld instead of guessed
19 rows do not appear in the data at all — no
print size, no head height, nothing. That is deliberate: a wrong passport photo
specification gets somebody's application rejected, so a figure with no readable
official source is treated as unknown rather than filled in from a secondary guess. The
gaps array in each JSON response names the withheld row and the reason,
which is the same list published on /sources. A dataset that
shows you what it would not publish is easier to trust than one that quietly has an
answer for everything.
What people have found in it
Surprising passport photo rules, derived from this dataset walks through several of the patterns hiding in these rows — countries that ban a plain white background, countries that photograph you rather than take your photo, and the size that most of the world actually agrees on.