TestingSandbox

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

POST/open/v1/sandbox/seed

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

EndpointDescription
GET /sandbox/sellersList your test sellers
POST /sandbox/sellersCreate a test seller
GET /sandbox/buyersList your test buyers
POST /sandbox/buyersCreate 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
EndpointEffect
POST /sandbox/ordersPlace a buyer-driven test order. Initial state PENDING
GET /sandbox/ordersList test orders
GET /sandbox/orders/{id}Get one test order
POST /sandbox/orders/{id}/pay-mockMock payment. Chained transition to READY_TO_SHIP
POST /sandbox/orders/{id}/ship-mockREADY_TO_SHIPSHIPPED
POST /sandbox/orders/{id}/deliver-mockSHIPPEDDELIVERED

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.

FieldValue
Channel codeMALLPLUS_TEST
Channel nameMall+ Test Delivery
Option idship_mallplus_test
Fee₱50.00 (5000 centavos, PHP)
Estimate2-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

  1. Complete your integration against the sandbox host with mp_… credentials.
  2. Request go-live in the console. Your app is reviewed and, once approved, issued mp_live_… credentials.
  3. Point your client at https://open.mallplus.ph and swap in the live credential and secret together — a mixed pair returns 401 INVALID_CREDENTIALS.
  4. Re-run the seller authorization flow. Sandbox grants do not carry over.
  5. Re-create your webhook subscriptions against the production callback URL.