---
title: "Simulate a purchase, credit, or refund without spending money"
method: POST
path: "/v1/cashback/sandbox/purchases"
tags: ["Cashback"]
---

# Simulate a purchase, credit, or refund without spending money

`POST /v1/cashback/sandbox/purchases`

## Request

- Base URL: `https://api.openstock.sh`
- URL: `https://api.openstock.sh/v1/cashback/sandbox/purchases`
- Auth: HTTP bearer

Sandbox only. Creates fake USD purchases at the displayed catalog quote, or 8% when unavailable, with no product exclusions. The first purchase fixes its commission for later status changes. Fixed non-USD commissions are explicitly unsupported. Paid simulations credit immediately; pending ones can later be paid, then reversed. Reuse the same order_id and amounts with a NEW idempotency_key to change status. Reuse the SAME key for retries. Sandbox funds are not real and cannot be withdrawn. Query them with /v1/cashback/wallet mode=sandbox; real wallets never include them.

## Request body

- CashbackSimulationRequest
  - `user_id` string, required: Opaque user ID within your authenticated partner account. Do not send email addresses.
  - `store_id` string, required
  - `order_id` string, required
  - `order_amount` integer, required: Simulated USD order in cents. 10000 is $100. Uses the catalog quote, or 8% when unavailable.
  - `country` string
  - `status` 'pending' | 'paid' | 'reversed'
  - `idempotency_key` string, required

## Response `200`

The simulated purchase and isolated sandbox balance.

- CashbackWalletResponse
  - `mode` 'live' | 'sandbox', required
  - `balance` object, required
    - `amount` integer, required
    - `currency` string, required
    - `scale` 2, required
  - `items` union[], required
    - union
      - object
        - `id` string, required
        - `merchant_id` string, required
        - `order_id` string, required
        - `status` string, required
        - `purchased_at` string, required
        - `order_amount` object, required
          - `amount` integer, required
          - `currency` string, required
          - `scale` 2, required
        - `network_status` string, nullable, required
        - `commission` object, nullable, required
          - `amount` integer, required
          - `currency` string, required
          - `scale` 2, required
        - `credited_amount` object, nullable, required
          - `amount` integer, required
          - `currency` string, required
          - `scale` 2, required
      - object
        - `id` string, required
        - `type` string, required
        - `amount` object, required
          - `amount` integer, required
          - `currency` string, required
          - `scale` 2, required
        - `purchase_id` string, required
        - `merchant_id` string, required
        - `order_id` string, required
        - `created_at` string, required
  - `next_cursor` string, nullable, required

## Other responses

- `400`: The request could not be completed. Retry temporary failures with the same idempotency key.
- `401`: The request could not be completed. Retry temporary failures with the same idempotency key.
- `403`: The request could not be completed. Retry temporary failures with the same idempotency key.
- `409`: The request could not be completed. Retry temporary failures with the same idempotency key.
- `503`: The request could not be completed. Retry temporary failures with the same idempotency key.

## Changes

- **2026-11-02** `e3af2bb31234`: 1 info
  - endpoint added

[Operation history](https://skmtc.dev/openstock/apis/openstock-api/changes/v1/cashback/sandbox/purchases/post.md)

---

[API](https://skmtc.dev/openstock/apis/openstock-api.md) - [All operations](https://skmtc.dev/openstock/apis/openstock-api/llms.txt) - [OpenAPI document](https://skmtc.dev/openstock/apis/openstock-api/revisions/e3af2bb31234?raw)
