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
z 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
diff --git a/assets/images/search.svg b/assets/images/search.svg
deleted file mode 100644
index 421ca4df0..000000000
--- a/assets/images/search.svg
+++ /dev/null
@@ -1 +0,0 @@
-Search
diff --git a/assets/js/just-the-docs.js b/assets/js/just-the-docs.js
deleted file mode 100644
index 1f8f2cf98..000000000
--- a/assets/js/just-the-docs.js
+++ /dev/null
@@ -1,454 +0,0 @@
-(function (jtd, undefined) {
-
-// Event handling
-
-jtd.addEvent = function(el, type, handler) {
- if (el.attachEvent) el.attachEvent('on'+type, handler); else el.addEventListener(type, handler);
-}
-jtd.removeEvent = function(el, type, handler) {
- if (el.detachEvent) el.detachEvent('on'+type, handler); else el.removeEventListener(type, handler);
-}
-jtd.onReady = function(ready) {
- // in case the document is already rendered
- if (document.readyState!='loading') ready();
- // modern browsers
- else if (document.addEventListener) document.addEventListener('DOMContentLoaded', ready);
- // IE <= 8
- else document.attachEvent('onreadystatechange', function(){
- if (document.readyState=='complete') ready();
- });
-}
-
-// Show/hide mobile menu
-
-function initNav() {
- jtd.addEvent(document, 'click', function(e){
- var target = e.target;
- while (target && !(target.classList && target.classList.contains('nav-list-expander'))) {
- target = target.parentNode;
- }
- if (target) {
- e.preventDefault();
- target.parentNode.classList.toggle('active');
- }
- });
-
- const siteNav = document.getElementById('site-nav');
- const mainHeader = document.getElementById('main-header');
- const menuButton = document.getElementById('menu-button');
-
- jtd.addEvent(menuButton, 'click', function(e){
- e.preventDefault();
-
- if (menuButton.classList.toggle('nav-open')) {
- siteNav.classList.add('nav-open');
- mainHeader.classList.add('nav-open');
- } else {
- siteNav.classList.remove('nav-open');
- mainHeader.classList.remove('nav-open');
- }
- });
- const searchInput = document.getElementById('search-input');
- const searchButton = document.getElementById('search-button');
-
- jtd.addEvent(searchButton, 'click', function(e){
- e.preventDefault();
-
- mainHeader.classList.add('nav-open');
- searchInput.focus();
- });
-}
-// Site search
-
-function initSearch() {
- var request = new XMLHttpRequest();
- request.open('GET', '/assets/js/search-data.json', true);
-
- request.onload = function(){
- if (request.status >= 200 && request.status < 400) {
- var docs = JSON.parse(request.responseText);
-
- lunr.tokenizer.separator = /[\s\-/]+/
-
- var index = lunr(function(){
- this.ref('id');
- this.field('title', { boost: 200 });
- this.field('content', { boost: 2 });
- this.field('relUrl');
- this.metadataWhitelist = ['position']
-
- for (var i in docs) {
- this.add({
- id: i,
- title: docs[i].title,
- content: docs[i].content,
- relUrl: docs[i].relUrl
- });
- }
- });
-
- searchLoaded(index, docs);
- } else {
- console.log('Error loading ajax request. Request status:' + request.status);
- }
- };
-
- request.onerror = function(){
- console.log('There was a connection error');
- };
-
- request.send();
-}
-
-function searchLoaded(index, docs) {
- var index = index;
- var docs = docs;
- var searchInput = document.getElementById('search-input');
- var searchResults = document.getElementById('search-results');
- var mainHeader = document.getElementById('main-header');
- var currentInput;
- var currentSearchIndex = 0;
-
- function showSearch() {
- document.documentElement.classList.add('search-active');
- }
-
- function hideSearch() {
- document.documentElement.classList.remove('search-active');
- }
-
- function update() {
- currentSearchIndex++;
-
- var input = searchInput.value;
- if (input === '') {
- hideSearch();
- } else {
- showSearch();
- // scroll search input into view, workaround for iOS Safari
- window.scroll(0, -1);
- setTimeout(function(){ window.scroll(0, 0); }, 0);
- }
- if (input === currentInput) {
- return;
- }
- currentInput = input;
- searchResults.innerHTML = '';
- if (input === '') {
- return;
- }
-
- var results = index.query(function (query) {
- var tokens = lunr.tokenizer(input)
- query.term(tokens, {
- boost: 10
- });
- query.term(tokens, {
- wildcard: lunr.Query.wildcard.TRAILING
- });
- });
-
- if ((results.length == 0) && (input.length > 2)) {
- var tokens = lunr.tokenizer(input).filter(function(token, i) {
- return token.str.length < 20;
- })
- if (tokens.length > 0) {
- results = index.query(function (query) {
- query.term(tokens, {
- editDistance: Math.round(Math.sqrt(input.length / 2 - 1))
- });
- });
- }
- }
-
- if (results.length == 0) {
- var noResultsDiv = document.createElement('div');
- noResultsDiv.classList.add('search-no-result');
- noResultsDiv.innerText = 'No results found';
- searchResults.appendChild(noResultsDiv);
-
- } else {
- var resultsList = document.createElement('ul');
- resultsList.classList.add('search-results-list');
- searchResults.appendChild(resultsList);
-
- addResults(resultsList, results, 0, 10, 100, currentSearchIndex);
- }
-
- function addResults(resultsList, results, start, batchSize, batchMillis, searchIndex) {
- if (searchIndex != currentSearchIndex) {
- return;
- }
- for (var i = start; i < (start + batchSize); i++) {
- if (i == results.length) {
- return;
- }
- addResult(resultsList, results[i]);
- }
- setTimeout(function() {
- addResults(resultsList, results, start + batchSize, batchSize, batchMillis, searchIndex);
- }, batchMillis);
- }
-
- function addResult(resultsList, result) {
- var doc = docs[result.ref];
-
- var resultsListItem = document.createElement('li');
- resultsListItem.classList.add('search-results-list-item');
- resultsList.appendChild(resultsListItem);
-
- var resultLink = document.createElement('a');
- resultLink.classList.add('search-result');
- resultLink.setAttribute('href', doc.url);
- resultsListItem.appendChild(resultLink);
-
- var resultTitle = document.createElement('div');
- resultTitle.classList.add('search-result-title');
- resultLink.appendChild(resultTitle);
-
- var resultDoc = document.createElement('div');
- resultDoc.classList.add('search-result-doc');
- resultDoc.innerHTML = ' ';
- resultTitle.appendChild(resultDoc);
-
- var resultDocTitle = document.createElement('div');
- resultDocTitle.classList.add('search-result-doc-title');
- resultDocTitle.innerHTML = doc.doc;
- resultDoc.appendChild(resultDocTitle);
- var resultDocOrSection = resultDocTitle;
-
- if (doc.doc != doc.title) {
- resultDoc.classList.add('search-result-doc-parent');
- var resultSection = document.createElement('div');
- resultSection.classList.add('search-result-section');
- resultSection.innerHTML = doc.title;
- resultTitle.appendChild(resultSection);
- resultDocOrSection = resultSection;
- }
-
- var metadata = result.matchData.metadata;
- var titlePositions = [];
- var contentPositions = [];
- for (var j in metadata) {
- var meta = metadata[j];
- if (meta.title) {
- var positions = meta.title.position;
- for (var k in positions) {
- titlePositions.push(positions[k]);
- }
- }
- if (meta.content) {
- var positions = meta.content.position;
- for (var k in positions) {
- var position = positions[k];
- var previewStart = position[0];
- var previewEnd = position[0] + position[1];
- var ellipsesBefore = true;
- var ellipsesAfter = true;
- for (var k = 0; k < 5; k++) {
- var nextSpace = doc.content.lastIndexOf(' ', previewStart - 2);
- var nextDot = doc.content.lastIndexOf('. ', previewStart - 2);
- if ((nextDot >= 0) && (nextDot > nextSpace)) {
- previewStart = nextDot + 1;
- ellipsesBefore = false;
- break;
- }
- if (nextSpace < 0) {
- previewStart = 0;
- ellipsesBefore = false;
- break;
- }
- previewStart = nextSpace + 1;
- }
- for (var k = 0; k < 10; k++) {
- var nextSpace = doc.content.indexOf(' ', previewEnd + 1);
- var nextDot = doc.content.indexOf('. ', previewEnd + 1);
- if ((nextDot >= 0) && (nextDot < nextSpace)) {
- previewEnd = nextDot;
- ellipsesAfter = false;
- break;
- }
- if (nextSpace < 0) {
- previewEnd = doc.content.length;
- ellipsesAfter = false;
- break;
- }
- previewEnd = nextSpace;
- }
- contentPositions.push({
- highlight: position,
- previewStart: previewStart, previewEnd: previewEnd,
- ellipsesBefore: ellipsesBefore, ellipsesAfter: ellipsesAfter
- });
- }
- }
- }
-
- if (titlePositions.length > 0) {
- titlePositions.sort(function(p1, p2){ return p1[0] - p2[0] });
- resultDocOrSection.innerHTML = '';
- addHighlightedText(resultDocOrSection, doc.title, 0, doc.title.length, titlePositions);
- }
-
- if (contentPositions.length > 0) {
- contentPositions.sort(function(p1, p2){ return p1.highlight[0] - p2.highlight[0] });
- var contentPosition = contentPositions[0];
- var previewPosition = {
- highlight: [contentPosition.highlight],
- previewStart: contentPosition.previewStart, previewEnd: contentPosition.previewEnd,
- ellipsesBefore: contentPosition.ellipsesBefore, ellipsesAfter: contentPosition.ellipsesAfter
- };
- var previewPositions = [previewPosition];
- for (var j = 1; j < contentPositions.length; j++) {
- contentPosition = contentPositions[j];
- if (previewPosition.previewEnd < contentPosition.previewStart) {
- previewPosition = {
- highlight: [contentPosition.highlight],
- previewStart: contentPosition.previewStart, previewEnd: contentPosition.previewEnd,
- ellipsesBefore: contentPosition.ellipsesBefore, ellipsesAfter: contentPosition.ellipsesAfter
- }
- previewPositions.push(previewPosition);
- } else {
- previewPosition.highlight.push(contentPosition.highlight);
- previewPosition.previewEnd = contentPosition.previewEnd;
- previewPosition.ellipsesAfter = contentPosition.ellipsesAfter;
- }
- }
-
- var resultPreviews = document.createElement('div');
- resultPreviews.classList.add('search-result-previews');
- resultLink.appendChild(resultPreviews);
-
- var content = doc.content;
- for (var j = 0; j < Math.min(previewPositions.length, 3); j++) {
- var position = previewPositions[j];
-
- var resultPreview = document.createElement('div');
- resultPreview.classList.add('search-result-preview');
- resultPreviews.appendChild(resultPreview);
-
- if (position.ellipsesBefore) {
- resultPreview.appendChild(document.createTextNode('... '));
- }
- addHighlightedText(resultPreview, content, position.previewStart, position.previewEnd, position.highlight);
- if (position.ellipsesAfter) {
- resultPreview.appendChild(document.createTextNode(' ...'));
- }
- }
- }
- var resultRelUrl = document.createElement('span');
- resultRelUrl.classList.add('search-result-rel-url');
- resultRelUrl.innerText = doc.relUrl;
- resultTitle.appendChild(resultRelUrl);
- }
-
- function addHighlightedText(parent, text, start, end, positions) {
- var index = start;
- for (var i in positions) {
- var position = positions[i];
- var span = document.createElement('span');
- span.innerHTML = text.substring(index, position[0]);
- parent.appendChild(span);
- index = position[0] + position[1];
- var highlight = document.createElement('span');
- highlight.classList.add('search-result-highlight');
- highlight.innerHTML = text.substring(position[0], index);
- parent.appendChild(highlight);
- }
- var span = document.createElement('span');
- span.innerHTML = text.substring(index, end);
- parent.appendChild(span);
- }
- }
-
- jtd.addEvent(searchInput, 'focus', function(){
- setTimeout(update, 0);
- });
-
- jtd.addEvent(searchInput, 'keyup', function(e){
- switch (e.keyCode) {
- case 27: // When esc key is pressed, hide the results and clear the field
- searchInput.value = '';
- break;
- case 38: // arrow up
- case 40: // arrow down
- case 13: // enter
- e.preventDefault();
- return;
- }
- update();
- });
-
- jtd.addEvent(searchInput, 'keydown', function(e){
- switch (e.keyCode) {
- case 38: // arrow up
- e.preventDefault();
- var active = document.querySelector('.search-result.active');
- if (active) {
- active.classList.remove('active');
- if (active.parentElement.previousSibling) {
- var previous = active.parentElement.previousSibling.querySelector('.search-result');
- previous.classList.add('active');
- }
- }
- return;
- case 40: // arrow down
- e.preventDefault();
- var active = document.querySelector('.search-result.active');
- if (active) {
- if (active.parentElement.nextSibling) {
- var next = active.parentElement.nextSibling.querySelector('.search-result');
- active.classList.remove('active');
- next.classList.add('active');
- }
- } else {
- var next = document.querySelector('.search-result');
- if (next) {
- next.classList.add('active');
- }
- }
- return;
- case 13: // enter
- e.preventDefault();
- var active = document.querySelector('.search-result.active');
- if (active) {
- active.click();
- } else {
- var first = document.querySelector('.search-result');
- if (first) {
- first.click();
- }
- }
- return;
- }
- });
-
- jtd.addEvent(document, 'click', function(e){
- if (e.target != searchInput) {
- hideSearch();
- }
- });
-}
-
-// Switch theme
-
-jtd.getTheme = function() {
- var cssFileHref = document.querySelector('[rel="stylesheet"]').getAttribute('href');
- return cssFileHref.substring(cssFileHref.lastIndexOf('-') + 1, cssFileHref.length - 4);
-}
-
-jtd.setTheme = function(theme) {
- var cssFile = document.querySelector('[rel="stylesheet"]');
- cssFile.setAttribute('href', '/assets/css/just-the-docs-' + theme + '.css');
-}
-
-// Document ready
-
-jtd.onReady(function(){
- initNav();
- initSearch();
-});
-
-})(window.jtd = window.jtd || {});
-
-
diff --git a/assets/js/search-data.json b/assets/js/search-data.json
deleted file mode 100644
index ec851d08f..000000000
--- a/assets/js/search-data.json
+++ /dev/null
@@ -1,1028 +0,0 @@
-{"0": {
- "doc": "Account Memberships",
- "title": "Account Memberships",
- "content": "An Account Membership represents a user having access to a Centrapay Account. An Account Membership has a role which grants the user access to some or all of the operations and resources within the account. ",
- "url": "/api/account-memberships",
- "relUrl": "/api/account-memberships"
- },"1": {
- "doc": "Account Memberships",
- "title": "Contents",
- "content": ". | Models . | Account Member | . | Operations . | Add Member EXPERIMENTAL | List Members | Revoke Member | List Account Memberships for authenticated subject | List Account Memberships for specific user | . | . ",
- "url": "/api/account-memberships#contents",
- "relUrl": "/api/account-memberships#contents"
- },"2": {
- "doc": "Account Memberships",
- "title": "Models",
- "content": "Account Member . A Member contains extended information about an user’s access to an account. Required Fields . | Field | Type | Description | . | accountId | String | The id of the Account the Membership is scoped to. | . | accountType | String | The type of the Account the Membership is scoped to. | . | accountName | String | The name of the Account the Membership is scoped to. | . | userId | String | The id of the user the Membership belongs to. | . | role | String | The role governing Membership permissions. | . Optional Fields . | Field | Type | Description | . | subject | CRN | User or API key resource name for the membership. | . | createdAt | Timestamp | When the Membership was created. | . | createdBy | CRN | Resource that created the member. | . | modifiedAt | Timestamp | When the Membership was last modified. | . | modifiedBy | CRN | Resource that last modified the account member. | . | testAccount | Boolean | A flag which is present if the Account is test | . | firstName | String | First name of the user the membership belongs to. | . | lastName | String | Last name of the user the membership belongs to. | . | email | String | Email of the user the membership belongs to. | . ",
- "url": "/api/account-memberships#models",
- "relUrl": "/api/account-memberships#models"
- },"3": {
- "doc": "Account Memberships",
- "title": "Operations",
- "content": "Add Member EXPERIMENTAL . POST /api/accounts/{accountId}/members . curl -X POST https://service.centrapay.com/api/accounts/Jaim1Cu1Q55uooxSens6yk/members \\ -H \"X-Api-Key: $api_key\" \\ -H \"Content-Type: application/json\" \\ -d '{ \"userId\": \"da75ad90-9a5b-4df0-8374-f48b3a8fbfcc\", \"role\": \"account-owner\" }' . Example response payload . { \"accountId\": \"Jaim1Cu1Q55uooxSens6yk\", \"accountType\": \"org\", \"userId\": \"da75ad90-9a5b-4df0-8374-f48b3a8fbfcc\", \"role\": \"account-owner\", \"createdBy\": \"crn:WIj211vFs9cNACwBb04vQw:api-key:MyApiKey\", \"createdAt\": \"2020-06-12T01:17:46.499Z\", \"modifiedAt\": \"2020-06-12T01:17:46.499Z\", \"modifiedBy\": \"crn:WIj211vFs9cNACwBb04vQw:api-key:MyApiKey\" } . List Members . GET /api/accounts/{accountId}/members . curl https://service.centrapay.com/api/accounts/Jaim1Cu1Q55uooxSens6yk/members \\ -H \"X-Api-Key: $api_key\" . Example response payload . [ { \"accountName\": \"Centrapay Cafe\", \"accountType\": \"org\", \"accountId\": \"Jaim1Cu1Q55uooxSens6yk\", \"userId\": \"b657195e-dc2f-11ea-8566-e7710d592c99\", \"createdAt\": \"2020-06-01T21:57:25.888Z\", \"role\": \"account-owner\", \"firstName\": \"John\", \"lastName\": \"Doe\", \"email\": \"john.doe@centrapay.com\" }, { \"accountName\": \"Centrapay Tea Warehouse\", \"accountType\": \"org\", \"accountId\": \"0f9nvqdcn5eaaDLefkg1Xt\", \"userId\": \"9f4b3bae-dc30-11ea-ab70-2743d9be3dd5\", \"createdAt\": \"2020-06-02T10:l4:33.021Z\", \"role\": \"account-owner\", \"firstName\": \"Jane\", \"lastName\": \"Doe\", \"email\": \"jane.doe@centrapay.com\" } ] . Revoke Member . DELETE /api/accounts/{accountId}/members/{userId} . curl -X DELETE https://service.centrapay.com/api/accounts/Jaim1Cu1Q55uooxSens6yk/members/45dwes-rf4h55-tyf45s-6st4gd \\ -H \"X-Api-Key: $api_key\" . Error Responses . | Status | Code | Description | . | 403 | LAST_OWNER_NOT_REVOKABLE | The last remaining membership to an account cannot be revoked. | . List Account Memberships for authenticated subject . GET /api/account-memberships . curl https://service.centrapay.com/api/account-memberships \\ -H \"X-Api-Key: $api_key\" . Example response payload . [ { \"accountName\": \"Centrapay Tea Warehouse\", \"accountId\": \"5uooxSens6ykJaim1Cu1Q5\", \"accountType\": \"org\", \"role\": \"account-owner\" } ] . List Account Memberships for specific user . GET /api/users/{userId}/account-memberships . curl https://service.centrapay.com/api/users/1234/account-memberships \\ -H \"X-Api-Key: $api_key\" . Example response payload . [ { \"accountName\": \"Centrapay Cafe\", \"accountId\": \"Jaim1Cu1Q55uooxSens6yk\", \"accountType\": \"org\", \"role\": \"account-owner\" }, { \"accountName\": \"Centrapay Tea Warehouse\", \"accountId\": \"5uooxSens6ykJaim1Cu1Q5\", \"accountType\": \"org\", \"role\": \"account-owner\" } ] . ",
- "url": "/api/account-memberships#operations",
- "relUrl": "/api/account-memberships#operations"
- },"4": {
- "doc": "Accounts",
- "title": "Accounts",
- "content": "An Account represents a permission boundary around Centrapay resources. Accounts can have API Keys and Account Memberships which grant access to the resources. Accounts are classified as either “individual” or “org”. Individual accounts can only have a single member and Centrapay users can only be a member of a single individual account. ",
- "url": "/api/accounts",
- "relUrl": "/api/accounts"
- },"5": {
- "doc": "Accounts",
- "title": "Contents",
- "content": ". | Models . | Account | Subscription | . | Operations . | Create an Account | Get an Account | Update an Account | Update Subscriptions | . | . ",
- "url": "/api/accounts#contents",
- "relUrl": "/api/accounts#contents"
- },"6": {
- "doc": "Accounts",
- "title": "Models",
- "content": "Account . | Field | Type | Description | . | id | String | The unique identifier. | . | type | String | Account type, must be either ‘org’ or ‘individual’. | . | name | String | The display name of the Account. | . | region | String | The region that the Account will operate in. Only defined for ‘org’ Accounts. | . | test | Boolean | A flag which is only present if the Account is for testing. | . | createdAt | Timestamp | When the Account was created. | . | modifiedAt | Timestamp | When the Account was updated. | . | createdBy | CRN | The User or API Key that created the Account. | . | modifiedBy | CRN | The User or API Key that updated the Account. | . | subscriptions | Array | A list of Subscriptions on the Account. | . Subscription . | Field | Type | Description | . | name | String | The name of the Subscription. | . ",
- "url": "/api/accounts#models",
- "relUrl": "/api/accounts#models"
- },"7": {
- "doc": "Accounts",
- "title": "Operations",
- "content": "Create an Account . POST /api/accounts . curl -X POST https://service.centrapay.com/api/accounts \\ -H \"X-Api-Key: $api_key\" \\ -H \"Content-Type: application/json\" \\ -d '{ \"name\": \"Centrapay Cafe\", \"type\": \"org\" }' . Required Fields . | Field | Type | Description | . | name | String | The name of the Account. | . | type | String | Account type, must be either “org” or “individual”. | . Optional Fields . | Field | Type | Description | . | owner | String | Id of user to add as member with “account-owner” role. | . | test | Boolean | A flag indicating if the Account is for testing. | . | region | String | The region that the Account will operate in. Required for ‘org’ Accounts, not allowed for ‘individual’ Accounts. Can be “NZ”, “AU”, or “US”. | . Example response payload . { \"id\": \"Jaim1Cu1Q55uooxSens6yk\", \"name\": \"Centrapay Cafe\", \"type\": \"org\", \"region\": \"NZ\", \"createdBy\": \"crn:WIj211vFs9cNACwBb04vQw:api-key:MyApiKey\", \"createdAt\": \"2020-06-12T01:17:46.499Z\", \"modifiedAt\": \"2020-06-12T01:17:46.499Z\", \"modifiedBy\": \"crn:WIj211vFs9cNACwBb04vQw:api-key:MyApiKey\", \"version\": \"1\", \"subscriptions\": [ ] } . Get an Account . GET /api/accounts/{accountId} . curl https://service.centrapay.com/api/accounts/Jaim1Cu1Q55uooxSens6yk \\ -H \"X-Api-Key: $api_key\" . Example response payload . { \"id\": \"Jaim1Cu1Q55uooxSens6yk\", \"name\": \"Centrapay Cafe\", \"type\": \"org\", \"region\": \"NZ\", \"createdBy\": \"crn:WIj211vFs9cNACwBb04vQw:api-key:MyApiKey\", \"createdAt\": \"2020-06-12T01:17:46.499Z\", \"modifiedAt\": \"2020-06-12T01:17:46.499Z\", \"modifiedBy\": \"crn:WIj211vFs9cNACwBb04vQw:api-key:MyApiKey\", \"version\": \"1\", \"subscriptions\": [ ] } . Update an Account . PUT /api/accounts/{accountId} . curl -X PUT https://service.centrapay.com/api/accounts/Jaim1Cu1Q55uooxSens6yk \\ -H \"X-Api-Key: $api_key\" \\ -H \"Content-Type: application/json\" \\ -d '{ \"name\": \"Shortland St Cafe\" }' . Required Fields . | Field | Type | Description | . | name | String | The name of the account | . Example response payload . { \"id\": \"Jaim1Cu1Q55uooxSens6yk\", \"name\": \"Shortland St Cafe\", \"type\": \"org\", \"region\": \"NZ\", \"createdBy\": \"crn:WIj211vFs9cNACwBb04vQw:api-key:MyApiKey\", \"createdAt\": \"2020-06-12T01:17:46.499Z\", \"modifiedAt\": \"2020-06-12T02:35:12.112Z\", \"modifiedBy\": \"crn:WIj211vFs9cNACwBb04vQw:api-key:MyApiKey\", \"version\": \"2\", \"subscriptions\": [ ] } . Update Subscriptions . PUT /api/accounts/{accountId}/subscriptions . curl -X PUT https://service.centrapay.com/api/accounts/Jaim1Cu1Q55uooxSens6yk/subscriptions \\ -H \"X-Api-Key: $api_key\" \\ -H \"Content-Type: application/json\" \\ -d '{ \"subscriptions\": [ \"quartz\" ] }' . Required Fields . | Field | Type | Description | . | subscriptions | Array | The list of subscriptions to assign to the account. | . Example response payload . { \"subscriptions\": [ \"quartz\" ] } . Error Responses . | Status | Code | Description | . | 403 | INVALID_ACCOUNT_ID | The account does not exist. | . | 403 | INVALID_SUBSCRIPTION | One of the subscriptions in the list is not valid. | . ",
- "url": "/api/accounts#operations",
- "relUrl": "/api/accounts#operations"
- },"8": {
- "doc": "API Keys",
- "title": "API Keys",
- "content": "API keys provide enduring access to a single Centrapay Account. ",
- "url": "/api/api-keys",
- "relUrl": "/api/api-keys"
- },"9": {
- "doc": "API Keys",
- "title": "Contents",
- "content": ". | Models . | API Key | . | Operations . | Create an API Key | List API Keys | Update an API Key | . | . ",
- "url": "/api/api-keys#contents",
- "relUrl": "/api/api-keys#contents"
- },"10": {
- "doc": "API Keys",
- "title": "Models",
- "content": "API Key . Mandatory Fields . | Field | Type | Description | . | accountId | String | The id of the Centrapay Account the API Key is scoped to. | . | name | String | The alphanumeric name of the API key, must be unique within the account. | . | role | String | Supported roles are: “account-owner” and “merchant-terminal”. See Auth Permissions for role details. | . | enabled | Boolean | Flag indicating the API Key is usable for authentication. | . | createdAt | Timestamp | When the API Key was created. | . Roles and Permissions . ",
- "url": "/api/api-keys#models",
- "relUrl": "/api/api-keys#models"
- },"11": {
- "doc": "API Keys",
- "title": "Operations",
- "content": ". Create an API Key . POST /api/accounts/{accountId}/api-keys . curl -X POST https://service.centrapay.com/api/accounts/Jaim1Cu1Q55uooxSens6yk/api-keys \\ -H \"X-Api-Key: $api_key\" \\ -H \"Content-Type: application/json\" \\ -d '{ \"name\": \"MyAPIkey\", \"role\": \"merchant-terminal\" }' . Example response payload . { \"name\": \"MyAPIkey\", \"createdAt\": \"2020-06-01T22:32:56.631Z\", \"enabled\": true, \"role\": \"merchant-terminal\", \"accountId\": \"Jaim1Cu1Q55uooxSens6yk\", \"secret\": \"EoaEL7skkedBBy9MzrBSyxG95vUAKjYkiFvWEfiAx\" } . List API Keys . GET /api/accounts/{accountId}/api-keys . curl https://service.centrapay.com/api/accounts/Jaim1Cu1Q55uooxSens6yk/api-keys \\ -H \"X-Api-Key: $api_key\" . Example response payload . [ { \"accountId\": \"Jaim1Cu1Q55uooxSens6yk\", \"name\": \"MyOtherAPIkey\", \"createdAt\": \"2020-06-01T21:57:25.888Z\", \"enabled\": false, \"role\": \"merchant-terminal\" }, { \"accountId\": \"Jaim1Cu1Q55uooxSens6yk\", \"name\": \"MyAPIkey\", \"createdAt\": \"2020-06-01T22:34:31.308Z\", \"enabled\": true, \"role\": \"merchant-terminal\" } ] . Update an API Key . PUT /api/accounts/{accountId}/api-keys/{apiKeyName} . curl -X PUT https://service.centrapay.com/api/accounts/Jaim1Cu1Q55uooxSens6yk/api-keys/MyAPIkey \\ -H \"X-Api-Key: $api_key\" \\ -H \"Content-Type: application/json\" \\ -d '{ \"enabled\": false }' . Required Fields . | Field | Type | Description | . | enabled | Boolean | Enable/Disable API key | . Example response payload . { \"accountId\": \"Jaim1Cu1Q55uooxSens6yk\", \"name\": \"MyAPIkey\", \"createdAt\": \"2020-06-01T22:34:31.308Z\", \"enabled\": false, \"role\": \"merchant-terminal\" } . ",
- "url": "/api/api-keys#operations",
- "relUrl": "/api/api-keys#operations"
- },"12": {
- "doc": "Asset Transfers",
- "title": "Asset Transfers",
- "content": "An asset transfer is an asynchronous exchange of an asset or an amount to a recipient. A recipient is an existing Centrapay user or someone who can create an account to claim the asset transfer by verifying their phone number. After an asset transfer is completed the recipientAlias, lastSentTo and message fields are scrubbed to avoid storing PII. ",
- "url": "/api/asset-transfers",
- "relUrl": "/api/asset-transfers"
- },"13": {
- "doc": "Asset Transfers",
- "title": "Contents",
- "content": ". | Asset Transfer lifecycle | Create an Asset Transfer | Get an Asset Transfer | Get an Asset Transfer Summary | Resolve claimable assets EXPERIMENTAL | List Asset Transfers EXPERIMENTAL | . ",
- "url": "/api/asset-transfers#contents",
- "relUrl": "/api/asset-transfers#contents"
- },"14": {
- "doc": "Asset Transfers",
- "title": "Asset Transfer lifecycle",
- "content": "Asset Transfer goes through different lifecycle stages. | State | Description | . | created | Asset transfer successfully created | . | sent | Asset transfer notification (sms, email) was sent to a new user | . | expired | Asset transfer expired as new user didn’t create his account and claimed the asset. This is very short lived state | . | returned | Asset transfer expired and was returned to original owner | . | claimed | Asset transfer was successfully completed | . ",
- "url": "/api/asset-transfers#asset-transfer-lifecycle",
- "relUrl": "/api/asset-transfers#asset-transfer-lifecycle"
- },"15": {
- "doc": "Asset Transfers",
- "title": "Create an Asset Transfer",
- "content": "Transfer an asset to a recipient. Some assets can be transfered only in whole (eg giftcards or tokens) while others can be transfered only in part (eg money). Some assets can be transferred without supplying a recipient. A url field will be returned in these cases. The url will link to a page to claim the asset. POST /api/asset-transfers Whole asset transfer . curl -X POST https://service.centrapay.com/api/asset-transfers \\ -H \"X-Api-Key: $api_key\" \\ -H \"Content-Type: application/json\" \\ -d '{ \"assetId\": \"YGRo6TYYSxH3js7\", \"recipientAlias\": \"+642212312\" }' . Partial asset transfer . curl -X POST https://service.centrapay.com/api/asset-transfers \\ -H \"X-Api-Key: $api_key\" \\ -H \"Content-Type: application/json\" \\ -d '{ \"assetId\": \"sai2Pai7ohgongo\", \"value\": \"6000\", \"recipientAlias\": \"+642212312\" }' . Without Recipient . curl -X POST https://service.centrapay.com/api/asset-transfers \\ -H \"X-Api-Key: $api_key\" \\ -H \"Content-Type: application/json\" \\ -d '{ \"assetId\": \"sai2Pai7ohgongo\" }' . Required Fields . | Parameter | Type | Description | . | assetId | String | Id of a discrete asset to transfer or wallet to draw from. | . Optional Parameters . | Parameter | Type | Description | . | recipientAlias | String | Phone number, email or handle of receiver. | . | description | String | Shows up in transaction history against the transfer. 200 character limit. | . | message | String | A message which shows up in the SMS of the receiver. 100 character limit. | . | value | BigNumber | Amount to send. Required for money transfers. Units depend on the asset type. | . | senderName | String | Human readable name for the sender. 30 character limit. | . | suppressNotifications | Boolean | Suppress notifications from Centrapay (SMS/Email). | . Example response payload (With Recipient) . { \"id\": \"M7Kn2stAxNa6ri7h\", \"status\": \"created\", \"value\": \"1000\", \"assetId\": \"YGRo6TYYSxH3js7\", \"assetType\": \"epay.nzd.main\", \"description\": \"$60 Giftcard\", \"message\": \"Happy birthday\", \"senderName\": \"My Cafe\", \"recipientAccountId\": \"9EDxUT91TMsUjoqoQeBuLQ\", \"claimedByAccountId\": \"9EDxUT91TMsUjoqoQeBuLQ\", \"recipientAlias\": \"+64212312345\", \"createdAt\": \"2020-05-01T12:30:00.000Z\", \"updatedAt\": \"2020-05-02T01:03:37.222Z\", \"suppressNotifications\": false } . The above example has $10 left on a $60 dollar giftcard at the time of transfer. Example response payload (Without Recipient) . { \"id\": \"M7Kn2stAxNa6ri7h\", \"status\": \"created\", \"value\": \"1000\", \"assetId\": \"YGRo6TYYSxH3js7\", \"assetType\": \"centrapay.token.main\", \"description\": \"Centrapay Token\", \"message\": \"Happy birthday\", \"senderName\": \"CentraCafe\", \"createdAt\": \"2020-05-01T12:30:00.000Z\", \"updatedAt\": \"2020-05-02T01:03:37.222Z\", \"suppressNotifications\": false, \"url\": \"https://app.centrapay.com/transfer/M7Kn2stAxNa6ri7h\" } . Error Responses . | Status | Code | Description | . | 403 | INSUFFICIENT_WALLET_BALANCE | The value of the asset-transfer exceeds the balance on the wallet | . | 403 | QUOTA_EXCEEDED | The transfer exceeds one or more spend quota limits. See Quota Error Response. | . | 403 | ASSET_NOT_ACTIVE | The asset is not active and cannot be transferred. | . | 403 | RECIPIENT_MISSING | The asset must be transferred with a recipient supplied. | . ",
- "url": "/api/asset-transfers#create-an-asset-transfer",
- "relUrl": "/api/asset-transfers#create-an-asset-transfer"
- },"16": {
- "doc": "Asset Transfers",
- "title": "Get an Asset Transfer",
- "content": "GET /api/asset-transfers/{assetTransferId} . curl https://service.centrapay.com/api/asset-transfers/M7Kn2stAxNa6ri7h \\ -H \"X-Api-Key: $api_key\" . Example response payload (In-progress money transfer) . { \"id\": \"M7Kn2stAxNa6ri7h\", \"status\": \"sent\", \"value\": \"6000\", \"assetId\": \"sai2Pai7ohgongo\", \"assetType\": \"centrapay.nzd.main\", \"message\": \"Happy birthday\", \"senderName\": \"My Cafe\", \"lastSentTo\": \"+64212312345\", \"senderAccountId\": \"aBc932S9182qwCDqwer\", \"recipientAccountId\": \"oS3Xom2au3Ooy9aihai\", \"claimedByAccountId\": \"9EDxUT91TMsUjoqoQeBuLQ\", \"recipientAlias\": \"+64212312345\", \"createdAt\": \"2020-05-01T12:30:00.000Z\", \"updatedAt\": \"2020-05-02T01:03:37.222Z\", \"suppressNotifications\": false } . Example response payload (completed giftcard transfer) . { \"id\": \"M7Kn2stAxNa6ri7h\", \"status\": \"claimed\", \"value\": \"6000\", \"assetId\": \"YGRo6TYYSxH3js7\", \"assetType\": \"epay.nzd.main\", \"description\": \"$60 Giftcard\", \"message\": \"Happy birthday\", \"senderName\": \"My Cafe\", \"recipientAccountId\": \"9EDxUT91TMsUjoqoQeBuLQ\", \"claimedByAccountId\": \"9EDxUT91TMsUjoqoQeBuLQ\", \"recipientAlias\": \"+64******2345\", \"createdAt\": \"2020-05-01T12:30:00.000Z\", \"updatedAt\": \"2020-05-02T01:03:37.222Z\", \"suppressNotifications\": false } . ",
- "url": "/api/asset-transfers#get-an-asset-transfer",
- "relUrl": "/api/asset-transfers#get-an-asset-transfer"
- },"17": {
- "doc": "Asset Transfers",
- "title": "Get an Asset Transfer Summary",
- "content": "GET /api/asset-transfers/{assetTransferId}/summary . curl https://service.centrapay.com/api/asset-transfers/M7Kn2stAxNa6ri7h/summary . Example response payload . { \"id\": \"M7Kn2stAxNa6ri7h\", \"status\": \"created\", \"assetId\": \"YGRo6TYYSxH3js7\", \"message\": \"Happy birthday\", \"senderName\": \"My Cafe\", \"createdAt\": \"2020-05-01T12:30:00.000Z\" } . ",
- "url": "/api/asset-transfers#get-an-asset-transfer-summary",
- "relUrl": "/api/asset-transfers#get-an-asset-transfer-summary"
- },"18": {
- "doc": "Asset Transfers",
- "title": "Resolve claimable assets EXPERIMENTAL",
- "content": "When you send another centrapay user cash or assets, they’re automatically assigned to them. However, if they’re not signed up yet then these assets are not immediately assigned. If unclaimed, asset transfers are returned after 2 weeks. New accounts should call this endpoint to allocate assets that you’ve been sent. POST /api/me/resolve-claimable-assets . curl -X POST https://service.centrapay.com/api/me/resolve-claimable-assets \\ -H \"X-Api-Key: $api_key\" . Example response payload . { } . ",
- "url": "/api/asset-transfers#resolve-claimable-assets-experimental",
- "relUrl": "/api/asset-transfers#resolve-claimable-assets-experimental"
- },"19": {
- "doc": "Asset Transfers",
- "title": "List Asset Transfers EXPERIMENTAL",
- "content": "Returns a paginated list of Asset Transfers. GET /api/asset-transfers List asset transfers received . curl -G https://service.centrapay.com/api/asset-transfers \\ -H \"X-Api-Key: $api_key\" \\ -d recipientAccountId=oS3Xom2au3Ooy9aihai . List asset transfers sent . curl -G https://service.centrapay.com/api/asset-transfers \\ -H \"X-Api-Key: $api_key\" \\ -d senderAccountId=aBc932S9182qwCDqwer . Example response payload . { \"items\": [ { \"id\": \"M7Kn2stAxNa6ri7h\", \"status\": \"created\", \"value\": \"6000\", \"assetId\": \"YGRo6TYYSxH3js7\", \"description\": \"$60 Giftcard\", \"message\": \"Happy birthday\", \"senderName\": \"My Cafe\", \"senderAccountId\": \"aBc932S9182qwCDqwer\", \"recipientAccountId\": \"9EDxUT91TMsUjoqoQeBuLQ\", \"claimedByAccountId\": \"9EDxUT91TMsUjoqoQeBuLQ\", \"recipientAlias\": \"+64*****2345\", \"createdAt\": \"2020-05-01T12:30:00.000Z\", \"updatedAt\": \"2020-05-02T01:03:37.222Z\", \"suppressNotifications\": false } ] } . ",
- "url": "/api/asset-transfers#list-asset-transfers-experimental",
- "relUrl": "/api/asset-transfers#list-asset-transfers-experimental"
- },"20": {
- "doc": "Asset Types",
- "title": "Supported Asset Types",
- "content": "The following table describes the Asset Types supported for payments. The Category column refers to the Centrapay asset type representation if applicable. When blank, the Asset is not managed by a Centrapay Account. | Asset Type | Description | Category | Currencies | Flags | . | bitcoin.main | Bitcoin | | NZD, AUD | | . | cca.coke.main | Coke tokens | Token | NZD | 🚫 | . | cca.coke.test | Coke tokens | Token | NZD | 🅃 🚫 | . | centrapay.nzd.main | Centrapay NZD wallet | Money | NZD | | . | centrapay.nzd.test | Centrapay NZD wallet | Money | NZD | 🅃 | . | centrapay.token.main | Centrapay tokens | Token | NZD | | . | centrapay.token.test | Centrapay tokens | Token | NZD | 🅃 | . | epay.nzd.main | EPay NZ giftcards | Giftcard | NZD | | . | epay.nzd.test | EPay NZ giftcards | Giftcard | NZD | 🅃 | . | farmlands.nzd.main | Farmlands | Money | NZD | 💸💼 | . | farmlands.nzd.test | Farmlands | Money | NZD | 🅃💸💼 | . | paypal.main | PayPal | | USD | 💸 | . | paypal.test | PayPal | | USD | 🅃 💸 | . | quartz.nzd.main | Quartz NZD asset | | NZD | | . | quartz.nzd.test | Quartz NZD asset | | NZD | 🅃 | . | venmo.main | Venmo | | USD | 💸 | . | venmo.test | Venmo | | USD | 🅃 💸 | . | uplinkapi.test | Uplink API Test asset | | NZD | 🅃 | . | stadius.main | Stadius | | NZD, AUD, USD, CAD, EUR | | . | stadius.test | Stadius | | NZD, AUD, USD, CAD, EUR | 🅃 | . Flags . | 🅃 : Test Asset – Cannot be assigned to Merchants without the test flag. | 🚫 : Restricted Asset – Cannot be used to pay for “restricted” Line Items. | 💸 : Supports Quick Pay – Can be used to quick pay a Payment Request. | 💼 : Requires Tax Number – Tax Number must exist on the Merchant’s Business to transact this asset type. | . ",
- "url": "/api/asset-types#supported-asset-types",
- "relUrl": "/api/asset-types#supported-asset-types"
- },"21": {
- "doc": "Asset Types",
- "title": "Asset Types",
- "content": " ",
- "url": "/api/asset-types",
- "relUrl": "/api/asset-types"
- },"22": {
- "doc": "Assets",
- "title": "Assets",
- "content": "Centrapay digital assets are resources that represent the ability for a Centrapay account to perform transactions where value is exchanged. Assets can be spent to satisfy Payment Requests, withdrawn to a bank account via Funds Transfers and sent to other Centrapay users via Asset Transfers. Assets are categorized as either Money, Gift Cards or Tokens. Depending on its asset category, an asset will have different attributes available and different rules governing how it can be obtained, shared or spent. ",
- "url": "/api/assets",
- "relUrl": "/api/assets"
- },"23": {
- "doc": "Assets",
- "title": "Contents",
- "content": ". | Models . | Asset | Money | Gift Cards | Tokens (EXPERIMENTAL) | . | Operations . | Get Asset | Get Asset Summary | List Assets for Account | Listing Asset Transactions EXPERIMENTAL | Archive Asset | . | . ",
- "url": "/api/assets#contents",
- "relUrl": "/api/assets#contents"
- },"24": {
- "doc": "Assets",
- "title": "Models",
- "content": "Asset . All assets have the following fields along with the additional fields that are specific to its category. Assets which don’t have a category are considered EXPERIMENTAL and the model may change. Fields . | Field | Type | Description | . | id | String | The Asset’s unique identifier. | . | accountId | String | The Asset’s owning Centrapay Account id. | . | category | String Optional | Asset category (“money”, “giftcard”, “token”). | . | type | String | Asset Type id used by payment option asset types. | . | liveness | String | Either “main” (live payments allowed) or “test”. | . | description | String | Displayable asset description. | . | createdAt | Timestamp | Date when the asset was created or issued. | . | status | String | “active” if the asset can be used for payments. | . | meta | Object Optional | EXPERIMENTAL Additional data that may only appear in the Get Asset response. | . Money . Money assets, being backed by real currency, are the most flexible asset types. Money is accepted for most payment requests, can be sent in arbitrary amounts and does not expire. Money assets have the following fields along with the base asset fields. Fields . | Field | Type | Description | . | currency | String | Currency code, eg “NZD” | . | balance | BigNumber | Current balance in the currency’s smallest denomination (ie. cents). | . | availableBalance | BigNumber | The balance of the asset that is available for transfers or purchases. | . | settlement | Boolean Optional | EXPERIMENTAL The asset is configured for Settlements. | . Gift Cards . Gift cards are similar to money but have greater spending restrictions and are not always backed by real currency. Gift cards usually have an expiry date, are typically tied to a small number of merchants, and can only be sent in their entirety. Gift cards have the following fields along with the base asset fields. Fields . | Field | Type | Description | . | issuer | String | The identifier for the issuer of the gift card. | . | currency | String | Currency code, eg “NZD” | . | balance | BigNumber | Current balance in the currency’s smallest denomination (ie. cents). | . | availableBalance | BigNumber | The balance of the asset that is available for transfers or purchases. | . | initialBalance | BigNumber | The balance when the asset was created. | . | externalId | String Optional | The asset identifier from the issuing system. | . | expiresAt | Timestamp Optional | The date when the asset expires. | . | balanceUpdatedAt | Timestamp Optional | The date when the balance was last observed to be updated. | . | productCode | String Optional | EXPERIMENTAL The unique code which must match a merchant’s payment option for redemption. | . | img | String Optional | EXPERIMENTAL The img URL of the gift card. | . | brandName | String Optional | EXPERIMENTAL The name of the brand that the gift card belongs to. | . | brandImg | String Optional | EXPERIMENTAL The img URL of the brand that the gift card belongs to. | . | brandWebsite | String Optional | EXPERIMENTAL The URL of the brand that the gift card belongs to. | . | issuerWebsite | String Optional | EXPERIMENTAL The URL of the issuer of the gift card. | . Tokens (EXPERIMENTAL) . Tokens are assets which can only be spent in full. Every token is associated with a collection, which defines the branding and general rules for the tokens, such as active duration. Tokens have the following fields along with the base asset fields. Fields . | Field | Type | Description | . | collectionId | String | The token collection that will govern the branding and redemption rules for the token. | . | createdBy | CRN | The identity that created the activity. | . | value | Array Optional | The Monetary Amounts representing the token’s nominal value in its supported currencies. DEPRECATED | . | activeFrom | Timestamp Optional | The date when the asset becomes spendable. | . | expiresAt | Timestamp Optional | The date when the asset expires. | . | img | String Optional | The img URL of the token. | . | issuer | String Optional | The name of the Business that issued the token. | . | issuerWebsite | String Optional | The URL of the issuer of the token. | . | issuerImg | String Optional | The img URL of the issuer that the token belongs to. | . | externalId | String Optional | The asset identifier from the issuing system. | . ",
- "url": "/api/assets#models",
- "relUrl": "/api/assets#models"
- },"25": {
- "doc": "Assets",
- "title": "Operations",
- "content": "Get Asset . GET /api/assets/{assetId} . curl https://service.centrapay.com/api/assets/L75M3L56N2PtBSt8g7uXLU \\ -H \"X-Api-Key: $api_key\" . Example response payload . { \"id\": \"L75M3L56N2PtBSt8g7uXLU\", \"accountId\": \"Te2uDM7xhDLWGVJU3nzwnh\", \"category\": \"giftcard\", \"type\": \"epay.nzd.main\", \"issuer\": \"ezipay\", \"externalId\": \"23403283262\", \"description\": \"$60 Acme Giftcard\", \"productCode\": \"23403\", \"initialBalance\": \"6000\", \"balance\": \"6000\", \"availableBalance\": \"6000\", \"balanceUpdatedAt\": \"2021-01-01T00:00:00.000Z\", \"expiresAt\": \"2020-12-31T00:00:00.000Z\", \"createdAt\": \"2020-05-01T12:30:00.000Z\" } . Get Asset Summary . GET /api/assets/{assetId}/summary . curl https://service.centrapay.com/api/assets/L75M3L56N2PtBSt8g7uXLU/summary . Example response payload . { \"id\": \"L75M3L56N2PtBSt8g7uXLU\", \"issuer\": \"Centraperk Cafe\", \"description\": \"Free Coffee\", \"expiresAt\": \"2020-12-31T00:00:00.000Z\", \"img\": \"https://static.centrapay.com/assets/brands/centraperk/cafe-token.png\", \"liveness\": \"test\" } . List Assets for Account . Returns a paginated list of Assets for an account. This will not return archived assets. GET /api/accounts/{accountId}/assets List Assets for Account . curl https://service.centrapay.com/api/accounts/Te2uDM7xhDLWGVJU3nzwnh/assets \\ -H \"X-Api-Key: $api_key\" . List Assets for Account by externalId . curl -G https://service.centrapay.com/api/accounts/Te2uDM7xhDLWGVJU3nzwnh/assets \\ -H \"X-Api-Key: $api_key\" \\ -d externalId=QZnc7ehZGub1PHAUBjzVxo . Example response payload . { \"items\": [ { \"id\": \"L75M3L56N2PtBSt8g7uXLU\", \"accountId\": \"Te2uDM7xhDLWGVJU3nzwnh\", \"category\": \"giftcard\", \"type\": \"epay.nzd.main\", \"issuer\": \"ezipay\", \"externalId\": \"23403283262\", \"description\": \"$60 Acme Giftcard\", \"productCode\": \"23403\", \"initialBalance\": \"6000\", \"balance\": \"6000\", \"availableBalance\": \"6000\", \"balanceUpdatedAt\": \"2021-01-01T00:00:00.000Z\", \"expiresAt\": \"2020-12-31T00:00:00.000Z\", \"createdAt\": \"2020-05-01T12:30:00.000Z\" }, { \"id\": \"WRhAxxWpTKb5U7pXyxQjjY\", \"accountId\": \"Te2uDM7xhDLWGVJU3nzwnh\", \"category\": \"money\", \"type\": \"centrapay.nzd.main\", \"liveness\": \"main\", \"description\": \"NZD\", \"createdAt\": \"2021-01-01T00:00:00.000Z\", \"status\": \"active\", \"currency\": \"NZD\", \"balance\": \"2000\" }, { \"id\": \"Aj7rtHmd7rDeWoJgw9MPHe\", \"accountId\": \"Te2uDM7xhDLWGVJU3nzwnh\", \"type\": \"cca.coke.main\", \"description\": \"Coke™ Token\", \"category\": \"token\", \"value\": [ { \"currency\": \"NZD\", \"amount\": \"400\" } ], \"expiresAt\": \"2020-12-31T00:00:00.000Z\", \"createdAt\": \"2020-05-01T12:30:00.000Z\" } ] } . Listing Asset Transactions EXPERIMENTAL . Returns a paginated list of Asset Transactions. This endpoint is currently only supported for quartz asset types. GET /api/assets/{assetId}/transactions . curl https://service.centrapay.com/api/assets/WRhAxxWpTKb5U7pXyxQjjY/transactions \\ -H \"X-Api-Key: $api_key\" . Transaction Fields . | Field | Type | Description | . | ref | String | ID of the Centrapay resource that initiated this transaction. | . | refType | String | Name of the Centrapay resource that initiated this transaction. | . | type | String | Type of the Asset Transaction. Supported values are increment-balance, decrement-balance and transfer. | . | kind | String | Human readable value indicating the reason for this transaction. | . | srcAssetId | String Optional | ID of the source asset if applicable. | . | destAssetId | String Optional | ID of the destination asset if applicable. | . | srcParty | String Optional | Display value for party providing funds if applicable. See note below. | . | destParty | String Optional | Display value for party receiving funds if applicable. See note below. | . | otherParty | String Optional | Display value for party providing or receiving funds if applicable. See note below. | . | amount | String | Amount of transaction in cents. | . | activityType | String | Indicating whether the asset gained or lost value. Supported types are value-in and value-out. | . | activityNumber | String | Unique sequential Asset transaction number. | . Party Values . The “destParty” and “srcParty” are optionally provided only on transactions of type transfer. Values may include a merchant name, user handle, masked user email, masked user phone, or bank account. The “otherParty” is optionally provided only on transactions of type increment-balance and decrement-balance. Values may include bank account number. Example response payload . { \"items\": [ { \"ref\": \"adRGJqMyMhmGfnDXasRZ\", \"type\": \"transfer\", \"kind\": \"refund\", \"refType\": \"payment-request\", \"assetId\": \"WRhAxxWpTKb5U7pXyxQjjY\", \"srcParty\": \"Coffee Ltd\", \"destParty\": \"crn::user:5a3b1ba7-d01k-409f-ld0a-jd81k0ald\", \"createdAt\": \"2022-03-31T20:36:08.562Z\", \"createdBy\": \"crn::service:payments-api\", \"srcAssetId\": \"Jd9a89ZESjjCuUD9DJD9Al\", \"destAssetId\": \"WRhAxxWpTKb5U7pXyxQjjY\", \"amount\": \"2000\", \"activityType\": \"value-in\", \"activityNumber\": \"3\" }, { \"ref\": \"adRGJqMyMhmGfnDXasRZ\", \"type\": \"transfer\", \"kind\": \"payment\", \"refType\": \"payment-request\", \"assetId\": \"WRhAxxWpTKb5U7pXyxQjjY\", \"srcParty\": \"crn::user:5a3b1ba7-d01k-409f-ld0a-jd81k0ald\", \"destParty\": \"Coffee Ltd\", \"createdAt\": \"2022-03-31T20:35:54.717Z\", \"createdBy\": \"crn::service:payments-api\", \"srcAssetId\": \"WRhAxxWpTKb5U7pXyxQjjY\", \"destAssetId\": \"Jd9a89ZESjjCuUD9DJD9Al\", \"amount\": \"3000\", \"activityType\": \"value-out\", \"activityNumber\": \"2\" }, { \"ref\": \"H4SZKwMcU9VCmnGEqDA7Mn\", \"type\": \"increment-balance\", \"kind\": \"topup\", \"refType\": \"topup\", \"assetId\": \"WRhAxxWpTKb5U7pXyxQjjY\", \"createdAt\": \"2022-03-31T02:37:47.207Z\", \"createdBy\": \"crn::application:rhea\", \"destAssetId\": \"WRhAxxWpTKb5U7pXyxQjjY\", \"amount\": \"7600\", \"activityType\": \"value-in\", \"activityNumber\": \"1\" } ] } . Archive Asset . Archive supported asset types by asset id. Currently only gift cards may be archived. POST /api/assets/{assetId}/archive . curl -X POST https://service.centrapay.com/api/assets/L75M3L56N2PtBSt8g7uXLU/archive \\ -H \"X-Api-Key: $api_key\" . Example response payload . { \"id\": \"L75M3L56N2PtBSt8g7uXLU\", \"accountId\": \"Te2uDM7xhDLWGVJU3nzwnh\", \"category\": \"giftcard\", \"type\": \"epay.nzd.main\", \"issuer\": \"ezipay\", \"externalId\": \"23403283262\", \"description\": \"$60 Acme Giftcard\", \"initialBalance\": \"6000\", \"balance\": \"0\", \"balanceUpdatedAt\": \"2021-01-01T00:00:00.000Z\", \"expiresAt\": \"2020-12-31T00:00:00.000Z\", \"createdAt\": \"2020-05-01T12:30:00.000Z\", \"status\": \"archived\" } . Error Responses . | Status | Code | Description | . | 403 | UNSUPPORTED_ASSET_TYPE | Asset type can not be archived | . ",
- "url": "/api/assets#operations",
- "relUrl": "/api/assets#operations"
- },"26": {
- "doc": "Auth",
- "title": "Auth",
- "content": " ",
- "url": "/api/auth",
- "relUrl": "/api/auth"
- },"27": {
- "doc": "Auth",
- "title": "Contents",
- "content": ". | Authenticating API Calls | API Keys | User Access Tokens . | Claims | . | Roles and Permissions . | Account Flags | Permissions | . | . ",
- "url": "/api/auth#contents",
- "relUrl": "/api/auth#contents"
- },"28": {
- "doc": "Auth",
- "title": "Authenticating API Calls",
- "content": "API calls can be authenticated by either providing an API key in the “X-Api-Key” header or by providing a user access token in the “Authorization” header. Org Accounts accessed with a user access token require the “X-Centrapay-Account” header to be provided. The “X-Centrapay-Account” header specifies the unique identifier of the Centrapay Org Account. Authenticate with API key . curl https://service.centrapay.com/api/account-memberships \\ -H \"X-Api-Key: $api_key\" . Authenticate with user access token . curl https://service.centrapay.com/api/account-memberships \\ -H \"Authorization: $jwt\" . Authenticate org account with user access token . curl https://service.centrapay.com/api/accounts/Jaim1Cu1Q55uooxSens6yk/bank-accounts \\ -H \"Authorization: $jwt\" \\ -H \"X-Centrapay-Account: Jaim1Cu1Q55uooxSens6yk\" . ",
- "url": "/api/auth#authenticating-api-calls",
- "relUrl": "/api/auth#authenticating-api-calls"
- },"29": {
- "doc": "Auth",
- "title": "API Keys",
- "content": "API Keys provide enduring access to a single Centrapay account. The Centrapay test merchant API key is available to test creating payment requests: f32c5497297084e5354b47c40d5ccacb109ce483. ",
- "url": "/api/auth#api-keys",
- "relUrl": "/api/auth#api-keys"
- },"30": {
- "doc": "Auth",
- "title": "User Access Tokens",
- "content": "User access tokens provide time-limited access to all Centrapay accounts for which the user is a member. Access tokens are issued using OIDC code flow via the Centrapay OAuth authorization server and login page at auth.centrapay.com. After successfully negotiating the OIDC code flow your application will have access to three tokens: . | Id Token | JWT containing user attributes such as id, phone and email. | . | Access Token | JWT granting access to Centrapay APIs. Expires after 1 hour. | . | Refresh Token | Token for OIDC token exchange. Expires after 60 days or when revoked. | . A good starting point for learning more about OIDC is Okta’s OAuth OIDC Illustrated Guide. When initiating a login request, a valid redirect URI must be provided. To obtain a dedicated OAuth client id with your application’s redirect URI(s) whitelisted please contact Centrapay support. Your callback URI can be for a website (such as “https://yourapp.example.com/oidc-callback”) or mobile app (such as “com.example.yourapp://oidc-callback”). Your application can use any OIDC client to negotiate the authentication flow but it must support OIDC authorization code flow with PKCE. See the Example OIDC Consumer guide for a working example using the “oidc-client” JavaScript library. The Centrapay authorization server configuration can be interrogated via https://auth.centrapay.com/.well-known/openid-configuration. When handling the OIDC callback, browser based applications should slurp the callback parameters by performing a location.replace() so they are not available in the browser’s location bar or browsing history. If your application needs to talk directly to service.centrapay.com from a browser then it will also need to be whitelisted for cross-origin requests. Claims . The following table lists the claims which may be be included in a user id token. At minimum, the “sub” claim and one of “phone_number” or “email” will be present. | Name | Description | . | sub | Centrapay user id | . | email | email address | . | phone_number | phone number | . | given_name | given name(s) | . | family_name | surname | . | preferred_username | Centrapay user handle | . | phone_number_verified | phone number has been verified (can be used for account recovery) | . | email_verified | email has been verified (can be used for account recovery) | . ",
- "url": "/api/auth#user-access-tokens",
- "relUrl": "/api/auth#user-access-tokens"
- },"31": {
- "doc": "Auth",
- "title": "Roles and Permissions",
- "content": "Users and API keys are assigned a role for their associated Centrapay account(s). The permissions granted to the roles are shown in the table below. Most permissions apply only to resources owned by the associated account. Some permissions, such as payment-requests:pay, apply globally to all resources regardless of the account the resource belongs to. The global permissions are indicated below with a star (✸). Account Flags . Some permissions require an additional flag associated to their individual account or the targeted account that owns the resource (they may be the same account). For each permission, if there is a flag associated to it then at least one of them must be met. | Symbol | Description | . | 👤 | A trusted user flag on the individual account, obtained by verifying a NZ phone number. | . | 🧀 | An external-asset-issuer subscription on the targeted Account, obtained by contacting centrapay. | . | 🗄 | The targeted account must be of type org. | . | 🪙 | A collection-manager subscription on the targeted Account, obtained by contacting centrapay. | . Permissions . | Permission | Account Owner | Anon Consumer | Merchant Terminal | External Asset Provider | Cashier | . | accounts:create | ✅ | | | | | . | accounts:read | ✅ | | | ✅ | ✅ | . | accounts:update | ✅ | | | | | . | api-keys:create | ✅ | | | | | . | api-keys:list | ✅ | | | | | . | api-keys:update | ✅ | | | | | . | asset-transfers:claim | ✅ | | | ✅ | | . | asset-transfers:create 👤 🧀 | ✅ | | | ✅ | | . | asset-transfers:read | ✅ | | | ✅ | | . | assets:read | ✅ | | | ✅ | | . | assets:spend 👤 | ✅ | | | | | . | bank-account-approvals:create | ✅ | | | | | . | bank-account-requests:authorize | ✅ | | | | | . | bank-account-requests:create | ✅ | | | | | . | bank-accounts:create | ✅ | | | | | . | bank-accounts:read | ✅ | | | | | . | business:create | ✅ | | | | | . | business:update | ✅ | | | | | . | business:read | ✅ | | | | | . | collections:create 🪙 | ✅ | | | | | . | collections:read 🪙 | ✅ | | | | | . | external-assets:create 👤 🧀 | ✅ | | | ✅ | | . | external-assets:update | ✅ | | | ✅ | | . | integration-requests:configure | | | | | | . | integration-requests:create 🗄 | ✅ | | | | | . | integration-requests:read 🗄 | ✅ | | | | | . | invitations:accept | ✅ ✸ | | | | | . | invitations:read | ✅ ✸ | | | | | . | media-uploads:create | ✅ | | | | | . | memberships:delete 🗄 | ✅ | | | | | . | memberships:update | ✅ | | | | | . | merchants:create 🗄 | ✅ | | | | | . | merchants:list 🗄 | ✅ | | | | ✅ | . | merchants:read 🗄 | ✅ | | | | ✅ | . | merchants:update 🗄 | ✅ | | | | | . | patron-codes:create | ✅ | | | | | . | patron-codes:read | ✅ | | ✅ | | ✅ | . | payment-activities:read | ✅ | | ✅ | | ✅ | . | payment-conditions:approve | ✅ | | ✅ | | ✅ | . | payment-requests:cancel 🗄 | ✅ | | ✅ | | ✅ | . | payment-requests:create 🗄 | ✅ | | ✅ ✸ | | ✅ | . | payment-requests:pay 🗄 | ✅ ✸ | ✅ ✸ | ✅ | | ✅ ✸ | . | payment-requests:read | ✅ ✸ | ✅ ✸ | ✅ ✸ | | ✅ ✸ | . | payment-requests:read-by-shortcode | ✅ | | ✅ | | ✅ | . | payment-requests:refund 🗄 | ✅ | | ✅ | | ✅ | . | payment-requests:void 🗄 | ✅ | | ✅ | | ✅ | . | payment-requests:release 🗄 | ✅ | | ✅ | | ✅ | . | payment-requests:confirm 🗄 | ✅ | | ✅ | | ✅ | . | quotas:read | ✅ | | | | | . | quotas:read | ✅ | | | | | . | redemption-conditions:create 🪙 | ✅ | | | | | . | scanned-code:decode | ✅ | | ✅ | | ✅ | . | tokens:create 🪙 | ✅ | | | | | . | topups:create 👤 | ✅ | | | | | . | topups:read | ✅ | | | | | . | wallets:create | ✅ | | | | | . | wallets:deposit | ✅ | | | | | . | wallets:read | ✅ | | | | | . | wallets:transfer 👤 | ✅ | | | | | . | wallets:withdraw | ✅ | | | | | . ",
- "url": "/api/auth#roles-and-permissions",
- "relUrl": "/api/auth#roles-and-permissions"
- },"32": {
- "doc": "Bank Account Approvals",
- "title": "Bank Account Approvals",
- "content": "A Bank Account Approval represents any added authorization on a Bank Account. This may be an approval from Centrapay or a consent from a Centrapay Account owner that allows access to a third-party system. See Bank Account Approval Types. ",
- "url": "/api/bank-account-approvals",
- "relUrl": "/api/bank-account-approvals"
- },"33": {
- "doc": "Bank Account Approvals",
- "title": "Contents",
- "content": ". | Models . | Bank Account Approval | Bank Account Approval Activity | Bank Account Approval Types | . | Operations . | Request Bank Account Approval EXPERIMENTAL | Get Bank Account Approval EXPERIMENTAL | Accept a Bank Account Approval EXPERIMENTAL | Decline a Bank Account Approval EXPERIMENTAL | List Bank Account Approvals EXPERIMENTAL | . | . ",
- "url": "/api/bank-account-approvals#contents",
- "relUrl": "/api/bank-account-approvals#contents"
- },"34": {
- "doc": "Bank Account Approvals",
- "title": "Models",
- "content": "Bank Account Approval . Fields . | Field | Type | Description | . | id | String | The Bank Account Approval’s unique identifier. | . | bankAccountId | String | The id of the associated Bank Account. | . | accountId | String | The id of the owning Centrapay Account. | . | type | String | The type of Bank Account Approval. See Bank Account Approval Types. | . | status | String | The current status of the Bank Account Approval. Supported values are created, pending, approved, declined and done. | . | createdAt | Timestamp | When the Bank Account Approval was created. | . | createdBy | CRN | The User or API Key that created the Bank Account Approval. | . | modifiedAt | Timestamp | When the Bank Account Approval was updated. | . | modifiedBy | CRN | The User or API Key that updated the Bank Account Approval. | . | approvalActivities | Array | An array of Bank Account Approval Activity associated with the Bank Account Approval. | . | mediaUploadId | String Optional | The id of the associated Media Upload. Required for type settlement. | . | refreshToken | String Optional | A long lived access token for access to a third-party system. Required for type account-consent and payment-consent. | . | consentId | String Optional | A unique identifier for an authorization in a third-party system. | . Bank Account Approval Activity . Fields . | Field | Type | Description | . | activityNumber | Number | Unique sequential Bank Account Approval Activity number. | . | approvalId | String | The id of the associated Bank Account Approval. | . | activityType | String | The type of the Bank Account Approval Activity. | . | createdAt | Timestamp | When the Bank Account Approval Activity was created. | . | createdBy | CRN | The User or API Key that created the Bank Account Approval Activity. | . Bank Account Approval Types . | Name | description | . | settlement | An approved Bank Account Approval of type settlement is required for the funds in a Settlement Wallet to be released. A Media Upload is uploaded by the user to provide evidence of ownership of the Bank Account to be approved. | . | account-consent | An approved Bank Account Approval of type account-consent provides an access token to read account details from a third-party. | . | payment-consent | An approved Bank Account Approval of type payment-consent provides an access token for creating payments with a third-party. | . ",
- "url": "/api/bank-account-approvals#models",
- "relUrl": "/api/bank-account-approvals#models"
- },"35": {
- "doc": "Bank Account Approvals",
- "title": "Operations",
- "content": "Request Bank Account Approval EXPERIMENTAL . POST /api/bank-account-approvals . curl -X POST https://service.centrapay.com/api/bank-account-approvals \\ -H \"X-Api-Key: $api_key\" \\ -H \"Content-Type: application/json\" \\ -d '{ \"mediaUploadId\": \"uooxSens6ykJaim1Cu1Q55\", \"bankAccountId\": \"WRhAxxWpTKb5U7pXyxQjjY\", \"type\": \"settlement\" }' . Required Fields . | Field | Type | Description | . | mediaUploadId | String | The id of the associated Media Upload. | . | bankAccountId | String | The id of the associated Bank Account. | . | type | String | The Bank Account Approval Type. A Bank Account Approval can only be requested for type settlement. | . Example response payload . { \"id\": \"DcTs3U38HdhfEqwF1GKoT3\", \"mediaUploadId\": \"uooxSens6ykJaim1Cu1Q55\", \"bankAccountId\": \"WRhAxxWpTKb5U7pXyxQjjY\", \"accountId\": \"Jaim1Cu1Q55uooxSens6yk\", \"type\": \"settlement\", \"status\": \"created\", \"createdAt\": \"2021-11-08T21:52:39.915Z\", \"createdBy\": \"crn:WIj211vFs9cNACwBb04vQw:api-key:MyApiKey\", \"modifiedAt\": \"2021-11-08T21:52:39.915Z\", \"modifiedBy\": \"crn:WIj211vFs9cNACwBb04vQw:api-key:MyApiKey\" } . Error Responses . | Status | Code | Description | . | 403 | APPROVAL_ALREADY_IN_PROGRESS | There is already a Bank Account Approval in progress that is awaiting review from Centrapay. | . Get Bank Account Approval EXPERIMENTAL . GET /api/bank-account-approvals/{bankAccountApprovalId} . curl https://service.centrapay.com/api/bank-account-approvals/bbab9a768921019cb856 \\ -H \"X-Api-Key: $api_key\" . Example response payload . { \"id\": \"bbab9a768921019cb856\", \"bankAccountId\": \"WRhAxxWpTKb5U7pXyxQjjY\", \"accountId\": \"Jaim1Cu1Q55uooxSens6yk\", \"type\": \"account-consent\", \"status\": \"approved\", \"createdAt\": \"2021-11-08T21:52:39.915Z\", \"createdBy\": \"crn:WIj211vFs9cNACwBb04vQw:api-key:MyApiKey\", \"modifiedAt\": \"2021-11-08T21:52:39.915Z\", \"modifiedBy\": \"crn:WIj211vFs9cNACwBb04vQw:api-key:MyApiKey\", \"refreshToken\": \"y04Njk3LTRjNmZkYjBhMzRiZSIsIm5vbmNlIjoiOTg3MTJjMGNkZmFiNWZjNzMwM2MxMzNl\", \"consentId\": \"d24dbe-e2bc46ac-d924e38af112\" } . Accept a Bank Account Approval EXPERIMENTAL . POST /api/bank-account-approvals/{bankAccountApprovalId}/accept . curl -X POST https://service.centrapay.com/api/bank-account-approvals/DcTs3U38HdhfEqwF1GKoT3/accept \\ -H \"X-Api-Key: $api_key\" \\ -H \"Content-Type: application/json\" \\ -d '{ \"reason\": \"All details match\" }' . Optional Fields . | Field | Type | Description | . | reason | String | The reason for accepting the Bank Account Approval. | . Example response payload . { } . Error Responses . | Status | Code | Description | . | 403 | APPROVAL_ALREADY_REVIEWED | The Bank Account Approval has already been accepted or declined. | . Decline a Bank Account Approval EXPERIMENTAL . POST /api/bank-account-approvals/{bankAccountApprovalId}/decline . curl -X POST https://service.centrapay.com/api/bank-account-approvals/DcTs3U38HdhfEqwF1GKoT3/decline \\ -H \"X-Api-Key: $api_key\" \\ -H \"Content-Type: application/json\" \\ -d '{ \"reason\": \"All details match\" }' . Required Fields . | Field | Type | Description | . | reason | String | The reason for declining the Bank Account Approval. | . Example response payload . { } . Error Responses . | Status | Code | Description | . | 403 | APPROVAL_ALREADY_REVIEWED | The Bank Account Approval has already been accepted or declined. | . List Bank Account Approvals EXPERIMENTAL . GET /api/bank-accounts/{bankAccountId}/approvals . curl https://service.centrapay.com/api/bank-accounts/5vpkxjn6z787LiAKCqwuf9/approvals \\ -H \"X-Api-Key: $api_key\" . Example response payload . { \"items\": [ { \"id\": \"PJ6jTgDNv1xfFAooCoWZLe\", \"bankAccountId\": \"5vpkxjn6z787LiAKCqwuf9\", \"createdAt\": \"2022-08-21T21:41:46.361Z\", \"modifiedAt\": \"2022-08-21T21:41:46.361Z\", \"accountId\": \"TEZiZWAtX6v1hJucU4fGKx\", \"createdBy\": \"crn::user:7c0a034a-c36e-4645-b12b-57dec339ab47\", \"modifiedBy\": \"crn::user:7c0a034a-c36e-4645-b12b-57dec339ab47\", \"type\": \"account-consent\", \"status\": \"approved\", \"refreshToken\": \"tXC4dFm3yNAQbLrm4JxY6pynGoEG8vSJ\", \"consentId\": \"fFAoo-CoWZLea8-4dFm3yNAoWZLe\" }, { \"id\": \"WiFna4hCc7k4KYUxncFPg4\", \"bankAccountId\": \"5vpkxjn6z787LiAKCqwuf9\", \"createdAt\": \"2022-08-11T20:53:57.337Z\", \"modifiedAt\": \"2022-08-11T20:53:57.337Z\", \"accountId\": \"TEZiZWAtX6v1hJucU4fGKx\", \"createdBy\": \"crn::user:7c0a034a-c36e-4645-b12b-57dec339ab47\", \"modifiedBy\": \"crn::user:7c0a034a-c36e-4645-b12b-57dec339ab47\", \"type\": \"payment-consent\", \"status\": \"approved\", \"refreshToken\": \"dAGLl8AfnNCGEKEmBm1FryaDyW1JBh28\", \"consentId\": \"4KYUx-ncFPg4a8-Ll8AfnNCcFPg4\" }, { \"id\": \"SoQkkv4rWRwrknrdkYbBuB\", \"bankAccountId\": \"5vpkxjn6z787LiAKCqwuf9\", \"createdAt\": \"2022-08-21T21:41:22.345Z\", \"modifiedAt\": \"2022-08-21T21:41:22.345Z\", \"accountId\": \"TEZiZWAtX6v1hJucU4fGKx\", \"createdBy\": \"crn::user:7c0a034a-c36e-4645-b12b-57dec339ab47\", \"modifiedBy\": \"crn::user:7c0a034a-c36e-4645-b12b-57dec339ab47\", \"type\": \"account-consent\", \"status\": \"declined\", \"refreshToken\": \"rX3MNTxFwKIU2lhyZOrq87Aw74ASSHUM\", \"consentId\": \"rknrd-kYbBuBa8-MNTxFwKIYbBuB\" } ] } . ",
- "url": "/api/bank-account-approvals#operations",
- "relUrl": "/api/bank-account-approvals#operations"
- },"36": {
- "doc": "Bank Account Connection Intents",
- "title": "Bank Account Connection Intents",
- "content": "A Bank Account Connection Intent facilitates user authorization of access to Bank Accounts, for example, using Open Banking flows. Typically the authorization will follow an OAuth flow where the user is redirected to a third-party system to authenticate and select one or more bank accounts. ",
- "url": "/api/bank-account-connection-intents",
- "relUrl": "/api/bank-account-connection-intents"
- },"37": {
- "doc": "Bank Account Connection Intents",
- "title": "Contents",
- "content": ". | Models . | Bank Account Connection Intent | Bank Account Connection Intent Types | . | Operations . | Create Bank Account Connection Intent EXPERIMENTAL | Authorize Bank Account Connection Intent EXPERIMENTAL | . | . ",
- "url": "/api/bank-account-connection-intents#contents",
- "relUrl": "/api/bank-account-connection-intents#contents"
- },"38": {
- "doc": "Bank Account Connection Intents",
- "title": "Models",
- "content": "Bank Account Connection Intent . Fields . | Field | Type | Description | . | id | String | The Bank Account Connection Intent’s unique identifier. | . | accountId | String | The id of the owning Centrapay Account. | . | type | String | The type of Bank Account Connection Intent. See Bank Account Connection Intent Types. | . | status | String | The current status of the Bank Account Connection Intent. Supported values are created, authorized and failed. | . | createdAt | Timestamp | When the Bank Account Connection Intent was created. | . | createdBy | CRN | The User or API Key that created the Bank Account Connection Intent. | . | updatedAt | Timestamp | When the Bank Account Connection Intent was updated. | . | updatedBy | CRN | The User or API Key that updated the Bank Account Connection Intent. | . | authorizationUrl | String | A URL to the third-party beginning the authorization flow. | . | test | Boolean Optional | A flag which is present if the intention is to connect with a Bank Account used for testing. | . Bank Account Connection Intent Types . | Name | description | . | quartz-accounts | Initiates an authorization flow for authorizing access to bank account details. After a Bank Account Connection Intent has been authorized, one or more Centrapay Bank Account resources may be created. | . | quartz-payment | Initiates an authorization flow for authorizing access to create payments. | . ",
- "url": "/api/bank-account-connection-intents#models",
- "relUrl": "/api/bank-account-connection-intents#models"
- },"39": {
- "doc": "Bank Account Connection Intents",
- "title": "Operations",
- "content": "Create Bank Account Connection Intent EXPERIMENTAL . POST /api/bank-account-connection-intents . curl -X POST https://service.centrapay.com/api/bank-account-connection-intents \\ -H \"X-Api-Key: $api_key\" \\ -H \"Content-Type: application/json\" \\ -d '{ \"accountId\": \"uooxSens6ykJaim1Cu1Q55\", \"type\": \"quartz-accounts\", \"test\": true }' . Fields . | Field | Type | Description | . | accountId | String | The id of the owning Account. | . | type | String | The type of Bank Account Connection Intent. | . | bankAccountId | String Optional | The id of the associated Bank Account. Required if type is quartz-payment. | . | test | Boolean Optional | A flag which is present if the intention is to connect with a Bank Account used for testing. | . Example response payload . { \"id\": \"3KVjuKW2CZCJeJVqPxwkX7\", \"accountId\": \"B4u4WZCu3joZFVWT3XjWW3\", \"type\": \"quartz-accounts\", \"status\": \"created\", \"createdAt\": \"2022-03-31 02:56:29 UTC\", \"createdBy\": \"crn:B4u4WZCu3joZFVWT3XjWW3:api-key:MyApiKey\", \"updatedAt\": \"2022-03-31 02:56:29 UTC\", \"updatedBy\": \"crn:B4u4WZCu3joZFVWT3XjWW3:api-key:MyApiKey\", \"authorizationUrl\": \"https://example.com/authorization-url\", \"test\": true } . Error Responses . | Status | Code | Description | . | 403 | LIVENESS_MISMATCH | Only Bank Account Connection Intents with the test flag can be associated with test Bank Accounts, and vice versa. | . Authorize Bank Account Connection Intent EXPERIMENTAL . POST /api/bank-account-connection-intents/{bankAccountConnectionIntentId}/authorize . curl -X POST https://service.centrapay.com/api/bank-account-connection-intents/3KVjuKW2CZCJeJVqPxwkX7/authorize \\ -H \"X-Api-Key: $api_key\" \\ -H \"Content-Type: application/json\" \\ -d '{ \"code\": \"hKpKupTM391pE10xfQiorMxXarRKAHRhTfH_x\" }' . Fields . | Field | Type | Description | . | code | String | Authorization code returned from third-party. | . Example response payload . { } . ",
- "url": "/api/bank-account-connection-intents#operations",
- "relUrl": "/api/bank-account-connection-intents#operations"
- },"40": {
- "doc": "Bank Accounts",
- "title": "Bank Accounts",
- "content": "Bank Accounts are used to get money in and out of a Centrapay Account. Money is moved by creating “Top Up” or “Withdrawal” Funds Transfers. Bank Accounts must be “direct debit authorized” before they can be used for a Top Up and they must be “verified” before top up funds are released. Bank Accounts do not require “direct debit authorization” or “verification” in order to perform a Withdrawal. A 4-digit code from any recent Centrapay-initiated bank transaction can be used to verify a bank account. ",
- "url": "/api/bank-accounts",
- "relUrl": "/api/bank-accounts"
- },"41": {
- "doc": "Bank Accounts",
- "title": "Contents",
- "content": ". | Models . | Bank Account | Bank Account Approval Type Summary EXPERIMENTAL | Bank Account Type EXPERIMENTAL | Bank Account Balance EXPERIMENTAL | . | Operations . | Creating a Bank Account | Adding a direct debit authority to a Bank Account | Get information about a Bank Account | Get Bank Account Balance EXPERIMENTAL | Verify a Bank Account | Verify a Bank Authority DEPRECATED | List Bank Accounts | List Bank Authorities DEPRECATED | Creating a Bank Authority DEPRECATED | Get information about a Bank Authority DEPRECATED | . | . ",
- "url": "/api/bank-accounts#contents",
- "relUrl": "/api/bank-accounts#contents"
- },"42": {
- "doc": "Bank Accounts",
- "title": "Models",
- "content": "Bank Account . Mandatory Fields . | Field | Type | Description | . | id | String | The Bank Account’s unique identifier. | . | bankAccountNumber | String | The user’s Bank Account number. | . | bankAccountName | String | The name on the Bank Account provided by the user. | . | accountId | String | The id of the owning Centrapay Account. | . | status | String | The current status of the Bank Account. | . | verified | Boolean | Flag indicating the Bank Account is verified, allowing it to be used to Top Up. | . | type | String | The Bank Account Type of the bank, defaults to centrapay. | . | directDebitAuthorized | Boolean | Flag indicating the user accepts our Direct Debit terms and has authority to operate this account. | . | approvals | Array | A list of Bank Account Approval Type Summaries. | . | createdAt | Timestamp | When the Bank Account was created. | . | createdBy | CRN | The User or API Key that created the Bank Account. | . | modifiedAt | Timestamp | When the Bank Account was updated. | . | modifiedBy | CRN | The User or API Key that updated the Bank Account. | . Optional Fields . | Field | Type | Description | . | phoneNumber | String | The user’s phone number. | . | fullName | String | The first and last name of the user. | . | emailAddress | String | The user’s email address. | . | test | Boolean | A flag which is present if the Bank Account is for testing. | . Bank Account Approval Type Summary EXPERIMENTAL . A summary of the Bank Account Approvals for a Bank Account. There is one object per type of Bank Account Approval, which provides a summary of the approval status. Fields . | Name | Type | Description | . | type | String | The type of Bank Account Approval Summary. | . | status | String | The summarized status of the Bank Account Approvals. Supported values are pending, approved and declined. | . | updatedAt | Timestamp | When the Bank Account Approval Summary was updated. | . Bank Account Type EXPERIMENTAL . Types of bank accounts to allow access to different Asset Types. | Type | Description | . | centrapay | Allows topup and withdrawal of the centrapay.nzd asset type. | . | quartz | Allows usage of the quartz.nzd asset type. | . Bank Account Balance EXPERIMENTAL . The Bank Account balance, retrieved using Open Banking flows. The supported Bank Account type is quartz. | Name | Type | Description | . | bankAccountId | String | The unique identifier of the Centrapay Bank Account. | . | balance | BigNumber | The Open Banking Bank Account balance. | . | currency | String | Currency code (eg. “NZD”). | . ",
- "url": "/api/bank-accounts#models",
- "relUrl": "/api/bank-accounts#models"
- },"43": {
- "doc": "Bank Accounts",
- "title": "Operations",
- "content": ". Creating a Bank Account . A Bank Account can be created with or without direct debit authorized. By including directDebitAuthority, the user accepts our Direct Debit terms and has authority to operate this account. POST /api/bank-accounts Create without direct debit authorized . curl -X POST https://service.centrapay.com/api/bank-accounts \\ -H \"X-Api-Key: $api_key\" \\ -H \"Content-Type: application/json\" \\ -d '{ \"accountId\": \"Jaim1Cu1Q55uooxSens6yk\", \"bankAccountNumber\": \"12-1234-1234567-123\", \"bankAccountName\": \"John Doe\" }' . Create with direct debit authorized . curl -X POST https://service.centrapay.com/api/bank-accounts \\ -H \"X-Api-Key: $api_key\" \\ -H \"Content-Type: application/json\" \\ -d '{ \"accountId\": \"Jaim1Cu1Q55uooxSens6yk\", \"bankAccountNumber\": \"12-1234-1234567-123\", \"bankAccountName\": \"John Doe\", \"directDebitAuthority\": { \"phoneNumber\": \"+64212345678\", \"fullName\": \"John Doe\", \"emailAddress\": \"john.doe@gmail.com\" } }' . Required Fields . | Field | Type | Description | . | accountId | String | The id of the owning Centrapay Account. | . | bankAccountNumber | String | The user’s Bank Account number. | . | bankAccountName | String | The name on the Bank Account provided by the user. | . Optional Fields . Note, fields which have a star (✩) create a direct-debit authority and are required for Top Up. All fields below when specified are required together. | Field | Type | Description | . | phoneNumber | String | ✩ The user’s phone number. | . | fullName | String | ✩ The first and last name of the user. | . | emailAddress | String | ✩ The user’s email address. | . | type | String | The Bank Account Type to be created. | . | test | Boolean | A flag which is present if the Bank Account is for testing. | . Example response payload . { \"id\": \"WRhAxxWpTKb5U7pXyxQjjY\", \"accountId\": \"Jaim1Cu1Q55uooxSens6yk\", \"bankAccountNumber\": \"12-1234-1234567-123\", \"bankAccountName\": \"John Doe\", \"directDebitAuthorized\": true, \"status\": \"created\", \"verified\": false, \"type\": \"centrapay\", \"createdAt\": \"2020-06-12T01:17:46.499Z\", \"createdBy\": \"crn:WIj211vFs9cNACwBb04vQw:api-key:MyApiKey\", \"modifiedAt\": \"2020-06-12T01:17:46.499Z\", \"modifiedBy\": \"crn:WIj211vFs9cNACwBb04vQw:api-key:MyApiKey\", \"approvals\": [ ] } . Error Responses . | Status | Code | Description | . | 403 | BANK_ACCOUNT_LIMIT_EXCEEDED | The Centrapay account already has the max amount of directDebitAuthorized enabled Bank Accounts. | . | 403 | BANK_ACCOUNT_HOLDER_LIMIT_EXCEEDED | The global maximum Bank Accounts for the provided Bank Account number has been reached. | . | 403 | DUPLICATE_BANK_ACCOUNT | The Centrapay account already holds this Bank Account. | . Adding a direct debit authority to a Bank Account . By using this endpoint, the user accepts our Direct Debit terms and has authority to operate this account. POST /api/bank-accounts/{bankAccountId}/direct-debit-authorities . curl -X POST https://service.centrapay.com/api/bank-accounts/WRhAxxWpTKb5U7pXyxQjjY/direct-debit-authorities \\ -H \"X-Api-Key: $api_key\" \\ -H \"Content-Type: application/json\" \\ -d '{ \"phoneNumber\": \"+64212345678\", \"fullName\": \"John Doe\", \"emailAddress\": \"john@doe.org\" }' . Example response payload . { \"id\": \"WRhAxxWpTKb5U7pXyxQjjY\", \"accountId\": \"Jaim1Cu1Q55uooxSens6yk\", \"bankAccountNumber\": \"12-1234-1234567-123\", \"bankAccountName\": \"John Doe\", \"directDebitAuthorized\": true, \"status\": \"created\", \"verified\": false, \"type\": \"centrapay\", \"createdAt\": \"2020-06-12T01:17:46.499Z\", \"createdBy\": \"crn:WIj211vFs9cNACwBb04vQw:api-key:MyApiKey\", \"modifiedAt\": \"2020-06-12T01:17:46.499Z\", \"modifiedBy\": \"crn:WIj211vFs9cNACwBb04vQw:api-key:MyApiKey\", \"approvals\": [ ] } . Required Fields . Note, fields which have a star (✩) are required for Top Up. All fields below when specified are required together. | Field | Type | Description | . | phoneNumber | String | ✩ The user’s phone number. | . | fullName | String | ✩ The first and last name of the user. | . | emailAddress | String | ✩ The user’s email address. | . Error Responses . | Status | Code | Description | . | 403 | DIRECT_DEBIT_ALREADY_AUTHORIZED | This bank authority cannot be changed as all fields have been set. | . | 403 | DIRECT_DEBIT_LIMIT_EXCEEDED | The Centrapay account already has the max amount of directDebitAuthorized enabled Bank Accounts. | . Get information about a Bank Account . GET /api/bank-accounts/{bankAccountId} . curl https://service.centrapay.com/api/bank-accounts/d4a7cbd6818a87c51b97 \\ -H \"X-Api-Key: $api_key\" . Example response payload . { \"id\": \"d4a7cbd6818a87c51b97\", \"accountId\": \"Jaim1Cu1Q55uooxSens6yk\", \"status\": \"created\", \"bankAccountNumber\": \"12-1234-1234567-123\", \"bankAccountName\": \"John Doe\", \"directDebitAuthorized\": false, \"bankRegion\": \"nz\", \"createdBy\": \"crn:WIj211vFs9cNACwBb04vQw:api-key:MyApiKey\", \"createdAt\": \"2022-07-18T02:26:39.477Z\", \"verified\": false, \"modifiedBy\": \"crn:WIj211vFs9cNACwBb04vQw:api-key:MyApiKey\", \"modifiedAt\": \"2022-07-18T02:26:39.477Z\", \"approvals\": [ { \"type\": \"account-consent\", \"status\": \"approved\", \"updatedAt\": \"2021-11-08T21:52:39.915Z\" } ], \"type\": \"quartz\", \"test\": true } . Get Bank Account Balance EXPERIMENTAL . GET /api/bank-accounts/{bankAccountId}/balance . curl https://service.centrapay.com/api/bank-accounts/d4a7cbd6818a87c51b97/balance \\ -H \"X-Api-Key: $api_key\" . Example response payload . { \"bankAccountId\": \"d4a7cbd6818a87c51b97\", \"balance\": 1000, \"currency\": \"NZD\" } . Error Responses . | Status | Code | Description | . | 403 | BANK_BALANCE_NOT_SUPPORTED | The Bank Account Type does not support retrieval of a balance using Open Banking flows. | . | 403 | BANK_AUTHORIZATION_INVALID | The access token to retrieve the Bank Account Balance is no longer valid. | . Verify a Bank Account . Verification codes show up on statements when a user makes withdrawals and deposits. To verify an account, you need to direct the user to make a Top Up or Withdrawal and then check their statement. POST /api/bank-accounts/{bankAccountId}/verify . curl -X POST https://service.centrapay.com/api/bank-accounts/WRhAxxWpTKb5U7pXyxQjjY/verify \\ -H \"X-Api-Key: $api_key\" \\ -H \"Content-Type: application/json\" \\ -d '{ \"verificationCode\": \"1111\" }' . Required Fields . | Field | Type | Description | . | verificationCode | String | The code on the user’s bank statement. | . Example response payload . { \"verificationCode\": \"1111\" } . Error Responses . | Status | Code | Description | . | 403 | BANK_ACCOUNT_ALREADY_VERIFIED | The bank account is already verified. | . | 403 | VERIFICATION_CODE_INVALID | The verification code is incorrect. | . | 403 | BANK_ACCOUNT_VERIFICATION_ATTEMPTS_EXCEEDED | The bank account’s maximum failed verification attempts has been reached. | . | 403 | ACCOUNT_MISMATCH | The top up / withdrawal and the bank account do not belong to the same account. | . Verify a Bank Authority DEPRECATED . If you’re creating new interfaces, please work with our verify endpoint for Bank Accounts. POST /api/bank-authorities/{bankAccountId}/verify . curl -X POST https://service.centrapay.com/api/bank-authorities/WRhAxxWpTKb5U7pXyxQjjY/verify \\ -H \"X-Api-Key: $api_key\" \\ -H \"Content-Type: application/json\" \\ -d '{ \"verificationCode\": \"1111\" }' . Required Fields . | Field | Type | Description | . | verificationCode | String | The code on the user’s bank statement | . Example response payload . { \"verificationCode\": \"1111\" } . Example response payload . { \"id\": \"WRhAxxWpTKb5U7pXyxQjjY\", \"accountId\": \"Jaim1Cu1Q55uooxSens6yk\", \"bankAccountNumber\": \"12-1234-1234567-123\", \"bankAccountName\": \"John Doe\", \"status\": \"created\", \"directDebitAuthorized\": true, \"verified\": false, \"createdAt\": \"2020-06-12T01:17:46.499Z\", \"createdBy\": \"crn:WIj211vFs9cNACwBb04vQw:api-key:MyApiKey\", \"modifiedAt\": \"2020-06-12T01:17:46.499Z\", \"modifiedBy\": \"crn:WIj211vFs9cNACwBb04vQw:api-key:MyApiKey\", \"approvals\": [ ] } . List Bank Accounts . GET /api/accounts/{accountId}/bank-accounts . curl https://service.centrapay.com/api/accounts/Jaim1Cu1Q55uooxSens6yk/bank-accounts \\ -H \"X-Api-Key: $api_key\" . Example response payload . [ { \"id\": \"XZbPLViMzekVBbF7QMqgaY\", \"accountId\": \"Jaim1Cu1Q55uooxSens6yk\", \"status\": \"created\", \"bankAccountNumber\": \"02-0500-0568903-097\", \"bankAccountName\": \"Pocket Money\", \"directDebitAuthorized\": false, \"bankRegion\": \"nz\", \"createdBy\": \"crn::user:57142ecc-e5e4-456a-8312-1fad4fdef3c7\", \"createdAt\": \"2022-04-19T05:43:40.425Z\", \"verified\": false, \"modifiedBy\": \"crn::user:57142ecc-e5e4-456a-8312-1fad4fdef3c7\", \"modifiedAt\": \"2022-04-19T05:43:40.425Z\", \"approvals\": [ ], \"type\": \"quartz\", \"test\": true }, { \"id\": \"3Kfdm8cuW1W6f8AoWJREs4\", \"accountId\": \"Jaim1Cu1Q55uooxSens6yk\", \"status\": \"created\", \"bankAccountNumber\": \"00-1213-1231299-999\", \"bankAccountName\": \"Jean\", \"directDebitAuthorized\": false, \"bankRegion\": \"nz\", \"createdBy\": \"crn::user:57142ecc-e5e4-456a-8312-1fad4fdef3c7\", \"createdAt\": \"2022-02-22T03:27:57.138Z\", \"verified\": false, \"modifiedBy\": \"crn::user:57142ecc-e5e4-456a-8312-1fad4fdef3c7\", \"modifiedAt\": \"2022-02-22T03:27:57.138Z\", \"approvals\": [ { \"type\": \"settlement\", \"status\": \"pending\", \"updatedAt\": \"2021-11-08T21:52:39.915Z\" } ], \"type\": \"centrapay\" } ] . List Bank Authorities DEPRECATED . If you’re creating new interfaces, please work with our list endpoint for Bank Accounts. GET /api/bank-authorities . curl https://service.centrapay.com/api/bank-authorities \\ -H \"X-Api-Key: $api_key\" . Example response payload . [ { \"id\": \"WRhAxxWpTKb5U7pXyxQjjY\", \"accountId\": \"Jaim1Cu1Q55uooxSens6yk\", \"bankAccountNumber\": \"12-1234-1234567-123\", \"bankAccountName\": \"John Doe\", \"status\": \"created\", \"verified\": false, \"directDebitAuthorized\": true, \"createdAt\": \"2020-06-12T01:17:46.499Z\", \"approvals\": [ ] }, { \"id\": \"b5URhAxxWpTKyxQjjY7pXW\", \"accountId\": \"Jaim1Cu1Q55uooxSens6yk\", \"bankAccountNumber\": \"12-1234-1234567-123\", \"bankAccountName\": \"Jane Doe\", \"status\": \"active\", \"verified\": true, \"directDebitAuthorized\": true, \"createdAt\": \"2020-06-12T01:17:46.499Z\", \"approvals\": [ { \"type\": \"settlement\", \"status\": \"pending\", \"updatedAt\": \"2021-11-08T21:52:39.915Z\" } ] } ] . Creating a Bank Authority DEPRECATED . If you’re creating new interfaces, please work with our create endpoint for Bank Accounts. Creating a Bank Authority both creates a new Bank Account and a direct debit authority. By using this endpoint, the user accepts our Direct Debit terms and has authority to operate this account. POST /api/bank-authorities . curl -X POST https://service.centrapay.com/api/bank-authorities \\ -H \"X-Api-Key: $api_key\" \\ -H \"Content-Type: application/json\" \\ -d '{ \"fullName\": \"John Doe\", \"accountId\": \"Jaim1Cu1Q55uooxSens6yk\", \"phoneNumber\": \"+64212345\", \"directDebitAuthorized\": true, \"emailAddress\": \"John.doe@email.com\", \"bankAccountNumber\": \"12-1234-1234567-123\", \"bankAccountName\": \"John Doe\" }' . Required Fields . | Field | Type | Description | . | accountId | String | The id of the owning Centrapay Account. | . | fullName | String | The first and last name of the user | . | phoneNumber | String | The user’s phone number | . | emailAddress | String | The user’s email address | . | bankAccountNumber | String | The user’s bank account number | . | bankAccountName | String | The name on the bank account provided by the user | . Example response payload . { \"id\": \"WRhAxxWpTKb5U7pXyxQjjY\", \"accountId\": \"Jaim1Cu1Q55uooxSens6yk\", \"bankAccountNumber\": \"12-1234-1234567-123\", \"bankAccountName\": \"John Doe\", \"status\": \"created\", \"verified\": false, \"directDebitAuthorized\": true, \"createdAt\": \"2020-06-12T01:17:46.499Z\", \"createdBy\": \"crn:WIj211vFs9cNACwBb04vQw:api-key:MyApiKey\", \"modifiedAt\": \"2020-06-12T01:17:46.499Z\", \"modifiedBy\": \"crn:WIj211vFs9cNACwBb04vQw:api-key:MyApiKey\", \"approvals\": [ ] } . Error Responses . | Status | Code | Description | . | 403 | BANK_AUTHORITY_LIMIT_EXCEEDED | The account already has the max amount of bank accounts. | . | 403 | BANK_AUTHORITIES_FOR_BANK_ACCOUNT_EXCEEDED | There are already two bank accounts for the provided bank account number, which is the maximum allowed. | . Get information about a Bank Authority DEPRECATED . If you’re creating new interfaces, please work with our get endpoint for Bank Accounts. GET /api/bank-authorities/{bankAccountId} . curl https://service.centrapay.com/api/bank-authorities/WRhAxxWpTKb5U7pXyxQjjY \\ -H \"X-Api-Key: $api_key\" . Example response payload . { \"id\": \"WRhAxxWpTKb5U7pXyxQjjY\", \"accountId\": \"Jaim1Cu1Q55uooxSens6yk\", \"bankAccountNumber\": \"12-1234-1234567-123\", \"bankAccountName\": \"John Doe\", \"status\": \"created\", \"directDebitAuthorized\": true, \"verified\": false, \"createdAt\": \"2020-06-12T01:17:46.499Z\", \"createdBy\": \"crn:WIj211vFs9cNACwBb04vQw:api-key:MyApiKey\", \"modifiedAt\": \"2020-06-12T01:17:46.499Z\", \"modifiedBy\": \"crn:WIj211vFs9cNACwBb04vQw:api-key:MyApiKey\", \"approvals\": [ ] } . ",
- "url": "/api/bank-accounts#operations",
- "relUrl": "/api/bank-accounts#operations"
- },"44": {
- "doc": "Batches",
- "title": "Batches",
- "content": "Batches enable bulk loading of resource onto the Centrapay platform. ",
- "url": "/api/batches",
- "relUrl": "/api/batches"
- },"45": {
- "doc": "Batches",
- "title": "Contents",
- "content": ". | Models . | Batch | Batch Lifecycle | Batch Types | Error | . | Operations . | Create Batch EXPERIMENTAL | Get Batch EXPERIMENTAL | . | . ",
- "url": "/api/batches#contents",
- "relUrl": "/api/batches#contents"
- },"46": {
- "doc": "Batches",
- "title": "Models",
- "content": ". Batch . The batch model represents the progression for loading of a file. Fields . | Field | Type | Description | . | id | String | The Batch’s unique identifier. | . | status | String | The current Lifecycle Stage of the batch. | . | type | String | Batch Type id used to describe the batch content. | . | totalCount | BigNumber | The number of items processed. | . | errorCount | BigNumber | Total Error counted. | . | errors | Array | Error list for the batch. | . | test | Boolean Optional | true if the batch is for testing purposes only. | . Batch Lifecycle . Different stages of a Batch’s lifecycle. | Status | Description | . | created | The batch has successfully been submitted. | . | copied | The file has been transferred to Centrapay. | . | chunked | The batch has been broken up for processing. | . | complete | The batch has been processed and may include errors. | . | error | There is an error accessing or reading the file, preventing processing. | . Batch Types . The following table describes the Batch Types supported for loading. | Type | Description | . | farmlands-external-asset | Farmlands External Asset Batch. | . | verifone-terminal-status | Verifone Terminal Status Batch. | . Error . An Error represents the complete or partial failure of the batch. This could be caused by the contents, access or file format. Fields . | Field | Type | Description | . | message | String | A description of what caused the Error. | . | externalId | String Optional | Field used in debugging in reference to an id from the file. | . | index | BigNumber Optional | Item offset where the Error was identified in the file. | . ",
- "url": "/api/batches#models",
- "relUrl": "/api/batches#models"
- },"47": {
- "doc": "Batches",
- "title": "Operations",
- "content": "Create Batch EXPERIMENTAL . Initialize loading of entities from a batch file. POST /api/batches . curl -X POST https://service.centrapay.com/api/batches \\ -H \"X-Api-Key: $api_key\" \\ -H \"Content-Type: application/json\" \\ -d '{ \"type\": \"farmlands-external-asset\", \"url\": \"https://azurebuckets.com/1234\", \"accountId\": \"C4QnjXvj8At6SMsEN4LRi9\", \"test\": true }' . Fields . | Field | Type | Description | . | type | String | Batch Type used to describe the batch content. | . | url | String | The url where the file is located. | . | accountId | String | Centrapay Account Id that submitted the Batch. | . | test | Boolean Optional | true if the batch is for testing purposes only. | . Example Response Payload . { \"id\": \"AVH5uG4gRLYK6YR8JyrViN\", \"accountId\": \"1mdj7bj95gjo92r0ux6wfy69gj3h77\", \"status\": \"created\", \"type\": \"farmlands-external-asset\", \"url\": \"https://azurebuckets.com/1234\", \"test\": true, \"count\": \"0\", \"errorCount\": \"0\", \"errors\": [ ] } . Error Responses . | Status | Code | Description | . | 403 | LIVENESS_MISSMATCH | accountId “test” flag is not the same as submitted Batch’s “test” flag. | . Get Batch EXPERIMENTAL . GET /api/batches/{id} . curl https://service.centrapay.com/api/batches/AVH5uG4gRLYK6YR8JyrViN \\ -H \"X-Api-Key: $api_key\" . Example Response Payload . { \"id\": \"AVH5uG4gRLYK6YR8JyrViN\", \"accountId\": \"1mdj7bj95gjo92r0ux6wfy69gj3h77\", \"status\": \"complete\", \"type\": \"farmlands-external-asset\", \"url\": \"https://azurebuckets.com/1234\", \"test\": true, \"count\": \"160000\", \"errorCount\": \"1\", \"errors\": [ { \"externalId\": \"69d64d80-f9bd-4057-bc5b-1c55685d995b\", \"index\": \"1954\", \"message\": \"INVALID_BARCODE_LENGTH\" } ] } . ",
- "url": "/api/batches#operations",
- "relUrl": "/api/batches#operations"
- },"48": {
- "doc": "Businesses",
- "title": "Businesses",
- "content": "A Business represents a company registered with the New Zealand Companies Office. A Business is associated with a single Account. ",
- "url": "/api/businesses",
- "relUrl": "/api/businesses"
- },"49": {
- "doc": "Businesses",
- "title": "Contents",
- "content": ". | Models . | Business | Tax Number | . | Operations . | Create a Business EXPERIMENTAL | Update a Business EXPERIMENTAL | Get a Business by Account id EXPERIMENTAL | Search NZ Company Register EXPERIMENTAL | Get Business Details from NZ Company Register EXPERIMENTAL | Set Business Onboarding Status | . | . ",
- "url": "/api/businesses#contents",
- "relUrl": "/api/businesses#contents"
- },"50": {
- "doc": "Businesses",
- "title": "Models",
- "content": "Business . | Field | Type | Description | . | id | String | The unique identifier. | . | accountId | String | The Centrapay accountId for an org account. | . | accountName | String | The Centrapay account name for an org account. | . | test | Boolean | A flag which is present if the Account is test | . | nzbn | String | The unique NZBN identifier. | . | name | String | Legal name recorded in the Companies Register. | . | tradingName | String | Trading name recorded in the Companies Register. | . | companyNumber | String | Company number recorded in the Companies Register. | . | createdAt | Timestamp | When the Business was created. | . | updatedAt | Timestamp | When the Business was updated. | . | createdBy | CRN | The User or API Key that created the Business. | . | updatedBy | CRN | The User or API Key that updated the Business. | . | taxNumber | Tax Number Optional | The value-added tax configuration for the Business. | . | onboardingStatus | String | The onboarding status of the Business. See Onboarding Statuses for possible values. | . | onboardingStatusReason | String | The reason associated with the Onboarding Status. See Onboarding Status Reasons for possible values. | . Tax Number . | Field | Type | Description | . | value | String | The tax number. | . | type | String | Type of value-added tax. Can be nz-gst. | . Onboarding Statuses . | Status | Description | Allowed Reasons | . | applied | Identifies businesses that have registered to be activated for the Centrapay service. | | . | provisioning | Identifies businesses that are in the process of being activated for the Centrapay service. | | . | active | Identifies businesses that have been activated for Centrapay services successfully (i.e. they have successfully created a Payment Request). | | . | deactivated | Identifies businesses that have been de-registered for the Centrapay service. | data-quality-issues,change-of-ownership, centrapay-discontinued, duplicate, blocked | . | on-hold | Identifies businesses that have been placed on hold. | seasonal-business-closure, no-response | . Onboarding Status Reasons . | Reason | Description | . | duplicate | The business already exists in the Centrapay system. | . | data-quality-issues | Data quality issues are preventing the business from onboarding. | . | no-response | No response has been received from the business. | . | change-of-ownership | The business has changed ownership. | . | centrapay-discontinued | The business is no longer using Centrapay. | . | seasonal-business-closure | The business has closed temporarily. | . ",
- "url": "/api/businesses#models",
- "relUrl": "/api/businesses#models"
- },"51": {
- "doc": "Businesses",
- "title": "Operations",
- "content": "Create a Business EXPERIMENTAL . If accountId is not provided when creating a business, then a new org account will be created and associated to the business. POST /api/businesses . curl -X POST https://service.centrapay.com/api/businesses \\ -H \"X-Api-Key: $api_key\" \\ -H \"Content-Type: application/json\" \\ -d '{ \"nzbn\": \"9429046246448\", \"taxNumber\": { \"value\": \"123-456-789\", \"type\": \"nz-gst\" } }' . Required Fields . | Field | Type | Description | . | nzbn | String | The unique NZBN identifier. | . Optional Fields . | Field | Type | Description | . | accountId | String | The Centrapay accountId. | . | test | String | The created Centrapay org account will have the test flag. | . | taxNumber | Tax Number | The value-added tax configuration. | . Example response payload . { \"id\": \"DKTs3U38hdhfEqwF1JKoT2\", \"accountId\": \"Jaim1Cu1Q55uooxSens6yk\", \"accountName\": \"Centrapay\", \"nzbn\": \"9429046246448\", \"name\": \"CENTRAPAY LIMITED\", \"tradingName\": \"CentraPay\", \"companyNumber\": \"6340244\", \"createdAt\": \"2020-06-12T01:17:46.499Z\", \"updatedAt\": \"2020-06-12T01:17:46.499Z\", \"createdBy\": \"crn:WIj211vFs9cNACwBb04vQw:api-key:MyApiKey\", \"updatedBy\": \"crn:WIj211vFs9cNACwBb04vQw:api-key:MyApiKey\", \"taxNumber\": { \"value\": \"123-456-789\", \"type\": \"nz-gst\" }, \"onboardingStatus\": \"applied\" } . Error Responses . | Status | Code | Description | . | 403 | INVALID_ACCOUNT | Account does not exist, is not authorized, is of the wrong type, or is not in the NZ region. | . | 403 | INVALID_NZBN | The NZBN provided does not match any NZ business. | . Update a Business EXPERIMENTAL . PUT /api/businesses/{businessId} . curl -X PUT https://service.centrapay.com/api/businesses/DKTs3U38hdhfEqwF1JKoT2 \\ -H \"X-Api-Key: $api_key\" \\ -H \"Content-Type: application/json\" \\ -d '{ \"taxNumber\": { \"value\": \"123-456-789\", \"type\": \"nz-gst\" }, \"farmlandsBusinessNumber\": \"12345678\" }' . Optional Fields . | Field | Type | Description | . | taxNumber | Tax Number | The value-added tax configuration. | . | farmlandsBusinessNumber | String | The number associated with your Farmlands business. | . Example response payload . { \"id\": \"DKTs3U38hdhfEqwF1JKoT2\", \"accountId\": \"Jaim1Cu1Q55uooxSens6yk\", \"accountName\": \"Centrapay\", \"nzbn\": \"9429046246448\", \"name\": \"CENTRAPAY LIMITED\", \"tradingName\": \"CentraPay\", \"companyNumber\": \"6340244\", \"createdAt\": \"2020-06-12T01:17:46.499Z\", \"updatedAt\": \"2020-06-12T01:17:46.499Z\", \"createdBy\": \"crn:WIj211vFs9cNACwBb04vQw:api-key:MyApiKey\", \"updatedBy\": \"crn:WIj211vFs9cNACwBb04vQw:api-key:MyApiKey\", \"taxNumber\": { \"value\": \"123-456-789\", \"type\": \"nz-gst\" }, \"farmlandsBusinessNumber\": \"12345678\", \"onboardingStatus\": \"applied\" } . Error Responses . | Status | Code | Description | . | 403 | INVALID_ACCOUNT | Account does not exist, is not authorized, is of the wrong type, or is not in the NZ region. | . | 403 | INVALID_NZBN | The NZBN provided does not match any NZ business. | . Get a Business by Account id EXPERIMENTAL . GET /api/accounts/{accountId}/business . curl https://service.centrapay.com/api/accounts/Jaim1Cu1Q55uooxSens6yk/business \\ -H \"X-Api-Key: $api_key\" . Example response payload . { \"id\": \"DKTs3U38hdhfEqwF1JKoT2\", \"accountId\": \"Jaim1Cu1Q55uooxSens6yk\", \"accountName\": \"Centrapay\", \"nzbn\": \"9429046246448\", \"name\": \"CENTRAPAY LIMITED\", \"tradingName\": \"CentraPay\", \"companyNumber\": \"6340244\", \"createdAt\": \"2020-06-12T01:17:46.499Z\", \"updatedAt\": \"2020-06-12T01:17:46.499Z\", \"createdBy\": \"crn:WIj211vFs9cNACwBb04vQw:api-key:MyApiKey\", \"updatedBy\": \"crn:WIj211vFs9cNACwBb04vQw:api-key:MyApiKey\" } . Search NZ Company Register EXPERIMENTAL . Returns a list of companies that match the queried param on company name, nzbn number or company number. Results are paginated and ordered by relevance. GET /api/nzbn-search . curl -G https://service.centrapay.com/api/nzbn-search \\ -H \"X-Api-Key: $api_key\" \\ -d q=centrapay . Query Parameters . | Parameter | Description | . | q | Company name, number or NZBN to search for. | . Example response payload . { \"items\": [ { \"nzbn\": \"9429046246448\", \"companyName\": \"CENTRAPAY LIMITED\", \"companyNumber\": \"6340244\" } ] } . Get Business Details from NZ Company Register EXPERIMENTAL . GET /api/nzbn/{nzbn} . curl https://service.centrapay.com/api/nzbn/9429046246448 \\ -H \"X-Api-Key: $api_key\" . Example response payload . { \"nzbn\": \"9429046246448\", \"companyName\": \"CENTRAPAY LIMITED\", \"tradingName\": \"CentraPay\", \"companyNumber\": \"6340244\", \"directors\": [ { \"firstName\": \"John\", \"lastName\": \"DOE\", \"addressLines\": [ \"7 Tara Street\", \"Downmore\", \"Auckland\" ] }, { \"firstName\": \"Jane\", \"lastName\": \"DOE\", \"addressLines\": [ \"82 Greatwood Road\", \"Northclover\", \"Auckland\" ] } ] } . Set Business Onboarding Status . POST /api/businesses/{businessId}/set-onboarding-status . curl -X POST https://service.centrapay.com/api/businesses/DKTs3U38hdhfEqwF1JKoT2/set-onboarding-status \\ -H \"X-Api-Key: $api_key\" \\ -H \"Content-Type: application/json\" \\ -d '{ \"onboardingStatus\": \"deactivated\", \"onboardingStatusReason\": \"change-of-ownership\" }' . Example response payload . { \"type\": \"set-onboarding-status\", \"onboardingStatus\": \"deactivated\", \"onboardingStatusReason\": \"change-of-ownership\", \"businessId\": \"DKTs3U38hdhfEqwF1JKoT2\", \"createdAt\": \"2020-06-12T01:17:46.499Z\", \"createdBy\": \"crn:WIj211vFs9cNACwBb04vQw:api-key:MyApiKey\", \"activityNumber\": 2 } . ",
- "url": "/api/businesses#operations",
- "relUrl": "/api/businesses#operations"
- },"52": {
- "doc": "Data Types",
- "title": "Data Types",
- "content": " ",
- "url": "/api/data-types",
- "relUrl": "/api/data-types"
- },"53": {
- "doc": "Data Types",
- "title": "Timestamp",
- "content": "A point in time, usually with millisecond precision, represented as an ISO 8601 date string (eg “2021-06-11T02:51:11.000Z”). Timestamps are in the UTC timezone as denoted by the “Z” suffix. ",
- "url": "/api/data-types#timestamp",
- "relUrl": "/api/data-types#timestamp"
- },"54": {
- "doc": "Data Types",
- "title": "BigNumber",
- "content": "A number, represented as a String, which can have arbitrary size or precision. Most Centrapay APIs that deal with transactable value (ie. assets, payments, etc) represent the value as BigNumbers. Depending on the context, a BigNumber may be used to represent an integer or a decimal amount. ",
- "url": "/api/data-types#bignumber",
- "relUrl": "/api/data-types#bignumber"
- },"55": {
- "doc": "Data Types",
- "title": "Monetary",
- "content": "A monetary amount in a currency, represented as an Object. The amount is usually an integer in the smallest denomination for the currency (ie cents) but may be a decimal value for some currencies (eg Bitcoin). The currency is typically represented as an ISO 4217 code. Fields . | Name | Type | Description | . | amount | BigNumber | Value in the currency’s smallest denomination (eg. cents). | . | currency | String | Currency code (eg. “NZD”). | . ",
- "url": "/api/data-types#monetary",
- "relUrl": "/api/data-types#monetary"
- },"56": {
- "doc": "Data Types",
- "title": "CRN",
- "content": "A Centrapay Resource Name (CRN) is a colon-delimited String that uniquely identifies any Centrapay resource. The format is crn:{account}:{type}:{id} where “account” is the optional Centrapay account that owns the resource, “type” is the resource type, and “id” is the resource identifier. CRN is often used to refer to Users and API keys. For example: . | User: crn::user:e2837e88-d408-11eb-8eac-3e22fb52e878 | API Key: crn:1234abc:api-key:MyAccountOwner | . ",
- "url": "/api/data-types#crn",
- "relUrl": "/api/data-types#crn"
- },"57": {
- "doc": "Data Types",
- "title": "Location",
- "content": "A location’s represented as an Object with properties to denote the location both absolute and by locality. Required Fields . | Name | Type | Description | . | street | String | Unit, number, and name of street address | . | city | String | City of location | . | country | String | ISO 3166 Country code. (eg. “NZ”) | . Optional Fields . | Name | Type | Description | . | lat | Number | Absolute latitude coordinate. If you don’t provide this, we will automatically infer this from your address. | . | lng | Number | Absolute longitude coordinate. If you don’t provide this, we will automatically infer this from your address. | . | suburb | String | Suburb of location | . | postCode | String | Post or Zip code of location | . | state | String | The state or region of the location (eg. “Auckland”) | . ",
- "url": "/api/data-types#location",
- "relUrl": "/api/data-types#location"
- },"58": {
- "doc": "Data Types",
- "title": "PhoneNumber",
- "content": "A phone number, represented in E.123 international notation (eg “+6421537663”). We usually use this for receiving text messages. ",
- "url": "/api/data-types#phonenumber",
- "relUrl": "/api/data-types#phonenumber"
- },"59": {
- "doc": "External Assets",
- "title": "External Assets",
- "content": "External assets are Assets which are issued by a third-party. ",
- "url": "/api/external-assets",
- "relUrl": "/api/external-assets"
- },"60": {
- "doc": "External Assets",
- "title": "Contents",
- "content": ". | Load an External Asset | . ",
- "url": "/api/external-assets#contents",
- "relUrl": "/api/external-assets#contents"
- },"61": {
- "doc": "External Assets",
- "title": "Load an External Asset",
- "content": "Load an asset from a supported third-party issuer. Asset details will be obtained from the issuer. POST /api/external-assets . curl -X POST https://service.centrapay.com/api/external-assets \\ -H \"X-Api-Key: $api_key\" \\ -H \"Content-Type: application/json\" \\ -d '{ \"accountId\": \"Jaim1Cu1Q55uooxSens6yk\", \"category\": \"giftcard\", \"type\": \"epay.nzd.test\", \"issuer\": \"ezipay\", \"externalId\": \"23403321042\", \"pin\": \"3771\" }' . Required Fields . | Parameter | Type | Description | . | accountId | String | The Centrapay account which will own the asset. | . | category | String | The category an asset will be grouped by. Valid values: “giftcard”. | . | type | String | The Centrapay ledger corresponding to the asset. Valid values: “epay.nzd.main”, “epay.nzd.test”. | . | issuer | String | The asset issuer. Valid values: “ezipay”. | . | externalId | String | The issuer’s asset id such as card number. | . Optional Parameters . | Parameter | Type | Description | . | pin | String | Additional secret required by the issuer for loading or redeeming the asset. | . | description | String | Description of the asset, eg: “$60 Acme Giftcard”. | . Example response payload . { \"id\": \"L75M3L56N2PtBSt8g7uXLU\", \"category\": \"giftcard\", \"type\": \"epay.nzd.main\", \"accountId\": \"Te2uDM7xhDLWGVJU3nzwnh\", \"issuer\": \"ezipay\", \"externalId\": \"************60119\", \"description\": \"$60 Acme Giftcard\", \"productCode\": \"23403\", \"currency\": \"NZD\", \"initialBalance\": \"7000\", \"balance\": \"6000\", \"availableBalance\": \"6000\", \"balanceUpdatedAt\": \"2020-06-10T15:30:00.000Z\", \"expiresAt\": \"2020-12-31T00:00:00.000Z\", \"createdAt\": \"2020-05-01T12:30:00.000Z\" } . Error Responses . | Status | Code | Description | . | 403 | UNKNOWN_ASSET | Asset id or PIN is incorrect. | . | 403 | DUPLICATE_ASSET | Asset already claimed by another account. | . | 403 | UNSUPPORTED_ASSET_TYPE | Unsupported asset type, origin, or issuer. | . | 403 | DENIED_BY_ASSET_PROVIDER | Asset exists, but is not enabled for use through centrapay. | . | 403 | EXPIRED_BY_ASSET_PROVIDER | Asset exists, but it’s expired. | . ",
- "url": "/api/external-assets#load-an-external-asset",
- "relUrl": "/api/external-assets#load-an-external-asset"
- },"62": {
- "doc": "Farmlands External Asset Batch",
- "title": "Farmlands External Asset Batch",
- "content": "Loads Farmlands Card data into Centrapay as external assets. | Type Name | farmlands-external-asset | . | File Format | JSONL | . | Record Type | Account | . ",
- "url": "/api/batch-types/farmlands-external-asset",
- "relUrl": "/api/batch-types/farmlands-external-asset"
- },"63": {
- "doc": "Farmlands External Asset Batch",
- "title": "Contents",
- "content": ". | Models . | Account | Contact | Card | . | Example JSONL File | Example Models | . ",
- "url": "/api/batch-types/farmlands-external-asset#contents",
- "relUrl": "/api/batch-types/farmlands-external-asset#contents"
- },"64": {
- "doc": "Farmlands External Asset Batch",
- "title": "Models",
- "content": ". Account . Exported Farmlands Account used for importing and updating of a Centrapay Asset. Fields . | Field | Type | Description | . | externalId | String | Id used for keeping imported Centrapay Asset up to date. | . | accountNumber | String | Farmlands account identifier attached to the Centrapay Asset. | . | availableBalance | BigNumber Optional | Current spendable balance of Centrapay Asset in cents. When not specified, defaults to 0. | . | contacts | Array Optional | Contact List for the imported Centrapay Asset. When empty all Contacts are removed. | . Contact . Exported Farmlands Contact and Card information used for authentication, correspondence and payment. Fields . | Field | Type | Description | . | externalId | String | Id used for keeping imported Centrapay Contact details up to date. | . | name | String Optional | The full name used to address the individual. | . | mobile | PhoneNumber Optional | Mobile number used for authentication and correspondence, must start with +64. | . | email | String Optional | Email address used for authentication and correspondence. | . | primary | Boolean Optional | true if the Contact is the owner of the Farmlands Account. | . | cards | Array Optional | Card list used for payment for the authenticated subject. When empty all Cards are removed. | . Card . Exported Farmlands Credit Card information used for importing and updating of a Patron Code. Fields . | Field | Type | Description | . | externalId | String Optional | Farmlands unique identifier for the card. | . | barcode | BigNumber | Unique 9 digit field to display in barcode format to pay by Patron Code. | . | status | String | Current state of the Card. Valid values are “active”, “inactive” and “archived”. | . | expiry | Timestamp | Payments will be accepted until this time. | . | farmlandsStatus | String Optional | Private field used in all Farmlands payment transaction notifications. | . ",
- "url": "/api/batch-types/farmlands-external-asset#models",
- "relUrl": "/api/batch-types/farmlands-external-asset#models"
- },"65": {
- "doc": "Farmlands External Asset Batch",
- "title": "Example JSONL File",
- "content": "A complete batch example with all batch types included. For more legible examples please refer to Example Models. {\"externalId\":\"9b2ec6d1-c83b-496a-8e52-2989f23d9076\",\"accountNumber\":\"012345678\",\"availableBalance\":\"1000\",\"contacts\":[]} {\"externalId\":\"d0d7e14d-4ce5-4f42-8a4c-d604a9609f66\",\"accountNumber\":\"012345678\",\"availableBalance\":\"1000\"} {\"externalId\":\"69d64d80-f9bd-4057-bc5b-1c55685d995b\",\"accountNumber\":\"012345678\",\"contacts\":[{\"externalId\":\"6e496c2a-1dae-4036-847d-c53bf6c6d410\",\"name\":\"Road Runner\",\"mobile\":\"+64221105598\",\"email\":\"road@runner.net\",\"primary\":true,\"cards\":[{\"externalId\":\"9b2ec6d1-c83b-496a-8e52-2989f23d9076\",\"barcode\":\"976238759\",\"status\":\"active\",\"expiry\":\"2022-10-01T22:32:56.631Z\"},{\"externalId\":\"74e4f94c-8316-42e7-9aa1-eb1539528894\",\"barcode\":\"957813964\",\"status\":\"inactive\",\"expiry\":\"2022-08-01T22:32:56.631Z\"}]}]} {\"externalId\":\"b5fde0e0-357c-4fda-a90f-fd857f2be999\",\"accountNumber\":\"830578479\",\"availableBalance\":\"12000\",\"contacts\":[{\"externalId\":\"6e496c2a-1dae-4036-847d-c53bf6c6d410\",\"name\":\"Road Runner\",\"mobile\":\"+64221102598\",\"email\":\"road@runner.net\",\"primary\":true,\"cards\":[{\"externalId\":\"65e701c3-6973-4322-8fa6-4560a489417f\",\"barcode\":\"458028560\",\"status\":\"active\",\"expiry\":\"2023-06-01T22:32:56.631Z\"},{\"externalId\":\"69d64d80-f9bd-4057-bc5b-1c55685d995b\",\"barcode\":\"635570865\",\"status\":\"inactive\",\"farmlandsStatus\":\"Suspended by customer\",\"expiry\":\"2022-04-01T22:32:56.631Z\"}]},{\"externalId\":\"6e4813e6-7a18-47ea-b92e-add36c8815ca\",\"name\":\"Yosemite Sam\",\"mobile\":\"+64220002598\",\"email\":\"yosemite@runner.net\",\"primary\":false,\"cards\":[{\"externalId\":\"74e4f94c-8316-42e7-9aa1-eb1539528894\",\"barcode\":\"137628567\",\"status\":\"active\",\"expiry\":\"2022-04-01T22:32:56.631Z\"}]},{\"externalId\":\"82bdb041-ea79-448c-816f-77af8b6750b2\",\"name\":\"Wile E. Coyote\",\"mobile\":\"+64221102598\",\"email\":\"while@e-cyote.net\",\"primary\":false,\"cards\":[{\"externalId\":\"62904b86-b4cc-45a9-b3c9-287a00ae9ef5\",\"barcode\":\"722798445\",\"status\":\"active\",\"expiry\":\"2022-04-01T22:32:56.631Z\"}]}]} . ",
- "url": "/api/batch-types/farmlands-external-asset#example-jsonl-file",
- "relUrl": "/api/batch-types/farmlands-external-asset#example-jsonl-file"
- },"66": {
- "doc": "Farmlands External Asset Batch",
- "title": "Example Models",
- "content": "Centrapay matches previously created resources using externalId and records get created or updated based on these IDs. In some cases, fields may be omitted to only update some fields. Warning: Below our records have newlines for legibility. When submitting a batch file you must only use newlines to separate records. An example of a Centrapay Asset complete with availableBalance, contacts and cards. { \"externalId\": \"b5fde0e0-357c-4fda-a90f-fd857f2be999\", \"accountNumber\": \"830578479\", \"availableBalance\": \"12000\", \"contacts\": [ { \"externalId\": \"6e496c2a-1dae-4036-847d-c53bf6c6d410\", \"name\": \"Road Runner\", \"mobile\": \"+64221102598\", \"email\": \"road@runner.net\", \"primary\": true, \"cards\": [ { \"externalId\": \"65e701c3-6973-4322-8fa6-4560a489417f\", \"barcode\": \"458028560\", \"status\": \"active\", \"expiry\": \"2023-06-01T22:32:56.631Z\" }, { \"externalId\": \"69d64d80-f9bd-4057-bc5b-1c55685d995b\", \"barcode\": \"635570865\", \"status\": \"inactive\", \"farmlandsStatus\": \"Suspended by customer\", \"expiry\": \"2022-04-01T22:32:56.631Z\" } ] }, { \"externalId\": \"6e4813e6-7a18-47ea-b92e-add36c8815ca\", \"name\": \"Yosemite Sam\", \"mobile\": \"+64220002598\", \"email\": \"yosemite@runner.net\", \"primary\": false, \"cards\": [ { \"externalId\": \"74e4f94c-8316-42e7-9aa1-eb1539528894\", \"barcode\": \"137628567\", \"status\": \"active\", \"expiry\": \"2022-04-01T22:32:56.631Z\" } ] }, { \"externalId\": \"82bdb041-ea79-448c-816f-77af8b6750b2\", \"name\": \"Wile E. Coyote\", \"mobile\": \"+64221102598\", \"email\": \"while@e-cyote.net\", \"primary\": false, \"cards\": [ { \"externalId\": \"62904b86-b4cc-45a9-b3c9-287a00ae9ef5\", \"barcode\": \"722798445\", \"status\": \"active\", \"expiry\": \"2022-04-01T22:32:56.631Z\" } ] } ] } . Update the availableBalance on an account and remove all contacts associated with it. Note, this renders the availableBalance un-spendable. { \"externalId\": \"9b2ec6d1-c83b-496a-8e52-2989f23d9076\", \"accountNumber\": \"012345678\", \"availableBalance\": \"1000\", \"contacts\": [ ] } . Update the availableBalance on an account. { \"externalId\": \"d0d7e14d-4ce5-4f42-8a4c-d604a9609f66\", \"accountNumber\": \"012345678\", \"availableBalance\": \"1000\" } . Update the contact list for an account. Use this where you want to exclude availableBalance. { \"externalId\": \"69d64d80-f9bd-4057-bc5b-1c55685d995b\", \"accountNumber\": \"012345678\", \"contacts\": [ { \"externalId\": \"6e496c2a-1dae-4036-847d-c53bf6c6d410\", \"name\": \"Road Runner\", \"mobile\": \"+64221105598\", \"email\": \"road@runner.net\", \"primary\": true, \"cards\": [ { \"externalId\": \"9b2ec6d1-c83b-496a-8e52-2989f23d9076\", \"barcode\": \"976238759\", \"status\": \"active\", \"expiry\": \"2022-10-01T22:32:56.631Z\" }, { \"externalId\": \"74e4f94c-8316-42e7-9aa1-eb1539528894\", \"barcode\": \"957813964\", \"status\": \"inactive\", \"expiry\": \"2022-08-01T22:32:56.631Z\" } ] } ] } . ",
- "url": "/api/batch-types/farmlands-external-asset#example-models",
- "relUrl": "/api/batch-types/farmlands-external-asset#example-models"
- },"67": {
- "doc": "Funds Transfers",
- "title": "Funds Transfers",
- "content": "A funds transfer represents either a top up to or a withdrawal from a Centrapay wallet. Topping up a wallet consists of making a bank transfer from the user’s bank account to Centrapay. Once Centrapay has verified the transfer was successful a user will be given credit on their Centrapay wallet equal to the amount of the bank transfer. ",
- "url": "/api/funds-transfers",
- "relUrl": "/api/funds-transfers"
- },"68": {
- "doc": "Funds Transfers",
- "title": "Contents",
- "content": ". | Creating a top up | Get a top up | List top ups for authorized accounts | List top ups for an account EXPERIMENTAL | Creating a Withdrawal EXPERIMENTAL | Get a Withdrawal EXPERIMENTAL | List Withdrawals for an account EXPERIMENTAL | Abort Funds Transfer | . ",
- "url": "/api/funds-transfers#contents",
- "relUrl": "/api/funds-transfers#contents"
- },"69": {
- "doc": "Funds Transfers",
- "title": "Creating a top up",
- "content": "POST /api/topups . curl -X POST https://service.centrapay.com/api/topups \\ -H \"X-Api-Key: $api_key\" \\ -H \"Content-Type: application/json\" \\ -d '{ \"amount\": \"10000\", \"assetId\": \"Te2uDM7xhDLWGVJU3nzwnh\", \"bankAccountId\": \"FRhAzzWpTKb5U7pZygQjjY\" }' . Required Fields . | Field | Type | Description | . | amount | BigNumber | Total amount of the transaction in cents | . | assetId | String | The id of the asset | . | bankAccountId | String | The id of the bank account | . Example response payload . { \"id\": \"hg2RfYTQ635tPBZEPJdCre\", \"assetId\": \"Te2uDM7xhDLWGVJU3nzwnh\", \"bankAccountId\": \"FRhAzzWpTKb5U7pZygQjjY\", \"accountId\": \"aBc932S9182qwCDqwer\", \"type\": \"topup\", \"amount\": \"10000\", \"status\": \"created\", \"createdAt\": \"2020-05-01T12:30:00.000Z\", \"updatedAt\": \"2020-05-01T12:30:00.000Z\" } . Error Responses . | Status | Code | Description | . | 403 | BANK_AUTHORITY_WALLET_MISMATCH | The wallet and the bank account for the top up request do not belong to the same account. | . | 403 | MAX_INFLIGHT_TOPUPS_EXCEEDED | The bank account already has ten pending top ups, which is the maximum a bank authority can have at any one time. | . | 403 | MAX_INFLIGHT_TOPUP_AMOUNT_EXCEEDED | The top up can not be created because it is above the max amount of funds a bank account can have pending at any one time. The max amount is $1000.00 for verified bank accounts and $100.00 for non-verified bank accounts. | . | 403 | QUOTA_EXCEEDED | The topup exceeds one or more top up quota limits. See Quota Error Response. | . | 403 | DIRECT_DEBIT_NOT_AUTHORIZED | Bank account requires authorization for top up. See bank accounts direct debit endpoint. | . | 403 | INVALID_WALLET_TYPE | The wallet type does not support top ups. See settlement wallets. | . | 403 | BANK_ACCOUNT_TYPE_NOT_CONFIGURED_FOR_TOPUP | The bank account type is not configured for topups. Only centrapay type bank accounts are configured. | . ",
- "url": "/api/funds-transfers#creating-a-top-up",
- "relUrl": "/api/funds-transfers#creating-a-top-up"
- },"70": {
- "doc": "Funds Transfers",
- "title": "Get a top up",
- "content": "GET /api/topups/{topupId} . curl https://service.centrapay.com/api/topups/WRhAxxWpTKb5U7pXyxQjjY \\ -H \"X-Api-Key: $api_key\" . Example response payload . { \"id\": \"hg2RfYTQ635tPBZEPJdCre\", \"assetId\": \"Te2uDM7xhDLWGVJU3nzwnh\", \"bankAccountId\": \"FRhAzzWpTKb5U7pZygQjjY\", \"accountId\": \"aBc932S9182qwCDqwer\", \"type\": \"topup\", \"amount\": \"10000\", \"status\": \"created\", \"createdAt\": \"2020-05-01T12:30:00.000Z\", \"updatedAt\": \"2020-05-01T12:30:00.000Z\" } . ",
- "url": "/api/funds-transfers#get-a-top-up",
- "relUrl": "/api/funds-transfers#get-a-top-up"
- },"71": {
- "doc": "Funds Transfers",
- "title": "List top ups for authorized accounts",
- "content": "GET /api/topups . curl https://service.centrapay.com/api/topups \\ -H \"X-Api-Key: $api_key\" . Example response payload . [ { \"id\": \"5thg2RPBZEfYTPJdQ63Cre\", \"assetId\": \"Te2uDM7xhDLWGVJU3nzwnh\", \"bankAccountId\": \"FRhAzzWpTKb5U7pZygQjjY\", \"accountId\": \"aBc932S9182qwCDqwer\", \"type\": \"topup\", \"amount\": \"10000\", \"status\": \"created\", \"createdAt\": \"2020-05-01T12:30:00.000Z\", \"updatedAt\": \"2020-05-01T12:30:00.000Z\" }, { \"id\": \"hg2RfYTQ635tPBZEPJdCre\", \"assetId\": \"Te2uDM7xhDLWGVJU3nzwnh\", \"bankAccountId\": \"FRhAzzWpTKb5U7pZygQjjY\", \"accountId\": \"aBc932S9182qwCDqwer\", \"type\": \"topup\", \"amount\": \"10000\", \"status\": \"created\", \"createdAt\": \"2020-05-01T12:30:00.000Z\", \"updatedAt\": \"2020-05-01T12:30:00.000Z\" } ] . ",
- "url": "/api/funds-transfers#list-top-ups-for-authorized-accounts",
- "relUrl": "/api/funds-transfers#list-top-ups-for-authorized-accounts"
- },"72": {
- "doc": "Funds Transfers",
- "title": "List top ups for an account EXPERIMENTAL",
- "content": "GET /api/accounts/{accountId}/topups . curl https://service.centrapay.com/api/accounts/aBc932S9182qwCDqwer/topups \\ -H \"X-Api-Key: $api_key\" . Example response payload . [ { \"id\": \"5thg2RPBZEfYTPJdQ63Cre\", \"assetId\": \"Te2uDM7xhDLWGVJU3nzwnh\", \"bankAccountId\": \"FRhAzzWpTKb5U7pZygQjjY\", \"accountId\": \"aBc932S9182qwCDqwer\", \"type\": \"topup\", \"amount\": \"10000\", \"status\": \"created\", \"createdAt\": \"2020-05-01T12:30:00.000Z\", \"updatedAt\": \"2020-05-01T12:30:00.000Z\" }, { \"id\": \"hg2RfYTQ635tPBZEPJdCre\", \"assetId\": \"Te2uDM7xhDLWGVJU3nzwnh\", \"bankAccountId\": \"FRhAzzWpTKb5U7pZygQjjY\", \"accountId\": \"aBc932S9182qwCDqwer\", \"type\": \"topup\", \"amount\": \"10000\", \"status\": \"created\", \"createdAt\": \"2020-05-01T12:30:00.000Z\", \"updatedAt\": \"2020-05-01T12:30:00.000Z\" } ] . ",
- "url": "/api/funds-transfers#list-top-ups-for-an-account-experimental",
- "relUrl": "/api/funds-transfers#list-top-ups-for-an-account-experimental"
- },"73": {
- "doc": "Funds Transfers",
- "title": "Creating a Withdrawal EXPERIMENTAL",
- "content": "POST /api/withdrawals . curl -X POST https://service.centrapay.com/api/withdrawals \\ -H \"X-Api-Key: $api_key\" \\ -H \"Content-Type: application/json\" \\ -d '{ \"amount\": \"10000\", \"assetId\": \"Te2uDM7xhDLWGVJU3nzwnh\", \"bankAccountId\": \"FRhAzzWpTKb5U7pZygQjjY\" }' . Required Fields . | Field | Type | Description | . | amount | BigNumber | Total amount of the transaction in cents | . | assetId | String | The id of the asset | . | bankAccountId | String | The id of the bank account | . Example response payload . { \"id\": \"hg2RfYTQ635tPBZEPJdCre\", \"assetId\": \"Te2uDM7xhDLWGVJU3nzwnh\", \"bankAccountId\": \"FRhAzzWpTKb5U7pZygQjjY\", \"accountId\": \"aBc932S9182qwCDqwer\", \"type\": \"withdrawal\", \"amount\": \"10000\", \"status\": \"created\", \"createdAt\": \"2020-05-01T12:30:00.000Z\", \"updatedAt\": \"2020-05-01T12:30:00.000Z\" } . Error Responses . | Status | Code | Description | . | 403 | BANK_AUTHORITY_WALLET_MISMATCH | The wallet and the bank account for the withdrawal request do not belong to the same account. | . | 403 | INSUFFICIENT_WALLET_BALANCE | The wallet balance is less than the required amount. | . | 403 | INVALID_WALLET_TYPE | The wallet type does not support withdrawals. See settlement wallets. | . | 403 | BANK_ACCOUNT_TYPE_NOT_CONFIGURED_FOR_WITHDRAWAL | The bank account type is not configured for withdrawals. Only centrapay type bank accounts are configured. | . ",
- "url": "/api/funds-transfers#creating-a-withdrawal-experimental",
- "relUrl": "/api/funds-transfers#creating-a-withdrawal-experimental"
- },"74": {
- "doc": "Funds Transfers",
- "title": "Get a Withdrawal EXPERIMENTAL",
- "content": "GET /api/withdrawals/{withdrawalId} . curl https://service.centrapay.com/api/withdrawals/WRhAxxWpTKb5U7pXyxQjjY \\ -H \"X-Api-Key: $api_key\" . Example response payload . { \"id\": \"hg2RfYTQ635tPBZEPJdCre\", \"assetId\": \"Te2uDM7xhDLWGVJU3nzwnh\", \"bankAccountId\": \"FRhAzzWpTKb5U7pZygQjjY\", \"accountId\": \"aBc932S9182qwCDqwer\", \"type\": \"withdrawal\", \"amount\": \"10000\", \"status\": \"created\", \"createdAt\": \"2020-05-01T12:30:00.000Z\", \"updatedAt\": \"2020-05-01T12:30:00.000Z\" } . ",
- "url": "/api/funds-transfers#get-a-withdrawal-experimental",
- "relUrl": "/api/funds-transfers#get-a-withdrawal-experimental"
- },"75": {
- "doc": "Funds Transfers",
- "title": "List Withdrawals for an account EXPERIMENTAL",
- "content": "Returns a paginated list of Withdrawals for an account. GET /api/accounts/{accountId}/withdrawals . curl https://service.centrapay.com/api/accounts/aBc932S9182qwCDqwer/withdrawals \\ -H \"X-Api-Key: $api_key\" . Example response payload . { \"items\": [ { \"id\": \"5thg2RPBZEfYTPJdQ63Cre\", \"assetId\": \"Te2uDM7xhDLWGVJU3nzwnh\", \"bankAccountId\": \"FRhAzzWpTKb5U7pZygQjjY\", \"accountId\": \"aBc932S9182qwCDqwer\", \"type\": \"withdrawal\", \"amount\": \"10000\", \"status\": \"created\", \"createdAt\": \"2020-05-01T12:30:00.000Z\", \"updatedAt\": \"2020-05-01T12:30:00.000Z\" }, { \"id\": \"hg2RfYTQ635tPBZEPJdCre\", \"assetId\": \"Te2uDM7xhDLWGVJU3nzwnh\", \"bankAccountId\": \"FRhAzzWpTKb5U7pZygQjjY\", \"accountId\": \"aBc932S9182qwCDqwer\", \"type\": \"withdrawal\", \"amount\": \"10000\", \"status\": \"done\", \"createdAt\": \"2020-05-01T12:30:00.000Z\", \"updatedAt\": \"2020-05-01T12:30:00.000Z\" } ] } . ",
- "url": "/api/funds-transfers#list-withdrawals-for-an-account-experimental",
- "relUrl": "/api/funds-transfers#list-withdrawals-for-an-account-experimental"
- },"76": {
- "doc": "Funds Transfers",
- "title": "Abort Funds Transfer",
- "content": "POST /api/funds-transfers/{fundsTransferId}/abort . curl -X POST https://service.centrapay.com/api/funds-transfers/5thg2RPBZEfYTPJdQ63Cre/abort \\ -H \"X-Api-Key: $api_key\" . Example response payload . { } . Error Responses . | Status | Code | Description | . | 403 | ABORT_WITHDRAWAL_NOT_SUPPORTED | Aborting funds transfers of type withdrawal is not supported. | . | 403 | FUNDS_TRANSFER_ALREADY_COMPLETE | The funds transfer is already complete. | . ",
- "url": "/api/funds-transfers#abort-funds-transfer",
- "relUrl": "/api/funds-transfers#abort-funds-transfer"
- },"77": {
- "doc": "HTTP Status Codes",
- "title": "HTTP Status Codes",
- "content": "Centrapay APIs respond with 200, 400, 401, 403, 404, or 429 HTTP status codes. In rare cases endpoints may respond with 5xx status codes. Some legacy or deprecated endpoints may have exceptions to the guidelines documented here. Any such exceptions will be documented on the endpoints. ",
- "url": "/api/http-status-codes",
- "relUrl": "/api/http-status-codes"
- },"78": {
- "doc": "HTTP Status Codes",
- "title": "Contents",
- "content": ". | 200 Ok | 400 Malformed Request | 401 Unauthorized | 403 Forbidden . | Resource missing or permission denied | Business rule violated | . | 404 Route Not Found | 429 Too Many Requests | 5xx Server Error | . ",
- "url": "/api/http-status-codes#contents",
- "relUrl": "/api/http-status-codes#contents"
- },"79": {
- "doc": "HTTP Status Codes",
- "title": "200 Ok",
- "content": "Everything’s ok. Enjoy your well formed response! . ",
- "url": "/api/http-status-codes#200-ok",
- "relUrl": "/api/http-status-codes#200-ok"
- },"80": {
- "doc": "HTTP Status Codes",
- "title": "400 Malformed Request",
- "content": "This is a syntax failure. When you get these back, your application needs to change the way it behaves in order to get back the resource that you’re after. Don’t try again, this is never going to work. Example response body . { \"statusCode\": 400, \"message\": \"amount is required\" } . Debugging . | Make sure you set “content-type: application/json” | The response body should indicate where the error is | Make sure your HTTP body fields are set correctly | Check your HTTP verb is correct (POST, PUT, GET etc.) | Check query parameters are set correctly | Check path parameters are set correctly | . ",
- "url": "/api/http-status-codes#400-malformed-request",
- "relUrl": "/api/http-status-codes#400-malformed-request"
- },"81": {
- "doc": "HTTP Status Codes",
- "title": "401 Unauthorized",
- "content": "API key or JWT is missing, expired or invalid. Go look at our Auth documentation. Example response body . { \"statusCode\": 401, \"error\": \"Unauthorized\", \"message\": \"Missing authentication\" } . ",
- "url": "/api/http-status-codes#401-unauthorized",
- "relUrl": "/api/http-status-codes#401-unauthorized"
- },"82": {
- "doc": "HTTP Status Codes",
- "title": "403 Forbidden",
- "content": "A 403 status indicates resource missing, permission denied or business rule violation. Resource missing or permission denied . Example response body . { \"statusCode\": 403, \"error\": \"Forbidden\", \"message\": \"Forbidden\" } . Debugging . | Check the resource id is correct | Check your user or API key has membership for the account that owns the resource you are accessing. | Check the role of your user or API key has permission (See Auth Permissions). | . Business rule violated . When the resource exists and access is authorized but some other business rule is violated then a 403 is returned. Additional information will be included in the “message” field of the response body. The possible values for the “message” field will be documented on each endpoint. Example response body . { \"statusCode\": 403, \"error\": \"Forbidden\", \"message\": \"INSUFFICIENT_BALANCE\" } . ",
- "url": "/api/http-status-codes#403-forbidden",
- "relUrl": "/api/http-status-codes#403-forbidden"
- },"83": {
- "doc": "HTTP Status Codes",
- "title": "404 Route Not Found",
- "content": "Variant on a 400, there’s a bug in your code that means you’ve got a typo in the URL or HTTP method. Please check against examples in our documentation. Example response body . { \"statusCode\": 404, \"error\": \"Not Found\", \"message\": \"Not Found\" } . ",
- "url": "/api/http-status-codes#404-route-not-found",
- "relUrl": "/api/http-status-codes#404-route-not-found"
- },"84": {
- "doc": "HTTP Status Codes",
- "title": "429 Too Many Requests",
- "content": "Centrapay API rate limits have been exceeded. Example response body . { \"statusCode\": 429, \"error\": \"Too Many Requests\", \"message\": \"RATE_LIMIT_EXCEEDED\" } . Debugging . | Check the Retry-After HTTP response header for the number of seconds before the next request will be accepted. | Contact integrations@centrapay.com to increase your limits. | . ",
- "url": "/api/http-status-codes#429-too-many-requests",
- "relUrl": "/api/http-status-codes#429-too-many-requests"
- },"85": {
- "doc": "HTTP Status Codes",
- "title": "5xx Server Error",
- "content": "If you get a 500 level error, something has gone wrong on our end. Retrying should solve the issue. Usually a Centrapay Engineer will investigate but bug reports are also welcome at integrations@centrapay.com. ",
- "url": "/api/http-status-codes#5xx-server-error",
- "relUrl": "/api/http-status-codes#5xx-server-error"
- },"86": {
- "doc": "Payment Requests",
- "title": "Payment Requests",
- "content": " ",
- "url": "/api/section/payment-requests",
- "relUrl": "/api/section/payment-requests"
- },"87": {
- "doc": "Assets",
- "title": "Assets",
- "content": " ",
- "url": "/api/section/assets",
- "relUrl": "/api/section/assets"
- },"88": {
- "doc": "Settlements",
- "title": "Settlements",
- "content": " ",
- "url": "/api/section/settlements",
- "relUrl": "/api/section/settlements"
- },"89": {
- "doc": "Batches",
- "title": "Batches",
- "content": " ",
- "url": "/api/section/batches",
- "relUrl": "/api/section/batches"
- },"90": {
- "doc": "Accounts",
- "title": "Accounts",
- "content": " ",
- "url": "/api/section/accounts",
- "relUrl": "/api/section/accounts"
- },"91": {
- "doc": "Integrations",
- "title": "Integrations",
- "content": " ",
- "url": "/api/section/integrations",
- "relUrl": "/api/section/integrations"
- },"92": {
- "doc": "Scanned Codes",
- "title": "Scanned Codes",
- "content": " ",
- "url": "/api/section/scanned-codes",
- "relUrl": "/api/section/scanned-codes"
- },"93": {
- "doc": "Merchants",
- "title": "Merchants",
- "content": " ",
- "url": "/api/section/merchants",
- "relUrl": "/api/section/merchants"
- },"94": {
- "doc": "Bank Accounts",
- "title": "Bank Accounts",
- "content": " ",
- "url": "/api/section/bank-accounts",
- "relUrl": "/api/section/bank-accounts"
- },"95": {
- "doc": "API Reference",
- "title": "API Reference",
- "content": " ",
- "url": "/api",
- "relUrl": "/api"
- },"96": {
- "doc": "Getting Started",
- "title": "Getting Started",
- "content": "Welcome to Centrapay! We enable you to transact fiat currency, giftcards, digital assets and vouchers via your point of sale, payment terminal, shopping cart or unattended device. We accomplish this via our APIs which allow merchants, customers, terminals, and smart wallets to interact with each other. Checkout our [Guides][] for hints on where to begin or see the API Reference for a deeper dive. For more help getting setup, contact us via email at integrations@centrapay.com. ",
- "url": "/",
- "relUrl": "/"
- },"97": {
- "doc": "Integration Requests",
- "title": "Integration Requests",
- "content": "An Integration Request allows Centrapay users to request the creation of an Integration on a Centrapay account. ",
- "url": "/api/integration-requests",
- "relUrl": "/api/integration-requests"
- },"98": {
- "doc": "Integration Requests",
- "title": "Contents",
- "content": ". | Models . | Integration Request | Terminal | Product | Integration Types | . | Operations . | Create an Integration Request EXPERIMENTAL | Get an Integration Request EXPERIMENTAL | Search Integration Requests EXPERIMENTAL | Configure Integration Request EXPERIMENTAL | Get Integration Request Configuration EXPERIMENTAL | Activate Integration Request EXPERIMENTAL | Delete Integration Request EXPERIMENTAL | . | . ",
- "url": "/api/integration-requests#contents",
- "relUrl": "/api/integration-requests#contents"
- },"99": {
- "doc": "Integration Requests",
- "title": "Models",
- "content": "Integration Request . Mandatory Fields . | Field | Type | Description | . | id | String | The Integration Request’s unique identifier. | . | accountId | String | The Integration Request’s owning Centrapay Account id. | . | merchantId | String | The Merchant id for the Integration Request. | . | type | String | The type of the Integration Request. Refer to Integration Types. | . | status | String | The current status of the Integration Request. Supported values are active, available, pending, rejected and disabled. | . Optional Fields . | Field | Type | Description | . | terminalId | String | The payment system terminal id. Required for NZ Epay integration. | . | terminal | Terminal | The terminal configuration. Required for all terminal vendors except Vista. | . | product | Product | The requested Epay gift card types to support. | . Terminal . Required Fields . | Field | Type | Description | . | terminalId | String | The software or logical id of the payment terminal. | . Optional Fields . | Field | Type | Description | . | deviceId | String | The hardware id or serial number of the payment terminal. | . Product . Required Fields . | Field | Type | Description | . | name | String | The name of the requested Epay product. | . Integration Types . | Name | Description | . | verifone | Terminal vendor Verifone | . | windcave | Terminal vendor Windcave | . | epay | Asset provider ePay | . | smartpay | Terminal vendor smartpay | . | invenco | Terminal vendor invenco | . | skyzer | Terminal vendor skyzer | . | vista | Terminal vendor vista | . ",
- "url": "/api/integration-requests#models",
- "relUrl": "/api/integration-requests#models"
- },"100": {
- "doc": "Integration Requests",
- "title": "Operations",
- "content": "Create an Integration Request EXPERIMENTAL . POST /api/integration-requests . curl -X POST https://service.centrapay.com/api/integration-requests \\ -H \"X-Api-Key: $api_key\" \\ -H \"Content-Type: application/json\" \\ -d '{ \"merchantId\": \"5ee0c486308f590260d9a07f\", \"type\": \"verifone\", \"terminal\": { \"terminalId\": \"002039390093939\", \"deviceId\": \"002-039-390\" } }' . curl -X POST https://service.centrapay.com/api/integration-requests \\ -H \"X-Api-Key: $api_key\" \\ -H \"Content-Type: application/json\" \\ -d '{ \"merchantId\": \"5ee0c486308f590260d9a07f\", \"type\": \"epay\", \"product\": { \"name\": \"koha-card\" } }' . Required Fields . | Field | Type | Description | . | merchantId | String | The Merchant id for the Integration Request. | . | type | String | The type of the Integration Request. | . Optional Fields . | Field | Type | Description | . | terminal | Terminal | The terminal configuration. Required for Verifone and Windcave integration. | . | product | Product | The requested Epay gift card types to support. | . Example response payload . { \"id\": \"DKTs3U38hdhfEqwF1JKoT2\", \"accountId\": \"Jaim1Cu1Q55uooxSens6yk\", \"merchantId\": \"5ee0c486308f590260d9a07f\", \"type\": \"verifone\", \"status\": \"pending\", \"createdAt\": \"2020-06-12 01:17:46 UTC\", \"updatedAt\": \"2020-06-12 01:17:46 UTC\", \"createdBy\": \"crn:WIj211vFs9cNACwBb04vQw:api-key:MyApiKey\", \"updatedBy\": \"crn:WIj211vFs9cNACwBb04vQw:api-key:MyApiKey\", \"terminal\": { \"terminalId\": \"002039390093939\", \"deviceId\": \"002-039-390\" } } . { \"id\": \"DKTs3U38hdhfEqwF1JKoT2\", \"accountId\": \"Jaim1Cu1Q55uooxSens6yk\", \"merchantId\": \"5ee0c486308f590260d9a07f\", \"type\": \"epay\", \"status\": \"pending\", \"createdAt\": \"2020-06-12 01:17:46 UTC\", \"updatedAt\": \"2020-06-12 01:17:46 UTC\", \"createdBy\": \"crn:WIj211vFs9cNACwBb04vQw:api-key:MyApiKey\", \"updatedBy\": \"crn:WIj211vFs9cNACwBb04vQw:api-key:MyApiKey\", \"product\": { \"name\": \"koha-card\" } } . Get an Integration Request EXPERIMENTAL . GET /api/integration-requests/{integrationRequestId} . curl https://service.centrapay.com/api/integration-requests/DKTs3U38hdhfEqwF1JKoT2 \\ -H \"X-Api-Key: $api_key\" . Example response payload . { \"id\": \"DKTs3U38hdhfEqwF1JKoT2\", \"accountId\": \"Jaim1Cu1Q55uooxSens6yk\", \"merchantId\": \"5ee0c486308f590260d9a07f\", \"type\": \"epay\", \"status\": \"pending\", \"terminalId\": \"11000021\", \"createdAt\": \"2020-06-12T01:17:46.499Z\", \"updatedAt\": \"2020-06-12T01:17:46.499Z\", \"createdBy\": \"crn:WIj211vFs9cNACwBb04vQw:api-key:MyApiKey\", \"updatedBy\": \"crn:WIj211vFs9cNACwBb04vQw:api-key:MyApiKey\", \"product\": { \"name\": \"koha-card\" } } . Search Integration Requests EXPERIMENTAL . Returns a paginated list of Integration Requests. GET /api/integration-requests . curl -G https://service.centrapay.com/api/integration-requests \\ -H \"X-Api-Key: $api_key\" \\ -d type=epay \\ -d pending=true \\ -d accountId=Jaim1Cu1Q55uooxSens6yk . Query Parameters . | Parameter | Description | . | accountId | The Integration Request’s owning Centrapay Account id. Required unless caller has global read access permission. | . | type | The type of Integration Request. | . | pending | When set to true, only include Integration Requests with pending status. | . Example response payload . { \"items\": [ { \"id\": \"DKTs3U38hdhfEqwF1JKoT2\", \"accountId\": \"Jaim1Cu1Q55uooxSens6yk\", \"merchantId\": \"5ee0c486308f590260d9a07f\", \"type\": \"epay\", \"status\": \"pending\", \"terminalId\": \"11000021\", \"createdAt\": \"2020-06-12T01:17:46.499Z\", \"updatedAt\": \"2020-06-12T01:17:46.499Z\", \"createdBy\": \"crn:WIj211vFs9cNACwBb04vQw:api-key:MyApiKey\", \"updatedBy\": \"crn:WIj211vFs9cNACwBb04vQw:api-key:MyApiKey\", \"product\": { \"name\": \"koha-card\" } } ] } . Configure Integration Request EXPERIMENTAL . Supply configuration values for the Integration Request. PUT /api/integration-requests/{integrationRequestId}/configs . curl -X PUT https://service.centrapay.com/api/integration-requests/DKTs3U38hdhfEqwF1JKoT2/configs \\ -H \"X-Api-Key: $api_key\" \\ -H \"Content-Type: application/json\" \\ -d '{ \"terminalId\": \"11000021\" }' . Optional Fields . | Field | Type | Description | . | terminalId | String | Epay terminalId for the Integration Request. Required if type is epay. | . Example response payload . { \"id\": \"DKTs3U38hdhfEqwF1JKoT2\", \"accountId\": \"Jaim1Cu1Q55uooxSens6yk\", \"merchantId\": \"5ee0c486308f590260d9a07f\", \"type\": \"epay\", \"status\": \"pending\", \"terminalId\": \"11000021\", \"createdAt\": \"2020-06-12T01:17:46.499Z\", \"updatedAt\": \"2020-06-12T01:17:46.499Z\", \"createdBy\": \"crn:WIj211vFs9cNACwBb04vQw:api-key:MyApiKey\", \"updatedBy\": \"crn:WIj211vFs9cNACwBb04vQw:api-key:MyApiKey\", \"product\": { \"name\": \"koha-card\" } } . Get Integration Request Configuration EXPERIMENTAL . GET /api/integration-requests/{integrationRequestId}/configs . curl https://service.centrapay.com/api/integration-requests/DKTs3U38hdhfEqwF1JKoT2/configs \\ -H \"X-Api-Key: $api_key\" . Example response payload . { \"terminalId\": \"11000021\" } . Activate Integration Request EXPERIMENTAL . POST /api/integration-requests/{integrationRequestId}/activate . curl -X POST https://service.centrapay.com/api/integration-requests/DKTs3U38hdhfEqwF1JKoT2/activate \\ -H \"X-Api-Key: $api_key\" . Example response payload . { \"id\": \"DKTs3U38hdhfEqwF1JKoT2\", \"accountId\": \"Jaim1Cu1Q55uooxSens6yk\", \"merchantId\": \"5ee0c486308f590260d9a07f\", \"type\": \"epay\", \"status\": \"active\", \"terminalId\": \"11000021\", \"createdAt\": \"2020-06-12T01:17:46.499Z\", \"updatedAt\": \"2020-06-12T01:17:46.499Z\", \"createdBy\": \"crn:WIj211vFs9cNACwBb04vQw:api-key:MyApiKey\", \"updatedBy\": \"crn:WIj211vFs9cNACwBb04vQw:api-key:MyApiKey\", \"product\": { \"name\": \"koha-card\" } } . Error Responses . | Status | Code | Description | . | 403 | INTEGRATION_PARAM_MISSING | Integration Request needs updating with the required parameters before activating. | . | 403 | INTEGRATION_ALREADY_ACTIVATED | Integration Request is already activated. | . Delete Integration Request EXPERIMENTAL . DELETE /api/integration-requests/{integrationRequestId} . curl -X DELETE https://service.centrapay.com/api/integration-requests/DKTs3U38hdhfEqwF1JKoT2 \\ -H \"X-Api-Key: $api_key\" . Example response payload . { } . ",
- "url": "/api/integration-requests#operations",
- "relUrl": "/api/integration-requests#operations"
- },"101": {
- "doc": "Integrations",
- "title": "Integrations",
- "content": "An Integration is a configured connection between a Centrapay account and a third party. An Integration can be created as an Integration Request, as a Managed Integration, or directly by Centrapay administrators. ",
- "url": "/api/integrations",
- "relUrl": "/api/integrations"
- },"102": {
- "doc": "API Introduction",
- "title": "API Introduction",
- "content": "The Centrapay API is an RMM level 2 RESTful web service which expresses operations in terms of HTTP verbs on resource-oriented URLs. API endpoint definitions in these docs are grouped by resource type along with definitions for the associated resource types. Most API calls require authentication using an API key or JWT. HTTP requests and responses usually have JSON payloads and use “application/json” as the content type. Some API features may be flagged as EXPERIMENTAL. These API features may be removed or changed without warning and should not be relied on in a production setting. | Auth | HTTP Status Codes | Data Types | Pagination | API Keys | Accounts | Assets | Bank Accounts | Batches | Integrations | Invitations | Media Uploads | Merchants | Payment Requests | Profiles | Quotas | Scanned Codes | Settlements | . ",
- "url": "/api/introduction",
- "relUrl": "/api/introduction"
- },"103": {
- "doc": "Invitations",
- "title": "Invitations",
- "content": "An Invitation can be used to allow users to claim ownership of a resource on the Centrapay platform. ",
- "url": "/api/invitations.html",
- "relUrl": "/api/invitations.html"
- },"104": {
- "doc": "Invitations",
- "title": "Contents",
- "content": ". | Models . | Invitation | Params | . | Operations . | Create an Invitation EXPERIMENTAL | Get an Invitation by code EXPERIMENTAL | List Invitations by accountId EXPERIMENTAL | Accept an Invitation EXPERIMENTAL | Revoke an invitation EXPERIMENTAL | . | . ",
- "url": "/api/invitations.html#contents",
- "relUrl": "/api/invitations.html#contents"
- },"105": {
- "doc": "Invitations",
- "title": "Models",
- "content": "Invitation . Mandatory Fields . | Field | Type | Description | . | id | String | The Invitation’s unique identifier. | . | code | String | The Invitation code. | . | type | String | The type of invitation. Supported values are account-membership. | . | resourceId | String | The id of the related resource. | . | resourceType | String | The type of the related resource. Supported values are account. | . | expiresAt | Timestamp | When the Invitation expires. | . | createdAt | Timestamp | When the Invitation was created. | . | createdBy | CRN | The User or API Key that created the Invitation. | . | updatedAt | Timestamp | When the Invitation was updated. | . | updatedBy | CRN | The User or API Key that updated the Invitation. | . Optional Fields . | Field | Type | Description | . | accepted | Boolean | A flag indicating whether the Invitation has been accepted. | . | acceptedAt | Timestamp | When the Invitation was accepted. | . | acceptedBy | CRN | The User or API Key that accepted the Invitation. | . | acceptedByAccountId | String | The Account id of the user accepting the Invitation. | . | recipientAlias | String | The email address of the user accepting the Invitation. | . | params | Object | Params dependent on the Invitation type. | . | status | String | The status of the invitation. Possible values are created, sent, accepted and revoked | . Params . | Field | Type | Description | . | role | String | The role assigned to the recipient, for invitations of type account-membership. | . | accountName | String | The name of the account that the recipient is invited to, for invitations of type account-membership | . ",
- "url": "/api/invitations.html#models",
- "relUrl": "/api/invitations.html#models"
- },"106": {
- "doc": "Invitations",
- "title": "Operations",
- "content": "Create an Invitation EXPERIMENTAL . POST /api/invitations . curl -X POST https://service.centrapay.com/api/invitations \\ -H \"X-Api-Key: $api_key\" \\ -H \"Content-Type: application/json\" \\ -d '{ \"type\": \"account-membership\", \"resourceId\": \"Hopo4g34sLVdjEMBs2p19F\", \"resourceType\": \"account\", \"recipientAlias\": \"user@org.com\", \"params\": { \"role\": \"cashier\" } }' . Required Fields . | Field | Type | Description | . | type | String | The type of invitation. Supported values are account-membership. | . | resourceId | String | The id of the related resource. | . | resourceType | String | The type of the related resource. Supported values are account. | . | recipientAlias | String | The email address of the user accepting the Invitation. | . | params | Object | Params depending on the Invitation type. | . | role | String | The role that will be assigned to the user when the Invitation is accepted. | . Example response payload . { \"id\": \"DKTs3U38hdhfEqwF1JKoT2\", \"code\": \"WIj211vFs9cNACwBb04vQw\", \"type\": \"account-membership\", \"resourceId\": \"Hopo4g34sLVdjEMBs2p19F\", \"resourceType\": \"account\", \"expiresAt\": \"2021-08-26T00:02:49.488Z\", \"createdAt\": \"2021-08-25T00:02:49.488Z\", \"createdBy\": \"crn:WIj211vFs9cNACwBb04vQw:api-key:MyApiKey\", \"updatedAt\": \"2021-08-25T00:02:49.488Z\", \"updatedBy\": \"crn:WIj211vFs9cNACwBb04vQw:api-key:MyApiKey\", \"recipientAlias\": \"user@org.com\", \"params\": { \"role\": \"cashier\", \"accountName\": \"Centrapay Cafe\" }, \"status\": \"created\" } . Error Responses . | Status | Code | Description | . | 403 | INVALID_ACCOUNT_TYPE | The resourceId is associated with an account with a non org type. | . | 403 | RECIPIENT_ALREADY_INVITED | An active invitation for this recipientAlias and resource already exists, or the recipient has already joined the resource. | . Get an Invitation by code EXPERIMENTAL . GET /api/invitations/code/{code} . curl https://service.centrapay.com/api/invitations/code/WIj211vFs9cNACwBb04vQw \\ -H \"X-Api-Key: $api_key\" . Example response payload . { \"id\": \"DKTs3U38hdhfEqwF1JKoT2\", \"code\": \"WIj211vFs9cNACwBb04vQw\", \"type\": \"account-membership\", \"resourceId\": \"5ee0c486308f590260d9a07f\", \"resourceType\": \"account\", \"expiresAt\": \"2021-08-26T00:02:49.488Z\", \"createdAt\": \"2021-08-25T00:02:49.488Z\", \"createdBy\": \"crn:WIj211vFs9cNACwBb04vQw:api-key:MyApiKey\", \"updatedAt\": \"2021-08-25T00:02:49.488Z\", \"updatedBy\": \"crn:WIj211vFs9cNACwBb04vQw:api-key:MyApiKey\" } . List Invitations by accountId EXPERIMENTAL . GET /api/accounts/{accountId}/invitations . curl https://service.centrapay.com/api/accounts/{accountId}/invitations \\ -H \"X-Api-Key: $api_key\" . Example response payload . { \"items\": [ { \"id\": \"DKTs3U38hdhfEqwF1JKoT2\", \"code\": \"WIj211vFs9cNACwBb04vQw\", \"type\": \"account-membership\", \"resourceId\": \"Hopo4g34sLVdjEMBs2p19F\", \"resourceType\": \"account\", \"expiresAt\": \"2021-08-26T00:02:49.488Z\", \"createdAt\": \"2021-08-25T00:02:49.488Z\", \"createdBy\": \"crn:WIj211vFs9cNACwBb04vQw:api-key:MyApiKey\", \"updatedAt\": \"2021-08-25T00:02:49.488Z\", \"updatedBy\": \"crn:WIj211vFs9cNACwBb04vQw:api-key:MyApiKey\", \"recipientAlias\": \"user@org.com\", \"params\": { \"role\": \"account-owner\", \"accountName\": \"Centrapay Cafe\" }, \"status\": \"created\" }, { \"id\": \"JKKDMU38hd01hfEqwF1oT2\", \"code\": \"WIj211vFs9cNACwBb04vQw\", \"type\": \"account-membership\", \"resourceId\": \"Hopo4g34sLVdjEMBs2p19F\", \"resourceType\": \"account\", \"expiresAt\": \"2021-08-26T00:02:49.488Z\", \"createdAt\": \"2021-08-25T00:02:49.488Z\", \"createdBy\": \"crn:WIj211vFs9cNACwBb04vQw:api-key:MyApiKey\", \"updatedAt\": \"2021-08-25T00:02:49.488Z\", \"updatedBy\": \"crn:WIj211vFs9cNACwBb04vQw:api-key:MyApiKey\", \"recipientAlias\": \"john.doe@org.com\", \"params\": { \"role\": \"cashier\", \"accountName\": \"Centrapay Tea Warehouse\" }, \"status\": \"sent\" } ] } . Accept an Invitation EXPERIMENTAL . POST /api/invitations/{invitationId}/accept . curl -X POST https://service.centrapay.com/api/invitations/DKTs3U38hdhfEqwF1JKoT2/accept \\ -H \"X-Api-Key: $api_key\" \\ -H \"Content-Type: application/json\" \\ -d '{ \"code\": \"WIj211vFs9cNACwBb04vQw\", \"accountId\": \"Jaim1Cu1Q55uooxSens6yk\" }' . Required Fields . | Field | Type | Description | . | code | String | The Invitation code. | . | accountId | String | The Account id of the user accepting the Invitation. | . Example response payload . { \"id\": \"DKTs3U38hdhfEqwF1JKoT2\", \"code\": \"WIj211vFs9cNACwBb04vQw\", \"type\": \"account-membership\", \"resourceId\": \"5ee0c486308f590260d9a07f\", \"resourceType\": \"account\", \"expiresAt\": \"2021-08-26T00:02:49.488Z\", \"createdAt\": \"2021-08-25T00:02:49.488Z\", \"createdBy\": \"crn:WIj211vFs9cNACwBb04vQw:api-key:MyApiKey\", \"accepted\": true, \"acceptedAt\": \"2021-08-25T10:12:22.122Z\", \"acceptedBy\": \"crn::user:e2837e88-d408-11eb-8eac-3e22fb52e878\", \"acceptedByAccountId\": \"Jaim1Cu1Q55uooxSens6yk\", \"updatedAt\": \"2021-08-25T10:12:22.122Z\", \"updatedBy\": \"crn::user:e2837e88-d408-11eb-8eac-3e22fb52e878\" } . Error Responses . | Status | Code | Description | . | 403 | INVITATION_EXPIRED | The Invitation is expired. | . | 403 | INVITATION_ALREADY_ACCEPTED | The Invitation has already been accepted. | . | 403 | RECIPIENT_ALIAS_MISMATCH | The alias of the user accepting an Invitation is not the same as the recipientAlias of the Invitation. | . | 403 | INVITATION_REVOKED | The Invitation was revoked. | . Revoke an invitation EXPERIMENTAL . POST /api/invitations/{invitationId}/revoke . curl -X POST https://service.centrapay.com/api/invitations/DKTs3U38hdhfEqwF1JKoT2/revoke \\ -H \"X-Api-Key: $api_key\" . Example response payload . { \"id\": \"DKTs3U38hdhfEqwF1JKoT2\", \"code\": \"WIj211vFs9cNACwBb04vQw\", \"type\": \"account-membership\", \"resourceId\": \"Hopo4g34sLVdjEMBs2p19F\", \"resourceType\": \"account\", \"recipientAlias\": \"user@org.com\", \"params\": { \"role\": \"cashier\", \"accountName\": \"Centrapay Cafe\" }, \"createdAt\": \"2021-08-25T00:02:49.488Z\", \"expiresAt\": \"2021-08-26T00:02:49.488Z\", \"createdBy\": \"crn::user:1234\", \"updatedAt\": \"2021-08-25T00:00:00.000Z\", \"updatedBy\": \"crn::user:1234\", \"status\": \"revoked\" } . Error Responses . | Status | Code | Description | . | 403 | INVITATION_EXPIRED | The Invitation is expired. | . | 403 | INVITATION_ACCEPTED | The Invitation has already been accepted. | . ",
- "url": "/api/invitations.html#operations",
- "relUrl": "/api/invitations.html#operations"
- },"107": {
- "doc": "Legacy",
- "title": "Legacy Payment Requests",
- "content": "Centrapay Payment Requests are serviced via two sets of endpoints; the “next” version (documented Payment Requests) and the “legacy” version (documented on this page). Use of legacy endpoints for new integrations is discouraged where alternative endpoints have been provided. Legacy Payment Request endpoints also have interactive Swagger documentation. ",
- "url": "/api/legacy-payment-requests#legacy-payment-requests",
- "relUrl": "/api/legacy-payment-requests#legacy-payment-requests"
- },"108": {
- "doc": "Legacy",
- "title": "Contents",
- "content": ". | Operations . | Creating a payment request | Getting the information about a payment request | Paying a payment request | Cancelling a payment request | Voiding a payment request | Refunding a transaction | . | Webhooks . | Life-cycle Events That Trigger Webhooks | Webhook Payload | Webhook JWT Validation | Decoded Webhook JWT Examples | . | . ",
- "url": "/api/legacy-payment-requests#contents",
- "relUrl": "/api/legacy-payment-requests#contents"
- },"109": {
- "doc": "Legacy",
- "title": "Operations",
- "content": ". Creating a payment request . Swagger Docs . POST /payments/api/requests.create . curl -X POST https://service.centrapay.com/payments/api/requests.create \\ -H \"X-Api-Key: $api_key\" \\ -d merchantId=5efbe17d96c083633e2b9241 \\ -d clientId=5efbe2fb96c08357bb2b9242 \\ -d amount=300 \\ -d asset=NZD . Required Parameters . | Parameter | Description | . | amount | The payment amount in cents | . | asset | The currency code (e.g. ‘NZD’) | . | merchantId | The id of the merchant creating the request | . | clientId | The id of the merchant specific client configuration | . See Asset Types for the list of possible asset values for each Asset Type. Optional Parameters . | Parameter | Description | . | description | Description of the payment | . | externalReference | Unique merchant reference for the payment request | . | notifyUrl | The URL that will receive POST requests from the webhook | . | paymentExpirySeconds | The amount of seconds until a request expires, must be an integer greater than 0 and less than 86400 (24 hours) | . | terminalId | The payment system terminal Id. Required for NZ Epay integration. | . | deviceId | Physical payment system device Id | . | patronCode | Associate this payment request with an active Patron Code. | . Error Responses . | Status | Code | Description | . | 400 | CHECKSUM_FAILED | patronCode luhn checksum digit doesn’t pass. | . | 403 | PATRON_CODE_INVALID | patronCode doesn’t exist or has expired. | . | 403 | MERCHANT_CONFIGURATION_NOT_FOUND | There was no merchant configuration found for the supplied merchantId and clientId. | . | 403 | NO_AVAILABLE_PAYMENT_OPTIONS | No payment options match the requested payment parameters. | . Getting the information about a payment request . Swagger Docs . GET /payments/api/requests.info . curl -G https://service.centrapay.com/payments/api/requests.info \\ -H \"X-Api-Key: $api_key\" \\ -d requestId=TyqV56mEkNLUeiY2QskHNR . Required Parameters . | Parameter | Description | . | requestId | The payment requestId that is generated when requests.create is called | . Error Responses . | Http code | Error code | Message | Description | . | 404 | 2 | REQUEST_NOT_FOUND | The provided request doesn’t exist. | . Example response payload of a new request . { \"requestId\": \"TyqV56mEkNLUeiY2QskHNR\", \"shortCode\": \"CP-C7F-ZS5\", \"merchantId\": \"5efbe17d96c083633e2b9241\", \"merchantName\": \"NZD Test Merchant\", \"clientId\": \"5efbe2fb96c08357bb2b9242\", \"denomination\": { \"asset\": \"NZD\", \"amount\": 100 }, \"payments\": [ { \"ledger\": \"centrapay.nzd.test\", \"amount\": 100, \"methods\": [ \"qr_code\" ] } ], \"qrCode\": \"https://app.centrapay.com/pay/TyqV56mEkNLUeiY2QskHNR\", \"requestCode\": \"https://app.centrapay.com/pay/TyqV56mEkNLUeiY2QskHNR\", \"status\": \"new\", \"createdAt\": \"2021-11-29T23:04:54.253Z\", \"updatedAt\": \"2021-11-29T23:04:54.253Z\", \"liveness\": \"test\", \"paymentExpirySeconds\": 120 } . Example response payload of a paid request . { \"requestId\": \"TyqV56mEkNLUeiY2QskHNR\", \"shortCode\": \"CP-C7F-ZS5\", \"merchantId\": \"5efbe17d96c083633e2b9241\", \"merchantName\": \"NZD Test Merchant\", \"clientId\": \"5efbe2fb96c08357bb2b9242\", \"denomination\": { \"asset\": \"NZD\", \"amount\": 100 }, \"payments\": [ { \"ledger\": \"centrapay.nzd.test\", \"amount\": 100, \"methods\": [ \"qr_code\" ] } ], \"qrCode\": \"https://app.centrapay.com/pay/TyqV56mEkNLUeiY2QskHNR\", \"requestCode\": \"https://app.centrapay.com/pay/TyqV56mEkNLUeiY2QskHNR\", \"status\": \"paid\", \"createdAt\": \"2021-11-29T23:04:54.253Z\", \"updatedAt\": \"2021-11-29T23:05:38.254Z\", \"liveness\": \"test\", \"paymentExpirySeconds\": 120, \"paidBy\": { \"ledger\": \"centrapay.nzd.test\", \"type\": \"centrapay.nzd.test\", \"authCode\": \"3MhaANvdS79qhvAj6nYFNT\", \"responseCode\": \"1234\", \"receipt\": \"\", \"v2\": true, \"paidAt\": \"2021-11-29T23:05:38.000Z\", \"amount\": 100, \"account\": \"3MhaANvdS79qhvAj6nYFNT\", \"transactionId\": \"TyqV56mEkNLUeiY2QskHNR\", \"description\": \"Centrapay Test NZD\", \"settlementDate\": \"2021-11-29T23:05:38.000Z\", \"assetTotals\": [ { \"type\": \"centrapay.nzd.test\", \"description\": \"Centrapay Test NZD\", \"settlementDate\": \"2021-11-29T23:05:38.000Z\", \"total\": { \"amount\": \"100\", \"currency\": \"NZD\" } } ] } } . Paying a payment request . Swagger Docs . POST /payments/api/requests.pay . curl -X POST https://service.centrapay.com/payments/api/requests.pay \\ -H \"X-Api-Key: $api_key\" \\ -d authorization=4a936ad82d8e51ae0afc317e944bfa569d935a45206b49b67117ee8aaa04a3b1 \\ -d ledger=g.crypto.bitcoin.mainnet \\ -d requestId=7d2b1d52-b609-4ccd-b4cc-c4a9af881bd9 . Required Parameters . | Parameter | Description | . | requestId | The id of the payment request to pay. See requests.create. | . | ledger | The selected payment option to use. See below for expected values. | . | authorization | An identifier that can be used to pay or verify payment. See below for expected values. | . Expected Ledger and Authorization Values . The “ledger” parameter indicates which payment option has been selected to pay the payment request. The selected payment option must be one of the options available for the payment request as per the payments array in the requests.create and requests.info responses. The table below lists the possible ledger and authorization param values. The asset type is the value used to configure the merchant. The ledger param value is returned with the payment request info as payments[].ledger. | Asset Type | Ledger Param Value | Authorization Param Value | . | centrapay.nzd.main | centrapay.nzd.main | Centrapay wallet id | . | centrapay.nzd.test | centrapay.nzd.test | Centrapay wallet id | . | epay.nzd.main | epay.nzd.main | Centrapay asset id | . | bitcoin.main | g.crypto.bitcoin.mainnet | Bitcoin transaction id | . Centrapay Asset Permissions . To pay with a Centrapay asset or wallet ledger the user (identified by the API Key or identity token) must have permission to redeem the asset or transfer funds from the specified wallet. Error Responses . | Http code | Message | Description | . | 403 | REQUEST_EXPIRED | Action cannot be completed because the request has expired. | . | 403 | REQUEST_PAID | Action cannot be completed because the request has been paid. | . | 403 | REQUEST_CANCELLED | Action cannot be completed because the request has already been cancelled. | . | 403 | INVALID_ASSET_TYPE | The merchant is not configured with the provided asset type. | . | 403 | INACTIVE_ASSET | The asset is not spendable. It may have been disabled, expired, or already spent. | . | 403 | INVALID_MERCHANT_CONFIG | The merchant is not configured properly to satisfy the payment request. This could be due to incorrect information, or the merchant’s credentials might be blocked by an external service. | . | 403 | QUOTA_EXCEEDED | The payment pay request exceeds the allowed spend quota supplied. | . | 403 | INSUFFICIENT_ASSET_VALUE | The asset has insufficient funds to pay the payment request or the transaction amount received by Centrapay is less than the total of the payment. | . | 403 | ASSET_REDEMPTION_DENIED | The asset redemption has been unsuccessful due to an error with provided payment parameters, the merchant, or the asset. | . Cancelling a payment request . Swagger Docs . POST /payments/api/requests.cancel . curl -X POST https://service.centrapay.com/payments/api/requests.cancel \\ -H \"X-Api-Key: $api_key\" \\ -d requestId=a95b3b0d-1278-4613-8772-20d146065a2e . Required Parameters . | Parameter | Description | . | requestId | The payment requestId that is generated when requests.create is called | . Error Responses . | Http code | Error code | Message | Description | . | 404 | 2 | REQUEST_NOT_FOUND | The provided request doesn’t exist. | . | 400 | 18 | REQUEST_EXPIRED | Action cannot be completed because the request has expired. | . | 400 | 19 | REQUEST_PAID | Action cannot be completed because the request has been paid. | . Voiding a payment request . Swagger Docs . POST /payments/api/requests.void . curl -X POST https://service.centrapay.com/payments/api/requests.void \\ -H \"X-Api-Key: $api_key\" \\ -d requestId=a95b3b0d-1278-4613-8772-20d146065a2e . Required Parameters . | Parameter | Description | . | requestId | The payment requestId that is generated when requests.create is called. | . Error Responses . | Http code | Error code | Message | Description | . | 404 | 2 | REQUEST_NOT_FOUND | The provided request doesn’t exist. | . | 403 | | VOID_WINDOW_EXCEEDED | The amount of time since the payment request was created exceeds the window of time a payment request can be voided (24 hours). | . Voiding a payment request can cause it to be cancelled or refunded. Therefore, this endpoint can give the same error responses as requests.cancel and transactions.refund. After 24 hours voiding a payment request will be disallowed, however a refund can still be made against the payment request if it has been paid successfully. Refunding a transaction . Swagger Docs . POST /payments/api/transactions.refund . curl -X POST https://service.centrapay.com/payments/api/transactions.refund \\ -H \"X-Api-Key: $api_key\" \\ -d transactionId=7d2b1d52-b609-4ccd-b4cc-c4a9af881bd9 \\ -d amount=100 . Refunding a transaction can be done with or without an external reference. Refund without external reference . If you refund a transaction without providing an external reference, you will get a successful response for the first request and then an ALREADY_REFUNDED message for any refund requests that follow for the same transaction, unless an external reference is provided. Refund with external reference . If you provide an external reference then a transaction can be refunded multiple times provided that the external reference is unique for each refund request. When a duplicate external reference is provided when attempting to refund the same transaction we return a successful response if the amount of the request is the same both times but do not process another refund, this is because we assume it to be a repeat request. If the amount is different you will get a REPEAT_REFERENCE error message. Refund a Pre Auth Payment Request with Confirmations . The legacy refund endpoint cannot be used to refund Pre Auth Payment Requests with Confirmations. Please use the current refund endpoint instead. Required Parameters for one time refund . | Parameter | Description | . | transactionId | The transaction to refund. The transaction id for a payment can be obtained from a webhook notification or from requests.info. | . | amount | The amount to refund in cents | . Additional required Parameter for multiple refunds . | Parameter | Description | . | externalReference | A reference supplied by the merchant that must be unique for each refund of that transaction, can be anything you want but it must be unique. | . Error Responses . | Http code | Error code | Message | Description | . | 404 | 3 | TRANSACTION_NOT_FOUND | The provided transaction doesn’t exist. | . | 400 | 276 | ALREADY_REFUNDED | The transaction has already been refunded. | . | 400 | 277 | INVALID_AMOUNT | The refund requested is greater than the transaction amount. | . | 400 | 280 | REPEAT_REFERENCE | A separate refund request for the same transaction has the same external reference, trying to refund the same transaction twice with the same external reference is not allowed. If the amount of the refund is the same we assume it is a repeat request and return 200. | . | 403 | 281 | PARTIAL_REFUNDS_NOT_ALLOWED | The asset does not support partial refunds. | . | 403 | 283 | INACTIVE_ASSET | The asset is not refundable. It may have been disabled, expired, or already refunded. | . | 403 | | REFUND_NOT_SUPPORTED | The asset type does not support refunds. | . | 403 | | REFUND_WINDOW_EXCEEDED | The time since the payment exceeds the window of time a transaction can be refunded in. | . ",
- "url": "/api/legacy-payment-requests#operations",
- "relUrl": "/api/legacy-payment-requests#operations"
- },"110": {
- "doc": "Legacy",
- "title": "Webhooks",
- "content": "Webhook notifications are sent for significant Payment life-cycle events. The Webhook endpoint is notified by sending an HTTP POST request to the notifyUrl defined in the Payment Request. Life-cycle Events That Trigger Webhooks . The supported event types that will be notified to the Payment Requests webhook and the associated “transactionType” value that will be sent in the payload are: . | Event Type | Value of “transactionType” | . | Payment Request Cancelled | CANCELLED | . | Payment Request Expired | EXPIRED | . | Transaction Completed | PURCHASE | . | Transaction Refunded | REFUND | . Payment Request Cancelled . A payment request can be cancelled by either calling the requests.cancel or requests.void endpoint before a request has been paid successfully. When a request has been cancelled we send a JWT that when decoded matches the Payment Request Cancelled example in the Decoded Webhook JWT Examples section below. Payment Request Expired . A payment request expires two minutes after being created if it hasn’t been cancelled, or paid. When a request has expired we send a JWT that when decoded matches the Payment Request Cancelled example in the Decoded Webhook JWT Examples section below with the transactionType set to EXPIRED. Transaction Completed . A transaction is considered complete when requests.pay is called with parameters that satisfy a payment request and the request has been paid successfully. When a transaction has been completed we send a JWT that when decoded matches the Transaction Completed example in the Decoded Webhook JWT Examples section below. Transaction Refunded . A transaction can be refunded one to many times and each time a transaction has been refunded successfully we notify the webhook associated with the original payment request. A transaction can be refunded when transactions.refund has been called for a partial or full refund, or when requests.void is called for a request that has been paid. When a transaction has been refunded we send a JWT that when decoded matches the Transaction Completed example in the Decoded Webhook JWT Examples section below but with transactionType set to REFUND. Webhook Payload . The body of the webhook is a JSON document with the following format: . { \"token\": \"${JWT}\" } . The decoded JWT will contain a “transaction” property with a “transactionType” that indicates the event type. Depending on the type of event, the payload will also contain additional details about the transaction and payment request. For example: . { \"transaction\": { \"transactionType\": \"REFUND\", \"request\": { \"requestId\": \"bec358bf-edb5-4633-a785-a95cc281d3b7\", \"denomination\": { \"asset\": \"NZD\", \"amount\": \"100\" } } } } . Webhook Payload Fields . | Property | Description | . | transactionId | Id of the transaction | . | transactionType | Indicates which event triggered the notification message | . | state | Current state of the transaction | . | ledger | The ledger at which the authorization was processed | . | amount | Transaction amount in the lowest denomination available | . | createdAt | Timestamp at which the request was created | . | updatedAt | Timestamp at which the request was updated | . | type | The payment type used by the issuer to reconcile settlement | . | request | Request object, see details at requests.info | . | authCode | Authorization code used to settle this transaction | . Webhook JWT Validation . A webhook JWT can be validated by checking the signature against the Centrapay Webhook public key: . -----BEGIN PUBLIC KEY----- MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEt+vW2fE0mLLmdzJtYrz7J9q/yEXl gmIjCXdv3VNvYfTsaBO5PJNiaD3l9lD8PzEQu31ePsOG81mDVuo40+dgLg== -----END PUBLIC KEY----- . Decoded Webhook JWT Examples . Transaction Completed Successfully . { \"transaction\": { \"transactionId\": \"E6ctbmgmkgZ3xnPk3BkGvb\", \"transactionType\": \"PURCHASE\", \"ledger\": \"g.crypto.bitcoin.mainnet\", \"state\": \"completed\", \"amount\": 2000, \"request\": { \"requestId\": \"0FmbuirpQG4iuy6xAV9R1p\", \"merchantId\": \"613919a417bea000290e97e3\", \"externalReference\": \"12345sixseveneightnineten\", \"denomination\": { \"asset\": \"NZD\", \"amount\": 2000 } }, \"createdAt\": \"2018-10-02T00:29:09.307Z\", \"updatedAt\": \"2018-10-02T00:29:11.383Z\", \"type\": \"BITCOIN\", \"authCode\": \"961241\" } } . Payment Request Cancelled . { \"transaction\": { \"transactionType\": \"CANCELLED\", \"request\": { \"requestId\": \"0FmbuirpQG4iuy6xAV9R1p\", \"merchantId\": \"613919a417bea000290e97e3\", \"clientId\": \"613919a417bea000290e97e4\", \"denomination\": { \"asset\": \"NZD\", \"amount\": \"1\" } } } } . ",
- "url": "/api/legacy-payment-requests#webhooks",
- "relUrl": "/api/legacy-payment-requests#webhooks"
- },"111": {
- "doc": "Legacy",
- "title": "Legacy",
- "content": " ",
- "url": "/api/legacy-payment-requests",
- "relUrl": "/api/legacy-payment-requests"
- },"112": {
- "doc": "Managed Integrations",
- "title": "Managed Integration",
- "content": "A Managed Integration is an Integration which a third party can control. ",
- "url": "/api/managed-integrations#managed-integration",
- "relUrl": "/api/managed-integrations#managed-integration"
- },"113": {
- "doc": "Managed Integrations",
- "title": "Contents",
- "content": ". | Models . | Managed Integration | Invitation Summary EXPERIMENTAL | Bank Account | . | Params . | paypal-referral | . | Operations . | Create or Update a Managed Integration EXPERIMENTAL | Get a Managed Integration EXPERIMENTAL | . | . ",
- "url": "/api/managed-integrations#contents",
- "relUrl": "/api/managed-integrations#contents"
- },"114": {
- "doc": "Managed Integrations",
- "title": "Models",
- "content": "Managed Integration . Mandatory Fields . | Field | Type | Description | . | id | String | The Managed Integration’s unique identifier. | . | type | String | The type of Managed Integration. Supported types are paypal-referral. | . | enabled | Boolean | Flag indicating whether the Managed Integration should become active or inactive. | . | status | String | Current status of the Managed Integration. Supported values are created, pending, provisioning, active, inactive and archived. | . | externalId | String | Field used to reference an id from an external system. | . | params | Object | Params depending on the Managed Integration type. | . | createdAt | Timestamp | When the Managed Integration was created. | . | createdBy | CRN | The User or API Key that created the Managed Integration. | . | updatedAt | Timestamp | When the Managed Integration was updated. | . | updatedBy | CRN | The User or API Key that updated the Managed Integration. | . Optional Fields . | Field | Type | Description | . | claimedByAccountId | String | Centrapay account id used to claim the Managed Integration. | . | claimedBy | CRN | The User or API Key that claimed the Managed Integration. | . | claimedAt | Timestamp | When the Managed Integration was claimed. | . | invitation | Invitation Summary | A summary of the associated Invitation. | . | inProgress | Boolean | Flag indicating whether a status transition is in progress. | . | test | Boolean | A flag which is present if the Managed Integration is for testing | . Invitation Summary EXPERIMENTAL . A summary of the Invitation for a Managed Integration. Fields . | Name | Type | Description | . | id | String | The Invitation’s unique identifier. | . | code | String | The Invitation code. | . | expiresAt | Timestamp | When the Invitation expires. | . Bank Account . Mandatory Fields . | Field | Type | Description | . | number | String | The bank account number | . ",
- "url": "/api/managed-integrations#models",
- "relUrl": "/api/managed-integrations#models"
- },"115": {
- "doc": "Managed Integrations",
- "title": "Params",
- "content": "paypal-referral . Mandatory Fields . | Field | Type | Description | . | centrapayMerchantId | String | The ID of the Centrapay merchant that will be onboarded. | . | email | String | The email address to send the PayPal referral to. | . ",
- "url": "/api/managed-integrations#params",
- "relUrl": "/api/managed-integrations#params"
- },"116": {
- "doc": "Managed Integrations",
- "title": "Operations",
- "content": "Create or Update a Managed Integration EXPERIMENTAL . PUT /api/managed-integrations/{type}/{externalId} . curl -X PUT https://service.centrapay.com/api/managed-integrations/paypal-referral/DKTs3U38hdhfEqwF1JKoT2 \\ -H \"X-Api-Key: $api_key\" \\ -H \"Content-Type: application/json\" \\ -d '{ \"enabled\": true, \"params\": { \"centrapayMerchantId\": \"5ffcaf432003060007b98343\", \"email\": \"test@centrapay.com\" } }' . Required Fields . | Field | Type | Description | . | enabled | Boolean | Flag indicating whether the Managed Integration should become active or inactive. | . | params | Object | Params depending on the Managed Integration type. | . Optional Fields . | Field | Type | Description | . | test | Boolean | Flag indicating the Managed Integration is for testing, this cannot be changed once the resource has been created. | . Example response payload . { \"id\": \"5ee0c486308f590260d9a07f\", \"type\": \"paypal-referral\", \"externalId\": \"DKTs3U38hdhfEqwF1JKoT2\", \"enabled\": true, \"params\": { \"centrapayMerchantId\": \"5ffcaf432003060007b98343\", \"email\": \"test@centrapay.com\" }, \"status\": \"provisioning\", \"claimedByAccountId\": \"Jaim1Cu1Q55uooxSens6yk\", \"claimedBy\": \"crn:WIj211vFs9cNACwBb04vQw:api-key:MyApiKey\", \"claimedAt\": \"2020-06-12T01:17:46.499Z\", \"inProgress\": true, \"createdAt\": \"2020-06-11T01:17:46.499Z\", \"createdBy\": \"crn:BIj211vFs9cNACwBb04vQw:api-key:MyApiKey\", \"updatedAt\": \"2020-06-12T01:17:46.499Z\", \"updatedBy\": \"crn:WIj211vFs9cNACwBb04vQw:api-key:MyApiKey\" } . Error Responses . | Status | Code | Description | . | 400 | INVALID_PARAMS | Invalid Params provided for Managed Integration type. | . | 403 | MERCHANT_LIVENESS_MISMATCH | The test flag on the merchant doesn’t match the test flag on the paypal-referral managed integration. | . | 403 | MERCHANT_NOT_FOUND | The merchant is not found with the centrapayMerchantId on the paypal-referral managed integration. | . Get a Managed Integration EXPERIMENTAL . GET /api/managed-integrations/{id} . curl https://service.centrapay.com/api/managed-integrations/dh375hdh08f590260d9a07f \\ -H \"X-Api-Key: $api_key\" . Example response payload . { \"id\": \"5ee0c486308f590260d9a07f\", \"type\": \"paypal-referral\", \"externalId\": \"DKTs3U38hdhfEqwF1JKoT2\", \"enabled\": true, \"params\": { \"centrapayMerchantId\": \"5ffcaf432003060007b98343\", \"email\": \"test@centrapay.com\" }, \"status\": \"provisioning\", \"claimedByAccountId\": \"Jaim1Cu1Q55uooxSens6yk\", \"claimedBy\": \"crn:WIj211vFs9cNACwBb04vQw:api-key:MyApiKey\", \"claimedAt\": \"2020-06-12T01:17:46.499Z\", \"inProgress\": true, \"createdAt\": \"2020-06-11T01:17:46.499Z\", \"createdBy\": \"crn:BIj211vFs9cNACwBb04vQw:api-key:MyApiKey\", \"updatedAt\": \"2020-06-12T01:17:46.499Z\", \"updatedBy\": \"crn:WIj211vFs9cNACwBb04vQw:api-key:MyApiKey\" } . ",
- "url": "/api/managed-integrations#operations",
- "relUrl": "/api/managed-integrations#operations"
- },"117": {
- "doc": "Managed Integrations",
- "title": "Managed Integrations",
- "content": " ",
- "url": "/api/managed-integrations",
- "relUrl": "/api/managed-integrations"
- },"118": {
- "doc": "Media Uploads",
- "title": "Media Uploads",
- "content": " ",
- "url": "/api/media-uploads",
- "relUrl": "/api/media-uploads"
- },"119": {
- "doc": "Media Uploads",
- "title": "Contents",
- "content": ". | Models . | Media Upload | . | Operations . | Create a presigned URL for Media Upload EXPERIMENTAL | Get Media Upload Location EXPERIMENTAL | . | . ",
- "url": "/api/media-uploads#contents",
- "relUrl": "/api/media-uploads#contents"
- },"120": {
- "doc": "Media Uploads",
- "title": "Models",
- "content": "Media Upload . Mandatory Fields . | Field | Type | Description | . | id | String | The Media Upload’s unique identifier. | . | accountId | String | The Media Upload’s owning Centrapay Account id. | . | mimeType | String | The media (MIME) type of the upload. | . | fileName | String | The file name of the upload. | . | createdAt | Timestamp | When the Media Upload was created. | . | updatedAt | Timestamp | When the Media Upload was updated. | . | createdBy | CRN | The User or API Key that created the Media Upload. | . | updatedBy | CRN | The User or API Key that updated the Media Upload. | . Optional Fields . | Field | Type | Description | . | uploadUrl | String | A presigned URL that gives users time-limited permission to upload media. | . ",
- "url": "/api/media-uploads#models",
- "relUrl": "/api/media-uploads#models"
- },"121": {
- "doc": "Media Uploads",
- "title": "Operations",
- "content": "Create a presigned URL for Media Upload EXPERIMENTAL . POST /api/media-uploads . curl -X POST https://service.centrapay.com/api/media-uploads \\ -H \"X-Api-Key: $api_key\" \\ -H \"Content-Type: application/json\" \\ -d '{ \"accountId\": \"Jaim1Cu1Q55uooxSens6yk\", \"mimeType\": \"image/png\", \"fileName\": \"image.png\" }' . Required Fields . | Field | Type | Description | . | accountId | String | The Media Upload’s owning Centrapay Account id. | . | mimeType | String | The media (MIME) type of the upload. | . | fileName | String | The file name of the upload. | . Example response payload . { \"id\": \"DKTs3U38hdhfEqwF1JKoT2\", \"uploadUrl\": \"https://media-upload.centrapay.com/image.png?jhbdsfau67ewejshb=487hsdjhbdgs743\" } . Get Media Upload Location EXPERIMENTAL . GET /api/media-uploads/{mediaUploadId}/location . curl https://service.centrapay.com/api/media-uploads/DKTs3U38hdhfEqwF1JKoT2/location \\ -H \"X-Api-Key: $api_key\" . Example response payload . { \"url\": \"https://media-upload.centrapay.com/image.png?jhbdsfau67ewejshb=487hsdjhbdgs743\" } . ",
- "url": "/api/media-uploads#operations",
- "relUrl": "/api/media-uploads#operations"
- },"122": {
- "doc": "Merchant Configs",
- "title": "Merchant Configs",
- "content": "A Merchant Config defines the available payment options for paying a Payment Request. ",
- "url": "/api/merchant-configs",
- "relUrl": "/api/merchant-configs"
- },"123": {
- "doc": "Merchant Configs",
- "title": "Contents",
- "content": ". | Models . | Merchant Config | Payment Option Config | . | Operations . | Create a Merchant Config | Get a Merchant Config | List Merchant Configs | Update a Merchant Config | . | . ",
- "url": "/api/merchant-configs#contents",
- "relUrl": "/api/merchant-configs#contents"
- },"124": {
- "doc": "Merchant Configs",
- "title": "Models",
- "content": ". Merchant Config . Required Fields . | Field | Type | Description | . | paymentOptions | Array | Array of Payment Option Configs. | . | createdAt | Timestamp | When the Merchant Config was created. | . | createdBy | CRN | The User or API Key that created the Merchant Config. | . | updatedAt | Timestamp | When the Merchant Config was updated. | . | updatedBy | CRN | The User or API Key that updated the Merchant Config. | . Optional Fields . | Field | Type | Description | . | allowedRedirectUrls | Array | Experimental Allowed prefixes for the redirectUrl property on Payment Requests created with this Config. | . Payment Option Config . Required Fields . | Field | Type | Description | . | type | String | Type of payment method. See supported payment types below. | . Optional Fields . | Field | Type | Description | | . | walletId | String | Merchant’s Centrapay Settlement Wallet to receive payments. Optional for centrapay.nzd types, if not supplied then a settlement wallet may be created and then assigned. | | . | assetId | String | Merchant’s Centrapay Settlement Asset to receive payments. Optional for quartz.nzd types, if not supplied then a settlement asset may be created and then assigned. | | . | terminalId | String | Merchant’s Epay terminal id. | | . | paypalMerchantAccountId | String | Id of the PayPal merchants account. Required for paypal.usd and venmo.usd types. | | . | paypalStoreId | String | Id of the PayPal merchants store. Required for paypal.usd and venmo.usd types. | | . | farmlandsMerchantNumber | String | Id of the Farmlands merchant that funds will be transferred to. | | . | externalMerchantId | String | Id of the external merchant. Required for stadius and uplinkapi.test types. | | . See Asset Types for values that may be present in the type field. Warning: Test payment options should never be used for live merchant configurations. ",
- "url": "/api/merchant-configs#models",
- "relUrl": "/api/merchant-configs#models"
- },"125": {
- "doc": "Merchant Configs",
- "title": "Operations",
- "content": "Create a Merchant Config . POST /api/merchants/{merchantId}/configs . curl -X POST https://service.centrapay.com/api/merchants/5ee0c486308f590260d9a07f/configs \\ -H \"X-Api-Key: $api_key\" \\ -H \"Content-Type: application/json\" \\ -d '{ \"paymentOptions\": [ { \"type\": \"centrapay.nzd.main\", \"walletId\": \"1234c486308f3f0a23f0f92b\" }, { \"type\": \"epay.nzd.main\", \"terminalId\": \"11000021\" }, { \"type\": \"farmlands.nzd.main\", \"farmlandsMerchantNumber\": \"DbgY2SyD5M85zkePJjsQEf\" } ] }' . Example response payload . { \"id\": \"5ee168e8597be5002af7b454\", \"merchantId\": \"5ee0c486308f590260d9a07f\", \"createdAt\": \"2021-11-12T01:17:46.499Z\", \"updatedAt\": \"2021-11-12T01:17:46.499Z\", \"createdBy\": \"crn:WIj211vFs9cNACwBb04vQw:api-key:MyApiKey\", \"updatedBy\": \"crn:WIj211vFs9cNACwBb04vQw:api-key:MyApiKey\", \"paymentOptions\": [ { \"type\": \"centrapay.nzd.main\", \"walletId\": \"1234c486308f3f0a23f0f92b\" }, { \"type\": \"epay.nzd.main\", \"terminalId\": \"11000021\" }, { \"type\": \"farmlands.nzd.main\", \"farmlandsMerchantNumber\": \"DbgY2SyD5M85zkePJjsQEf\" } ] } . Error Responses . | Status | Code | Description | . | 403 | INVALID_WALLET_TYPE | walletId does not belong to a Settlement Wallet. | . | 403 | LIVENESS_MISMATCH | Only Merchants with the test flag can have merchant configs with test assets, vice versa | . Get a Merchant Config . GET /api/merchants/{merchantId}/configs/{configId} . curl https://service.centrapay.com/api/merchants/5ee0c486308f590260d9a07f/configs/5ee168e8597be5002af7b454 \\ -H \"X-Api-Key: $api_key\" . Example response payload . { \"id\": \"5ee168e8597be5002af7b454\", \"merchantId\": \"5ee0c486308f590260d9a07f\", \"createdAt\": \"2021-11-12T01:17:46.499Z\", \"updatedAt\": \"2021-11-12T01:17:46.499Z\", \"createdBy\": \"crn:WIj211vFs9cNACwBb04vQw:api-key:MyApiKey\", \"updatedBy\": \"crn:WIj211vFs9cNACwBb04vQw:api-key:MyApiKey\", \"paymentOptions\": [ { \"type\": \"farmlands.nzd.main\", \"farmlandsMerchantNumber\": \"DbgY2SyD5M85zkePJjsQEf\" } ] } . List Merchant Configs . GET /api/merchants/{merchantId}/configs . curl https://service.centrapay.com/api/merchants/5ee0c486308f590260d9a07f/configs \\ -H \"X-Api-Key: $api_key\" . Example response payload . [ { \"id\": \"5ee168e8597be5002af7b454\", \"merchantId\": \"5ee0c486308f590260d9a07f\", \"createdAt\": \"2021-09-12T01:17:46.499Z\", \"updatedAt\": \"2021-09-12T01:17:46.499Z\", \"createdBy\": \"crn:WIj211vFs9cNACwBb04vQw:api-key:MyApiKey\", \"updatedBy\": \"crn:WIj211vFs9cNACwBb04vQw:api-key:MyApiKey\", \"paymentOptions\": [ { \"type\": \"farmlands.nzd.main\", \"farmlandsMerchantNumber\": \"DbgY2SyD5M85zkePJjsQEf\" } ] }, { \"id\": \"5ee168e8597be5002af7baed\", \"merchantId\": \"5ee0c486308f590260d9a07f\", \"createdAt\": \"2021-11-12T01:17:46.499Z\", \"updatedAt\": \"2021-11-12T01:17:46.499Z\", \"createdBy\": \"crn:WIj211vFs9cNACwBb04vQw:api-key:MyApiKey\", \"updatedBy\": \"crn:WIj211vFs9cNACwBb04vQw:api-key:MyApiKey\", \"paymentOptions\": [ { \"type\": \"test\" } ] } ] . Update a Merchant Config . PUT /api/merchants/{merchantId}/configs/{configId} . curl -X PUT https://service.centrapay.com/api/merchants/5ee0c486308f590260d9a07f/configs/5ee168e8597be5002af7baed \\ -H \"X-Api-Key: $api_key\" \\ -H \"Content-Type: application/json\" \\ -d '{ \"paymentOptions\": [ { \"type\": \"bitcoin.main\" }, { \"type\": \"centrapay.nzd.test\", \"walletId\": \"1234c486308f3f0a23f0f92b\" }, { \"type\": \"farmlands.nzd.main\", \"farmlandsMerchantNumber\": \"DbgY2SyD5M85zkePJjsQEf\" } ] }' . Example response payload . { \"id\": \"5ee168e8597be5002af7baed\", \"merchantId\": \"5ee0c486308f590260d9a07f\", \"createdAt\": \"2021-09-12T01:17:46.499Z\", \"updatedAt\": \"2021-12-12T01:17:46.499Z\", \"createdBy\": \"crn:WIj211vFs9cNACwBb04vQw:api-key:MyApiKey\", \"updatedBy\": \"crn:WIj211vFs9cNACwBb04vQw:api-key:MyApiKey\", \"paymentOptions\": [ { \"type\": \"bitcoin.main\" }, { \"type\": \"centrapay.nzd.test\", \"walletId\": \"1234c486308f3f0a23f0f92b\" }, { \"type\": \"farmlands.nzd.main\", \"farmlandsMerchantNumber\": \"DbgY2SyD5M85zkePJjsQEf\" } ] } . Error Responses . | Status | Code | Description | . | 403 | INVALID_WALLET_TYPE | walletId does not belong to a Settlement Wallet. | . | 403 | LIVENESS_MISMATCH | Only Merchants with the test flag can have merchant configs with test assets, vice versa | . ",
- "url": "/api/merchant-configs#operations",
- "relUrl": "/api/merchant-configs#operations"
- },"126": {
- "doc": "Merchants",
- "title": "Merchants",
- "content": "A merchant is an initiator of Payment Requests. A Merchant has Merchant Configs which define the payment methods available for a Payment Request. ",
- "url": "/api/merchants",
- "relUrl": "/api/merchants"
- },"127": {
- "doc": "Merchants",
- "title": "Contents",
- "content": ". | Models . | Merchant | Settlement Config | Merchant Search Result | Accepted Asset | Product | . | Operations . | Create a Merchant | Get a Merchant | List Merchants for Account | Update a Merchant | Set Merchant Onboarding Status | Search Merchants EXPERIMENTAL | List all Merchants DEPRECATED | . | . ",
- "url": "/api/merchants#contents",
- "relUrl": "/api/merchants#contents"
- },"128": {
- "doc": "Merchants",
- "title": "Models",
- "content": "Merchant . Mandatory Fields . | Field | Type | Description | . | id | String | Merchant’s unique identifier. | . | accountId | String | Id of Merchant’s owning Centrapay account. | . | name | String | Merchant name. | . | country | String | Merchant ISO 3166 country code. Must match the “region” on the Account. | . | createdAt | Timestamp | When the Merchant was created. | . | createdBy | CRN | The User or API Key that created the Merchant. | . | updatedAt | Timestamp | When the Merchant was updated. | . | updatedBy | CRN | The User or API Key that updated the Merchant. | . | onboardingStatus | String | The onboarding status of the Merchant. See Onboarding Statuses for possible values. | . Optional Fields . | Field | Type | Description | . | test | Boolean | EXPERIMENTAL Flag indicating merchant is for testing. | . | settlementConfig | Settlement Config | EXPERIMENTAL Merchant settlement config. | . | location | Location | EXPERIMENTAL Physical Location of Merchant. It is highly recommended that you provide this otherwise, users won’t be able to find you with our Merchant Search API if they perform a origin + distance query. | . | onboardingStatusReason | String | The reason associated with the Onboarding Status. See Onboarding Status Reasons for possible values. | . Onboarding Statuses . | Status | Description | Allowed Reasons | . | applied | Identifies merchants that have registered to be activated for the Centrapay service. | | . | provisioning | Identifies merchants that are in the process of being activated for the Centrapay service. | | . | active | Identifies merchants that have been activated for Centrapay services successfully (i.e. they have successfully created a Payment Request). | | . | deactivated | Identifies merchants that have been de-registered for the Centrapay service. | duplicate, data-quality-issues, no-response, change-of-ownership, centrapay-discontinued. | . | on-hold | Identifies merchants that have been placed on hold. | seasonal-business-closure, incompatible-terminal, no-response | . Onboarding Status Reasons . | Reason | Description | . | duplicate | The merchant already exists in the Centrapay system. | . | data-quality-issues | Data quality issues are preventing the merchant from onboarding. | . | no-response | No response has been received from the merchant. | . | change-of-ownership | The merchant has changed ownership. | . | centrapay-discontinued | The merchant is no longer using Centrapay. | . | seasonal-business-closure | The merchant has closed temporarily. | . | incompatible-terminal | The merchant does not have any compatible terminals. | . Settlement Config . Optional Fields . | Field | Type | Description | . | bankAccountId | String | The id of the bank account funds should be settled into. This must belong to the account | . Merchant Search Result . | Field | Type | Description | . | id | String | Merchant’s unique identifier | . | name | String | Merchant’s name | . | acceptedAssets | Accepted Asset | List of assets accepted by the merchant | . | location | Location Optional | Physical location of the merchant | . Accepted Asset . | Field | Type | Description | . | assetType | String | The type of the asset | . | products | Product Optional | List of products supported by the asset type. Only available for epay.nzd and centrapay.token asset types. | . Product . | Field | Type | Description | . | id | String | Product’s unique identifier | . ",
- "url": "/api/merchants#models",
- "relUrl": "/api/merchants#models"
- },"129": {
- "doc": "Merchants",
- "title": "Operations",
- "content": "Create a Merchant . POST /api/merchants . curl -X POST https://service.centrapay.com/api/merchants \\ -H \"X-Api-Key: $api_key\" \\ -H \"Content-Type: application/json\" \\ -d '{ \"accountId\": \"C4QnjXvj8At6SMsEN4LRi9\", \"name\": \"Centrapay Cafe Auckland\", \"country\": \"NZ\", \"test\": false }' . Example response payload . { \"id\": \"5ee0c486308f590260d9a07f\", \"accountId\": \"yqwyya0rzz3vvshqw0474u89xtj5fn\", \"name\": \"Centrapay Cafe Auckland\", \"country\": \"NZ\", \"test\": false, \"onboardingStatus\": \"applied\", \"createdAt\": \"2021-11-12T01:17:46.499Z\", \"updatedAt\": \"2021-11-12T01:17:46.499Z\", \"createdBy\": \"crn:WIj211vFs9cNACwBb04vQw:api-key:MyApiKey\", \"updatedBy\": \"crn:WIj211vFs9cNACwBb04vQw:api-key:MyApiKey\" } . Error Responses . | Status | Code | Description | . | 403 | BANK_ACCOUNT_MISMATCH | The bank account in the settlement config does not belong to the same account. | . | 403 | ACCOUNT_REGION_MISMATCH | The merchant’s “country” does not match the “region” on the Account. | . Get a Merchant . GET /api/merchants/{merchantId} . curl https://service.centrapay.com/api/merchants/5ee0c486308f590260d9a07f \\ -H \"X-Api-Key: $api_key\" . Example response payload . { \"id\": \"5ee0c486308f590260d9a07f\", \"accountId\": \"yqwyya0rzz3vvshqw0474u89xtj5fn\", \"name\": \"Parisian - Brown\", \"test\": false, \"country\": \"AD\", \"onboardingStatus\": \"applied\", \"createdAt\": \"2021-11-12T01:17:46.499Z\", \"updatedAt\": \"2021-11-12T01:17:46.499Z\", \"createdBy\": \"crn:WIj211vFs9cNACwBb04vQw:api-key:MyApiKey\", \"updatedBy\": \"crn:WIj211vFs9cNACwBb04vQw:api-key:MyApiKey\" } . List Merchants for Account . Returns a paginated list of Merchants attached to an Account. GET /api/accounts/{accountId}/merchants . curl https://service.centrapay.com/api/accounts/Jaim1Cu1Q55uooxSens6yk/merchants \\ -H \"X-Api-Key: $api_key\" . Example response payload . { \"items\": [ { \"accountId\": \"Jaim1Cu1Q55uooxSens6yk\", \"country\": \"BT\", \"id\": \"5f6bf6ff81552101f8ff6122\", \"name\": \"Adams, Runolfsdottir and Botsford\", \"test\": true, \"onboardingStatus\": \"applied\", \"createdAt\": \"2021-11-12T01:17:46.499Z\", \"updatedAt\": \"2021-11-12T01:17:46.499Z\", \"createdBy\": \"crn:WIj211vFs9cNACwBb04vQw:api-key:MyApiKey\", \"updatedBy\": \"crn:WIj211vFs9cNACwBb04vQw:api-key:MyApiKey\" }, { \"accountId\": \"Jaim1Cu1Q55uooxSens6yk\", \"country\": \"GM\", \"id\": \"5f6bf6ff81552101f8ff6123\", \"name\": \"Vandervort Inc\", \"test\": false, \"onboardingStatus\": \"applied\", \"createdAt\": \"2021-11-12T01:17:46.499Z\", \"updatedAt\": \"2021-11-12T01:17:46.499Z\", \"createdBy\": \"crn:WIj211vFs9cNACwBb04vQw:api-key:MyApiKey\", \"updatedBy\": \"crn:WIj211vFs9cNACwBb04vQw:api-key:MyApiKey\" } ] } . Update a Merchant . PUT /api/merchants/{merchantId} . curl -X PUT https://service.centrapay.com/api/merchants/5ee0c486308f590260d9a07f \\ -H \"X-Api-Key: $api_key\" \\ -H \"Content-Type: application/json\" \\ -d '{ \"name\": \"Centrapay Café\", \"location\": { \"lat\": \"-36.8483579\", \"lng\": \"174.7725834\", \"city\": \"Auckland\", \"postCode\": \"1010\", \"country\": \"NZ\" }, \"settlementConfig\": { \"bankAccountId\": \"WRhAxxWpTKb5U7pXyxQjjY\" } }' . Example response payload . { \"id\": \"5ee0c486308f590260d9a07f\", \"accountId\": \"yqwyya0rzz3vvshqw0474u89xtj5fn\", \"name\": \"Centrapay Café\", \"test\": false, \"country\": \"NZ\", \"onboardingStatus\": \"applied\", \"location\": { \"lat\": \"-36.8483579\", \"lng\": \"174.7725834\", \"city\": \"Auckland\", \"postCode\": \"1010\", \"country\": \"NZ\" }, \"settlementConfig\": { \"bankAccountId\": \"WRhAxxWpTKb5U7pXyxQjjY\" }, \"createdAt\": \"2021-09-12T01:11:22.491Z\", \"updatedAt\": \"2021-11-12T01:17:46.499Z\", \"createdBy\": \"crn:WIj211vFs9cNACwBb04vQw:api-key:MyApiKey\", \"updatedBy\": \"crn:WIj211vFs9cNACwBb04vQw:api-key:MyApiKey\" } . Error Responses . | Status | Code | Description | . | 403 | BANK_ACCOUNT_MISMATCH | The bank account in the settlement config does not belong to the same account. | . Set Merchant Onboarding Status . POST /api/merchants/{merchantId}/set-onboarding-status . curl -X POST https://service.centrapay.com/api/merchants/5ee0c486308f590260d9a07f/set-onboarding-status \\ -H \"X-Api-Key: $api_key\" \\ -H \"Content-Type: application/json\" \\ -d '{ \"onboardingStatus\": \"deactivated\", \"onboardingStatusReason\": \"change-of-ownership\" }' . Example response payload . { \"type\": \"set-onboarding-status\", \"onboardingStatus\": \"deactivated\", \"onboardingStatusReason\": \"change-of-ownership\", \"merchantId\": \"MhocUmpxxmgdHjr7DgKoKw\", \"createdAt\": \"2021-09-12T01:11:22.491Z\", \"createdBy\": \"crn:WIj211vFs9cNACwBb04vQw:api-key:MyApiKey\", \"activityNumber\": \"2\" } . Search Merchants EXPERIMENTAL . Returns a paginated response of merchant search results that match the search query . This endpoint does not require Auth . GET /api/merchants/search . curl -G https://service.centrapay.com/api/merchants/search \\ -H \"X-Api-Key: $api_key\" \\ -d origin=123.42,32.22 \\ -d distance=100 \\ -d asset=epay.nzd.main,37873 \\ -d pageKey=10 \\ -d paginationLimit=10 . Query Parameters . | Parameter | Type | Description | . | origin | String Optional | The point to be searched around, formatted as a latitude,longitude | . | distance | Number Optional | The distance from the origin to be searched around in km | . | asset | String Optional | A string of the format {assetType},{productId} describing the asset where assetType is the type of asset to filter the merchants by and productId is the asset’s productCode for epay.nzd asset types or the asset’s collectionId for centrapay.token asset types | . | name | String Optional | Name of the merchant | . | pageKey | String Optional | pageKey of next merchant to fetch | . | paginationLimit | String Optional | Maximum amount of merchants to return | . Response . | Field | Type | Description | . | totalItems | Number | Total number of merchants that match the search query | . | items | Merchant Search Result | List of merchants returned that match the search query | . | nextPageKey | String | Can be used to fetch the next page, not present on the last page | . Example response payload . { \"totalItems\": 100, \"items\": [ { \"id\": \"M001\", \"name\": \"Store 1\", \"acceptedAssets\": [ { \"assetType\": \"centrapay.nzd.main\" }, { \"assetType\": \"epay.nzd.main\", \"products\": [ { \"id\": \"37873\" }, { \"id\": \"38183\" } ] }, { \"assetType\": \"centrapay.token.main\", \"products\": [ { \"id\": \"Xv990BzkgfoDS7bBls50pd\" } ] } ], \"location\": { \"lat\": \"123.45\", \"lng\": \"32.21\", \"city\": \"Auckland\", \"country\": \"NZ\", \"postCode\": \"1234\", \"state\": \"Auckland\", \"street\": \"2 Street Street\", \"suburb\": \"Place\" } } ], \"nextPageKey\": \"20\" } . List all Merchants DEPRECATED . Returns a paginated list of Merchants which belong to the authenticated subject. GET /api/merchants . curl https://service.centrapay.com/api/merchants \\ -H \"X-Api-Key: $api_key\" . Example response payload . { \"items\": [ { \"accountId\": \"3xsjxxwmnpkunjbcpekyekc84rzxr4\", \"country\": \"BT\", \"id\": \"5f6bf6ff81552101f8ff6122\", \"name\": \"Adams, Runolfsdottir and Botsford\", \"test\": true, \"onboardingStatus\": \"applied\", \"createdAt\": \"2021-11-12T01:17:46.499Z\", \"updatedAt\": \"2021-11-12T01:17:46.499Z\", \"createdBy\": \"crn:WIj211vFs9cNACwBb04vQw:api-key:MyApiKey\", \"updatedBy\": \"crn:WIj211vFs9cNACwBb04vQw:api-key:MyApiKey\" }, { \"accountId\": \"3xsjxxwmnpkunjbcpekyekc84rzxr4\", \"country\": \"GM\", \"id\": \"5f6bf6ff81552101f8ff6123\", \"name\": \"Vandervort Inc\", \"test\": false, \"onboardingStatus\": \"applied\", \"createdAt\": \"2021-11-12T01:17:46.499Z\", \"updatedAt\": \"2021-11-12T01:17:46.499Z\", \"createdBy\": \"crn:WIj211vFs9cNACwBb04vQw:api-key:MyApiKey\", \"updatedBy\": \"crn:WIj211vFs9cNACwBb04vQw:api-key:MyApiKey\" }, { \"accountId\": \"3xsjxxwmnpkunjbcpekyekc84rzxr4\", \"country\": \"MZ\", \"id\": \"5f6bf6ff81552101f8ff6124\", \"name\": \"West, O'Reilly and Huels\", \"test\": true, \"onboardingStatus\": \"applied\", \"createdAt\": \"2021-11-12T01:17:46.499Z\", \"updatedAt\": \"2021-11-12T01:17:46.499Z\", \"createdBy\": \"crn:WIj211vFs9cNACwBb04vQw:api-key:MyApiKey\", \"updatedBy\": \"crn:WIj211vFs9cNACwBb04vQw:api-key:MyApiKey\" } ] } . ",
- "url": "/api/merchants#operations",
- "relUrl": "/api/merchants#operations"
- },"130": {
- "doc": "Pagination",
- "title": "Pagination",
- "content": "Pagination allows a listing endpoint to return a subset of results. The goal is to reduce memory usage and speed up page rendering. To retrieve the next page, a pageKey can be supplied. Typically this will be the nextPageKey returned from your previous query. Please note that when making a request, the values of pageKey must be URL-encoded. This ensures proper handling of special characters and encoding requirements. Some of our endpoints have been designed to be forwards compatible with pagination. When we do bring support to GET endpoints for listing, these conventions will be followed. Models . Mandatory Fields . | Field | Type | Description | . | items | Array | A list from the current page. | . Optional Fields . | Field | Type | Description | . | nextPageKey | String | Can be used to fetch the next page, not present on the last page. | . Example . A GET endpoint for listing with a pageKey . GET /api/examples . curl -G https://service.centrapay.com/api/examples \\ -H \"X-Api-Key: $api_key\" \\ -d pageKey=Example#E9eXsErwA444qFDoZt5iLA|Activity#000000000000001|614161c4c4d3020073bd4ce8 . Fields . | Field | Type | Description | . | pageKey | String Optional | Used to retrieve the next page of items. | . A page with more content . { \"nextPageKey\": \"5ee0c486308f590260d9a07f|ded3f328-1123-11ec-bf1a-5ba46eb12a7d\", \"items\": [ { \"value\": \"16\", \"assetType\": \"centrapay.nzd.main\" }, { \"value\": \"32\", \"assetType\": \"centrapay.nzd.main\" }, { \"value\": \"64\", \"assetType\": \"centrapay.nzd.main\" } ] } . The last page . { \"items\": [ { \"value\": \"128\", \"assetType\": \"centrapay.nzd.main\" } ] } . ",
- "url": "/api/pagination",
- "relUrl": "/api/pagination"
- },"131": {
- "doc": "Patron Codes",
- "title": "Patron Codes",
- "content": "A Patron Code is an alternative to presenting a QR code where that option isn’t available . ",
- "url": "/api/patron-codes",
- "relUrl": "/api/patron-codes"
- },"132": {
- "doc": "Patron Codes",
- "title": "Contents",
- "content": ". | Models . | Patron Code | Test Scenario Name | . | Operations . | Creating a Patron Code | Retrieving a Patron Code | Retrieving a Patron Code by Barcode | . | . ",
- "url": "/api/patron-codes#contents",
- "relUrl": "/api/patron-codes#contents"
- },"133": {
- "doc": "Patron Codes",
- "title": "Models",
- "content": "Patron Code . Fields . | Field | Type | Description | . | id | String | The Patron Code’s unique identifier. | . | barcode | String | ✩ Field to display in barcode format. | . | createdAt | Timestamp | Date when the Patron Code was created. | . | expiresAt | Timestamp | Date when the Patron Code will expire. | . | appName | String Optional | The app used to create the Patron Code. DEPRECATED | . | accountId | String | The account id of the creator of the patron code. | . | testScenarioName | String Optional | The Test Scenario Name of the Patron Code. | . ✩ Barcode is a 16 digit number. The first 6 digits are a Centrapay defined prefix, then a 9 digit code, then a luhn checksum digit. 9 9 9 0 0 0 1 2 3 4 5 6 7 8 9 5 ❖ complete barcode 9 9 9 0 0 0 - - - - - - - - - - ❖ centrapay prefix - - - - - - 1 2 3 4 5 6 7 8 9 - ❖ code - - - - - - - - - - - - - - - 5 ❖ luhn checksum . The Centrapay Prefix may present any of the following prefixes: . | 121921 | 123000 | 282828 | 293000 | 321000 | 321123 | 636863 | 713131 | 765432 | 777000 | 839234 | 848484 | 888444 | 929394 | 987600 | 999000 | . Test Scenario Name . This field is used to inject behavior into a Payment Request when the generated barcode is supplied on creation. If a Test Scenario Name is defined on a Patron Code, it is considered a test resource and can only be used with Payment Requests that will have a liveness of ‘test’. The Asset Type centrapay.nzd.test is required to run test scenarios. | name | description | . | force-condition-check-photo-id | The Payment Request will have a required Merchant Condition to check photo id. | . ",
- "url": "/api/patron-codes#models",
- "relUrl": "/api/patron-codes#models"
- },"134": {
- "doc": "Patron Codes",
- "title": "Operations",
- "content": "Creating a Patron Code . POST /api/patron-codes . curl -X POST https://service.centrapay.com/api/patron-codes \\ -H \"Authorization: $jwt\" . Example Response Payload . { \"id\": \"V17FByEP9gm1shSG6a1Zzx\", \"accountId\": \"Jaim1Cu1Q55uooxSens6yk\", \"barcode\": \"9990001234567895\", \"createdAt\": \"2021-06-08T22:55:00.000Z\", \"expiresAt\": \"2021-06-08T23:00:00.000Z\", \"appName\": \"centrapay\" } . You can find payment request information attached to a Patron Code by polling for the Payment Request using the transacting APIs. Retrieving a Patron Code . GET /api/patron-codes/{patronCodeId} . curl https://service.centrapay.com/api/patron-codes/V17FByEP9gm1shSG6a1Zzx \\ -H \"Authorization: $jwt\" . Example Response Payload . { \"id\": \"V17FByEP9gm1shSG6a1Zzx\", \"accountId\": \"Jaim1Cu1Q55uooxSens6yk\", \"barcode\": \"9990001234567895\", \"createdAt\": \"2021-06-08T22:55:00.000Z\", \"expiresAt\": \"2021-06-08T23:00:00.000Z\", \"appName\": \"centrapay\" } . Retrieving a Patron Code by Barcode . GET /api/patron-codes/barcode/{barcode} . curl https://service.centrapay.com/api/patron-codes/barcode/9990001234567895 \\ -H \"X-Api-Key: $api_key\" . Example Response Payload . { \"id\": \"V17FByEP9gm1shSG6a1Zzx\", \"accountId\": \"Jaim1Cu1Q55uooxSens6yk\", \"barcode\": \"9990001234567895\", \"createdAt\": \"2021-06-08T22:55:00.000Z\", \"expiresAt\": \"2021-06-08T23:00:00.000Z\", \"appName\": \"centrapay\" } . Error Responses . | Status | Code | Description | . | 400 | CHECKSUM_FAILED | Luhn checksum digit doesn’t pass. | . | 403 | PATRON_CODE_INVALID | Patron Code doesn’t exist or it has expired. | . ",
- "url": "/api/patron-codes#operations",
- "relUrl": "/api/patron-codes#operations"
- },"135": {
- "doc": "Payment Requests",
- "title": "Payment Requests",
- "content": "Payment Requests represent the intention for a merchant to receive payment for goods and services. Payment Requests define the amount to be paid and the asset types that are acceptable for payment. A Payment Request is shared with, and paid by, a patron. The Payment Flows Guide has more details regarding negotiation of Payment Requests. Payment Requests have the following statuses: . | new: after being created. | paid: after being paid with one or more transactions. | cancelled: after being cancelled or voided by the merchant. | expired: after expiry time is reached without being paid or cancelled. | . Payment requests can also be refunded for a short period of time after being paid. Payment request state transitions can be notified to webhooks. Centrapay Payment Requests are serviced via two sets of endpoints; the “next” version (documented on this page) and the “legacy” version (documented at Legacy Payment Requests). ",
- "url": "/api/payment-requests",
- "relUrl": "/api/payment-requests"
- },"136": {
- "doc": "Payment Requests",
- "title": "Contents",
- "content": ". | Models . | Payment Request | Payment Option | Accepted Collection | Payment Condition | Line Item | Product Classification | Paid By | Asset Total | Payment Activity | . | Operations . | Create a Payment Request | Get a Payment Request | Get a Payment Request by Short Code | Get a Payment Request linked to a Patron Code | Pay a Payment Request | Refund a Payment Request | Void a Payment Request | Release funds held for a Pre Auth Payment Request | Make a confirmation against a Pre Auth Payment Request | List Payment Activities for a Merchant | List Payment Activities for a Payment Request | Accept Payment Condition for a Payment Request | Decline Payment Condition for a Payment Request | . | . ",
- "url": "/api/payment-requests#contents",
- "relUrl": "/api/payment-requests#contents"
- },"137": {
- "doc": "Payment Requests",
- "title": "Models",
- "content": "Payment Request . Mandatory Fields . | Field | Type | Description | . | id | String | The payment request id. | . | shortCode | String | A shorter id that can be used to identify the payment request for up to two years. | . | url | String | The URL for a Centrapay webpage that allows the user to pay the Payment Request. | . | value | Monetary | The canonical value of the payment request. Must be less than 100000000 and positive. | . | paymentOptions | Array | The Payment Options, indicating valid asset for payment. | . | merchantId | String | The id of the Merchant the Payment Request is on behalf of. | . | merchantName | String | The name of the Merchant the Payment Request is on behalf of. | . | configId | String | The Merchant Config id used to configure the payment options. | . | status | String | “new”, “paid”, “cancelled”, or “expired”. | . | liveness | String | Indicates liveness of assets that are accepted, determined by the payment options. Values are “main” or “test”. | . | createdAt | Timestamp | When the payment request was created. | . | updatedAt | Timestamp | When the payment request was updated. | . | expiresAt | Timestamp | When the payment request expires. | . | merchantConditions | Array | A dynamic list of Payment Conditions that require operator approval to complete a payment. Conditions are calculated when polling a Payment Request. | . | remainingAmount | BigNumber | The amount of the payment request which has not been paid for. | . Optional Fields . | Field | Type | Description | . | patronCodeId | String | The id of a Patron Code the payment request is attached to. | . | barcode | String | Scanned Code used to create the payment request. | . | barcodeType | String | Indicates the provider of a barcode, e.g. ‘ticketek’ | . | collectionId | String | The identifier of the token collection | . | expirySeconds | Number | The expiry seconds used to configure the payment request expiry. | . | lineItems | Array | EXPERIMENTAL The Line Items being paid for. | . | purchaseOrderRef | String | A reference to a purchase order for this payment request. | . | invoiceRef | String | A reference to an invoice for this payment request. Must be less than or equal to 128 characters. | . | redirectUrl | String | Experimental URL to redirect the user to after they pay or cancel the Payment Request. Must start with one of the allowedRedirectUrls for the Merchant Config. | . | externalRef | String | An external reference to the payment request | . | terminalId | String | The software or logical id of the payment terminal. | . | deviceId | String | The hardware id or serial number of the payment terminal. | . | operatorId | String | POS operator Id. | . | createdByAccountId | String | Id of the Centrapay Account creating the Payment Request. | . | createdByAccountName | String | Name of the Centrapay Account creating the Payment Request. | . | conditionsEnabled | Boolean | Flag to indicate that a merchant is able to accept Payment Conditions. | . | patronNotPresent | Boolean | Flag to indicate the patron is not physically present. This may affect payment conditions or available Payment Options. | . | cancellationReason | String | The reason that the payment request was cancelled. See Cancellation Reasons for possible values. | . | preAuth | Boolean | Flag to indicate the if the request is a Pre Auth for supported Asset Types. | . | preAuthExpiresAt | Timestamp | Pre Auth completions and releases will be accepted until this time. | . | preAuthStatus | String | Describes which state a Pre Auth Payment Request is in. Valid values are “authorized”, or “released”. | . | taxNumber | Tax Number | The value-added tax configuration for the Business that the Merchant belongs to. | . | basketAmount | BigNumber | The total amount of the transaction including non Centrapay payment methods. | . | partialAllowed | Boolean | Flag to indicate that the payment request can be paid for partially | . Payment Option . Mandatory Fields . | Field | Type | Description | . | assetType | String | An Asset Type reference. | . | amount | BigNumber | The value required to pay using the canonical units for the asset type. | . Optional Fields . | Field | Type | Description | . | bitcoinAddress | String | ★ Address to send Bitcoin, when the “assetType” is bitcoin.* | . | productCodes | Array | Supported product codes for the payment request, when the “assetType” is epay.nzd.* | . | acceptedCollections | Array | Accepted Collections for the payment request, when the “assetType” is centrapay.token.* | . ★ For payment options which specify an address, there’s a requirement to make a transaction on an external ledger. Once you have made that payment, you can use the transaction id to Pay a Payment Request using the legacy payment API. Accepted Collection . If a Payment Request contains a centrapay.token.* Payment Option an array of Accepted Collections will be present inside the centrapay.token Payment Option. The Accepted Collections returned can be used to determine if a Centrapay Token can be used to pay a Payment Request, and the line items able to be purchased using the token. Fields . | Field | Type | Description | . | id | String | The id of a collection that the merchant accepts for the given Payment Request | . | lineItems | Array | The Line Items that can be purchased by a Centrapay Token with matching collection id | . Payment Condition . Some Asset Types require conditional approval to pay. Possible Payment Conditions include confirming proof of ID or confirming a promotional item was purchased. The conditionsEnabled flag should be set to true when Creating a Payment Request to indicate that Payment Conditions can be accepted. If a Payment Condition arises, the absence of the conditionsEnabled flag will result in the Payment Request being cancelled. Conditions can either be accepted or declined. If a condition is declined, the Payment Request will be cancelled. Fields . | Name | Type | Description | . | id | BigNumber | An enumerated identifier for the Payment Condition. | . | name | String | The name of the condition. | . | message | String | The human-readable description of the condition. | . | status | String | The status of the condition. Valid values include accepted, declined, awaiting-merchant or void. | . Line Item . An order item for which payment is requested. The currency and units for a line item price will be consistent with the payment request value and the sum of line item prices should equal the payment request value. Line items can include a discount amount. A discount that applies to multiple line items may be represented as a separate line item with a negative amount. Mandatory Fields . | Field | Type | Description | . | name | String | The product description. | . | sku | String | The product (stock keeping unit) code. | . | qty | BigNumber | The product quantity (eg. item count, weight, volume etc). | . | price | BigNumber | The total price in cents for the line item (eg. price = product price * qty - discounts + tax). | . Optional Fields . | Field | Type | Description | . | tax | BigNumber | Tax rate (percentage). | . | discount | BigNumber | Discount amount in cents (tax exclusive). | . | productId | String | Manufacturer’s product identifier (eg GTIN/EAN). | . | restricted | Boolean | Disallow payment with a “restricted” Asset Type. | . | classification | Object | Product Classification. | . Product Classification . Mandatory Fields . | Field | Type | Description | . | type | String | The classification type (see below). | . | code | String | The classification code. | . | name | String | The classification title. | . Optional Fields . | Field | Type | Description | . | props | Map | The product classification properties (see below). | . Classification Types . Currently only “GS1” is supported. See GS1 Global Product Classification. When “GS1” is used as the product classification type then the product code should be the GPC product brick identifier. Classification Properties . Classification properties allow optional additional product characterizing attrubutes to be supplied. In the case of GS1 product classifications this corresponds to the GPC brick attributes. Paid By . The Paid By provides a summary of the transactions after the Payment Request was paid. Mandatory Fields . | Field | Type | Description | . | assetTotals | Array | The sum of paid amounts Asset Totals for each transacted asset type. | . Asset Total . Mandatory Fields . | Field | Type | Description | . | type | String | The asset type used for the payment. | . | description | String | A human readable description of the asset type used. | . | settlementDate | Timestamp | The estimated date that the merchant can expect settlement of funds. | . | total | Monetary | The total monetary value of the asset type used to pay a Payment Request | . Optional Fields . | Field | Type | Description | . | lineItems | Array Optional | Experimental The Line Items paid for by the asset type. | . Payment Activity . A Payment Activity records a transaction that has happened on a Payment Request. Payment Activities are created when a Payment Request has been created, paid, refunded, cancelled, or expired. Mandatory Fields . | Field | Type | Description | . | type | String | See Activity Types below. | . | value | Monetary | The value of the payment activity. Must be less than 100000000 and positive. | . | paymentRequestId | String | The Payment Request’s id. | . | merchantId | String | The Payment Request’s Merchant id. | . | merchantConfigId | String | The Payment Request’s Merchant Config id. | . | merchantAccountId | String | The Payment Request’s Merchant Account id. | . | merchantName | String | The Payment Request’s Merchant name. | . | createdAt | Timestamp | When the activity was created. | . | createdBy | CRN | The identity that created the activity. | . | paymentRequestCreatedBy | CRN | The identity that created the Payment Request. | . | activityNumber | BigNumber | Unique sequential number for the activity. | . | shortCode | String | A shorter id that can be used for up to two years. | . Optional Fields . | Field | Type | Description | . | assetType | String | The Asset Type for the “payment” or “refund” activity. | . | external | Boolean | The payment activity is recording a transaction that occurred outside the Centrapay system. | . | cancellationReason | String | The reason that the Payment Request was cancelled. See Cancellation Reasons for possible values. | . | conditionId | Number | The id of a condition if the activity was for a condition being accepted or declined. | . | idempotencyKey | String | Required when confirming a Payment Request. This is an identifier from your system to enforce uniqueness. | . | confirmationIdempotencyKey | String | Required when refunding a Pre Auth Confirmation. Should be the same as the idempotencyKey used for Confirmation. | . | preAuth | Boolean | True if the related Payment Request is a Pre Auth | . Activity Types . | Name | Description | . | request | Payment Request was created. | . | preAuthRequest | Payment Request was created with the preAuth flag set to “true”. | . | paid | Payment Request was paid. | . | payment | A payment was made towards the Payment Request. | . | refund | Funds were returned to the shopper. | . | cancellation | Payment Request was cancelled by the merchant or the shopper. | . | expiry | Payment Request wasn’t paid before time out. | . | accept-condition | A Payment Condition was accepted. | . | decline-condition | A Payment Condition was declined. | . | authorization | A Pre Auth Payment Request was approved and confirmations can be made against it. | . | confirmation | Funds on a Pre Auth have been drawn down on. | . | release | Pre Auth has been finalised and any remaining funds from Authorization have been returned. | . Cancellation Reasons . | Reason | Description | . | CANCELLED_BY_MERCHANT | The merchant cancelled the payment request by calling the cancel or void endpoint. | . | CANCELLED_BY_PATRON | The patron cancelled the transaction. | . | PATRON_CODE_INVALID | The patron code on the payment request was invalid. | . | PAYMENT_FAILED | The payment request failed for an unknown reason. | . | PATRON_CODE_EXPIRED | The patron code on the payment request has expired. | . | DECLINED_BY_PATRON | The payment was declined by the patron during approval steps. | . | DECLINED_BY_MERCHANT | The payment was declined by the merchant during approval steps. | . | PAYMENT_DECLINED | The payment parameters were valid but payment was declined because additional payment restrictions were violated. For example, asset not active, asset overdrawn, quota exceeded or line item category restrictions. | . | PAYMENT_REQUEST_EXPIRED | The payment request has expired. | . | NO_AVAILABLE_PAYMENT_OPTIONS | No payment options match the requested payment parameters. | . | INACTIVE_ASSET | The asset used to pay the payment request is inactive. | . ",
- "url": "/api/payment-requests#models",
- "relUrl": "/api/payment-requests#models"
- },"138": {
- "doc": "Payment Requests",
- "title": "Operations",
- "content": ". Create a Payment Request . POST /api/payment-requests Create a Payment Request . curl -X POST https://service.centrapay.com/api/payment-requests \\ -H \"X-Api-Key: $api_key\" \\ -H \"Content-Type: application/json\" \\ -d '{ \"configId\": \"5efbe2fb96c08357bb2b9242\", \"value\": { \"amount\": \"8991\", \"currency\": \"NZD\" } }' . Create a Payment Request with redirect url . curl -X POST https://service.centrapay.com/api/payment-requests \\ -H \"X-Api-Key: $api_key\" \\ -H \"Content-Type: application/json\" \\ -d '{ \"configId\": \"5efbe2fb96c08357bb2b9242\", \"value\": { \"amount\": \"8991\", \"currency\": \"NZD\" }, \"redirectUrl\": \"https://example.com/store/checkout?cartId=1234\" }' . Create a Payment Request with a Barcode . curl -X POST https://service.centrapay.com/api/payment-requests \\ -H \"X-Api-Key: $api_key\" \\ -H \"Content-Type: application/json\" \\ -d '{ \"barcode\": \"1219210961929460\", \"configId\": \"5efbe2fb96c08357bb2b9242\", \"value\": { \"amount\": \"8991\", \"currency\": \"NZD\" } }' . Create a Pre Auth Payment Request . curl -X POST https://service.centrapay.com/api/payment-requests \\ -H \"X-Api-Key: $api_key\" \\ -H \"Content-Type: application/json\" \\ -d '{ \"barcode\": \"1219210961929460\", \"configId\": \"5efbe2fb96c08357bb2b9242\", \"value\": { \"amount\": \"8991\", \"currency\": \"NZD\" }, \"preAuth\": true }' . Create a Payment Request with purchase order, invoice, and external reference . curl -X POST https://service.centrapay.com/api/payment-requests \\ -H \"X-Api-Key: $api_key\" \\ -H \"Content-Type: application/json\" \\ -d '{ \"configId\": \"5efbe2fb96c08357bb2b9242\", \"value\": { \"amount\": \"8991\", \"currency\": \"NZD\" }, \"purchaseOrderRef\": \"oF6kj1QlH5gK0y9rjRHFh2\", \"invoiceRef\": \"sy8CRmo3sp3ArOpnfmb423\", \"externalRef\": \"dYTC266s4DFdsgGd909f\" }' . Create a Payment Request with Line Items . curl -X POST https://service.centrapay.com/api/payment-requests \\ -H \"X-Api-Key: $api_key\" \\ -H \"Content-Type: application/json\" \\ -d '{ \"configId\": \"5efbe2fb96c08357bb2b9242\", \"value\": { \"amount\": \"6190\", \"currency\": \"NZD\" }, \"lineItems\": [ { \"name\": \"Coffee Grounds\", \"sku\": \"GH1234\", \"qty\": \"1\", \"price\": \"4195\", \"tax\": \"15.00\" }, { \"name\": \"Centrapay Cafe Mug\", \"sku\": \"SB456\", \"qty\": \"25\", \"price\": \"1995\", \"tax\": \"15.00\", \"discount\": \"199\", \"restricted\": true, \"productId\": \"19412345123459\", \"classification\": { \"type\": \"GS1\", \"code\": \"10001874\", \"name\": \"CROCKERY\", \"props\": { \"20001479\": \"30008960\" } } } ] }' . Create a Payment Request with Line Items and Partial Pay . curl -X POST https://service.centrapay.com/api/payment-requests \\ -H \"X-Api-Key: $api_key\" \\ -H \"Content-Type: application/json\" \\ -d '{ \"configId\": \"5efbe2fb96c08357bb2b9242\", \"value\": { \"amount\": \"6190\", \"currency\": \"NZD\" }, \"partialAllowed\": true, \"basketAmount\": \"10000\", \"lineItems\": [ { \"name\": \"Coffee Grounds\", \"sku\": \"GH1234\", \"qty\": \"1\", \"price\": \"4195\", \"tax\": \"15.00\" }, { \"name\": \"Centrapay Cafe Mug\", \"sku\": \"SB456\", \"qty\": \"25\", \"price\": \"1995\", \"tax\": \"15.00\", \"discount\": \"199\", \"restricted\": true, \"productId\": \"19412345123459\", \"classification\": { \"type\": \"GS1\", \"code\": \"10001874\", \"name\": \"CROCKERY\", \"props\": { \"20001479\": \"30008960\" } } } ] }' . Create a Payment Request with barcode, barcodeType, and collectionId . curl -X POST https://service.centrapay.com/api/payment-requests \\ -H \"X-Api-Key: $api_key\" \\ -H \"Content-Type: application/json\" \\ -d '{ \"configId\": \"5efbe2fb96c08357bb2b9242\", \"value\": { \"amount\": \"25\", \"currency\": \"NZD\" }, \"barcode\": \"6273d06820db5ec22914f697c95b07122\", \"barcodeType\": \"ticketek\", \"collectionId\": \"C12345\", \"lineItems\": [ { \"name\": \"Coffee Grounds\", \"sku\": \"GH1234\", \"qty\": \"1\", \"price\": \"4195\", \"tax\": \"15.00\" }, { \"name\": \"Centrapay Cafe Mug\", \"sku\": \"SB456\", \"qty\": \"25\", \"price\": \"1995\", \"tax\": \"15.00\", \"discount\": \"199\", \"restricted\": true, \"productId\": \"19412345123459\", \"classification\": { \"type\": \"GS1\", \"code\": \"10001874\", \"name\": \"CROCKERY\", \"props\": { \"20001479\": \"30008960\" } } } ] }' . Fields . | Field | Type | Description | . | configId | String | The Merchant Config id used to configure the payment options. | . | value | Monetary | The canonical value of the payment request. Must be positive. | . | barcode | String Optional | The Scanned Code to identify the account to attach the payment request to | . | barcodeType | String Optional | Indicates the provider of a barcode, e.g. ‘ticketek’ | . | collectionId | String Optional | The identifier of the token collection | . | expirySeconds | String Optional | How long the payment request will be payable for. Maximum value: 86400 (24 hours). | . | lineItems | Array Optional | Experimental The Line Items being paid for. | . | purchaseOrderRef | String Optional | A reference to a purchase order for this payment request. | . | invoiceRef | String Optional | A reference to an invoice for this payment request. Must be less than or equal to 128 characters. | . | externalRef | String Optional | An external reference to the payment request | . | redirectUrl | String Optional | Experimental URL to redirect the user to after they pay or cancel the Payment Request. Must start with one of the allowedRedirectUrls for the Merchant Config. | . | terminalId | String Optional | The software or logical id of the payment terminal. | . | deviceId | String Optional | The hardware id or serial number of the payment terminal. | . | operatorId | String Optional | The POS operator Id. | . | conditionsEnabled | Boolean Optional | Flag to opt into accepting Asset Types which require conditions to be met. If not set, assets which require conditions will not be payment options. | . | patronNotPresent | Boolean Optional | Flag to indicate the patron is not physically present. This may affect payment conditions or available Payment Options. | . | preAuth | Boolean Optional | Flag to indicate if the Payment Request is a Pre Auth for supported Asset Types. If set barcode must be provided. | . | partialAllowed | Boolean Optional | Flag to indicate if the Payment Request can be partially paid for. If set basketAmount must be provided. | . | basketAmount | Monetary Optional | The total amount of the payment expected from the customer, including payments outside of Centrapay. Must be less than 100000000 and positive. If provided partialAllowed must also be set. | . Example response payload . { \"id\": \"MhocUmpxxmgdHjr7DgKoKw\", \"shortCode\": \"CP-C7F-ZS5\", \"url\": \"https://app.centrapay.com/pay/MhocUmpxxmgdHjr7DgKoKw\", \"patronCodeId\": \"V17FByEP9gm1shSG6a1Zzx\", \"barcode\": \"9990001234567895\", \"barcodeType\": \"ticketek\", \"collectionId\": \"C12345\", \"merchantId\": \"26d3Cp3rJmbMHnuNJmks2N\", \"merchantName\": \"Centrapay Café\", \"configId\": \"5efbe2fb96c08357bb2b9242\", \"purchaseOrderRef\": \"oF6kj1QlH5gK0y9rjRHFh2\", \"invoiceRef\": \"sy8CRmo3sp3ArOpnfmb423\", \"value\": { \"currency\": \"NZD\", \"amount\": \"6190\" }, \"paymentOptions\": [ { \"amount\": \"6190\", \"assetType\": \"centrapay.nzd.test\" }, { \"amount\": \"6190\", \"assetType\": \"epay.nzd.test\", \"productCodes\": [ \"23403\" ] }, { \"amount\": \"6190\", \"assetType\": \"centrapay.token.test\", \"acceptedCollections\": [ { \"id\": \"QWNB6jurnBczmvXDVfRuMK\", \"lineItems\": [ { \"name\": \"Coffee Grounds\", \"sku\": \"GH1234\", \"qty\": \"1\", \"price\": \"4195\", \"tax\": \"15.00\" } ] } ] } ], \"lineItems\": [ { \"name\": \"Coffee Grounds\", \"sku\": \"GH1234\", \"qty\": \"1\", \"price\": \"4195\", \"tax\": \"15.00\" }, { \"name\": \"Centrapay Cafe Mug\", \"sku\": \"SB456\", \"qty\": \"25\", \"price\": \"1995\", \"tax\": \"15.00\", \"discount\": \"199\" } ], \"merchantConditions\": [ ], \"status\": \"new\", \"createdAt\": \"2021-06-08T04:04:27.426Z\", \"updatedAt\": \"2021-06-08T04:04:27.426Z\", \"expiresAt\": \"2021-06-08T04:06:27.426Z\", \"liveness\": \"test\", \"expirySeconds\": 120 } . Error Responses . | Status | Code | Description | . | 400 | LINE_ITEMS_SUM_CHECK_FAILED | The sum value of the line items did not equal the value of the payment request. | . | 403 | REDIRECT_URL_INVALID | The supplied redirectUrl does not start with one of the allowedRedirectUrls on the Merchant Config. | . | 400 | CHECKSUM_FAILED | Luhn checksum digit doesn’t pass. | . | 403 | PATRON_CODE_INVALID | Patron Code doesn’t exist or has expired. | . | 403 | NO_AVAILABLE_PAYMENT_OPTIONS | No payment options match the requested payment parameters. | . | 403 | TOKEN_COLLECTION_NOT_FOUND | The token collection does not exist. | . Get a Payment Request . GET /api/payment-requests/{paymentRequestId} . curl https://service.centrapay.com/api/payment-requests/MhocUmpxxmgdHjr7DgKoKw \\ -H \"Authorization: $jwt\" . Example response payload . { \"id\": \"MhocUmpxxmgdHjr7DgKoKw\", \"shortCode\": \"CP-C7F-ZS5\", \"url\": \"https://app.centrapay.com/pay/MhocUmpxxmgdHjr7DgKoKw\", \"patronCodeId\": \"V17FByEP9gm1shSG6a1Zzx\", \"barcode\": \"9990001234567895\", \"merchantId\": \"26d3Cp3rJmbMHnuNJmks2N\", \"merchantName\": \"Centrapay Café\", \"configId\": \"5efbe2fb96c08357bb2b9242\", \"purchaseOrderRef\": \"oF6kj1QlH5gK0y9rjRHFh2\", \"invoiceRef\": \"sy8CRmo3sp3ArOpnfmb423\", \"value\": { \"currency\": \"NZD\", \"amount\": \"8991\" }, \"paymentOptions\": [ { \"amount\": \"8991\", \"assetType\": \"centrapay.nzd.test\" }, { \"amount\": \"6190\", \"assetType\": \"centrapay.token.test\", \"acceptedCollections\": [ { \"id\": \"QWNB6jurnBczmvXDVfRuMK\", \"lineItems\": [ { \"name\": \"Coffee Grounds\", \"sku\": \"GH1234\", \"qty\": \"1\", \"price\": \"4195\", \"tax\": \"15.00\" } ] } ] } ], \"lineItems\": [ { \"name\": \"Coffee Grounds\", \"sku\": \"GH1234\", \"qty\": \"1\", \"price\": \"4195\", \"tax\": \"15.00\" }, { \"name\": \"Centrapay Cafe Mug\", \"sku\": \"SB456\", \"qty\": \"25\", \"price\": \"1995\", \"tax\": \"15.00\", \"discount\": \"199\" } ], \"merchantConditions\": [ { \"id\": \"1\", \"name\": \"photo-id-check\", \"message\": \"Please check ID\", \"status\": \"awaiting-merchant\" } ], \"status\": \"new\", \"createdAt\": \"2021-06-08T04:04:27.426Z\", \"updatedAt\": \"2021-06-08T04:04:27.426Z\", \"expiresAt\": \"2021-06-08T04:06:27.426Z\", \"liveness\": \"test\", \"expirySeconds\": 120 } . Example response payload paid by multiple asset types . { \"id\": \"MhocUmpxxmgdHjr7DgKoKw\", \"shortCode\": \"CP-C7F-ZS5\", \"url\": \"https://app.centrapay.com/pay/MhocUmpxxmgdHjr7DgKoKw\", \"merchantId\": \"26d3Cp3rJmbMHnuNJmks2N\", \"merchantName\": \"Centrapay Café\", \"configId\": \"5efbe2fb96c08357bb2b9242\", \"value\": { \"currency\": \"NZD\", \"amount\": \"6910\" }, \"paymentOptions\": [ { \"amount\": \"6910\", \"assetType\": \"centrapay.nzd.main\" }, { \"amount\": \"6910\", \"assetType\": \"centrapay.token.main\", \"acceptedCollections\": [ { \"id\": \"QWNB6jurnBczmvXDVfRuMK\", \"lineItems\": [ { \"name\": \"Coffee Grounds\", \"sku\": \"GH1234\", \"qty\": \"1\", \"price\": \"4195\", \"tax\": \"15.00\" } ] } ] } ], \"lineItems\": [ { \"name\": \"Coffee Grounds\", \"sku\": \"GH1234\", \"qty\": \"1\", \"price\": \"4195\", \"tax\": \"15.00\" }, { \"name\": \"Centrapay Cafe Mug\", \"sku\": \"SB456\", \"qty\": \"25\", \"price\": \"1995\", \"tax\": \"15.00\", \"discount\": \"199\" } ], \"merchantConditions\": [ ], \"status\": \"paid\", \"createdAt\": \"2021-06-08T04:04:27.426Z\", \"updatedAt\": \"2021-06-08T04:04:27.426Z\", \"expiresAt\": \"2021-06-08T04:06:27.426Z\", \"liveness\": \"main\", \"expirySeconds\": 120, \"paidBy\": { \"assetTotals\": [ { \"type\": \"centrapay.nzd.main\", \"description\": \"Centrapay NZD\", \"settlementDate\": \"2021-06-28T04:04:27.426Z\", \"total\": { \"amount\": \"1995\", \"currency\": \"NZD\" } }, { \"type\": \"centrapay.token.main\", \"description\": \"Centrapay Token\", \"settlementDate\": \"2021-06-28T04:04:27.426Z\", \"total\": { \"amount\": \"4195\", \"currency\": \"NZD\" }, \"lineItems\": [ { \"name\": \"Coffee Grounds\", \"sku\": \"GH1234\", \"qty\": \"1\", \"price\": \"4195\", \"tax\": \"15.00\" } ] } ] } } . Example response payload for a Pre Auth Payment Request . { \"id\": \"MhocUmpxxmgdHjr7DgKoKw\", \"shortCode\": \"CP-C7F-ZS5\", \"url\": \"https://app.centrapay.com/pay/MhocUmpxxmgdHjr7DgKoKw\", \"barcode\": 503901342, \"merchantId\": \"26d3Cp3rJmbMHnuNJmks2N\", \"merchantName\": \"Centrapay Café\", \"configId\": \"5efbe2fb96c08357bb2b9242\", \"value\": { \"currency\": \"NZD\", \"amount\": \"1000\" }, \"paymentOptions\": [ { \"amount\": \"1000\", \"assetType\": \"farmlands.nzd.main\" } ], \"merchantConditions\": [ ], \"status\": \"new\", \"createdAt\": \"2021-06-08T04:04:27.426Z\", \"updatedAt\": \"2021-06-08T04:04:27.426Z\", \"expiresAt\": \"2021-06-08T04:06:27.426Z\", \"liveness\": \"main\", \"expirySeconds\": 120, \"preAuth\": true, \"preAuthStatus\": \"authorized\", \"preAuthExpiresAt\": \"2021-09-08T04:04:27.426Z\" } . Get a Payment Request by Short Code . Returns the latest Payment Request that matches the given short code. GET /api/payment-requests/short-code/{shortCode} . curl https://service.centrapay.com/api/payment-requests/short-code/CP-C7F-ZS5 \\ -H \"Authorization: $jwt\" . Example response payload with a Payment Request . { \"id\": \"MhocUmpxxmgdHjr7DgKoKw\", \"shortCode\": \"CP-C7F-ZS5\", \"url\": \"https://app.centrapay.com/pay/MhocUmpxxmgdHjr7DgKoKw\", \"patronCodeId\": \"V17FByEP9gm1shSG6a1Zzx\", \"barcode\": \"9990001234567895\", \"merchantId\": \"26d3Cp3rJmbMHnuNJmks2N\", \"merchantName\": \"Centrapay Café\", \"configId\": \"5efbe2fb96c08357bb2b9242\", \"value\": { \"currency\": \"NZD\", \"amount\": \"100\" }, \"paymentOptions\": [ { \"amount\": \"100\", \"assetType\": \"centrapay.nzd.test\" } ], \"merchantConditions\": [ ], \"status\": \"new\", \"createdAt\": \"2021-06-08T04:04:27.426Z\", \"updatedAt\": \"2021-06-08T04:04:27.426Z\", \"expiresAt\": \"2021-06-08T04:06:27.426Z\", \"liveness\": \"test\", \"expirySeconds\": 120 } . Error Responses . | Status | Code | Description | . | 400 | CHECKSUM_FAILED | Luhn checksum digit doesn’t pass. | . Get a Payment Request linked to a Patron Code . Returns the latest Payment Request with status “new” that has been attached to a Patron Code. The Payment Request may have been created with a reference to any Patron Code owned by the user’s account. This endpoint should be polled just after a user’s Patron Code has been scanned. This will allow them to find the Payment Request and proceed to pay. GET /api/me/patron-code-payment-request . curl https://service.centrapay.com/api/me/patron-code-payment-request \\ -H \"Authorization: $jwt\" . Example response payload when no new Payment Request found . { } . Example response payload with a Payment Request . { \"id\": \"MhocUmpxxmgdHjr7DgKoKw\", \"shortCode\": \"CP-C7F-ZS5\", \"url\": \"https://app.centrapay.com/pay/MhocUmpxxmgdHjr7DgKoKw\", \"patronCodeId\": \"V17FByEP9gm1shSG6a1Zzx\", \"barcode\": \"9990001234567895\", \"merchantId\": \"26d3Cp3rJmbMHnuNJmks2N\", \"merchantName\": \"Centrapay Café\", \"configId\": \"5efbe2fb96c08357bb2b9242\", \"value\": { \"currency\": \"NZD\", \"amount\": \"100\" }, \"paymentOptions\": [ { \"amount\": \"100\", \"assetType\": \"centrapay.nzd.test\" } ], \"merchantConditions\": [ ], \"status\": \"new\", \"createdAt\": \"2021-06-08T04:04:27.426Z\", \"updatedAt\": \"2021-06-08T04:04:27.426Z\", \"expiresAt\": \"2021-06-08T04:06:27.426Z\", \"liveness\": \"test\", \"expirySeconds\": 120 } . Pay a Payment Request . To pay a payment request you must supply the name of the Asset Type and one of assetId, transactionId or authorization. Use assetId if the Asset Type is managed by Centrapay. Use transactionId to verify an external transaction such as a Bitcoin payment. Use authorization to authorize an external transaction. POST /api/payment-requests/{paymentRequestId}/pay Pay a Payment Request with a Centrapay asset . curl -X POST https://service.centrapay.com/api/payment-requests/{paymentRequestId}/pay \\ -H \"Authorization: $jwt\" \\ -H \"Content-Type: application/json\" \\ -d '{ \"assetType\": \"centrapay.nzd.main\", \"assetId\": \"WRhAxxWpTKb5U7pXyxQjjY\" }' . Pay a Payment Request using external transaction . curl -X POST https://service.centrapay.com/api/payment-requests/{paymentRequestId}/pay \\ -H \"Authorization: $jwt\" \\ -H \"Content-Type: application/json\" \\ -d '{ \"assetType\": \"bitcoin.main\", \"transactionId\": \"VMXMkUttDGTVz4ESv5ND56\" }' . Pay a Payment Request using authorization . curl -X POST https://service.centrapay.com/api/payment-requests/{paymentRequestId}/pay \\ -H \"Authorization: $jwt\" \\ -H \"Content-Type: application/json\" \\ -d '{ \"assetType\": \"stadius.main\", \"authorization\": \"LiOkwEtDGTVz4ESv5NS83\" }' . Partially Pay a Payment Request . curl -X POST https://service.centrapay.com/api/payment-requests/{paymentRequestId}/pay \\ -H \"Authorization: $jwt\" \\ -H \"Content-Type: application/json\" \\ -d '{ \"assetType\": \"centrapay.nzd.main\", \"assetId\": \"WRhAxxWpTKb5U7pXyxQjjY\", \"amount\": \"200\", \"mode\": \"partial-payment\" }' . Fields . | Field | Type | Description | . | assetType | String | The name of the Asset Type. | . | assetId | String Optional | The id of the Asset being used to make payment. | . | transactionId | String Optional | Used to verify an external transaction eg Bitcoin. | . | authorization | String Optional | Used to authorize an external transaction. | . | mode | String Optional | The mode of payment valid value is parital-payment. | . | amount | String Optional | The amount being paid if less than the Payment Request amount. | . One of either assetId, transactionId or authorization must be provided. Example response payload . { \"type\": \"payment\", \"value\": { \"currency\": \"NZD\", \"amount\": \"1000\" }, \"assetType\": \"centrapay.nzd.main\", \"paymentRequestId\": \"MhocUmpxxmgdHjr7DgKoKw\", \"shortCode\": \"CP-C7F-ZS5-015\", \"merchantName\": \"Centrapay Café\", \"merchantId\": \"26d3Cp3rJmbMHnuNJmks2N\", \"merchantAccountId\": \"C4QnjXvj8At6SMsEN4LRi9\", \"merchantConfigId\": \"5efbe2fb96c08357bb2b9242\", \"createdAt\": \"2021-06-08T04:04:27.426Z\", \"createdBy\": \"crn::user:0af834c8-1110-11ec-9072-3e22fb52e878\", \"paymentRequestCreatedBy\": \"crn::user:0af834c8-1110-11ec-9072-3e22fb52e878\", \"activityNumber\": \"2\", \"mode\": \"partial-payment\" } . Error Responses . | Status | Code | Description | . | 403 | INVALID_ASSET_TYPE | Either the merchant is not configured with the provided asset type or the asset type does not exist. | . | 403 | REQUEST_EXPIRED | Action cannot be completed because the request has expired. | . | 403 | REQUEST_PAID | Action cannot be completed because the request has been paid. | . | 403 | REQUEST_CANCELLED | Action cannot be completed because the request has already been cancelled. | . | 403 | INACTIVE_ASSET | The asset is not spendable. It may have been disabled, expired, or already spent. | . | 403 | INVALID_MERCHANT_CONFIG | The merchant is not configured properly to satisfy the payment request. This could be due to incorrect information, or the merchant’s credentials might be blocked by an external service. | . | 403 | QUOTA_EXCEEDED | The payment pay request exceeds the allowed spend quota supplied. | . | 403 | INSUFFICIENT_ASSET_VALUE | The asset has insufficient funds to pay the payment request or the transaction amount received by Centrapay is less than the total of the payment. | . | 403 | ASSET_REDEMPTION_DENIED | The asset redemption has been unsuccessful due to an error with provided payment parameters, the merchant, or the asset. | . | 403 | PAYMENT_DECLINED | The payment parameters were valid but payment was declined because additional payment restrictions were violated. | . Refund a Payment Request . POST /api/payment-requests/{paymentRequestId}/refund Refund a Payment Request . curl -X POST https://service.centrapay.com/api/payment-requests/{paymentRequestId}/refund \\ -H \"X-Api-Key: $api_key\" \\ -H \"Content-Type: application/json\" \\ -d '{ \"value\": { \"amount\": \"100\", \"currency\": \"NZD\" }, \"externalRef\": \"e8df06e2-13a5-48b4-b670-3fd6d815fe0a\" }' . Refund a Payment Request with Line Items . curl -X POST https://service.centrapay.com/api/payment-requests/{paymentRequestId}/refund \\ -H \"X-Api-Key: $api_key\" \\ -H \"Content-Type: application/json\" \\ -d '{ \"value\": { \"amount\": \"6190\", \"currency\": \"NZD\" }, \"externalRef\": \"e8df06e2-13a5-48b4-b670-3fd6d815fe0a\", \"lineItems\": [ { \"name\": \"Coffee Grounds\", \"sku\": \"GH1234\", \"qty\": \"1\", \"price\": \"4195\", \"tax\": \"15.00\" }, { \"name\": \"Centrapay Cafe Mug\", \"sku\": \"SB456\", \"qty\": \"25\", \"price\": \"1995\", \"tax\": \"15.00\", \"discount\": \"199\", \"restricted\": true, \"productId\": \"19412345123459\", \"classification\": { \"type\": \"GS1\", \"code\": \"10001874\", \"name\": \"CROCKERY\", \"props\": { \"20001479\": \"30008960\" } } } ] }' . Refund a Pre Auth Payment Request with Confirmations . curl -X POST https://service.centrapay.com/api/payment-requests/{paymentRequestId}/refund \\ -H \"X-Api-Key: $api_key\" \\ -H \"Content-Type: application/json\" \\ -d '{ \"confirmationIdempotencyKey\": \"e8df06e2-13a5-48b4-b670-3fd6d815fe0a\", \"value\": { \"amount\": \"6190\", \"currency\": \"NZD\" }, \"externalRef\": \"e8df06e2-13a5-48b4-b670-3fd6d815fe0a\", \"lineItems\": [ { \"name\": \"Coffee Grounds\", \"sku\": \"GH1234\", \"qty\": \"1\", \"price\": \"4195\", \"tax\": \"15.00\" }, { \"name\": \"Centrapay Cafe Mug\", \"sku\": \"SB456\", \"qty\": \"25\", \"price\": \"1995\", \"tax\": \"15.00\", \"discount\": \"199\", \"restricted\": true, \"productId\": \"19412345123459\", \"classification\": { \"type\": \"GS1\", \"code\": \"10001874\", \"name\": \"CROCKERY\", \"props\": { \"20001479\": \"30008960\" } } } ] }' . Refund a Payment Request with Invoice Reference . curl -X POST https://service.centrapay.com/api/payment-requests/{paymentRequestId}/refund \\ -H \"X-Api-Key: $api_key\" \\ -H \"Content-Type: application/json\" \\ -d '{ \"value\": { \"amount\": \"100\", \"currency\": \"NZD\" }, \"externalRef\": \"e8df06e2-13a5-48b4-b670-3fd6d815fe0a\", \"invoiceRef\": \"sy8CRmo3sp3ArOpnfmb423\" }' . Refund a Payment Request using a specific Merchant . curl -X POST https://service.centrapay.com/api/payment-requests/{paymentRequestId}/refund \\ -H \"X-Api-Key: $api_key\" \\ -H \"Content-Type: application/json\" \\ -d '{ \"value\": { \"amount\": \"100\", \"currency\": \"NZD\" }, \"externalRef\": \"e8df06e2-13a5-48b4-b670-3fd6d815fe0a\", \"merchantConfigId\": \"5ee168e8597be5002af7b454\" }' . Fields . | Field | Type | Description | . | value | Monetary | The value of the refund. Must be less than 100000000 and positive. | . | externalRef | String | An external reference to the refund. | . | merchantConfigId | String Optional | The Merchant Config id of the refunding merchant when refunding a farmlands.nzd.* payment. | . | lineItems | Array Optional | Experimental The Line Items being refunded. | . | confirmationIdempotencyKey | String Optional | Required when refunding a Pre Auth Confirmation. Should be the same as the idempotencyKey used for Confirmation. | . | invoiceRef | String Optional | A reference to an invoice for the refund. Must be less than or equal to 128 characters. | . Example response payload . { \"type\": \"refund\", \"value\": { \"currency\": \"NZD\", \"amount\": \"100\" }, \"assetType\": \"centrapay.nzd.main\", \"paymentRequestId\": \"MhocUmpxxmgdHjr7DgKoKw\", \"shortCode\": \"CP-C7F-ZS5-015\", \"merchantName\": \"Centrapay Café\", \"merchantId\": \"5ee0c486308f590260d9a07f\", \"merchantAccountId\": \"C4QnjXvj8At6SMsEN4LRi9\", \"merchantConfigId\": \"5ee168e8597be5002af7b454\", \"createdAt\": \"2021-06-12T01:17:00.000Z\", \"createdBy\": \"crn::user:0af834c8-1110-11ec-9072-3e22fb52e878\", \"paymentRequestCreatedBy\": \"crn::user:0af834c8-1110-11ec-9072-3e22fb52e878\", \"activityNumber\": \"3\", \"invoiceRef\": \"sy8CRmo3sp3ArOpnfmb423\" } . Error Responses . | Status | Code | Description | . | 403 | NOT_PAID | The Payment Request has not been paid. | . | 403 | ALREADY_REFUNDED | The Payment Request already been refunded. If you want to perfom additional refunds then an externalRef is required. | . | 403 | INVALID_AMOUNT | The refund requested is greater than the refundable amount. | . | 403 | REPEAT_REFERENCE | A refund has already been requested with the same external reference. Refunding the payment request twice with the same external reference is not allowed. If the amount of the refund is the same we assume it is a repeat request and return 200. | . | 403 | PARTIAL_REFUNDS_NOT_ALLOWED | The Asset does not support partial refunds. | . | 403 | INACTIVE_ASSET | The Asset is not refundable. It may have been disabled, expired, or already refunded. | . | 403 | REFUND_NOT_SUPPORTED | The Asset type does not support refunds. | . | 403 | REFUND_WINDOW_EXCEEDED | The time since the payment exceeds the window of time a payment request can be refunded in. | . | 400 | LINE_ITEMS_SUM_CHECK_FAILED | The sum value of the line items did not equal the value of the refund. | . | 403 | PRE_AUTH_PENDING | The Pre Auth Payment Request has yet to be authorized. | . | 403 | CONFIRMATION_NOT_FOUND | The confirmationIdempotencyKey does not match a Confirmation on the Payment Request. | . Void a Payment Request . Voiding a payment request will cancel the request and trigger any refunds if necessary. POST /api/payment-requests/{paymentRequestId}/void . curl -X POST https://service.centrapay.com/api/payment-requests/MhocUmpxxmgdHjr7DgKoKw/void \\ -H \"X-Api-Key: $api_key\" . Example response payload when payment request is unpaid . { \"type\": \"cancellation\", \"cancellationReason\": \"CANCELLED_BY_MERCHANT\", \"value\": { \"currency\": \"NZD\", \"amount\": \"1000\" }, \"assetType\": \"centrapay.nzd.main\", \"paymentRequestId\": \"MhocUmpxxmgdHjr7DgKoKw\", \"shortCode\": \"CP-C7F-ZS5-032\", \"merchantName\": \"Centrapay Café\", \"merchantId\": \"26d3Cp3rJmbMHnuNJmks2N\", \"merchantAccountId\": \"C4QnjXvj8At6SMsEN4LRi9\", \"merchantConfigId\": \"5efbe2fb96c08357bb2b9242\", \"createdAt\": \"2021-06-08T04:04:27.426Z\", \"createdBy\": \"crn::user:0af834c8-1110-11ec-9072-3e22fb52e878\", \"paymentRequestCreatedBy\": \"crn::user:0af834c8-1110-11ec-9072-3e22fb52e878\", \"activityNumber\": \"2\" } . Example response payload when payment request is paid . { \"type\": \"refund\", \"value\": { \"currency\": \"NZD\", \"amount\": \"1000\" }, \"assetType\": \"centrapay.nzd.main\", \"paymentRequestId\": \"MhocUmpxxmgdHjr7DgKoKw\", \"shortCode\": \"CP-C7F-ZS5-032\", \"merchantName\": \"Centrapay Café\", \"merchantId\": \"26d3Cp3rJmbMHnuNJmks2N\", \"merchantAccountId\": \"C4QnjXvj8At6SMsEN4LRi9\", \"merchantConfigId\": \"5efbe2fb96c08357bb2b9242\", \"createdAt\": \"2021-06-08T04:04:27.426Z\", \"createdBy\": \"crn::user:0af834c8-1110-11ec-9072-3e22fb52e878\", \"paymentRequestCreatedBy\": \"crn::user:0af834c8-1110-11ec-9072-3e22fb52e878\", \"activityNumber\": \"3\" } . Error Responses . | Status | Code | Description | . | 403 | VOID_WINDOW_EXCEEDED | The void window is closed 24 hours after the Payment Request createdAt. After the void window has closed if the Payment Request is paid, use Refund endpoint to reverse the payment. | . | 403 | ALREADY_REFUNDED | The Payment Request has already been refunded. | . | 403 | REPEAT_REFERENCE | A refund has already been requested with the same external reference. Refunding the payment request twice with the same external reference is not allowed. If the amount of the refund is the same we assume it is a repeat request and return 200. | . | 403 | INACTIVE_ASSET | The Asset is not refundable. It may have been disabled, expired, or already refunded. | . | 403 | REFUND_NOT_SUPPORTED | The Asset type does not support refunds. | . | 403 | REQUEST_EXPIRED | The Payment Request has expired. | . | 403 | PRE_AUTH_ALREADY_CONFIRMED | The Pre Auth Payment Request already has confirmations. Use Refund endpoint to reverse the transaction. | . Release funds held for a Pre Auth Payment Request . When you call release on a Pre Auth Payment Request any remaining funds that were being held for the authorization are returned to the asset, and a release Payment Activity is returned. If the authorization never completed, the Payment Request will instead be cancelled, and a cancellation Payment Activity will be returned. POST /api/payment-requests/{paymentRequestId}/release . curl -X POST https://service.centrapay.com/api/payment-requests/MhocUmpxxmgdHjr7DgKoKw/release \\ -H \"X-Api-Key: $api_key\" . Example response payload when a Pre Auth is released . { \"type\": \"release\", \"value\": { \"currency\": \"NZD\", \"amount\": \"100\" }, \"assetType\": \"centrapay.nzd.main\", \"preAuth\": true, \"paymentRequestId\": \"MhocUmpxxmgdHjr7DgKoKw\", \"shortCode\": \"CP-C7F-ZS5-015\", \"merchantName\": \"Centrapay Café\", \"merchantId\": \"5ee0c486308f590260d9a07f\", \"merchantAccountId\": \"C4QnjXvj8At6SMsEN4LRi9\", \"merchantConfigId\": \"5ee168e8597be5002af7b454\", \"createdAt\": \"2021-06-12T01:17:00.000Z\", \"createdBy\": \"crn::user:0af834c8-1110-11ec-9072-3e22fb52e878\", \"paymentRequestCreatedBy\": \"crn::user:0af834c8-1110-11ec-9072-3e22fb52e878\", \"activityNumber\": \"3\" } . Example response payload when a Pre Auth is cancelled . { \"type\": \"cancellation\", \"cancellationReason\": \"CANCELLED_BY_MERCHANT\", \"value\": { \"currency\": \"NZD\", \"amount\": \"1000\" }, \"preAuth\": true, \"assetType\": \"centrapay.nzd.main\", \"paymentRequestId\": \"MhocUmpxxmgdHjr7DgKoKw\", \"shortCode\": \"CP-C7F-ZS5-032\", \"merchantName\": \"Centrapay Café\", \"merchantId\": \"26d3Cp3rJmbMHnuNJmks2N\", \"merchantAccountId\": \"C4QnjXvj8At6SMsEN4LRi9\", \"merchantConfigId\": \"5efbe2fb96c08357bb2b9242\", \"createdAt\": \"2021-06-08T04:04:27.426Z\", \"createdBy\": \"crn::user:0af834c8-1110-11ec-9072-3e22fb52e878\", \"paymentRequestCreatedBy\": \"crn::user:0af834c8-1110-11ec-9072-3e22fb52e878\", \"activityNumber\": \"2\" } . Error Responses . | Status | Code | Description | . | 403 | INVALID_PAYMENT_REQUEST_TYPE | The Payment Request is not related to a Pre Auth. | . | 403 | PRE_AUTH_RELEASED | preAuthExpiresAt has passed. | . Make a confirmation against a Pre Auth Payment Request . An idempotencyKey is a identifier from your system used for guaranteeing at least once delivery of your request. If our endpoint does not respond you must retry until you get back a 200 or 403. If we recive 2 requests with the same idempotencyKey we won’t process the second and return the first response. POST /api/payment-requests/{paymentRequestId}/confirm Confirm Pre Auth Payment Request . curl -X POST https://service.centrapay.com/api/payment-requests/MhocUmpxxmgdHjr7DgKoKw/confirm \\ -H \"X-Api-Key: $api_key\" \\ -H \"Content-Type: application/json\" \\ -d '{ \"value\": { \"amount\": \"6190\", \"currency\": \"NZD\" }, \"idempotencyKey\": \"e8df06e2-13a5-48b4-b670-3fd6d815fe0a\", \"invoiceRef\": \"2022-08-03T16:56:50-06:00\", \"lineItems\": [ { \"name\": \"Coffee Grounds\", \"sku\": \"GH1234\", \"qty\": \"1\", \"price\": \"4195\", \"tax\": \"15.00\" }, { \"name\": \"Centrapay Cafe Mug\", \"sku\": \"SB456\", \"qty\": \"25\", \"price\": \"1995\", \"tax\": \"15.00\", \"discount\": \"199\", \"restricted\": true, \"productId\": \"19412345123459\", \"classification\": { \"type\": \"GS1\", \"code\": \"10001874\", \"name\": \"CROCKERY\", \"props\": { \"20001479\": \"30008960\" } } } ] }' . Example response payload when a Pre Auth is confirmed . { \"paymentRequestId\": \"MhocUmpxxmgdHjr7DgKoKw\", \"shortCode\": \"CP-C7F-ZS5\", \"value\": { \"amount\": \"6190\", \"currency\": \"NZD\" }, \"preAuth\": true, \"type\": \"confirmation\", \"idempotencyKey\": \"e8df06e2-13a5-48b4-b670-3fd6d815fe0a\", \"createdAt\": \"2021-06-08T04:04:27.426Z\", \"updatedAt\": \"2021-06-08T04:04:27.426Z\", \"lineItems\": [ { \"name\": \"Coffee Grounds\", \"sku\": \"GH1234\", \"qty\": \"1\", \"price\": \"4195\", \"tax\": \"15.00\" }, { \"name\": \"Centrapay Cafe Mug\", \"sku\": \"SB456\", \"qty\": \"25\", \"price\": \"1995\", \"tax\": \"15.00\", \"discount\": \"199\" } ], \"invoiceRef\": \"2022-08-03T16:56:50-06:00\", \"createdByAccountId\": \"Jaim1Cu1Q55uooxSens6yk\", \"createdByAccountName\": \"Bob's Burgers Intergration\" } . Error Responses . | Status | Code | Description | . | 403 | INVALID_PAYMENT_REQUEST_TYPE | The Payment Request is not related to a Pre Auth. | . | 403 | PRE_AUTH_RELEASED | The Payment Request has been released or Pre Auth has expired. Remaining funds have been returned to the Patron. | . | 403 | PRE_AUTH_PENDING | The Payment Request has not been authorized. | . | 403 | REQUEST_CANCELLED | The Payment Request has been cancelled. | . | 403 | INVALID_AMOUNT | The confirmation is greater then the remaining funds on the authroization. | . | 403 | IDEMPOTENT_OPERATION_FAILED | There has already been a confirmation against the Payment Request with the same idempotencyKey but different content. | . List Payment Activities for a Merchant . List payment activities for a merchant. Results are paginated and ordered by descending activity created date. GET /api/payment-activities . curl -G https://service.centrapay.com/api/payment-activities \\ -H \"X-Api-Key: $api_key\" \\ -d merchantId=5ee0c486308f590260d9a07f \\ -d pageKey=PaymentRequest#E9eXsErwA444qFDoZt5iLA|Activity#000000000000001|614161c4c4d3020073bd4ce8|2021-09-15T03:00:21.156Z . Required Fields . | Field | Type | Description | . | merchantId | String | The id of the Merchant the Payment Request is on behalf of. | . Optional Fields . | Field | Type | Description | . | pageKey | String | Used to retrieve the next page of items. | . Note: The pageKey value, if provided, needs to be URL-encoded. Example response payload . { \"nextPageKey\": \"PaymentRequest#E9eXsErwA444qFDoZt5iLA|Activity#000000000000001|614161c4c4d3020073bd4ce8|2021-09-15T03:00:21.156Z\", \"items\": [ { \"type\": \"refund\", \"value\": { \"currency\": \"NZD\", \"amount\": \"600\" }, \"assetType\": \"centrapay.nzd.main\", \"paymentRequestId\": \"MhocUmpxxmgdHjr7DgKoKw\", \"shortCode\": \"CP-C7F-ZS5-032\", \"merchantName\": \"Centrapay Café\", \"merchantId\": \"5ee0c486308f590260d9a07f\", \"merchantAccountId\": \"C4QnjXvj8At6SMsEN4LRi9\", \"merchantConfigId\": \"5ee168e8597be5002af7b454\", \"createdAt\": \"2021-06-12T01:17:00.000Z\", \"createdBy\": \"crn::user:0af834c8-1110-11ec-9072-3e22fb52e878\", \"paymentRequestCreatedBy\": \"crn::user:0af834c8-1110-11ec-9072-3e22fb52e878\", \"activityNumber\": \"3\" }, { \"type\": \"payment\", \"value\": { \"currency\": \"NZD\", \"amount\": \"6190\" }, \"assetType\": \"centrapay.nzd.main\", \"paymentRequestId\": \"MhocUmpxxmgdHjr7DgKoKw\", \"shortCode\": \"CP-C7F-ZS5-027\", \"merchantName\": \"Centrapay Café\", \"merchantId\": \"5ee0c486308f590260d9a07f\", \"merchantAccountId\": \"C4QnjXvj8At6SMsEN4LRi9\", \"merchantConfigId\": \"5ee168e8597be5002af7b454\", \"createdAt\": \"2021-06-12T01:16:00.000Z\", \"createdBy\": \"crn::user:da75ad90-9a5b-4df0-8374-f48b3a8fbfcc\", \"paymentRequestCreatedBy\": \"crn::user:0af834c8-1110-11ec-9072-3e22fb52e878\", \"activityNumber\": \"2\" }, { \"type\": \"request\", \"value\": { \"currency\": \"NZD\", \"amount\": \"6190\" }, \"paymentRequestId\": \"MhocUmpxxmgdHjr7DgKoKw\", \"shortCode\": \"CP-C7F-ZS5-015\", \"merchantName\": \"Centrapay Café\", \"merchantId\": \"5ee0c486308f590260d9a07f\", \"merchantAccountId\": \"C4QnjXvj8At6SMsEN4LRi9\", \"merchantConfigId\": \"5ee168e8597be5002af7b454\", \"createdAt\": \"2021-06-12T01:15:46.000Z\", \"createdBy\": \"crn::user:0af834c8-1110-11ec-9072-3e22fb52e878\", \"paymentRequestCreatedBy\": \"crn::user:0af834c8-1110-11ec-9072-3e22fb52e878\", \"activityNumber\": \"1\" }, { \"type\": \"Authorization\", \"value\": { \"currency\": \"NZD\", \"amount\": \"100\" }, \"paymentRequestId\": \"5zXMDueDJRNNyP3UeWBgSA\", \"shortCode\": \"CP-W4R-01J\", \"merchantName\": \"Centrapay Café\", \"merchantId\": \"5ee0c486308f590260d9a07f\", \"merchantAccountId\": \"C4QnjXvj8At6SMsEN4LRi9\", \"merchantConfigId\": \"5ee168e8597be5002af7b454\", \"createdAt\": \"2021-05-12T01:15:46.000Z\", \"createdBy\": \"crn::user:0af834c8-1110-11ec-9072-3e22fb52e878\", \"paymentRequestCreatedBy\": \"crn::user:0af834c8-1110-11ec-9072-3e22fb52e878\", \"activityNumber\": \"2\", \"preAuth\": true }, { \"type\": \"preAuthRequest\", \"value\": { \"currency\": \"NZD\", \"amount\": \"100\" }, \"paymentRequestId\": \"5zXMDueDJRNNyP3UeWBgSA\", \"shortCode\": \"CP-W4R-01J\", \"merchantName\": \"Centrapay Café\", \"merchantId\": \"5ee0c486308f590260d9a07f\", \"merchantAccountId\": \"C4QnjXvj8At6SMsEN4LRi9\", \"merchantConfigId\": \"5ee168e8597be5002af7b454\", \"createdAt\": \"2021-05-12T01:15:46.000Z\", \"createdBy\": \"crn::user:0af834c8-1110-11ec-9072-3e22fb52e878\", \"paymentRequestCreatedBy\": \"crn::user:0af834c8-1110-11ec-9072-3e22fb52e878\", \"activityNumber\": \"1\", \"preAuth\": true } ] } . List Payment Activities for a Payment Request . List payment activities for a payment request. Results are ordered by descending activity created date. GET /api/payment-requests/{paymentRequestId}/activities . curl https://service.centrapay.com/api/payment-requests/MhocUmpxxmgdHjr7DgKoKw/activities \\ -H \"Authorization: $jwt\" . Example response payload . { \"items\": [ { \"type\": \"refund\", \"value\": { \"currency\": \"NZD\", \"amount\": \"600\" }, \"assetType\": \"centrapay.nzd.main\", \"paymentRequestId\": \"MhocUmpxxmgdHjr7DgKoKw\", \"shortCode\": \"CP-C7F-ZS5-032\", \"merchantName\": \"Centrapay Café\", \"merchantId\": \"5ee0c486308f590260d9a07f\", \"merchantAccountId\": \"C4QnjXvj8At6SMsEN4LRi9\", \"merchantConfigId\": \"5ee168e8597be5002af7b454\", \"createdAt\": \"2021-06-12T01:17:00.000Z\", \"createdBy\": \"crn::user:0af834c8-1110-11ec-9072-3e22fb52e878\", \"paymentRequestCreatedBy\": \"crn::user:0af834c8-1110-11ec-9072-3e22fb52e878\", \"activityNumber\": \"3\" }, { \"type\": \"payment\", \"value\": { \"currency\": \"NZD\", \"amount\": \"6190\" }, \"assetType\": \"centrapay.nzd.main\", \"paymentRequestId\": \"MhocUmpxxmgdHjr7DgKoKw\", \"shortCode\": \"CP-C7F-ZS5-027\", \"merchantName\": \"Centrapay Café\", \"merchantId\": \"5ee0c486308f590260d9a07f\", \"merchantAccountId\": \"C4QnjXvj8At6SMsEN4LRi9\", \"merchantConfigId\": \"5ee168e8597be5002af7b454\", \"createdAt\": \"2021-06-12T01:16:00.000Z\", \"createdBy\": \"crn::user:da75ad90-9a5b-4df0-8374-f48b3a8fbfcc\", \"paymentRequestCreatedBy\": \"crn::user:0af834c8-1110-11ec-9072-3e22fb52e878\", \"activityNumber\": \"2\" }, { \"type\": \"request\", \"value\": { \"currency\": \"NZD\", \"amount\": \"6190\" }, \"paymentRequestId\": \"MhocUmpxxmgdHjr7DgKoKw\", \"shortCode\": \"CP-C7F-ZS5-015\", \"merchantName\": \"Centrapay Café\", \"merchantId\": \"5ee0c486308f590260d9a07f\", \"merchantAccountId\": \"C4QnjXvj8At6SMsEN4LRi9\", \"merchantConfigId\": \"5ee168e8597be5002af7b454\", \"createdAt\": \"2021-06-12T01:15:46.000Z\", \"createdBy\": \"crn::user:0af834c8-1110-11ec-9072-3e22fb52e878\", \"paymentRequestCreatedBy\": \"crn::user:0af834c8-1110-11ec-9072-3e22fb52e878\", \"activityNumber\": \"1\" } ] } . Accept Payment Condition for a Payment Request . Accept a Payment Condition listed in merchantConditions with status awaiting-merchant. Returns a Payment Activity. POST /api/payment-requests/{paymentRequestId}/conditions/{conditionId}/accept . curl -X POST https://service.centrapay.com/api/payment-requests/MhocUmpxxmgdHjr7DgKoKw/conditions/1/accept \\ -H \"X-Api-Key: $api_key\" . Example response payload . { \"type\": \"accept-condition\", \"value\": { \"currency\": \"NZD\", \"amount\": 100 }, \"paymentRequestId\": \"MhocUmpxxmgdHjr7DgKoKw\", \"conditionId\": \"1\", \"createdAt\": \"2022-05-12T01:17:00.000Z\", \"createdBy\": \"crn::user:0af834c8-1110-11ec-9072-3e22fb52e878\", \"paymentRequestCreatedBy\": \"crn::user:0af834c8-1110-11ec-9072-3e22fb52e878\", \"activityNumber\": \"2\", \"merchantAccountId\": \"C4QnjXvj8At6SMsEN4LRi9\", \"merchantId\": \"5ee0c486308f590260d9a07f\", \"merchantConfigId\": \"5ee168e8597be5002af7b454\", \"merchantName\": \"Centrapay Café\" } . Error Responses . | Status | Code | Description | . | 403 | PATRON_NOT_AUTHORIZED | The Payment Condition is awaiting-merchant, therefore the patron is not authorized to accept the condition. | . | 403 | MERCHANT_NOT_AUTHORIZED | The Payment Condition is awaiting-patron, therefore the merchant is not authorized to accept the condition. | . | 403 | CONDITION_ALREADY_SET | The Payment Condition has already been accepted or declined. | . Decline Payment Condition for a Payment Request . Decline a Payment Condition listed in merchantConditions with status awaiting-merchant. Returns a Payment Activity. POST /api/payment-requests/{paymentRequestId}/conditions/{conditionId}/decline . curl -X POST https://service.centrapay.com/api/payment-requests/MhocUmpxxmgdHjr7DgKoKw/conditions/1/decline \\ -H \"X-Api-Key: $api_key\" . Example response payload . { \"type\": \"decline-condition\", \"value\": { \"currency\": \"NZD\", \"amount\": 100 }, \"paymentRequestId\": \"MhocUmpxxmgdHjr7DgKoKw\", \"conditionId\": \"1\", \"createdAt\": \"2022-05-12T01:17:00.000Z\", \"createdBy\": \"crn::user:0af834c8-1110-11ec-9072-3e22fb52e878\", \"paymentRequestCreatedBy\": \"crn::user:0af834c8-1110-11ec-9072-3e22fb52e878\", \"activityNumber\": \"2\", \"merchantAccountId\": \"C4QnjXvj8At6SMsEN4LRi9\", \"merchantId\": \"5ee0c486308f590260d9a07f\", \"merchantConfigId\": \"5ee168e8597be5002af7b454\", \"merchantName\": \"Centrapay Café\" } . Error Responses . | Status | Code | Description | . | 403 | PATRON_NOT_AUTHORIZED | The Payment Condition is awaiting-merchant, therefore the patron is not authorized to decline the condition. | . | 403 | MERCHANT_NOT_AUTHORIZED | The Payment Condition is awaiting-patron, therefore the merchant is not authorized to decline the condition. | . | 403 | CONDITION_ALREADY_SET | The Payment Condition has already been accepted or declined. | . ",
- "url": "/api/payment-requests#operations",
- "relUrl": "/api/payment-requests#operations"
- },"139": {
- "doc": "Profiles",
- "title": "Profile",
- "content": "A profile represents a Centrapay user’s attributes. ",
- "url": "/api/profiles#profile",
- "relUrl": "/api/profiles#profile"
- },"140": {
- "doc": "Profiles",
- "title": "Contents",
- "content": ". | Models . | Profile | . | Operations . | Update a Profile EXPERIMENTAL | Get Profile EXPERIMENTAL | . | . ",
- "url": "/api/profiles#contents",
- "relUrl": "/api/profiles#contents"
- },"141": {
- "doc": "Profiles",
- "title": "Models",
- "content": "Profile . Mandatory Fields . | Field | Type | Description | . | userId | String | The Centrapay user id. | . Optional Fields . | Field | Type | Description | . | givenName | String | First name. | . | familyName | String | Last name. | . | featureUpdates | Boolean | Whether a user would like to receive emails for feature updates. | . | marketingUpdates | Boolean | Whether a user would like to receive emails for marketing updates. | . | email | String | Email address. | . | emailVerified | Boolean | Flag indicating the verification status of the email address. | . | phoneNumber | String | The user’s phone number. | . | phoneVerified | Boolean | Flag indicating the verification status of the phone number. | . ",
- "url": "/api/profiles#models",
- "relUrl": "/api/profiles#models"
- },"142": {
- "doc": "Profiles",
- "title": "Operations",
- "content": "Update a Profile EXPERIMENTAL . Update a user’s mutable attributes. At least one field must be provided in the request. POST /api/me/profile/update . curl -X POST https://service.centrapay.com/api/me/profile/update \\ -H \"Authorization: $jwt\" \\ -H \"Content-Type: application/json\" \\ -d '{ \"givenName\": \"John\", \"familyName\": \"Doe\", \"featureUpdates\": false, \"marketingUpdates\": true, \"email\": \"john.doe@centrapay.com\" }' . Example response payload . { \"givenName\": \"John\", \"familyName\": \"Doe\", \"featureUpdates\": false, \"marketingUpdates\": true, \"email\": \"john.doe@centrapay.com\" } . Get Profile EXPERIMENTAL . GET /api/users/{userId}/profile . curl https://service.centrapay.com/api/users/da75ad90-9a5b-4df0-8374-f48b3a8fbfcc/profile \\ -H \"X-Api-Key: $api_key\" . Example response payload . { \"userId\": \"9f4b3bae-dc30-11ea-ab70-2743d9be3dd5\", \"givenName\": \"John\", \"familyName\": \"Doe\", \"featureUpdates\": true, \"marketingUpdates\": true, \"email\": \"john.doe@centrapay.com\", \"emailVerified\": true, \"phoneNumber\": \"+64271112222\", \"phoneVerified\": true } . ",
- "url": "/api/profiles#operations",
- "relUrl": "/api/profiles#operations"
- },"143": {
- "doc": "Profiles",
- "title": "Profiles",
- "content": " ",
- "url": "/api/profiles",
- "relUrl": "/api/profiles"
- },"144": {
- "doc": "Quotas",
- "title": "Quotas",
- "content": "Centrapay account quotas are enforced on usage types such as spending or topping up, and may apply to a time period (daily, monthly, yearly). Account quotas may be affected by the verification status of the Centrapay account. ",
- "url": "/api/quotas",
- "relUrl": "/api/quotas"
- },"145": {
- "doc": "Quotas",
- "title": "Contents",
- "content": ". | Models . | Quota | . | Operations . | Getting account quotas EXPERIMENTAL | . | . ",
- "url": "/api/quotas#contents",
- "relUrl": "/api/quotas#contents"
- },"146": {
- "doc": "Quotas",
- "title": "Models",
- "content": "Quota . Required Fields . | Field | Type | Description | . | type | String | The quota’s type. | . | limit | BigNumber | The quota’s upper usage limit. | . | usage | BigNumber | The quota’s current usage. | . Optional Fields . | Field | Type | Description | . | assetType | String | The type of asset the quota is scoped to, eg centrapay.nzd.main. | . | period | String | The recurring, time-bound quota’s duration: daily, monthly or yearly. | . | interval | String | The specific day, month or year the quota applies to, eg: 2020-01-01, 2020-01, 2020. | . Supported Quota Types . The following table describes the supported quota types and variants. The “Scoped” column indicates whether the quota can have different values for different asset types. The “Periods” column indicates which periods are applicable to the quota. | Type | Description | Scoped | Periods | . | spend | Value of wallet-based payments or asset transfers from the account. | Yes | monthly yearly | . | topup | Value of topups from bank accounts linked to the account. | Yes | monthly yearly | . ",
- "url": "/api/quotas#models",
- "relUrl": "/api/quotas#models"
- },"147": {
- "doc": "Quotas",
- "title": "Operations",
- "content": "Getting account quotas EXPERIMENTAL . Retrieve quota limits and usages for the current intervals. Ie, all quotas for the current day, current month and current year as well as any quotas that are not associated with a temporal period. GET /api/accounts/{accountId}/quotas . curl https://service.centrapay.com/api/accounts/Jaim1Cu1Q55uooxSens6yk/quotas \\ -H \"X-Api-Key: $api_key\" . Example response payload . [ { \"limit\": \"1000\", \"interval\": \"2021-03\", \"period\": \"monthly\", \"usage\": \"500\", \"type\": \"spend\", \"assetType\": \"centrapay.nzd.main\" }, { \"limit\": \"9999\", \"interval\": \"2021\", \"period\": \"yearly\", \"usage\": \"1555\", \"type\": \"spend\", \"assetType\": \"centrapay.nzd.main\" }, { \"limit\": \"1000\", \"interval\": \"2021-03\", \"period\": \"monthly\", \"usage\": \"500\", \"type\": \"topup\", \"assetType\": \"centrapay.nzd.main\" }, { \"limit\": \"9999\", \"interval\": \"2021\", \"period\": \"yearly\", \"usage\": \"5000\", \"type\": \"topup\", \"assetType\": \"centrapay.nzd.main\" } ] . Error Responses . If a quota limit is exceeded by an action that enforces quota limits, the following error response will be returned. The quotas field will contain all quota limits that are exceeded with the usage set to the amount that the quota would have been updated to if the action was completed. { \"message\": \"QUOTA_EXCEEDED\", \"quotas\": [ { \"limit\": \"9999\", \"interval\": \"2021\", \"period\": \"yearly\", \"usage\": \"10000\", \"type\": \"topup\", \"assetType\": \"centrapay.nzd.main\" } ] } . ",
- "url": "/api/quotas#operations",
- "relUrl": "/api/quotas#operations"
- },"148": {
- "doc": "Scanned Codes",
- "title": "Scanned Codes",
- "content": "A scanned code is a barcode that a merchant scans. The code can be used to create a Payment Request. ",
- "url": "/api/scanned-codes",
- "relUrl": "/api/scanned-codes"
- },"149": {
- "doc": "Scanned Codes",
- "title": "Contents",
- "content": ". | Models . | Scanned Code | . | Operations . | Decode Scanned Code | . | . ",
- "url": "/api/scanned-codes#contents",
- "relUrl": "/api/scanned-codes#contents"
- },"150": {
- "doc": "Scanned Codes",
- "title": "Models",
- "content": "Scanned Code . Fields . | Field | Type | Description | . | code | String | The utf8 representation of data decoded from what was scanned. | . | scannedBy | String | The party that scanned the code. Can be merchant. | . | provider | String | The integrator that owns the code. This can be used to calculate discounts on Line Items. Can be paypal, venmo, farmlands or centrapay. | . | displayName | String | A formatted name that can be displayed in a client. | . | merchantConfigId | String | The ID of the Merchant Config. | . ",
- "url": "/api/scanned-codes#models",
- "relUrl": "/api/scanned-codes#models"
- },"151": {
- "doc": "Scanned Codes",
- "title": "Operations",
- "content": ". Decode Scanned Code . POST /api/decode Decode Merchant Scanned Barcode . curl -X POST https://service.centrapay.com/api/decode \\ -H \"Authorization: $jwt\" \\ -H \"Content-Type: application/json\" \\ -d '{ \"code\": \"123456789\", \"scannedBy\": \"merchant\", \"merchantConfigId\": \"P9gm1s1Cu1Q5uooxs\" }' . Example response payload . { \"code\": \"123456789\", \"scannedBy\": \"merchant\", \"merchantConfigId\": \"P9gm1s1Cu1Q5uooxs\", \"provider\": \"farmlands\", \"displayName\": \"Farmlands Card\" } . Error Responses . | Status | Code | Description | . | 403 | UNKNOWN_CODE | The code doesn’t exist or is no longer active in our system. | . | 403 | MERCHANT_CONFIG_NOT_FOUND | The supplied merchant config does not exist. | . | 403 | INVALID_MERCHANT_CONFIG | The merchant config does not have a payment option that can satisfy the scanned code. | . ",
- "url": "/api/scanned-codes#operations",
- "relUrl": "/api/scanned-codes#operations"
- },"152": {
- "doc": "Settlements",
- "title": "Settlements",
- "content": "A settlement is created from completed Payment Requests over a specified period for each supported Asset Type for each Merchant. Settlements can only be created if the merchant has a Settlement Config. ",
- "url": "/api/settlements",
- "relUrl": "/api/settlements"
- },"153": {
- "doc": "Settlements",
- "title": "Contents",
- "content": ". | Models . | Settlement | . | Operations . | List Settlements | . | . ",
- "url": "/api/settlements#contents",
- "relUrl": "/api/settlements#contents"
- },"154": {
- "doc": "Settlements",
- "title": "Models",
- "content": "Settlement . Mandatory Fields . | Field | Type | Description | . | id | String | The unique identifier for the settlement. | . | status | String | The status of the settlement. | . | assetType | String | The Asset Type being settled. | . | currency | String | The settlement currency. | . | createdAt | Timestamp | When the Settlement was created. | . | createdBy | CRN | The User or API Key that created the Settlement. | . Optional Fields . | Field | Type | Description | . | settledAt | Timestamp | The time when settlement was completed. | . | settledBy | CRN | The User or API Key that completed the Settlement. | . | settlementAmount | BigNumber | The total amount of the settlement. | . | settlementBankAccountId | String | The ID of the bank account used for settlement. | . ",
- "url": "/api/settlements#models",
- "relUrl": "/api/settlements#models"
- },"155": {
- "doc": "Settlements",
- "title": "Operations",
- "content": "List Settlements . GET /api/merchants/{merchantId}/settlements . curl https://service.centrapay.com/api/merchants/5ee0c486308f590260d9a07f/settlements \\ -H \"X-Api-Key: $api_key\" . Example response payload . { \"items\": [ { \"id\": \"89028sh9308f590260d9a07f\", \"status\": \"confirmed\", \"assetType\": \"centrapay.nzd.main\", \"currency\": \"NZD\", \"createdAt\": \"2021-11-12T01:17:46.499Z\", \"createdBy\": \"crn:WIj211vFs9cNACwBb04vQw:api-key:MyApiKey\", \"settledAt\": \"2021-11-13T11:59:59.999Z\", \"settledBy\": \"crn:WIj211vFs9cNACwBb04vQw:api-key:MyApiKey\", \"settlementAmount\": \"2500\", \"settlementBankAccountId\": \"67e0c486308f590260d9a139\" }, { \"id\": \"9ds2cs89028sh90260d9f91h\", \"status\": \"awaiting-confirmation\", \"assetType\": \"centrapay.nzd.main\", \"currency\": \"NZD\", \"createdAt\": \"2021-11-13T01:17:46.499Z\", \"createdBy\": \"crn:WIj211vFs9cNACwBb04vQw:api-key:MyApiKey\", \"settlementAmount\": \"2200\", \"settlementBankAccountId\": \"67e0c486308f590260d9a139\" } ] } . ",
- "url": "/api/settlements#operations",
- "relUrl": "/api/settlements#operations"
- },"156": {
- "doc": "Tokens",
- "title": "Tokens",
- "content": "Tokens are assets which can only be spent in full. Every token is associated with a collection, which defines the branding and general rules for the tokens, such as active duration. A redemption condition is created for each merchant that accepts tokens from a collection, and contains additional conditions specific to that merchant, such as redeemable product identifiers. ",
- "url": "/api/tokens",
- "relUrl": "/api/tokens"
- },"157": {
- "doc": "Tokens",
- "title": "Contents",
- "content": ". | Models . | Token Collection EXPERIMENTAL | Token Expires After EXPERIMENTAL | Redemption Condition EXPERIMENTAL | Allowed Products EXPERIMENTAL | . | Operations . | Create Token Collection EXPERIMENTAL | List Token Collections for Account EXPERIMENTAL | Create Redemption Condition EXPERIMENTAL | Create Token EXPERIMENTAL | . | . ",
- "url": "/api/tokens#contents",
- "relUrl": "/api/tokens#contents"
- },"158": {
- "doc": "Tokens",
- "title": "Models",
- "content": ". Token Collection EXPERIMENTAL . Fields . | Field | Type | Description | . | name | String | The display name of the collection. | . | accountId | String | The account that will own the collection. | . | tokenExpiresAfter | Token Expires After | The active duration of all tokens created from this collection. | . | type | String | The type of value exchanged when redeeming tokens, can be product | . | maxValue | Monetary Optional | The maximum agreed value that any merchants will be settled for a token redemption. | . | id | String | The token collection id | . | test | Boolean | true if the token collection is for testing purposes only. | . | status | String | The status of the token collection. Valid values include ‘active’. | . | createdBy | CRN | The identity that created the activity. | . | createdAt | Timestamp | Timestamp at which the token collection was created. | . | mediaUploadId | String Optional | The id of the media upload image of the collection. | . | img | String Optional | The img URL of the collection. | . | issuer | String Optional | The name of the Business linked to the account. | . Token Expires After EXPERIMENTAL . | Field | Type | Description | . | period | String | Supported values are hour, day, week,month and year. | . | duration | String | Number of period until token expiration. | . Redemption Condition EXPERIMENTAL . Fields . | Field | Type | Description | . | merchantId | String | The identifier of the merchant that is accepting the collection. | . | allowedProducts | Allowed Products Optional | List of allowed products, required for collections of type product | . | id | String | The redemption condition id | . | collectionId | String | The token collection that will govern the branding and redemption rules for the token. | . | createdBy | CRN | The identity that created the activity. | . | createdAt | Timestamp | Timestamp at which the redemption condition was created. | . Allowed Products EXPERIMENTAL . | Field | Type | Description | . | sku | String | The SKU of the product that is to be accepted. | . | name | String | Display name of the product | . | maxValue | Monetary | The maximum value that the product can be redeemed for. | . ",
- "url": "/api/tokens#models",
- "relUrl": "/api/tokens#models"
- },"159": {
- "doc": "Tokens",
- "title": "Operations",
- "content": "Create Token Collection EXPERIMENTAL . POST /api/collections . curl -X POST https://service.centrapay.com/api/collections \\ -H \"X-Api-Key: $api_key\" \\ -H \"Content-Type: application/json\" \\ -d '{ \"name\": \"Bread\", \"accountId\": \"T3y6hogYA4d612BExypWYH\", \"tokenExpiresAfter\": { \"period\": \"month\", \"duration\": \"1\" }, \"maxValue\": { \"currency\": \"NZD\", \"amount\": \"400\" }, \"type\": \"product\", \"mediaUploadId\": \"12345\" }' . Example response payload . { \"id\": \"Xv990BzkgfoDS7bBls50pd\", \"name\": \"Bread\", \"accountId\": \"T3y6hogYA4d612BExypWYH\", \"tokenExpiresAfter\": { \"period\": \"month\", \"duration\": \"1\" }, \"maxValue\": { \"currency\": \"NZD\", \"amount\": \"400\" }, \"test\": true, \"type\": \"product\", \"status\": \"active\", \"createdBy\": \"crn::user:b657195e-dc2f-11ea-8566-e7710d592c99\", \"createdAt\": \"2021-05-12T04:30:11.001Z\", \"mediaUploadId\": \"12345\", \"img\": \"https://media-upload.centrapay.com/image.png?jhbdsfau67ewejshb=487hsdjhbdgs743\", \"issuer\": \"Centrapay\" } . List Token Collections for Account EXPERIMENTAL . Returns a paginated list of token collections for an account. GET /api/accounts/{accountId}/collections . curl -G https://service.centrapay.com/api/accounts/T3y6hogYA4d612BExypWYH/collections \\ -H \"X-Api-Key: $api_key\" \\ -d pageKey=Collection#2G5bXm4dnuDHnnKY8WeCPm|#Collection|8vq4kn03o0g1grrihk7ooloizpqt2y . Fields . | Field | Type | Description | . | pageKey | String Optional | Used to retrieve the next page of items. | . Note: The pageKey value, if provided, needs to be URL-encoded. Example response payload . { \"nextPageKey\": \"Collection#E9eXsErwA444qFDoZt5iLA|#Collection\", \"items\": [ { \"id\": \"Xv990BzkgfoDS7bBls50pd\", \"name\": \"Bread\", \"accountId\": \"T3y6hogYA4d612BExypWYH\", \"tokenExpiresAfter\": { \"period\": \"month\", \"duration\": \"1\" }, \"maxValue\": { \"currency\": \"NZD\", \"amount\": \"400\" }, \"test\": true, \"type\": \"product\", \"status\": \"active\", \"createdBy\": \"crn::user:b657195e-dc2f-11ea-8566-e7710d592c99\", \"createdAt\": \"2021-05-12T04:30:11.001Z\", \"mediaUploadId\": \"12345\", \"img\": \"https://media-upload.centrapay.com/image.png?jhbdsfau67ewejshb=487hsdjhbdgs743\", \"issuer\": \"Centrapay\" } ] } . Create Redemption Condition EXPERIMENTAL . POST /api/collections/{collectionId}/redemption-conditions . curl -X POST https://service.centrapay.com/api/collections/NFhUgPQEYbk2EbTXAYArTX/redemption-conditions \\ -H \"X-Api-Key: $api_key\" \\ -H \"Content-Type: application/json\" \\ -d '{ \"merchantId\": \"36EALpZ89XpShxM2Ee9sXT\", \"allowedProducts\": [ { \"sku\": \"100001\", \"name\": \"White Bread\", \"maxValue\": { \"currency\": \"NZD\", \"amount\": \"400\" } }, { \"sku\": \"100002\", \"name\": \"Sourdough Bread\", \"maxValue\": { \"currency\": \"NZD\", \"amount\": \"800\" } } ] }' . Example response payload . { \"id\": \"1234\", \"merchantId\": \"36EALpZ89XpShxM2Ee9sXT\", \"collectionId\": \"NFhUgPQEYbk2EbTXAYArTX\", \"allowedProducts\": [ { \"sku\": \"100001\", \"name\": \"White Bread\", \"maxValue\": { \"currency\": \"NZD\", \"amount\": \"400\" } }, { \"sku\": \"100002\", \"name\": \"Sourdough Bread\", \"maxValue\": { \"currency\": \"NZD\", \"amount\": \"800\" } } ], \"createdAt\": \"2022-05-12T04:30:11.001Z\", \"createdBy\": \"crn::user:b657195e-dc2f-11ea-8566-e7710d592c99\" } . Error Responses . | Status | Code | Description | . | 403 | INVALID_AMOUNT | One or more of the maxValue amount in the products has exceeded the maxValue amount defined on the collection. | . | 403 | REDEMPTION_CONDITION_ALREADY_EXISTS | A redemption condition for the collection and the merchant has already been created. | . Create Token EXPERIMENTAL . POST /api/tokens Create a token . curl -X POST https://service.centrapay.com/api/tokens \\ -H \"X-Api-Key: $api_key\" \\ -H \"Content-Type: application/json\" \\ -d '{ \"collectionId\": \"Jaim1Cu1Q55uooxSens6yk\", \"idempotencyKey\": \"payment-de32dd90-b46c-11ea-93c3-83a333b86e7b\" }' . Create a token with externalId . curl -X POST https://service.centrapay.com/api/tokens \\ -H \"X-Api-Key: $api_key\" \\ -H \"Content-Type: application/json\" \\ -d '{ \"collectionId\": \"Jaim1Cu1Q55uooxSens6yk\", \"idempotencyKey\": \"payment-de32dd90-b46c-11ea-93c3-83a333b86e7b\", \"externalId\": \"23403283262\" }' . Create a token with accountId . curl -X POST https://service.centrapay.com/api/tokens \\ -H \"X-Api-Key: $api_key\" \\ -H \"Content-Type: application/json\" \\ -d '{ \"collectionId\": \"Jaim1Cu1Q55uooxSens6yk\", \"idempotencyKey\": \"payment-de32dd90-b46c-11ea-93c3-83a333b86e7b\", \"accountId\": \"WRhAxxWpTKb5U7pXyxQjjP\" }' . Fields . | Field | Type | Description | . | collectionId | String | The token collection that will govern the branding and redemption rules for the token. | . | idempotencyKey | String | Client-supplied identifier that prevents double creation. | . | externalId | String Optional | The asset identifier from the issuing system. | . | accountId | String Optional | The account to create the token for. Defaults to the account on the token collection. | . Example response payload . { \"id\": \"pe32dd90-b46c-11ea-92828sa\", \"accountId\": \"WRhAxxWpTKb5U7pXyxQjjP\", \"category\": \"token\", \"collectionId\": \"Jaim1Cu1Q55uooxSens6yk\", \"status\": \"active\", \"createdAt\": \"2021-01-17T18:00:23.000Z\", \"activeFrom\": \"2021-01-17T18:00:23.000Z\", \"expiresAt\": \"2022-01-18T18:00:23.000Z\", \"liveness\": \"test\", \"createdBy\": \"crn:1234abc:api-key:MyAssetIssuerKey\", \"description\": \"My Cafe Token\", \"issuerImg\": \"https://static.centrapay.com/assets/brands/centraperk/logo.png\", \"img\": \"https://static.centrapay.com/assets/brands/centraperk/cafe-token.png\", \"issuer\": \"Centraperk Cafe\", \"issuerWebsite\": \"www.centraperk-cafe.com\", \"type\": \"centrapay.token.test\", \"externalId\": \"23403283262\" } . Error Responses . | Status | Code | Description | . | 403 | TOKEN_ALREADY_CREATED | Token with supplied parameters already exists. | . | 403 | LIVENESS_MISMATCH | The account is test and the collection’s liveness is main or vice versa. | . ",
- "url": "/api/tokens#operations",
- "relUrl": "/api/tokens#operations"
- },"160": {
- "doc": "Verifone Terminal Status Batch",
- "title": "Verifone Terminal Status Batch",
- "content": "Performs a bulk update to the current status for connected Verifone NZ payment terminals. See the Batch resource for how to submit an instance of this batch. | Type Name | verifone-terminal-status | . | File Format | JSONL | . | Record Type | Terminal Status | . ",
- "url": "/api/batch-types/verifone-terminal-status",
- "relUrl": "/api/batch-types/verifone-terminal-status"
- },"161": {
- "doc": "Verifone Terminal Status Batch",
- "title": "Contents",
- "content": ". | Models . | Terminal Status | . | Example JSONL File | Pretty Printed Example | . ",
- "url": "/api/batch-types/verifone-terminal-status#contents",
- "relUrl": "/api/batch-types/verifone-terminal-status#contents"
- },"162": {
- "doc": "Verifone Terminal Status Batch",
- "title": "Models",
- "content": ". Terminal Status . Fields . | Field | Type | Description | . | status | String | Current terminal status: “active” or “inactive”. | . | statusMessage | String | Reason for status. Eg: “config update required”. | . | terminalId | String | Logical terminal id. Eg: “325-136-329”. | . | deviceId | String Optional | Hardware serial number. Eg: “T404395000002”. | . | merchantId | String Optional | Centrapay Merchant id. | . | merchantConfigId | String Optional | Centrapay Merchant Config id. | . | merchantName | String Optional | Name of merchant. Eg: “Centra Café”. | . | description | String Optional | Description of the device. Eg “Front Till” | . | model | String Optional | Hardware model. Eg: “VX820”. | . | firstSeen | Timestamp Optional | Date when terminal status was first observed. | . | lastSeen | Timestamp Optional | Date when terminal status was last observed. | . | configVersion | String Optional | Version of loaded terminal configuration. Eg: “20220214.1”. | . | configUpdatedAt | Timestamp Optional | Date when terminal configuration was loaded. | . | softwareVersion | String Optional | Version of terminal software. Eg: “1.7.134”. | . | softwareUpdatedAt | Timestamp Optional | Date when terminal software was updated. | . ",
- "url": "/api/batch-types/verifone-terminal-status#models",
- "relUrl": "/api/batch-types/verifone-terminal-status#models"
- },"163": {
- "doc": "Verifone Terminal Status Batch",
- "title": "Example JSONL File",
- "content": "A complete JSONL batch file example. For more legible examples refer to the pretty printed example below. {\"merchantId\":\"06baa0708ee0e000696\",\"merchantConfigId\":\"baa09e8158300063fc\",\"merchantName\":\"Centra Café\",\"description\":\"Till #1\",\"model\":\"VX820\",\"terminalId\":\"325-136-331\",\"deviceId\":\"T404395000004\",\"status\":\"inactive\",\"statusMessage\":\"update required\",\"firstSeen\":\"2020-01-14T09:00:00Z\",\"lastSeen\":\"2022-03-14T09:00:00Z\",\"configVersion\": 20210914.1,\"configUpdatedAt\":\"2021-09-15 09:00:00 UTC\",\"softwareVersion\":\"1.7.134\",\"softwareUpdatedAt\":\"2021-11-14 09:00:00 UTC\"} {\"merchantId\":\"06baa0708ee0e000696\",\"merchantConfigId\":\"baa09e8158300063fc\",\"merchantName\":\"Centra Café\",\"description\":\"Till #2\",\"model\":\"VX820\",\"terminalId\":\"325-136-329\",\"deviceId\":\"T404395000002\",\"status\":\"active\",\"statusMessage\":\"ok\",\"firstSeen\":\"2020-01-14T09:00:00Z\",\"lastSeen\":\"2022-03-14T09:00:00Z\",\"configVersion\": 20220214.1,\"configUpdatedAt\":\"2022-02-14 09:00:00 UTC\",\"softwareVersion\":\"1.7.134\",\"softwareUpdatedAt\":\"2021-11-14 09:00:00 UTC\"} . ",
- "url": "/api/batch-types/verifone-terminal-status#example-jsonl-file",
- "relUrl": "/api/batch-types/verifone-terminal-status#example-jsonl-file"
- },"164": {
- "doc": "Verifone Terminal Status Batch",
- "title": "Pretty Printed Example",
- "content": "Warning: Below our records have newlines for legibility. When submitting a batch file you must only use newlines to separate records. { \"merchantId\": \"06baa0708ee0e000696\", \"merchantConfigId\": \"baa09e8158300063fc\", \"merchantName\": \"Centra Café\", \"description\": \"Till #2\", \"model\": \"VX820\", \"terminalId\": \"325-136-329\", \"deviceId\": \"T404395000002\", \"status\": \"active\", \"statusMessage\": \"incompatible hardware\", \"firstSeen\": \"2020-01-14T09:00:00Z\", \"lastSeen\": \"2022-03-14T09:00:00Z\", \"configVersion\": 20220214.1, \"configUpdatedAt\": \"2022-02-14 09:00:00 UTC\", \"softwareVersion\": \"1.7.134\", \"softwareUpdatedAt\": \"2021-11-14 09:00:00 UTC\" } . ",
- "url": "/api/batch-types/verifone-terminal-status#pretty-printed-example",
- "relUrl": "/api/batch-types/verifone-terminal-status#pretty-printed-example"
- },"165": {
- "doc": "Wallets",
- "title": "Wallets",
- "content": "A Wallet is an asset that represents money. The Wallet maintains a record of all transactions it has participated in. A Wallet has a single balance and a single currency. ",
- "url": "/api/wallets",
- "relUrl": "/api/wallets"
- },"166": {
- "doc": "Wallets",
- "title": "Settlement Wallets EXPERIMENTAL",
- "content": "A Settlement Wallet is a special type of Wallet that can only receive or refund money related to a payment request. This means you cannot topup, withdraw, or send money from this Wallet. ",
- "url": "/api/wallets#settlement-wallets-experimental",
- "relUrl": "/api/wallets#settlement-wallets-experimental"
- },"167": {
- "doc": "Wallets",
- "title": "Contents",
- "content": ". | Creating a Wallet | Listing authorized wallets | Listing Wallet Transactions EXPERIMENTAL | . ",
- "url": "/api/wallets#contents",
- "relUrl": "/api/wallets#contents"
- },"168": {
- "doc": "Wallets",
- "title": "Creating a Wallet",
- "content": "POST /api/wallets . curl -X POST https://service.centrapay.com/api/wallets \\ -H \"X-Api-Key: $api_key\" \\ -H \"Content-Type: application/json\" \\ -d '{ \"accountId\": \"Te2uDM7xhDLWGVJU3nzwnh\", \"ledgerId\": \"centrapay.nzd.main\" }' . Required Fields . | Field | Type | Description | . | accountId | String | The id of the account | . | ledgerId | String | The id of the ledger e.g. centrapay.nzd.main, centrapay.nzd.test | . Optional Fields . | Field | Type | Description | . | settlement | Boolean | EXPERIMENTAL Configure the Wallet to be a Settlement Wallet. | . Example response payload . { \"id\": \"WRhAxxWpTKb5U7pXyxQjjY\", \"accountId\": \"Te2uDM7xhDLWGVJU3nzwnh\", \"category\": \"money\", \"type\": \"centrapay.nzd.main\", \"liveness\": \"main\", \"description\": \"NZD\", \"createdAt\": \"2021-01-01T00:00:00.000Z\", \"status\": \"active\", \"currency\": \"NZD\", \"balance\": \"0\", \"availableBalance\": \"6000\" } . Example response payload for Settlement Wallet . { \"id\": \"WRhAxxWpTKb5U7pXyxQjjY\", \"accountId\": \"Te2uDM7xhDLWGVJU3nzwnh\", \"category\": \"money\", \"type\": \"centrapay.nzd.main\", \"liveness\": \"main\", \"description\": \"NZD\", \"createdAt\": \"2021-01-01T00:00:00.000Z\", \"status\": \"active\", \"currency\": \"NZD\", \"balance\": \"0\", \"availableBalance\": \"6000\", \"settlement\": true } . Error Responses . | Status | Code | Description | . | 403 | ACCOUNT_MAX_WALLETS_REACHED | The maximum number of wallets for the given ledger has been reached. | . ",
- "url": "/api/wallets#creating-a-wallet",
- "relUrl": "/api/wallets#creating-a-wallet"
- },"169": {
- "doc": "Wallets",
- "title": "Listing authorized wallets",
- "content": "GET /api/wallets . curl https://service.centrapay.com/api/wallets \\ -H \"X-Api-Key: $api_key\" . Example response payload . [ { \"id\": \"WRhAxxWpTKb5U7pXyxQjjY\", \"accountId\": \"Te2uDM7xhDLWGVJU3nzwnh\", \"ledgerId\": \"centrapay.nzd.main\", \"currency\": \"NZD\", \"balance\": \"2000\", \"availableBalance\": \"6000\" }, { \"id\": \"NQ1yeromwnWPD2hY41L2yS\", \"accountId\": \"Te2uDM7xhDLWGVJU3nzwnh\", \"ledgerId\": \"centrapay.nzd.test\", \"currency\": \"NZD\", \"balance\": \"20\", \"availableBalance\": \"6000\" } ] . ",
- "url": "/api/wallets#listing-authorized-wallets",
- "relUrl": "/api/wallets#listing-authorized-wallets"
- },"170": {
- "doc": "Wallets",
- "title": "Listing Wallet Transactions EXPERIMENTAL",
- "content": "Returns a paginated list of Wallet Transactions. GET /api/wallets/{walletId}/transactions . curl https://service.centrapay.com/api/wallets/WRhAxxWpTKb5U7pXyxQjjY/transactions \\ -H \"X-Api-Key: $api_key\" . Transaction Fields . | Field | Type | Description | . | activityNumber | BigNumber | Unique sequential Wallet transaction number | . | amount | BigNumber | Absolute transaction amount in cents. | . | value | BigNumber | Change to the Wallet’s balance in cents when the transaction was applied. | . | createdAt | Timestamp | Transaction timestamp as ISO 8601 date string. | . | activityType | String | Hints to the type of transaction: undefined or “returned-asset-transfer” | . | destWalletId | String | Id of the destination Wallet if applicable. | . | srcWalletId | String | Id of the source Wallet if applicable. | . | destParty | String | Display value for party receiving funds if applicable. See note below. | . | srcParty | String | Display value for party providing funds if applicable. See note below. | . | paymentRequestId | String | Id of the related payment request if applicable. | . | topupId | String | Id of the related topup funds transfer request if applicable. | . | assetTransferId | String | Id of the related asset transfer request if applicable. | . | withdrawalId | String | Id of the related withdrawal request if applicable. | . Party Values . The “destParty” and “srcParty” are optionally provided depending on the purpose of the transaction. Values may include a merchant name, user handle, masked user email, masked user phone, or bank account. Example response payload (Payment) . { \"items\": [ { \"activityNumber\": \"1\", \"amount\": \"350\", \"value\": \"-350\", \"createdAt\": \"2020-06-17T18:00:23.000Z\", \"destParty\": \"Centrapay Cafe\", \"destWalletId\": \"GfYJd5tZQ63CrehgTP2RPB\", \"srcWalletId\": \"EBVSreNmpsE2Pazw3SipXC\", \"paymentRequestId\": \"MhocUmpxxmgdHjr7DgKoKw\" } ] } . Example response payload (Topup) . { \"items\": [ { \"activityNumber\": \"1\", \"amount\": \"5000\", \"value\": \"5000\", \"createdAt\": \"2020-06-17T18:00:23.000Z\", \"srcParty\": \"12-4000-100001-00\", \"destWalletId\": \"EBVSreNmpsE2Pazw3SipXC\", \"topupId\": \"77hqHDzw6KaaG2P2hoshUB\" } ] } . Example response payload (Sent Asset) . { \"items\": [ { \"activityNumber\": \"1\", \"amount\": \"2500\", \"value\": \"-2500\", \"createdAt\": \"2020-06-17T18:00:23.000Z\", \"destParty\": \"+6422*****36\", \"srcWalletId\": \"EBVSreNmpsE2Pazw3SipXC\", \"assetTransferId\": \"TtQHufC4LGBY2eiPRopRm3\" } ] } . Example response payload (Received Asset) . { \"items\": [ { \"activityNumber\": \"1\", \"amount\": \"2500\", \"value\": \"2500\", \"createdAt\": \"2020-06-17T18:00:23.000Z\", \"srcParty\": \"+6421*****18\", \"destWalletId\": \"EBVSreNmpsE2Pazw3SipXC\", \"assetTransferId\": \"TtQHufC4LGBY2eiPRopRm3\" } ] } . Example response payload (Returned Asset) . { \"items\": [ { \"activityNumber\": \"1\", \"amount\": \"2500\", \"value\": \"2500\", \"createdAt\": \"2020-06-17T18:00:23.000Z\", \"activityType\": \"returned-asset-transfer\", \"srcParty\": \"+6421*****18\", \"destWalletId\": \"EBVSreNmpsE2Pazw3SipXC\", \"assetTransferId\": \"TtQHufC4LGBY2eiPRopRm3\" } ] } . Example response payload (Withdraw) . { \"items\": [ { \"activityNumber\": \"1\", \"amount\": \"2500\", \"value\": \"2500\", \"createdAt\": \"2020-06-17T18:00:23.000Z\", \"srcWalletId\": \"EBVSreNmpsE2Pazw3SipXC\", \"destParty\": \"12-3546-2544786-00\", \"withdrawalId\": \"TtQHufC4LGBY2eiPRopRm3\" } ] } . ",
- "url": "/api/wallets#listing-wallet-transactions-experimental",
- "relUrl": "/api/wallets#listing-wallet-transactions-experimental"
- }
-}
diff --git a/assets/js/vendor/lunr.min.js b/assets/js/vendor/lunr.min.js
deleted file mode 100644
index 34b279dac..000000000
--- a/assets/js/vendor/lunr.min.js
+++ /dev/null
@@ -1,6 +0,0 @@
-/**
- * lunr - http://lunrjs.com - A bit like Solr, but much smaller and not as bright - 2.3.6
- * Copyright (C) 2019 Oliver Nightingale
- * @license MIT
- */
-!function(){var e=function(t){var r=new e.Builder;return r.pipeline.add(e.trimmer,e.stopWordFilter,e.stemmer),r.searchPipeline.add(e.stemmer),t.call(r,r),r.build()};e.version="2.3.6",e.utils={},e.utils.warn=function(e){return function(t){e.console&&console.warn&&console.warn(t)}}(this),e.utils.asString=function(e){return void 0===e||null===e?"":e.toString()},e.utils.clone=function(e){if(null===e||void 0===e)return e;for(var t=Object.create(null),r=Object.keys(e),i=0;i0){var c=e.utils.clone(r)||{};c.position=[a,l],c.index=s.length,s.push(new e.Token(i.slice(a,o),c))}a=o+1}}return s},e.tokenizer.separator=/[\s\-]+/,e.Pipeline=function(){this._stack=[]},e.Pipeline.registeredFunctions=Object.create(null),e.Pipeline.registerFunction=function(t,r){r in this.registeredFunctions&&e.utils.warn("Overwriting existing registered function: "+r),t.label=r,e.Pipeline.registeredFunctions[t.label]=t},e.Pipeline.warnIfFunctionNotRegistered=function(t){var r=t.label&&t.label in this.registeredFunctions;r||e.utils.warn("Function is not registered with pipeline. This may cause problems when serialising the index.\n",t)},e.Pipeline.load=function(t){var r=new e.Pipeline;return t.forEach(function(t){var i=e.Pipeline.registeredFunctions[t];if(!i)throw new Error("Cannot load unregistered function: "+t);r.add(i)}),r},e.Pipeline.prototype.add=function(){var t=Array.prototype.slice.call(arguments);t.forEach(function(t){e.Pipeline.warnIfFunctionNotRegistered(t),this._stack.push(t)},this)},e.Pipeline.prototype.after=function(t,r){e.Pipeline.warnIfFunctionNotRegistered(r);var i=this._stack.indexOf(t);if(i==-1)throw new Error("Cannot find existingFn");i+=1,this._stack.splice(i,0,r)},e.Pipeline.prototype.before=function(t,r){e.Pipeline.warnIfFunctionNotRegistered(r);var i=this._stack.indexOf(t);if(i==-1)throw new Error("Cannot find existingFn");this._stack.splice(i,0,r)},e.Pipeline.prototype.remove=function(e){var t=this._stack.indexOf(e);t!=-1&&this._stack.splice(t,1)},e.Pipeline.prototype.run=function(e){for(var t=this._stack.length,r=0;r1&&(se&&(r=n),s!=e);)i=r-t,n=t+Math.floor(i/2),s=this.elements[2*n];return s==e?2*n:s>e?2*n:sa?l+=2:o==a&&(t+=r[u+1]*i[l+1],u+=2,l+=2);return t},e.Vector.prototype.similarity=function(e){return this.dot(e)/this.magnitude()||0},e.Vector.prototype.toArray=function(){for(var e=new Array(this.elements.length/2),t=1,r=0;t0){var o,a=s.str.charAt(0);a in s.node.edges?o=s.node.edges[a]:(o=new e.TokenSet,s.node.edges[a]=o),1==s.str.length&&(o["final"]=!0),n.push({node:o,editsRemaining:s.editsRemaining,str:s.str.slice(1)})}if(0!=s.editsRemaining){if("*"in s.node.edges)var u=s.node.edges["*"];else{var u=new e.TokenSet;s.node.edges["*"]=u}if(0==s.str.length&&(u["final"]=!0),n.push({node:u,editsRemaining:s.editsRemaining-1,str:s.str}),s.str.length>1&&n.push({node:s.node,editsRemaining:s.editsRemaining-1,str:s.str.slice(1)}),1==s.str.length&&(s.node["final"]=!0),s.str.length>=1){if("*"in s.node.edges)var l=s.node.edges["*"];else{var l=new e.TokenSet;s.node.edges["*"]=l}1==s.str.length&&(l["final"]=!0),n.push({node:l,editsRemaining:s.editsRemaining-1,str:s.str.slice(1)})}if(s.str.length>1){var c,h=s.str.charAt(0),d=s.str.charAt(1);d in s.node.edges?c=s.node.edges[d]:(c=new e.TokenSet,s.node.edges[d]=c),1==s.str.length&&(c["final"]=!0),n.push({node:c,editsRemaining:s.editsRemaining-1,str:h+s.str.slice(2)})}}}return i},e.TokenSet.fromString=function(t){for(var r=new e.TokenSet,i=r,n=0,s=t.length;n=e;t--){var r=this.uncheckedNodes[t],i=r.child.toString();i in this.minimizedNodes?r.parent.edges[r["char"]]=this.minimizedNodes[i]:(r.child._str=i,this.minimizedNodes[i]=r.child),this.uncheckedNodes.pop()}},e.Index=function(e){this.invertedIndex=e.invertedIndex,this.fieldVectors=e.fieldVectors,this.tokenSet=e.tokenSet,this.fields=e.fields,this.pipeline=e.pipeline},e.Index.prototype.search=function(t){return this.query(function(r){var i=new e.QueryParser(t,r);i.parse()})},e.Index.prototype.query=function(t){for(var r=new e.Query(this.fields),i=Object.create(null),n=Object.create(null),s=Object.create(null),o=Object.create(null),a=Object.create(null),u=0;u1?this._b=1:this._b=e},e.Builder.prototype.k1=function(e){this._k1=e},e.Builder.prototype.add=function(t,r){var i=t[this._ref],n=Object.keys(this._fields);this._documents[i]=r||{},this.documentCount+=1;for(var s=0;s=this.length)return e.QueryLexer.EOS;var t=this.str.charAt(this.pos);return this.pos+=1,t},e.QueryLexer.prototype.width=function(){return this.pos-this.start},e.QueryLexer.prototype.ignore=function(){this.start==this.pos&&(this.pos+=1),this.start=this.pos},e.QueryLexer.prototype.backup=function(){this.pos-=1},e.QueryLexer.prototype.acceptDigitRun=function(){var t,r;do t=this.next(),r=t.charCodeAt(0);while(r>47&&r<58);t!=e.QueryLexer.EOS&&this.backup()},e.QueryLexer.prototype.more=function(){return this.pos1&&(t.backup(),t.emit(e.QueryLexer.TERM)),t.ignore(),t.more())return e.QueryLexer.lexText},e.QueryLexer.lexEditDistance=function(t){return t.ignore(),t.acceptDigitRun(),t.emit(e.QueryLexer.EDIT_DISTANCE),e.QueryLexer.lexText},e.QueryLexer.lexBoost=function(t){return t.ignore(),t.acceptDigitRun(),t.emit(e.QueryLexer.BOOST),e.QueryLexer.lexText},e.QueryLexer.lexEOS=function(t){t.width()>0&&t.emit(e.QueryLexer.TERM)},e.QueryLexer.termSeparator=e.tokenizer.separator,e.QueryLexer.lexText=function(t){for(;;){var r=t.next();if(r==e.QueryLexer.EOS)return e.QueryLexer.lexEOS;if(92!=r.charCodeAt(0)){if(":"==r)return e.QueryLexer.lexField;if("~"==r)return t.backup(),t.width()>0&&t.emit(e.QueryLexer.TERM),e.QueryLexer.lexEditDistance;if("^"==r)return t.backup(),t.width()>0&&t.emit(e.QueryLexer.TERM),e.QueryLexer.lexBoost;if("+"==r&&1===t.width())return t.emit(e.QueryLexer.PRESENCE),e.QueryLexer.lexText;if("-"==r&&1===t.width())return t.emit(e.QueryLexer.PRESENCE),e.QueryLexer.lexText;if(r.match(e.QueryLexer.termSeparator))return e.QueryLexer.lexTerm}else t.escapeCharacter()}},e.QueryParser=function(t,r){this.lexer=new e.QueryLexer(t),this.query=r,this.currentClause={},this.lexemeIdx=0},e.QueryParser.prototype.parse=function(){this.lexer.run(),this.lexemes=this.lexer.lexemes;for(var t=e.QueryParser.parseClause;t;)t=t(this);return this.query},e.QueryParser.prototype.peekLexeme=function(){return this.lexemes[this.lexemeIdx]},e.QueryParser.prototype.consumeLexeme=function(){var e=this.peekLexeme();return this.lexemeIdx+=1,e},e.QueryParser.prototype.nextClause=function(){var e=this.currentClause;this.query.clause(e),this.currentClause={}},e.QueryParser.parseClause=function(t){var r=t.peekLexeme();if(void 0!=r)switch(r.type){case e.QueryLexer.PRESENCE:return e.QueryParser.parsePresence;case e.QueryLexer.FIELD:return e.QueryParser.parseField;case e.QueryLexer.TERM:return e.QueryParser.parseTerm;default:var i="expected either a field or a term, found "+r.type;throw r.str.length>=1&&(i+=" with value '"+r.str+"'"),new e.QueryParseError(i,r.start,r.end)}},e.QueryParser.parsePresence=function(t){var r=t.consumeLexeme();if(void 0!=r){switch(r.str){case"-":t.currentClause.presence=e.Query.presence.PROHIBITED;break;case"+":t.currentClause.presence=e.Query.presence.REQUIRED;break;default:var i="unrecognised presence operator'"+r.str+"'";throw new e.QueryParseError(i,r.start,r.end)}var n=t.peekLexeme();if(void 0==n){var i="expecting term or field, found nothing";throw new e.QueryParseError(i,r.start,r.end)}switch(n.type){case e.QueryLexer.FIELD:return e.QueryParser.parseField;case e.QueryLexer.TERM:return e.QueryParser.parseTerm;default:var i="expecting term or field, found '"+n.type+"'";throw new e.QueryParseError(i,n.start,n.end)}}},e.QueryParser.parseField=function(t){var r=t.consumeLexeme();if(void 0!=r){if(t.query.allFields.indexOf(r.str)==-1){var i=t.query.allFields.map(function(e){return"'"+e+"'"}).join(", "),n="unrecognised field '"+r.str+"', possible fields: "+i;throw new e.QueryParseError(n,r.start,r.end)}t.currentClause.fields=[r.str];var s=t.peekLexeme();if(void 0==s){var n="expecting term, found nothing";throw new e.QueryParseError(n,r.start,r.end)}switch(s.type){case e.QueryLexer.TERM:return e.QueryParser.parseTerm;default:var n="expecting term, found '"+s.type+"'";throw new e.QueryParseError(n,s.start,s.end)}}},e.QueryParser.parseTerm=function(t){var r=t.consumeLexeme();if(void 0!=r){t.currentClause.term=r.str.toLowerCase(),r.str.indexOf("*")!=-1&&(t.currentClause.usePipeline=!1);var i=t.peekLexeme();if(void 0==i)return void t.nextClause();switch(i.type){case e.QueryLexer.TERM:return t.nextClause(),e.QueryParser.parseTerm;case e.QueryLexer.FIELD:return t.nextClause(),e.QueryParser.parseField;case e.QueryLexer.EDIT_DISTANCE:return e.QueryParser.parseEditDistance;case e.QueryLexer.BOOST:return e.QueryParser.parseBoost;case e.QueryLexer.PRESENCE:return t.nextClause(),e.QueryParser.parsePresence;default:var n="Unexpected lexeme type '"+i.type+"'";throw new e.QueryParseError(n,i.start,i.end)}}},e.QueryParser.parseEditDistance=function(t){var r=t.consumeLexeme();if(void 0!=r){var i=parseInt(r.str,10);if(isNaN(i)){var n="edit distance must be numeric";throw new e.QueryParseError(n,r.start,r.end)}t.currentClause.editDistance=i;var s=t.peekLexeme();if(void 0==s)return void t.nextClause();switch(s.type){case e.QueryLexer.TERM:return t.nextClause(),e.QueryParser.parseTerm;case e.QueryLexer.FIELD:return t.nextClause(),e.QueryParser.parseField;case e.QueryLexer.EDIT_DISTANCE:return e.QueryParser.parseEditDistance;case e.QueryLexer.BOOST:return e.QueryParser.parseBoost;case e.QueryLexer.PRESENCE:return t.nextClause(),e.QueryParser.parsePresence;default:var n="Unexpected lexeme type '"+s.type+"'";throw new e.QueryParseError(n,s.start,s.end)}}},e.QueryParser.parseBoost=function(t){var r=t.consumeLexeme();if(void 0!=r){var i=parseInt(r.str,10);if(isNaN(i)){var n="boost must be numeric";throw new e.QueryParseError(n,r.start,r.end)}t.currentClause.boost=i;var s=t.peekLexeme();if(void 0==s)return void t.nextClause();switch(s.type){case e.QueryLexer.TERM:return t.nextClause(),e.QueryParser.parseTerm;case e.QueryLexer.FIELD:return t.nextClause(),e.QueryParser.parseField;case e.QueryLexer.EDIT_DISTANCE:return e.QueryParser.parseEditDistance;case e.QueryLexer.BOOST:return e.QueryParser.parseBoost;case e.QueryLexer.PRESENCE:return t.nextClause(),e.QueryParser.parsePresence;default:var n="Unexpected lexeme type '"+s.type+"'";throw new e.QueryParseError(n,s.start,s.end)}}},function(e,t){"function"==typeof define&&define.amd?define(t):"object"==typeof exports?module.exports=t():e.lunr=t()}(this,function(){return e})}();
diff --git a/assets/wallets.html b/assets/wallets.html
deleted file mode 100644
index be5f11516..000000000
--- a/assets/wallets.html
+++ /dev/null
@@ -1,11 +0,0 @@
-
-
-
- Redirecting…
-
-
-
-
- Redirecting…
- Click here if you are not redirected.
-
diff --git a/auth.html b/auth.html
deleted file mode 100644
index f1777a451..000000000
--- a/auth.html
+++ /dev/null
@@ -1,11 +0,0 @@
-
-
-
- Redirecting…
-
-
-
-
- Redirecting…
- Click here if you are not redirected.
-
diff --git a/fiat.html b/fiat.html
deleted file mode 100644
index 1a62e7924..000000000
--- a/fiat.html
+++ /dev/null
@@ -1,11 +0,0 @@
-
-
-
- Redirecting…
-
-
-
-
- Redirecting…
- Click here if you are not redirected.
-
diff --git a/fiat/authorities.html b/fiat/authorities.html
deleted file mode 100644
index 1a62e7924..000000000
--- a/fiat/authorities.html
+++ /dev/null
@@ -1,11 +0,0 @@
-
-
-
- Redirecting…
-
-
-
-
- Redirecting…
- Click here if you are not redirected.
-
diff --git a/fiat/bank-accounts.html b/fiat/bank-accounts.html
deleted file mode 100644
index 1a62e7924..000000000
--- a/fiat/bank-accounts.html
+++ /dev/null
@@ -1,11 +0,0 @@
-
-
-
- Redirecting…
-
-
-
-
- Redirecting…
- Click here if you are not redirected.
-
diff --git a/fiat/bank-authorities.html b/fiat/bank-authorities.html
deleted file mode 100644
index 1a62e7924..000000000
--- a/fiat/bank-authorities.html
+++ /dev/null
@@ -1,11 +0,0 @@
-
-
-
- Redirecting…
-
-
-
-
- Redirecting…
- Click here if you are not redirected.
-
diff --git a/fiat/funds-transfers.html b/fiat/funds-transfers.html
deleted file mode 100644
index 70ad9a7b4..000000000
--- a/fiat/funds-transfers.html
+++ /dev/null
@@ -1,11 +0,0 @@
-
-
-
- Redirecting…
-
-
-
-
- Redirecting…
- Click here if you are not redirected.
-
diff --git a/images/asset-lifecycle.png b/images/asset-lifecycle.png
deleted file mode 100644
index 907373bcbf02729ae3b8adc358837b43a28dab37..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001
literal 111892
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