35+ countries live across 4 regions

For your reviewers

Elsewhere

Get your coverage map

Status and Common Errors

Plumma® CONNECT API — Response Handling and Diagnostics

The Plumma® CONNECT API uses two distinct layers of error signalling:

  • HTTP-level errors are returned by the security filter before the request reaches the API logic. These occur when the API key is invalid, expired, revoked, or when access limits are exceeded. In these cases, the response body is not a PlmResponse JSON object, but a plain HTTP error or a small JSON error payload.
  • Response-level status is present inside the PlmResponse JSON body for all requests that pass authentication successfully. Every such response includes a status (numeric) and a status_message (string) describing the outcome of the query against the network operators. As of the latest release, both fields are produced by the Merge step, which combines the answers of every supplier consulted for the request into a single result.

HTTP-Level Errors (Authentication & Access Layer)

These errors are returned by the API security filter and never produce a PlmResponse body. This layer is unchanged.

HTTP StatusCauseNotes
401 Unauthorized The x-ploommacore-api-key header is present but the key is expired, not yet valid, or the key cannot be authenticated. Verify that your API key is current and has not expired. Contact your account manager to obtain a new key if needed.
403 Forbidden The API key has been explicitly revoked or temporarily paused for the CONNECT service. Contact your account manager to check the status of your key.
402 Payment Required The daily usage threshold for demo keys has been exceeded. The response body contains a JSON object with "code": "rate.limit.exceeded" and a message indicating the daily limit. Applies to demo (sandbox) API keys only. Production keys are not subject to this limit.
Note: If the x-ploommacore-api-key header is absent, the request is passed to the standard authentication chain without Plumma®-specific processing. Ensure the header is present on all CONNECT API calls.

Response-Level Status (PlmResponse Body)

For all authenticated requests, the PlmResponse body includes a top-level status field and a status_message string. Both are (re)computed as the final step of the request, after the Merge engine has collected and combined the answers returned by every routed supplier.

status

status is still one of the five overall outcome codes below. The logic used to pick the code is now centralized and evaluated in this fixed order:

StatusStatus MessageWhen it is produced
0 OK Every requested command could be routed for the resolved country, no command was skipped, and the request passed validation.
1 Invalid number The MSISDN is not in a valid E.164 format, contains an invalid country code, or has an incorrect length for the identified region. Evaluated only after coverage/routing checks below have passed.
2 Not allowed destination None of the requested commands could be routed for the resolved destination country (no supplier configured for that country in your account). The request is short-circuited before any supplier is contacted, and status_message will indicate the unresolved country.
4 Partial reply At least one requested command could not be routed to any supplier for the resolved country, while at least one other command could. The commands that were routed still return their data; see “Per-command outcome” below for how to see what happened to the skipped ones.
5 Unknown error An unexpected internal error occurred while evaluating the request/coverage. If this status persists, contact support with the full request payload and the X-Correlation-ID response header value.
The status codes and their numeric values are unchanged from the previous version of this document. What has changed is how status_message is built, and the addition of a per-command outcome breakdown described below.

status_message

status_message is no longer a single static sentence per status code. It is now assembled dynamically by the Merge step and can contain up to four parts, appended in this order:

  1. Base outcome text, chosen from:
    • No commands available in country [] — when no command could be routed at all (status = 2).
    • Partial reply merged from multiple operators — when more than one supplier answered.
    • Response from one supplier — when exactly one supplier answered.
    • Unknown error — fallback when the outcome could not be determined.
  2. Skipped commands note (only if one or more requested commands had no coverage for the resolved country):
    - Commands [, , ...] not available in []
  3. Demo/sandbox note (only when the call was served by the sandbox engine, i.e. an SandBox demo user key rather than a production Production User key : - This response is for demo purpose only
  4. Per-command outcome block, appended in square brackets and containing:
    • [cmd_enc=] — a single number that packs the outcome of every command requested into one value (see “Decoding cmd_enc” below), followed by
    • [: : | : : | ...] — one human-readable entry per routed command, naming the supplier that served it and either its own status message or a generic OK / failed.

Example — two commands requested, one served by MNO (A) and one that fell back to a second MNO (B) for the country, one command not covered:

Partial reply merged from multiple operators - Commands [scam_check] not available in [IT] [cmd_enc=17] [current_carrier: MNO (A) : OK | kyc_match: MON (B) : no data]

This is a static per-status sentences documented earlier and gives you, in a single field, both the aggregate outcome and the outcome of each individual command.



Per-Command Outcome

Where the previous version of this document listed a fixed "error" field on each failed command (not authorized, not configured, timeout, no data), the merged response now exposes per-command outcomes in two complementary ways inside status_message.

1. Human-readable breakdown

The bracketed list at the end of status_message (e.g. [current_carrier: MNO (A): OK | kyc_match: MNO (B): no data]) gives one entry per command that was actually routed, in the format:

: : 

The portion is sourced directly from the supplier's own response where available (for example a specific reason such as no data or a timeout description), or falls back to a generic OK / failed if the supplier did not provide one. Commands that were never routed at all (no coverage for the country) do not appear here. They are listed separately in the "Commands ... not available in ..." note described above.

2. Decoding cmd_enc (DEBUG ONLY)

cmd_enc is a single numeric value that encodes the outcome of every possible command in 2 bits each, packed into one number. Each command occupies the bit position ordinal × 2, where ordinal is the command's position in the list below (0-indexed):

OrdinalCommand
0line_classification
1current_carrier
2issuing_carrier
3porting_timestamp
4porting_logs
5network_presence
6roaming_intel
7deactivation_point
8churn_tracker
9sim_swap
10port_fraud_shield
11digital_footprint
12age_verification
13kyc_match
14divert_detector
15commercial_segment
16tenure_period
17qdr_history
18number_verification
19scam_check

Each 2-bit slot can hold one of three values:

ValueMeaning
0Success
1Client error
2Provider error
A command that was not requested, or not routed at all, simply keeps its default value of 0 in this encoding in order to know whether a command was genuinely successful or simply never requested/routed, cross-reference against the commands you sent in the request and the "not available" note in status_message.

This encoding is intended for programmatic consumers that want a compact machine-readable outcome per command, in addition to the human-readable breakdown described above.

Read this in the portal, with search and the reference beside it: Status And Errors