Skip to content

MobiSend CashApp Checkout API

End-user CashApp payment rails for MobiSend's iOS / web app. End-users pay via CashApp (hosted Pockyt page); we execute the topup automatically once payment confirms.

Production base URL: https://app.via.one/api/mobisend


Architecture overview

MobiSend app                   Via.One API              Pockyt              End-user
     │                              │                      │                    │
     │  POST /cashapp/checkout      │                      │                    │
     ├─────────────────────────────►│                      │                    │
     │                              │ pockyt.createPayment │                    │
     │                              ├─────────────────────►│                    │
     │                              │ ◄─────── cashier_url │                    │
     │ ◄────── payment_url + ref    │                      │                    │
     │                              │                      │                    │
     │  Show payment_url to user    │                      │                    │
     │═════════════════════════════════════════════════════════════════════════►│
     │                              │                      │ ◄── pays via CashApp
     │                              │                      │                    │
     │                              │ ◄── IPN webhook ─────┤                    │
     │                              │   payment confirmed  │                    │
     │                              │                      │                    │
     │                              │  fulfillOrder() →                          │
     │                              │    routes by carrier                       │
     │                              │    executes topup                          │
     │                              │                      │                    │
     │ ◄── POST callback_url ───────┤                                            │
     │   {status: "completed"}     │                                            │

We are Merchant of Record via Pockyt store 305155 / Relier Group LLC.


Authentication

All endpoints require x-api-key header with your MobiSend API key (same key used for /topup, /billpay, /balance, etc.).


POST /cashapp/checkout

Create a Pockyt CashApp payment link. Returns a hosted URL to display to the end-user.

Request

POST /api/mobisend/cashapp/checkout
x-api-key: <your_mobisend_api_key>
Content-Type: application/json

{
  "phone": "5551234567",
  "amount": 20.00,
  "carrier": "att",
  "country": "US",
  "sku": "ATT20",
  "type": "topup",
  "reference": "MOBI-INTERNAL-12345",
  "callback_url": "https://your-domain.com/webhooks/viaone",
  "fee_mode": "passthrough"
}

Field reference

Field Type Required Notes
phone string yes End-user phone number, digits only
amount number yes Topup amount the end-user will receive (USD)
carrier string yes Carrier code: att, tmobile, verizon, metropcs, cricket, boost, simplemobile, ultra, lyca, net10 (US); telcel, movistar, att-mx, unefon, virgin (MX)
country string no ISO-2 country code. Default US.
sku string no Specific product SKU if your catalog provides it
type string no topup (default) or future expansion
reference string no Your distributor-side transaction ID (echoed back in webhook)
callback_url string no HTTPS URL we POST status updates to. If omitted, you must poll GET /order/:order_id.
fee_mode string no passthrough (default — end-user pays $1 CashApp fee on top) or absorb (you eat the $1 fee from your margin)

Response (success)

{
  "success": true,
  "order_id": "8e1c2a3d-...-uuid",
  "order_reference": "ORD-1714510123-abc12",
  "payment_url": "https://m.pockyt.io/checkout/...",
  "amount_topup_usd": 20.00,
  "amount_charged_usd": 21.00,
  "fee_breakdown": {
    "cashapp_fee_usd": 1.00,
    "fee_mode": "passthrough"
  },
  "expires_at": "2026-04-30T19:00:00.000Z",
  "status": "pending_payment",
  "next_step": "Show payment_url to end-user. We will POST status to callback_url when Pockyt confirms payment and topup completes."
}

Response (validation error)

{
  "success": false,
  "error": "phone, amount, and carrier are required",
  "required_fields": { ... }
}

Response (Pockyt error)

{
  "success": false,
  "error": "Failed to create CashApp payment",
  "detail": "Pockyt error message",
  "order_reference": "ORD-..."
}

What MobiSend does next

  1. Display payment_url to your end-user (in-app browser, deep link, or QR code).
  2. End-user pays via CashApp on Pockyt's hosted checkout.
  3. Wait for the callback (or poll GET /order/{order_id}).

Webhook payload (POST to your callback_url)

When the topup completes (success or permanent failure), we POST:

{
  "order_reference": "ORD-1714510123-abc12",
  "order_id": "8e1c2a3d-...-uuid",
  "status": "completed",
  "api_customer_id": "MOBISEND_001",
  "distributor_reference": "MOBI-INTERNAL-12345",
  "phone": "5551234567",
  "carrier": "att",
  "amount_topup_usd": 20.00,
  "amount_charged_usd": 21.00,
  "provider": "CELLPAY",
  "provider_transaction_id": "...",
  "auth_code": "12345",
  "response_code": "00",
  "response_message": "Approved",
  "completed_at": "2026-04-30T19:02:13.456Z"
}

Status values: - completed — topup landed on the end-user's phone - permanent_failure — topup will not retry (invalid number, unknown carrier, SKU not provisioned, etc.); CashApp payment may be refunded separately - (For transient failures we retry internally and only notify on final outcome)

Webhook timeout: we wait 10s for your endpoint to return any 2xx. We don't retry the callback — it's fire-and-forget. Use the polling endpoint as your source of truth.


GET /order/{order_id}

Polling endpoint — already documented in main MobiSend API. Returns the same status fields as the webhook.


Behavior details

Idempotency

Same idempotency-key header pattern as /topup. A repeated request with the same reference returns the original response.

Expiration

Checkout URL valid for 30 minutes. After expiry, status moves to expired and CashApp payment (if still in flight) won't trigger a topup.

Refunds

If we receive payment but fulfillment permanently fails: 1. We mark the order permanent_failure and POST your callback 2. You decide whether to refund the end-user via your CashApp business account (Pockyt has refund APIs but currently you'd handle on your end — happy to wire that in if you want)

Phone validation

We validate phone length per country: | Country | Expected digits | |---|---| | US | 10 | | MX | 10 | | HN, NI, SV, GT, CR, PA | 8 | | PH, CO, AR, VE | 10 | | PE, CL | 9 | | BR | 11 |

Amount caps

  • US: $500 USD max per transaction
  • MX: 5,000 MXN max
  • Daily limit: $10,000 USD across all of MobiSend's transactions

Fees you pay

  • Pockyt CashApp: $1 USD per successful payment (passed through by default)
  • Per-topup margin: per your existing MobiSend commercial agreement with us (separate from CashApp fee)

Quick test (curl)

# 1. Create a checkout
curl -X POST https://app.via.one/api/mobisend/cashapp/checkout \
  -H "x-api-key: $MOBISEND_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "phone": "5551234567",
    "amount": 5.00,
    "carrier": "att",
    "country": "US",
    "reference": "TEST-001",
    "callback_url": "https://webhook.site/your-test-url"
  }'

# 2. Open the returned payment_url in a browser to simulate end-user

# 3. Pay via CashApp on Pockyt's hosted page

# 4. Receive callback at the URL above (or poll GET /order/{order_id})

Support

Issues, integration questions, custom flows: ping Richard directly. Webhook signature verification is on Pockyt's side; if you want signed callbacks from us to you (HMAC), let us know — easy to add.