Ppoppo Docs

Errors

Error codes for both surfaces, in one place.

OAuth2 errors (sign-in)

Returned on the authorization callback (as error + error_description) or from the token endpoint:

ErrorHTTPCauseWhat to do
invalid_client401Unknown client_idVerify your client credentials, and that the app is approved (see below)
invalid_grant400Code expired or already usedRestart the flow
invalid_redirect_uri400redirect_uri not registeredRegister the exact URI
invalid_scope400A requested scope isn't allowedRequest only approved scopes
invalid_request400Missing PKCE parametersInclude code_challenge / code_verifier
account_setup_requiredUser hasn't finished Ppoppo registrationPrompt them to complete it

External API errors (gRPC status codes)

The External API returns errors as gRPC Status; details are in the message:

Status (code)CauseWhat to do
UNAUTHENTICATED (16)Token missing, expired, or invalidRe-fetch the client_credentials token; check the authorization: Bearer metadata
PERMISSION_DENIED (7)App suspended, IP not allow-listed, or missing scopeVerify app status, allowed IPs, and scopes
NOT_FOUND (5)Template, recipient, or send request not foundCheck the id belongs to your app
INVALID_ARGUMENT (3)Bad parameters (e.g. malformed ppnum)Read the message for the offending field
RESOURCE_EXHAUSTED (8)Rate limit or monthly quota exceededBack off using retry-after-ms; consider a higher plan
FAILED_PRECONDITION (9)Template inactive, or app not approvedEnsure preconditions are met
ALREADY_EXISTS (6)Template name already taken within your appUse a different name
UNAVAILABLE (14)Service temporarily unavailableRetry with exponential backoff
INTERNAL (13)Server-side errorRetry; contact support if it persists

Reading a recovery ladder

Error messages shift as upstream issues clear. A failing send might report "Invalid token""Template not found" → success — each step is progress, not regression. Treat intermediate errors as rungs on a ladder rather than restarting from scratch.

"invalid_client" on the login button

If the login redirect fails with invalid_client, your app isn't registered or approved yet. This is resolved on the Ppoppo side — either a Ppoppo admin registers your app, or you self-register and wait for approval. Once approved, the login button redirects to the Ppoppo sign-in page normally.