> ## Documentation Index
> Fetch the complete documentation index at: https://docs.osis.co/llms.txt
> Use this file to discover all available pages before exploring further.

# Submit a port

> POST /api/v1/comms/lines/{e164}/port — one-time LNP port onto a locked dedicated line.

Submit the one-time LNP port for a locked dedicated line. Your BYO number (`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.

<Warning>
  **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.
</Warning>

**Scope:** `comms_lines_write`

## Request

```bash theme={null}
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

<ParamField path="e164" type="string" required>
  Locked dedicated E.164 to replace (URL-encoded).
</ParamField>

### 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

<ParamField body="target_e164" type="string" required>
  E.164 of the number you are bringing to Comms.
</ParamField>

<ParamField body="lnp" type="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.
</ParamField>

<ParamField body="lnp.account_number" type="string" required>
  Account number from the previous carrier.
</ParamField>

<ParamField body="lnp.porting_pin" type="string" required>
  Porting PIN from the previous carrier. If none is required, enter `0000`.
</ParamField>

<ParamField body="lnp.account_holder_first_name" type="string" required>
  First name on the losing-carrier account.
</ParamField>

<ParamField body="lnp.account_holder_last_name" type="string" required>
  Last name on the losing-carrier account.
</ParamField>

<ParamField body="lnp.address_line1" type="string" required>
  Service / billing address line 1.
</ParamField>

<ParamField body="lnp.address_line2" type="string">
  Address line 2 (apartment, suite, etc.).
</ParamField>

<ParamField body="lnp.city" type="string" required>
  City.
</ParamField>

<ParamField body="lnp.state" type="string" required>
  State / province (for example `NY`).
</ParamField>

<ParamField body="lnp.zip" type="string" required>
  ZIP / postal code.
</ParamField>

<ParamField body="lnp.country" type="string" required>
  Country (for example `United States`).
</ParamField>

## Response

### 201 Created

```json theme={null}
{
  "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) |
