---
title: "Check portability"
method: POST
path: "/v1/phone-numbers/port-in/check"
tags: ["Phone Numbers"]
---

# Check portability

`POST /v1/phone-numbers/port-in/check`

Pre-flight portability check: whether each number can be ported in,
whether it qualifies for FastPort, and its current carrier and line
type where the carrier lookup knows them, BEFORE the user commits to a
port order (LOA, invoice, service address). Read-only; creates no
order and bills nothing.

Works without an API key for one number per request. Keyless calls
are what the checker at https://zernio.com/port-your-number makes:
they must come from that page (a browser bot check rejects scripted
callers with 401), are limited per IP (3 a minute, 10 a day) and by a
shared daily budget (429 once spent), because each check runs a paid
carrier lookup. Each portable keyless result carries a `claimId` and
a `claimUrl`: a signup link that opens the dashboard's port form with
the number filled in. Send an API key to check up to 50 numbers
without those limits.

## Request body

- object
  - `phoneNumbers` string[], required — E.164 numbers to check, e.g. +13035550000. At most one without an API key.
  - `claimLinks` boolean — true adds `claimId` and `claimUrl` to portable results even when you send an API key, e.g. to hand a user a signup link that opens the port form with their number.

## Response `200`

Per-number portability.

- object
  - `results` object[]
    - `phoneNumber` string
    - `portable` boolean
    - `fastPortable` boolean — Qualifies for the carrier's accelerated FastPort lane.
    - `messagingCapable` boolean, nullable — Whether texting can be enabled on the number once ported; null when the carrier does not say.
    - `lineType` string, nullable — Line type when known (mobile, landline, voip, toll-free, unknown). US/CA portable numbers only. A US/CA mobile number requires the transfer PIN at submit.
    - `carrierName` string, nullable — The number's current carrier, when the lookup knows it. US/CA portable numbers only.
    - `countryCode` string, nullable — ISO country of the number. Pass it to GET /v1/phone-numbers/port-in/requirements for international numbers.
    - `phoneNumberType` string, nullable — Carrier number-type classification (local, mobile, national, toll_free...), the numberType for the requirements endpoint.
    - `notPortableReason` string, nullable — Carrier reason when not portable; null when portable.
    - `claimId` string — Keyless calls and claimLinks=true only, on portable results. Resolve it with GET /v1/phone-numbers/port-in/claims/{claimId}. Expires after 7 days.
    - `claimUrl` string — Keyless calls and claimLinks=true only, on portable results. A signup link that lands on the dashboard's port form with this number filled in.

## Other responses

- `400` — Invalid request
- `401` — Unauthorized
- `429` — Keyless calls only. The per-IP limit or the shared daily budget is spent; `Retry-After` says when to try again. Send an API key to skip both.

## Changes

- **2026-09-25** `2c04683ce694` — 7 info
  - added the new optional request property `claimLinks`
  - added the non-success response with the status `400`
  - added the non-success response with the status `429`
  - added the optional property `results/items/carrierName` to the response with the `200` status
  - …3 more

[Change history](https://skmtc.dev/zernio/apis/zernio-api/changes/v1/phone-numbers/port-in/check/post.md)

---

[API](https://skmtc.dev/zernio/apis/zernio-api.md) · [All operations](https://skmtc.dev/zernio/apis/zernio-api/llms.txt) · [OpenAPI document](https://skmtc.dev/zernio/apis/zernio-api/revisions/b2325332041a?raw)
