musafir.comVisa API
How it worksTry itCatalogueOrdersTrackingSandboxFAQ
Request early access
Private beta · onboarding pilot partners

Sell visas to your customers. Three calls to integrate.

Browse a priced catalogue, place an order, get the decision on a webhook. We handle the documents, the consulate and the paperwork behind them — you keep the customer, the brand and the margin.

Request early accessSee the three calls
  • No visa expertise needed
  • No card payments to take
  • Pilot partners get the sandbox first
catalogue.shcURL
curl https://api.musafir.com/b2b/v1/visa/AE \
  -H "Authorization: Bearer $MUSAFIR_TOKEN"
200 OKJSON
{
  "destination": "AE",
  "currency": "AED",
  "options": [
    {
      "skuId": "665f7c1e9a3b4d2f18c07a91",
      "title": "Tourist · 30 days · single entry",
      "price": 349.00,
      "processing": "Standard",
      "estimatedDays": [3, 5],
      "documents": ["PASSPORT", "PHOTO", "RETURN_TICKET"],
      "bookableOnline": true
    }
  ]
}
66Destinations, priced and sellable
20+Years of experience
1.6M+Visas processed
98.2%Visa success rate
Why this is hard

Visas are where international bookings quietly die.

Not because the product is complicated — because the operation behind it is. That operation is the thing we are handing you.

The rules never sit still

Eligibility, fees and document lists change by nationality, by residency and by consulate — and they change without notice. Keeping a visa rulebook current is a full-time operation, not a feature.

Documents kill the booking

Chasing passport scans over email is where an international booking quietly dies. Every day between intent and submission is a cancellation waiting to happen.

Nobody owns the status

Once an application leaves your hands you have nothing to tell the traveller — until they call. Support absorbs a cost that should never have existed.

How it works

Three calls and you're selling.

That is the integration. Not a phase-one, not a pilot scope — the whole thing. Everything that makes visas hard is on our side of the line.

sell-a-visa.jsNode.js
import { Musafir } from "@musafir/visa";

const musafir = new Musafir(process.env.MUSAFIR_API_KEY);

// 1. What can this traveller actually get?
const { options } = await musafir.visas.list({
  destination: "AE",
  nationality: "IN",
  residency: "AE",
});

// 2. Sell it at your price. We invoice you, not your customer.
const order = await musafir.orders.create({
  skuId: options[0].skuId,
  traveller,
});

// 3. We take it from here.
musafir.on("order.decided", ({ orderId, outcome, documentUrl }) => {
  notifyCustomer(orderId, outcome, documentUrl);
});
  • No rulebook to maintain

    Eligibility, fees and document lists differ by nationality, residency and consulate, and they move without notice. That is our problem, and the answer arrives in the catalogue response.

  • No documents to chase

    Upload what the traveller gives you and we validate it against what the consulate will actually accept — before it is submitted, not after it is rejected.

  • No payments to take

    Orders draw against a credit line and settle on invoice. You never handle a visa fee, so the API adds nothing to your PCI scope.

Try it

Change the traveller. Watch the rules move.

This is our live catalogue — the same eligibility rules, prices and document lists running musafir.com right now. Pick a nationality, a residency and a destination, and see exactly what a partner would get back. Some combinations lose a visa entirely; some change the paperwork. That is the work you are handing us.

01Catalogue

Every visa we can process, priced for you.

Ask for a destination and get back the options that traveller is actually eligible for — with your contracted fee, the processing tier, and the exact document list the consulate will ask for.

  • Your price, not ours. A partner is a channel, so the catalogue arrives already priced for you.
  • Eligibility resolved per nationality and residency, so you never show a visa the traveller cannot apply for.
  • The same catalogue that runs musafir.com. It cannot go stale relative to our own storefront, because it is our storefront.
catalogue.shcURL
curl https://api.musafir.com/b2b/v1/visa/AE \
  -H "Authorization: Bearer $MUSAFIR_TOKEN"
200 OKJSON
{
  "destination": "AE",
  "currency": "AED",
  "options": [
    {
      "skuId": "665f7c1e9a3b4d2f18c07a91",
      "title": "Tourist · 30 days · single entry",
      "price": 349.00,
      "processing": "Standard",
      "estimatedDays": [3, 5],
      "documents": ["PASSPORT", "PHOTO", "RETURN_TICKET"],
      "bookableOnline": true
    }
  ]
}
02Orders

Place the order. Keep the customer.

Create the order, attach travellers and documents, submit. There is no hosted checkout to redirect into and no card to collect — the order books against your account and settles on invoice.

  • Idempotency-Key on every write, so a retry can never charge a traveller twice.
  • Submit runs the same completeness check our own checkout runs — you find out a document is missing before the consulate does.
  • Over your credit limit returns a 402, never a silent failure.
create-order.shcURL
curl -X POST https://api.musafir.com/b2b/v1/orders \
  -H "Authorization: Bearer $MUSAFIR_TOKEN" \
  -H "Idempotency-Key: 8f14e45f-ea2b-4c1d-9f3a-77b1c0d2e9a4" \
  -d '{
    "skuId": "665f7c1e9a3b4d2f18c07a91",
    "nationality": "IN",
    "residency": "AE",
    "partnerCustomerRef": "BOOKING-91882",
    "contact": {
      "fullName": "Aarav Sharma",
      "email": "aarav@example.com"
    }
  }'
201 CreatedJSON
{
  "orderId": "ord_2f9c41a7",
  "reference": "VIS-Q8NN6J",
  "status": "Draft",
  "nextActions": ["travelers", "documents", "submit"],
  "total": {
    "amount": 349.00,
    "currency": "AED"
  }
}
03Tracking

Never answer “where’s my visa?” again.

Status is pushed, not polled. Every transition fires a signed webhook, and when the authority decides, the outcome and any issued document land on your endpoint.

  • HMAC-signed and retried — verify the signature, return a 200, we stop.
  • Subscribe per event: submitted, documents required, decided.
  • The webhook carries who decided, so the answer you give your customer is the authority's, not ours.
  1. Draft
  2. Submitted
  3. In review
  4. With authority
  5. Decided
webhookHTTP
POST https://your-app.example.com/webhooks/musafir
X-Musafir-Signature: t=1752480000,v1=8a4f2c...
PayloadJSON
{
  "event": "order.decided",
  "orderId": "ord_2f9c41a7",
  "occurredAt": "2026-07-14T09:12:04Z",
  "travelers": [
    {
      "travelerId": "trv_1",
      "outcome": "Approved",
      "decidedBy": "UAE ICP",
      "document": {
        "validUntil": "2026-11-30",
        "documentUrl": "https://api.musafir.com/b2b/v1/orders/ord_2f9c41a7/travelers/trv_1/document"
      }
    }
  ]
}
Where the line sits

We don’t issue visas. No one but the government does.

Musafir is a licensed visa processing agent. We prepare, submit and track applications with the issuing authority. The decision — approve, reject, ask for more — belongs to that government alone, and no API changes that. What you can promise your customer is a correct application, submitted quickly, tracked to a decision. Not the decision itself.

What we take off your hands

  • An eligibility-checked, priced catalogue for that exact traveller
  • The document list the consulate actually requires, and validation against it
  • Submission to the consulate, embassy or visa application centre
  • Status through to the decision, plus any document the authority issues
  • Refunds and cancellations, per each destination’s published policy

What no one can sell you

  • A guaranteed approval, or any influence over the decision
  • A processing time faster than the authority’s own
  • A way around biometrics or an in-person appointment where one is mandated
  • A change to government fees, which we pass through unmarked
  • Immigration or legal advice — we process applications, we do not advise on status
The sandbox

Built to be broken, before you build on it.

This is what we are building for pilot partners — not something you can sign up for this afternoon. Reserved test inputs let you force an approval, a rejection or a documents-required loop on demand, so you can write the unhappy paths without waiting on a consulate to reject something for you.

01

Tell us what you'd build

Two minutes on the form below. We reply within two business days — with where things actually stand, not a brochure.

02

See the contract

Pilot partners get the full API contract and shape the parts that don't fit yet, while they still can.

03

Sandbox keys, first

When the sandbox opens, pilot partners get the keys before it is announced to anyone else.

Reserved test inputs

Force any outcome you need to handle, on demand — so you can write the rejection path without waiting on a consulate to reject something for you.

Sandbox inputWhat it forces
Passport marked APPROVEOrder is decided as approved and the webhook fires
Passport marked REJECTOrder is decided as rejected, your account is credited back
Passport marked DOCSDocuments-required loop, back to Draft
SKU prefixed SLOW-Delayed decision, for testing your retry and timeout paths
Idempotency-Key: replay-*Returns the first order instead of creating a duplicate
Amount over the sandbox limit402 over credit limit

Sandbox tokens will be rejected by production and production tokens by the sandbox, so a test order can never touch a real one. Traveller comms stay suppressed; webhooks do not.

Who it’s for

One integration. Four very different businesses.

Travel agencies

Stop couriering passports and queueing at typing centres. Take the application at the counter and let us carry it to the consulate.

Online travel agencies

Attach a visa to every international booking. It is the highest-margin ancillary you are not currently selling.

Airlines

Surface the document requirement before check-in, not at the gate. Fewer denied boardings, one less INAD fine.

Travel management companies

Corporate travellers tracked to a decision, with the policy controls and reporting your clients already expect.

Questions

The awkward ones, answered.

Including the ones we would rather you didn’t ask. If something here isn’t straight enough, tell us and we’ll fix the answer.

Be one of our first partners

We are choosing a small group of pilot partners to build this with. Tell us what you would sell and we will show you the contract while it can still change.

We reply within two business days with the API contract, an honest read on where the build stands, and a call with the engineers doing it. Sandbox keys go to pilot partners first, the moment they exist.

musafir.com

Making travel accessible by simplifying the visa process for everyone, everywhere.

Tourist Visas

Dubai VisaSchengen VisaUSA VisaSingapore VisaThailand Visa

Top holiday ideas

UAE Staycation DealsEurope Tour PackagesSaudi Holiday PackagesMaldives PackagesAzerbaijan Packages

Others

BlogTermsPrivacy policy

© 2026 Musafir.com. All rights reserved.

Try it

Change the traveller. Watch the rules move.

This is our live catalogue — the same eligibility rules, prices and document lists running musafir.com right now. Pick a nationality, a residency and a destination, and see exactly what a partner would get back. Some combinations lose a visa entirely; some change the paperwork. That is the work you are handing us.

2 visas they can buy

  • Business Sticker Visa

    Standard · 7–8 days

    AED 195
  • Tourist Sticker Visa

    Standard · 7–8 days

    AED 195

Documents this consulate wants from them

  • First Page of Passport
  • Last Page of Passport
  • Residence Visa
  • Residence ID
  • Invitation Letter
  • Flight Ticket (optional)
  • Accommodation Proof (optional)
  • Questionnaire

Change the nationality and watch this list change. Keeping it correct, per profile, per consulate, is the job you are handing us.

catalogue.shcURL
curl "https://api.musafir.com/b2b/v1/visa/DZ?nationality=IN&residency=AE" \
  -H "Authorization: Bearer $MUSAFIR_TOKEN"
200 OKJSON
{
  "destination": "DZ",
  "nationality": "IN",
  "residency": "AE",
  "visaRequired": true,
  "currency": "AED",
  "options": [
    {
      "skuId": "019ed11f-b573-7558-832e-d48b3906a6e8",
      "title": "Business Sticker Visa",
      "price": 195,
      "processing": "Standard",
      "estimatedDays": [
        7,
        8
      ],
      "bookableOnline": true
    },
    {
      "skuId": "019ed11f-a311-7011-a5d5-d9e76ffc7032",
      "title": "Tourist Sticker Visa",
      "price": 195,
      "processing": "Standard",
      "estimatedDays": [
        7,
        8
      ],
      "bookableOnline": true
    }
  ],
  "documents": [
    "PASSPORT_FIRST_PAGE",
    "LAST_PASSPORT",
    "RESIDENCY_VISA",
    "RESIDENCY_ID",
    "INVITATION_LETTER",
    "FLIGHT_TICKET",
    "HOTEL_BOOKING",
    "QUESTIONNAIRE"
  ]
}

Real answers from our live catalogue, shaped into the B2B response we intend to ship. The B2B endpoint itself isn't live yet — this is what it will return.