Subscription

Merchant Workflow

To accept the payment in this scenario, the merchant needs to complete the following steps:

  1. Completed account linking request and store returned access token
  2. Initiate a payment request for Subscription when payment is due
  1. Merchant calls Create Payment Order: Subscription endpoint to charge from the customer’s ShopeePay account.
  2. ShopeePay will conduct a sequential attempt with each of the customer’s linked payment methods with ShopeePay, until the transaction is successful.
  3. ShopeePay will sends an asynchronous message via Notify Transaction Status endpoint to inform merchants on the payment result.
  4. Merchant can also call the Check Transaction Status endpoint to query the status of the transaction.
    • If the response code = "Success", the merchant can mark this transaction as successful.
    • If the response code = "Failed", the merchant can mark this transaction as failed.
    • If the transaction is in a “Processing” status, please retry the 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 response after 100 seconds, please retry the request at an incremental time range of every 5 minutes up to 24 hours.
    • If the transaction has no response, please retry the 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 response after 100 seconds, please retry the request at an incremental time range of every 5 minutes up to 24 hours.
    • If customer can show evidence of payment success on their payment app, merchant may choose to consider payment as successful and wait for reconciliation process on T+1 to settle discrepancies with ShopeePay, if any.

Create Payment Order: Subscription

Use this endpoint to create a direct payment with an access token.

  • URL: "/v3/merchant-host/transaction/payment/direct"

Request Parameters

request_id

stringRequired
Unique identifier of the API request.

access_token

stringRequired
The access token that was obtained from ShopeePay via the Get Access Token API, representing the user's authorization.

merchant_ext_id

stringRequired
Unique identifier of the merchant in the merchant's system.

store_ext_id

stringRequired
Unique identifier of the store in the merchant's system.

amount

int64
The order amount. If this parameter is provided, we will precheck the availability of each payment method using this amount.

Note that the value of this parameter is inflated by 100. For example, if the currency is SGD and the amount is $12.34, set the value of this parameter to 1234. If the currency is VND and the amount is 123, set the value of this parameter to 12300.

language

string
Language in which the linked payment methods are displayed. The default is English.

Possible values:

  • Indonesian : id
  • English: en
  • Malay: ms
  • Thai: th
  • Vietnamese:vi

additional_info

object
Show child child parameters

field1

String
Any Payment Remark for ShopeePay Clearing Order Report. This can be a customized value for reconciliation purpose.

field2

String
Any Payment Remark for ShopeePay Clearing Order Report. This can be a customized value for reconciliation purpose.

field3

String
Any Payment Remark for ShopeePay Clearing Order Report. This can be a customized value for reconciliation purpose.

device_info

Object
Show child child parameters

device_id

String
Merchant's unique identifier for the user's device.

device_brand

String
Brand of the device, e.g. 'Apple', 'Samsung'.

device_model

String
Model of the device, e.g. 'iPhone 14', 'Galaxy S24'.

os_version

String
Operating system and version, for example: 'iOS 16', 'Android 14'.

iosudid

String
Unique device identifier for iOS devices.

imei

String
Unique identifier such as IMEI (for compatible devices).

verification_completion_method

String
Verification that happens within merchant app.

Potential enum:

  • none
  • biometric
  • pin
  • password
  • pattern
  • other

device_first_login_at

String
Earliest timestamp when this device first logged in to the merchant app.

risk_tags

Object
Show child child parameters

jailbroken

Boolean
true if jailbroken (iOS) or rooted (Android)

enabled_emulator

Boolean
true if the app is running in an emulator environment (for example Genymotion).

enabled_remote_control

Boolean
true if remote access / remote control tools (for example TeamViewer, scrcpy) are active

modified_gps

Boolean
true if GPS appears tampered or inconsistent (possible GPS modification).

installed_fake_gps_app

Boolean
true if known fake-GPS apps are installed on the device.

gps

Object
Show child child parameters

latitude

Float
Device latitude at the time of transaction.

longitude

Float
Device longitude at the time of transaction.

location

String
Human-readable GPS location, for example: country and city. IP address of the device at the time of transaction.

device_ip

String
IP address of the device at the time of transaction.

device_risk_score

String
Risk score assigned by merchant’s system.
Potential enum values: high, medium, low.

additional_info

String
Any extra device-related risk information not covered by the structured fields.

user_account

Object
Show child child parameters

user_id

String
Identifier that uniquely represents the user in the merchant’s system.

phone_number

String
At least one of phone_number, email, or username must be provided.

email

String
At least one of phone_number, email, or username must be provided.

username

String
At least one of phone_number, email, or username must be provided.

account_registration_time

String
Timestamp when the user account was first registered with the merchant.

account_risk_score

String
Risk score assigned to the user account by the merchant.
Potential enum values: high, medium, low.

merchant_account

Object
Show child child parameters

merchant_name

String
Merchant business name

merchant_id

String
Identifier for each unique merchant onboarded by payment facilitator (most aggregated level)

merchant_mcc

String
Merchant Category Code (MCC). Leave blank if the external merchant differentiates only by store level.

merchant_address

Object
Show child child parameters

region

String
Registered address of the merchant. Leave blank if you only differentiate at store/outlet level.

state

String

city

String

address

String

postal_code

String

store

Object
Show child child parameters

store_name

String
If external merchant differentiates by store / outlet, to get store / outlet info.
otherwise leave blank.

store_id

String
If external merchant differentiates by store / outlet, to get store / outlet info.
otherwise leave blank.

store_mcc

String
If external merchant differentiates by store / outlet, to get store / outlet info.
otherwise leave blank.

store_address

Object
Show child child parameters

region

String
If external merchant differentiates by store / outlet, to get store / outlet info.
otherwise leave blank.

state

String

city

String

address

String

postal_code

String

order_details

Object
Show child child parameters

payment_initiation

String
Indicates how the payment is initiated.

Potential value:

  • MERCHANT_QR_PROPRIETARY: Merchant-presented proprietary QR scanned by the customer to initiate payment.
  • MERCHANT_QR_NATIONAL: Merchant-presented national / standardized QR scanned by the customer to initiate payment.
  • CUSTOMER_QR_PROPRIETARY: Customer-presented proprietary QR scanned by the merchant to initiate payment.
  • CUSTOMER_QR_NATIONAL: Customer-presented national / standardized QR scanned by the merchant to initiate payment.
  • ONLINE_CHECKOUT: Online checkout where the customer confirms an order and pays with a non-QR method (card, wallet, giro, etc.).
  • SUBSCRIPTION: Recurring or scheduled billing initiated automatically
  • TRANSFER: Fund transfer between accounts (for example, P2P or internal balance movement) without an order/cart.

description

String
Free-text description of the charge.

shipping_address

Object
Show child child parameters

region

String
Shipping address where goods are delivered. Mandatory for online merchants except for purely virtual goods.

state

String

city

String

address

String

postal_code

String

merchant_additional_info

String
Additional merchant-specific information for this order, if any.

items

Object
Show child child parameters

item_name

String
item name user bought in online platform or App.

item_quantity

Int
item number user bought in online platform or App.

item_currency

String
item currency Example, SGD.

item_amount

Int64
item amount

item_category

String
Category of the item (merchant-defined taxonomy).

qr_details

Object
Show child child parameters

qr_type

String
Potential values: 'static' or 'dynamic'.

qr_create_time

String
Creation timestamp for dynamic QR codes.

qr_source

String
How the user submitted the QR for payment.

Potential values: 'scan'; 'upload'

national_qr_payload

String
Raw national QR payload string as defined by the national QR standard.

Sample API Request

{
"request_id": "input-unique-request-id-here",
"payment_reference_id": "ref-must-be-unique",
"merchant_ext_id": "external-merchant",
"store_ext_id":"external-store",
"access_token": "uXjWuhPGepSOtntoC8kTK5er6DlbUiGeSJDt53",
"amount": 100,
"currency": "IDR",
"use_coin": true
}
arrow-svg

Copy

Response Parameters

request_id

string
The same value as the request_id in the request.

errcode

int32
Error code to specify the error returned.

debug_msg

string
Debug message to provide more information.

transaction

object
Will not be returned if the transaction fails.
Show child child parameters

reference_id

string
Unique identifier of payment transaction generated by merchant. Same value as payment_reference_id.

amount

int64
Amount used for the payment, inflated by a factor of 100. A positive integer in the smallest currency unit, with no decimal point. Example:Smallest amount will be 1, which represents 0.01.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).

status

uint32
Refer to Transaction Status for specific transaction statuses.

transaction_type

uint32
13, referring to subscription transaction type. Refer to Transaction Types for specific transaction types.

transaction_sn

string
Transaction identifier in ShopeePay's system.

create_time

uint32
Create time of the transaction.

update_time

uint32
Update time of the transaction.

user_id_hash

string
Identifier for the customer that made the payment.

merchant_ext_id

string
Unique identifier of merchant in merchant's system.

store_ext_id

string
Unique identifier of store in merchant's system.

promo_id_applied

string
promo_ids applied to the payment transaction.

payment_channel

uint32
Indicates the source of funds used. Refer to Payment Channels for the respective source of fund.

Sample API Response

{
"request_id": "input-unique-request-id-here",
"errcode": 0,
"debug_msg": "success",
"transaction": {
"reference_id": "input-payment-ref-id",
"amount": 1000000,
"create_time": 1716193693,
"update_time": 1716193693,
"transaction_sn": "4737856404311306",
"status": 3,
"transaction_type": 13,
"merchant_ext_id": "external-merchant",
"store_ext_id": "external-store",
"user_id_hash": "697863f9295aeddcb3db598ecbc74c59a13335abf4d8c41b40e33b28a9d7d63c",
"payment_channel": 1
}
}
arrow-svg

Copy

Response Code

ValueDescription
-2A server dropped the connection
-1A server error occurredPlease use Check Transaction Status endpoint to query the updated status of the payment
0Success
1The request parameters is invalid or a mandatory parameter is empty
2Permission denied, often due to invalid status
4Not found, often due to merchant/store/user/transaction not found
5Transaction is in processing status, use Check Transaction Status endpoint to query the updated status of the payment
9Customer’s account is banned
11Duplicated request
14Customer’s account is deleted
24Customer's account is frozen
27Customer's account is not activated
42Insufficient balance
43Insufficient balance
50The request parameters is invalid due to payload sent is not a valid JSON
105Invalid auth code
140Customer’s wallet limit is reached
1001Customer is not allowed to make the transaction
1100ShopeePay internal payment module error
1101ShopeePay internal payment module error
1102Customer’s SPL credit limit is reached
1103Customer is required to link their bank account
1104Ineligible payment channel
1105Transaction failed due to unsuccessful authentication
1106Duplicated payment
1200ShopeePay internal payment module error
1201ShopeePay internal payment module error
1500ShopeePay internal payment module error
1800ShopeePay internal payment module error
1801ShopeePay internal payment module error
1906Unable to process refund due to transaction has been failed
1907Ineligible payment channel
1908Service is temporarily down for scheduled maintenance
1601Error due to invalid promotion