Submit a port
curl --request POST \
--url https://osis.co/api/v1/comms/lines/{e164}/port \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"target_e164": "<string>",
"lnp": {},
"lnp.account_number": "<string>",
"lnp.porting_pin": "<string>",
"lnp.account_holder_first_name": "<string>",
"lnp.account_holder_last_name": "<string>",
"lnp.address_line1": "<string>",
"lnp.address_line2": "<string>",
"lnp.city": "<string>",
"lnp.state": "<string>",
"lnp.zip": "<string>",
"lnp.country": "<string>"
}
'import requests
url = "https://osis.co/api/v1/comms/lines/{e164}/port"
payload = {
"target_e164": "<string>",
"lnp": {},
"lnp.account_number": "<string>",
"lnp.porting_pin": "<string>",
"lnp.account_holder_first_name": "<string>",
"lnp.account_holder_last_name": "<string>",
"lnp.address_line1": "<string>",
"lnp.address_line2": "<string>",
"lnp.city": "<string>",
"lnp.state": "<string>",
"lnp.zip": "<string>",
"lnp.country": "<string>"
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
target_e164: '<string>',
lnp: {},
'lnp.account_number': '<string>',
'lnp.porting_pin': '<string>',
'lnp.account_holder_first_name': '<string>',
'lnp.account_holder_last_name': '<string>',
'lnp.address_line1': '<string>',
'lnp.address_line2': '<string>',
'lnp.city': '<string>',
'lnp.state': '<string>',
'lnp.zip': '<string>',
'lnp.country': '<string>'
})
};
fetch('https://osis.co/api/v1/comms/lines/{e164}/port', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://osis.co/api/v1/comms/lines/{e164}/port",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'target_e164' => '<string>',
'lnp' => [
],
'lnp.account_number' => '<string>',
'lnp.porting_pin' => '<string>',
'lnp.account_holder_first_name' => '<string>',
'lnp.account_holder_last_name' => '<string>',
'lnp.address_line1' => '<string>',
'lnp.address_line2' => '<string>',
'lnp.city' => '<string>',
'lnp.state' => '<string>',
'lnp.zip' => '<string>',
'lnp.country' => '<string>'
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://osis.co/api/v1/comms/lines/{e164}/port"
payload := strings.NewReader("{\n \"target_e164\": \"<string>\",\n \"lnp\": {},\n \"lnp.account_number\": \"<string>\",\n \"lnp.porting_pin\": \"<string>\",\n \"lnp.account_holder_first_name\": \"<string>\",\n \"lnp.account_holder_last_name\": \"<string>\",\n \"lnp.address_line1\": \"<string>\",\n \"lnp.address_line2\": \"<string>\",\n \"lnp.city\": \"<string>\",\n \"lnp.state\": \"<string>\",\n \"lnp.zip\": \"<string>\",\n \"lnp.country\": \"<string>\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://osis.co/api/v1/comms/lines/{e164}/port")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"target_e164\": \"<string>\",\n \"lnp\": {},\n \"lnp.account_number\": \"<string>\",\n \"lnp.porting_pin\": \"<string>\",\n \"lnp.account_holder_first_name\": \"<string>\",\n \"lnp.account_holder_last_name\": \"<string>\",\n \"lnp.address_line1\": \"<string>\",\n \"lnp.address_line2\": \"<string>\",\n \"lnp.city\": \"<string>\",\n \"lnp.state\": \"<string>\",\n \"lnp.zip\": \"<string>\",\n \"lnp.country\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://osis.co/api/v1/comms/lines/{e164}/port")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"target_e164\": \"<string>\",\n \"lnp\": {},\n \"lnp.account_number\": \"<string>\",\n \"lnp.porting_pin\": \"<string>\",\n \"lnp.account_holder_first_name\": \"<string>\",\n \"lnp.account_holder_last_name\": \"<string>\",\n \"lnp.address_line1\": \"<string>\",\n \"lnp.address_line2\": \"<string>\",\n \"lnp.city\": \"<string>\",\n \"lnp.state\": \"<string>\",\n \"lnp.zip\": \"<string>\",\n \"lnp.country\": \"<string>\"\n}"
response = http.request(request)
puts response.read_bodyLines
Submit a port
POST /api/v1/comms/lines//port — one-time LNP port onto a locked dedicated line.
POST
https://osis.co
/
api
/
v1
/
comms
/
lines
/
{e164}
/
port
Submit a port
curl --request POST \
--url https://osis.co/api/v1/comms/lines/{e164}/port \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"target_e164": "<string>",
"lnp": {},
"lnp.account_number": "<string>",
"lnp.porting_pin": "<string>",
"lnp.account_holder_first_name": "<string>",
"lnp.account_holder_last_name": "<string>",
"lnp.address_line1": "<string>",
"lnp.address_line2": "<string>",
"lnp.city": "<string>",
"lnp.state": "<string>",
"lnp.zip": "<string>",
"lnp.country": "<string>"
}
'import requests
url = "https://osis.co/api/v1/comms/lines/{e164}/port"
payload = {
"target_e164": "<string>",
"lnp": {},
"lnp.account_number": "<string>",
"lnp.porting_pin": "<string>",
"lnp.account_holder_first_name": "<string>",
"lnp.account_holder_last_name": "<string>",
"lnp.address_line1": "<string>",
"lnp.address_line2": "<string>",
"lnp.city": "<string>",
"lnp.state": "<string>",
"lnp.zip": "<string>",
"lnp.country": "<string>"
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
target_e164: '<string>',
lnp: {},
'lnp.account_number': '<string>',
'lnp.porting_pin': '<string>',
'lnp.account_holder_first_name': '<string>',
'lnp.account_holder_last_name': '<string>',
'lnp.address_line1': '<string>',
'lnp.address_line2': '<string>',
'lnp.city': '<string>',
'lnp.state': '<string>',
'lnp.zip': '<string>',
'lnp.country': '<string>'
})
};
fetch('https://osis.co/api/v1/comms/lines/{e164}/port', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://osis.co/api/v1/comms/lines/{e164}/port",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'target_e164' => '<string>',
'lnp' => [
],
'lnp.account_number' => '<string>',
'lnp.porting_pin' => '<string>',
'lnp.account_holder_first_name' => '<string>',
'lnp.account_holder_last_name' => '<string>',
'lnp.address_line1' => '<string>',
'lnp.address_line2' => '<string>',
'lnp.city' => '<string>',
'lnp.state' => '<string>',
'lnp.zip' => '<string>',
'lnp.country' => '<string>'
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://osis.co/api/v1/comms/lines/{e164}/port"
payload := strings.NewReader("{\n \"target_e164\": \"<string>\",\n \"lnp\": {},\n \"lnp.account_number\": \"<string>\",\n \"lnp.porting_pin\": \"<string>\",\n \"lnp.account_holder_first_name\": \"<string>\",\n \"lnp.account_holder_last_name\": \"<string>\",\n \"lnp.address_line1\": \"<string>\",\n \"lnp.address_line2\": \"<string>\",\n \"lnp.city\": \"<string>\",\n \"lnp.state\": \"<string>\",\n \"lnp.zip\": \"<string>\",\n \"lnp.country\": \"<string>\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://osis.co/api/v1/comms/lines/{e164}/port")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"target_e164\": \"<string>\",\n \"lnp\": {},\n \"lnp.account_number\": \"<string>\",\n \"lnp.porting_pin\": \"<string>\",\n \"lnp.account_holder_first_name\": \"<string>\",\n \"lnp.account_holder_last_name\": \"<string>\",\n \"lnp.address_line1\": \"<string>\",\n \"lnp.address_line2\": \"<string>\",\n \"lnp.city\": \"<string>\",\n \"lnp.state\": \"<string>\",\n \"lnp.zip\": \"<string>\",\n \"lnp.country\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://osis.co/api/v1/comms/lines/{e164}/port")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"target_e164\": \"<string>\",\n \"lnp\": {},\n \"lnp.account_number\": \"<string>\",\n \"lnp.porting_pin\": \"<string>\",\n \"lnp.account_holder_first_name\": \"<string>\",\n \"lnp.account_holder_last_name\": \"<string>\",\n \"lnp.address_line1\": \"<string>\",\n \"lnp.address_line2\": \"<string>\",\n \"lnp.city\": \"<string>\",\n \"lnp.state\": \"<string>\",\n \"lnp.zip\": \"<string>\",\n \"lnp.country\": \"<string>\"\n}"
response = http.request(request)
puts response.read_bodySubmit the one-time LNP port for a locked dedicated line. Your BYO number (
Scope:
target_e164) replaces the locked dedicated E.164 after completion. Exactly one attempt per locked line.
Contact your current carrier for port-out details. Port speed and success depend on an exact match to the losing carrier’s records.
Access required. Request permission to use the Line Port API before calling this endpoint. This is not unrestricted self-serve porting — live processing is for approved orgs only.
comms_lines_write
Request
curl -X POST "https://osis.co/api/v1/comms/lines/%2B16285551212/port" \
-H "Authorization: Bearer $COMMS_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: port-order-4242" \
-d '{
"target_e164": "+12125550147",
"lnp": {
"account_number": "ACCT-000031",
"porting_pin": "1234",
"account_holder_first_name": "Alex",
"account_holder_last_name": "Rivera",
"address_line1": "123 Main St",
"address_line2": "Apt 4",
"city": "New York",
"state": "NY",
"zip": "10001",
"country": "United States"
}
}'
Path parameters
string
required
Locked dedicated E.164 to replace (URL-encoded).
Headers
| Header | Required | Description |
|---|---|---|
Authorization | Yes | Bearer <COMMS_API_KEY> |
Content-Type | Yes | application/json |
Idempotency-Key | Recommended | Stable key for safe retries |
Body parameters
string
required
E.164 of the number you are bringing to Comms.
object
required
Carrier LNP fields from your current carrier’s port-out form. Encrypted at rest; never returned by GET. Values must match the losing carrier’s records exactly.
string
required
Account number from the previous carrier.
string
required
Porting PIN from the previous carrier. If none is required, enter
0000.string
required
First name on the losing-carrier account.
string
required
Last name on the losing-carrier account.
string
required
Service / billing address line 1.
string
Address line 2 (apartment, suite, etc.).
string
required
City.
string
required
State / province (for example
NY).string
required
ZIP / postal code.
string
required
Country (for example
United States).Response
201 Created
{
"port": {
"id": "lport_…",
"org_id": "comms_usr_…",
"locked_e164": "+16285551212",
"target_e164": "+12125550147",
"status": "port_submitted",
"error_code": null,
"error_message": null,
"submitted_at": "2026-08-12T14:05:00.000Z",
"foc_at": null,
"completed_at": null,
"created_at": "2026-08-12T14:00:00.000Z",
"updated_at": "2026-08-12T14:05:00.000Z"
}
}
Errors
| Status | Meaning |
|---|---|
400 | Invalid body |
404 | Lock/port not found for your org |
409 | Conflict (e.g. already submitted) |
429 | Rate limited (3 / 24h per line, 10 / 24h per org) |
⌘I