Guide · Voice AI

Connect MeiSIM to Vapi

Give your Vapi assistant a real US mobile number on a national carrier. It answers calls to the number and calls out with the number as caller ID. These are the exact steps and JSON we used, tested end to end on November 12, 2026. It takes about ten minutes.

Need a number first?

A voice line is $45 a number a month, texts included. Two months minimum on the first term.

Apply for API access

What you need

How the two connect

Vapi connects to a phone carrier through what it calls a BYO SIP trunk. On our side the line runs in trunk mode: our switch keeps the number connected to the carrier, and the line gets a SIP login of its own.

Vapi never registers with a carrier, and trunk mode does not need it to.

Step 1. Switch the line to trunk mode

A new voice line shows sip_mode: "register" until you do this.

curl -X POST https://api.meisimusa.com/api/v1/sms/lines/7185550100/sip/mode \ -H 'x-dealer-key: YOUR_MEISIM_KEY' \ -H 'Content-Type: application/json' \ -d '{"mode":"trunk"}' → { "ok": true, "number": "7185550100", "sip_mode": "trunk", "sip": { "mode": "trunk", "host": "sip.meisimusa.com", "port": 5060, "tls_port": 5061, "user": "YOUR_SIP_USER", "password": "YOUR_SIP_PASSWORD" } }

Keep sip.user and sip.password. The password is in this answer and is never shown again. If you lose it, POST /api/v1/sms/lines/7185550100/sip/rotate gives a new one.

Step 2. Create the SIP trunk in Vapi

curl -X POST https://api.vapi.ai/credential \ -H 'Authorization: Bearer YOUR_VAPI_PRIVATE_KEY' \ -H 'Content-Type: application/json' \ -d '{ "provider": "byo-sip-trunk", "name": "MeiSIM", "gateways": [ { "ip": "45.77.205.201", "port": 5060, "netmask": 32, "inboundEnabled": true, "outboundEnabled": true, "outboundProtocol": "udp" } ], "outboundAuthenticationPlan": { "authUsername": "YOUR_SIP_USER", "authPassword": "YOUR_SIP_PASSWORD" }, "outboundLeadingPlusEnabled": true }'

Step 3. Have an assistant ready

Any Vapi assistant works. Three of its settings matter on a phone line:

If your calls stop by themselves after a pause or at ten minutes, it is one of the first two.

Step 4. Import the number into Vapi

curl -X POST https://api.vapi.ai/phone-number \ -H 'Authorization: Bearer YOUR_VAPI_PRIVATE_KEY' \ -H 'Content-Type: application/json' \ -d '{ "provider": "byo-phone-number", "name": "MeiSIM line", "number": "+17185550100", "numberE164CheckEnabled": true, "credentialId": "YOUR_CREDENTIAL_ID", "assistantId": "YOUR_ASSISTANT_ID" }'

Write the number with +1 in front. Keep the id in the answer: it is the phone number id you place calls with.

Step 5. Send the line's incoming calls to Vapi

curl -X PATCH https://api.meisimusa.com/api/v1/sms/lines/7185550100/sip/inbound \ -H 'x-dealer-key: YOUR_MEISIM_KEY' \ -H 'Content-Type: application/json' \ -d '{"preset":"vapi","params":{"credential_id":"YOUR_CREDENTIAL_ID"}}'

Calls to the number now go to +17185550100@YOUR_CREDENTIAL_ID.sip.vapi.ai, from our address 45.77.205.201. It is live within a minute.

Step 6. Test it

Call the number from any phone. Your assistant answers.

Then place a call out:

curl -X POST https://api.vapi.ai/call \ -H 'Authorization: Bearer YOUR_VAPI_PRIVATE_KEY' \ -H 'Content-Type: application/json' \ -d '{ "assistantId": "YOUR_ASSISTANT_ID", "phoneNumberId": "YOUR_PHONE_NUMBER_ID", "customer": { "number": "+13105550199" } }'

The phone you call shows your MeiSIM number.

What we tested

TestResult
A call inAnswered about one second after it reached us. Audio both ways. Vapi sees the caller's number.
A call outThe called phone shows the line's number. Either side can end the call.
A second call while one is upRefused. A number carries one call at a time.
A long call16 minutes with audio both ways the whole time.
Keypad digitsVapi received the digits the caller pressed.
A text while the line is on VapiStill reached the webhook and the API.

When a call fails

Vapi shows a short reason on the call. Our call log says the rest: GET /api/v1/sms/calls lists every call with how it ended, the reason in plain words and the fix.

What Vapi showsWhat happened
customer-busy, no chargeThe line was already on a call. One number carries one call at a time, so calls at the same moment need more numbers.
call.in-progress.error-providerfault-outbound-sip-403-forbiddenOur switch refused the SIP login: the user or the password does not match. Our call log says which.
call.in-progress.error-sip-outbound-call-failed-to-connectOur switch did not place the call. These lines call US numbers only, and our call log names the reason.
A call in never reaches the assistantCheck the line's forwarding: sip.inbound in GET /api/v1/sms/lines. With none set, the caller hears busy. We email you once when calls into a line start failing, with the reason and the fix.

After you rotate the SIP password, create a new trunk in Vapi with the new password and point the number at it (PATCH /phone-number/YOUR_PHONE_NUMBER_ID with the new credentialId). In our test, a password changed on an existing trunk was not used by calls placed right after, and a new trunk worked within half a minute.

Good to know

Questions

Does Vapi need to register the number?

No. Vapi sends each call with the line's SIP login, and our switch forwards incoming calls to your trunk's address. Nothing registers.

Can one number take several calls at once?

No. One number carries one call at a time, in either direction. Ten calls at once means ten numbers, each imported into Vapi the same way.

What does the person I call see?

Your MeiSIM number. It is a real US mobile number on a national carrier.

Where do I see why a call failed?

In our call log, GET /api/v1/sms/calls, or the Call log window in your dashboard. Each call has its result, the reason in plain words and the fix when there is one.

💬 Message us on WhatsApp · instant answers, 24/7