NAV Navbar
shell ruby python javascript php java go

Introduction

What is ArcusPay?

The new payment systems are changing the dynamics that consumers follow to buy products and services, by moving from cash to credit and debit cards, at the same time that mobile devices, such as smartphones are being used to make payments.

ArcusPay is a proprietary payment rail that allows converting cash-to-digital at the same time that facilitates cash-out functionalities from digital wallets into physical retail stores.

How does it work?

ArcusPay is a RESTfull API payments network specifically designed for payees that want to receive payments for their businesses. ArcusPay supports a variety of use cases that can be seen throughout this documentation. The network defines a set of APIs and processes that joining payees will need to develop in their back-end environment. After the development is done by the newly joined participant, Arcus will run a certification period, after which, the payee will be available to the whole Arcus network.

If your current use case is not covered by our documentation, do not hesitate to contact us to get more information, we will analyze how we could collaborate.

Quickstart

Want to join the ArcusPay network?

  1. Read the documentation and decide if this is the product you are looking for;
  2. Get in touch with us at contact@arcusfi.com
  3. Get a sandbox key to start integrating
  4. Get your service up and rolling

Idempotency

Every API call will need to include a unique idempotency key. This unique key will be used to avoid duplicate posting of funds, duplicated charges, or any kind of issues generated due to timeouts. Once a network participant has received an idempotency key, if a subsequent API call is received with the same idempotence key then the original response object should be returned and no new resources should be created.

Idempotence will be managed by the use of Idempotency-Key header within each API request. This key value will be a unique UUID v4 per each request.

ArcusPay Retry Policy

Timeouts

ArcusPay will expect a response from the network partner within the timeframe defined (during the certification period) from the request. If no response is obtained the network will retry the petition, including the same idempotency-key header, following ArcusPay's retry policy.

ArcusPay's retry policy will re-send the original request as many times as needed to either:

Should a network partner receive a request with a previously provided idempotency-key then it would be expected to return the originally generated resource. If ArcusPay receives no response, within the defined response timeout, then ArcusPay network will deem the request as failed.

Authentication API & Security

POST /v1/arcuspay/authentication

Network participants will need to develop an Authentication API that arcus will utilize to authenticate itself. The authentication API will provide Arcus a bearer token that will be utilized for any subsequent API call as authentication method.

HTTPS Basic Authentication will be used for this endpoint as specified within the RFC 7617 standard. Arcus' will need to get their credentials provided by the merchant during the integration process.

Body parameter

{
  "user": "example USER",
  "pwd": "*********",
}

Body

Name Type Required Description
user string true User provided to Arcus by the network participant
password string true Pasword provided to Arcus by the network participant

Example responses

Succesful authentication

{
  "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c",
  "expiresIn": 3600
}

Failed authentication

{
  "message": "unathorized"
}

Responses

Status Meaning Description Schema
200 OK Succesful authentication Inline
401 Unathorized Entity Unathorized Inline

Response Schema

Status Code 200

Name Type Required Description
token string true JWT bearer token to be used as authentication method
expiresIn string true Expiration time in seconds of the provided token

Status Code 401

Name Type Required Description
message string true Descriptive message of the error cause (Unathorized)

Deposits API

Code samples

import requests
headers = {
  'Content-Type': 'application/json',
  'Accept': 'application/json',
  'Idempotency-Key': 'string'
  'Authorization' : 'Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c'
}

r = requests.post('/v1/arcuspay/deposit', headers = headers)

print(r.json())

require 'rest-client'
require 'json'

headers = {
  'Content-Type' => 'application/json',
  'Accept' => 'application/json',
  'Idempotency-Key' => 'string',
  'Authorization' => 'Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c'
}

result = RestClient.post '/v1/arcuspay/deposit',
  params: {
  }, headers: headers

p JSON.parse(result)

# You can also use wget
curl -X POST /v1/arcuspay/deposit \
  -H 'Content-Type: application/json' \
  -H 'Accept: application/json' \
  -H 'Idempotency-Key: string'\
  -H 'Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c'

const inputBody = '{
  "id": "ap_114441265464",
  "reference": "1234567890",
  "payer_id": 711,
  "amount": 10000
}';
const headers = {
  'Content-Type':'application/json',
  'Accept':'application/json',
  'Idempotency-Key':'string',
  'Authorization':'Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c'
};

fetch('/v1/arcuspay/deposit',
{
  method: 'POST',
  body: inputBody,
  headers: headers
})
.then(function(res) {
    return res.json();
}).then(function(body) {
    console.log(body);
});

URL obj = new URL("/v1/arcuspay/deposit");
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
con.setRequestMethod("POST");
int responseCode = con.getResponseCode();
BufferedReader in = new BufferedReader(
    new InputStreamReader(con.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
    response.append(inputLine);
}
in.close();
System.out.println(response.toString());

<?php

require 'vendor/autoload.php';

$headers = array(
    'Content-Type' => 'application/json',
    'Accept' => 'application/json',
    'Idempotency-Key' => 'string',
    'Authorization' => 'Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c'
);

$client = new \GuzzleHttp\Client();

// Define array of request body.
$request_body = array();

try {
    $response = $client->request('POST','/v1/arcuspay/deposit', array(
        'headers' => $headers,
        'json' => $request_body,
       )
    );
    print_r($response->getBody()->getContents());
 }
 catch (\GuzzleHttp\Exception\BadResponseException $e) {
    // handle exception or api errors.
    print_r($e->getMessage());
 }

 // ...

New Deposit

POST /v1/arcuspay/deposit

Arcus Digital Wallet realtime deposit endpoint

Deposit endpoint to be used to post funds into the end customer's account. The ArcusPay partner should return a 201 response within the defined timeout, where the deposit should have been authorized. The actual posting could occur later, if the internal operations are slower than the time needed within an API response.

QR Codes for Deposits

Partners that offer deposit functionalities are encouraged to facilitate to their customers a QR code in order to provide a consolidated, seamless end 2 end experience for their customers.

Deposit1

The end customer of the network participant can walk-in into any of the POS that are connected into Arcus, and by providing the QR code, they will be able to deposit the desired amount.

Payment Reference

Field Length Description
Prefix 5 Version of PAYMENT REFERENCE. Version AP001: Five numbers.
PayeeID 7 Unique identifier provided by Arcus to a PAYEE. If the id length is less than 7 characters, right justify the Biller ID and pad it with 0.
Account Reference 18 Account reference of PAYEE. it identifies an account or unique reference of the PAYEE. If the account length is less than 18 characters, right justify the Biller ID and pad it with 0
DV 2 The verification sum of the remaining of PAYMENT REFERENCE.

Body parameter

{
  "id": "56412",
  "account_reference": "000236541258745213",
  "amount": 10000,
  "amount_currency": "MXN",
  "payer_id": 711
}

Headers

Name Type Required Description
Idempotency-Key string (UUID v4) true Every API call will include a unique idempotency key. In order to avoid duplicate posting of funds and timeouts errors, if a subsequent API call is received with the same idempotentcy ID then the original response object should be returned.
Authorization string true Bearer "participant_rovided_token"
Accept string true Accepted value: 'application/json'
Content-Type string true Accepted value: 'application/json'

Body

Name Type Required Description
id string true Unique deposit identifier created by Arcus. It will follow the format of "ap_<string>"
account_reference string true Account reference (as provided by the payee) which will be used to reference the account into which funds will be deposited. This reference could be either the merchants internal account reference or the CLABE (Clave Bancaria Estandarizada, Spanish for "standardized banking cipher" or "standardized bank code"). The payment reference will be obtained from the payment reference originally generated by the payee for their clients to make payments (i.e. When Arcus receives a payment with arcus pay reference AP001004871200023654125874521311 Arcus will run the necessary validation and send the payee the following payment reference in the body request:000236541258745213).
amount integer true Amount of the deposit in local currency. In cents. (i.e. 100MXN will be represented as 10000)
amount_currency string true ISO4217 value of the currency used for the deposit. (i.e. MXN for Mexican Pesos)
payer_id integer true Reference of the payer that initiated the deposit transaction

Example responses

Succesful deposit

{
  "id": "ap_123441231",
  "account_reference": "000236541258745213",
  "payer_id": 711,
  "amount": 10000,
  "authorized": "2020-04-01T23:59:60Z",
  "verification_code": "dep_2223441"
}

Unprocessable deposit

{
  "code": "A001",
  "message": "ID already used"
}
{
  "code": "A010",
  "message": "Empty reference"
}
{
  "code": "A101",
  "message": "Maximum daily amount have been reached"
}
{
  "code": "A042",
  "message": "Invalid amount, maximum amount is XX"
}
{
  "code": "A041",
  "message": "Invalid amount, minimum amount is XX"
}
{
  "code": "A011",
  "message": "Invalid reference"
}

Responses

Status Meaning Description Schema
201 Created Succesful deposit Inline
401 Unathorized Entity Unathorized Inline
422 Unprocessable Entity Unprocessable deposit Inline

Response Schema

Status Code 201

The following fields id , account_reference, payer_id and amount will be the same parameters as provided in the original request. On the other hand, verification_code and authorized will be generated by the depositary institution or neoBank with the needed information.

Name Type Required Description
id string true Unique deposit identifier created by Arcus. It will follow the format of "ap_<string>"
account_reference string true Account reference (as provided by the payee) which will be used to deposit the funds. This reference could be either the payee's internal account reference or the CLABE (Clave Bancaria Estandarizada, Spanish for "standardized banking cipher" or "standardized bank code")
amount integer true Amount of the deposit in local currency. In cents. (i.e. 100MXN will be represented as 10000)
verification_code string true Verification code. Code generated by the depository institution as means to verify the deposit
payer_id integer true Reference of the payeer that initiated the deposit transaction
authorized string(date-time) true Timestamp when the deposit was authorized. RFC 3339 section 5.6.

Status Code 401

Name Type Required Description
message string true Descriptive message of the error cause (see examples)

Status Code 422

Name Type Required Description
code string true Code for the error type
message string true Descriptive message of the error cause (see examples)

Cash-Out API

Code samples

import requests
headers = {
  'Content-Type': 'application/json',
  'Accept': 'application/json',
  'Idempotency-Key': 'string'
  'Authorization' : 'Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c'
}

r = requests.post('/v1/arcuspay/cashout', headers = headers)

print(r.json())

require 'rest-client'
require 'json'

headers = {
  'Content-Type' => 'application/json',
  'Accept' => 'application/json',
  'Idempotency-Key' => 'string',
  'Authorization' => 'Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c'
}

result = RestClient.post '/v1/arcuspay/cashout',
  params: {
  }, headers: headers

p JSON.parse(result)

# You can also use wget
curl -X POST /v1/arcuspay/cashout \
  -H 'Content-Type: application/json' \
  -H 'Accept: application/json' \
  -H 'Idempotency-Key: string'\
  -H 'Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c'

const inputBody = '{
  "id": "ap_114441265464",
  "reference": "1234567890",
  "payer_id": 711,
  "amount": 10000
}';
const headers = {
  'Content-Type':'application/json',
  'Accept':'application/json',
  'Idempotency-Key':'string',
  'Authorization':'Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c'
};

fetch('/v1/arcuspay/cashout',
{
  method: 'POST',
  body: inputBody,
  headers: headers
})
.then(function(res) {
    return res.json();
}).then(function(body) {
    console.log(body);
});

URL obj = new URL("/v1/arcuspay/cashout");
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
con.setRequestMethod("POST");
int responseCode = con.getResponseCode();
BufferedReader in = new BufferedReader(
    new InputStreamReader(con.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
    response.append(inputLine);
}
in.close();
System.out.println(response.toString());

<?php

require 'vendor/autoload.php';

$headers = array(
    'Content-Type' => 'application/json',
    'Accept' => 'application/json',
    'Idempotency-Key' => 'string',
    'Authorization' => 'Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c'
);

$client = new \GuzzleHttp\Client();

// Define array of request body.
$request_body = array();

try {
    $response = $client->request('POST','/v1/arcuspay/cashout', array(
        'headers' => $headers,
        'json' => $request_body,
       )
    );
    print_r($response->getBody()->getContents());
 }
 catch (\GuzzleHttp\Exception\BadResponseException $e) {
    // handle exception or api errors.
    print_r($e->getMessage());
 }

 // ...

New Cash Out

POST /v1/arcuspay/cashout

Arcus Digital Wallet realtime Cash Out endpoint

Cash Out endpoint to be used to withdraw funds from the end customer's account. The ArcusPay partner should return a 201 response within the defined timeout, where the cash out transaction should have been authorized. The actual posting could occur later, if the internal operations are slower than the time needed within an API response.

QR Codes for Cash Out

Partners that offer cashout functionalities are encouraged to facilitate to their customers a QR code in order to provide a consolidated, seamless end 2 end experience for their customers.

Cashout1

The end customer of the network participant can walk-in into any of the POS that are connected into Arcus, and by providing the QR code, they will be able to cash-out the desired amount.

Body parameter

{
  "id": "ap_114441265464",
  "reference": "1234567890",
  "payer_id": 711,
  "amount": 10000
}

Headers

Name Type Required Description
Idempotency-Key string(uuid) true Every API call will include a unique idempotency key. In order to avoid duplicate posting of funds and timeouts errors, if a subsequent API call is received with the same idempotentcy ID then the original response object should be returned.
Authorization string true Bearer "participant_provided_token"
Accept string true Accepted value: 'application/json'
Content-Type string true Accepted value: 'application/json'

Body

Name Type Required Description
id string true Unique cash out identifier created by Arcus. It will follow the format of "ap_########" where # represents a digit 0-9
account_reference string true Account reference (originally generated by the participant) which will be used to reference the account into which funds will be cashouted. This reference could be either the merchants internal account reference or the CLABE (Clave Bancaria Estandarizada, Spanish for "standardized banking cipher" or "standardized bank code")
amount integer true Amount of the cash out in local currency. In cents. (i.e. 100MXN will be represented as 10000)
amount_currency string true ISO4217 value of the currency used for the cashout. (i.e. MXN for Mexican Pesos)
payer_id integer true Reference of the payer that initiated the cashout transaction request

Example responses

Succesful cash out

{
  "id": "ap_123441231",
  "account_reference": "000236541258745213",
  "payer_id": 711,
  "amount": 10000,
  "authorized": "2020-04-01T23:59:60Z",
  "verification_code": "CO_2223441"
}

Unprocessable cashout

{
  "code": "A001",
  "message": "ID already used"
}
{
  "code": "A010",
  "message": "Empty reference"
}
{
  "code": "A101",
  "message": "Maximum daily amount have been reached"
}
{
  "code": "A042",
  "message": "Invalid amount, maximum amount is XX"
}
{
  "code": "A041",
  "message": "Invalid amount, minimum amount is XX"
}
{
  "code": "A011",
  "message": "Invalid reference"
}

Responses

Status Meaning Description Schema
201 Created Succesful cashout Inline
401 Unathorized Entity Unathorized Inline
422 Unprocessable Entity Unprocessable cashout Inline

Response Schema

Status Code 201

The following fields id , account_reference, payer_id and amount will be the same parameters as provided in the original request. On the other hand, verification_code and authorized will be generated by the financial institution or neoBank with the needed information.

Name Type Required Description
id string true Unique cashout identifier created by Arcus. It will follow the format of "ap_"
account_reference string true Account reference (as provided by the payee) which will be used to cashout the funds. This reference could be either the payee's internal account reference or the CLABE (Clave Bancaria Estandarizada, Spanish for "standardized banking cipher" or "standardized bank code")
amount integer true Amount of the cashout in local currency. In cents. (i.e. 100MXN will be represented as 10000)
verification_code string true Verification code. Code generated by the financial institution as means to verify the cashout
payer_id integer true Reference of the payeer that initiated the cashout transaction
authorized string(date-time) true Timestamp when the cashout was authorized. RFC 3339 section 5.6.

Status Code 401

Name Type Required Description
message string true Descriptive message of the error cause (see examples)

Status Code 422

Name Type Required Description
code string true Code for the error type
message string true Descriptive message of the error cause (see examples)

Checkout API

Code samples

import requests
headers = {
  'Content-Type': 'application/json',
  'Accept': 'application/json',
  'Idempotency-Key': 'string'
  'Authorization' : 'Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c'
}

r = requests.post('/v1/arcuspay/checkout', headers = headers)

print(r.json())

require 'rest-client'
require 'json'

headers = {
  'Content-Type' => 'application/json',
  'Accept' => 'application/json',
  'Idempotency-Key' => 'string',
  'Authorization' => 'Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c'
}

result = RestClient.post '/v1/arcuspay/checkout',
  params: {
  }, headers: headers

p JSON.parse(result)

# You can also use wget
curl -X POST /v1/arcuspay/checkout \
  -H 'Content-Type: application/json' \
  -H 'Accept: application/json' \
  -H 'Idempotency-Key: string'\
  -H 'Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c'

const inputBody = '{
  "id": "ap_114441265464",
  "reference": "1234567890",
  "payer_id": 711,
  "amount": 10000
}';
const headers = {
  'Content-Type':'application/json',
  'Accept':'application/json',
  'Idempotency-Key':'string',
  'Authorization':'Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c'
};

fetch('/v1/arcuspay/checkout',
{
  method: 'POST',
  body: inputBody,
  headers: headers
})
.then(function(res) {
    return res.json();
}).then(function(body) {
    console.log(body);
});

URL obj = new URL("/v1/arcuspay/checkout");
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
con.setRequestMethod("POST");
int responseCode = con.getResponseCode();
BufferedReader in = new BufferedReader(
    new InputStreamReader(con.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
    response.append(inputLine);
}
in.close();
System.out.println(response.toString());

<?php

require 'vendor/autoload.php';

$headers = array(
    'Content-Type' => 'application/json',
    'Accept' => 'application/json',
    'Idempotency-Key' => 'string',
    'Authorization' => 'Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c'
);

$client = new \GuzzleHttp\Client();

// Define array of request body.
$request_body = array();

try {
    $response = $client->request('POST','/v1/arcuspay/checkout', array(
        'headers' => $headers,
        'json' => $request_body,
       )
    );
    print_r($response->getBody()->getContents());
 }
 catch (\GuzzleHttp\Exception\BadResponseException $e) {
    // handle exception or api errors.
    print_r($e->getMessage());
 }

 // ...

New checkout Payment

POST /v1/arcuspay/checkout

Arcus Digital Wallet realtime checkout endpoint

Checkout endpoint to be used for an eCommerce checkout. The use case intended for this endpoint will entitle an eCommerce like store where at the point of checkout an ArcusPay possibility will be given where via any usable method (QR Code, Bar Code or reference) the customer will be able to make a payment in any payer connected to the arcuspay network.

The ArcusPay partner should return a 201 response within the defined timeout where the payment should have been authorized. The actual posting could occur later, if the internal operations are slower than the time needed within an API response.

Body parameter

{
  "id": "ap_114441265464",
  "reference": "1234567890",
  "payer_id": 711,
  "amount": 10000
}

Headers

Name Type Required Description
Idempotency-Key string(uuid) true Every API call will include a unique idempotency key. In order to avoid duplicate posting of funds and timeouts errors, if a subsequent API call is received with the same idempotentcy ID then the original response object will be returned.
Authorization string true Bearer "participant_provided_token"
Accept string true Accepted value: 'application/json'
Content-Type string true Accepted value: 'application/json'

Body

Name Type Required Description
id string true Unique checkout identifier created by Arcus. It will follow the format of "ap_"
checkout_reference string true Checkout reference (as provided by the eCommerce payee) which will be used to reference the invoice into which funds will be used. This reference could be either the merchants internal account reference or the CLABE (Clave Bancaria Estandarizada, Spanish for "standardized banking cipher" or "standardized bank code")
amount integer true Amount of the checkout in local currency. In cents. (i.e. 100MXN will be represented as 10000)
amount_currency string true ISO4217 value of the currency used for the checkout. (i.e. MXN for Mexican Pesos)
payer_id integer true Reference of the payer that initiated the checkout transaction (i.e. 7eleven chain)

Example responses Succesful checkout payment

{
  "id": "ap_123441231",
  "account_reference": 1234567890,
  "payer_id": 711,
  "amount": 10000,
  "authorized": "2020-04-01T23:59:60Z",
  "verification_code": "co_2223441"
}

Unprocessable checkout payment

{
  "code": "A001",
  "message": "ID already used"
}
{
  "code": "A010",
  "message": "Empty reference"
}
{
  "code": "A101",
  "message": "Maximum daily amount have been reached"
}
{
  "code": "A042",
  "message": "Invalid amount, maximum amount is XX"
}
{
  "code": "A041",
  "message": "Invalid amount, minimum amount is XX"
}
{
  "code": "A011",
  "message": "Invalid reference"
}

Responses

Status Meaning Description Schema
201 Created Succesful checkout Inline
401 Unathorized Entity Unathorized Inline
422 Unprocessable Entity Unprocessable checkout Inline

Response Schema

Status Code 201

The following fields id , checkout_reference, payer_id and amount will be the same parameters as provided in the original request. On the other hand, verification_code and authorized will be generated by the Financial institution or neoBank with the needed information.

Name Type Required Description
id string true Unique checkout identifier created by Arcus. It will follow the format of "ap_"
checkout_reference string true Checkout reference (as provided by the eCommerce payee) which will be used to reference the invoice into which funds will be used. This reference could be either the merchants internal account reference or the CLABE (Clave Bancaria Estandarizada, Spanish for "standardized banking cipher" or "standardized bank code")
amount integer true Amount of the checkout in local currency. In cents. (i.e. 100MXN will be represented as 10000)
verification_code string true Verification code. Code generated by the eCommerce institution as means to verify the checkout
payer_id integer true Reference of the payeer that initiated the checkout transaction
authorized string(date-time) true Timestamp when the checkout payment was authorized. RFC 3339 section 5.6.

Status Code 401

Name Type Required Description
message string true Descriptive message of the error cause (see examples)

Status Code 422

Name Type Required Description
code string true Code for the error type
message string true Descriptive message of the error cause (see examples)

Checkout Payment Information

GET /v1/arcuspay/checkout/{checkout_reference}

Arcus Digital Wallet realtime checkout endpoint

This endpoint will be used to request the needed information about a specific checkout payment. The network participant will be expected to return the information described below.

Headers

Name Type Required Description
Authorization string true Bearer "participant_provided_token"
Accept string true Accepted value: 'application/json'
Content-Type string true Accepted value: 'application/json'

Parameters

Name Type Required Description
checkout_reference string true Checkout reference to be used to pull the information about the payment

Example responses Succesful GET checkout payment

{
  "checkout_date": "2020-08-01T23:59:60Z",
  "payment_due_date": "2020-08-05T23:59:60Z",
  "payment_status": "TO_BE_PAID",
  "checkout_reference": "2224441-12322",
  "amount": 10000,
  "amount_currency": "MXN"
}

Responses

Status Meaning Description Schema
200 OK Succesful checkout Inline
401 Unathorized Entity Unathorized Inline

Response Schema

Status Code 200

Name Type Required Description
checkout_date date true Date when the checkout was made
payment_due_date date true Due date by when the payment should have been done
payment_date date false Optional field that tracks when the payment was done
payment_status string true Status in which the checkout payment is currently. Possible statuses: [TO_BE_PAID, CANCELLED, EXPIRED, PAID]
checkout_reference string true Checkout reference (as provided by the eCommerce payee) which will be used to reference the invoice into which funds will be used. This reference could be either the merchants internal account reference or the CLABE (Clave Bancaria Estandarizada, Spanish for "standardized banking cipher" or "standardized bank code")
amount integer true Amount of the checkout in local currency. In cents. (i.e. 100MXN will be represented as 10000)
amount_currency string true ISO4217 value of the currency used for the checkout. (i.e. MXN for Mexican Pesos)

Status Code 401

Name Type Required Description
message string true Descriptive message of the error cause (see examples)

Bill Pay API

Code samples

import requests
headers = {
  'Content-Type': 'application/json',
  'Accept': 'application/json',
  'Idempotency-Key': 'string'
  'Authorization' : 'Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c'
}

r = requests.post('/v1/arcuspay/billpay', headers = headers)

print(r.json())

require 'rest-client'
require 'json'

headers = {
  'Content-Type' => 'application/json',
  'Accept' => 'application/json',
  'Idempotency-Key' => 'string',
  'Authorization' => 'Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c'
}

result = RestClient.post '/v1/arcuspay/billpay',
  params: {
  }, headers: headers

p JSON.parse(result)

# You can also use wget
curl -X POST /v1/arcuspay/billpay \
  -H 'Content-Type: application/json' \
  -H 'Accept: application/json' \
  -H 'Idempotency-Key: string'\
  -H 'Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c'

const inputBody = '{
  "id": "ap_114441265111",
  "reference": "1234567890",
  "payer_id": 711,
  "amount": 10000
}';
const headers = {
  'Content-Type':'application/json',
  'Accept':'application/json',
  'Idempotency-Key':'string',
  'Authorization':'Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c'
};

fetch('/v1/arcuspay/billpay',
{
  method: 'POST',
  body: inputBody,
  headers: headers
})
.then(function(res) {
    return res.json();
}).then(function(body) {
    console.log(body);
});

URL obj = new URL("/v1/arcuspay/billpay");
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
con.setRequestMethod("POST");
int responseCode = con.getResponseCode();
BufferedReader in = new BufferedReader(
    new InputStreamReader(con.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
    response.append(inputLine);
}
in.close();
System.out.println(response.toString());

<?php

require 'vendor/autoload.php';

$headers = array(
    'Content-Type' => 'application/json',
    'Accept' => 'application/json',
    'Idempotency-Key' => 'string',
    'Authorization' => 'Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c'
);

$client = new \GuzzleHttp\Client();

// Define array of request body.
$request_body = array();

try {
    $response = $client->request('POST','/v1/arcuspay/billpay', array(
        'headers' => $headers,
        'json' => $request_body,
       )
    );
    print_r($response->getBody()->getContents());
 }
 catch (\GuzzleHttp\Exception\BadResponseException $e) {
    // handle exception or api errors.
    print_r($e->getMessage());
 }

 // ...

New Bill Payment

POST /v1/arcuspay/billpay

Bill pay endpoint to be used by bill processing or service providing companies. Partners can join arcusPay network by utilizing this endpoint in order to be paid for their services.

The ArcusPay partner should return a 201 response within the defined timeout where the bill payment should have been authorized. The actual posting could occur later, if the internal operations are slower than the time needed within an API response.

Body parameter

{
  "id": "ap_114441265111",
  "reference": "1234567890",
  "payer_id": 711,
  "amount": 10000
}

Headers

Name Type Required Description
Idempotency-Key string(uuid) true Every API call will include a unique idempotency key. In order to avoid duplicate posting of funds and timeouts errors, if a subsequent API call is received with the same idempotentcy ID then the original response object will be returned.
Authorization string true Bearer "participant_provided_token"
Accept string true Accepted value: 'application/json'
Content-Type string true Accepted value: 'application/json'

Body

Name Type Required Description
id string true Unique billpay identifier created by Arcus. It will follow the format of "ap_#######"
billpay_reference string true billpay reference (as provided by the payee) which will be used to reference the bill. This reference could be either the billers' internal account reference or the CLABE (Clave Bancaria Estandarizada, Spanish for "standardized banking cipher" or "standardized bank code")
amount integer true Amount of the billpay in local currency. In cents. (i.e. 100MXN will be represented as 10000)
amount_currency string true ISO4217 value of the currency used for the billpay. (i.e. MXN for Mexican Pesos)
payer_id integer true Reference of the payer that initiated the billpay transaction (i.e. 7eleven chain)

Example responses Succesful bill payment

{
  "id": "ap_123441231",
  "account_reference": "000236541258745213",
  "payer_id": 711,
  "amount": 10000,
  "authorized": "2020-04-01T23:59:60Z",
  "verification_code": "co_2223441"
}

Unprocessable bill payment

{
  "code": "A001",
  "message": "ID already used"
}
{
  "code": "A010",
  "message": "Empty reference"
}
{
  "code": "A101",
  "message": "Maximum daily amount have been reached"
}
{
  "code": "A042",
  "message": "Invalid amount, maximum amount is XX"
}
{
  "code": "A041",
  "message": "Invalid amount, minimum amount is XX"
}
{
  "code": "A011",
  "message": "Invalid reference"
}

Responses

Status Meaning Description Schema
201 Created Succesful billpay Inline
401 Unathorized Entity Unathorized Inline
422 Unprocessable Entity Unprocessable bill payment Inline

Response Schema

Status Code 201

The following fields id , billpay_reference, payer_id and amount will be the same parameters as provided in the original request. On the other hand, verification_code and authorized will be generated by the Biller institution with the needed information.

Name Type Required Description
id string true Unique billpay identifier created by Arcus. It will follow the format of "ap_#######"
billpay_reference string true billpay reference (as provided by the payee) which will be used to reference the bill. This reference could be either the billers' internal account reference or the CLABE (Clave Bancaria Estandarizada, Spanish for "standardized banking cipher" or "standardized bank code")
amount integer true Amount of the billpay in local currency. In cents. (i.e. 100MXN will be represented as 10000)
verification_code string true Verification code. Code generated by the biller institution as means to verify the bill payment
payer_id integer true Reference of the payeer that initiated the bill payment transaction
authorized string(date-time) true Timestamp when the bill payment was authorized. RFC 3339 section 5.6.

Status Code 401

Name Type Required Description
message string true Descriptive message of the error cause (see examples)

Status Code 422

Name Type Required Description
code string true Code for the error type
message string true Descriptive message of the error cause (see examples)

Obtain Bill Information

GET /v1/arcuspay/billpay/{bill_reference}

This endpoint will be used to request the information about a specific bill payment. The response should include the latest available bill and a list of all the previous bills. The network participant will be expected to return the information described below.

Headers

Name Type Required Description
Authorization string true Bearer "participant_provided_token"
Accept string true Accepted value: 'application/json'
Content-Type string true Accepted value: 'application/json'

Parameters

Name Type Required Description
billpay_reference string true Bill reference to be used to pull the information about the payment

Example responses Succesful GET bill pay data

{
  "payment_due_date": "2020-08-05T23:59:60Z",
  "payment_status": "TO_BE_PAID",
  "billpay_reference": "4-421-2442--12322",
  "amount_due": 10000,
  "amount_currency": "MXN"
}

Responses

Status Meaning Description Schema
200 OK Succesful Bill Pay data Inline
401 Unathorized Entity Unathorized Inline

Response Schema

Status Code 200

Name Type Required Description
payment_due_date date true Due date by when the payment should have been done
payment_date date false Optional field that tracks when the payment was done
payment_status string true Status in which the bill pay payment is currently. Possible statuses: [TO_BE_PAID, CANCELLED, EXPIRED, PAID]
billpay_reference string true Billpay reference (as provided by the Biller payee) which will be used to reference the bill into which funds will be used. This reference could be either the merchants internal account reference or the CLABE (Clave Bancaria Estandarizada, Spanish for "standardized banking cipher" or "standardized bank code")
amount_due integer true Amount of the bill pay in local currency. In cents. (i.e. 100MXN will be represented as 10000)
amount_currency string true ISO4217 value of the currency used for the bill pay. (i.e. MXN for Mexican Pesos)
pdf_bill base64 false base64 formatted PDF document with the branded bill to the customer
previous_bills list true A list of all the previous bills that were processed for this client with the same format that the rest of the items

Status Code 401

Name Type Required Description
message string true Descriptive message of the error cause (see examples)

Errors

The ArcusPay API uses the following error codes:

Code Http Code Message
A021 201 Succesful transaction
A020 200 Successful authentication
A001 422 Invalid account number
A003 422 Invalid deposit amount
A004 422 Invalid token
A005 422 Account number does not resolve with payee
A006 422 Invalid prefix
A007 422 Deposits with this payee are currently unavailable
A008 422 Payee maintenance in progress, please try again later
A009 422 The biller returned an error. Please check the account number
A010 422 Unexpected error (everything entered was correct)
A011 422 ID already used
A012 422 Invalid or missing parameters
A013 422 Maximum daily amount have been reached
A014 422 Invalid amount, minimum amount is XX
A015 422 Invalid amount, maximum amount is XX
A016 422 Token expired
A017 422 Configuration issue between us and our payee
A018 422 Error decrypting token
A019 422 Invalid check digit
A041 401 Invalid credentials
A046 406 There was an error in the parameters
A044 404 The request resource doesn't exist
A043 403 No permisions to perform the request
A048 408 Timeout
A099 422 General fallback error