AirPay Payment Gateway

Merchant Workflow

  1. Create a checkout session when customers proceed to pay

  2. Obtain and handle redirect URL to AirPay hosted web page

  3. Handle notification callback or query payment results

  4. Trigger refund of successful payment upon confirmation with customer

The following figure illustrates the workflow of accepting a payment in the AirPay Payment Gateway payment scenario:

  1. After customer selects goods/services and clicks Checkout, merchant backend creates a checkout session by calling AirPay's Create checkout session endpoint.
  2. Customer is redirected to either AirPay website to proceed with payment. In case only ShopeePay/SPayLater/Seabank Direct Debit is passed under allowed_payment_method , customer might be able to open Shopee/ShopeePay application directly.
  3. Upon landing on AirPay hosted page, customers will be able to confirm payment details (payment amount), select preferred payment method, and apply any relevant promotion.
  4. Once customer selects payment method and authorizes payment successfully, Airpay will process and payment redirect users to transaction result page. If transaction result is successful, AirPay will also notify merchant via provided callback url.
  5. Customer is then redirected back to the merchant's page to view payment status, as specified by the merchant in the redirect_url of the Create Checkout endpoint. Redirect to return_url_http should never be used as an indication of payment success. The Merchant should only rely on the server request response to check the final status of payment.
  6. Merchant can also utilize Get Checkout Status endpoint to query payment status
    • If the returned enum is Successful, merchant can mark this transaction as successful
    • If the returned enum is Expired or Cancelled, merchant mark this transaction as failed.
    • If the returned enum is Active, merchant can take this as payment is still under processing. Merchant is advised to request at an incremental time range of every 5 seconds (e.g., 5 seconds, 10 seconds, 15 seconds, and so on) up to a maximum of 100 seconds. If there is no terminal status after 100 seconds, please retry the request at an incremental time range of every 5 minutes up to 24 hours. Alternatively, merchants can call the Cancel Checkout endpoint to terminate the transaction.

API Documentation

  • Getting started
  • Create Checkout Session
  • Get Checkout Status
  • Create Refund
  • Get Refund Status
  • Cancel Checkout

Getting started with AirPay Payment gateway

Prerequisite

Merchant should fulfil the following requirements to interact with AirPay APIs:

  • To be compatible with OAuth 2.0 protocol and HMAC used by AirPay to authorize calls.
  • Merchants should use TLSv1.2 or TLSv1.3 for TLS handshake.
  • Merchants should integrate directly with ShopeePay endpoints without the use of a SDK.

Onboarding

Once the commercial agreement between partner and AirPay is finalized, each merchant will be assigned the following credentials for integration testing purposes:

CredentialsDescription
Client IDClient refers to the party that integrate with AirPay APIs. Each client is assigned a unique identifier known as the Client ID, and this Client ID must be included in the request header of every API call made to AirPay's services.
Secret KeyA secret key that is shared between AirPay server and partner. This key is used to generate the signature to authenticate the partner. When handling sensitive information such as merchant ID and secret key, please do not hard code the secret key in a frontend application. All API calls should only be made from the partner’s servers.

Access nodes

AirPay gateway access nodes are country specific, each country will have their own API domains to be called.

EnvironmentDomain
Sandboxapi.gw.uat.airpay.co.id
Productionapi.gw.airpay.co.id

API Protocol Rules

The below specifies the rules for calling AirPay APIs:

ComponentFormat/ Method
Transfer modeHTTPS
Submit modePOST Method
Date formatUNIX (seconds)
Char EncodingUTF-8
SignatureHMAC, SHA-256, Base64

API Parameters Specification

Request header

All requests will require the following parameter

NameDescription
client_idClient refers to the party that integrate with ShopeePay APIs. Each client is assigned a unique identifier known as the Client ID, and this Client ID must be included in the request header of every API call made to ShopeePay's services.
signatureGenerated using the shared secret that is given by Shopee to authenticate the API caller.

Request response

The AirPay API response body is in JSON format.

Considerations to take note of in the response body:

  • Parameters can be returned in a random sequence.
  • Empty parameters may be returned in the following format by default, unless stated otherwise.
  • Additional parameters may be returned in future without advance notice from AirPay.
  • Merchant system’s logic must not assume that the order of arrangement of response parameters or the total number of parameters returned will remain constant throughout time.
TypeEmpty Response
Integer0
StringEmpty string or "0" if the field represent a numerical value
Objectnull
ArrayEmpty array
BooleanFalse

URL Query Parameters

  • The URL query parameters can be returned in a random sequence.
  • Additional query parameters may be added in the future without advance notice from AirPay.
  • Query parameters are case-sensitive.

Security Specifications

Generate HMAC Signature

Signature generation is essential for authenticating API requests between ShopeePay and the merchant. The signature is generated using a confidential shared secret key and algorithm, provided by ShopeePay. Merchants may use the common signature modes such as hash-based message authentication code (HMAC), SHA-256, and Base64.

GO EXAMPLE

import (
"crypto/hmac"
"crypto/sha256"
"encoding/base64"
)
// Sign - sign the `payload` with `key`
func Sign(payload, key []byte) string {
mac := hmac.New(sha256.New, key)
// Cannot return error
if _, err := mac.Write(payload); err != nil {
return ""
}
return base64.StdEncoding.EncodeToString(mac.Sum(nil))
}
arrow-svg

Copy

JS EXAMPLE

let hash = CryptoJS.HmacSHA256(body, secret)
let sig = CryptoJS.enc.Base64.stringify(hash).replace(/\n+$/, '')
arrow-svg

Copy

Steps to Generate HMAC Signatures

If the request has a body, the request body must be hashed using the SHA-256 algorithm and represented as a base-64 encoded value. To generate a signature, the HTTP request body is hashed using HMAC with the SHA-256 algorithm and the shared secret key, operated on the request JSON to ensure authenticity of the request.

For example, secret: pz148x0gXyPCLHxnlhEydNLg55jni91i

  1. Extract the request body to be signed:

JS EXAMPLE

{"request_id": "","store_ext_id": "externalstore","merchant_ext_id": "externalmerchant","amount": 1000,"terminal_id": "terminal","convenience_fee_percentage": 0,"convenience_fee_fixed": 0,"convenience_fee_indicator": "","additional_info": "","currency": "IDR","qr_validity_period": 1000,"payment_reference_id": "testreference"}
arrow-svg

Copy

  1. Hash the JSON content by using the SHA256 algorithm

JS EXAMPLE

5f5532bf23018674788770f43743522dff1af5782243fab06b1e8677a7391d4c
arrow-svg

Copy

  1. Encode to Base64

JS EXAMPLE

X1UyvyMBhnR4h3D0N0NSLf8a9XgiQ/qwax6Gd6c5HUw=
arrow-svg

Copy

Signature validation

Upon receiving the API response, the Merchant should validate the signature of the response:

  1. Use the shared secret to sign the response body to obtain the response signature.
  2. Compare the generated signature to the signature in the header of the API response.
  3. Signatures from steps #1 and #2 must be identical. If they are different, the response should not be trusted.

To assist with signature validation, you can use online tools such as base64encode.org. These tools provide a convenient way to decode and verify signatures during the API integration process.

Request Header

Include the signature in the request. The signature should be added in the HTTP header in the following format:

SH EXAMPLE

X-Airpay-ClientId: <clientid>
X-Airpay-Req-H: <request_signature>
arrow-svg

Copy

Backward Compatible Changes

Backward compatible or non-breaking changes refer to API changes that allow the integration to continue using the API without any additional changes required at Merchant’s side. ShopeePay may make such changes on their sole discretion without informing the existing Merchants in advance, as such changes are deemed to not break any integration implemented by the Merchant.

AirPay considers the following changes as non-breaking:

  • Add new API resource or new types of server callback to a new endpoint.
  • Add new or remove optional field to existing API request parameters.
  • Add new fields to existing API response/server callback parameters.
  • Increase or decrease the max length limit of existing fields on existing API response / server callback parameters.
  • Change the order of fields in existing API responses or server callback parameters.
  • Increase the max length limit of request fields on existing API request parameters.

Create Checkout Session

Use this endpoint to create a checkout session. This is required to obtain AirPay redirection url.

  • URL: "/v1/checkout"

Request parameter

reference_id

stringRequired
Unique identifier of transaction generated by merchant. Max 64 characters

merchant_ext_id

stringRequired
Currency associated with the payment amount.

Possible values:

  • Indonesia: IDR
  • Malaysia: MYR
  • Philipines: PHP
  • Singapore: SGD
  • Thailand: THB
  • Vietnam: VND

return_url

stringRequired
Indicates the URL (in HTTP links or URL scheme formats) of the merchant’s application to redirect back to once the payment is processed or when the customer canceled the payment.

validity_period

uint32
By default, the expiry time will be set to 1200 seconds (20 minutes), from the time the request was received. If this field is passed, the checkout with the corresponding reference_id in this request will expire after the specified time period (in seconds) and payment attempts to this reference_id will fail. Max expiry accepted is 1 day (86400 seconds).

locale

string
IETF language tag of the checkout is displayed in.

  • Indonesia:id/en
  • Malaysia: ms/en/zh-CN
  • Philippines: en/fil
  • Singapore: en/ms-SG/zh-SG/ ta-SG
  • Thailand: en/th
  • Vietnam: en/vi

allowed_payment_method

string
Specify the list of payment channels for your customers to select

  • spp_wallet: refers to ShopeePay wallet, available in all markets
  • spay_later: refers to SPayLater, available in all markets
  • bank_transfer: available in ID and VN. In ID, it is possible to specify the following banks: bank_transfer.bri- BRI, bank_transfer.seabank - Seabank, bank_transfer.bni - BNI, bank_transfer.others - Other banks
  • card: refers to international credit cards. Accepted in all markets
  • online_banking: only available in MY
  • maribank_direct_debit: only available PH
  • Pass the following for National QR payment: ID - qris, "TH": promptpay_qr, "VN": viet_qr, "MY": duitnow_qr, "PH": qrph

customer

string
Customer account information in merchant account system
Show child child parameters

name

stringRequired
Customer’s name registered in the merchant system

email

stringRequired
Customer’s email address registered in the merchant system

phone_number

stringRequired
Customer’s phone number registered in the merchant system

address

stringRequired
Customer’s address registered in the merchant system

item

object
Detailed information about the checkout items
Show child child parameters

name

stringRequired
Name of Item

quantity

int64Required
Quantity of the item. Range: 1 - Unlimited

price

int64Required
Selling price of the item, inflated by factor of 100. A positive integer in the smallest currency uncut, with no decimal point. For currencies that do not have denomination in cents, the smallest amount will be 100, which represents 1 IDR (Rp 1) or 1 VND (₫ 1).

image_url

string
A public URL pointing to the product images (e.g: CDN-hosted). Recommended format: HTTPS.

category

string
Pass fee for additional fee (positive value) and quantity is 1. Pass discount for promotional discount(negative price value) and quantity is 1.

Sample request

JS EXAMPLE

{
"reference_id": "webhost165",
"merchant_ext_id": "testxxxpg",
"store_ext_id": "testxxx",
"amount": 100000,
"currency": "IDR",
"return_url": "https://www.google.com",
"validity_period": 7200,
"allowed_payment_method": [
"spay_later"
],
"items": [
{
"name": "item1",
"quantity": 1,
"price": 100000
},
{
"name": "shipping",
"quantity": 1,
"price": 100,
"category": "fee"
},
{
"name": "discount",
"quantity": 1,
"price": -100,
"category": "discount"
}
],
"customer": {
"name": "john cena",
"postal_code": "12345",
"phone_number": "00810029200006",
"email": "test@test.com"
}
}
arrow-svg

Copy

Response Parameter

reference_id

stringRequired
Unique identifier of transaction generated by merchant.

expires_at

string(date-time)Required
The timestamp at which the payment session will expired

created_at

string(date-time)Required
The timestamp at which the payment session is created

checkout_url

stringRequired
The url of the payment sessions. Use this url to redirect the customer to ShopeePay Web Hosted page

checkout_id

stringRequired
A unique identifier of the payment session

Sample response

JS EXAMPLE

{
"reference_id": "webhost210",
"checkout_url": "https://app.test.shopeepay.co.id/u/pay_checkout?type=start&mid=101118779&target_app=shopeepay&_apprl_=%2Frn%2F%40shopee-rn%2Fshopeepay%2FTRANSFER_PAYMENT_SELECTION_CSCANB%3F__anim__%3D2%26entryRefer%3DJumpApp%26mid%3D101118779%26order_key%3DoZu5W5BtnTNN2H3PyD6D2pW2Z8zbg76_XrImjmKjGagP0TLt9YhrThUyIQlzpHS_SgCeh5-26h0ecg%26order_sn%3D110935773598896173%26referrer%3Dexternal%26return_url%3DaHR0cHM6Ly93d3cuZ29vZ2xlLmNvbT9hbW91bnQ9MTAwMDAwJmNsaWVudF9pZD14eHgrdGVzdCtwZytzeW5jK2VzMjIyJnJlZmVyZW5jZV9pZD13ZWJob3N0MjEwJnJlc3VsdF9jb2RlPTIwMyZzaWduYXR1cmU9YUFQTWhEc2IxZlVlaDRFdS1Od29xM2pLUHFIOGpMTG1GanQzcnlHMlJjNCUzRA%253D%253D%26source%3Dweb%26token%3Dxd7iq02mfq15cfhldd1cg&medium_index=xd7iq02mfq15cfhldd1cg&order_key=oZu5W5BtnTNN2H3PyD6D2pW2Z8zbg76_XrImjmKjGagP0TLt9YhrThUyIQlzpHS_SgCeh5-26h0ecg&order_sn=110935773598896173&phone=00810029200006&return_url=aHR0cHM6Ly93d3cuZ29vZ2xlLmNvbT9hbW91bnQ9MTAwMDAwJmNsaWVudF9pZD14eHgrdGVzdCtwZytzeW5jK2VzMjIyJnJlZmVyZW5jZV9pZD13ZWJob3N0MjEwJnJlc3VsdF9jb2RlPTIwMyZzaWduYXR1cmU9YUFQTWhEc2IxZlVlaDRFdS1Od29xM2pLUHFIOGpMTG1GanQzcnlHMlJjNCUzRA%3D%3D&source=web&target=2&token=xd7iq02mfq15cfhldd1cg",
"checkout_id": "AIRPAY-MTEwOTM1NzczNTk4ODk2MTcz",
"created_at": "2026-04-20T10:39:54+07:00",
"expires_at": "2026-04-20T12:39:54+07:00"
}
arrow-svg

Copy

Response code

Refer to following table for HTTP error code:

Status codeError codeDescription
200Success
400invalid_parameterMissing parameters or parameters are not in the correct format
400invalid_mandatory_parameterMissing mandatory parameters or mandatory parameters are not in the correct format
400payment_method_unsupportedMerchant provides payment methods that are not supported by Gateway Service
400invalid_total_amountSum (items.price x items.quantity) + fee - discount does not match with amount
400invalid_amountAmount is too large / Amount is too small / Parameters are not in the correct format
401UnauthorizedUnauthorized. Invalid Client Key
403feature_not_allowedMerchant does not access to the checkout API/ No payment channel is enabled for this merchant/ Gateway Service is under maintenance
404invalid_merchant / invalid_storeMerchant does not exist or merchant status is abnormal/ Store does not exist or merchant status is abnormal
409duplicate_reference_idCheckoutID has previously been processed using the same referenceID
500general_errorAny other technical errors

Get Checkout ID Status

Request parameter:

Use the following path to obtain the latest status GET /v1/checkout/:checkout_id where checkout_id is provided in the response of create checkout session API.

Response parameter:

checkout_id

stringRequired
A unique identifier for the payment session

status

enumRequired
Refer to checkout_id status as below:

  • Active: Indicates that the checkout_id has been created
  • Expired: Indicates that the checkout_id has expired. Merchant can set the validity period while creating the payment session
  • Cancelled: Indicates that merchant has cancelled the checkout_id
  • Successful: Indicates that the checkout_id has been paid
  • Settled: Indicates that the payment amount has been escrowed to merchant.

payment_method

stringRequired
Indicates the source of fund used. Refer to the list of enum and their interpretation in create checkout sesssion API request parameters

created_at

stringRequired
Create time of the transaction

updated_at

stringRequired
Update time of the transaction

checkout_details

objectRequired
This object contains all information related to the checkout
Show child child parameters

reference_id

stringRequired
Unique identifier of transaction generated by merchant.

merchant_ext_id

stringRequired
Unique identifier of merchant in merchant’s system.

store_ext_id

stringRequired
Unique identifier of store in merchant’s system.

amount

stringRequired
Amount passed to ShopeePay/ AirPay in create checkout request

currency

stringRequired
Currency associated with amount passed to gateway in create checkout request

expiry_time

stringRequired
The timestamp at which the payment session will expired

locale

stringRequired
IETF language tag of the checkout passed in create checkout request

allowed_payment_method

objectRequired
List of payment methods passed in create checkout request

customer

ObjectRequired
Customer account information in merchant account system.
Show child child parameters

name

string
Customer's name registered in the merchant system

email

stringRequired
Customer’s email address registered in the merchant system

phone_number

stringRequired
Customer’s phone number registered in the merchant system

address

stringRequired
Customer’s address registered in the merchant system

item

ObjectRequired
Detailed information about the order items
Show child child parameters

name

string
Name of item

quantity

int64Required
Quantity of item

price

int64Required
Selling price of the item, inflated by a factor of 100. A positive integer in the smallest currency unit, with no decimal point.

image_url

string
Refer to create checkout sesssion request

category

string
Refer to create checkout session request

Sample response

JS EXAMPLE

{
"checkout_id": "AIRPAY-MTEwOTM1NzczNTk4ODk2MTcz",
"status": "active",
"created_at": "2026-04-20T10:39:54+07:00",
"updated_at": "2026-04-20T10:39:54+07:00",
"checkout_details": {
"reference_id": "webhost210",
"merchant_ext_id": "testxxxpg",
"store_ext_id": "testxxx",
"amount": 100000,
"currency": "IDR",
"return_url": "https://www.google.com",
"expiry_time": "2026-04-20T12:39:54+07:00",
"allowed_payment_method": [
"spay_later"
],
"customer": {
"name": "john cena",
"email": "test@test.com",
"phone_number": "00810029200006",
"postal_code": "12345"
},
"items": [
{
"name": "stuff",
"quantity": 1,
"price": 100000000
},
{
"name": "ship",
"quantity": 1,
"price": 100000,
"category": "fee"
},
{
"name": "discount",
"quantity": 1,
"price": -100000,
"category": "discount"
}
]
}
}
arrow-svg

Copy

Response code

Refer to following table for HTTP error code for get checkout_id status API:

Status codeError codeDescription
200Success
401UnauthorizedUnauthorized. Invalid client key
403feature_not_allowedThe checkout_id does not exist under the merchant account
404invalid_checkout_idUnable to find the corresponding checkout_id in gateway system
505general_errorAny other technical error

Create Refund

Use this endpoint to initiate refund of a successful checkout. There are 2 main types of refund:

  • Full refund: customer will get back the full payment amount
  • Partial refund: multiple partial refund is allowed as long as the sum does not exceed the original payment amount. To prevent potential erroneous handling, merchant is advised to wait for previous refund to complete successfully before creating next partial refund.

Request Parameters:

  • URL: "v1/refund"

amount

int64Required
The intended payment amount to be refunded to users, inflated by a factor of 100. A positive integer in the smallest currency unit with no decimal point.

original_checkout_id

stringRequired
ShopeePay/AirPay unique checkout_id generated after the checkout creation is successful

refund_reference_id

stringRequired
Unique identifier of refund transaction generated by merchant. Accepts up to 64 characters.

Sample request

JS EXAMPLE

{
"original_checkout_id":"AIRPAY-MTEwOTM1NzczNTk4ODk2MTcz",
"refund_reference_id": "webhostrefund_211",
"amount": 90000
}
arrow-svg

Copy

Response Parameters:

refund_id

stringRequired
A unique refund identifier generated by ShopeePay that serves as a reference after a refund is created

original_checkout_id

stringRequired
ShopeePay/AirPay unique checkout_id generated after the checkout creation is successful

refund_reference_id

stringRequired
Unique identifier of refund transaction generated by merchant. Accepts up to 64 characters.

amount

int64Required
Amount to be refunded per refund recreation request

created_at

stringRequired
Timestamp at which the refund request is created

updated_at

stringRequired
Updated time of the transactions

status

stringRequired
Status of the refund request. Possible values are pending, succeeded, failed.

Sample response

JS EXAMPLE

{
"refund_id": "AIRPAY-MTQ5MDQxMTg0MDEzNjQyODIy",
"original_checkout_id": "AIRPAY-MTEwOTM1NzczNTk4ODk2MTcz",
"refund_reference_id": "webhostrefund_211",
"amount": 90000,
"created_at": "2026-04-20T11:03:49+07:00",
"updated_at": "2026-04-20T11:04:02+07:00",
"status": "successful"
}
arrow-svg

Copy

Get Refund Status

Use this endpoint to check status of a refund request.

Request parameters

  • Path: "v1/refunds/:refund_id

Response parameters

refund_id

stringRequired
refund_id returned in create refund API response

amount

int64Required
Amount of the refund transaction, inflated by a factor of 100. A postive integer in the smallest currency unit , with no decimal point.

status

stringRequired
Status of the refund. This can be pending, succeeded, or failed

created_at

stringRequired
Timestamp at which the refund request is created

updated_at

stringRequired
Timestamp at which the refund request is updated

refund_session_details

objectRequired
This objective contains some relevant reference to the refund
Show child child parameters

refund_reference_id

stringRequired
refund_reference_id passed in create refund request

original_checkout_id

stringRequired
original_checkout_id passed in create refund request

Sample response

JS EXAMPLE

{
"refund_id": "AIRPAY-MTQ5MDQxMTg0MDEzNjQyODIy",
"status": "successful",
"created_at": "2026-04-20T11:03:49+07:00",
"updated_at": "2026-04-20T11:04:02+07:00",
"refund_session_details": {
"refund_reference_id": "webhostrefund_211",
"original_checkout_id": "AIRPAY-MTEwOTM1NzczNTk4ODk2MTcz",
"amount": 90000,
"currency": "IDR"
}
}
arrow-svg

Copy

Response code

Refer to the below table to interpret response code in get refund status API:

Status codeError codeDescription
200Success
401UnauthorizedUnauthorized due to invalid Client_key
403feature_not_allowedThe refund_id does not exist under this merchant in ShopeePay system
404invalid_refund_idUnable to locate refund_id in gateway system
505general_errorAny other technical error

Cancel checkout

Use this endpoint to cancel the checkout using the checkout ID for Create Checkout. Once the checkout_id is cancelled successfully, the corresponding redirect url can no longer be used to make payment.

Request Parameters

  • URL: POST /v1/checkout/{checkout_id}/cancel

Response Parameters

checkout_id

stringRequired
A unique identifier for the payment session

created_at

stringRequired
Create time of the transaction

updated_at

stringRequired
Update time of the transaction

checkout_details

objectRequired
This object contains all information related to the checkout
Show child child parameters

reference_id

stringRequired
Unique identifier of transaction generated by merchant.

merchant_ext_id

stringRequired
Unique identifier of merchant in merchant’s system.

store_ext_id

stringRequired
Unique identifier of store in merchant’s system.

amount

stringRequired
Amount passed to ShopeePay/ AirPay in create checkout request

currency

stringRequired
Currency associated with amount passed to gateway in create checkout request

expiry_time

stringRequired
The timestamp at which the payment session will expired

locale

stringRequired
IETF language tag of the checkout passed in create checkout request

allowed_payment_method

objectRequired
List of payment methods passed in create checkout request

customer

ObjectRequired
Customer account information in merchant account system.
Show child child parameters

name

string
Customer's name registered in the merchant system

email

stringRequired
Customer’s email address registered in the merchant system

phone_number

stringRequired
Customer’s phone number registered in the merchant system

address

stringRequired
Customer’s address registered in the merchant system

item

ObjectRequired
Detailed information about the order items
Show child child parameters

name

string
Name of item

quantity

int64Required
Quantity of item

price

int64Required
Selling price of the item, inflated by a factor of 100. A positive integer in the smallest currency unit, with no decimal point.

image_url

string
Refer to create checkout sesssion request

category

string
Refer to create checkout session request

Sample response

JS EXAMPLE

{
"checkout_id": "AIRPAY-MTMwMTM4OTQxMTM0MDY5Mjg2",
"created_at": "2026-04-20T13:06:15+07:00",
"updated_at": "2026-04-20T13:07:41+07:00",
"checkout_details": {
"reference_id": "webhost212",
"merchant_ext_id": "testxxxpg",
"store_ext_id": "testxxx",
"amount": 100000,
"currency": "IDR",
"return_url": "https://www.google.com",
"expiry_time": "2026-04-20T15:06:15+07:00",
"allowed_payment_method": [
"spay_later"
],
"customer": {
"name": "john cena",
"email": "test@test.com",
"phone_number": "00810029200006",
"postal_code": "12345"
},
"items": [
{
"name": "stuff",
"quantity": 1,
"price": 100000000
},
{
"name": "ship",
"quantity": 1,
"price": 100000,
"category": "fee"
},
{
"name": "discount",
"quantity": 1,
"price": -100000,
"category": "discount"
}
]
}
}
arrow-svg

Copy