Sandbox
The sandbox is a full order simulator. It is not a copy of production data — you create your own test sellers, buyers and orders and drive them through the lifecycle.
Sandbox routes require sandbox credentials on the sandbox host. Live credentials get
403 SANDBOX_ONLY. Sandbox traffic is additionally capped at 60 requests/minute per app, and each app has its
own isolated namespace — cross-app lookups return 404.
Getting fixtures fast
Seeds one seller, one buyer and seven products. Idempotent — it does not delete existing data, so it is safe to call again to recover defaults.
Provisioning your own test data
| Endpoint | Description |
|---|---|
| GET /sandbox/sellers | List your test sellers |
| POST /sandbox/sellers | Create a test seller |
| GET /sandbox/buyers | List your test buyers |
| POST /sandbox/buyers | Create a test buyer with a shipping address |
Test buyers are data records on the order payload — a name and a shipping address. There is no buyer login or buyer-facing app; the sandbox models the seller's side of the transaction.
Driving the order lifecycle
PENDING ──pay-mock──> READY_TO_SHIP ──ship-mock──> SHIPPED ──deliver-mock──> DELIVERED
└── cancellation is valid from any pre-SHIPPED state
| Endpoint | Effect |
|---|---|
| POST /sandbox/orders | Place a buyer-driven test order. Initial state PENDING |
| GET /sandbox/orders | List test orders |
| GET /sandbox/orders/{id} | Get one test order |
| POST /sandbox/orders/{id}/pay-mock | Mock payment. Chained transition to READY_TO_SHIP |
| POST /sandbox/orders/{id}/ship-mock | READY_TO_SHIP → SHIPPED |
| POST /sandbox/orders/{id}/deliver-mock | SHIPPED → DELIVERED |
Each transition fires the same webhooks as production, so the sandbox is the right place to build and test your webhook consumer end to end.
Default test shipping
You do not configure a shipping channel to test in the sandbox. Every sandbox product — whether you
created it with POST /open/v1/products or got it from POST /open/v1/sandbox/seed — is auto-assigned
the default test channel, so an order prices end to end with no setup.
| Field | Value |
|---|---|
| Channel code | MALLPLUS_TEST |
| Channel name | Mall+ Test Delivery |
| Option id | ship_mallplus_test |
| Fee | ₱50.00 (5000 centavos, PHP) |
| Estimate | 2-3 business days |
Omit shippingOptionId on POST /sandbox/orders and the order falls back to this channel:
shipping comes back as 5000 and shippingChannel as MALLPLUS_TEST. To exercise
carrier-specific rates instead, pass an explicit shippingOptionId from GET /open/v1/shipping/options
(for example ship_jt at ₱85.00) and shipping reflects that quote rather than the ₱50.00 default.
The ₱50.00 flat fee is a sandbox figure — a fixed number chosen so a test order always prices. It is not a Mall+ price list. Live shipping is quoted per order from the real enabled channels, so validate real rates against production before you go live.
Persistence
Sandbox orders and returns are durable and survive platform restarts. Other sandbox entities —
test sellers, buyers and products — are ephemeral and may be reset during a deployment; re-run
POST /sandbox/seed to restore the defaults. Those ephemeral entities are also swept on a best-effort
basis roughly a day after creation (orders and returns are never swept), so design your test scenarios to be
re-runnable rather than long-lived.
Going live
- Complete your integration against the sandbox host with
mp_…credentials. - Request go-live in the console. Your app is reviewed and, once approved, issued
mp_live_…credentials. - Point your client at
https://open.mallplus.phand swap in the live credential and secret together — a mixed pair returns401 INVALID_CREDENTIALS. - Re-run the seller authorization flow. Sandbox grants do not carry over.
- Re-create your webhook subscriptions against the production callback URL.