OpenAPI Specification
openapi: 3.0.0
info:
description: Welcome to Xfers' API documentation. You can find information on our API endpoint specific to your country.
version: '3'
title: Xfers Bank Account User Account API
contact:
name: Contact us through our help desk
url: https://bit.ly/XfersSupport
servers:
- description: Indonesia Production
url: https://id.xfers.com/api
- description: Indonesia Sandbox for testing
url: https://sandbox-id.xfers.com/api
tags:
- name: User Account
description: Manage User and Accounts
paths:
/v3/user:
get:
operationId: getUserInfo
x-code-samples:
- lang: Shell
source: "curl --location --request GET \"{base_url}/user\" \\\r\n --header \"X-XFERS-USER-API-KEY: 2zsujd47H3-UmsxDL784beVnYbxCYCzL4psSbwZ_Ngk\""
tags:
- User Account
summary: Get User Info
description: "The main usage of this API is to get the current user. One user can have multiple accounts, and the balance returned is the account tied to the current API token. \r\nYou can also use this API to check various data of the user such as first_name, last_name.\r\n\r\nDescription of some notable response\r\n\r\nKey | Value | Description \r\n--------------- | ----------- | -----\r\nkyc_status | fully_verified | current_kyc_status of user, enum of `not_submitted`, `in_process`, `rejected`, `fully_verified`"
security:
- user-api-token: []
responses:
'200':
description: Success
content:
application/json:
example:
id: user_gksj43jgzgqv
available_balance: '2595750.79'
ledger_balance: '2595750.79'
bank_transfer_rates: '0.0'
bank_transfer_fees: '0.45'
first_name: docs.xfers.io
last_name: testingaccount
date_of_birth: '1990-11-09'
country_of_birth: SG
gender: male
email: docs@xfers.com
country: sg
state: Singapore
city: Singapore
nationality: Singaporean
address_line_1: Blk 71 Ayer Rajah Cresent
address_line_2: '#02-52'
postal_code: '541121'
nric_type: ''
identity_no: S8117102G
nric_issue_date: ''
phone_no: '+6281128125'
bank_accounts:
- id: 329
account_no: '800006788912'
account_holder_name: Tian Wei
detected_name: PROD ONLY
verification_status: pending
verified: true
bank_abbrev: CIMB_NIAGA
usage: all
- id: 561
account_no: '2480096820'
account_holder_name: null
detected_name: PROD ONLY
verification_status: pending
verified: true
bank_abbrev: BCA
usage: all
annual_income: ''
id_front: 15357011921535007959147096578.jpg
id_front_url: https://sandbox-xfers-id.s3-ap-southeast-1.amazonaws.com/users/nric_fronts/000/000/383/original/15357011921535007959147096578.jpg?AWSAccessKeyId=REDACTED-EXAMPLE&Expires=1540979796&Signature=REDACTED-EXAMPLE
selfie_2id: 15357011921535007959147096578.jpg
selfie_2id_url: https://sandbox-xfers-id.s3-ap-southeast-1.amazonaws.com/users/nric_selfies/000/000/383/original/15357011921535007959147096578.jpg?AWSAccessKeyId=REDACTED-EXAMPLE&Expires=1540979796&Signature=REDACTED-EXAMPLE
account_locked: false
google_auth_enabled: false
kyc_verified: true
kyc_needed: true
meta_data: ''
display_name: XfersDocsTest
avatar: cardProfileDefault.png
avatar_url: cardProfileDefault.png
is_guest: false
is_trial: true
place_of_birth: null
blood_type: null
rt_rw: null
administrative_village: null
district: null
religion: null
marital_status: null
occupation: null
mother_maiden_name: Putras
4XX:
$ref: '#/components/responses/v3Error:4XX'
/v3/user/activities:
get:
operationId: getTransactionHistory
x-code-samples:
- lang: Shell
source: "curl --location --request GET \"$BASE_URL/v3/user/activities\" \\\r\n --header \"Content-Type: application/x-www-form-urlencoded\" \\\r\n --header \"X-XFERS-USER-API-KEY: $CUSTOMER_API_KEY\" \\\r\n --data \"\""
tags:
- User Account
summary: Get Transaction History
description: "This API displays a user’s transaction history. \n\n\nThis API displays a user’s transaction history.\n\nI.e. user’s transactions with other merchants will not be displayed."
security:
- X-XFERS-USER-API-KEY: []
parameters:
- name: limit
in: query
description: Max number of results to return per page.
required: false
explode: true
schema:
type: integer
default: 50
- name: start_date
in: query
description: Earliest date to query
required: false
explode: true
schema:
type: string
format: DateTime, iso8601 format.URL encode this.
default: 1 month ago
- name: end_date
in: query
description: Latest date to query
required: false
explode: true
schema:
type: string
format: DateTime, iso8601 format.URL encode this.
default: Now
- name: offset
in: query
description: Offset results for pagination purposes.
required: false
explode: true
schema:
type: integer
default: 0
- name: types
in: query
description: Will only show transactions of that type. You can add additional types by separating with a comma.
required: false
explode: true
schema:
enum:
- Charge
- Payout
- Deposit
- Withdrawal
type: string
default: All types included
responses:
'200':
description: Success
content:
application/json:
example:
activities:
- fee: 0
created_at: '2019-09-18T14:58:29+08:00'
wallet_name: Digital Goods
id: contract_52683616c80b4c91bc6d6aa83eca4874
amount: 559
status: completed
type: Transfer
metadata:
origin_name: John Tan
destination_name: ABC Business
description: This is a charge, money is moving from a customer to the business account
order_id: '12345'
invoice_id: null
- fee: 0
created_at: '2019-09-18T11:55:04+08:00'
wallet_name: Digital Goods
id: contract_402539e247424cf1af35aae32b087727
amount: -695.29
status: completed
type: Transfer
metadata:
origin_name: ABC Business
destination_name: Mary Jane
description: This is a payout, money is moving from the business account to a customer
order_id: null
invoice_id: '87676'
- fee: 0
created_at: '2019-08-25T21:47:59+08:00'
wallet_name: Digital Goods
id: contract_aaebb4c688ea4a34b73ede332a5c78c3
amount: -99.88
status: completed
type: Withdrawal
metadata:
description: POSB 208767841
- fee: 0
created_at: '2019-08-24T14:50:43+08:00'
wallet_name: Digital Goods
id: contract_e8db413d5f94476aa38de79b04128db6
amount: 300
status: completed
type: Deposit
metadata:
description: Xfers - CIMB
activities_returned: 10
limit: 10
offset: 0
start_date: '2019-08-20T14:02:38+08:00'
end_date: '2019-09-20T23:59:59+08:00'
schema:
properties:
id:
type: string
description: ID of the Charge/Payout/Withdrawal/Payout. You can use this ID to query Charges and Payouts.
type:
type: string
description: Transaction type. Charge and Payout are named as 'Transfer', because they are internal transfers between two xfers accounts.
enum:
- Transfer
- Deposit
- Withdrawal
order_id:
type: string
description: If it is a charge, it will have a order_id
invoice_id:
type: string
description: If it is a payout, it will have a invoice_id
amount:
type: float
description: If money going out of account, negative. If coming in, positive. Note that only a completed Charge will actually deduct money. For example, if a Charge is expired/accepted/pending/unclaimed, no money will actually flow in/out of the wallet, even though there is a amount displayed.
fee:
type: float
description: Fee charged by Xfers for the transaction, if any. Will be 0 if no fees
metadata:
type: object
description: Shows additional information about a transaction
activities_returned:
type: integer
description: Number of activities returned. If activities returned is less than the limit, this is the final page.
4XX:
$ref: '#/components/responses/v3Error:4XX'
/v3/user/transfer_info:
get:
operationId: getTransferInfo
x-code-samples:
- lang: Shell
source: "curl --location --request GET \"$BASE_URL/v3/user\" \\\r\n --header \"X-XFERS-USER-API-KEY: $CUSTOMER_API_KEY\""
tags:
- User Account
summary: Get Transfer Info / Get Virtual Account Number
description: "API to get bank account number to be shown to user. \r\nPlease consult with us to get topup instruction template text to be shown.\r\n\r\nThe common usage of this API is to parse the transfer_info_array given by us and parse it and use the VA numbers of the bank you want\r\n\r\n#### For Virtual Account solution: \r\nThis API is to get the Virtual Account Number to be displayed to the user\r\n\r\n#### For non Virtual Account solution: \r\nThis API will show the bank account number to do top up. \r\nPlease consult with us as this solution will require user to use some other identifier to detect the deposit."
security:
- X-XFERS-USER-API-KEY: []
responses:
'200':
description: Success
content:
application/json:
example:
bank_name_full: Bank Permata
bank_abbrev: PERMATA
bank_name_abbreviation: PERMATA
bank_account_no: '8773162088567819'
bank_payee_name: PT Xfers Indonesia Teknologi
bank_code: '013'
branch_code: ''
branch_area: ''
unique_id: '87785725657'
img_src: https://d2ukkkjyjaezp4.cloudfront.net/assets/bank-logo-permata-32f25d774c784800bf92310ab010491d5f18af9fecef716ce1c61bb2ce12070d.png
transfer_info_array:
- bank_name_full: Bank Permata
bank_abbrev: PERMATA
bank_name_abbreviation: PERMATA
bank_account_no: '8773162088567819'
bank_code: '013'
branch_code: ''
branch_area: ''
unique_id: '87785725657'
img_src: https://d2ukkkjyjaezp4.cloudfront.net/assets/bank-logo-permata-32f25d774c784800bf92310ab010491d5f18af9fecef716ce1c61bb2ce12070d.png
- bank_name_full: Bank Mandiri
bank_abbrev: MANDIRI
bank_name_abbreviation: MANDIRI
bank_account_no: '8830812088567819'
bank_code: 008
branch_code: ''
branch_area: ''
unique_id: '87785725657'
img_src: https://d2ukkkjyjaezp4.cloudfront.net/assets/bank-logo-mandiri-3c9030412a3deb3c41589344a9a7bf74a52ef8dd278834d400b917f35e1b3bf9.png
wallet_name: Xfers
schema:
properties:
id:
description: ID of the Charge/Payout/Withdrawal/Payout. You can use this ID to query Charges and Payouts.
type:
description: activity type
enum:
- Credit Card
- Charge
- Payout
- Withdrawal
- Deposit
amount:
description: If money going out of account, negative. If coming in, positive. Note that only a completed Charge will actually deduct money. For example, if a Charge is expired/accepted/pending/unclaimed, no money will actually flow in/out of the wallet, even though there is a amount displayed.
fee:
description: Fee charged by Xfers for the transaction, if any. Will be 0 if no fees
metadata:
type: object
description: Shows additional information about a transaction
activities_returned:
type: string
description: Number of activities returned. If activities returned is less than the limit, this is the final page.
4XX:
$ref: '#/components/responses/v3Error:4XX'
components:
examples:
XFE403:
summary: XFE403 - ...
value:
error: string
error_code: XFE403
error_handling: '...'
XFE111:
summary: XFE1 - Duplicate credentials
value:
error: string
error_code: XFE111
error_handling: Particulars already exist. Please make sure you entered the correct parameters.
XFE3:
summary: XFE3 - Internal Error
value:
error: string
error_code: XFE3
error_handling: Unexpected error. Try again later or contact customer support at https://bit.ly/XfersSupport.
XFE312:
summary: XFE312 - Conditions not met to close account
value:
error: string
error_code: XFE312
error_handling: Invalid request to close account. Follow instruction in the response.
XFE1:
summary: XFE1 - Server busy
value:
error: string
error_code: XFE1
error_handling: Follow instructions in the response.
XFE311:
summary: XFE311 - Cannot be different wallet type
value:
error: string
error_code: XFE311
error_handling: Follow instruction in response or contact customer support at https://bit.ly/XfersSupport.
XFE301:
summary: XFE301 - Account locked
value:
error: string
error_code: XFE301
error_handling: Request not available. Please contact customer support at https://bit.ly/XfersSupport.
XFE108:
summary: XFE108 - More user information required
value:
error: string
error_code: XFE108
error_handling: Follow instructions in the response.
XFE107:
summary: XFE107 - Only enter one auth_code
value:
error: string
error_code: XFE107
error_handling: Do not enter both OTP or Google Auth OTP. Only need to enter one.
XFE402:
summary: XFE402 - Cannot use placeholder account
value:
error: string
error_code: XFE402
error_handling: Follow instructions in response.
XFE502:
summary: XFE502 - Unexpected BANK API error
value:
error: string
error_code: XFE502
error_handling: Try again later or contact customer support at https://bit.ly/XfersSupport.
XFE106:
summary: XFE106 - No auth_code provided
value:
error: string
error_code: XFE106
error_handling: Enter either phone OTP or Google Auth OTP
XFE407:
summary: XFE407 - Conditions to charge card not met
value:
error: string
error_code: XFE407
error_handling: Invalid request for this transaction. Make sure you entered the correct txn_id.
XFE409:
summary: XFE409 - Order id exist
value:
error: string
error_code: XFE409
error_handling: Please enter another order_id.
XFE105:
summary: XFE105 - Captcha error
value:
error: string
error_code: XFE1
error_handling: Follow instructions in the response.
XFE404:
summary: XFE404 - Forex not supported
value:
error: string
error_code: XFE404
error_handling: Make sure you call the correct API or contact customer support at https://bit.ly/XfersSupport.
XFE102:
summary: XFE102 - Entered value is less than minimum
value:
error: string
error_code: XFE102
error_handling: Make sure you entered the correct number.
XFE109:
summary: XFE109 - Invalid credentials
value:
error: string
error_code: XFE109
error_handling: Make sure you entered the correct credentials.
XFE104:
summary: XFE104 - Media provided too large
value:
error: string
error_code: XFE104
error_handling: Media too big. Follow the guidelines in the response.
XFE15:
summary: XFE15 - Required parameter empty
value:
error: string
error_code: XFE15
error_handling: Make sure you entered the correct required parameter.
XFE14:
summary: XFE14 - API only allowed for fully verified user
value:
error: string
error_code: XFE14
error_handling: Please submit KYC data to get your account fully verified.
XFE2:
summary: XFE2 - Access denied
value:
error: string
error_code: XFE2
error_handling: Make sure you call the correct API or contact customer support at https://bit.ly/XfersSupport.
XFE506:
summary: XFE506 - Bank account already taken
value:
error: string
error_code: XFE506
error_handling: Please use another bank account.
XFE309:
summary: XFE309 - Cannot use same account
value:
error: string
error_code: XFE309
error_handling: Follow instructions in the response.
XFE13:
summary: XFE13 - Record not found
value:
error: string
error_code: XFE13
error_handling: Please check that you provided the correct API Key and the correct parameters.
XFE8:
summary: XFE8 - Cannot retrieve media
value:
error: string
error_code: XFE8
error_handling: Cannot retrieve media. Please enter a new URL or try again later.
XFE7:
summary: XFE7 - Database error
value:
error: string
error_code: XFE7
error_handling: Follow instructions in the response.
XFE408:
summary: XFE408 - Invalid charge request
value:
error: string
error_code: XFE408
error_handling: Invalid request. Please follow instructions in response or contact customer support at https://bit.ly/XfersSupport.
XFE302:
summary: XFE302 - Account deleted
value:
error: string
error_code: XFE302
error_handling: Request not available. Please contact customer support at https://bit.ly/XfersSupport.
XFE201:
summary: XFE201 - Not yet a merchant
value:
error: string
error_code: XFE201
error_handling: Please verify your merchant or business account.
XFE103:
summary: XFE103 - ...
value:
error: string
error_code: XFE103
error_handling: Follow instructions in the response.
XFE406:
summary: XFE406 - Cannot refund prepaid transaction
value:
error: string
error_code: XFE406
error_handling: Please choose another transaction to refund.
XFE401:
summary: XFE401 - Cannot refund charge
value:
error: string
error_code: XFE401
error_handling: Invalid request. Please call another API or Contact customer support at https://bit.ly/XfersSupport.
XFE503:
summary: XFE503 - Failed name check
value:
error: string
error_code: XFE503
error_handling: Bank account name and name provided have to be similar.
XFE410:
summary: XFE410 - Invalid application fee
value:
error: string
error_code: XFE410
error_handling: Invalid request. Please make changes to the parameters as stated in the response.
XFE304:
summary: XFE304- Account closed
value:
error: string
error_code: XFE304
error_handling: Request not available. Please contact customer support at https://bit.ly/XfersSupport.
XFE110:
summary: XFE110 - Cannot sign up twice
value:
error: string
error_code: XFE110
error_handling: Please sign in instead
XFE504:
summary: XFE504 - Maximum number of bank account
value:
error: string
error_code: XFE504
error_handling: Delete existing bank accounts.
XFE16:
summary: XFE16 - Invalid request
value:
error: string
error_code: XFE16
error_handling: API request not supported. Make sure you entered the correct API key or contact customer support at https://bit.ly/XfersSupport.
XFE310:
summary: XFE310 - Cannot use same account
value:
error: string
error_code: XFE310
error_handling: Follow instructions in the response.
XFE9:
summary: XFE9 - ....
value:
error: string
error_code: XFE9
error_handling: '...'
XFE601:
summary: XFE601 - Conditions to withdraw not met. Can be solved by changing amount
value:
error: string
error_code: XFE601
error_handling: Your withdrawal does not meet the conditions required. Please follow the instructions in the response.
XFE10:
summary: XFE10 - Invalid environment
value:
error: string
error_code: XFE10
error_handling: Request not supported for this environment.
XFE4:
summary: XFE4 - Authentication field empty
value:
error: string
error_code: XFE4
error_handling: Follow instructions in the response.
XFE307:
summary: XFE307 - ...
value:
error: string
error_code: XFE307
error_handling: '...'
XFE303:
summary: XFE303 - Account terminated
value:
error: string
error_code: XFE303
error_handling: Request not available. Please contact customer support at https://bit.ly/XfersSupport.
XFE101:
summary: XFE101 - Not local number
value:
error: string
error_code: XFE101
error_handling: Follow instructions in the response.
XFE405:
summary: XFE405 - Charge cannot be refunded
value:
error: string
error_code: XFE405
error_handling: Only completed contract can be refunded.
XFE505:
summary: XFE505 - Bank abbrev provided invalid
value:
error: string
error_code: XFE505
error_handling: Use GET {{base-api-url}}api/v3/banks to get the correct bank abbrev.
XFE6:
summary: XFE6 - Invalid signature
value:
error: string
error_code: XFE6
error_handling: Follow instructions in the response.
XFE5:
summary: XFE5 - Api key is invalid
value:
error: string
error_code: XFE5
error_handling: Make sure you entered the correct API key or contact customer support at https://bit.ly/XfersSupport
XFE603:
summary: XFE603 - Not allowed to carry out request
value:
error: string
error_code: XFE603
error_handling: Invalid request. Please call another API or contact customer support at https://bit.ly/XfersSupport.
XFE12:
summary: XFE12 - Invalid parameter
value:
error: string
error_code: XFE12
error_handling: Make sure you entered the correct parameters.
XFE306:
summary: XFE306 - ...
value:
error: string
error_code: XFE306
error_handling: '...'
XFE602:
summary: XFE602 - Server busy
value:
error: string
error_code: XFE602
error_handling: Your withdrawal exceeds the limit for the time period. Please change the amount or verify your account.
XFE11:
summary: XFE11 - Timeout
value:
error: string
error_code: XFE11
error_handling: Please try again later.
XFE308:
summary: XFE308 - ...
value:
error: string
error_code: XFE308
error_handling: '...'
XFE501:
summary: XFE501 - Expected Bank API error
value:
error: string
error_code: XFE501
error_handling: Try again later or contact customer support at https://bit.ly/XfersSupport.
XFE112:
summary: XFE112 - Repeat request
value:
error: string
error_code: XFE112
error_handling: API request has already been made. Please follow the instructions in the response or call aother API.
XFE305:
summary: XFE305 - ....
value:
error: string
error_code: XFE305
error_handling: '...'
schemas:
error_response:
type: object
properties:
error:
description: Error Message
type: string
error_code:
description: Xfers' error code XFEXXX
type: string
error_handling:
description: Instruction on how to handle error. Refer to Error Codes tag for more information.
type: string
responses:
v3Error:4XX:
description: List of possible errors
content:
application/json:
schema:
$ref: '#/components/schemas/error_response'
examples:
XFE1:
$ref: '#/components/examples/XFE1'
XFE2:
$ref: '#/components/examples/XFE2'
XFE3:
$ref: '#/components/examples/XFE3'
XFE4:
$ref: '#/components/examples/XFE4'
XFE5:
$ref: '#/components/examples/XFE5'
XFE6:
$ref: '#/components/examples/XFE6'
XFE7:
$ref: '#/components/examples/XFE7'
XFE8:
$ref: '#/components/examples/XFE8'
XFE9:
$ref: '#/components/examples/XFE9'
XFE10:
$ref: '#/components/examples/XFE10'
XFE11:
$ref: '#/components/examples/XFE11'
XFE12:
$ref: '#/components/examples/XFE12'
XFE13:
$ref: '#/components/examples/XFE13'
XFE14:
$ref: '#/components/examples/XFE14'
XFE15:
$ref: '#/components/examples/XFE15'
XFE16:
$ref: '#/components/examples/XFE16'
XFE101:
$ref: '#/components/examples/XFE101'
XFE102:
$ref: '#/components/examples/XFE102'
XFE103:
$ref: '#/components/examples/XFE103'
XFE104:
$ref: '#/components/examples/XFE104'
XFE105:
$ref: '#/components/examples/XFE105'
XFE106:
$ref: '#/components/examples/XFE106'
XFE107:
$ref: '#/components/examples/XFE107'
XFE108:
$ref: '#/components/examples/XFE108'
XFE109:
$ref: '#/components/examples/XFE109'
XFE110:
$ref: '#/components/examples/XFE110'
XFE111:
$ref: '#/components/examples/XFE111'
XFE112:
$ref: '#/components/examples/XFE112'
XFE201:
$ref: '#/components/examples/XFE201'
XFE301:
$ref: '#/components/examples/XFE301'
XFE302:
$ref: '#/components/examples/XFE302'
XFE303:
$ref: '#/components/examples/XFE303'
XFE304:
$ref: '#/components/examples/XFE304'
XFE305:
$ref: '#/components/examples/XFE305'
XFE306:
$ref: '#/components/examples/XFE306'
XFE307:
$ref: '#/components/examples/XFE307'
XFE308:
$ref: '#/components/examples/XFE308'
XFE309:
$ref: '#/components/examples/XFE309'
XFE310:
$ref: '#/components/examples/XFE310'
XFE311:
$ref: '#/components/examples/XFE311'
XFE312:
$ref: '#/components/examples/XFE312'
XFE401:
$ref: '#/components/examples/XFE401'
XFE402:
$ref: '#/components/examples/XFE402'
XFE403:
$ref: '#/components/examples/XFE403'
XFE404:
$ref: '#/components/examples/XFE404'
XFE405:
$ref: '#/components/examples/XFE405'
XFE406:
$ref: '#/components/examples/XFE406'
XFE407:
$ref: '#/components/examples/XFE407'
XFE408:
$ref: '#/components/examples/XFE408'
XFE409:
$ref: '#/components/examples/XFE409'
XFE410:
$ref: '#/components/examples/XFE410'
XFE501:
$ref: '#/components/examples/XFE501'
XFE502:
$ref: '#/components/examples/XFE502'
XFE503:
$ref: '#/components/examples/XFE503'
XFE504:
$ref: '#/components/examples/XFE504'
XFE505:
$ref: '#/components/examples/XFE505'
XFE506:
$ref: '#/components/examples/XFE506'
XFE601:
$ref: '#/components/examples/XFE601'
XFE602:
$ref: '#/components/examples/XFE602'
XFE603:
$ref: '#/components/examples/XFE603'
securitySchemes:
X-XFERS-USER-API-KEY:
type: apiKey
name: X-XFERS-USER-API-KEY
in: header
description: You can retrieve this by using [get_token API](../sg/api/cutting-edge#operation/getToken)
externalDocs:
description: Find out more about Xfers
url: https://id.xfers.com
x-tagGroups:
- name: User Management
tags:
- Registration
- User Account
- Bank Account
- E-signature
- name: Payments
tags:
- Charge
- Payout
- Withdraw
- Intents
- name: Loans
tags:
- Loans
- Disbursements
- Repayments
- name: Appendix
tags:
- Testing
- Error Response
- Pagination
- Callback Configuration
- Try it out with Postman