35+ countries live across 4 regions

For your reviewers

Elsewhere

Get your coverage map

Developers

One endpoint. Twenty-two typed commands. One response shape.

POST a number and the commands you want. You get a block for each one that was served. Commands that were not served are named in the response.

POST /api

one operation, one authorisation flow, one response envelope

mTLS

an X.509 client certificate, base64 encoded, in a single header

1 header

key, used both for testing against the demo numbers and for live traffic

RFC 9457

errors as problem+json, each one carrying a correlation id

The request path

The request path, from your POST to the response.

Authentication, routing, normalisation and the record happen behind the endpoint. Your integration carries none of it.

How a request travels One country-agnostic call reaches Plumma, which authenticates it, chooses a route per market, asks the operator, normalises whatever comes back, and returns one shape carrying the carrier that served it and a correlation id. Where nobody can answer, the gap is declared rather than returned as a negative. Your application One call. No country in it. POST /api · sim_swap request Plumma The layer that holds the paperwork 1 · Authenticate X.509 certificate · sandbox or live 2 · Route Paths scored per call, per market 3 · Normalise Every version answers in one shape 4 · Record Carrier, version, correlation id 22 typed commands · one endpoint Operator A SIM Swap, version 1 Operator B SIM Swap, version 2 Operator C another market No route nobody can answer one shape back Answered swapped: true carrier, version, id Declared status: no_coverage not billed, never a false negative
Where no operator can answer, the call returns a declared gap rather than a negative, and is not billed.

One call, start to finish

Three headers, one POST, and the two shapes that come back.

The whole walkthrough is on this panel. Move through it in order, or go straight to the error case, which is the one most integrations actually need on day two.

Your certificate is your key.

Your X.509 client certificate, base64 encoded, in one header. A second header names the application, and the application decides sandbox or live. You promote an integration by changing one header value.

HeadersEvery request
# Your X.509 client certificate, base64 encoded
x-plumma-connect-api-key: MIIDXTCCAkWgAwIBAgIJAJ…

# Application id. Controls sandbox or live.
x-plumma-connect-app-id: 10427

Content-Type: application/json

What it replaces

A thousand endpoints, or twenty-two commands.

Operator endpoints against one interface Without a layer, an integration carries one endpoint, one auth scheme and one payload shape per operator per market. Through Plumma it carries a single POST, one credential and twenty-two typed commands, with the differences absorbed behind the layer. Operator by operator one integration per network, per market GET /sim-status POST /provider/v1/verify GET /nef/kyc-match POST /v2/number-verification POST /camara/v0.3/swap GET /open/age-check PUT /device/v3/quality …and the next one, and the next Incompatible schemas · auth per country · no shared client Through the layer one endpoint, whatever the market POST /api command: sim_swap command: kyc_match command: age_verification command: current_carrier command: scam_check …twenty-two in all One shape · one credential · one invoice · one record
Version differences stay behind the layer. SIM Swap answers the same way whichever version a network runs.

Command reference

The twenty enum values, and the block each one returns.

Any combination, one request. Every block schema is in the OpenAPI description, and this table is read from it.

CommandResponse blockWhat it tells you
sim_swap simswap Whether the SIM behind the number changed inside the fixed 240-hour window.
port_fraud_shield portfraud Porting activity that fits an account takeover in progress.
divert_detector divert_detector Whether unconditional call forwarding is set on the line.
digital_footprint digital_footprint Where the number shows up across online platforms.
device_swap device_swap Whether the handset behind the number changed, and when.
location_verification location_verification Whether the device is inside an area you declare, with a match rate.
kyc_match kyc_results Whether the details given match the operator's own record, attribute by attribute.
age_verification age_verification That the line holder is over a threshold, with no document and no camera step.
tenure_period status fields Whether the line has been held longer than the period you ask about.
commercial_segment market_segment A consumer line from a business line.
network_presence status fields Whether the line is live and reachable right now.
roaming_intel is_roaming, roaming_network Whether the line is roaming, and on which network.
deactivation_point churn_tracker When the line was last deactivated.
line_classification status fields Mobile, landline and VoIP, told apart.
location_retrieval device_location Where the device last reported itself, as an area rather than a point.
current_carrier current_carrier The operator serving the line today: name, MCC, MNC, SPID, OCN, LRN.
issuing_carrier issuing_carrier The operator that originally issued the number.
porting_timestamp ported, ported_date Whether the number has ported, and when.
porting_logs porting_logs The porting events behind that date.
churn_tracker churn_tracker The line's history of deactivations, swaps, suspensions and reactivations.

Availability is per operator and per market. A command that no path can serve returns no block, and the call is not billed.

Before you build

Three things that will otherwise cost you a sprint.

01

Absence is information

Write your rules so a missing block routes to the fallback you designed, never so it reads as a clean result.

02

The prefix does not identify the operator

Number portability means routing is resolved per call, which is why the served carrier is returned rather than assumed.

03

Session-bound checks need a second path

Any check proving the session runs on the claimed SIM uses the authorisation code flow over mobile data and fails on Wi-Fi.

Sandbox keys, schemas and the reference.

The developer portal holds the OpenAPI description, the normalised response shapes, the per-command fallback documentation and the sandbox. Nothing on it sits behind a form.