The developer's guide to VFS Global automation
Why VFS is hard to integrate with
VFS Global hosts ~140 country-pair visa portals under the umbrella domains visa.vfsglobal.com and www.vfsglobal.com. The URL pattern is predictable — /{origin}/{lang}/{destination}/book-appointment — but that's where predictability ends. Every corridor can have its own flavour of the Angular booking app underneath.
Architecturally you're working across three layers: the CDN edge, the Angular single-page app (booking UI + OTP state), and the VFS backend (slot assignment). Any one of them can change without notice — which is why a maintained integration layer beats a one-off script that breaks the first time a corridor is updated.
Reaching the portal reliably
Requests to visa.vfsglobal.com from generic hosting-provider IPs (AWS, GCP, Railway, DigitalOcean, etc.) are often refused at the CDN edge — you get a canned response rather than the portal:
{"code":"403201","description":""}Reaching the portal reliably from server infrastructure takes origin-appropriate, authorized access and continuous upkeep as the portal's controls evolve — exactly the layer a generic in-house script cannot sustain. Opaige operates this on your behalf as an authorized booking agent working through the applicant's own account.
Login verification steps
On many corridors VFS adds an extra verification step to the login form (for example, a Cloudflare Turnstile challenge). These are a normal part of the portal's flow, and Opaige is built to complete them reliably as part of the supported booking sequence — no separate wiring on your side.
The value isn't a one-time trick; it's the maintenance. When VFS changes how a corridor's login behaves, that handling is updated centrally and absorbed across every customer at once, so your bookings keep flowing.
Angular mat-selects and the queue page
The booking form is Angular Material. Dropdowns are <mat-select> elements with overlay panels rendered in a cdk-overlay-container at the body root. Clicking the visible trigger works; typing into it does not.
Two gotchas:
- Some corridors pre-populate center or visa type. If you select again you clear downstream selections. Guard for the existing value before issuing a click.
- A
cdk-overlay-backdropcan intercept clicks on the next dropdown after a selection — the previous overlay hasn't fully unmounted. Wait for the backdrop to detach before the next selection.
VFS also queues you on high-load days. You'll hit a waiting-room page with a rotating spinner that eventually admits you. Detect the queue selector, wait patiently, then resume — never hammer the portal.
Reading availability without side effects
The safe way to check slot availability is read-only: dashboard → Start New Booking → select center + visa category, then read the availability banner ("Earliest available DD-MM-YYYY") without filling /your-details or clicking Save. Running the full booking flow just to look is destructive — it can hold a slot and fail the confirm, which applicants get emailed about. Opaige deliberately keeps availability checks non-destructive so the portal (and other applicants) are never affected.
VFS surfaces one banner per applicant-count once the dropdowns are populated. Read all banners; the lowest count + earliest date combo is your best move. Inline calendars appear on some corridors — read those with a cell selector and cross-reference with the banner.
OTPs at two steps
VFS sends an OTP during login (sometimes — varies by corridor and account age) and always during final confirmation. Because the account is the applicant's own, these codes are routed to the applicant to approve — Opaige never owns a synthetic identity. See the dedicated OTP latency guide for how to architect the round trip.
What this costs to build and maintain
The honest cost
None of the above is impossible to build. But cumulatively it's weeks of engineering plus ongoing maintenance as VFS ships changes without notice. That's the whole reason Opaige exists: one authorized, maintained integration layer, so you get reliable bookings without owning the upkeep.
If you're an agency doing <20 bookings/month, automate the easy parts and lean on humans for the rest. If you're a platform handling volume, the maths flips fast — slot success rate dominates cost.