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
PlmResponseJSON object, but a plain HTTP error or a small JSON error payload. - Response-level status is present inside the
PlmResponseJSON body for all requests that pass authentication successfully. Every such response includes astatus(numeric) and astatus_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 Status | Cause | Notes |
|---|---|---|
| 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. |
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:
| Status | Status Message | When 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. |
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:
-
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.
-
Skipped commands note (only if one or more requested commands had no coverage for the resolved country):
- Commands [, , ...] not available in [ ] -
Demo/sandbox note (only when the call was served by the sandbox engine, i.e. an
SandBox demo userkey rather than a productionProduction Userkey :- This response is for demo purpose only -
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):
| Ordinal | Command |
|---|---|
| 0 | line_classification |
| 1 | current_carrier |
| 2 | issuing_carrier |
| 3 | porting_timestamp |
| 4 | porting_logs |
| 5 | network_presence |
| 6 | roaming_intel |
| 7 | deactivation_point |
| 8 | churn_tracker |
| 9 | sim_swap |
| 10 | port_fraud_shield |
| 11 | digital_footprint |
| 12 | age_verification |
| 13 | kyc_match |
| 14 | divert_detector |
| 15 | commercial_segment |
| 16 | tenure_period |
| 17 | qdr_history |
| 18 | number_verification |
| 19 | scam_check |
Each 2-bit slot can hold one of three values:
| Value | Meaning |
|---|---|
| 0 | Success |
| 1 | Client error |
| 2 | Provider error |
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