Skip to content

Payment split status

Consolidated reference for every status an integrator may observe in Appmax's payment split flow — recipient status (returned by GET /recipient/{hash}/status) and withdraw request status (returned by withdraw-request endpoints). Use this page as an enum dictionary: what each value means, when it appears, what to expect next, and the recommended action.

For the full flow and code samples, see Payment split. For recurring operational questions, see FAQ.

Recipient status

Recipient status is returned by GET /recipient/{recipient_hash}/status as a string in the data field. There are three possible values, always in English.

StatusMeaningEligible for split?Expected next action
Awaiting face match completionRecipient created, waiting for the user to complete the facematch via SMS.NoSend or resend the facematch link and wait for the user to complete it on their phone.
Onboarding on verificationFacematch received. KYC review in progress or held by a failed check.NoWait for automatic approval. If it remains here for more than 24-48 business hours, open a support ticket.
Onboarding completedOnboarding approved. Recipient is enabled to receive splits and withdraw.YesUse the recipient_hash in POST /orders/{orderId}/split-order.

State transitions

Transitions that do not exist

  • There is no path back from Onboarding completed to any earlier state. Once approved, a recipient stays approved.
  • There is no path from Onboarding on verification back to Awaiting face match completion. Calling POST /facematch-link again while in verification does not restart the review — the request is accepted but the status does not change.
  • There is no public rejection or blocked state (rejected, denied, blocked). Rejected recipients remain frozen in Onboarding on verification.

Onboarding on verification in detail

This is the status that causes the most confusion because it collapses two different scenarios under the same label:

  1. Review in progress — the facematch was received and the KYC pipeline is still processing. Typical window: minutes to a few hours.
  2. Review held by a failed check — the pipeline finished processing, but one of the KYC criteria was not met. The recipient stays in this state indefinitely until manual action is taken by Appmax.

The GET /recipient/{hash}/status endpoint does not distinguish between these two cases. There is no reason field, no rejected status, and no webhook to notify the change.

Typical reasons for being held

Among the criteria checked during onboarding:

  • CPF or CNPJ not validated against the Brazilian federal revenue service (Receita Federal)
  • CNPJ without the responsible party's CPF in the QSA (company ownership structure)
  • PEP (Politically Exposed Person)
  • OFAC (US Treasury sanctions list)
  • CSNU (UN Security Council sanctions list)
  • Facematch score below the minimum threshold
  • Liveness (proof-of-life) check failed
  • Facematch photo does not match the ID document

Not every reason is surfaced to the integrator. What is returned is just the Onboarding on verification label.

No automatic retry, no timeout

The system does not automatically reprocess a recipient stuck in Onboarding on verification. There is no timeout to leave this state, no periodic retry, and no rejection notification. Calling POST /facematch-link again does not reactivate the document review — it only dispatches another facematch SMS, which on its own does not unlock the other checks.

  • Up to 24-48 business hours in Onboarding on verification: wait. This is a normal processing window.
  • Beyond that: open a support ticket with Appmax including the recipient_hash. The internal team checks whether reprocessing, manual review or a definitive rejection applies.
  • Do not re-create the recipient: the CNPJ will return the company document number already in use error.
  • Do not freeze the end user's flow: surface the pending state to the merchant and offer an escape hatch while you wait.

Withdraw request status

Every withdraw request — whether via available balance or via anticipation — carries a status field that represents where it sits in the financial processing cycle.

The immediate response from POST /withdraw-request/* endpoints always returns 2 (PENDING), as an integer (ID). Subsequent transitions happen in the background on Appmax's side. To track the updated status, use GET /withdraw-request/{withdrawRequestId} — which returns status already translated as a string (e.g. pending, approved, refused). There is no webhook that notifies transitions; tracking is always done by polling this endpoint.

This section documents the 17 possible statuses that may appear when querying a request, in reports, or during support tickets.

Terminal statuses

States that do not transition further. Once here, the request is done.

IDConstantMeaningIntegrator action
1REFUSEDRequest refused (validation error, insufficient balance after lock, review rejection, payment provider definitive failure).Investigate the reason through support. If balance is available again, create a new request.
5PAIDAmount settled — funds left the Appmax account to the recipient's bank account.None. Flow completed successfully.

In-progress statuses

Intermediate states. The request is still being processed — wait for natural transition.

IDConstantMeaningIntegrator action
2PENDINGCreated. Waiting for processing or internal approval. This is the value returned in the immediate POST response.None. Wait.
3APPROVEDApproved internally. Waiting to be sent to the payment provider.None. Wait.
4PROCESSINGBeing processed by the provider (cash-out or bank transfer).None. Wait.
7WAITING_RETURNWaiting for payment provider response.None. Wait.
8INITIAL_ANALYSISUnder initial review before approval.None. Wait.
12PIX_INCLUSION_IN_RETRYPIX key inclusion in automatic retry with the provider.None. Wait.
16PIX_PROCESSINGPIX payment being processed by the provider.None. Wait.
17PIX_VALIDATION_API_UNAVAILABLEThe provider's PIX validation API is temporarily unavailable.None. Wait, or open a ticket if it persists.

Statuses that require Appmax intervention

States in which something has stalled and depend on manual action from Appmax to unblock. If the request stays here for more than a few hours, open a ticket.

IDConstantMeaningIntegrator action
6ON_HOLDManual block (risk review, additional verification).Open a ticket if it does not unblock within a reasonable window.
9PENDING_ACCREDITATIONRecipient not yet accredited at the cash-out provider.Wait. Open a ticket if it persists.
10APPROVED_BUT_NOT_INCLUDEDApproved internally but not included in a payment batch.Open a ticket.
11PIX_ACCOUNT_VALIDATION_FAILProvider failed to validate the recipient's PIX key.Open a ticket to validate bank data.
13PIX_EXPIRED_INCLUSIONPIX inclusion expired before completing.Open a ticket.
14PIX_INCLUDED_BUT_REPROVEDPIX was included but rejected by the provider.Open a ticket.
15PIX_MANUAL_PAYMENTRequires manual PIX payment by Appmax's finance team.Open a ticket.

withdrawal_blocked — invisible lateral state

There is a withdrawal block that does not show up in the recipient status or in the withdraw request itself. It is a lateral flag that Appmax can activate on the recipient's account for reasons such as risk, investigation or regulatory requirement. The practical effect:

  • The recipient reports Onboarding completed normally.
  • Balances exist and can be queried.
  • But every attempt to create a withdraw request returns HTTP 403 with Withdraw not allowed.

If you get 403 on POST /withdraw-request/available or POST /withdraw-request/anticipation for a recipient that should be eligible, this is most likely the cause — open a support ticket including the recipient_hash.

Another case that also returns 403 (or 409 Withdraw request in progress) is when another request is already in progress for the same recipient in the same processing window. Wait for the previous one to finish before creating a new one.

Consolidated eligibility per recipient status

Cross-reference table showing, for each recipient status, what is and is not allowed:

Recipient statusReceive split on a new orderHas balances (GET /balances)Withdraw available balanceAnticipate to-release balance
Awaiting face match completionNoNo (returns 404)NoNo
Onboarding on verificationNoNo (returns 404)NoNo
Onboarding completedYesYesYes, unless withdrawal_blocked or withdraw in progressYes, unless withdrawal_blocked or withdraw in progress

About GET /balances: before Onboarding completed, the GET /recipient/{hash}/balances endpoint returns 404 Balance not found. This does not mean the recipient does not exist — it means balances have not been provisioned yet. Use GET /status as the primary source of recipient existence and eligibility.

What the status does not tell you

Split has no status of its own

The order-split entity does not have a separate lifecycle. A split's effective status follows the parent order status:

  • Order pending → split created, waiting for approval.
  • Order approved → split consolidated, amounts enter the recipients' balance flow.
  • Order cancelled or refunded → split discarded together with the order.

There is no GET /split-order/{id}/status endpoint and no split_status field. There is no split-specific webhook either. To know whether a split was effectively applied, check the order status.

No webhook for recipient status changes

Today there is no event that notifies transitions of a recipient between Awaiting face match completion, Onboarding on verification and Onboarding completed. The integrator must poll the GET /status endpoint. There is also no webhook for WithdrawRequest transitions.

Recommendations:

  • Poll at reasonable intervals (for example every 1-5 minutes during active onboarding, reducing cadence after the first hour).
  • Avoid aggressive polling (more than 1 request per second) — the API has rate limits.
  • For recipients stuck in Onboarding on verification for more than 24 business hours, stop polling and escalate to support.

Partial refunds are blocked on split orders

Orders with split only accept full refunds. Attempting a partial refund on an order that has a split returns a validation error. This is a product rule, not a status — detailed in Create order split.

Questions only support can answer

Some data is not exposed in the API and is not publicly documented — it requires a support ticket to be answered case by case:

  • Which KYC provider is used for facematch and document checks. Not exposed in the API.
  • Why a specific recipient landed in Onboarding on verification. The detailed reason (which check failed) is not returned.
  • SLA for a specific recipient's review to complete. Only the typical window (24-48 business hours) is public.
  • Expected transition time for a specific WithdrawRequest between states. Varies by provider and banking window.
  • Reason for withdrawal_blocked on an account. Requires a ticket with the recipient_hash.

In all these cases, always include the recipient_hash (or withdraw_request_id when applicable) — it lets support locate the record immediately.

See also