VFS Global automated end-to-end.
End-to-end, not step-by-step
Slot discovery across centres
Poll every supported VFS centre for your corridor. Adaptive cadence — burst during predicted drop windows, calm otherwise. Per-applicant-count banners parsed and surfaced.
Cloudflare Turnstile solved
The 2026 VFS login wall is Turnstile-gated. We productionised the MessageEvent forge technique (Probe H) so login goes through without you wiring a captcha provider.
2FA routed to your user
When VFS sends an email or SMS code during login or slot hold, we pause the run, push the prompt to your user's dashboard (or webhook), and resume the moment they submit.
Watch-only tier for flex customers
Users not ready to pay the full booking fee? Put them on the $49 watch tier — we monitor and email when slots open, they book themselves. Upgrade to Watch & Book in one click.
Retries that survive portal resets
VFS returns you to a queue waiting room on high load; the worker detects it, waits up to 5 minutes, then re-enters without losing booking state. Backed by a durable state machine.
Evidence bundle on confirmation
Confirmation ref + date + time + center extracted from the final page. Screenshot and DOM snapshot stored. Signed URLs valid 24h, fetchable via GET /bookings/:id/evidence.
From CREATED to BOOKED
CREATEDAUTHENTICATINGAUTH_OTP_REQUIREDCHECKING_AVAILABILITYHOLDING_SLOTCONFIRM_OTP_REQUIREDBOOKEDNon-happy-path states (CREDENTIALS_REQUIRED, OPERATOR_ESCALATED, PORTAL_PAYMENT_REQUIRED, RETRY_SCHEDULED) are all first-class. See the developer reference for the full enum.
Edge cases we've already solved
VFS queue page
High-load days trigger a waiting-room. Workers hold for up to 5 minutes, then retry the booking lane. No state loss.
CF edge 403201 (hosting ASN block)
VFS blocks all hosting-provider IPs at the Cloudflare layer. We run workers behind residential-proxy egress so requests look like a real applicant from the origin country.
Pre-populated mat-select dropdowns
Some corridors pre-fill center or visa type. Our probe guard detects the existing selection and skips the re-select that would wipe the downstream form.
DD-MM-YYYY availability banners
VFS surfaces 'Earliest available DD-MM-YYYY' text in a sibling element. We regex-parse both the banner and any inline calendar so no-slot states are never silent.
SHORTY STAY sub-type typo
VFS's own option label misspells 'short stay' as 'shorty stay'. Our option-matcher tolerates the typo; new portal tweaks get captured via recon dumps before they break live bookings.
Create a VFS booking via API
bashcurl -X POST https://api.opaige.com/bookings \ -H "Authorization: Bearer opk_live_…" \ -H "Content-Type: application/json" \ -H "Idempotency-Key: vfs-nga-dnk-2026-06-01" \ -d '{ "applicantName": "Ada Lovelace", "applicantEmail": "ada@example.com", "citizenship": "NGA", "destinationCountry": "DNK", "visaType": "TOURIST", "portalType": "VFS_GLOBAL", "bookingCenter": "Lagos", "preferredDateStart": "2026-06-01", "preferredDateEnd": "2026-06-15", "productTier": "WATCH_AND_BOOK" }'
Subscribe your webhook to booking.status_changed to mirror the lifecycle on your side, and booking.confirmed to pull the evidence bundle the moment VFS confirms.