Your booking flow,
plus the visa step.
Elements are drop-in components for the page you already have. Requirements, checkout and status render inside your layout, in your brand. The traveler never leaves your site, and passport data never touches your servers.
<!-- your booking confirmation page --> <div id="visa"></div> <script src="https://js.simplevisa.com/v1"></script> <script> const sv = SimpleVisa('pk_live_9f2a…'); sv.mount('#visa', { element: 'requirements', nationality: 'FR', destination: 'KE', layover: ['QA'], departure: '2026-09-12', travellers: 1 }); </script>
See it on one of your own pages.
A booking confirmation, mocked up with a partner brand from the studio. Pick an element; everything inside the dashed outline is rendered by the library, and the snippet under it is what you paste.
sv.mount('#visa', { element: 'trip', display: 'inline', brand: 'nordwind', origin: 'FR', travellers: [{ type: 'adult', nationality: 'FR' }, { type: 'adult', nationality: 'MA' }, { type: 'child', nationality: 'FR', age: 7 }], onComplete: (order) => track('visa_purchased', order.total) });
sv.mount('#visa', { element: 'requirements', display: 'inline', brand: 'nordwind', nationality: 'FR', destination: 'KE', layover: ['QA'], onComplete: (order) => track('visa_purchased', order.total) });
sv.mount('#visa', { element: 'checkout', display: 'inline', brand: 'nordwind', order: 'ord_8fa21c', onComplete: (order) => track('visa_purchased', order.total) });
sv.mount('#visa', { element: 'status', display: 'inline', brand: 'nordwind', order: 'ord_8fa21c', onComplete: (order) => track('visa_purchased', order.total) });
sv.mount('#visa', { element: 'document', display: 'inline', brand: 'nordwind', order: 'ord_8fa21c', onComplete: (order) => track('visa_purchased', order.total) });
sv.mount('#visa', { element: 'badge', display: 'inline', brand: 'nordwind', nationality: 'FR', destination: 'KE', onComplete: (order) => track('visa_purchased', order.total) });
Seven elements. Use one or all of them.
Most partners start with trip and requirements on the confirmation page, and add checkout once they see the attach rate. Pass what your booking already knows and the questions disappear.
Everything the answer depends on
A visa answer is never just "passport plus destination". This element collects the full picture: origin, destination, every layover with its duration and whether the traveler leaves the airport, the dates, the reason for travel, and a passport for each person in the party, adults and children alike. It hands a clean payload to requirements.
What this trip needs
A grid of every traveler against every country on the route. Each cell is either a document with its fee and processing time, or a plain "nothing needed", and the slowest item is called out so the party knows what to start first.
Applicant form and payment
Passport scan, applicant details, card. Runs in our iframe, so card and passport data stay out of your stack entirely.
Where the application is
The same timeline the traveler sees on our site, inside your account area. Live, so your support team stops fielding "where is my visa" tickets.
The approved visa itself
Once the government answers, this element shows the document with its validity dates and a download of the actual PDF, plus print and wallet. No email hunt, no login to our site.
A one-line warning
Fits in a search result or a fare row: "Visa required · from $78". Opens the full element on click, in whichever display mode you set.
Missing document requests
When our team needs a clearer passport scan, the traveler can send it from your page instead of an email thread.
Need something else?
Elements sit on the same public API you can call directly. If your flow does not fit one of the seven, build it on the Requirements and Applications endpoints.
Elements wear a brand you already designed.
A brand holds the logo, colors, corner radius and typeface. You design it once in the console and name it here; the same brand can dress this mount, a hosted storefront, and the emails travelers get. An element needs a brand, not a storefront.
sv.mount('#visa', { element: 'requirements', brand: { primary: '#0B3B8C', secondary: '#F2B705', radius: '2px', font: 'Archivo, sans-serif', logo: 'https://…/nordwind.svg' } });
Mount options
Events
Passport numbers, scans and card details are entered inside our iframe and posted straight to us. Your page receives the order reference, the status and the amount: enough to reconcile, nothing you have to protect.
Sandbox keys are instant.
Mount an element against test data today, switch the key when you are ready. No call needed to get started.