From 69ab35a55bae4777cd08dc7c9ce2890fa9f07665 Mon Sep 17 00:00:00 2001 From: MeganSteenkamp <64108933+MeganSteenkamp@users.noreply.github.com> Date: Thu, 26 Oct 2023 03:23:18 +0000 Subject: [PATCH] =?UTF-8?q?Deploying=20to=20gh-pages=20from=20=20@=202b154?= =?UTF-8?q?6078713b497af790947bb9676b405d11768=20=F0=9F=9A=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- asset-lifecycle.png | Bin 111892 -> 0 bytes guides/creating-digital-tokens/index.html | 14 +-- guides/creating-test-money/index.html | 12 +-- guides/ecommerce-website/index.html | 6 +- .../farmlands-card-partner-support/index.html | 6 +- guides/farmlands-pos-integration/index.html | 84 +++++++++--------- guides/initiating-refunds/index.html | 14 +-- .../integrating-third-party-asset/index.html | 12 +-- guides/line-items/index.html | 8 +- guides/loading-and-sending-assets/index.html | 12 +-- .../index.html | 22 ++--- .../index.html | 8 +- .../index.html | 10 +-- guides/partial-payment-extension/index.html | 12 +-- guides/patron-not-present/index.html | 6 +- guides/payment-conditions/index.html | 16 ++-- guides/payment-flows/index.html | 26 +++--- guides/payment-terminals/index.html | 8 +- guides/point-of-sale/index.html | 12 +-- guides/requesting-payment/index.html | 10 +-- guides/requesting-pre-auth/index.html | 14 +-- .../index.html | 16 ++-- guides/transaction-reporting/index.html | 6 +- index-data.json | 2 +- 24 files changed, 168 insertions(+), 168 deletions(-) delete mode 100644 asset-lifecycle.png diff --git a/asset-lifecycle.png b/asset-lifecycle.png deleted file mode 100644 index 907373bcbf02729ae3b8adc358837b43a28dab37..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 111892 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%0A-{S$n|`t1s(ldl6}iasn9UwPJLC`sNjAhVXQ2 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 NTW!25LEq-c{{TvOT%!O0 diff --git a/guides/creating-digital-tokens/index.html b/guides/creating-digital-tokens/index.html index 749481e25..cbab1b7c9 100644 --- a/guides/creating-digital-tokens/index.html +++ b/guides/creating-digital-tokens/index.html @@ -17,9 +17,9 @@ -

+

Guides -

Creating Digital Tokens

Digital tokens are assets that can be exchanged for specific products or deals. Think a “Free coffee” coupon or a “50% off” voucher. +

Creating Digital Tokens

Digital tokens are assets that can be exchanged for specific products or deals. Think a “Free coffee” coupon or a “50% off” voucher. Unlike assets such as gift cards or currency, tokens can only be spent in their entirety, all at once.

Token Collection

A collection is a grouping of tokens that share the same attributes and redemption conditions, e.g.

@@ -30,7 +30,7 @@
  • Maximum redemption value
  • Redemption Conditions

    -

    A redemption condition allows a Merchant  API  to accept tokens from a token collection. +

    A redemption condition allows a Merchant  API  to accept tokens from a token collection. It contains redemption details specific to that merchant, e.g. redeemable product SKUs.

    Implementation

    @@ -47,18 +47,18 @@
    1. Create a token collection

      -

      You can create Collections by calling our Create Token Collection  API  endpoint. You will need the account identifier of the owning account for the accountId field. The maxValue field is optional, and defines the upper limit on any settlement amount for a redeemed token.

      +

      You can create Collections by calling our Create Token Collection  API  endpoint. You will need the account identifier of the owning account for the accountId field. The maxValue field is optional, and defines the upper limit on any settlement amount for a redeemed token.

    2. Create a redemption condition for each merchant, using the collection Id from step 1.

      -

      Redemption Conditions are created by calling the Create Redemption Condition  API  endpoint. You will need the merchant identifier for the merchantId field. The list of allowedProducts defines those products sold by the merchant that are eligible for redemption. The sku for the product will need to match the sku that is passed in with the line item when the merchant creates the payment during redemption: Create Payment Request  API .

      +

      Redemption Conditions are created by calling the Create Redemption Condition  API  endpoint. You will need the merchant identifier for the merchantId field. The list of allowedProducts defines those products sold by the merchant that are eligible for redemption. The sku for the product will need to match the sku that is passed in with the line item when the merchant creates the payment during redemption: Create Payment Request  API .

    3. Create tokens.

      -

      Tokens can be created for the collection by calling the Create Token  API  endpoint.

      +

      Tokens can be created for the collection by calling the Create Token  API  endpoint.

    4. Transfer the tokens to users.

      -

      You can send Tokens to users by calling our Asset Transfers  API  endpoint.

      +

      You can send Tokens to users by calling our Asset Transfers  API  endpoint.

    \ No newline at end of file diff --git a/guides/creating-test-money/index.html b/guides/creating-test-money/index.html index f79c8853c..432bf51e1 100644 --- a/guides/creating-test-money/index.html +++ b/guides/creating-test-money/index.html @@ -17,9 +17,9 @@ -

    +

    Guides -

    Creating Test Money

    In order to make testing easier, most Centrapay assets have a “test” variant which can be issued at no cost. In the case of money, issuing the test variant (eg “centrapay.nzd.test”) requires linking a “test” bank account which, instead of going through the banking system, sends transaction notifications to the email address of the initiating user.

    +

    Creating Test Money

    In order to make testing easier, most Centrapay assets have a “test” variant which can be issued at no cost. In the case of money, issuing the test variant (eg “centrapay.nzd.test”) requires linking a “test” bank account which, instead of going through the banking system, sends transaction notifications to the email address of the initiating user.

    The test bank account can be used to create a topup request. The 4-digit bank account verification code, which normally appears in your bank account statement, will be included in the emailed transaction notification.

    The test assets can be created via either the Centrapay API or the Centrapay app.

    @@ -28,10 +28,10 @@

    Via API

    To create test dollars via the Centrapay API:

      -
    1. Add email to Centrapay profile: If not already configured, set an email on your Centrapay user profile via the update profile endpoint  API .
    2. -
    3. Create a test bank account: Create a bank account, using “00-“ as the bank account number prefx, via the create bank account endpoint  API .
    4. -
    5. Create a test topup: Use the test bank account id to topup up via the topup endpoint  API . The topup must be created with a Centrapay user (ie: authenticated with JWT, not an API key) in order for the transaction email notification to be delivered.
    6. -
    7. Verify the bank account: Post the 4-digit code from the test transaction confirmation email, along with the test bank account id, to the verify bank account endpoint  API .
    8. +
    9. Add email to Centrapay profile: If not already configured, set an email on your Centrapay user profile via the update profile endpoint  API .
    10. +
    11. Create a test bank account: Create a bank account, using “00-“ as the bank account number prefx, via the create bank account endpoint  API .
    12. +
    13. Create a test topup: Use the test bank account id to topup up via the topup endpoint  API . The topup must be created with a Centrapay user (ie: authenticated with JWT, not an API key) in order for the transaction email notification to be delivered.
    14. +
    15. Verify the bank account: Post the 4-digit code from the test transaction confirmation email, along with the test bank account id, to the verify bank account endpoint  API .

    Via Centrapay App

    To create test dollars via the Centrapay app:

    diff --git a/guides/ecommerce-website/index.html b/guides/ecommerce-website/index.html index 55be73618..e24f2eb63 100644 --- a/guides/ecommerce-website/index.html +++ b/guides/ecommerce-website/index.html @@ -18,10 +18,10 @@

    +

    Guides -

    eCommerce

    eCommerce websites accepting payments via Centrapay may want to redirect their users back to their website after they pay/cancel the payment request. In order to do this, the eCommerce website must add allowedRedirectUrls to it’s Merchant Config  API .

    -

    After allowedRedirectUrls have been added to the Merchant Config, the eCommerce website can simply pass in their redirectUrl when creating a Payment Request  API .

    +

    eCommerce

    eCommerce websites accepting payments via Centrapay may want to redirect their users back to their website after they pay/cancel the payment request. In order to do this, the eCommerce website must add allowedRedirectUrls to it’s Merchant Config  API .

    +

    After allowedRedirectUrls have been added to the Merchant Config, the eCommerce website can simply pass in their redirectUrl when creating a Payment Request  API .

    Request
    POST/api/payment-requests
        curl -X POST https://service.centrapay.com/api/payment-requests \
       -H "X-Api-Key: $api_key" \
       -H "Content-Type: application/json" \
    diff --git a/guides/farmlands-card-partner-support/index.html b/guides/farmlands-card-partner-support/index.html
    index 90ee3df03..ee09835e8 100644
    --- a/guides/farmlands-card-partner-support/index.html
    +++ b/guides/farmlands-card-partner-support/index.html
    @@ -17,9 +17,9 @@
     
     
     
    -

    +

    Guides -

    Farmlands Card Partner Support Guide

    If you are a Farmlands Card Partner needing extra support this is the guide for you. Here you will find who you need to reach out to and how you can get in touch with them.

    +

    Farmlands Card Partner Support Guide

    If you are a Farmlands Card Partner needing extra support this is the guide for you. Here you will find who you need to reach out to and how you can get in touch with them.

    Support for Portal Users

    1. If you require assistance with Portal functionality, contact Centrapay at support@centrapay.com or Farmlands at card.specialist@farmlands.co.nz @@ -27,7 +27,7 @@
    2. If you are needing to add a new branch/location please contact your Card Portfolio manager or card.specialist@farmlands.co.nz as Farmlands will need to complete the setup of the branch/location within our system prior to this being enabled in the Portal.

    Trouble Shooting

    -
    +

    Support for POS Integrators

    1. If you require assistance with POS integration functionality contact Centrapay at support@centrapay.com or Farmlands at card.specialist@farmlands.co.nz
    2. diff --git a/guides/farmlands-pos-integration/index.html b/guides/farmlands-pos-integration/index.html index 9f44f7cb3..47d1dd40d 100644 --- a/guides/farmlands-pos-integration/index.html +++ b/guides/farmlands-pos-integration/index.html @@ -18,9 +18,9 @@

      +

      Guides -

      Farmlands POS Integration Guide

      Centrapay and Farmlands have entered a partnership to enable a digital way for Farmlands Card Partners to accept Farmlands Card as payment at the point of sale. This solution will position Card Partners to be able to also accept a digital form of the Farmlands Card in the future.

      +

      Farmlands POS Integration Guide

      Centrapay and Farmlands have entered a partnership to enable a digital way for Farmlands Card Partners to accept Farmlands Card as payment at the point of sale. This solution will position Card Partners to be able to also accept a digital form of the Farmlands Card in the future.

      Farmlands Card Partners need to be approved by Farmlands prior to enabling Farmlands Card as a payment option through the Centrapay integration. Contact your Card Portfolio Manager or the Card Specialist team at card.specialist@farmlands.co.nz to work through the onboarding process.

      Centrapay Integration Benefits

      Integrating with Centrapay streamlines the process for authorising and invoicing Farmlands Card Payments. The integration provides:

      @@ -72,7 +72,7 @@
    The back of an example Farmlands card, displaying a barcode and a 9-digit card number
      -
    1. The POS creates a Payment Request  API  with the Farmlands Card barcode.
    2. +
    3. The POS creates a Payment Request  API  with the Farmlands Card barcode.
    Request
    POST/api/payment-requests
        curl -X POST https://service.centrapay.com/api/payment-requests \
       -H "X-Api-Key: $api_key" \
    @@ -167,7 +167,7 @@
     Copy
     
      -
    1. The POS polls the Payment Request  API  every second for status changes.
    2. +
    3. The POS polls the Payment Request  API  every second for status changes.
    Request
    GET/api/payment-requests/{paymentRequestId}
        curl https://service.centrapay.com/api/payment-requests/MhocUmpxxmgdHjr7DgKoKw \
       -H "Authorization: $jwt"
    @@ -232,7 +232,7 @@
     Copy
     
      -
    1. Polling the Payment Request  API  returns a list of pending merchantConditions in the response. The POS must prompt the cashier to accept  API  or decline  API  each Payment Condition in order to successfully complete a payment.
    2. +
    3. Polling the Payment Request  API  returns a list of pending merchantConditions in the response. The POS must prompt the cashier to accept  API  or decline  API  each Payment Condition in order to successfully complete a payment.
    Request
    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"
    @@ -259,7 +259,7 @@
       
    -

    A successful payment is identified when all Payment Conditions have an accepted status and the Payment Request  API  status is paid. Here, the POS must stop polling and display confirmation of the successful payment.

    +

    A successful payment is identified when all Payment Conditions have an accepted status and the Payment Request  API  status is paid. Here, the POS must stop polling and display confirmation of the successful payment.

    Request
    GET/api/payment-requests/{paymentRequestId}
        curl https://service.centrapay.com/api/payment-requests/MhocUmpxxmgdHjr7DgKoKw \
       -H "Authorization: $jwt"
       

    Payment Flow Implementation

    The Payment Flow can only be used by existing Farmlands Card Partners. Card Partners must complete the following steps to accept Farmlands transactions.

      -
    1. Each Card Partner site must be correctly set up as a Merchant  API  in Centrapay’s system.
    2. +
    3. Each Card Partner site must be correctly set up as a Merchant  API  in Centrapay’s system.
    4. Centrapay needs to supply Card Partners with API keys to allow them to authenticate their API requests.
    5. Card Partners must meet basic payment requirements, including supporting Payment Conditions and Refunds in order to implement the Barcode Payment Flow.
    6. Card Partners should extend the Barcode payment Flow to meet any additional requirements, these optional extensions include: @@ -337,13 +337,13 @@

    Merchant Configuration

    -

    Each Card Partner site that needs to accept Farmlands Card payments must be set up as a separate Centrapay Merchant  API  with its own Merchant Config  API . The Merchant Config contains a Farmlands Payment Option  API  that allows the site to accept Farmlands Payments.

    -

    The POS needs to provide the unique Merchant Config ID for the Merchant when creating Payment Requests  API  on their behalf.

    +

    Each Card Partner site that needs to accept Farmlands Card payments must be set up as a separate Centrapay Merchant  API  with its own Merchant Config  API . The Merchant Config contains a Farmlands Payment Option  API  that allows the site to accept Farmlands Payments.

    +

    The POS needs to provide the unique Merchant Config ID for the Merchant when creating Payment Requests  API  on their behalf.

    Merchants and Merchant Configs are managed by Centrapay. Farmlands will provide Card Partners with these details.

    Authentication

    -

    Requests to Centrapay’s APIs are authenticated  API  by providing an API key in the X-Api-Key header. API Keys  API  provide enduring access to a single Centrapay account.

    +

    Requests to Centrapay’s APIs are authenticated  API  by providing an API key in the X-Api-Key header. API Keys  API  provide enduring access to a single Centrapay account.

    Request
    GET/api/account-memberships
        curl https://service.centrapay.com/api/account-memberships \
       -H "X-Api-Key: $api_key"
       

    Payment Conditions

    @@ -379,7 +379,7 @@

    Farmlands Card Partners must support this extension.

    This extension enables the POS to enforce requiring an ID check for high-risk transactions.

    -

    Card Partners must extend the Barcode Flow to support this by creating Payment Requests  API  with the conditionsEnabled flag set to true. The response will include the merchantConditions that must be accepted, and each condition will include a message field that the POS can display to the cashier.

    +

    Card Partners must extend the Barcode Flow to support this by creating Payment Requests  API  with the conditionsEnabled flag set to true. The response will include the merchantConditions that must be accepted, and each condition will include a message field that the POS can display to the cashier.

    The Payment Request must always be polled after accepting or declining a condition.

    See also: Payment Conditions

    @@ -387,7 +387,7 @@

    Pre Auth

    Farmlands Card Partners must support this extension when there is not an invoice number available at the point of sale or the purchase cannot be fulfilled immediately. This might happen if your stock is not on hand or you have a separate fulfilment process.

    This extension enables the POS to create an authorisation that ensures funds are available and places a hold on them.

    -

    Card Partners can extend the Barcode Flow to support this by creating Payment Requests  API  with the preAuth flag set to true.

    +

    Card Partners can extend the Barcode Flow to support this by creating Payment Requests  API  with the preAuth flag set to true.

    Pre Auth Sequence

    creating a Payment Request  API  with the barcode on the Farmlands Card and the preauth flag. Creating a Payment Request must also enable the Payment Conditions extension and include full details for all Line Items  API . +
  • The POS authorises a Pre Auth payment by creating a Payment Request  API  with the barcode on the Farmlands Card and the preauth flag. Creating a Payment Request must also enable the Payment Conditions extension and include full details for all Line Items  API .
  • Request
    POST/api/payment-requests
        curl -X POST https://service.centrapay.com/api/payment-requests \
       -H "X-Api-Key: $api_key" \
    @@ -525,7 +525,7 @@
     Copy
     
      -
    1. The POS polls the Payment Request  API  every second for status changes.
    2. +
    3. The POS polls the Payment Request  API  every second for status changes.
    Request
    GET/api/payment-requests/{paymentRequestId}
        curl https://service.centrapay.com/api/payment-requests/MhocUmpxxmgdHjr7DgKoKw \
       -H "Authorization: $jwt"
    @@ -590,7 +590,7 @@
     Copy
     
      -
    1. Polling the Payment Request  API  returns a list of pending merchantConditions in the response. The POS must prompt the cashier to accept  API  or decline  API  each Payment Condition in order to successfully authorise a Pre Auth payment.
    2. +
    3. Polling the Payment Request  API  returns a list of pending merchantConditions in the response. The POS must prompt the cashier to accept  API  or decline  API  each Payment Condition in order to successfully authorise a Pre Auth payment.
    Request
    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"
    @@ -617,7 +617,7 @@
       
    -

    A successful authorisation is identified when all Payment Conditions have an accepted status, the Payment Request  API  status is paid and the preAuthStatus is authorized. Here, the POS must stop polling and display confirmation of the successful authorisation.

    +

    A successful authorisation is identified when all Payment Conditions have an accepted status, the Payment Request  API  status is paid and the preAuthStatus is authorized. Here, the POS must stop polling and display confirmation of the successful authorisation.

    Request
    GET/api/payment-requests/{paymentRequestId}
        curl https://service.centrapay.com/api/payment-requests/MhocUmpxxmgdHjr7DgKoKw \
       -H "Authorization: $jwt"
       
      -
    1. When the purchase is ready to be fulfilled, the POS makes a Pre Auth confirmation  API  against the Payment Request  API . Multiple confirmations can be performed against an authorisation but the total value cannot exceed the original authorised value.
    2. +
    3. When the purchase is ready to be fulfilled, the POS makes a Pre Auth confirmation  API  against the Payment Request  API . Multiple confirmations can be performed against an authorisation but the total value cannot exceed the original authorised value.
    Request
    POST/api/payment-requests/{paymentRequestId}/confirm
        curl -X POST https://service.centrapay.com/api/payment-requests/MhocUmpxxmgdHjr7DgKoKw/confirm \
       -H "X-Api-Key: $api_key" \
    @@ -739,8 +739,8 @@
     Copy
     
      -
    1. The POS releases any remaining authorised funds  API  against the Payment Request  API  back to the Cardholder. -To confirm if there are funds requiring release you can list payment activities  API  and sum the confirmation payment activities  API .
    2. +
    3. The POS releases any remaining authorised funds  API  against the Payment Request  API  back to the Cardholder. +To confirm if there are funds requiring release you can list payment activities  API  and sum the confirmation payment activities  API .

    Only call release if there are funds requiring release.

    @@ -778,7 +778,7 @@

    Cardholder Not Present

    Farmlands Card Partners must support this extension if they accept payments when the Cardholder is not physically present when a payment is authorised. For example, to accept phone-based orders or orders where the Farmlands barcode is already known.

    Please refer to your Farmlands Card Partner Acceptance Terms and Conditions to understand the risks involved with these transactions.

    -

    Card Partners can extend the Barcode Flow to support this by creating Payment Requests  API  with the patronNotPresent flag set to true.

    +

    Card Partners can extend the Barcode Flow to support this by creating Payment Requests  API  with the patronNotPresent flag set to true.

    Request
    POST/api/payment-requests
        curl -X POST https://service.centrapay.com/api/payment-requests \
       -H "X-Api-Key: $api_key" \
       -H "Content-Type: application/json" \
    @@ -819,7 +819,7 @@
     

    See also: Patron Not Present

    Validating Farmlands Barcodes

    -

    Farmlands Card Partners may optionally decode a scanned Farmlands Barcode  API  to confirm that it is valid and apply Farmlands discounts before creating a Payment Request  API .

    +

    Farmlands Card Partners may optionally decode a scanned Farmlands Barcode  API  to confirm that it is valid and apply Farmlands discounts before creating a Payment Request  API .

    Request
    POST/api/decode
        curl -X POST https://service.centrapay.com/api/decode \
       -H "Authorization: $jwt" \
       -H "Content-Type: application/json" \
    @@ -842,7 +842,7 @@
     Copy
     

    Handling Payment Errors

    -

    The POS must follow Centrapay’s guidelines on handling errors when dealing with inconsistencies in Payment Request  API  statuses due to network issues or race conditions.

    +

    The POS must follow Centrapay’s guidelines on handling errors when dealing with inconsistencies in Payment Request  API  statuses due to network issues or race conditions.

    @@ -850,8 +850,8 @@

    Farmlands Card Partners must support refunds.

    -

    Cardholder purchases are refunded by refunding the Payment Request  API .

    -

    When the Cardholder presents a transaction reference (e.g. a Payment Request  API  short code or externalRef) on their paper receipt, the POS should use this reference to look up the Payment Request ID and initiate the refund.

    +

    Cardholder purchases are refunded by refunding the Payment Request  API .

    +

    When the Cardholder presents a transaction reference (e.g. a Payment Request  API  short code or externalRef) on their paper receipt, the POS should use this reference to look up the Payment Request ID and initiate the refund.

    Payment Request  API  ID using the transaction reference. -
  • The POS refunds the Payment Request  API  using its ID.
  • +
  • The Cardholder presents a transaction reference on their paper receipt. The POS looks up the Payment Request  API  ID using the transaction reference.
  • +
  • The POS refunds the Payment Request  API  using its ID.
  • Request
    POST/api/payment-requests/{paymentRequestId}/refund
        curl -X POST https://service.centrapay.com/api/payment-requests/{paymentRequestId}/refund \
       -H "X-Api-Key: $api_key" \
    @@ -924,11 +924,11 @@
     

    See also: Initiating Refunds

    Short Codes

    -

    Payment Requests  API  have a short code field that is human- and OCR-friendly. When combined with the date or merchant id, short codes can unambiguously identify the correct Payment Request.

    +

    Payment Requests  API  have a short code field that is human- and OCR-friendly. When combined with the date or merchant id, short codes can unambiguously identify the correct Payment Request.

    Short codes can be used for initiating refunds by making them available to the Cardholder on a paper printout.

    Card Partners should store the short code for each transaction. This helps with reconciliation if a transaction query occurs.

    -

    Some Payment Activities  API  are repeatable (e.g. Pre Auth Confirmations and Refunds) so these have their own unique short code in order to disambiguate them. The short codes for these activities are different from the original Payment Request short code.

    +

    Some Payment Activities  API  are repeatable (e.g. Pre Auth Confirmations and Refunds) so these have their own unique short code in order to disambiguate them. The short codes for these activities are different from the original Payment Request short code.

    Testing Your Integration

    Merchant Integrators need to work with Farmlands and Centrapay to get set up to test payments. Please contact Farmlands to organise full end-to-end testing.

    @@ -980,16 +980,16 @@

    Barcode Flow Requirements

    Line Item Requirements

      -
    • Full details for Line Items  API  MUST include the description, SKU, quantity, price, tax and the discount provided to the Cardholder.
    • +
    • Full details for Line Items  API  MUST include the description, SKU, quantity, price, tax and the discount provided to the Cardholder.
    • The price of a Line Item MUST represent the amount that a Cardholder will pay for that Line Item, including tax and any discounts applied.
    • -
    • The total for all Line Item prices MUST sum to the Payment Request  API  amount.
    • +
    • The total for all Line Item prices MUST sum to the Payment Request  API  amount.
    • The price and discount for each Line Item MUST be provided in cents.
    • The currency for each Line Item MUST be consistent with the Payment Request value.
    @@ -1000,16 +1000,16 @@

    Pre Auth Requirements

    • The Pre Auth extension MUST be supported when invoice numbers are not available at the time of purchase.
    • -
    • Payment Request  API  short codes MUST be included when completion is performed through existing reconciliation channels.
    • +
    • Payment Request  API  short codes MUST be included when completion is performed through existing reconciliation channels.
    • Pre Auth Confirmations MUST be made with an idempotencyKey in order to prevent merchants from drawing down on authorised funds twice.
    • -
    • Pre Auth Confirmations MUST include an invoice number and full details for all Line Items  API .
    • -
    • Authorised funds that will not be confirmed MUST be released  API  in order to return the funds to the Cardholder (e.g. orders that are cancelled before fulfilment).
    • -
    • Confirmed funds MUST be refunded  API  in order to return them to the Cardholder. They cannot be released.
    • +
    • Pre Auth Confirmations MUST include an invoice number and full details for all Line Items  API .
    • +
    • Authorised funds that will not be confirmed MUST be released  API  in order to return the funds to the Cardholder (e.g. orders that are cancelled before fulfilment).
    • +
    • Confirmed funds MUST be refunded  API  in order to return them to the Cardholder. They cannot be released.

    Refund Requirements

    Your payment method namespace may have a connection to your brand or product. Centrapay reserves the right to decline a requested namespace.

    Valid examples are centrapay-example or bitcoin.

    @@ -40,14 +40,14 @@
  • Test and main assets must share the same namespace but end in test or main. For example, centrapay.main and centrapay.test.
  • Integrating a test asset is optional.
  • A set of uplink APIs must be provided for both main and test.
  • -
  • Centrapay Merchants  API  need a test flag in order to accept test assets.
  • +
  • Centrapay Merchants  API  need a test flag in order to accept test assets.
  • Description

    Merchants may look at reports or receipts of past transactions. If there was a payment or refund with your asset against their Payment Request, the description of your asset will be displayed.

    Your description cannot exceed 15 characters.

    An example description is Centrapay NZD, Bitcoin, or Ethereum.

    Supported Currencies

    -

    Payment Requests  API  have a value determined by the currency a Merchant accepts. You should supply a finite list of three-letter ISO currency codes that is supported by your asset.

    +

    Payment Requests  API  have a value determined by the currency a Merchant accepts. You should supply a finite list of three-letter ISO currency codes that is supported by your asset.

    Example Definition

    @@ -270,7 +270,7 @@ -
    NameTypeNecessityDescription
    currencyStringrequiredThe three letter ISO curreny code for the payment.
    amountStringrequiredThe value required to pay in the smallest denomination for the supported currency (e.g. cents).
    authorizationStringrequiredA reference to the asset of the party paying the Payment Request.
    merchantNameStringrequiredThe name of the merchant who created the Payment Request.
    merchantIdStringrequiredYour identifier for the merchant receiving payment.
    idempotencyKeyStringrequiredA unique value that can be used to recognise subsequent retries of the same request.
    transactionIdStringrequiredAn ID for the transaction in Centrapay’s system.
    statusStringrequiredThe status of the asset transaction. See possible status values.
    typeStringrequiredThe type of transaction. Possible values are payment or refund.
    failureReasonStringoptionalRequired if the status is failed. See possible failure reasons.
    refundableBooleanoptionalRequired if type is payment and status is successful. A flag indicating whether a payment is refundable.
    refundBeforeTimestap  API optionalThe latest time at which a refund can be initiated.
    +
    NameTypeNecessityDescription
    currencyStringrequiredThe three letter ISO curreny code for the payment.
    amountStringrequiredThe value required to pay in the smallest denomination for the supported currency (e.g. cents).
    authorizationStringrequiredA reference to the asset of the party paying the Payment Request.
    merchantNameStringrequiredThe name of the merchant who created the Payment Request.
    merchantIdStringrequiredYour identifier for the merchant receiving payment.
    idempotencyKeyStringrequiredA unique value that can be used to recognise subsequent retries of the same request.
    transactionIdStringrequiredAn ID for the transaction in Centrapay’s system.
    statusStringrequiredThe status of the asset transaction. See possible status values.
    typeStringrequiredThe type of transaction. Possible values are payment or refund.
    failureReasonStringoptionalRequired if the status is failed. See possible failure reasons.
    refundableBooleanoptionalRequired if type is payment and status is successful. A flag indicating whether a payment is refundable.
    refundBeforeTimestap  API optionalThe latest time at which a refund can be initiated.

    Statuses

    diff --git a/guides/line-items/index.html b/guides/line-items/index.html index b13535d30..075355d5a 100644 --- a/guides/line-items/index.html +++ b/guides/line-items/index.html @@ -18,9 +18,9 @@

    +

    Guides -

    Line Items

    Line Items  API  are used to communicate the details of a purchase to a patron.

    +

    Line Items

    Line Items  API  are used to communicate the details of a purchase to a patron.

    Restrictions

    1. The price of a Line Item MUST represent the amount that a patron will pay for that Line Item, including tax and any discounts applied (e.g. price = product price * qty - discounts + tax).
    2. @@ -40,7 +40,7 @@
    1. The price for each Line Item MUST be provided in cents.
    2. -
    3. The total for all Line Item prices MUST sum to the Payment Request  API  amount.
    4. +
    5. The total for all Line Item prices MUST sum to the Payment Request  API  amount.
    6. The currency for each Line Item MUST be consistent with the Payment Request value.
    7. The discount for each Line Item MUST be provided in cents and is tax exclusive.
    8. A discount that applies to multiple line items may be represented as a separate line item with a negative amount.
    9. @@ -74,7 +74,7 @@

    Determining Paid For Line Items

    Payments via Centrapay can be made against specific line items. This can happen because a user has specifically requested the line items they wish an asset to pay for, or because they were using an asset that can only be redeemed for a specific product, like a Centrapay Token. It’s important to communicate to the merchant which line items have been purchased via Centrapay so they are able to make educated decisions when refunding transactions or completing partial payments. -This information should also be displayed to a consumer when possible. If any line items were purchased by a specific asset, they will be returned on a Payment Request  API  inside the Asset Totals  API  array. +This information should also be displayed to a consumer when possible. If any line items were purchased by a specific asset, they will be returned on a Payment Request  API  inside the Asset Totals  API  array. Integrators must iterate through the assetTotals array and display any line items purchased to the merchant. Line items that have been purchased via Centrapay must no longer be able to be purchased using another form of payment. This is especially important for any assets which are only redeemable against specific line items. For example, there could be a case where someone used a digital token to pay for a line item, and then a physical voucher to pay for that same line item, which would mean the second voucher could go towards purchasing something other than the intended line item.

    Example
          {
    diff --git a/guides/loading-and-sending-assets/index.html b/guides/loading-and-sending-assets/index.html
    index 873442f00..2373734b5 100644
    --- a/guides/loading-and-sending-assets/index.html
    +++ b/guides/loading-and-sending-assets/index.html
    @@ -18,14 +18,14 @@
     
     
     

    +

    Guides -

    Loading and Sending Assets

    Assets  API  such as Giftcards or Tokens can be issued by a Centrapay Account and then distributed to another Centrapay user’s phone number via SMS.

    +

    Loading and Sending Assets

    Assets  API  such as Giftcards or Tokens can be issued by a Centrapay Account and then distributed to another Centrapay user’s phone number via SMS.

    Loading Giftcards

    -

    You can load Giftcards by calling our External Assets  API  endpoint. You will need to use the giftcard number for the externalId field. The pin, the issuer and the type need to be on hand too.

    +

    You can load Giftcards by calling our External Assets  API  endpoint. You will need to use the giftcard number for the externalId field. The pin, the issuer and the type need to be on hand too.

    If your asset type is not included on the list, contact integrations@centrapay.com.

    Sending Assets

    -

    You can send Assets such as Tokens and Giftcards by calling our Asset Transfers  API  endpoint. You will need to have the recipient’s phone number for recipientAlias to identify the reciever.

    +

    You can send Assets such as Tokens and Giftcards by calling our Asset Transfers  API  endpoint. You will need to have the recipient’s phone number for recipientAlias to identify the reciever.

    If the recipientAlias doesn’t end up creating a Centrapay account within 2 weeks, then it will be sent back to you.

    Example: Bulk distribution of Giftcards

    Sometimes you might want to load and distribute Giftcards to a large number of recipients. This requires some scripting, but this is not hard. We can do this with:

    @@ -48,8 +48,8 @@
    Example
        #!/usr/bin/env node
     
    diff --git a/guides/merchant-integration-barcode-flow/index.html b/guides/merchant-integration-barcode-flow/index.html
    index 4855f9c37..da0bf3ad6 100644
    --- a/guides/merchant-integration-barcode-flow/index.html
    +++ b/guides/merchant-integration-barcode-flow/index.html
    @@ -18,9 +18,9 @@
     
     
     

    +

    Guides -

    Barcode Flow for Merchants

    Connecting with patrons using our Barcode Flow requires the patron to present a Barcode and the merchant integration to scan it in order to create a Payment Request  API .

    +

    Barcode Flow for Merchants

    Connecting with patrons using our Barcode Flow requires the patron to present a Barcode and the merchant integration to scan it in order to create a Payment Request  API .

    Barcode Flow

    The sequence diagram below indicates the expected flow of behavior between the patron, the Point of Sale (POS) and Centrapay.

    @@ -51,7 +51,7 @@
    1. The patron presents a Barcode for the POS to scan.
    2. -
    3. The POS creates a Centrapay Payment Request  API  with the Barcode.
    4. +
    5. The POS creates a Centrapay Payment Request  API  with the Barcode.
    Request
    POST/api/payment-requests
        curl -X POST https://service.centrapay.com/api/payment-requests \
       -H "X-Api-Key: $api_key" \
    @@ -97,7 +97,7 @@
     Copy
     
      -
    1. The POS polls the Payment Request for  API  Payment Confirmation.
    2. +
    3. The POS polls the Payment Request for  API  Payment Confirmation.
    Request
    GET/api/payment-requests/{paymentRequestId}
        curl https://service.centrapay.com/api/payment-requests/MhocUmpxxmgdHjr7DgKoKw \
       -H "Authorization: $jwt"
    @@ -133,7 +133,7 @@
     Copy
     
      -
    1. While the POS continues to poll, the patron pays the Payment Request  API  via their Centrapay integrated app.
    2. +
    3. While the POS continues to poll, the patron pays the Payment Request  API  via their Centrapay integrated app.
    Request
    POST/api/payment-requests/{paymentRequestId}/pay
        curl -X POST https://service.centrapay.com/api/payment-requests/MhocUmpxxmgdHjr7DgKoKw/pay \
       -H "Authorization: $jwt" \
    @@ -203,7 +203,7 @@
     

    Quick Pay Flow

    Quick Pay is used to immediately confirm the payment without requiring patron approval.

    -

    The patron’s barcode must be linked to an asset type that allows Quick Pay in order to use this flow. See Asset Types  API  for the list of asset types that support Quick Pay.

    +

    The patron’s barcode must be linked to an asset type that allows Quick Pay in order to use this flow. See Asset Types  API  for the list of asset types that support Quick Pay.

    creates a Centrapay Payment Request  API  with the Barcode. +
  • The POS creates a Centrapay Payment Request  API  with the Barcode.
  • Request
    POST/api/payment-requests
        curl -X POST https://service.centrapay.com/api/payment-requests \
       -H "X-Api-Key: $api_key" \
    @@ -275,7 +275,7 @@
     Copy
     
      -
    1. The POS polls the Payment Request for  API  payment confirmation.
    2. +
    3. The POS polls the Payment Request for  API  payment confirmation.
    Request
    GET/api/payment-requests/{paymentRequestId}
        curl https://service.centrapay.com/api/payment-requests/MhocUmpxxmgdHjr7DgKoKw \
       -H "Authorization: $jwt"
    @@ -348,7 +348,7 @@
     Copy
     

    Checking Barcode Details

    -

    The POS can optionally decode a scanned barcode  API  in order to get further details about a barcode before it creates a Payment Request. For example, the POS can use the barcode provider to apply any provider-specific discounts before creating the Payment Request.

    +

    The POS can optionally decode a scanned barcode  API  in order to get further details about a barcode before it creates a Payment Request. For example, the POS can use the barcode provider to apply any provider-specific discounts before creating the Payment Request.

    decodes the scanned barcode  API  and applies any provider-related discounts. +
  • The POS decodes the scanned barcode  API  and applies any provider-related discounts.
  • Request
    POST/api/decode
        curl -X POST https://service.centrapay.com/api/decode \
       -H "Authorization: $jwt" \
    @@ -393,7 +393,7 @@
     Copy
     
      -
    1. The POS creates a Payment Request  API  with the barcode and continues with either the Barcode Flow or Quick Pay Flow.
    2. +
    3. The POS creates a Payment Request  API  with the barcode and continues with either the Barcode Flow or Quick Pay Flow.
    Request
    POST/api/payment-requests
        curl -X POST https://service.centrapay.com/api/payment-requests \
       -H "X-Api-Key: $api_key" \
    diff --git a/guides/merchant-integration-error-handling/index.html b/guides/merchant-integration-error-handling/index.html
    index 375927f93..d8875119d 100644
    --- a/guides/merchant-integration-error-handling/index.html
    +++ b/guides/merchant-integration-error-handling/index.html
    @@ -17,13 +17,13 @@
     
     
     
    -

    +

    Guides -

    Merchant Integration Error Handling

    Below are our guidelines for dealing with inconsistencies in Payment Request  API  statuses due to network issues or race conditions.

    +

    Merchant Integration Error Handling

    Below are our guidelines for dealing with inconsistencies in Payment Request  API  statuses due to network issues or race conditions.

    Respect Payment Status

    -

    Use the Payment Request status as the source of truth when determining if a Payment Request is paid or expired. For example, if cancelling a Payment Request fails with a REQUEST_PAID error then the terminal should respond accordingly; either by showing the transaction as paid or initiating a void  API  instead.

    +

    Use the Payment Request status as the source of truth when determining if a Payment Request is paid or expired. For example, if cancelling a Payment Request fails with a REQUEST_PAID error then the terminal should respond accordingly; either by showing the transaction as paid or initiating a void  API  instead.

    Void Unknown Status

    -

    If the status of a transaction cannot be determined to be successful after retrying, then the Payment Request should be voided. Voiding a Payment Request  API  will cancel the request and trigger any refunds if necessary.

    +

    If the status of a transaction cannot be determined to be successful after retrying, then the Payment Request should be voided. Voiding a Payment Request  API  will cancel the request and trigger any refunds if necessary.

    Configure POS Timeout

    Payment Requests have a configurable timeout which defaults to 2 minutes. Integrators should make sure that the payment terminal times out 5-10 seconds after the Payment Request.

    For example, if the Point of Sale (POS) has a 90-second payment timeout then the Payment Request could be created with an 85-second timeout to prevent the payment terminal from expiring at the same time as the Payment Request is paid.

    diff --git a/guides/merchant-integration-qr-code-flow/index.html b/guides/merchant-integration-qr-code-flow/index.html index c8575cf23..408d98bce 100644 --- a/guides/merchant-integration-qr-code-flow/index.html +++ b/guides/merchant-integration-qr-code-flow/index.html @@ -18,9 +18,9 @@

    +

    Guides -

    QR Code Flow for Merchants

    Connecting with patrons using our QR Code Flow requires the merchant integration to create a Payment Request  API  and present a QR Code for the patron to scan.

    +

    QR Code Flow for Merchants

    Connecting with patrons using our QR Code Flow requires the merchant integration to create a Payment Request  API  and present a QR Code for the patron to scan.

    The sequence diagram below indicates the expected flow of behavior between the patron, the Point of Sale (POS) and Centrapay.

    creates a Payment Request  API  and presents a QR code to the Patron on a customer-facing display. +
  • The POS creates a Payment Request  API  and presents a QR code to the Patron on a customer-facing display.
  • The QR code decodes to a URL of the form https://service.centrapay.com/api/payment-requests/{paymentRequestId}/pay

    @@ -96,7 +96,7 @@
    1. The patron scans the QR code using a Centrapay-enabled app.
    2. -
    3. The POS polls the Payment Request for  API  Payment Confirmation.
    4. +
    5. The POS polls the Payment Request for  API  Payment Confirmation.
    Request
    GET/api/payment-requests/{paymentRequestId}
        curl https://service.centrapay.com/api/payment-requests/MhocUmpxxmgdHjr7DgKoKw \
       -H "Authorization: $jwt"
    @@ -130,7 +130,7 @@
     Copy
     
      -
    1. While the POS continues to poll, the patron pays the Payment Request  API  via their Centrapay integrated app. When the Payment Request status is paid, the POS stops polling and displays confirmation of the successful payment.
    2. +
    3. While the POS continues to poll, the patron pays the Payment Request  API  via their Centrapay integrated app. When the Payment Request status is paid, the POS stops polling and displays confirmation of the successful payment.
    Request
    POST/api/payment-requests/{paymentRequestId}/pay
        curl -X POST https://service.centrapay.com/api/payment-requests/MhocUmpxxmgdHjr7DgKoKw/pay \
       -H "Authorization: $jwt" \
    diff --git a/guides/partial-payment-extension/index.html b/guides/partial-payment-extension/index.html
    index 955c422a9..e5586d07c 100644
    --- a/guides/partial-payment-extension/index.html
    +++ b/guides/partial-payment-extension/index.html
    @@ -17,9 +17,9 @@
     
     
     
    -

    +

    Guides -

    Partial Payment

    Partial Payment enables patrons to pay using other payment options alongside +

    Partial Payment

    Partial Payment enables patrons to pay using other payment options alongside Centrapay.

    Partial Payment is a core feature of Centrapay’s payment protocol. Integration is required to allow acceptance of Centrapay Assets that relate to specific @@ -63,15 +63,15 @@ cashier needing to cancel the Payment Request and start over, the patron can make a partial payment with available funds. Once the Centrapay payment is successful, the point of sale can take payment for the remaining amount using -another method. +another method.
    Related steps in diagram above: 2→3→4→5→6

    Hybrid Partial Payment Scenario

    A combination of Merchant and App driven partial payments to cater for edge -cases where needed. +cases where needed.
    Related steps in diagram above: 1→2→3→4→5→6

    Implementation

    Creating the Payment Request

    -

    When creating a Payment Request  API , +

    When creating a Payment Request  API , opt into partial payment by:

    • Setting partialAllowed to true.
    • @@ -95,7 +95,7 @@
    • If it is 0, then the entire amount requested via Centrapay has been paid.
    • If it is greater than 0, you will need to request the remaining amount from the patron via another payment option. If the patron cannot complete the -transaction then the payment request should be refunded  API .
    • +transaction then the payment request should be refunded  API .

    See also

    \ No newline at end of file diff --git a/guides/payment-terminals/index.html b/guides/payment-terminals/index.html index cd8aa815d..ad4f7cbb5 100644 --- a/guides/payment-terminals/index.html +++ b/guides/payment-terminals/index.html @@ -17,17 +17,17 @@ -

    +

    Guides -

    Payment Terminal

    Integrating a merchant terminal with Centrapay APIs requires creating, cancelling, voiding and refunding Payment Requests  API  on behalf of Merchants using a “merchant terminal” API key.

    +

    Payment Terminal

    Integrating a merchant terminal with Centrapay APIs requires creating, cancelling, voiding and refunding Payment Requests  API  on behalf of Merchants using a “merchant terminal” API key.

    API Keys

    To create API keys, you first need to get in touch with Centrapay to be issued an Integrator Account and an “Account owner” API key. An “Account owner” is a special kind of role that allows you to manage your account.

    -

    You can use this key to Create an API Key  API  with the “merchant terminal” role. A “merchant terminal” key has a role that can create, cancel, void and refund Payment Requests on behalf of merchants.

    +

    You can use this key to Create an API Key  API  with the “merchant terminal” role. A “merchant terminal” key has a role that can create, cancel, void and refund Payment Requests on behalf of merchants.

    You are responsible for the safety of your API keys

    Merchant Configs

    -

    Centrapay Merchant Configs  API  represent an available set of configured payment methods that can be utilized by one or more payment terminals by a Merchant.

    +

    Centrapay Merchant Configs  API  represent an available set of configured payment methods that can be utilized by one or more payment terminals by a Merchant.

    Merchants and merchant configs are managed by Centrapay. The only details required to create payment requests on their behalf are the merchantId and merchantConfigId (aka clientId). Centrapay will send you these details through whatever channel works for you. Please get in touch to let us know.

    In the future Centrapay will allow an integrator to on-board their own merchants through APIs using integrator API keys.

    Example Flows

    diff --git a/guides/point-of-sale/index.html b/guides/point-of-sale/index.html index 0772ee393..481d334c1 100644 --- a/guides/point-of-sale/index.html +++ b/guides/point-of-sale/index.html @@ -17,18 +17,18 @@ -

    +

    Guides -

    Point of Sale

    Integrating a point of sale (POS) terminal with Centrapay APIs allows merchants to accept payment via any Centrapay-enabled apps without installing additional POS hardware or software.

    +

    Point of Sale

    Integrating a point of sale (POS) terminal with Centrapay APIs allows merchants to accept payment via any Centrapay-enabled apps without installing additional POS hardware or software.

    Core Requirements

    -

    Centrapay POS integrations must be able to create  API , void  API  and refund  API  Payment Requests on behalf of Merchants.

    +

    Centrapay POS integrations must be able to create  API , void  API  and refund  API  Payment Requests on behalf of Merchants.

    The POS authenticates against Centrapay APIs using a single “merchant terminal” API key.

    Optional Protocol Extensions

    Our payment protocol supports several optional extensions. Please review the extensions below and determine which ones you need for your integration.

    diff --git a/guides/requesting-payment/index.html b/guides/requesting-payment/index.html index cfc5300cf..a41401248 100644 --- a/guides/requesting-payment/index.html +++ b/guides/requesting-payment/index.html @@ -17,13 +17,13 @@ -

    +

    Guides -

    Requesting Payment

    Centrapay’s payment protocol requires a merchant integration to connect with the patron in order to create a Payment Request  API ; and poll it for payment confirmation.

    +

    Requesting Payment

    Centrapay’s payment protocol requires a merchant integration to connect with the patron in order to create a Payment Request  API ; and poll it for payment confirmation.

    Additionally, merchant integrations can opt into protocol extensions when creating a Payment Request in order to unlock acceptance of a wider set of payment options.

    Connecting With Patrons

    -

    The Payment Request  API  object is a core part of Centrapay’s payment protocol. It represents the intention of a merchant to receive payment, defines the amount to be paid, and the acceptable Asset Types  API  for payment.

    -

    In order to create a Payment Request  API , a merchant integration must connect with the patron. Centrapay supports two different options to connect with patrons. We recommend that merchant integrations implement both options to support the complete set of apps within Centrapay’s ecosystem.

    +

    The Payment Request  API  object is a core part of Centrapay’s payment protocol. It represents the intention of a merchant to receive payment, defines the amount to be paid, and the acceptable Asset Types  API  for payment.

    +

    In order to create a Payment Request  API , a merchant integration must connect with the patron. Centrapay supports two different options to connect with patrons. We recommend that merchant integrations implement both options to support the complete set of apps within Centrapay’s ecosystem.

    1. QR Code Flow for Merchants
    2. Barcode Flow for Merchants
    3. @@ -73,7 +73,7 @@

      A short code can be displayed to a user instead of the Payment Request ID; e.g. on paper printouts.

      Short codes can be used for Initiating Refunds.

    Polling for Payment Confirmation

    -

    After connecting with the patron, the POS must poll the Payment Request status  API  every second until the status has changed.

    +

    After connecting with the patron, the POS must poll the Payment Request status  API  every second until the status has changed.

    -

    +

    Guides -

    Requesting Pre Auth

    Centrapay’s Pre Auth extension allows a patron to authorize payment up to a limit when the actual payment amount is not yet known.

    +

    Requesting Pre Auth

    Centrapay’s Pre Auth extension allows a patron to authorize payment up to a limit when the actual payment amount is not yet known.

    Restrictions

    Pre Auth payments are not supported in all cases.

      -
    1. Not all asset types support Pre Auth - Payment options for Asset Types  API  that do not support Pre Auth will be excluded when a Payment Request  API  is created with the preAuth flag.
    2. +
    3. Not all asset types support Pre Auth - Payment options for Asset Types  API  that do not support Pre Auth will be excluded when a Payment Request  API  is created with the preAuth flag.
    4. Pre Auth is incompatible with Multi-Asset payments - Only one asset type can be authorized for a Pre Auth.

    Pre Auth Flow

    @@ -64,7 +64,7 @@
  • The POS releases any remaining funds that have not been confirmed back to the Patron.
  • Authorize

    -

    An authorization is created when the Payment Request is created  API  with the preAuth flag while Requesting Payment.

    +

    An authorization is created when the Payment Request is created  API  with the preAuth flag while Requesting Payment.

    Once the authorization is successful, the Payment Request preAuthStatus is set to authorized.

    Confirm

    -

    Merchants can draw down on authorized funds by making one or more confirmations  API  against an authorized amount. Confirmations must be made with an idempotencyKey in order to prevent merchants from drawing down on authorized funds twice.

    +

    Merchants can draw down on authorized funds by making one or more confirmations  API  against an authorized amount. Confirmations must be made with an idempotencyKey in order to prevent merchants from drawing down on authorized funds twice.

    Confirmations against authorized funds have limits:

    • @@ -123,7 +123,7 @@

    Release

    -

    Authorized funds that have not been confirmed can optionally be released  API  so that the asset holder is granted access to their remaining funds without needing to wait for the authorization to expire.

    +

    Authorized funds that have not been confirmed can optionally be released  API  so that the asset holder is granted access to their remaining funds without needing to wait for the authorization to expire.

    Once releasing any remaining authorized funds is successful, the Payment Request preAuthStatus is set to released.

    Releasing is only allowed against authorizations that have had zero or more confirmations made against them.

    @@ -148,7 +148,7 @@

    Refunds can be made against authorizations, confirmations, released authorizations and expired authorizations.

    Refunds made against confirmations must include the confirmationIdempotencyKey field that is the same as the idempotencyKey used for original confirmation.

    Void

    -

    Voiding a Payment Request  API  will cancel a Payment Request and trigger any refunds necessary. This operation is useful if the POS needs to back out of a transaction due to a network error for example. Voiding can only be used up to 24 hours after the Payment Request was created.

    +

    Voiding a Payment Request  API  will cancel a Payment Request and trigger any refunds necessary. This operation is useful if the POS needs to back out of a transaction due to a network error for example. Voiding can only be used up to 24 hours after the Payment Request was created.

    Voiding is only allowed against Payment Requests awaiting authorization and Payment Requests that have been successfully authorized.

    \ No newline at end of file diff --git a/guides/third-party-application-payments/index.html b/guides/third-party-application-payments/index.html index 9e0c1cfa6..b26a4c31e 100644 --- a/guides/third-party-application-payments/index.html +++ b/guides/third-party-application-payments/index.html @@ -17,9 +17,9 @@ -

    +

    Guides -

    Paying a Payment Request

    Overview

    +

    Paying a Payment Request

    Overview

    This guide is for a Third-party Asset Provider to enable paying with their digital assets with Centrapay.

    Authenticating API calls on behalf of users

    @@ -71,11 +71,11 @@
  • User scans the QR code with their app.
  • App sends the Payment Request id from the QR code to the server requesting the details of the payment.
  • -
  • The server gets the Payment Request  API  +
  • The server gets the Payment Request  API  from Centrapay.
  • The user views the payment details on their app and approves the payment.
  • The app requests the server pay the Payment Request
  • -
  • The server Pays the Payment Request  API  +
  • The server Pays the Payment Request  API  with the users asset
  • The app displays a successfully paid screen to the user
  • The terminal gets the Payment Request and displays successfully paid
  • @@ -87,8 +87,8 @@ the url by asserting it matches the above format and ignore any malformed QR codes.

    Get the Payment Request

    Once the app has validated the url, use the id of the Payment Request to -call the Get Payment Request  API  -API from your server. The returned PaymentRequest model  API  +call the Get Payment Request  API  +API from your server. The returned PaymentRequest model  API  will provide the details needed to determine if the Payment Request can be completed.

    @@ -134,7 +134,7 @@
    FieldDescription
    merchantNameThe name of the merchant the user is paying
    valueThe currency and amount the merchant is requesting, which may need to be converted to the denomination of the asset used for payment

    Once a user has seen the relevant information and confirmed payment you should invoke the -Pay Payment Request API  API  +Pay Payment Request API  API  from the server on behalf of the user with the following fields:

    @@ -153,7 +153,7 @@ -
    FieldDescription
    assetTypeThe Asset Type defined when you registered your third party asset
    authorizationAn identifier for your Asset Type which will be used when invoking the Pay Payment Request API
    +
    FieldDescription
    assetTypeThe Asset Type defined when you registered your third party asset
    authorizationAn identifier for your Asset Type which will be used when invoking the Pay Payment Request API

    If the payment was successful then the status of the Payment Request will be paid and you can show confirmation of payment to the user.

    Payment Extensions

    diff --git a/guides/transaction-reporting/index.html b/guides/transaction-reporting/index.html index a91cd60de..35769b9fa 100644 --- a/guides/transaction-reporting/index.html +++ b/guides/transaction-reporting/index.html @@ -17,10 +17,10 @@ -

    +

    Guides -

    Transaction Reporting

    Centrapay allows merchants to give their patrons choice over which digital assets to use for payment.

    -

    The settlement process to the merchant will differ depending on which Asset Types  API  have been selected for payment by the patron.

    +

    Transaction Reporting

    Centrapay allows merchants to give their patrons choice over which digital assets to use for payment.

    +

    The settlement process to the merchant will differ depending on which Asset Types  API  have been selected for payment by the patron.

    The Asset Types used for payment should be communicated to the user in any transaction reporting function on the merchant side.

    Transaction reporting capabilities offered to the merchant that indicate Centrapay was used for payment MUST qualify the asset type used.

    diff --git a/index-data.json b/index-data.json index 8e1b00346..55808fa0b 100644 --- a/index-data.json +++ b/index-data.json @@ -1 +1 @@ -{"0":{"href":"/api/account-memberships","path":["API","Account Memberships"],"title":"Account Memberships","description":"Account Memberships model and related endpoints"},"1":{"path":["API","Account Memberships"],"title":"Account Membership Model","description":"A Member contains extended information about a user's access to an account.","href":"/api/account-memberships#account-membership-model"},"2":{"path":["API","Account Memberships"],"title":"Attributes","description":"","description":"This endpoint allows you to add or update the membership of a user to an account.","href":"/api/account-memberships#add-member-"},"4":{"path":["API","Account Memberships"],"title":"Attributes","description":"","description":"When you send another centrapay user cash or assets, they're automatically assigned to them.\nHowever, if they're not signed up yet then these assets are not immediately assigned.","href":"/api/asset-transfers#resolve-claimable-assets-"},"47":{"path":["API","Asset Transfers"],"title":"Attributes","description":"No Attributes.","href":"/api/asset-transfers#attributes"},"48":{"path":["API","Asset Transfers"],"title":"List Asset Transfers ","description":"Returns a paginated list of Asset Transfers.","href":"/api/asset-transfers#list-asset-transfers-"},"49":{"path":["API","Asset Transfers"],"title":"Attributes","description":"","href":"/api/asset-transfers#attributes"},"50":{"href":"/api/asset-types","path":["API","Asset Types"],"title":"Asset Types","description":"Asset types supported for payment"},"51":{"path":["API","Asset Types"],"title":"Flags","description":"","href":"/api/asset-types#flags"},"52":{"href":"/api/assets","path":["API","Assets"],"title":"Assets","description":"Asset models and related endpoints"},"53":{"path":["API","Assets"],"title":"Asset Model","description":"All assets have the following fields along with the additional fields that are\nspecific to its category. Assets which don't have a category are considered \nand the model may change.","href":"/api/assets#asset-model"},"54":{"path":["API","Assets"],"title":"Attributes","description":"Money assets, being backed by real currency, are the most flexible asset types.\nMoney is accepted for most payment requests, can be sent in arbitrary amounts\nand does not expire.","href":"/api/assets#attributes"},"55":{"path":["API","Assets"],"title":"Money Model","description":"Money assets, being backed by real currency, are the most flexible asset types.\nMoney is accepted for most payment requests, can be sent in arbitrary amounts\nand does not expire.","href":"/api/assets#money-model"},"56":{"path":["API","Assets"],"title":"Attributes","description":"Gift cards are similar to money but have greater spending restrictions and are\nnot always backed by real currency. Gift cards usually have an expiry date, are\ntypically tied to a small number of merchants, and can only be sent in their\nentirety.","href":"/api/assets#attributes"},"57":{"path":["API","Assets"],"title":"Gift Card Model","description":"Gift cards are similar to money but have greater spending restrictions and are\nnot always backed by real currency. Gift cards usually have an expiry date, are\ntypically tied to a small number of merchants, and can only be sent in their\nentirety.","href":"/api/assets#gift-card-model"},"58":{"path":["API","Assets"],"title":"Attributes","description":"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.","href":"/api/assets#attributes"},"59":{"path":["API","Assets"],"title":"Token Model ","description":"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.","href":"/api/assets#token-model-"},"60":{"path":["API","Assets"],"title":"Attributes","description":"The destParty and srcParty are optionally provided only on transactions of\ntype transfer. Values may include a merchant name, user handle, masked user\nemail, masked user phone, or bank account.","href":"/api/assets#attributes"},"61":{"path":["API","Assets"],"title":"Asset Transaction Model","description":"The destParty and srcParty are optionally provided only on transactions of\ntype transfer. Values may include a merchant name, user handle, masked user\nemail, masked user phone, or bank account.","href":"/api/assets#asset-transaction-model"},"62":{"path":["API","Assets"],"title":"Attributes","description":"","description":"Returns a paginated list of Asset Transactions. This endpoint is currently only supported for quartz asset types.","href":"/api/assets#list-asset-transactions-"},"70":{"path":["API","Assets"],"title":"Attributes","description":"No Attributes.","href":"/api/assets#attributes"},"71":{"path":["API","Assets"],"title":"Archive Asset","description":"Archive supported asset types by asset id. Currently only gift cards may be archived.","href":"/api/assets#archive-asset"},"72":{"path":["API","Assets"],"title":"Attributes","description":"No Attributes.","href":"/api/assets#attributes"},"73":{"path":["API","Assets"],"title":"Errors","description":"","href":"/api/assets#errors"},"74":{"href":"/api/auth","path":["API","Auth"],"title":"Auth","description":"Introduction to Authentication"},"75":{"path":["API","Auth"],"title":"Authenticating API Calls","description":"API calls can be authenticated by either providing an API key in the\n\"X-Api-Key\" header or by providing a user access token in the \"Authorization\"\nheader.","href":"/api/auth#authenticating-api-calls"},"76":{"path":["API","Auth"],"title":"API Keys","description":"API Keys provide enduring access to a single Centrapay account.","href":"/api/auth#api-keys"},"77":{"path":["API","Auth"],"title":"User Access Tokens","description":"User access tokens provide time-limited access to all Centrapay accounts for\nwhich the user is a member. Access tokens are issued using OIDC code flow via\nthe Centrapay OAuth authorization server and login page at auth.centrapay.com.","href":"/api/auth#user-access-tokens"},"78":{"path":["API","Auth"],"title":"Claims","description":"The following table lists the claims which may be be included in a user id token.\nAt minimum, the \"sub\" claim and one of \"phone_number\" or \"email\" will be present.","href":"/api/auth#claims"},"79":{"path":["API","Auth"],"title":"Roles and Permissions","description":"Users and API keys are assigned a role for their associated Centrapay\naccount(s). The permissions granted to the roles are shown in the table below.","href":"/api/auth#roles-and-permissions"},"80":{"path":["API","Auth"],"title":"Account Flags","description":"Some permissions require an additional flag associated to their individual account or the\ntargeted account that owns the resource (they may be the same account). For each permission,\nif there is a flag associated to it then at least one of them must be met.","href":"/api/auth#account-flags"},"81":{"path":["API","Auth"],"title":"Permissions","description":"| Permission | Account Owner | Anon Consumer | Merchant Terminal | External Asset Provider | Cashier |\n| ---------------------------------- | ------------- | ------------- | ----------------- | ----------------------- | ------- |\n| accounts:create | ✅ | | | | |\n| accounts:read | ✅ | | | ✅ | ✅ |\n| accounts:updat | ✅ | | | | |\n| api-keys:create | ✅ | | | | |\n| api-keys:list | ✅ | | | | |\n| api-keys:update | ✅ | | | | |\n| asset-transfers:claim | ✅ | | | ✅ | |\n| asset-transfers:create 👤 🧀 | ✅ | | | ✅ | |\n| asset-transfers:read | ✅ | | | ✅ | |\n| assets:read | ✅ | | | ✅ | |\n| assets:spend 👤 | ✅ | | | | |\n| bank-account-approvals:create | ✅ | | | | |\n| bank-account-requests:authorize | ✅ | | | | |\n| bank-account-requests:create | ✅ | | | | |\n| bank-accounts:create | ✅ | | | | |\n| bank-accounts:read | ✅ | | | | |\n| business:create | ✅ | | | | |\n| business:update | ✅ | | | | |\n| business:read | ✅ | | | | |\n| collections:create 🪙 | ✅ | | | | |\n| collections:read 🪙 | ✅ | | | | |\n| external-assets:create 👤 🧀 | ✅ | | | ✅ | |\n| external-assets:update | ✅ | | | ✅ | |\n| integration-requests:configure | | | | | |\n| integration-requests:create 🗄 | ✅ | | | | |\n| integration-requests:read 🗄 | ✅ | | | | |\n| invitations:accept | ✅ ✸ | | | | |\n| invitations:read | ✅ ✸ | | | | |\n| media-uploads:create | ✅ | | | | |\n| memberships:delete 🗄 | ✅ | | | | |\n| memberships:update | ✅ | | | | |\n| merchants:create 🗄 | ✅ | | | | |\n| merchants:list 🗄 | ✅ | | | | ✅ |\n| merchants:read 🗄 | ✅ | | | | ✅ |\n| merchants:update 🗄 | ✅ | | | | |\n| patron-codes:create | ✅ | | | | |\n| patron-codes:read | ✅ | | ✅ | | ✅ |\n| payment-activities:read | ✅ | | ✅ | | ✅ |\n| payment-conditions:approve | ✅ | | ✅ | | ✅ |\n| payment-requests:cancel 🗄 | ✅ | | ✅ | | ✅ |\n| payment-requests:create 🗄 | ✅ | | ✅ ✸ | | ✅ |\n| payment-requests:pay 🗄 | ✅ ✸ | ✅ ✸ | ✅ | | ✅ ✸ |\n| payment-requests:read | ✅ ✸ | ✅ ✸ | ✅ ✸ | | ✅ ✸ |\n| payment-requests:read-by-shortcode | ✅ | | ✅ | | ✅ |\n| payment-requests:refund 🗄 | ✅ | | ✅ | | ✅ |\n| payment-requests:void 🗄 | ✅ | | ✅ | | ✅ |\n| payment-requests:release 🗄 | ✅ | | ✅ | | ✅ |\n| payment-requests:confirm 🗄 | ✅ | | ✅ | | ✅ |\n| quotas:read | ✅ | | | | |\n| quotas:read | ✅ | | | | |\n| redemption-conditions:create 🪙 | ✅ | | | | |\n| scanned-code:decode | ✅ | | ✅ | | ✅ |\n| tokens:create 🪙 | ✅ | | | | |\n| topups:create 👤 | ✅ | | | | |\n| topups:read | ✅ | | | | |\n| wallets:create | ✅ | | | | |\n| wallets:deposit | ✅ | | | | |\n| wallets:read | ✅ | | | | |\n| wallets:transfer 👤 | ✅ | | | | |\n| wallets:withdraw | ✅ | | | | |","href":"/api/auth#permissions"},"82":{"href":"/api/bank-account-approvals","path":["API","Bank Account Approvals"],"title":"Bank Account Approvals","description":"Bank Account Approval model and related endpoints"},"83":{"path":["API","Bank Account Approvals"],"title":"Bank Account Approval Model","description":"| Name | description |\n| :-------------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |\n| 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. |\n| account-consent | An approved Bank Account Approval of type account-consent provides an access token to read account details from a third-party. |\n| payment-consent | An approved Bank Account Approval of type payment-consent provides an access token for creating payments with a third-party. |","href":"/api/bank-account-approvals#bank-account-approval-model"},"84":{"path":["API","Bank Account Approvals"],"title":"Attributes","description":"| Name | description |\n| :-------------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |\n| 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. |\n| account-consent | An approved Bank Account Approval of type account-consent provides an access token to read account details from a third-party. |\n| payment-consent | An approved Bank Account Approval of type payment-consent provides an access token for creating payments with a third-party. |","href":"/api/bank-account-approvals#attributes"},"85":{"path":["API","Bank Account Approvals"],"title":"Bank Account Approval Types","description":"| Name | description |\n| :-------------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |\n| 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. |\n| account-consent | An approved Bank Account Approval of type account-consent provides an access token to read account details from a third-party. |\n| payment-consent | An approved Bank Account Approval of type payment-consent provides an access token for creating payments with a third-party. |","href":"/api/bank-account-approvals#bank-account-approval-types"},"86":{"path":["API","Bank Account Approvals"],"title":"Bank Account Approval Activity Model","description":"","description":"This endpoint allows you to request a Bank Account Approval.","href":"/api/bank-account-approvals#request-bank-account-approval-"},"89":{"path":["API","Bank Account Approvals"],"title":"Attributes","description":"","description":"This endpoint allows you to retrieve a Bank Account Approval.","href":"/api/bank-account-approvals#get-bank-account-approval-"},"92":{"path":["API","Bank Account Approvals"],"title":"Attributes","description":"No attributes.","href":"/api/bank-account-approvals#attributes"},"93":{"path":["API","Bank Account Approvals"],"title":"Accept Bank Account Approval ","description":"This endpoint allows you to accept a Bank Account Approval.","href":"/api/bank-account-approvals#accept-bank-account-approval-"},"94":{"path":["API","Bank Account Approvals"],"title":"Attributes","description":"","description":"This endpoint allows you to decline a Bank Account Approval.","href":"/api/bank-account-approvals#decline-bank-account-approval-"},"97":{"path":["API","Bank Account Approvals"],"title":"Attributes","description":"","description":"This endpoint allows you to list the Bank Account Approvals for a Bank Account.","href":"/api/bank-account-approvals#list-bank-account-approvals-"},"100":{"path":["API","Bank Account Approvals"],"title":"Attributes","description":"No attributes.","href":"/api/bank-account-approvals#attributes"},"101":{"href":"/api/bank-account-connection-intents","path":["API","Bank Account Connection Intents"],"title":"Bank Account Connection Intents","description":"Bank Account Connection Intent model and related endpoints"},"102":{"path":["API","Bank Account Connection Intents"],"title":"Bank Account Connection Intent Model","description":"| Name | description |\n| :-------------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |\n| 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. |\n| quartz-payment | Initiates an authorization flow for authorizing access to create payments. |","href":"/api/bank-account-connection-intents#bank-account-connection-intent-model"},"103":{"path":["API","Bank Account Connection Intents"],"title":"Bank Account Connection Intent Types","description":"| Name | description |\n| :-------------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |\n| 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. |\n| quartz-payment | Initiates an authorization flow for authorizing access to create payments. |","href":"/api/bank-account-connection-intents#bank-account-connection-intent-types"},"104":{"path":["API","Bank Account Connection Intents"],"title":"Create Bank Account Connection Intent ","description":"This endpoint allows you to create a Bank Account Connection Intent.","href":"/api/bank-account-connection-intents#create-bank-account-connection-intent-"},"105":{"path":["API","Bank Account Connection Intents"],"title":"Attributes","description":"","description":"This endpoint allows you to authorize a Bank Account Connection Intent.","href":"/api/bank-account-connection-intents#authorize-bank-account-connection-intent-"},"108":{"path":["API","Bank Account Connection Intents"],"title":"Attributes","description":"","href":"/api/bank-account-connection-intents#attributes"},"109":{"href":"/api/bank-accounts","path":["API","Bank Accounts"],"title":"Bank Accounts","description":"Bank Account model and related endpoints"},"110":{"path":["API","Bank Accounts"],"title":"Bank Account Model","description":"Types of bank accounts to allow access to different Asset Types.","href":"/api/bank-accounts#bank-account-model"},"111":{"path":["API","Bank Accounts"],"title":"Attributes","description":"Types of bank accounts to allow access to different Asset Types.","href":"/api/bank-accounts#attributes"},"112":{"path":["API","Bank Accounts"],"title":"Bank Account Type ","description":"Types of bank accounts to allow access to different Asset Types.","href":"/api/bank-accounts#bank-account-type-"},"113":{"path":["API","Bank Accounts"],"title":"Bank Account Approval Type Summary Model ","description":"A summary of the Bank Account Approvals for a Bank Account.\nThere is one object per type of Bank Account Approval, which provides a summary of the approval status.","href":"/api/bank-accounts#bank-account-approval-type-summary-model-"},"114":{"path":["API","Bank Accounts"],"title":"Attributes","description":"The Bank Account balance, retrieved using Open Banking flows. The supported Bank Account type is quartz.","href":"/api/bank-accounts#attributes"},"115":{"path":["API","Bank Accounts"],"title":"Bank Account Balance Model ","description":"The Bank Account balance, retrieved using Open Banking flows. The supported Bank Account type is quartz.","href":"/api/bank-accounts#bank-account-balance-model-"},"116":{"path":["API","Bank Accounts"],"title":"Attributes","description":"","description":"This endpoint allows you to retrieve the balance of a Bank Account.","href":"/api/bank-accounts#get-bank-account-balance-"},"126":{"path":["API","Bank Accounts"],"title":"Attributes","description":"No attributes.","href":"/api/bank-accounts#attributes"},"127":{"path":["API","Bank Accounts"],"title":"Errors","description":"","description":"If you're creating new interfaces, please work with Verify Bank Account.","href":"/api/bank-accounts#verify-bank-authority-"},"132":{"path":["API","Bank Accounts"],"title":"Attributes","description":"","description":"If you're creating new interfaces, please work with List Bank Accounts.","href":"/api/bank-accounts#list-bank-authorities-"},"137":{"path":["API","Bank Accounts"],"title":"Attributes","description":"No attributes.","href":"/api/bank-accounts#attributes"},"138":{"path":["API","Bank Accounts"],"title":"Create Bank Authority ","description":"If you're creating new interfaces, please work with Create Bank Account.","href":"/api/bank-accounts#create-bank-authority-"},"139":{"path":["API","Bank Accounts"],"title":"Attributes","description":"","description":"If you're creating new interfaces, please work with Get Bank Account.","href":"/api/bank-accounts#get-bank-authority-"},"142":{"path":["API","Bank Accounts"],"title":"Attributes","description":"No attributes.","href":"/api/bank-accounts#attributes"},"143":{"path":["API","Bank Accounts"],"title":"Errors","description":"","href":"/api/bank-accounts#errors"},"144":{"href":"/api/batch-types/farmlands-external-asset","path":["Exclude","Farmlands External Asset Batch"],"title":"Farmlands External Asset Batch","description":"Farmlands External Asset Batch Models"},"145":{"path":["Exclude","Farmlands External Asset Batch"],"title":"Account Model","description":"Exported Farmlands Account used for importing and updating of a Centrapay Asset.","href":"/api/batch-types/farmlands-external-asset#account-model"},"146":{"path":["Exclude","Farmlands External Asset Batch"],"title":"Attributes","description":"Exported Farmlands Contact and Card information used for authentication, correspondence and payment.","href":"/api/batch-types/farmlands-external-asset#attributes"},"147":{"path":["Exclude","Farmlands External Asset Batch"],"title":"Contact Model","description":"Exported Farmlands Contact and Card information used for authentication, correspondence and payment.","href":"/api/batch-types/farmlands-external-asset#contact-model"},"148":{"path":["Exclude","Farmlands External Asset Batch"],"title":"Attributes","description":"Exported Farmlands Credit Card information used for importing and updating of a Patron Code.","href":"/api/batch-types/farmlands-external-asset#attributes"},"149":{"path":["Exclude","Farmlands External Asset Batch"],"title":"Card Model","description":"Exported Farmlands Credit Card information used for importing and updating of a Patron Code.","href":"/api/batch-types/farmlands-external-asset#card-model"},"150":{"path":["Exclude","Farmlands External Asset Batch"],"title":"Attributes","description":"A complete batch example with all batch types included. For more legible examples please refer to Example Models.","href":"/api/batch-types/farmlands-external-asset#attributes"},"151":{"path":["Exclude","Farmlands External Asset Batch"],"title":"Example JSONL File","description":"A complete batch example with all batch types included. For more legible examples please refer to Example Models.","href":"/api/batch-types/farmlands-external-asset#example-jsonl-file"},"152":{"path":["Exclude","Farmlands External Asset Batch"],"title":"Example Models","description":"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.","href":"/api/batch-types/farmlands-external-asset#example-models"},"153":{"href":"/api/batch-types/verifone-terminal-status","path":["Exclude","Verifone Terminal Status Batch"],"title":"Verifone Terminal Status Batch","description":"Verifone Terminal Status Batch Models"},"154":{"path":["Exclude","Verifone Terminal Status Batch"],"title":"Terminal Status","description":"A complete batch example with all batch types included. For more legible examples please refer to Example Models.","href":"/api/batch-types/verifone-terminal-status#terminal-status"},"155":{"path":["Exclude","Verifone Terminal Status Batch"],"title":"Attributes","description":"A complete batch example with all batch types included. For more legible examples please refer to Example Models.","href":"/api/batch-types/verifone-terminal-status#attributes"},"156":{"path":["Exclude","Verifone Terminal Status Batch"],"title":"Example JSONL File","description":"A complete batch example with all batch types included. For more legible examples please refer to Example Models.","href":"/api/batch-types/verifone-terminal-status#example-jsonl-file"},"157":{"path":["Exclude","Verifone Terminal Status Batch"],"title":"Pretty Printed Example","description":"","href":"/api/batch-types/verifone-terminal-status#pretty-printed-example"},"158":{"href":"/api/batches","path":["API","Batches"],"title":"Batches","description":"Batch model and related endpoints"},"159":{"path":["API","Batches"],"title":"Batch Model","description":"Different stages of a Batch's lifecycle.","href":"/api/batches#batch-model"},"160":{"path":["API","Batches"],"title":"Attributes","description":"Different stages of a Batch's lifecycle.","href":"/api/batches#attributes"},"161":{"path":["API","Batches"],"title":"Batch Lifecycle","description":"Different stages of a Batch's lifecycle.","href":"/api/batches#batch-lifecycle"},"162":{"path":["API","Batches"],"title":"Batch Types","description":"The following table describes the Batch Types supported for loading.","href":"/api/batches#batch-types"},"163":{"path":["API","Batches"],"title":"Error","description":"| Field | Type | Description |\n| :--------- | :-------- | :----------------------------------------------------------- |\n| message | String | A description of what caused the Error. |\n| externalId | String | Field used in debugging in reference to an id from the file. |\n| index | BigNumber | Item offset where the Error was identified in the file. |","href":"/api/batches#error"},"164":{"path":["API","Batches"],"title":"Create Batch","description":"Initialize loading of entities from a batch file.","href":"/api/batches#create-batch"},"165":{"path":["API","Batches"],"title":"Attributes","description":"","description":"This endpoint allows you to create a new Business. If accountId is not provided when creating a Business, then a new org account will be created and associated to the Business.","href":"/api/businesses#create-business-"},"177":{"path":["API","Businesses"],"title":"Attributes","description":"","description":"This endpoint allows you to update a Business.","href":"/api/businesses#update-business-"},"180":{"path":["API","Businesses"],"title":"Attributes","description":"","description":"This endpoint allows you to retrieve a Business by account id.","href":"/api/businesses#get-business-by-account-id-"},"183":{"path":["API","Businesses"],"title":"Attributes","description":"No attributes.","href":"/api/businesses#attributes"},"184":{"path":["API","Businesses"],"title":"Search NZ Company Register ","description":"This endpoint 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.","href":"/api/businesses#search-nz-company-register-"},"185":{"path":["API","Businesses"],"title":"Attributes","description":"No attributes.","href":"/api/businesses#attributes"},"186":{"path":["API","Businesses"],"title":"Get Business Details from NZ Company Register ","description":"This endpoint allows you to retrieve a Business by account id.","href":"/api/businesses#get-business-details-from-nz-company-register-"},"187":{"path":["API","Businesses"],"title":"Attributes","description":"No attributes.","href":"/api/businesses#attributes"},"188":{"path":["API","Businesses"],"title":"Set Business Onboarding Status","description":"This endpoint returns allows you to set the onboarding status of a Business.","href":"/api/businesses#set-business-onboarding-status"},"189":{"path":["API","Businesses"],"title":"Attributes","description":"","href":"/api/businesses#attributes"},"190":{"href":"/api/data-types","path":["API","Data Types"],"title":"Data Types","description":"Introduction to Data Types"},"191":{"path":["API","Data Types"],"title":"Timestamp","description":"A point in time, usually with millisecond precision, represented as an\nISO 8601 date string (eg \"2021-06-11T02:51:11.000Z\"). Timestamps\nare in the UTC timezone as denoted by the \"Z\" suffix.","href":"/api/data-types#timestamp"},"192":{"path":["API","Data Types"],"title":"BigNumber","description":"A number, represented as a String, which can have arbitrary size or precision.\nMost Centrapay APIs that deal with transactable value (ie. assets, payments,\netc) represent the value as BigNumbers. Depending on the context, a BigNumber\nmay be used to represent an integer or a decimal amount.","href":"/api/data-types#bignumber"},"193":{"path":["API","Data Types"],"title":"Monetary","description":"A monetary amount in a currency, represented as an Object. The amount is\nusually an integer in the smallest denomination for the currency (ie cents) but\nmay be a decimal value for some currencies (eg Bitcoin). The currency is\ntypically represented as an ISO 4217 code.","href":"/api/data-types#monetary"},"194":{"path":["API","Data Types"],"title":"Fields","description":"| Name | Type | Description |\n| -------- | ----------------------- | ---------------------------------------------------------- |\n| amount | BigNumber | Value in the currency's smallest denomination (eg. cents). |\n| currency | String | Currency code (eg. \"NZD\"). |","href":"/api/data-types#fields"},"195":{"path":["API","Data Types"],"title":"CRN","description":"A Centrapay Resource Name (CRN) is a colon-delimited String that uniquely\nidentifies any Centrapay resource.","href":"/api/data-types#crn"},"196":{"path":["API","Data Types"],"title":"Location","description":"A location's represented as an Object with properties to denote the location both absolute and\nby locality.","href":"/api/data-types#location"},"197":{"path":["API","Data Types"],"title":"Required Fields","description":"| Name | Type | Description |\n| ------- | ------ | -------------------------------------------------------------------------------------- |\n| street | String | Unit, number, and name of street address. |\n| city | String | City of location. |\n| country | String | ISO 3166 Country code. (eg. \"NZ\"). |","href":"/api/data-types#required-fields"},"198":{"path":["API","Data Types"],"title":"Optional Fields","description":"| Name | Type | Description |\n| -------- | ------ | ------------------------------------------------------------------------------------------------------------- |\n| lat | Number | Absolute latitude coordinate. If you don't provide this, we will automatically infer this from your address. |\n| lng | Number | Absolute longitude coordinate. If you don't provide this, we will automatically infer this from your address. |\n| suburb | String | Suburb of location. |\n| postCode | String | Post or Zip code of location. |\n| state | String | The state or region of the location (eg. \"Auckland\"). |","href":"/api/data-types#optional-fields"},"199":{"path":["API","Data Types"],"title":"PhoneNumber","description":"A phone number, represented in E.123 international notation (eg \"+6421537663\"). We usually use this for receiving text messages.","href":"/api/data-types#phonenumber"},"200":{"href":"/api/external-assets","path":["API","External Assets"],"title":"External Assets","description":"External Assets endpoint documentation"},"201":{"path":["API","External Assets"],"title":"Load an External Asset","description":"Load an asset from a supported third-party issuer. Asset details will be obtained from the issuer.","href":"/api/external-assets#load-an-external-asset"},"202":{"path":["API","External Assets"],"title":"Attributes","description":"","href":"/api/external-assets#attributes"},"203":{"path":["API","External Assets"],"title":"Errors","description":"","href":"/api/external-assets#errors"},"204":{"href":"/api/funds-transfers","path":["API","Funds Transfers"],"title":"Funds Transfers","description":"Endpoints for managing Funds Transfers"},"205":{"path":["API","Funds Transfers"],"title":"Create a Top Up","description":"This endpoint allows you to create a topup.","href":"/api/funds-transfers#create-a-top-up"},"206":{"path":["API","Funds Transfers"],"title":"Attributes","description":"","description":"This endpoint allows you to list the Top Ups for an account.","href":"/api/funds-transfers#list-top-ups-for-an-account-"},"213":{"path":["API","Funds Transfers"],"title":"Attributes","description":"No attributes.","href":"/api/funds-transfers#attributes"},"214":{"path":["API","Funds Transfers"],"title":"Create Withdrawal ","description":"This endpoint allows you to create a withdrawal.","href":"/api/funds-transfers#create-withdrawal-"},"215":{"path":["API","Funds Transfers"],"title":"Attributes","description":"","description":"This endpoint allows you to retrieve a Withdrawal by id.","href":"/api/funds-transfers#get-withdrawal-"},"218":{"path":["API","Funds Transfers"],"title":"Attributes","description":"No attributes.","href":"/api/funds-transfers#attributes"},"219":{"path":["API","Funds Transfers"],"title":"Errors","description":"","description":"This endpoint allows you to list the withdrawals for an Account.","href":"/api/funds-transfers#list-withdrawals-for-an-account-"},"221":{"path":["API","Funds Transfers"],"title":"Attributes","description":"No attributes.","href":"/api/funds-transfers#attributes"},"222":{"path":["API","Funds Transfers"],"title":"Abort Funds Transfer","description":"This endpoint allows you to abort a Funds Transfer.","href":"/api/funds-transfers#abort-funds-transfer"},"223":{"path":["API","Funds Transfers"],"title":"Attributes","description":"No attributes.","href":"/api/funds-transfers#attributes"},"224":{"path":["API","Funds Transfers"],"title":"Errors","description":"","href":"/api/funds-transfers#errors"},"225":{"href":"/api/http-status-codes","path":["API","HTTP Status Codes"],"title":"HTTP Status Codes","description":"Introduction to HTTP Status Codes"},"226":{"path":["API","HTTP Status Codes"],"title":"200 Ok","description":"Everything's ok. Enjoy your well formed response!","href":"/api/http-status-codes#200-ok"},"227":{"path":["API","HTTP Status Codes"],"title":"400 Malformed Request","description":"This is a syntax failure. When you get these back, your application needs to change the way it\nbehaves in order to get back the resource that you're after.","href":"/api/http-status-codes#400-malformed-request"},"228":{"path":["API","HTTP Status Codes"],"title":"Debugging","description":"API key or JWT is missing, expired or invalid. Go look at our Auth documentation.","href":"/api/http-status-codes#debugging"},"229":{"path":["API","HTTP Status Codes"],"title":"401 Unauthorized","description":"API key or JWT is missing, expired or invalid. Go look at our Auth documentation.","href":"/api/http-status-codes#401-unauthorized"},"230":{"path":["API","HTTP Status Codes"],"title":"403 Forbidden","description":"A 403 status indicates resource missing, permission denied or\nbusiness rule violation.","href":"/api/http-status-codes#403-forbidden"},"231":{"path":["API","HTTP Status Codes"],"title":"Resource missing or permission denied","description":"When the resource exists and access is authorized but some other business rule\nis violated then a 403 is returned. Additional information will be included in\nthe \"message\" field of the response body. The possible values for the \"message\"\nfield will be documented on each endpoint.","href":"/api/http-status-codes#resource-missing-or-permission-denied"},"232":{"path":["API","HTTP Status Codes"],"title":"Business rule violated","description":"When the resource exists and access is authorized but some other business rule\nis violated then a 403 is returned. Additional information will be included in\nthe \"message\" field of the response body. The possible values for the \"message\"\nfield will be documented on each endpoint.","href":"/api/http-status-codes#business-rule-violated"},"233":{"path":["API","HTTP Status Codes"],"title":"404 Route Not Found","description":"Variant on a 400, there's a bug in your code that means you've got a typo in\nthe URL or HTTP method. Please check against examples in our documentation.","href":"/api/http-status-codes#404-route-not-found"},"234":{"path":["API","HTTP Status Codes"],"title":"429 Too Many Requests","description":"Centrapay API rate limits have been exceeded.","href":"/api/http-status-codes#429-too-many-requests"},"235":{"path":["API","HTTP Status Codes"],"title":"Debugging","description":"If you get a 500 level error, something has gone wrong on our end. Retrying\nshould solve the issue. Usually a Centrapay Engineer will investigate but\nbug reports are also welcome at integrations@centrapay.com.","href":"/api/http-status-codes#debugging"},"236":{"path":["API","HTTP Status Codes"],"title":"5xx Server Error","description":"If you get a 500 level error, something has gone wrong on our end. Retrying\nshould solve the issue. Usually a Centrapay Engineer will investigate but\nbug reports are also welcome at integrations@centrapay.com.","href":"/api/http-status-codes#5xx-server-error"},"237":{"href":"/api/integration-requests","path":["API","Integration Requests"],"title":"Integration Requests","description":"Integration Request models and related endpoints"},"238":{"path":["API","Integration Requests"],"title":"Integration Request Model","description":"| Name | Description |\n| -------- | ---------------------------------------------------------- |\n| epay | Asset provider ePay |\n| invenco | Terminal vendor invenco |\n| skyzer | Terminal vendor skyzer |\n| smartpay | Terminal vendor smartpay |\n| verifone | Terminal vendor Verifone |\n| vista | Terminal vendor vista |\n| windcave | Terminal vendor Windcave |","href":"/api/integration-requests#integration-request-model"},"239":{"path":["API","Integration Requests"],"title":"Attributes","description":"| Name | Description |\n| -------- | ---------------------------------------------------------- |\n| epay | Asset provider ePay |\n| invenco | Terminal vendor invenco |\n| skyzer | Terminal vendor skyzer |\n| smartpay | Terminal vendor smartpay |\n| verifone | Terminal vendor Verifone |\n| vista | Terminal vendor vista |\n| windcave | Terminal vendor Windcave |","href":"/api/integration-requests#attributes"},"240":{"path":["API","Integration Requests"],"title":"Terminal","description":"| Name | Description |\n| -------- | ---------------------------------------------------------- |\n| epay | Asset provider ePay |\n| invenco | Terminal vendor invenco |\n| skyzer | Terminal vendor skyzer |\n| smartpay | Terminal vendor smartpay |\n| verifone | Terminal vendor Verifone |\n| vista | Terminal vendor vista |\n| windcave | Terminal vendor Windcave |","href":"/api/integration-requests#terminal"},"241":{"path":["API","Integration Requests"],"title":"Product","description":"| Name | Description |\n| -------- | ---------------------------------------------------------- |\n| epay | Asset provider ePay |\n| invenco | Terminal vendor invenco |\n| skyzer | Terminal vendor skyzer |\n| smartpay | Terminal vendor smartpay |\n| verifone | Terminal vendor Verifone |\n| vista | Terminal vendor vista |\n| windcave | Terminal vendor Windcave |","href":"/api/integration-requests#product"},"242":{"path":["API","Integration Requests"],"title":"Integration Types","description":"| Name | Description |\n| -------- | ---------------------------------------------------------- |\n| epay | Asset provider ePay |\n| invenco | Terminal vendor invenco |\n| skyzer | Terminal vendor skyzer |\n| smartpay | Terminal vendor smartpay |\n| verifone | Terminal vendor Verifone |\n| vista | Terminal vendor vista |\n| windcave | Terminal vendor Windcave |","href":"/api/integration-requests#integration-types"},"243":{"path":["API","Integration Requests"],"title":"Create an Integration Request ","description":"This endpoint allows you to create an Integration Request.","href":"/api/integration-requests#create-an-integration-request-"},"244":{"path":["API","Integration Requests"],"title":"Attributes","description":"","description":"This endpoint allows you to get an Integration Request.","href":"/api/integration-requests#get-an-integration-request-"},"246":{"path":["API","Integration Requests"],"title":"Attributes","description":"No attributes.","href":"/api/integration-requests#attributes"},"247":{"path":["API","Integration Requests"],"title":"Search Merchants","description":"Returns a paginated response of Integration Requests.","href":"/api/integration-requests#search-merchants"},"248":{"path":["API","Integration Requests"],"title":"Query Parameters","description":"","description":"This endpoint allows you to supply configuration values for the Integration Request.","href":"/api/integration-requests#configure-integration-request-"},"250":{"path":["API","Integration Requests"],"title":"Attributes","description":"","description":"This endpoint allows you to get the configuration values for the Integration Request.","href":"/api/integration-requests#get-integration-request-configuration-"},"252":{"path":["API","Integration Requests"],"title":"Attributes","description":"No attributes.","href":"/api/integration-requests#attributes"},"253":{"path":["API","Integration Requests"],"title":"Activate Integration Request ","description":"This endpoint allows you to activate an Integration Request.","href":"/api/integration-requests#activate-integration-request-"},"254":{"path":["API","Integration Requests"],"title":"Attributes","description":"No attributes.","href":"/api/integration-requests#attributes"},"255":{"path":["API","Integration Requests"],"title":"Errors","description":"","description":"This endpoint allows you to delete an Integration Request.","href":"/api/integration-requests#delete-integration-request-"},"257":{"path":["API","Integration Requests"],"title":"Attributes","description":"No attributes.","href":"/api/integration-requests#attributes"},"258":{"href":"/api/integrations","path":["API","Integrations"],"title":"Integrations","description":"Centrapay Integration documentation"},"259":{"href":"/api/introduction","path":["API","Introduction"],"title":"Introduction","description":"Introduction to the API Reference"},"260":{"href":"/api/invitations","path":["API","Invitations"],"title":"Invitations","description":"Invitation model and related endpoints"},"261":{"path":["API","Invitations"],"title":"Invitation Model","description":"","description":"This endpoint allows you to create an Invitation.","href":"/api/invitations#create-invitation-"},"266":{"path":["API","Invitations"],"title":"Attributes","description":"","description":"This endpoint allows you to retrieve an Invitation by code.","href":"/api/invitations#get-invitation-by-code-"},"269":{"path":["API","Invitations"],"title":"Attributes","description":"No attributes.","href":"/api/invitations#attributes"},"270":{"path":["API","Invitations"],"title":"List Invitations by Account Id ","description":"This endpoint allows you list Invitations for an Account.","href":"/api/invitations#list-invitations-by-account-id-"},"271":{"path":["API","Invitations"],"title":"Attributes","description":"No attributes.","href":"/api/invitations#attributes"},"272":{"path":["API","Invitations"],"title":"Accept Invitation ","description":"This endpoint allows you to accept an Invitation.","href":"/api/invitations#accept-invitation-"},"273":{"path":["API","Invitations"],"title":"Attributes","description":"","description":"This endpoint allows you to revoke an Invitation.","href":"/api/invitations#revoke-invitation-"},"276":{"path":["API","Invitations"],"title":"Attributes","description":"No attributes","href":"/api/invitations#attributes"},"277":{"path":["API","Invitations"],"title":"Errors","description":"","href":"/api/invitations#errors"},"278":{"href":"/api/legacy-payment-requests","path":["API","Legacy Payment Requests"],"title":"Legacy Payment Requests","description":"Legacy Payment Request models and related endpoints (deprecated)"},"279":{"path":["API","Legacy Payment Requests"],"title":"Payment Request Model ","description":"The \"ledger\" parameter indicates which payment option has been selected to pay\nthe payment request. The selected payment option must be one of the options\navailable for the payment request as per the payments array in the\nrequests.create and requests.info responses.","href":"/api/legacy-payment-requests#payment-request-model-"},"280":{"path":["API","Legacy Payment Requests"],"title":"Attributes","description":"The \"ledger\" parameter indicates which payment option has been selected to pay\nthe payment request. The selected payment option must be one of the options\navailable for the payment request as per the payments array in the\nrequests.create and requests.info responses.","href":"/api/legacy-payment-requests#attributes"},"281":{"path":["API","Legacy Payment Requests"],"title":"Payment Options Model ","description":"The \"ledger\" parameter indicates which payment option has been selected to pay\nthe payment request. The selected payment option must be one of the options\navailable for the payment request as per the payments array in the\nrequests.create and requests.info responses.","href":"/api/legacy-payment-requests#payment-options-model-"},"282":{"path":["API","Legacy Payment Requests"],"title":"Attributes","description":"The \"ledger\" parameter indicates which payment option has been selected to pay\nthe payment request. The selected payment option must be one of the options\navailable for the payment request as per the payments array in the\nrequests.create and requests.info responses.","href":"/api/legacy-payment-requests#attributes"},"283":{"path":["API","Legacy Payment Requests"],"title":"Paid By Model ","description":"The \"ledger\" parameter indicates which payment option has been selected to pay\nthe payment request. The selected payment option must be one of the options\navailable for the payment request as per the payments array in the\nrequests.create and requests.info responses.","href":"/api/legacy-payment-requests#paid-by-model-"},"284":{"path":["API","Legacy Payment Requests"],"title":"Attributes","description":"The \"ledger\" parameter indicates which payment option has been selected to pay\nthe payment request. The selected payment option must be one of the options\navailable for the payment request as per the payments array in the\nrequests.create and requests.info responses.","href":"/api/legacy-payment-requests#attributes"},"285":{"path":["API","Legacy Payment Requests"],"title":"Ledger and Authorization Values","description":"The \"ledger\" parameter indicates which payment option has been selected to pay\nthe payment request. The selected payment option must be one of the options\navailable for the payment request as per the payments array in the\nrequests.create and requests.info responses.","href":"/api/legacy-payment-requests#ledger-and-authorization-values"},"286":{"path":["API","Legacy Payment Requests"],"title":"Create a Payment Request ","description":"This endpoint allows you to create a Payment Request.","href":"/api/legacy-payment-requests#create-a-payment-request-"},"287":{"path":["API","Legacy Payment Requests"],"title":"Attributes","description":"","description":"This endpoint allows you to receive Payment Request information.","href":"/api/legacy-payment-requests#get-a-payment-request-"},"290":{"path":["API","Legacy Payment Requests"],"title":"Attributes","description":"","description":"This endpoint allows you to pay a Payment Request.","href":"/api/legacy-payment-requests#pay-a-payment-request-"},"292":{"path":["API","Legacy Payment Requests"],"title":"Attributes","description":"","description":"This endpoint allows you to cancel a Payment Request.","href":"/api/legacy-payment-requests#cancel-a-payment-request-"},"295":{"path":["API","Legacy Payment Requests"],"title":"Attributes","description":"","description":"This endpoint allows you to void a Payment Request.","href":"/api/legacy-payment-requests#void-a-payment-request-"},"298":{"path":["API","Legacy Payment Requests"],"title":"Attributes","description":"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.\nAfter 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.","href":"/api/legacy-payment-requests#attributes"},"299":{"path":["API","Legacy Payment Requests"],"title":"Errors","description":"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.\nAfter 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.","href":"/api/legacy-payment-requests#errors"},"300":{"path":["API","Legacy Payment Requests"],"title":"Refund a Transaction ","description":"Refunding a transaction can be done with or without an external reference.","href":"/api/legacy-payment-requests#refund-a-transaction-"},"301":{"path":["API","Legacy Payment Requests"],"title":"Refund without external reference","description":"If you refund a transaction without providing an external reference, you\nwill get a successful response for the first request and then an\nALREADY_REFUNDED message for any refund requests that follow for the same\ntransaction, unless an external reference is provided.","href":"/api/legacy-payment-requests#refund-without-external-reference"},"302":{"path":["API","Legacy Payment Requests"],"title":"Refund with external reference","description":"If you provide an external reference then a transaction can be refunded\nmultiple times provided that the external reference is unique for each\nrefund request. When a duplicate external reference is provided when\nattempting to refund the same transaction we return a successful response if\nthe amount of the request is the same both times but do not process another\nrefund, this is because we assume it to be a repeat request. If the amount\nis different you will get a REPEAT_REFERENCE error message.","href":"/api/legacy-payment-requests#refund-with-external-reference"},"303":{"path":["API","Legacy Payment Requests"],"title":"Refund a Pre Auth Payment Request with Confirmations","description":"The legacy refund endpoint cannot be used to refund Pre Auth Payment Requests with Confirmations. Please use the current refund endpoint instead.","href":"/api/legacy-payment-requests#refund-a-pre-auth-payment-request-with-confirmations"},"304":{"path":["API","Legacy Payment Requests"],"title":"Attributes","description":"Webhook notifications are sent for significant Payment life-cycle\nevents. The Webhook endpoint is notified by sending an HTTP POST request to the\nnotifyUrl defined in the Payment Request.","href":"/api/legacy-payment-requests#attributes"},"305":{"path":["API","Legacy Payment Requests"],"title":"Errors","description":"Webhook notifications are sent for significant Payment life-cycle\nevents. The Webhook endpoint is notified by sending an HTTP POST request to the\nnotifyUrl defined in the Payment Request.","href":"/api/legacy-payment-requests#errors"},"306":{"path":["API","Legacy Payment Requests"],"title":"Webhooks ","description":"Webhook notifications are sent for significant Payment life-cycle\nevents. The Webhook endpoint is notified by sending an HTTP POST request to the\nnotifyUrl defined in the Payment Request.","href":"/api/legacy-payment-requests#webhooks-"},"307":{"path":["API","Legacy Payment Requests"],"title":"Life-cycle Events That Trigger Webhooks","description":"The supported event types that will be notified to the Payment Requests webhook\nand the associated \"transactionType\" value that will be sent in the payload\nare:","href":"/api/legacy-payment-requests#life-cycle-events-that-trigger-webhooks"},"308":{"path":["API","Legacy Payment Requests"],"title":"Payment Request Cancelled","description":"A payment request can be cancelled by either calling the requests.cancel\nor requests.void endpoint before a request has been paid successfully.\nWhen a request has been cancelled we send a JWT that when decoded matches the\nPayment Request Cancelled example in the Decoded Webhook JWT Examples\nsection below.","href":"/api/legacy-payment-requests#payment-request-cancelled"},"309":{"path":["API","Legacy Payment Requests"],"title":"Payment Request Expired","description":"A payment request expires two minutes after being created if it hasn't been\ncancelled, or paid. When a request has expired we send a JWT that when\ndecoded matches the Payment Request Cancelled example in the Decoded\nWebhook JWT Examples section below with the transactionType set to EXPIRED.","href":"/api/legacy-payment-requests#payment-request-expired"},"310":{"path":["API","Legacy Payment Requests"],"title":"Transaction Completed","description":"A transaction is considered complete when requests.pay is called with\nparameters that satisfy a payment request and the request has been paid\nsuccessfully. When a transaction has been completed we send a JWT that when\ndecoded matches the Transaction Completed example in the Decoded Webhook\nJWT Examples section below.","href":"/api/legacy-payment-requests#transaction-completed"},"311":{"path":["API","Legacy Payment Requests"],"title":"Transaction Refunded","description":"A transaction can be refunded one to many times and each time a transaction\nhas been refunded successfully we notify the webhook associated with the\noriginal payment request. A transaction can be refunded when\ntransactions.refund has been called for a partial or full refund, or when\nrequests.void is called for a request that has been paid. When a\ntransaction has been refunded we send a JWT that when decoded matches the\nTransaction Completed example in the Decoded Webhook JWT Examples section\nbelow but with transactionType set to REFUND.","href":"/api/legacy-payment-requests#transaction-refunded"},"312":{"path":["API","Legacy Payment Requests"],"title":"Webhook Payload","description":"The body of the webhook is a JSON document with the following format:","href":"/api/legacy-payment-requests#webhook-payload"},"313":{"path":["API","Legacy Payment Requests"],"title":"Webhook Payload Fields","description":"| Property | Description |\n|:----------------|:------------------------------------------------------------|\n| transactionId | Id of the transaction |\n| transactionType | Indicates which event triggered the notification message |\n| state | Current state of the transaction |\n| ledger | The ledger at which the authorization was processed |\n| amount | Transaction amount in the lowest denomination available |\n| createdAt | Timestamp at which the request was created |\n| updatedAt | Timestamp at which the request was updated |\n| type | The payment type used by the issuer to reconcile settlement |\n| request | Request object, see details at [requests.info][] |\n| authCode | Authorization code used to settle this transaction |","href":"/api/legacy-payment-requests#webhook-payload-fields"},"314":{"path":["API","Legacy Payment Requests"],"title":"Webhook JWT Validation","description":"A webhook JWT can be validated by checking the signature against the Centrapay\nWebhook public key:","href":"/api/legacy-payment-requests#webhook-jwt-validation"},"315":{"path":["API","Legacy Payment Requests"],"title":"Decoded Webhook JWT Examples","description":"","href":"/api/legacy-payment-requests#decoded-webhook-jwt-examples"},"316":{"href":"/api/managed-integrations","path":["API","Managed Integrations"],"title":"Managed Integrations","description":"Managed Integration model and related endpoints"},"317":{"path":["API","Managed Integrations"],"title":"Managed Integration Model","description":"A summary of the Invitation for a Managed Integration.","href":"/api/managed-integrations#managed-integration-model"},"318":{"path":["API","Managed Integrations"],"title":"Attributes","description":"A summary of the Invitation for a Managed Integration.","href":"/api/managed-integrations#attributes"},"319":{"path":["API","Managed Integrations"],"title":"Invitation Summary Model","description":"A summary of the Invitation for a Managed Integration.","href":"/api/managed-integrations#invitation-summary-model"},"320":{"path":["API","Managed Integrations"],"title":"Attributes","description":"","description":"This endpoint allows you to upload a media file to Centrapay. It returns a presigned URL that can be used to download the media file.","href":"/api/media-uploads#create-a-presigned-url-for-media-upload-"},"332":{"path":["API","Media Uploads"],"title":"Attributes","description":"","description":"This endpoint allows you to retrieve the upload location of a media file.","href":"/api/media-uploads#get-media-upload-location-"},"334":{"path":["API","Media Uploads"],"title":"Attributes","description":"No attributes.","href":"/api/media-uploads#attributes"},"335":{"href":"/api/merchant-configs","path":["API","Merchant Configs"],"title":"Merchant Configs","description":"Merchant Config model and related endpoints"},"336":{"path":["API","Merchant Configs"],"title":"Merchant Config Model","description":"See Asset Types for values that may be present in the type field.","href":"/api/merchant-configs#merchant-config-model"},"337":{"path":["API","Merchant Configs"],"title":"Attributes","description":"See Asset Types for values that may be present in the type field.","href":"/api/merchant-configs#attributes"},"338":{"path":["API","Merchant Configs"],"title":"Payment Option Config Model","description":"See Asset Types for values that may be present in the type field.","href":"/api/merchant-configs#payment-option-config-model"},"339":{"path":["API","Merchant Configs"],"title":"Attributes","description":"See Asset Types for values that may be present in the type field.","href":"/api/merchant-configs#attributes"},"340":{"path":["API","Merchant Configs"],"title":"Create Merchant Config","description":"This endpoint allows you to create a Merchant Config for a Merchant.","href":"/api/merchant-configs#create-merchant-config"},"341":{"path":["API","Merchant Configs"],"title":"Attributes","description":"","description":"Returns a paginated list of Merchants which belong to the authenticated subject.","href":"/api/merchants#list-merchants-"},"378":{"path":["API","Merchants"],"title":"Attributes","description":"No attributes.","href":"/api/merchants#attributes"},"379":{"href":"/api/pagination","path":["API","Pagination"],"title":"Pagination","description":"Introduction to Pagination"},"380":{"path":["API","Pagination"],"title":"Pagination Model","description":"","href":"/api/pagination#pagination-model"},"381":{"path":["API","Pagination"],"title":"Example","description":"","href":"/api/pagination#example"},"382":{"href":"/api/patron-codes","path":["API","Patron Codes"],"title":"Patron Codes","description":"Patron Code model and related endpoints"},"383":{"path":["API","Patron Codes"],"title":"Patron Code Model","description":"✩ Barcode is a 16 digit number. The first 6 digits are a Centrapay defined prefix, then a 9 digit\ncode, then a luhn checksum digit.","href":"/api/patron-codes#patron-code-model"},"384":{"path":["API","Patron Codes"],"title":"Attributes","description":"✩ Barcode is a 16 digit number. The first 6 digits are a Centrapay defined prefix, then a 9 digit\ncode, then a luhn checksum digit.","href":"/api/patron-codes#attributes"},"385":{"path":["API","Patron Codes"],"title":"Test Scenario Name","description":"This field is used to inject behavior into a Payment Request when the\ngenerated barcode is supplied on creation. If a Test Scenario Name is\ndefined on a Patron Code, it is considered a test resource and can only\nbe used with Payment Requests that will have a liveness of 'test'. The Asset Type\ncentrapay.nzd.test is required to run test scenarios.","href":"/api/patron-codes#test-scenario-name"},"386":{"path":["API","Patron Codes"],"title":"Create Patron Code","description":"This endpoint allows you to create a Patron Code. You can find payment request information attached to a Patron Code by polling for the Payment Request using the transacting APIs.","href":"/api/patron-codes#create-patron-code"},"387":{"path":["API","Patron Codes"],"title":"Attributes","description":"No attributes.","href":"/api/patron-codes#attributes"},"388":{"path":["API","Patron Codes"],"title":"Get Patron Code","description":"This endpoint allows you to retrieve a Patron Code by id.","href":"/api/patron-codes#get-patron-code"},"389":{"path":["API","Patron Codes"],"title":"Attributes","description":"No attributes.","href":"/api/patron-codes#attributes"},"390":{"path":["API","Patron Codes"],"title":"Get Patron Code By Barcode","description":"This endpoint allows you to retrieve a Patron Code by barcode.","href":"/api/patron-codes#get-patron-code-by-barcode"},"391":{"path":["API","Patron Codes"],"title":"Attributes","description":"No attributes.","href":"/api/patron-codes#attributes"},"392":{"path":["API","Patron Codes"],"title":"Errors","description":"","href":"/api/patron-codes#errors"},"393":{"href":"/api/payment-requests","path":["API","Payment Requests"],"title":"Payment Requests","description":"Payment request models and related endpoints"},"394":{"path":["API","Payment Requests"],"title":"Payment Request Model","description":"⭐️ 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.","href":"/api/payment-requests#payment-request-model"},"395":{"path":["API","Payment Requests"],"title":"Attributes","description":"⭐️ 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.","href":"/api/payment-requests#attributes"},"396":{"path":["API","Payment Requests"],"title":"Payment Option Model","description":"⭐️ 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.","href":"/api/payment-requests#payment-option-model"},"397":{"path":["API","Payment Requests"],"title":"Attributes","description":"⭐️ 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.","href":"/api/payment-requests#attributes"},"398":{"path":["API","Payment Requests"],"title":"Accepted Collections","description":"If a Payment Request contains a centrapay.token.* Payment Option, an array of Accepted Collections will be present inside the centrapay.token Payment Option.\nThe 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.","href":"/api/payment-requests#accepted-collections"},"399":{"path":["API","Payment Requests"],"title":"Attributes","description":"Some Asset Types require conditional approval to pay. Possible Payment Conditions include confirming proof of ID\nor confirming a promotional item was purchased.","href":"/api/payment-requests#attributes"},"400":{"path":["API","Payment Requests"],"title":"Payment Condition Model","description":"Some Asset Types require conditional approval to pay. Possible Payment Conditions include confirming proof of ID\nor confirming a promotional item was purchased.","href":"/api/payment-requests#payment-condition-model"},"401":{"path":["API","Payment Requests"],"title":"Attributes","description":"An order item for which payment is requested.\nThe 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.","href":"/api/payment-requests#attributes"},"402":{"path":["API","Payment Requests"],"title":"Line Item Model","description":"An order item for which payment is requested.\nThe 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.","href":"/api/payment-requests#line-item-model"},"403":{"path":["API","Payment Requests"],"title":"Attributes","description":"The Paid By provides a summary of the transactions after the Payment Request was paid.","href":"/api/payment-requests#attributes"},"404":{"path":["API","Payment Requests"],"title":"Product Classification","description":"The Paid By provides a summary of the transactions after the Payment Request was paid.","href":"/api/payment-requests#product-classification"},"405":{"path":["API","Payment Requests"],"title":"Attributes","description":"The Paid By provides a summary of the transactions after the Payment Request was paid.","href":"/api/payment-requests#attributes"},"406":{"path":["API","Payment Requests"],"title":"Paid By Model","description":"The Paid By provides a summary of the transactions after the Payment Request was paid.","href":"/api/payment-requests#paid-by-model"},"407":{"path":["API","Payment Requests"],"title":"Attributes","description":"A Payment Activity records a transaction that has happened on a Payment Request.\nPayment Activities are created when a Payment Request has been created, paid, refunded, cancelled, or expired.","href":"/api/payment-requests#attributes"},"408":{"path":["API","Payment Requests"],"title":"Asset Totals","description":"A Payment Activity records a transaction that has happened on a Payment Request.\nPayment Activities are created when a Payment Request has been created, paid, refunded, cancelled, or expired.","href":"/api/payment-requests#asset-totals"},"409":{"path":["API","Payment Requests"],"title":"Attributes","description":"A Payment Activity records a transaction that has happened on a Payment Request.\nPayment Activities are created when a Payment Request has been created, paid, refunded, cancelled, or expired.","href":"/api/payment-requests#attributes"},"410":{"path":["API","Payment Requests"],"title":"Payment Activity Model","description":"A Payment Activity records a transaction that has happened on a Payment Request.\nPayment Activities are created when a Payment Request has been created, paid, refunded, cancelled, or expired.","href":"/api/payment-requests#payment-activity-model"},"411":{"path":["API","Payment Requests"],"title":"Attributes","description":"| Name | Description |\n| ----------------- | ----------------------------------------------------------------------------------------------------------- |\n| request | Payment Request was created. |\n| preAuthRequest | Payment Request was created with the preAuth flag set to \"true\". |\n| paid | Payment Request was paid. |\n| payment | A payment was made towards the Payment Request. |\n| refund | Funds were returned to the shopper. |\n| cancellation | Payment Request was cancelled by the merchant or the shopper. |\n| expiry | Payment Request wasn't paid before time out. |\n| accept-condition | A Payment Condition was accepted. |\n| decline-condition | A Payment Condition was declined. |\n| authorization | A Pre Auth Payment Request was approved and confirmations can be made against it. |\n| confirmation | Funds on a Pre Auth have been drawn down on. |\n| release | Pre Auth has been finalised and any remaining funds from Authorization have been returned. |","href":"/api/payment-requests#attributes"},"412":{"path":["API","Payment Requests"],"title":"Payment Activity Types","description":"| Name | Description |\n| ----------------- | ----------------------------------------------------------------------------------------------------------- |\n| request | Payment Request was created. |\n| preAuthRequest | Payment Request was created with the preAuth flag set to \"true\". |\n| paid | Payment Request was paid. |\n| payment | A payment was made towards the Payment Request. |\n| refund | Funds were returned to the shopper. |\n| cancellation | Payment Request was cancelled by the merchant or the shopper. |\n| expiry | Payment Request wasn't paid before time out. |\n| accept-condition | A Payment Condition was accepted. |\n| decline-condition | A Payment Condition was declined. |\n| authorization | A Pre Auth Payment Request was approved and confirmations can be made against it. |\n| confirmation | Funds on a Pre Auth have been drawn down on. |\n| release | Pre Auth has been finalised and any remaining funds from Authorization have been returned. |","href":"/api/payment-requests#payment-activity-types"},"413":{"path":["API","Payment Requests"],"title":"Cancellation Reasons","description":"| Reason | Description |\n| ---------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |\n| CANCELLED_BY_MERCHANT | The merchant cancelled the Payment Request by calling the cancel or void endpoint. |\n| CANCELLED_BY_PATRON | The patron cancelled the transaction. |\n| PATRON_CODE_INVALID | The patron code on the Payment Request was invalid. |\n| PAYMENT_FAILED | The Payment Request failed for an unknown reason. |\n| PATRON_CODE_EXPIRED | The patron code on the Payment Request has expired. |\n| DECLINED_BY_PATRON | The payment was declined by the patron during approval steps. |\n| DECLINED_BY_MERCHANT | The payment was declined by the merchant during approval steps. |\n| 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. |\n| PAYMENT_REQUEST_EXPIRED | The Payment Request has expired. |\n| NO_AVAILABLE_PAYMENT_OPTIONS | No payment options match the requested payment parameters. |\n| INACTIVE_ASSET | The asset used to pay the Payment Request is inactive. |","href":"/api/payment-requests#cancellation-reasons"},"414":{"path":["API","Payment Requests"],"title":"Create a Payment Request","description":"This endpoint allows you to create a Payment Request.","href":"/api/payment-requests#create-a-payment-request"},"415":{"path":["API","Payment Requests"],"title":"Attributes","description":"","description":"Update a user’s mutable attributes. At least one field must be provided in the request.","href":"/api/profiles#update-profile-"},"451":{"path":["API","Profiles"],"title":"Attributes","description":"","description":"This endpoint allows you to retrieve a user's Profile.","href":"/api/profiles#get-profile-"},"453":{"path":["API","Profiles"],"title":"Attributes","description":"No attributes.","href":"/api/profiles#attributes"},"454":{"href":"/api/quotas","path":["API","Quotas"],"title":"Quotas","description":"Quota model and related endpoints"},"455":{"path":["API","Quotas"],"title":"Quota Model","description":"| Type | Description | Scoped | Periods |\n|:------|:--------------------------------------------------------------------|:------:|:-------------------|\n| spend | Value of wallet-based payments or asset transfers from the account. | Yes | monthly yearly |\n| topup | Value of topups from bank accounts linked to the account. | Yes | monthly yearly |","href":"/api/quotas#quota-model"},"456":{"path":["API","Quotas"],"title":"Attributes","description":"| Type | Description | Scoped | Periods |\n|:------|:--------------------------------------------------------------------|:------:|:-------------------|\n| spend | Value of wallet-based payments or asset transfers from the account. | Yes | monthly yearly |\n| topup | Value of topups from bank accounts linked to the account. | Yes | monthly yearly |","href":"/api/quotas#attributes"},"457":{"path":["API","Quotas"],"title":"Supported Quota Types","description":"| Type | Description | Scoped | Periods |\n|:------|:--------------------------------------------------------------------|:------:|:-------------------|\n| spend | Value of wallet-based payments or asset transfers from the account. | Yes | monthly yearly |\n| topup | Value of topups from bank accounts linked to the account. | Yes | monthly yearly |","href":"/api/quotas#supported-quota-types"},"458":{"path":["API","Quotas"],"title":"Get Account Quotas ","description":"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.","href":"/api/quotas#get-account-quotas-"},"459":{"path":["API","Quotas"],"title":"Attributes","description":"No attributes.","href":"/api/quotas#attributes"},"460":{"path":["API","Quotas"],"title":"Errors","description":"If a quota limit is exceeded by an action that enforces quota limits, an 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.","href":"/api/quotas#errors"},"461":{"href":"/api/scanned-codes","path":["API","Scanned Codes"],"title":"Scanned Codes","description":"Scanned Code model and related endpoints"},"462":{"path":["API","Scanned Codes"],"title":"Scanned Code Model","description":"","description":""},"478":{"path":["API","Tokens"],"title":"Attributes","description":"","description":""},"480":{"path":["API","Tokens"],"title":"Attributes","description":"","description":""},"482":{"path":["API","Tokens"],"title":"Attributes","description":"","description":"This endpoint allows you to create a Token Collection.","href":"/api/tokens#create-token-collection-"},"484":{"path":["API","Tokens"],"title":"Attributes","description":"","description":"Returns a paginated list of Token Collections for an Account.","href":"/api/tokens#list-token-collections-"},"486":{"path":["API","Tokens"],"title":"Attributes","description":"","description":"This endpoint allows you to create a Redemption Condition.","href":"/api/tokens#create-redemption-condition-"},"488":{"path":["API","Tokens"],"title":"Attributes","description":"","description":"This endpoint allows you to create a Token.","href":"/api/tokens#create-token-"},"491":{"path":["API","Tokens"],"title":"Attributes","description":"","href":"/api/tokens#attributes"},"492":{"path":["API","Tokens"],"title":"Errors","description":"","href":"/api/tokens#errors"},"493":{"href":"/api/wallets","path":["API","Wallets"],"title":"Wallets","description":"Wallet models and related endpoints"},"494":{"path":["API","Wallets"],"title":"Settlement Wallets ","description":"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.","href":"/api/wallets#settlement-wallets-"},"495":{"path":["API","Wallets"],"title":"Wallet Model","description":" {\nconsole.log('Something went wrong handling OIDC callback');\n});\n/* Restore previous location stored against state param */\nwindow.location.replace(result.state || '/');\n}","href":"/guides/example-oidc-consumer#oidc-client-logout"},"520":{"href":"/guides/farmlands-card-partner-support","path":["Connections","Farmlands","Support Guide"],"title":"Farmlands Card Partner Support Guide","description":"How to for Farmlands Card Partners and Card Holders to request support from the relevant company and teams to get the help they need."},"521":{"path":["Connections","Farmlands","Support Guide"],"title":"Support for Portal Users","description":"Centrapay Platform is unable to process transactions initiated by Card Partners","href":"/guides/farmlands-card-partner-support#support-for-portal-users"},"522":{"path":["Connections","Farmlands","Support Guide"],"title":"Trouble Shooting","description":"Centrapay Platform is unable to process transactions initiated by Card Partners","href":"/guides/farmlands-card-partner-support#trouble-shooting"},"523":{"path":["Connections","Farmlands","Support Guide"],"title":"Support for POS Integrators","description":"Centrapay Platform is unable to process transactions initiated by Card Partners","href":"/guides/farmlands-card-partner-support#support-for-pos-integrators"},"524":{"path":["Connections","Farmlands","Support Guide"],"title":"SLA Support Level","description":"Centrapay Platform is unable to process transactions initiated by Card Partners","href":"/guides/farmlands-card-partner-support#sla-support-level"},"525":{"path":["Connections","Farmlands","Support Guide"],"title":"P1 - Severe Business Disruption","description":"Centrapay Platform is unable to process transactions initiated by Card Partners","href":"/guides/farmlands-card-partner-support#p1---severe-business-disruption"},"526":{"path":["Connections","Farmlands","Support Guide"],"title":"P2 - Major Business Disruption","description":"Centrapay Platform unable to:","href":"/guides/farmlands-card-partner-support#p2---major-business-disruption"},"527":{"path":["Connections","Farmlands","Support Guide"],"title":"P3 - Minor Business Disruption","description":"Centrapay Platform is operational but suffering performance degradation","href":"/guides/farmlands-card-partner-support#p3---minor-business-disruption"},"528":{"path":["Connections","Farmlands","Support Guide"],"title":"P4 - Adhoc requests as requested by Farmlands","description":"Adhoc requests as requested by Farmlands","href":"/guides/farmlands-card-partner-support#p4---adhoc-requests-as-requested-by-farmlands"},"529":{"href":"/guides/farmlands-portal","path":["Connections","Farmlands","Portal Guide"],"title":"Farmlands Portal Guide","description":"Farmlands Co-operative (Farmands) have partnered with Centrapay Payment Gateway (Centrapay) to deliver a secure web portal for Farmlands Card payments."},"530":{"path":["Connections","Farmlands","Portal Guide"],"title":"Getting Started","description":"The initial setup of your Business and all Branches (referred to as Merchants) will be managed by Farmlands. Farmlands will provide Centrapay with the details of a primary Account Owner for the business who will be loaded by Centrapay. Once setup this account owner will be able login and maintain the other members (users) who have or need access to the Account (see Members).","href":"/guides/farmlands-portal#getting-started"},"531":{"path":["Connections","Farmlands","Portal Guide"],"title":"Business Information","description":"The initial setup of your Business and all Branches (referred to as Merchants) will be managed by Farmlands. Farmlands will provide Centrapay with the details of a primary Account Owner for the business who will be loaded by Centrapay. Once setup this account owner will be able login and maintain the other members (users) who have or need access to the Account (see Members).","href":"/guides/farmlands-portal#business-information"},"532":{"path":["Connections","Farmlands","Portal Guide"],"title":"Registration","description":"Once the Business and Merchants are set up in the Centrapay Portal, users will receive an email from Farmlands inviting them to register for the portal. Users must use the email address provided in the initial setup process to register.","href":"/guides/farmlands-portal#registration"},"533":{"path":["Connections","Farmlands","Portal Guide"],"title":"Log In","description":"The Centrapay Business Portal will store your authenticated session for up to 60 days. During this time, it is not necessary to re-authenticate simply enter your email address to log in. After 60 days, you will be prompted to re-authenticate by entering a Verification Code sent to your registered email address.","href":"/guides/farmlands-portal#log-in"},"534":{"path":["Connections","Farmlands","Portal Guide"],"title":"Dashboard","description":"The Dashboard is an overview of Centrapay Business Account and will be your main screen for generating an authorisation or releasing a previous Farmlands Authorisation.","href":"/guides/farmlands-portal#dashboard"},"535":{"path":["Connections","Farmlands","Portal Guide"],"title":"Farmlands Authorisations","description":"The Centrapay Business Portal provides a real-time authorisation of a Farmlands Card when presented as payment for the purchase of goods or services. It validates that the Card is active and there is a sufficient available balance to process the transaction.","href":"/guides/farmlands-portal#farmlands-authorisations"},"536":{"path":["Connections","Farmlands","Portal Guide"],"title":"Authorisation Responses","description":"| Type | Description |\n| ---------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |\n| Authorisation Approved | Funds have now been placed on hold onto the customer account, pending the receipt of the Card Partner’s invoice within the agreed period. |\n| Pending | Card Partner creates the request, but the authorisation is not yet complete. This authorisation is not approved. |\n| Check ID | This response may occur for a high-value sale. This means the transaction is pending authorisation until the Card Partner confirms they have authenticated the customer’s photo ID against the name on the Farmlands Card. |\n| Declined | The authorisation is declined due to an invalid card number, a credit limit exceeded, or Card Partner is unable to verify a high-value transaction. Refer to Farmlands Contact Centre 0800 200 600 |\n| Release | The funds “on hold” are cancelled by Card Partner. This may occur when a Card Partner is unable to fulfil an order. (This is not used for a refund). |","href":"/guides/farmlands-portal#authorisation-responses"},"537":{"path":["Connections","Farmlands","Portal Guide"],"title":"Create a Farmlands Authorisation","description":"Once an approved authorisation has been provided, a full GST invoice must be submitted to Farmlands at vendor.invoices@farmlands.co.nz. The Short Code shown on the Approval screen must be copied and clearly displayed in the PO field of the invoice or where previously confirmed with the Farmlands Team. The Farmlands 9-digit Card number can be provided in addition to the Short Code in another field. Settlement will be completed as per agreed payment terms.","href":"/guides/farmlands-portal#create-a-farmlands-authorisation"},"538":{"path":["Connections","Farmlands","Portal Guide"],"title":"Invoicing & Settlement","description":"Once an approved authorisation has been provided, a full GST invoice must be submitted to Farmlands at vendor.invoices@farmlands.co.nz. The Short Code shown on the Approval screen must be copied and clearly displayed in the PO field of the invoice or where previously confirmed with the Farmlands Team. The Farmlands 9-digit Card number can be provided in addition to the Short Code in another field. Settlement will be completed as per agreed payment terms.","href":"/guides/farmlands-portal#invoicing-&-settlement"},"539":{"path":["Connections","Farmlands","Portal Guide"],"title":"Releasing Funds","description":"The Authorised funds will be held against the Cardholder account for 31 days or until the invoice is received. If the order is cancelled before the invoice is submitted to Farmlands the Authorisation should be released to remove the hold on Cardholder funds.","href":"/guides/farmlands-portal#releasing-funds"},"540":{"path":["Connections","Farmlands","Portal Guide"],"title":"Release Hold on Customer Funds","description":"The Payments page provides a list of transactions that were previously authorised. You can search by using the Authorisation Short Code as the reference. Further search functionality will be available at a later date.","href":"/guides/farmlands-portal#release-hold-on-customer-funds"},"541":{"path":["Connections","Farmlands","Portal Guide"],"title":"Authorisation History","description":"The Payments page provides a list of transactions that were previously authorised. You can search by using the Authorisation Short Code as the reference. Further search functionality will be available at a later date.","href":"/guides/farmlands-portal#authorisation-history"},"542":{"path":["Connections","Farmlands","Portal Guide"],"title":"Setting a Default Merchant","description":"Select your Default Merchant (First-time user) - The default merchant is the branch or outlet that the user normally works from, and which the transaction will be associated with.","href":"/guides/farmlands-portal#setting-a-default-merchant"},"543":{"path":["Connections","Farmlands","Portal Guide"],"title":"Manage My Centrapay Business Account","description":"The Account Owner has access to additional options to manage their Centrapay Business Account, including adding an removing users who have access to complete authorisations on their account.","href":"/guides/farmlands-portal#manage-my-centrapay-business-account"},"544":{"path":["Connections","Farmlands","Portal Guide"],"title":"Merchants","description":"This area relates to the management of new and existing Branches/Locations used for Centrapay’s other payment types e.g gift cards (i.e not Farmlands). Additional merchants added through the Merchants area will not be able to accept Farmlands Card until they are setup by Farmlands.","href":"/guides/farmlands-portal#merchants"},"545":{"path":["Connections","Farmlands","Portal Guide"],"title":"Bank Accounts","description":"This function is only available to businesses who wish to use other Centrapay supported payment methods other than Farmlands Cards. (e.g. Gift Cards or NZD).","href":"/guides/farmlands-portal#bank-accounts"},"546":{"path":["Connections","Farmlands","Portal Guide"],"title":"Members","description":"On the Members page you can manage the members connected to the Centrapay Business Account. An Account Owner can see the list of members and pending invitations and easily add or remove members.","href":"/guides/farmlands-portal#members"},"547":{"path":["Connections","Farmlands","Portal Guide"],"title":"Settings","description":"On the Settings page, you can change your business information. Please note this does not flow through to Farmlands. If you have a change of ownership, please contact Farmlands.","href":"/guides/farmlands-portal#settings"},"548":{"path":["Connections","Farmlands","Portal Guide"],"title":"FAQs","description":"The Support button opens up a form that will allow you to send a support request directly to Centrapay if you have any issues regarding the Centrapay Business Portal.","href":"/guides/farmlands-portal#faqs"},"549":{"path":["Connections","Farmlands","Portal Guide"],"title":"Support","description":"The Support button opens up a form that will allow you to send a support request directly to Centrapay if you have any issues regarding the Centrapay Business Portal.","href":"/guides/farmlands-portal#support"},"550":{"href":"/guides/farmlands-pos-integration","path":["Connections","Farmlands","POS Integration Guide"],"title":"Farmlands POS Integration Guide","description":"Farmlands has partnered with Centrapay to deliver new ways for your business to authorise and process Farmlands Card payments that are faster, easier, and more secure than ever."},"551":{"path":["Connections","Farmlands","POS Integration Guide"],"title":"Centrapay Integration Benefits","description":"Integrating with Centrapay streamlines the process for authorising and invoicing Farmlands Card Payments. The integration provides:","href":"/guides/farmlands-pos-integration#centrapay-integration-benefits"},"552":{"path":["Connections","Farmlands","POS Integration Guide"],"title":"Payment Flow Overview","description":"Farmlands integrations use Centrapay’s Quick Pay Barcode Flow For Merchants to connect to Cardholders and accept Farmlands transactions.","href":"/guides/farmlands-pos-integration#payment-flow-overview"},"553":{"path":["Connections","Farmlands","POS Integration Guide"],"title":"Payment Flow Implementation","description":"The Payment Flow can only be used by existing Farmlands Card Partners. Card Partners must complete the following steps to accept Farmlands transactions.","href":"/guides/farmlands-pos-integration#payment-flow-implementation"},"554":{"path":["Connections","Farmlands","POS Integration Guide"],"title":"Merchant Configuration","description":"Each Card Partner site that needs to accept Farmlands Card payments must be set up as a separate Centrapay Merchant with its own Merchant Config. The Merchant Config contains a Farmlands Payment Option that allows the site to accept Farmlands Payments.","href":"/guides/farmlands-pos-integration#merchant-configuration"},"555":{"path":["Connections","Farmlands","POS Integration Guide"],"title":"Authentication","description":"Requests to Centrapay’s APIs are authenticated by providing an API key in the X-Api-Key header. API Keys provide enduring access to a single Centrapay account.","href":"/guides/farmlands-pos-integration#authentication"},"556":{"path":["Connections","Farmlands","POS Integration Guide"],"title":"Basic Requirements","description":"The Payment Flow needs the following requirements to be met.","href":"/guides/farmlands-pos-integration#basic-requirements"},"557":{"path":["Connections","Farmlands","POS Integration Guide"],"title":"Payment Conditions","description":"This extension enables the POS to enforce requiring an ID check for high-risk transactions.","href":"/guides/farmlands-pos-integration#payment-conditions"},"558":{"path":["Connections","Farmlands","POS Integration Guide"],"title":"Pre Auth","description":"Farmlands Card Partners must support this extension when there is not an invoice number available at the point of sale or the purchase cannot be fulfilled immediately. This might happen if your stock is not on hand or you have a separate fulfilment process.","href":"/guides/farmlands-pos-integration#pre-auth"},"559":{"path":["Connections","Farmlands","POS Integration Guide"],"title":"Cardholder Not Present","description":"Farmlands Card Partners must support this extension if they accept payments when the Cardholder is not physically present when a payment is authorised. For example, to accept phone-based orders or orders where the Farmlands barcode is already known.","href":"/guides/farmlands-pos-integration#cardholder-not-present"},"560":{"path":["Connections","Farmlands","POS Integration Guide"],"title":"Validating Farmlands Barcodes","description":"Farmlands Card Partners may optionally decode a scanned Farmlands Barcode to confirm that it is valid and apply Farmlands discounts before creating a Payment Request.","href":"/guides/farmlands-pos-integration#validating-farmlands-barcodes"},"561":{"path":["Connections","Farmlands","POS Integration Guide"],"title":"Handling Payment Errors","description":"The POS must follow Centrapay’s guidelines on handling errors when dealing with inconsistencies in Payment Request statuses due to network issues or race conditions.","href":"/guides/farmlands-pos-integration#handling-payment-errors"},"562":{"path":["Connections","Farmlands","POS Integration Guide"],"title":"Refunds","description":"Cardholder purchases are refunded by refunding the Payment Request.","href":"/guides/farmlands-pos-integration#refunds"},"563":{"path":["Connections","Farmlands","POS Integration Guide"],"title":"Short Codes","description":"Payment Requests have a short code field that is human- and OCR-friendly. When combined with the date or merchant id, short codes can unambiguously identify the correct Payment Request.","href":"/guides/farmlands-pos-integration#short-codes"},"564":{"path":["Connections","Farmlands","POS Integration Guide"],"title":"Testing Your Integration","description":"Merchant Integrators need to work with Farmlands and Centrapay to get set up to test payments. Please contact Farmlands to organise full end-to-end testing.","href":"/guides/farmlands-pos-integration#testing-your-integration"},"565":{"path":["Connections","Farmlands","POS Integration Guide"],"title":"Certification Requirements","description":"For Centrapay to allow integrations to have production assets turned on, we require partners to complete a Certification Process.","href":"/guides/farmlands-pos-integration#certification-requirements"},"566":{"path":["Connections","Farmlands","POS Integration Guide"],"title":"Next Steps","description":"","href":"/guides/farmlands-pos-integration#next-steps"},"567":{"href":"/guides/initiating-refunds","path":["Reference","Merchant Integrations","Initiating Refunds"],"title":"Initiating Refunds","description":"How to issue refunds on the Centrapay payment platform."},"568":{"path":["Reference","Merchant Integrations","Initiating Refunds"],"title":"Refund Idempotency","description":"Refund requests must provide an externalRef that is unique for all refunds made against the Payment Request.","href":"/guides/initiating-refunds#refund-idempotency"},"569":{"path":["Reference","Merchant Integrations","Initiating Refunds"],"title":"Obtaining a Payment Request Id","description":"Refunds are initiated using the identifier for the Payment Request. However, a patron is NOT expected to have this information available.","href":"/guides/initiating-refunds#obtaining-a-payment-request-id"},"570":{"path":["Reference","Merchant Integrations","Initiating Refunds"],"title":"By Short Code","description":"Call the Get Payment Request by Short Code endpoint using the Centrapay short code that the patron obtains from their paper receipt or digital wallet transaction history.","href":"/guides/initiating-refunds#by-short-code"},"571":{"path":["Reference","Merchant Integrations","Initiating Refunds"],"title":"By Transaction Reference","description":"Lookup the transaction within the merchant system using the transaction reference that the patron obtains from their paper receipt or digital wallet transaction history.","href":"/guides/initiating-refunds#by-transaction-reference"},"572":{"path":["Reference","Merchant Integrations","Initiating Refunds"],"title":"Refund Error Handling","description":"There are a number of reasons why refunds can fail. These are documented on the Refund Payment Request endpoint and should be communicated to the user.","href":"/guides/initiating-refunds#refund-error-handling"},"573":{"path":["Reference","Merchant Integrations","Initiating Refunds"],"title":"Multi-Asset Selection","description":"Payment Requests may be paid by multiple assets. When refunding a multi-asset Payment Request, the refunded asset is not controllable by the merchant.","href":"/guides/initiating-refunds#multi-asset-selection"},"574":{"href":"/guides/integrating-third-party-asset","path":["Reference","Digital Assets","Third-party Asset"],"title":"Third-party Asset","description":"Integrate your assets with Centrapay to unlock the potential to transact with terminals, point-of-sales and merchants already connected with the Centrapay Payments Network."},"575":{"path":["Reference","Digital Assets","Third-party Asset"],"title":"Defining a Payment Method","description":"We require a way of identifying your asset in order to route payments to the correct asset provider. You must define a payment method namespace, description, and list of supported currencies.","href":"/guides/integrating-third-party-asset#defining-a-payment-method"},"576":{"path":["Reference","Digital Assets","Third-party Asset"],"title":"Namespace","description":"The namespace is a unique string to identify your asset. Your namespace must conform to the following properties:","href":"/guides/integrating-third-party-asset#namespace"},"577":{"path":["Reference","Digital Assets","Third-party Asset"],"title":"Liveness","description":"The liveness of a payment method can be either main or test. This can be used to accept test assets through Centrapay.","href":"/guides/integrating-third-party-asset#liveness"},"578":{"path":["Reference","Digital Assets","Third-party Asset"],"title":"Description","description":"Merchants may look at reports or receipts of past transactions. If there was a payment or refund with your asset against their Payment Request, the description of your asset will be displayed.","href":"/guides/integrating-third-party-asset#description"},"579":{"path":["Reference","Digital Assets","Third-party Asset"],"title":"Supported Currencies","description":"Payment Requests have a value determined by the currency a Merchant accepts. You should supply a finite list of three-letter ISO currency codes that is supported by your asset.","href":"/guides/integrating-third-party-asset#supported-currencies"},"580":{"path":["Reference","Digital Assets","Third-party Asset"],"title":"Example Definition","description":"| Field | Type | Description | Examples |\n| --------------------------------------------- | ------ | ------------------------------------------------------------------- | ----------------- |\n| Namespace | String | A name used for uniquely identifying the asset as a payment method. | centrapay-example |\n| Description | String | A short human readable description. | Centrapay Money |\n| Supported Currencies | Array | A list of supported currency codes. | NZD, USD |","href":"/guides/integrating-third-party-asset#example-definition"},"581":{"path":["Reference","Digital Assets","Third-party Asset"],"title":"Uplink API Requirements","description":"To integrate with Centrapay payments, you must implement the Uplink endpoints. An Uplink is a strategy for performing payment or refund transactions for your Asset. These endpoints will be used in the lifecycle of a payment.","href":"/guides/integrating-third-party-asset#uplink-api-requirements"},"582":{"path":["Reference","Digital Assets","Third-party Asset"],"title":"Contact Details","description":"Centrapay requires at least one email address to notify you of integration failures or changes. You may choose to provide us with multiple emails for different priorities of communication.","href":"/guides/integrating-third-party-asset#contact-details"},"583":{"path":["Reference","Digital Assets","Third-party Asset"],"title":"Protocol","description":"Each endpoint must use the HTTPS protocol.","href":"/guides/integrating-third-party-asset#protocol"},"584":{"path":["Reference","Digital Assets","Third-party Asset"],"title":"URL","description":"There are no restrictions regarding the provided URLs, so long as they adhere to the specification for the HTTP method, query parameters, request body, response body, and error codes.","href":"/guides/integrating-third-party-asset#url"},"585":{"path":["Reference","Digital Assets","Third-party Asset"],"title":"Authentication","description":"Endpoints are authenticated against requests using a JSON Web Token (JWT) issued by Centrapay. The JWT will be sent through the Authorization header in the HTTP Request.","href":"/guides/integrating-third-party-asset#authentication"},"586":{"path":["Reference","Digital Assets","Third-party Asset"],"title":"Refund Endpoint","description":"This endpoint is used to refund a Payment Request with status paid. Refunds must be synchronous i.e. the status must be successful or failed.","href":"/guides/integrating-third-party-asset#refund-endpoint"},"587":{"path":["Reference","Digital Assets","Third-party Asset"],"title":"Cancel Endpoint","description":"After initiating a transaction with the pay endpoint, the status may be pending. During this time something may have happened to prevent the payment request from being paid (e.g. payment request timeout or merchant network issues).","href":"/guides/integrating-third-party-asset#cancel-endpoint"},"588":{"path":["Reference","Digital Assets","Third-party Asset"],"title":"Get Transaction Endpoint","description":"After initiating a payment transaction, the status may be pending. This endpoint will be used to poll the status of the transaction attempt. Polling will continue until either the transaction attempt status is successful or failed, or the Centrapay Payment Request is no longer payable (e.g. it has expired).","href":"/guides/integrating-third-party-asset#get-transaction-endpoint"},"589":{"path":["Reference","Digital Assets","Third-party Asset"],"title":"Implementation Checklist","description":"To enable merchants to accept your asset as a payment method, you must complete an integration certification. When you're ready or need assistance/have questions integrating, please contact the Centrapay Engineering team at integrations@centrapay.com.","href":"/guides/integrating-third-party-asset#implementation-checklist"},"590":{"href":"/guides/line-items","path":["Reference","Merchant Integrations","Line Items"],"title":"Line Items","description":"Line items are used to communicate the details of a purchase to a patron."},"591":{"path":["Reference","Merchant Integrations","Line Items"],"title":"Restrictions","description":"Payments via Centrapay can be made against specific line items. This can happen because a user has specifically requested the line items they wish an asset to pay for, or because they were using an asset that can only be redeemed for a specific product, like a Centrapay Token.\nIt's important to communicate to the merchant which line items have been purchased via Centrapay so they are able to make educated decisions when refunding transactions or completing partial payments.\nThis information should also be displayed to a consumer when possible. If any line items were purchased by a specific asset, they will be returned on a Payment Request inside the Asset Totals array.\nIntegrators must iterate through the assetTotals array and display any line items purchased to the merchant. Line items that have been purchased via Centrapay must no longer be able to be purchased using another form of payment.\nThis is especially important for any assets which are only redeemable against specific line items. For example, there could be a case where someone used a digital token to pay for a line item, and then a physical voucher to pay for that same line item, which would mean the second voucher could go towards purchasing something other than the intended line item.","href":"/guides/line-items#restrictions"},"592":{"path":["Reference","Merchant Integrations","Line Items"],"title":"Determining Paid For Line Items","description":"Payments via Centrapay can be made against specific line items. This can happen because a user has specifically requested the line items they wish an asset to pay for, or because they were using an asset that can only be redeemed for a specific product, like a Centrapay Token.\nIt's important to communicate to the merchant which line items have been purchased via Centrapay so they are able to make educated decisions when refunding transactions or completing partial payments.\nThis information should also be displayed to a consumer when possible. If any line items were purchased by a specific asset, they will be returned on a Payment Request inside the Asset Totals array.\nIntegrators must iterate through the assetTotals array and display any line items purchased to the merchant. Line items that have been purchased via Centrapay must no longer be able to be purchased using another form of payment.\nThis is especially important for any assets which are only redeemable against specific line items. For example, there could be a case where someone used a digital token to pay for a line item, and then a physical voucher to pay for that same line item, which would mean the second voucher could go towards purchasing something other than the intended line item.","href":"/guides/line-items#determining-paid-for-line-items"},"593":{"href":"/guides/loading-and-sending-assets","path":["Reference","Digital Assets","Loading and Sending Assets"],"title":"Loading and Sending Assets","description":"Issue and distribute Centrapay Assets such as Giftcards or Tokens to users via SMS."},"594":{"path":["Reference","Digital Assets","Loading and Sending Assets"],"title":"Loading Giftcards","description":"You can load Giftcards by calling our External Assets endpoint. You will need to use the giftcard number for the externalId field. The pin, the issuer and the type need to be on hand too.","href":"/guides/loading-and-sending-assets#loading-giftcards"},"595":{"path":["Reference","Digital Assets","Loading and Sending Assets"],"title":"Sending Assets","description":"You can send Assets such as Tokens and Giftcards by calling our Asset Transfers endpoint. You will need to have the recipient’s phone number for recipientAlias to identify the reciever.","href":"/guides/loading-and-sending-assets#sending-assets"},"596":{"path":["Reference","Digital Assets","Loading and Sending Assets"],"title":"Example: Bulk distribution of Giftcards","description":"Sometimes you might want to load and distribute Giftcards to a large number of recipients. This requires some scripting, but this is not hard. We can do this with:","href":"/guides/loading-and-sending-assets#example:-bulk-distribution-of-giftcards"},"597":{"href":"/guides/merchant-integration-barcode-flow","path":["Reference","Merchant Integrations","Barcode Flow"],"title":"Barcode Flow for Merchants","description":"How merchants can accept payments by scanning a barcode presented by the patron."},"598":{"path":["Reference","Merchant Integrations","Barcode Flow"],"title":"Barcode Flow","description":"The sequence diagram below indicates the expected flow of behavior between the patron, the Point of Sale (POS) and Centrapay.","href":"/guides/merchant-integration-barcode-flow#barcode-flow"},"599":{"path":["Reference","Merchant Integrations","Barcode Flow"],"title":"Quick Pay Flow","description":"Quick Pay is used to immediately confirm the payment without requiring patron approval.","href":"/guides/merchant-integration-barcode-flow#quick-pay-flow"},"600":{"path":["Reference","Merchant Integrations","Barcode Flow"],"title":"Checking Barcode Details","description":"The POS can optionally decode a scanned barcode in order to get further details about a barcode before it creates a Payment Request. For example, the POS can use the barcode provider to apply any provider-specific discounts before creating the Payment Request.","href":"/guides/merchant-integration-barcode-flow#checking-barcode-details"},"601":{"href":"/guides/merchant-integration-error-handling","path":["Reference","Merchant Integrations","Error Handling"],"title":"Merchant Integration Error Handling","description":"How to deal with inconsistencies in Payment Request statuses due to network issues or race conditions."},"602":{"path":["Reference","Merchant Integrations","Error Handling"],"title":"Respect Payment Status","description":"Use the Payment Request status as the source of truth when determining if a Payment Request is paid or expired. For example, if cancelling a Payment Request fails with a REQUEST_PAID error then the terminal should respond accordingly; either by showing the transaction as paid or initiating a void instead.","href":"/guides/merchant-integration-error-handling#respect-payment-status"},"603":{"path":["Reference","Merchant Integrations","Error Handling"],"title":"Void Unknown Status","description":"If the status of a transaction cannot be determined to be successful after retrying, then the Payment Request should be voided. Voiding a Payment Request will cancel the request and trigger any refunds if necessary.","href":"/guides/merchant-integration-error-handling#void-unknown-status"},"604":{"path":["Reference","Merchant Integrations","Error Handling"],"title":"Configure POS Timeout","description":"Payment Requests have a configurable timeout which defaults to 2 minutes. Integrators should make sure that the payment terminal times out 5-10 seconds after the Payment Request.","href":"/guides/merchant-integration-error-handling#configure-pos-timeout"},"605":{"path":["Reference","Merchant Integrations","Error Handling"],"title":"Retry Unknown Errors","description":"When faced with an unknown error while checking the status of a Payment Request, POS integrations should retry at least once before voiding the transaction.","href":"/guides/merchant-integration-error-handling#retry-unknown-errors"},"606":{"path":["Reference","Merchant Integrations","Error Handling"],"title":"Resolving Persistent Errors","description":"For issues that cannot be resolved, please reach out to Centrapay Support at integrations@centrapay.com.","href":"/guides/merchant-integration-error-handling#resolving-persistent-errors"},"607":{"href":"/guides/merchant-integration-qr-code-flow","path":["Reference","Merchant Integrations","QR Code Flow"],"title":"QR Code Flow for Merchants","description":"How merchants can accept payments by presenting a QR code to the patron."},"608":{"href":"/guides/partial-payment-extension","path":["Reference","Merchant Integrations","Partial Payment"],"title":"Partial Payment","description":"A core feature of the Payment Request Protocol that allows integrators to accept a partial transaction through Centrapay."},"609":{"path":["Reference","Merchant Integrations","Partial Payment"],"title":"Partial Payment Flow","description":"A patron asks the merchant to process a specified part of the total basket\namount using Centrapay. This could be due to the patron knowing their Centrapay\nAsset balance wouldn’t cover the complete basket amount or enable them to use a\nset amount of funds from a fixed value asset eg. Gift Card to complete the payment.\nRelated steps in diagram above: 1→2→3→4→5 or 2→3→4→5→6","href":"/guides/partial-payment-extension#partial-payment-flow"},"610":{"path":["Reference","Merchant Integrations","Partial Payment"],"title":"Merchant Driven Scenario","description":"A patron asks the merchant to process a specified part of the total basket\namount using Centrapay. This could be due to the patron knowing their Centrapay\nAsset balance wouldn’t cover the complete basket amount or enable them to use a\nset amount of funds from a fixed value asset eg. Gift Card to complete the payment.\nRelated steps in diagram above: 1→2→3→4→5 or 2→3→4→5→6","href":"/guides/partial-payment-extension#merchant-driven-scenario"},"611":{"path":["Reference","Merchant Integrations","Partial Payment"],"title":"Patron Driven Scenario","description":"A patron using a mobile wallet app may find they lack enough funds to cover the\nfull payment after connecting to a Centrapay Payment Request. Instead of the\ncashier needing to cancel the Payment Request and start over, the patron can\nmake a partial payment with available funds. Once the Centrapay payment is\nsuccessful, the point of sale can take payment for the remaining amount using\nanother method.\nRelated steps in diagram above: 2→3→4→5→6","href":"/guides/partial-payment-extension#patron-driven-scenario"},"612":{"path":["Reference","Merchant Integrations","Partial Payment"],"title":"Hybrid Partial Payment Scenario","description":"A combination of Merchant and App driven partial payments to cater for edge\ncases where needed.\nRelated steps in diagram above: 1→2→3→4→5→6","href":"/guides/partial-payment-extension#hybrid-partial-payment-scenario"},"613":{"path":["Reference","Merchant Integrations","Partial Payment"],"title":"Implementation","description":"When creating a Payment Request,\nopt into partial payment by:","href":"/guides/partial-payment-extension#implementation"},"614":{"path":["Reference","Merchant Integrations","Partial Payment"],"title":"Creating the Payment Request","description":"When creating a Payment Request,\nopt into partial payment by:","href":"/guides/partial-payment-extension#creating-the-payment-request"},"615":{"path":["Reference","Merchant Integrations","Partial Payment"],"title":"Polling for Payment Confirmation","description":"Continue to poll the status of the Payment Request until it is no longer new.\nIf the Payment Request status has been updated to cancelled or expired,\nproceed as you normally would. If the status is paid you need to check the\nremainingAmount property on the Payment Request.","href":"/guides/partial-payment-extension#polling-for-payment-confirmation"},"616":{"path":["Reference","Merchant Integrations","Partial Payment"],"title":"See also","description":"","href":"/guides/partial-payment-extension#see-also"},"617":{"href":"/guides/patron-not-present","path":["Reference","Merchant Integrations","Patron Not Present"],"title":"Patron Not Present","description":"Centrapay’s Patron Not Present extension allows a merchant to complete a payment when the patron is not physically present at the time of payment."},"618":{"href":"/guides/payment-conditions","path":["Reference","Merchant Integrations","Payment Conditions"],"title":"Payment Conditions","description":"Payment Conditions enable integrations to require conditional approval to accept specific Asset Types as payment."},"619":{"path":["Reference","Merchant Integrations","Payment Conditions"],"title":"Implementation","description":"In order to support Payment Conditions, the merchant integration must extend Centrapay's payment protocol by creating the Payment Request with the conditionsEnabled flag set to true.","href":"/guides/payment-conditions#implementation"},"620":{"path":["Reference","Merchant Integrations","Payment Conditions"],"title":"Additional Behaviors","description":"The payment request status must always be polled after accepting or declining a condition as these actions may trigger the additional behaviors below.","href":"/guides/payment-conditions#additional-behaviors"},"621":{"href":"/guides/payment-flows","path":["Reference","Centrapay Experiences","Payment Flows"],"title":"Payment Flows","description":"Centrapay facilitates secure and convenient transactions between customer and merchant devices, with multiple payment flows available for selection. Transact with ease and confidence using Centrapay."},"622":{"path":["Reference","Centrapay Experiences","Payment Flows"],"title":"Merchant-presented","description":"When a merchant terminal has a customer-facing display it can prompt the customer to pay by showing a QR code.","href":"/guides/payment-flows#merchant-presented"},"623":{"path":["Reference","Centrapay Experiences","Payment Flows"],"title":"Dynamic Merchant QR Code","description":"When a merchant terminal is neither capable of displaying nor scanning QR codes or barcodes, such as for unattended vending machines, then a static QR code can be used.","href":"/guides/payment-flows#dynamic-merchant-qr-code"},"624":{"path":["Reference","Centrapay Experiences","Payment Flows"],"title":"Static Merchant QR Code","description":"When a merchant terminal is neither capable of displaying nor scanning QR codes or barcodes, such as for unattended vending machines, then a static QR code can be used.","href":"/guides/payment-flows#static-merchant-qr-code"},"625":{"path":["Reference","Centrapay Experiences","Payment Flows"],"title":"Patron-presented","description":"When a merchant terminal is not capable of displaying a customer-facing QR code, then the payment request can be negotiated with the customer by scanning a barcode or QR code displayed on the customer’s smart device.","href":"/guides/payment-flows#patron-presented"},"626":{"path":["Reference","Centrapay Experiences","Payment Flows"],"title":"Dynamic Patron Barcode","description":"This is a variant on Dynamic Patron Code. If you’ve setup a long lived Centrapay Enabled Barcode then you can use these to pay on behalf of a Customer. You may need to check a Customer’s Photo ID before this goes through.","href":"/guides/payment-flows#dynamic-patron-barcode"},"627":{"path":["Reference","Centrapay Experiences","Payment Flows"],"title":"Static Patron Barcode","description":"This is a variant on Dynamic Patron Code. If you’ve setup a long lived Centrapay Enabled Barcode then you can use these to pay on behalf of a Customer. You may need to check a Customer’s Photo ID before this goes through.","href":"/guides/payment-flows#static-patron-barcode"},"628":{"path":["Reference","Centrapay Experiences","Payment Flows"],"title":"Quick Pay","description":"Quick Pay is used to pay the payment request after it is polled for the first time, without requiring patron approval. Quick Pay can only be triggered using the patron-presented flows, and the patron barcode must be linked to an asset type that allows quick pay.","href":"/guides/payment-flows#quick-pay"},"629":{"href":"/guides/payment-terminals","path":["Reference","Merchant Integrations","Payment Terminal"],"title":"Payment Terminal","description":"How to integrate a payment terminal with Centrapay APIs."},"630":{"path":["Reference","Merchant Integrations","Payment Terminal"],"title":"API Keys","description":"To create API keys, you first need to get in touch with Centrapay to be issued an Integrator Account and an “Account owner” API key. An “Account owner” is a special kind of role that allows you to manage your account.","href":"/guides/payment-terminals#api-keys"},"631":{"path":["Reference","Merchant Integrations","Payment Terminal"],"title":"Merchant Configs","description":"Centrapay Merchant Configs represent an available set of configured payment methods that can be utilized by one or more payment terminals by a Merchant.","href":"/guides/payment-terminals#merchant-configs"},"632":{"path":["Reference","Merchant Integrations","Payment Terminal"],"title":"Example Flows","description":"See Payment Flows for an overview of the API calls required for different payment flows.","href":"/guides/payment-terminals#example-flows"},"633":{"path":["Reference","Merchant Integrations","Payment Terminal"],"title":"Terminal Interface Guidelines","description":"When configuring a terminal with Centrapay there are a few common touch points that require branded assets. Please use the Centrapay Brand Assets when building the UI for these screens.","href":"/guides/payment-terminals#terminal-interface-guidelines"},"634":{"path":["Reference","Merchant Integrations","Payment Terminal"],"title":"Displaying a Button","description":"Illustration of payment terminal displaying Centrapay button","href":"/guides/payment-terminals#displaying-a-button"},"635":{"path":["Reference","Merchant Integrations","Payment Terminal"],"title":"Displaying an Icon","description":"Illustration of payment terminal displaying Centrapay icon","href":"/guides/payment-terminals#displaying-an-icon"},"636":{"path":["Reference","Merchant Integrations","Payment Terminal"],"title":"Displaying QR Codes","description":"Illustration of payment terminal displaying Centrapay QR code","href":"/guides/payment-terminals#displaying-qr-codes"},"637":{"path":["Reference","Merchant Integrations","Payment Terminal"],"title":"Integration Architecture","description":"We strongly recommend Centrapay APIs are invoked from your backend and not directly from your payment terminals. Centralizing the invocation of our APIs from your backend offers the following benefits:","href":"/guides/payment-terminals#integration-architecture"},"638":{"path":["Reference","Merchant Integrations","Payment Terminal"],"title":"Mitigating Network Issues","description":"See the guide on Merchant Integration Error Handling for information on preventing and handling network issues.","href":"/guides/payment-terminals#mitigating-network-issues"},"639":{"href":"/guides/point-of-sale","path":["Reference","Merchant Integrations","Point of Sale"],"title":"Point of Sale","description":"How to integrate a point of sale (POS) terminal with Centrapay APIs."},"640":{"path":["Reference","Merchant Integrations","Point of Sale"],"title":"Core Requirements","description":"Centrapay POS integrations must be able to create, void and refund Payment Requests on behalf of Merchants.","href":"/guides/point-of-sale#core-requirements"},"641":{"path":["Reference","Merchant Integrations","Point of Sale"],"title":"Optional Protocol Extensions","description":"Our payment protocol supports several optional extensions. Please review the extensions below and determine which ones you need for your integration.","href":"/guides/point-of-sale#optional-protocol-extensions"},"642":{"path":["Reference","Merchant Integrations","Point of Sale"],"title":"Contact Us","description":"Contact integrations@centrapay.com to get started with API keys.","href":"/guides/point-of-sale#contact-us"},"643":{"href":"/guides/requesting-payment","path":["Reference","Merchant Integrations","Requesting Payment"],"title":"Requesting Payment","description":"How to request payment on the Centrapay payment platform."},"644":{"path":["Reference","Merchant Integrations","Requesting Payment"],"title":"Connecting With Patrons","description":"The Payment Request object is a core part of Centrapay’s payment protocol. It represents the intention of a merchant to receive payment, defines the amount to be paid, and the acceptable Asset Types for payment.","href":"/guides/requesting-payment#connecting-with-patrons"},"645":{"path":["Reference","Merchant Integrations","Requesting Payment"],"title":"Required Fields","description":"We require compliant integrations to provide the following optional fields when creating a Payment Request.","href":"/guides/requesting-payment#required-fields"},"646":{"path":["Reference","Merchant Integrations","Requesting Payment"],"title":"Short Codes","description":"Payment Requests have a short code that is human- and OCR-friendly. Short codes are recycled every two years. When combined with the date or merchant id, short codes can unambiguously identify the correct Payment Request.","href":"/guides/requesting-payment#short-codes"},"647":{"path":["Reference","Merchant Integrations","Requesting Payment"],"title":"Polling for Payment Confirmation","description":"After connecting with the patron, the POS must poll the Payment Request status every second until the status has changed.","href":"/guides/requesting-payment#polling-for-payment-confirmation"},"648":{"path":["Reference","Merchant Integrations","Requesting Payment"],"title":"Protocol Extensions","description":"Our payment protocol supports several optional extensions. Please review the extensions below and determine which ones you need for your integration.","href":"/guides/requesting-payment#protocol-extensions"},"649":{"path":["Reference","Merchant Integrations","Requesting Payment"],"title":"Handling Payment Errors","description":"Merchant integrations should follow our guidelines in Merchant Integration Error Handling when inconsistencies such as network issues or race conditions occur.","href":"/guides/requesting-payment#handling-payment-errors"},"650":{"href":"/guides/requesting-pre-auth","path":["Reference","Merchant Integrations","Requesting Pre Auth"],"title":"Requesting Pre Auth","description":"Centrapay’s Pre Auth extension allows a patron to authorize payment up to a limit when the actual payment amount is not yet known."},"651":{"path":["Reference","Merchant Integrations","Requesting Pre Auth"],"title":"Restrictions","description":"Pre Auth payments are not supported in all cases.","href":"/guides/requesting-pre-auth#restrictions"},"652":{"path":["Reference","Merchant Integrations","Requesting Pre Auth"],"title":"Pre Auth Flow","description":"Pre Auth payments go through an orthogonal payment flow compared to Centrapay’s standard payment flow.","href":"/guides/requesting-pre-auth#pre-auth-flow"},"653":{"path":["Reference","Merchant Integrations","Requesting Pre Auth"],"title":"Authorize","description":"An authorization is created when the Payment Request is created with the preAuth flag while Requesting Payment.","href":"/guides/requesting-pre-auth#authorize"},"654":{"path":["Reference","Merchant Integrations","Requesting Pre Auth"],"title":"Confirm","description":"Merchants can draw down on authorized funds by making one or more confirmations against an authorized amount. Confirmations must be made with an idempotencyKey in order to prevent merchants from drawing down on authorized funds twice.","href":"/guides/requesting-pre-auth#confirm"},"655":{"path":["Reference","Merchant Integrations","Requesting Pre Auth"],"title":"Release","description":"Authorized funds that have not been confirmed can optionally be released so that the asset holder is granted access to their remaining funds without needing to wait for the authorization to expire.","href":"/guides/requesting-pre-auth#release"},"656":{"path":["Reference","Merchant Integrations","Requesting Pre Auth"],"title":"Expiry","description":"Authorizations automatically expire after 3 months. Any unreleased funds are subsequently released to the Patron.","href":"/guides/requesting-pre-auth#expiry"},"657":{"path":["Reference","Merchant Integrations","Requesting Pre Auth"],"title":"Refund","description":"Refunds can be made against authorizations, confirmations, released authorizations and expired authorizations.","href":"/guides/requesting-pre-auth#refund"},"658":{"path":["Reference","Merchant Integrations","Requesting Pre Auth"],"title":"Void","description":"Voiding a Payment Request will cancel a Payment Request and trigger any refunds necessary. This operation is useful if the POS needs to back out of a transaction due to a network error for example. Voiding can only be used up to 24 hours after the Payment Request was created.","href":"/guides/requesting-pre-auth#void"},"659":{"href":"/guides/third-party-application-payments","path":["Reference","App Integrations","Paying a Payment Request"],"title":"Paying a Payment Request","description":"Integrate your app with Centrapay to pay payment requests on merchant terminals and POS"},"660":{"path":["Reference","App Integrations","Paying a Payment Request"],"title":"Overview","description":"This guide is for a Third-party Asset Provider to enable paying with their\ndigital assets with Centrapay.","href":"/guides/third-party-application-payments#overview"},"661":{"path":["Reference","App Integrations","Paying a Payment Request"],"title":"Authenticating API calls on behalf of users","description":"Third-party applications can make API calls on behalf of users with Centrapay\nAPI keys. All API requests to Centrapay must be made from the integrator’s server.\nCentrapay API keys must also be managed server side and stored as secrets to\nminimize the risk of API keys being compromised.","href":"/guides/third-party-application-payments#authenticating-api-calls-on-behalf-of-users"},"662":{"path":["Reference","App Integrations","Paying a Payment Request"],"title":"Payment Flow Overview","description":"The payment flow below describes how a Third-party Asset Provider should integrate\nwith the Dynamic Merchant QR Code flow to enable digital payments within their\napplication. Below is an overview of the process, followed by a more in-depth\nlook at the integrator’s responsibilities.","href":"/guides/third-party-application-payments#payment-flow-overview"},"663":{"path":["Reference","App Integrations","Paying a Payment Request"],"title":"Payment Flow Implementation","description":"The user will then scan the QR code from inside the app. Valid Centrapay QR Codes\nwill have the format https://app.centrapay.com/pay/{paymentRequestId}. Validate\nthe url by asserting it matches the above format and ignore any malformed QR codes.","href":"/guides/third-party-application-payments#payment-flow-implementation"},"664":{"path":["Reference","App Integrations","Paying a Payment Request"],"title":"Scan Centrapay QR code","description":"The user will then scan the QR code from inside the app. Valid Centrapay QR Codes\nwill have the format https://app.centrapay.com/pay/{paymentRequestId}. Validate\nthe url by asserting it matches the above format and ignore any malformed QR codes.","href":"/guides/third-party-application-payments#scan-centrapay-qr-code"},"665":{"path":["Reference","App Integrations","Paying a Payment Request"],"title":"Get the Payment Request","description":"Once the app has validated the url, use the id of the Payment Request to\ncall the Get Payment Request\nAPI from your server. The returned PaymentRequest model\nwill provide the details needed to determine if the Payment Request can be completed.","href":"/guides/third-party-application-payments#get-the-payment-request"},"666":{"path":["Reference","App Integrations","Paying a Payment Request"],"title":"Pay the Payment Request","description":"If the Payment Request is payable with your Asset then you should display the\nPayment Request details to the user. Some relevant fields to display are:","href":"/guides/third-party-application-payments#pay-the-payment-request"},"667":{"path":["Reference","App Integrations","Paying a Payment Request"],"title":"Payment Extensions","description":"Extensions to the payment protocol can be used to enhance the user's experience\nby providing alternative payment flows.","href":"/guides/third-party-application-payments#payment-extensions"},"668":{"path":["Reference","App Integrations","Paying a Payment Request"],"title":"Partial Pay","description":"If both your app and the merchant support Partial Pay\nthen you may allow the user to pay only a portion of the Payment Request and\nthen pay the remaining amount with an alternative payment method.","href":"/guides/third-party-application-payments#partial-pay"},"669":{"path":["Reference","App Integrations","Paying a Payment Request"],"title":"Testing","description":"Centrapay supports test resources that can be used for integration testing. A test\nmerchant will be provided that accepts test payments. If you have supplied a\ntest third-party asset then this merchant can be configured to accept it as a\npayment method.","href":"/guides/third-party-application-payments#testing"},"670":{"href":"/guides/transaction-reporting","path":["Reference","Merchant Integrations","Transaction Reporting"],"title":"Transaction Reporting","description":"Guidelines on communicating the Asset Types used for payment to the user in any transaction reporting function on the merchant side."}} \ No newline at end of file +{"0":{"href":"/api/account-memberships","path":["API","Account Memberships"],"title":"Account Memberships","description":"Account Memberships model and related endpoints"},"1":{"path":["API","Account Memberships"],"title":"Account Membership Model","description":"A Member contains extended information about a user's access to an account.","href":"/api/account-memberships#account-membership-model"},"2":{"path":["API","Account Memberships"],"title":"Attributes","description":"","description":"This endpoint allows you to add or update the membership of a user to an account.","href":"/api/account-memberships#add-member-"},"4":{"path":["API","Account Memberships"],"title":"Attributes","description":"","description":"When you send another centrapay user cash or assets, they're automatically assigned to them.\nHowever, if they're not signed up yet then these assets are not immediately assigned.","href":"/api/asset-transfers#resolve-claimable-assets-"},"47":{"path":["API","Asset Transfers"],"title":"Attributes","description":"No Attributes.","href":"/api/asset-transfers#attributes"},"48":{"path":["API","Asset Transfers"],"title":"List Asset Transfers ","description":"Returns a paginated list of Asset Transfers.","href":"/api/asset-transfers#list-asset-transfers-"},"49":{"path":["API","Asset Transfers"],"title":"Attributes","description":"","href":"/api/asset-transfers#attributes"},"50":{"href":"/api/asset-types","path":["API","Asset Types"],"title":"Asset Types","description":"Asset types supported for payment"},"51":{"path":["API","Asset Types"],"title":"Flags","description":"","href":"/api/asset-types#flags"},"52":{"href":"/api/assets","path":["API","Assets"],"title":"Assets","description":"Asset models and related endpoints"},"53":{"path":["API","Assets"],"title":"Asset Model","description":"All assets have the following fields along with the additional fields that are\nspecific to its category. Assets which don't have a category are considered \nand the model may change.","href":"/api/assets#asset-model"},"54":{"path":["API","Assets"],"title":"Attributes","description":"Money assets, being backed by real currency, are the most flexible asset types.\nMoney is accepted for most payment requests, can be sent in arbitrary amounts\nand does not expire.","href":"/api/assets#attributes"},"55":{"path":["API","Assets"],"title":"Money Model","description":"Money assets, being backed by real currency, are the most flexible asset types.\nMoney is accepted for most payment requests, can be sent in arbitrary amounts\nand does not expire.","href":"/api/assets#money-model"},"56":{"path":["API","Assets"],"title":"Attributes","description":"Gift cards are similar to money but have greater spending restrictions and are\nnot always backed by real currency. Gift cards usually have an expiry date, are\ntypically tied to a small number of merchants, and can only be sent in their\nentirety.","href":"/api/assets#attributes"},"57":{"path":["API","Assets"],"title":"Gift Card Model","description":"Gift cards are similar to money but have greater spending restrictions and are\nnot always backed by real currency. Gift cards usually have an expiry date, are\ntypically tied to a small number of merchants, and can only be sent in their\nentirety.","href":"/api/assets#gift-card-model"},"58":{"path":["API","Assets"],"title":"Attributes","description":"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.","href":"/api/assets#attributes"},"59":{"path":["API","Assets"],"title":"Token Model ","description":"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.","href":"/api/assets#token-model-"},"60":{"path":["API","Assets"],"title":"Attributes","description":"The destParty and srcParty are optionally provided only on transactions of\ntype transfer. Values may include a merchant name, user handle, masked user\nemail, masked user phone, or bank account.","href":"/api/assets#attributes"},"61":{"path":["API","Assets"],"title":"Asset Transaction Model","description":"The destParty and srcParty are optionally provided only on transactions of\ntype transfer. Values may include a merchant name, user handle, masked user\nemail, masked user phone, or bank account.","href":"/api/assets#asset-transaction-model"},"62":{"path":["API","Assets"],"title":"Attributes","description":"","description":"Returns a paginated list of Asset Transactions. This endpoint is currently only supported for quartz asset types.","href":"/api/assets#list-asset-transactions-"},"70":{"path":["API","Assets"],"title":"Attributes","description":"No Attributes.","href":"/api/assets#attributes"},"71":{"path":["API","Assets"],"title":"Archive Asset","description":"Archive supported asset types by asset id. Currently only gift cards may be archived.","href":"/api/assets#archive-asset"},"72":{"path":["API","Assets"],"title":"Attributes","description":"No Attributes.","href":"/api/assets#attributes"},"73":{"path":["API","Assets"],"title":"Errors","description":"","href":"/api/assets#errors"},"74":{"href":"/api/auth","path":["API","Auth"],"title":"Auth","description":"Introduction to Authentication"},"75":{"path":["API","Auth"],"title":"Authenticating API Calls","description":"API calls can be authenticated by either providing an API key in the\n\"X-Api-Key\" header or by providing a user access token in the \"Authorization\"\nheader.","href":"/api/auth#authenticating-api-calls"},"76":{"path":["API","Auth"],"title":"API Keys","description":"API Keys provide enduring access to a single Centrapay account.","href":"/api/auth#api-keys"},"77":{"path":["API","Auth"],"title":"User Access Tokens","description":"User access tokens provide time-limited access to all Centrapay accounts for\nwhich the user is a member. Access tokens are issued using OIDC code flow via\nthe Centrapay OAuth authorization server and login page at auth.centrapay.com.","href":"/api/auth#user-access-tokens"},"78":{"path":["API","Auth"],"title":"Claims","description":"The following table lists the claims which may be be included in a user id token.\nAt minimum, the \"sub\" claim and one of \"phone_number\" or \"email\" will be present.","href":"/api/auth#claims"},"79":{"path":["API","Auth"],"title":"Roles and Permissions","description":"Users and API keys are assigned a role for their associated Centrapay\naccount(s). The permissions granted to the roles are shown in the table below.","href":"/api/auth#roles-and-permissions"},"80":{"path":["API","Auth"],"title":"Account Flags","description":"Some permissions require an additional flag associated to their individual account or the\ntargeted account that owns the resource (they may be the same account). For each permission,\nif there is a flag associated to it then at least one of them must be met.","href":"/api/auth#account-flags"},"81":{"path":["API","Auth"],"title":"Permissions","description":"| Permission | Account Owner | Anon Consumer | Merchant Terminal | External Asset Provider | Cashier |\n| ---------------------------------- | ------------- | ------------- | ----------------- | ----------------------- | ------- |\n| accounts:create | ✅ | | | | |\n| accounts:read | ✅ | | | ✅ | ✅ |\n| accounts:updat | ✅ | | | | |\n| api-keys:create | ✅ | | | | |\n| api-keys:list | ✅ | | | | |\n| api-keys:update | ✅ | | | | |\n| asset-transfers:claim | ✅ | | | ✅ | |\n| asset-transfers:create 👤 🧀 | ✅ | | | ✅ | |\n| asset-transfers:read | ✅ | | | ✅ | |\n| assets:read | ✅ | | | ✅ | |\n| assets:spend 👤 | ✅ | | | | |\n| bank-account-approvals:create | ✅ | | | | |\n| bank-account-requests:authorize | ✅ | | | | |\n| bank-account-requests:create | ✅ | | | | |\n| bank-accounts:create | ✅ | | | | |\n| bank-accounts:read | ✅ | | | | |\n| business:create | ✅ | | | | |\n| business:update | ✅ | | | | |\n| business:read | ✅ | | | | |\n| collections:create 🪙 | ✅ | | | | |\n| collections:read 🪙 | ✅ | | | | |\n| external-assets:create 👤 🧀 | ✅ | | | ✅ | |\n| external-assets:update | ✅ | | | ✅ | |\n| integration-requests:configure | | | | | |\n| integration-requests:create 🗄 | ✅ | | | | |\n| integration-requests:read 🗄 | ✅ | | | | |\n| invitations:accept | ✅ ✸ | | | | |\n| invitations:read | ✅ ✸ | | | | |\n| media-uploads:create | ✅ | | | | |\n| memberships:delete 🗄 | ✅ | | | | |\n| memberships:update | ✅ | | | | |\n| merchants:create 🗄 | ✅ | | | | |\n| merchants:list 🗄 | ✅ | | | | ✅ |\n| merchants:read 🗄 | ✅ | | | | ✅ |\n| merchants:update 🗄 | ✅ | | | | |\n| patron-codes:create | ✅ | | | | |\n| patron-codes:read | ✅ | | ✅ | | ✅ |\n| payment-activities:read | ✅ | | ✅ | | ✅ |\n| payment-conditions:approve | ✅ | | ✅ | | ✅ |\n| payment-requests:cancel 🗄 | ✅ | | ✅ | | ✅ |\n| payment-requests:create 🗄 | ✅ | | ✅ ✸ | | ✅ |\n| payment-requests:pay 🗄 | ✅ ✸ | ✅ ✸ | ✅ | | ✅ ✸ |\n| payment-requests:read | ✅ ✸ | ✅ ✸ | ✅ ✸ | | ✅ ✸ |\n| payment-requests:read-by-shortcode | ✅ | | ✅ | | ✅ |\n| payment-requests:refund 🗄 | ✅ | | ✅ | | ✅ |\n| payment-requests:void 🗄 | ✅ | | ✅ | | ✅ |\n| payment-requests:release 🗄 | ✅ | | ✅ | | ✅ |\n| payment-requests:confirm 🗄 | ✅ | | ✅ | | ✅ |\n| quotas:read | ✅ | | | | |\n| quotas:read | ✅ | | | | |\n| redemption-conditions:create 🪙 | ✅ | | | | |\n| scanned-code:decode | ✅ | | ✅ | | ✅ |\n| tokens:create 🪙 | ✅ | | | | |\n| topups:create 👤 | ✅ | | | | |\n| topups:read | ✅ | | | | |\n| wallets:create | ✅ | | | | |\n| wallets:deposit | ✅ | | | | |\n| wallets:read | ✅ | | | | |\n| wallets:transfer 👤 | ✅ | | | | |\n| wallets:withdraw | ✅ | | | | |","href":"/api/auth#permissions"},"82":{"href":"/api/bank-account-approvals","path":["API","Bank Account Approvals"],"title":"Bank Account Approvals","description":"Bank Account Approval model and related endpoints"},"83":{"path":["API","Bank Account Approvals"],"title":"Bank Account Approval Model","description":"| Name | description |\n| :-------------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |\n| 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. |\n| account-consent | An approved Bank Account Approval of type account-consent provides an access token to read account details from a third-party. |\n| payment-consent | An approved Bank Account Approval of type payment-consent provides an access token for creating payments with a third-party. |","href":"/api/bank-account-approvals#bank-account-approval-model"},"84":{"path":["API","Bank Account Approvals"],"title":"Attributes","description":"| Name | description |\n| :-------------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |\n| 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. |\n| account-consent | An approved Bank Account Approval of type account-consent provides an access token to read account details from a third-party. |\n| payment-consent | An approved Bank Account Approval of type payment-consent provides an access token for creating payments with a third-party. |","href":"/api/bank-account-approvals#attributes"},"85":{"path":["API","Bank Account Approvals"],"title":"Bank Account Approval Types","description":"| Name | description |\n| :-------------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |\n| 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. |\n| account-consent | An approved Bank Account Approval of type account-consent provides an access token to read account details from a third-party. |\n| payment-consent | An approved Bank Account Approval of type payment-consent provides an access token for creating payments with a third-party. |","href":"/api/bank-account-approvals#bank-account-approval-types"},"86":{"path":["API","Bank Account Approvals"],"title":"Bank Account Approval Activity Model","description":"","description":"This endpoint allows you to request a Bank Account Approval.","href":"/api/bank-account-approvals#request-bank-account-approval-"},"89":{"path":["API","Bank Account Approvals"],"title":"Attributes","description":"","description":"This endpoint allows you to retrieve a Bank Account Approval.","href":"/api/bank-account-approvals#get-bank-account-approval-"},"92":{"path":["API","Bank Account Approvals"],"title":"Attributes","description":"No attributes.","href":"/api/bank-account-approvals#attributes"},"93":{"path":["API","Bank Account Approvals"],"title":"Accept Bank Account Approval ","description":"This endpoint allows you to accept a Bank Account Approval.","href":"/api/bank-account-approvals#accept-bank-account-approval-"},"94":{"path":["API","Bank Account Approvals"],"title":"Attributes","description":"","description":"This endpoint allows you to decline a Bank Account Approval.","href":"/api/bank-account-approvals#decline-bank-account-approval-"},"97":{"path":["API","Bank Account Approvals"],"title":"Attributes","description":"","description":"This endpoint allows you to list the Bank Account Approvals for a Bank Account.","href":"/api/bank-account-approvals#list-bank-account-approvals-"},"100":{"path":["API","Bank Account Approvals"],"title":"Attributes","description":"No attributes.","href":"/api/bank-account-approvals#attributes"},"101":{"href":"/api/bank-account-connection-intents","path":["API","Bank Account Connection Intents"],"title":"Bank Account Connection Intents","description":"Bank Account Connection Intent model and related endpoints"},"102":{"path":["API","Bank Account Connection Intents"],"title":"Bank Account Connection Intent Model","description":"| Name | description |\n| :-------------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |\n| 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. |\n| quartz-payment | Initiates an authorization flow for authorizing access to create payments. |","href":"/api/bank-account-connection-intents#bank-account-connection-intent-model"},"103":{"path":["API","Bank Account Connection Intents"],"title":"Bank Account Connection Intent Types","description":"| Name | description |\n| :-------------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |\n| 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. |\n| quartz-payment | Initiates an authorization flow for authorizing access to create payments. |","href":"/api/bank-account-connection-intents#bank-account-connection-intent-types"},"104":{"path":["API","Bank Account Connection Intents"],"title":"Create Bank Account Connection Intent ","description":"This endpoint allows you to create a Bank Account Connection Intent.","href":"/api/bank-account-connection-intents#create-bank-account-connection-intent-"},"105":{"path":["API","Bank Account Connection Intents"],"title":"Attributes","description":"","description":"This endpoint allows you to authorize a Bank Account Connection Intent.","href":"/api/bank-account-connection-intents#authorize-bank-account-connection-intent-"},"108":{"path":["API","Bank Account Connection Intents"],"title":"Attributes","description":"","href":"/api/bank-account-connection-intents#attributes"},"109":{"href":"/api/bank-accounts","path":["API","Bank Accounts"],"title":"Bank Accounts","description":"Bank Account model and related endpoints"},"110":{"path":["API","Bank Accounts"],"title":"Bank Account Model","description":"Types of bank accounts to allow access to different Asset Types.","href":"/api/bank-accounts#bank-account-model"},"111":{"path":["API","Bank Accounts"],"title":"Attributes","description":"Types of bank accounts to allow access to different Asset Types.","href":"/api/bank-accounts#attributes"},"112":{"path":["API","Bank Accounts"],"title":"Bank Account Type ","description":"Types of bank accounts to allow access to different Asset Types.","href":"/api/bank-accounts#bank-account-type-"},"113":{"path":["API","Bank Accounts"],"title":"Bank Account Approval Type Summary Model ","description":"A summary of the Bank Account Approvals for a Bank Account.\nThere is one object per type of Bank Account Approval, which provides a summary of the approval status.","href":"/api/bank-accounts#bank-account-approval-type-summary-model-"},"114":{"path":["API","Bank Accounts"],"title":"Attributes","description":"The Bank Account balance, retrieved using Open Banking flows. The supported Bank Account type is quartz.","href":"/api/bank-accounts#attributes"},"115":{"path":["API","Bank Accounts"],"title":"Bank Account Balance Model ","description":"The Bank Account balance, retrieved using Open Banking flows. The supported Bank Account type is quartz.","href":"/api/bank-accounts#bank-account-balance-model-"},"116":{"path":["API","Bank Accounts"],"title":"Attributes","description":"","description":"This endpoint allows you to retrieve the balance of a Bank Account.","href":"/api/bank-accounts#get-bank-account-balance-"},"126":{"path":["API","Bank Accounts"],"title":"Attributes","description":"No attributes.","href":"/api/bank-accounts#attributes"},"127":{"path":["API","Bank Accounts"],"title":"Errors","description":"","description":"If you're creating new interfaces, please work with Verify Bank Account.","href":"/api/bank-accounts#verify-bank-authority-"},"132":{"path":["API","Bank Accounts"],"title":"Attributes","description":"","description":"If you're creating new interfaces, please work with List Bank Accounts.","href":"/api/bank-accounts#list-bank-authorities-"},"137":{"path":["API","Bank Accounts"],"title":"Attributes","description":"No attributes.","href":"/api/bank-accounts#attributes"},"138":{"path":["API","Bank Accounts"],"title":"Create Bank Authority ","description":"If you're creating new interfaces, please work with Create Bank Account.","href":"/api/bank-accounts#create-bank-authority-"},"139":{"path":["API","Bank Accounts"],"title":"Attributes","description":"","description":"If you're creating new interfaces, please work with Get Bank Account.","href":"/api/bank-accounts#get-bank-authority-"},"142":{"path":["API","Bank Accounts"],"title":"Attributes","description":"No attributes.","href":"/api/bank-accounts#attributes"},"143":{"path":["API","Bank Accounts"],"title":"Errors","description":"","href":"/api/bank-accounts#errors"},"144":{"href":"/api/batch-types/farmlands-external-asset","path":["Exclude","Farmlands External Asset Batch"],"title":"Farmlands External Asset Batch","description":"Farmlands External Asset Batch Models"},"145":{"path":["Exclude","Farmlands External Asset Batch"],"title":"Account Model","description":"Exported Farmlands Account used for importing and updating of a Centrapay Asset.","href":"/api/batch-types/farmlands-external-asset#account-model"},"146":{"path":["Exclude","Farmlands External Asset Batch"],"title":"Attributes","description":"Exported Farmlands Contact and Card information used for authentication, correspondence and payment.","href":"/api/batch-types/farmlands-external-asset#attributes"},"147":{"path":["Exclude","Farmlands External Asset Batch"],"title":"Contact Model","description":"Exported Farmlands Contact and Card information used for authentication, correspondence and payment.","href":"/api/batch-types/farmlands-external-asset#contact-model"},"148":{"path":["Exclude","Farmlands External Asset Batch"],"title":"Attributes","description":"Exported Farmlands Credit Card information used for importing and updating of a Patron Code.","href":"/api/batch-types/farmlands-external-asset#attributes"},"149":{"path":["Exclude","Farmlands External Asset Batch"],"title":"Card Model","description":"Exported Farmlands Credit Card information used for importing and updating of a Patron Code.","href":"/api/batch-types/farmlands-external-asset#card-model"},"150":{"path":["Exclude","Farmlands External Asset Batch"],"title":"Attributes","description":"A complete batch example with all batch types included. For more legible examples please refer to Example Models.","href":"/api/batch-types/farmlands-external-asset#attributes"},"151":{"path":["Exclude","Farmlands External Asset Batch"],"title":"Example JSONL File","description":"A complete batch example with all batch types included. For more legible examples please refer to Example Models.","href":"/api/batch-types/farmlands-external-asset#example-jsonl-file"},"152":{"path":["Exclude","Farmlands External Asset Batch"],"title":"Example Models","description":"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.","href":"/api/batch-types/farmlands-external-asset#example-models"},"153":{"href":"/api/batch-types/verifone-terminal-status","path":["Exclude","Verifone Terminal Status Batch"],"title":"Verifone Terminal Status Batch","description":"Verifone Terminal Status Batch Models"},"154":{"path":["Exclude","Verifone Terminal Status Batch"],"title":"Terminal Status","description":"A complete batch example with all batch types included. For more legible examples please refer to Example Models.","href":"/api/batch-types/verifone-terminal-status#terminal-status"},"155":{"path":["Exclude","Verifone Terminal Status Batch"],"title":"Attributes","description":"A complete batch example with all batch types included. For more legible examples please refer to Example Models.","href":"/api/batch-types/verifone-terminal-status#attributes"},"156":{"path":["Exclude","Verifone Terminal Status Batch"],"title":"Example JSONL File","description":"A complete batch example with all batch types included. For more legible examples please refer to Example Models.","href":"/api/batch-types/verifone-terminal-status#example-jsonl-file"},"157":{"path":["Exclude","Verifone Terminal Status Batch"],"title":"Pretty Printed Example","description":"","href":"/api/batch-types/verifone-terminal-status#pretty-printed-example"},"158":{"href":"/api/batches","path":["API","Batches"],"title":"Batches","description":"Batch model and related endpoints"},"159":{"path":["API","Batches"],"title":"Batch Model","description":"Different stages of a Batch's lifecycle.","href":"/api/batches#batch-model"},"160":{"path":["API","Batches"],"title":"Attributes","description":"Different stages of a Batch's lifecycle.","href":"/api/batches#attributes"},"161":{"path":["API","Batches"],"title":"Batch Lifecycle","description":"Different stages of a Batch's lifecycle.","href":"/api/batches#batch-lifecycle"},"162":{"path":["API","Batches"],"title":"Batch Types","description":"The following table describes the Batch Types supported for loading.","href":"/api/batches#batch-types"},"163":{"path":["API","Batches"],"title":"Error","description":"| Field | Type | Description |\n| :--------- | :-------- | :----------------------------------------------------------- |\n| message | String | A description of what caused the Error. |\n| externalId | String | Field used in debugging in reference to an id from the file. |\n| index | BigNumber | Item offset where the Error was identified in the file. |","href":"/api/batches#error"},"164":{"path":["API","Batches"],"title":"Create Batch","description":"Initialize loading of entities from a batch file.","href":"/api/batches#create-batch"},"165":{"path":["API","Batches"],"title":"Attributes","description":"","description":"This endpoint allows you to create a new Business. If accountId is not provided when creating a Business, then a new org account will be created and associated to the Business.","href":"/api/businesses#create-business-"},"177":{"path":["API","Businesses"],"title":"Attributes","description":"","description":"This endpoint allows you to update a Business.","href":"/api/businesses#update-business-"},"180":{"path":["API","Businesses"],"title":"Attributes","description":"","description":"This endpoint allows you to retrieve a Business by account id.","href":"/api/businesses#get-business-by-account-id-"},"183":{"path":["API","Businesses"],"title":"Attributes","description":"No attributes.","href":"/api/businesses#attributes"},"184":{"path":["API","Businesses"],"title":"Search NZ Company Register ","description":"This endpoint 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.","href":"/api/businesses#search-nz-company-register-"},"185":{"path":["API","Businesses"],"title":"Attributes","description":"No attributes.","href":"/api/businesses#attributes"},"186":{"path":["API","Businesses"],"title":"Get Business Details from NZ Company Register ","description":"This endpoint allows you to retrieve a Business by account id.","href":"/api/businesses#get-business-details-from-nz-company-register-"},"187":{"path":["API","Businesses"],"title":"Attributes","description":"No attributes.","href":"/api/businesses#attributes"},"188":{"path":["API","Businesses"],"title":"Set Business Onboarding Status","description":"This endpoint returns allows you to set the onboarding status of a Business.","href":"/api/businesses#set-business-onboarding-status"},"189":{"path":["API","Businesses"],"title":"Attributes","description":"","href":"/api/businesses#attributes"},"190":{"href":"/api/data-types","path":["API","Data Types"],"title":"Data Types","description":"Introduction to Data Types"},"191":{"path":["API","Data Types"],"title":"Timestamp","description":"A point in time, usually with millisecond precision, represented as an\nISO 8601 date string (eg \"2021-06-11T02:51:11.000Z\"). Timestamps\nare in the UTC timezone as denoted by the \"Z\" suffix.","href":"/api/data-types#timestamp"},"192":{"path":["API","Data Types"],"title":"BigNumber","description":"A number, represented as a String, which can have arbitrary size or precision.\nMost Centrapay APIs that deal with transactable value (ie. assets, payments,\netc) represent the value as BigNumbers. Depending on the context, a BigNumber\nmay be used to represent an integer or a decimal amount.","href":"/api/data-types#bignumber"},"193":{"path":["API","Data Types"],"title":"Monetary","description":"A monetary amount in a currency, represented as an Object. The amount is\nusually an integer in the smallest denomination for the currency (ie cents) but\nmay be a decimal value for some currencies (eg Bitcoin). The currency is\ntypically represented as an ISO 4217 code.","href":"/api/data-types#monetary"},"194":{"path":["API","Data Types"],"title":"Fields","description":"| Name | Type | Description |\n| -------- | ----------------------- | ---------------------------------------------------------- |\n| amount | BigNumber | Value in the currency's smallest denomination (eg. cents). |\n| currency | String | Currency code (eg. \"NZD\"). |","href":"/api/data-types#fields"},"195":{"path":["API","Data Types"],"title":"CRN","description":"A Centrapay Resource Name (CRN) is a colon-delimited String that uniquely\nidentifies any Centrapay resource.","href":"/api/data-types#crn"},"196":{"path":["API","Data Types"],"title":"Location","description":"A location's represented as an Object with properties to denote the location both absolute and\nby locality.","href":"/api/data-types#location"},"197":{"path":["API","Data Types"],"title":"Required Fields","description":"| Name | Type | Description |\n| ------- | ------ | -------------------------------------------------------------------------------------- |\n| street | String | Unit, number, and name of street address. |\n| city | String | City of location. |\n| country | String | ISO 3166 Country code. (eg. \"NZ\"). |","href":"/api/data-types#required-fields"},"198":{"path":["API","Data Types"],"title":"Optional Fields","description":"| Name | Type | Description |\n| -------- | ------ | ------------------------------------------------------------------------------------------------------------- |\n| lat | Number | Absolute latitude coordinate. If you don't provide this, we will automatically infer this from your address. |\n| lng | Number | Absolute longitude coordinate. If you don't provide this, we will automatically infer this from your address. |\n| suburb | String | Suburb of location. |\n| postCode | String | Post or Zip code of location. |\n| state | String | The state or region of the location (eg. \"Auckland\"). |","href":"/api/data-types#optional-fields"},"199":{"path":["API","Data Types"],"title":"PhoneNumber","description":"A phone number, represented in E.123 international notation (eg \"+6421537663\"). We usually use this for receiving text messages.","href":"/api/data-types#phonenumber"},"200":{"href":"/api/external-assets","path":["API","External Assets"],"title":"External Assets","description":"External Assets endpoint documentation"},"201":{"path":["API","External Assets"],"title":"Load an External Asset","description":"Load an asset from a supported third-party issuer. Asset details will be obtained from the issuer.","href":"/api/external-assets#load-an-external-asset"},"202":{"path":["API","External Assets"],"title":"Attributes","description":"","href":"/api/external-assets#attributes"},"203":{"path":["API","External Assets"],"title":"Errors","description":"","href":"/api/external-assets#errors"},"204":{"href":"/api/funds-transfers","path":["API","Funds Transfers"],"title":"Funds Transfers","description":"Endpoints for managing Funds Transfers"},"205":{"path":["API","Funds Transfers"],"title":"Create a Top Up","description":"This endpoint allows you to create a topup.","href":"/api/funds-transfers#create-a-top-up"},"206":{"path":["API","Funds Transfers"],"title":"Attributes","description":"","description":"This endpoint allows you to list the Top Ups for an account.","href":"/api/funds-transfers#list-top-ups-for-an-account-"},"213":{"path":["API","Funds Transfers"],"title":"Attributes","description":"No attributes.","href":"/api/funds-transfers#attributes"},"214":{"path":["API","Funds Transfers"],"title":"Create Withdrawal ","description":"This endpoint allows you to create a withdrawal.","href":"/api/funds-transfers#create-withdrawal-"},"215":{"path":["API","Funds Transfers"],"title":"Attributes","description":"","description":"This endpoint allows you to retrieve a Withdrawal by id.","href":"/api/funds-transfers#get-withdrawal-"},"218":{"path":["API","Funds Transfers"],"title":"Attributes","description":"No attributes.","href":"/api/funds-transfers#attributes"},"219":{"path":["API","Funds Transfers"],"title":"Errors","description":"","description":"This endpoint allows you to list the withdrawals for an Account.","href":"/api/funds-transfers#list-withdrawals-for-an-account-"},"221":{"path":["API","Funds Transfers"],"title":"Attributes","description":"No attributes.","href":"/api/funds-transfers#attributes"},"222":{"path":["API","Funds Transfers"],"title":"Abort Funds Transfer","description":"This endpoint allows you to abort a Funds Transfer.","href":"/api/funds-transfers#abort-funds-transfer"},"223":{"path":["API","Funds Transfers"],"title":"Attributes","description":"No attributes.","href":"/api/funds-transfers#attributes"},"224":{"path":["API","Funds Transfers"],"title":"Errors","description":"","href":"/api/funds-transfers#errors"},"225":{"href":"/api/http-status-codes","path":["API","HTTP Status Codes"],"title":"HTTP Status Codes","description":"Introduction to HTTP Status Codes"},"226":{"path":["API","HTTP Status Codes"],"title":"200 Ok","description":"Everything's ok. Enjoy your well formed response!","href":"/api/http-status-codes#200-ok"},"227":{"path":["API","HTTP Status Codes"],"title":"400 Malformed Request","description":"This is a syntax failure. When you get these back, your application needs to change the way it\nbehaves in order to get back the resource that you're after.","href":"/api/http-status-codes#400-malformed-request"},"228":{"path":["API","HTTP Status Codes"],"title":"Debugging","description":"API key or JWT is missing, expired or invalid. Go look at our Auth documentation.","href":"/api/http-status-codes#debugging"},"229":{"path":["API","HTTP Status Codes"],"title":"401 Unauthorized","description":"API key or JWT is missing, expired or invalid. Go look at our Auth documentation.","href":"/api/http-status-codes#401-unauthorized"},"230":{"path":["API","HTTP Status Codes"],"title":"403 Forbidden","description":"A 403 status indicates resource missing, permission denied or\nbusiness rule violation.","href":"/api/http-status-codes#403-forbidden"},"231":{"path":["API","HTTP Status Codes"],"title":"Resource missing or permission denied","description":"When the resource exists and access is authorized but some other business rule\nis violated then a 403 is returned. Additional information will be included in\nthe \"message\" field of the response body. The possible values for the \"message\"\nfield will be documented on each endpoint.","href":"/api/http-status-codes#resource-missing-or-permission-denied"},"232":{"path":["API","HTTP Status Codes"],"title":"Business rule violated","description":"When the resource exists and access is authorized but some other business rule\nis violated then a 403 is returned. Additional information will be included in\nthe \"message\" field of the response body. The possible values for the \"message\"\nfield will be documented on each endpoint.","href":"/api/http-status-codes#business-rule-violated"},"233":{"path":["API","HTTP Status Codes"],"title":"404 Route Not Found","description":"Variant on a 400, there's a bug in your code that means you've got a typo in\nthe URL or HTTP method. Please check against examples in our documentation.","href":"/api/http-status-codes#404-route-not-found"},"234":{"path":["API","HTTP Status Codes"],"title":"429 Too Many Requests","description":"Centrapay API rate limits have been exceeded.","href":"/api/http-status-codes#429-too-many-requests"},"235":{"path":["API","HTTP Status Codes"],"title":"Debugging","description":"If you get a 500 level error, something has gone wrong on our end. Retrying\nshould solve the issue. Usually a Centrapay Engineer will investigate but\nbug reports are also welcome at integrations@centrapay.com.","href":"/api/http-status-codes#debugging"},"236":{"path":["API","HTTP Status Codes"],"title":"5xx Server Error","description":"If you get a 500 level error, something has gone wrong on our end. Retrying\nshould solve the issue. Usually a Centrapay Engineer will investigate but\nbug reports are also welcome at integrations@centrapay.com.","href":"/api/http-status-codes#5xx-server-error"},"237":{"href":"/api/integration-requests","path":["API","Integration Requests"],"title":"Integration Requests","description":"Integration Request models and related endpoints"},"238":{"path":["API","Integration Requests"],"title":"Integration Request Model","description":"| Name | Description |\n| -------- | ---------------------------------------------------------- |\n| epay | Asset provider ePay |\n| invenco | Terminal vendor invenco |\n| skyzer | Terminal vendor skyzer |\n| smartpay | Terminal vendor smartpay |\n| verifone | Terminal vendor Verifone |\n| vista | Terminal vendor vista |\n| windcave | Terminal vendor Windcave |","href":"/api/integration-requests#integration-request-model"},"239":{"path":["API","Integration Requests"],"title":"Attributes","description":"| Name | Description |\n| -------- | ---------------------------------------------------------- |\n| epay | Asset provider ePay |\n| invenco | Terminal vendor invenco |\n| skyzer | Terminal vendor skyzer |\n| smartpay | Terminal vendor smartpay |\n| verifone | Terminal vendor Verifone |\n| vista | Terminal vendor vista |\n| windcave | Terminal vendor Windcave |","href":"/api/integration-requests#attributes"},"240":{"path":["API","Integration Requests"],"title":"Terminal","description":"| Name | Description |\n| -------- | ---------------------------------------------------------- |\n| epay | Asset provider ePay |\n| invenco | Terminal vendor invenco |\n| skyzer | Terminal vendor skyzer |\n| smartpay | Terminal vendor smartpay |\n| verifone | Terminal vendor Verifone |\n| vista | Terminal vendor vista |\n| windcave | Terminal vendor Windcave |","href":"/api/integration-requests#terminal"},"241":{"path":["API","Integration Requests"],"title":"Product","description":"| Name | Description |\n| -------- | ---------------------------------------------------------- |\n| epay | Asset provider ePay |\n| invenco | Terminal vendor invenco |\n| skyzer | Terminal vendor skyzer |\n| smartpay | Terminal vendor smartpay |\n| verifone | Terminal vendor Verifone |\n| vista | Terminal vendor vista |\n| windcave | Terminal vendor Windcave |","href":"/api/integration-requests#product"},"242":{"path":["API","Integration Requests"],"title":"Integration Types","description":"| Name | Description |\n| -------- | ---------------------------------------------------------- |\n| epay | Asset provider ePay |\n| invenco | Terminal vendor invenco |\n| skyzer | Terminal vendor skyzer |\n| smartpay | Terminal vendor smartpay |\n| verifone | Terminal vendor Verifone |\n| vista | Terminal vendor vista |\n| windcave | Terminal vendor Windcave |","href":"/api/integration-requests#integration-types"},"243":{"path":["API","Integration Requests"],"title":"Create an Integration Request ","description":"This endpoint allows you to create an Integration Request.","href":"/api/integration-requests#create-an-integration-request-"},"244":{"path":["API","Integration Requests"],"title":"Attributes","description":"","description":"This endpoint allows you to get an Integration Request.","href":"/api/integration-requests#get-an-integration-request-"},"246":{"path":["API","Integration Requests"],"title":"Attributes","description":"No attributes.","href":"/api/integration-requests#attributes"},"247":{"path":["API","Integration Requests"],"title":"Search Merchants","description":"Returns a paginated response of Integration Requests.","href":"/api/integration-requests#search-merchants"},"248":{"path":["API","Integration Requests"],"title":"Query Parameters","description":"","description":"This endpoint allows you to supply configuration values for the Integration Request.","href":"/api/integration-requests#configure-integration-request-"},"250":{"path":["API","Integration Requests"],"title":"Attributes","description":"","description":"This endpoint allows you to get the configuration values for the Integration Request.","href":"/api/integration-requests#get-integration-request-configuration-"},"252":{"path":["API","Integration Requests"],"title":"Attributes","description":"No attributes.","href":"/api/integration-requests#attributes"},"253":{"path":["API","Integration Requests"],"title":"Activate Integration Request ","description":"This endpoint allows you to activate an Integration Request.","href":"/api/integration-requests#activate-integration-request-"},"254":{"path":["API","Integration Requests"],"title":"Attributes","description":"No attributes.","href":"/api/integration-requests#attributes"},"255":{"path":["API","Integration Requests"],"title":"Errors","description":"","description":"This endpoint allows you to delete an Integration Request.","href":"/api/integration-requests#delete-integration-request-"},"257":{"path":["API","Integration Requests"],"title":"Attributes","description":"No attributes.","href":"/api/integration-requests#attributes"},"258":{"href":"/api/integrations","path":["API","Integrations"],"title":"Integrations","description":"Centrapay Integration documentation"},"259":{"href":"/api/introduction","path":["API","Introduction"],"title":"Introduction","description":"Introduction to the API Reference"},"260":{"href":"/api/invitations","path":["API","Invitations"],"title":"Invitations","description":"Invitation model and related endpoints"},"261":{"path":["API","Invitations"],"title":"Invitation Model","description":"","description":"This endpoint allows you to create an Invitation.","href":"/api/invitations#create-invitation-"},"266":{"path":["API","Invitations"],"title":"Attributes","description":"","description":"This endpoint allows you to retrieve an Invitation by code.","href":"/api/invitations#get-invitation-by-code-"},"269":{"path":["API","Invitations"],"title":"Attributes","description":"No attributes.","href":"/api/invitations#attributes"},"270":{"path":["API","Invitations"],"title":"List Invitations by Account Id ","description":"This endpoint allows you list Invitations for an Account.","href":"/api/invitations#list-invitations-by-account-id-"},"271":{"path":["API","Invitations"],"title":"Attributes","description":"No attributes.","href":"/api/invitations#attributes"},"272":{"path":["API","Invitations"],"title":"Accept Invitation ","description":"This endpoint allows you to accept an Invitation.","href":"/api/invitations#accept-invitation-"},"273":{"path":["API","Invitations"],"title":"Attributes","description":"","description":"This endpoint allows you to revoke an Invitation.","href":"/api/invitations#revoke-invitation-"},"276":{"path":["API","Invitations"],"title":"Attributes","description":"No attributes","href":"/api/invitations#attributes"},"277":{"path":["API","Invitations"],"title":"Errors","description":"","href":"/api/invitations#errors"},"278":{"href":"/api/legacy-payment-requests","path":["API","Legacy Payment Requests"],"title":"Legacy Payment Requests","description":"Legacy Payment Request models and related endpoints (deprecated)"},"279":{"path":["API","Legacy Payment Requests"],"title":"Payment Request Model ","description":"The \"ledger\" parameter indicates which payment option has been selected to pay\nthe payment request. The selected payment option must be one of the options\navailable for the payment request as per the payments array in the\nrequests.create and requests.info responses.","href":"/api/legacy-payment-requests#payment-request-model-"},"280":{"path":["API","Legacy Payment Requests"],"title":"Attributes","description":"The \"ledger\" parameter indicates which payment option has been selected to pay\nthe payment request. The selected payment option must be one of the options\navailable for the payment request as per the payments array in the\nrequests.create and requests.info responses.","href":"/api/legacy-payment-requests#attributes"},"281":{"path":["API","Legacy Payment Requests"],"title":"Payment Options Model ","description":"The \"ledger\" parameter indicates which payment option has been selected to pay\nthe payment request. The selected payment option must be one of the options\navailable for the payment request as per the payments array in the\nrequests.create and requests.info responses.","href":"/api/legacy-payment-requests#payment-options-model-"},"282":{"path":["API","Legacy Payment Requests"],"title":"Attributes","description":"The \"ledger\" parameter indicates which payment option has been selected to pay\nthe payment request. The selected payment option must be one of the options\navailable for the payment request as per the payments array in the\nrequests.create and requests.info responses.","href":"/api/legacy-payment-requests#attributes"},"283":{"path":["API","Legacy Payment Requests"],"title":"Paid By Model ","description":"The \"ledger\" parameter indicates which payment option has been selected to pay\nthe payment request. The selected payment option must be one of the options\navailable for the payment request as per the payments array in the\nrequests.create and requests.info responses.","href":"/api/legacy-payment-requests#paid-by-model-"},"284":{"path":["API","Legacy Payment Requests"],"title":"Attributes","description":"The \"ledger\" parameter indicates which payment option has been selected to pay\nthe payment request. The selected payment option must be one of the options\navailable for the payment request as per the payments array in the\nrequests.create and requests.info responses.","href":"/api/legacy-payment-requests#attributes"},"285":{"path":["API","Legacy Payment Requests"],"title":"Ledger and Authorization Values","description":"The \"ledger\" parameter indicates which payment option has been selected to pay\nthe payment request. The selected payment option must be one of the options\navailable for the payment request as per the payments array in the\nrequests.create and requests.info responses.","href":"/api/legacy-payment-requests#ledger-and-authorization-values"},"286":{"path":["API","Legacy Payment Requests"],"title":"Create a Payment Request ","description":"This endpoint allows you to create a Payment Request.","href":"/api/legacy-payment-requests#create-a-payment-request-"},"287":{"path":["API","Legacy Payment Requests"],"title":"Attributes","description":"","description":"This endpoint allows you to receive Payment Request information.","href":"/api/legacy-payment-requests#get-a-payment-request-"},"290":{"path":["API","Legacy Payment Requests"],"title":"Attributes","description":"","description":"This endpoint allows you to pay a Payment Request.","href":"/api/legacy-payment-requests#pay-a-payment-request-"},"292":{"path":["API","Legacy Payment Requests"],"title":"Attributes","description":"","description":"This endpoint allows you to cancel a Payment Request.","href":"/api/legacy-payment-requests#cancel-a-payment-request-"},"295":{"path":["API","Legacy Payment Requests"],"title":"Attributes","description":"","description":"This endpoint allows you to void a Payment Request.","href":"/api/legacy-payment-requests#void-a-payment-request-"},"298":{"path":["API","Legacy Payment Requests"],"title":"Attributes","description":"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.\nAfter 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.","href":"/api/legacy-payment-requests#attributes"},"299":{"path":["API","Legacy Payment Requests"],"title":"Errors","description":"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.\nAfter 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.","href":"/api/legacy-payment-requests#errors"},"300":{"path":["API","Legacy Payment Requests"],"title":"Refund a Transaction ","description":"Refunding a transaction can be done with or without an external reference.","href":"/api/legacy-payment-requests#refund-a-transaction-"},"301":{"path":["API","Legacy Payment Requests"],"title":"Refund without external reference","description":"If you refund a transaction without providing an external reference, you\nwill get a successful response for the first request and then an\nALREADY_REFUNDED message for any refund requests that follow for the same\ntransaction, unless an external reference is provided.","href":"/api/legacy-payment-requests#refund-without-external-reference"},"302":{"path":["API","Legacy Payment Requests"],"title":"Refund with external reference","description":"If you provide an external reference then a transaction can be refunded\nmultiple times provided that the external reference is unique for each\nrefund request. When a duplicate external reference is provided when\nattempting to refund the same transaction we return a successful response if\nthe amount of the request is the same both times but do not process another\nrefund, this is because we assume it to be a repeat request. If the amount\nis different you will get a REPEAT_REFERENCE error message.","href":"/api/legacy-payment-requests#refund-with-external-reference"},"303":{"path":["API","Legacy Payment Requests"],"title":"Refund a Pre Auth Payment Request with Confirmations","description":"The legacy refund endpoint cannot be used to refund Pre Auth Payment Requests with Confirmations. Please use the current refund endpoint instead.","href":"/api/legacy-payment-requests#refund-a-pre-auth-payment-request-with-confirmations"},"304":{"path":["API","Legacy Payment Requests"],"title":"Attributes","description":"Webhook notifications are sent for significant Payment life-cycle\nevents. The Webhook endpoint is notified by sending an HTTP POST request to the\nnotifyUrl defined in the Payment Request.","href":"/api/legacy-payment-requests#attributes"},"305":{"path":["API","Legacy Payment Requests"],"title":"Errors","description":"Webhook notifications are sent for significant Payment life-cycle\nevents. The Webhook endpoint is notified by sending an HTTP POST request to the\nnotifyUrl defined in the Payment Request.","href":"/api/legacy-payment-requests#errors"},"306":{"path":["API","Legacy Payment Requests"],"title":"Webhooks ","description":"Webhook notifications are sent for significant Payment life-cycle\nevents. The Webhook endpoint is notified by sending an HTTP POST request to the\nnotifyUrl defined in the Payment Request.","href":"/api/legacy-payment-requests#webhooks-"},"307":{"path":["API","Legacy Payment Requests"],"title":"Life-cycle Events That Trigger Webhooks","description":"The supported event types that will be notified to the Payment Requests webhook\nand the associated \"transactionType\" value that will be sent in the payload\nare:","href":"/api/legacy-payment-requests#life-cycle-events-that-trigger-webhooks"},"308":{"path":["API","Legacy Payment Requests"],"title":"Payment Request Cancelled","description":"A payment request can be cancelled by either calling the requests.cancel\nor requests.void endpoint before a request has been paid successfully.\nWhen a request has been cancelled we send a JWT that when decoded matches the\nPayment Request Cancelled example in the Decoded Webhook JWT Examples\nsection below.","href":"/api/legacy-payment-requests#payment-request-cancelled"},"309":{"path":["API","Legacy Payment Requests"],"title":"Payment Request Expired","description":"A payment request expires two minutes after being created if it hasn't been\ncancelled, or paid. When a request has expired we send a JWT that when\ndecoded matches the Payment Request Cancelled example in the Decoded\nWebhook JWT Examples section below with the transactionType set to EXPIRED.","href":"/api/legacy-payment-requests#payment-request-expired"},"310":{"path":["API","Legacy Payment Requests"],"title":"Transaction Completed","description":"A transaction is considered complete when requests.pay is called with\nparameters that satisfy a payment request and the request has been paid\nsuccessfully. When a transaction has been completed we send a JWT that when\ndecoded matches the Transaction Completed example in the Decoded Webhook\nJWT Examples section below.","href":"/api/legacy-payment-requests#transaction-completed"},"311":{"path":["API","Legacy Payment Requests"],"title":"Transaction Refunded","description":"A transaction can be refunded one to many times and each time a transaction\nhas been refunded successfully we notify the webhook associated with the\noriginal payment request. A transaction can be refunded when\ntransactions.refund has been called for a partial or full refund, or when\nrequests.void is called for a request that has been paid. When a\ntransaction has been refunded we send a JWT that when decoded matches the\nTransaction Completed example in the Decoded Webhook JWT Examples section\nbelow but with transactionType set to REFUND.","href":"/api/legacy-payment-requests#transaction-refunded"},"312":{"path":["API","Legacy Payment Requests"],"title":"Webhook Payload","description":"The body of the webhook is a JSON document with the following format:","href":"/api/legacy-payment-requests#webhook-payload"},"313":{"path":["API","Legacy Payment Requests"],"title":"Webhook Payload Fields","description":"| Property | Description |\n|:----------------|:------------------------------------------------------------|\n| transactionId | Id of the transaction |\n| transactionType | Indicates which event triggered the notification message |\n| state | Current state of the transaction |\n| ledger | The ledger at which the authorization was processed |\n| amount | Transaction amount in the lowest denomination available |\n| createdAt | Timestamp at which the request was created |\n| updatedAt | Timestamp at which the request was updated |\n| type | The payment type used by the issuer to reconcile settlement |\n| request | Request object, see details at [requests.info][] |\n| authCode | Authorization code used to settle this transaction |","href":"/api/legacy-payment-requests#webhook-payload-fields"},"314":{"path":["API","Legacy Payment Requests"],"title":"Webhook JWT Validation","description":"A webhook JWT can be validated by checking the signature against the Centrapay\nWebhook public key:","href":"/api/legacy-payment-requests#webhook-jwt-validation"},"315":{"path":["API","Legacy Payment Requests"],"title":"Decoded Webhook JWT Examples","description":"","href":"/api/legacy-payment-requests#decoded-webhook-jwt-examples"},"316":{"href":"/api/managed-integrations","path":["API","Managed Integrations"],"title":"Managed Integrations","description":"Managed Integration model and related endpoints"},"317":{"path":["API","Managed Integrations"],"title":"Managed Integration Model","description":"A summary of the Invitation for a Managed Integration.","href":"/api/managed-integrations#managed-integration-model"},"318":{"path":["API","Managed Integrations"],"title":"Attributes","description":"A summary of the Invitation for a Managed Integration.","href":"/api/managed-integrations#attributes"},"319":{"path":["API","Managed Integrations"],"title":"Invitation Summary Model","description":"A summary of the Invitation for a Managed Integration.","href":"/api/managed-integrations#invitation-summary-model"},"320":{"path":["API","Managed Integrations"],"title":"Attributes","description":"","description":"This endpoint allows you to upload a media file to Centrapay. It returns a presigned URL that can be used to download the media file.","href":"/api/media-uploads#create-a-presigned-url-for-media-upload-"},"332":{"path":["API","Media Uploads"],"title":"Attributes","description":"","description":"This endpoint allows you to retrieve the upload location of a media file.","href":"/api/media-uploads#get-media-upload-location-"},"334":{"path":["API","Media Uploads"],"title":"Attributes","description":"No attributes.","href":"/api/media-uploads#attributes"},"335":{"href":"/api/merchant-configs","path":["API","Merchant Configs"],"title":"Merchant Configs","description":"Merchant Config model and related endpoints"},"336":{"path":["API","Merchant Configs"],"title":"Merchant Config Model","description":"See Asset Types for values that may be present in the type field.","href":"/api/merchant-configs#merchant-config-model"},"337":{"path":["API","Merchant Configs"],"title":"Attributes","description":"See Asset Types for values that may be present in the type field.","href":"/api/merchant-configs#attributes"},"338":{"path":["API","Merchant Configs"],"title":"Payment Option Config Model","description":"See Asset Types for values that may be present in the type field.","href":"/api/merchant-configs#payment-option-config-model"},"339":{"path":["API","Merchant Configs"],"title":"Attributes","description":"See Asset Types for values that may be present in the type field.","href":"/api/merchant-configs#attributes"},"340":{"path":["API","Merchant Configs"],"title":"Create Merchant Config","description":"This endpoint allows you to create a Merchant Config for a Merchant.","href":"/api/merchant-configs#create-merchant-config"},"341":{"path":["API","Merchant Configs"],"title":"Attributes","description":"","description":"Returns a paginated list of Merchants which belong to the authenticated subject.","href":"/api/merchants#list-merchants-"},"378":{"path":["API","Merchants"],"title":"Attributes","description":"No attributes.","href":"/api/merchants#attributes"},"379":{"href":"/api/pagination","path":["API","Pagination"],"title":"Pagination","description":"Introduction to Pagination"},"380":{"path":["API","Pagination"],"title":"Pagination Model","description":"","href":"/api/pagination#pagination-model"},"381":{"path":["API","Pagination"],"title":"Example","description":"","href":"/api/pagination#example"},"382":{"href":"/api/patron-codes","path":["API","Patron Codes"],"title":"Patron Codes","description":"Patron Code model and related endpoints"},"383":{"path":["API","Patron Codes"],"title":"Patron Code Model","description":"✩ Barcode is a 16 digit number. The first 6 digits are a Centrapay defined prefix, then a 9 digit\ncode, then a luhn checksum digit.","href":"/api/patron-codes#patron-code-model"},"384":{"path":["API","Patron Codes"],"title":"Attributes","description":"✩ Barcode is a 16 digit number. The first 6 digits are a Centrapay defined prefix, then a 9 digit\ncode, then a luhn checksum digit.","href":"/api/patron-codes#attributes"},"385":{"path":["API","Patron Codes"],"title":"Test Scenario Name","description":"This field is used to inject behavior into a Payment Request when the\ngenerated barcode is supplied on creation. If a Test Scenario Name is\ndefined on a Patron Code, it is considered a test resource and can only\nbe used with Payment Requests that will have a liveness of 'test'. The Asset Type\ncentrapay.nzd.test is required to run test scenarios.","href":"/api/patron-codes#test-scenario-name"},"386":{"path":["API","Patron Codes"],"title":"Create Patron Code","description":"This endpoint allows you to create a Patron Code. You can find payment request information attached to a Patron Code by polling for the Payment Request using the transacting APIs.","href":"/api/patron-codes#create-patron-code"},"387":{"path":["API","Patron Codes"],"title":"Attributes","description":"No attributes.","href":"/api/patron-codes#attributes"},"388":{"path":["API","Patron Codes"],"title":"Get Patron Code","description":"This endpoint allows you to retrieve a Patron Code by id.","href":"/api/patron-codes#get-patron-code"},"389":{"path":["API","Patron Codes"],"title":"Attributes","description":"No attributes.","href":"/api/patron-codes#attributes"},"390":{"path":["API","Patron Codes"],"title":"Get Patron Code By Barcode","description":"This endpoint allows you to retrieve a Patron Code by barcode.","href":"/api/patron-codes#get-patron-code-by-barcode"},"391":{"path":["API","Patron Codes"],"title":"Attributes","description":"No attributes.","href":"/api/patron-codes#attributes"},"392":{"path":["API","Patron Codes"],"title":"Errors","description":"","href":"/api/patron-codes#errors"},"393":{"href":"/api/payment-requests","path":["API","Payment Requests"],"title":"Payment Requests","description":"Payment request models and related endpoints"},"394":{"path":["API","Payment Requests"],"title":"Payment Request Model","description":"⭐️ 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.","href":"/api/payment-requests#payment-request-model"},"395":{"path":["API","Payment Requests"],"title":"Attributes","description":"⭐️ 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.","href":"/api/payment-requests#attributes"},"396":{"path":["API","Payment Requests"],"title":"Payment Option Model","description":"⭐️ 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.","href":"/api/payment-requests#payment-option-model"},"397":{"path":["API","Payment Requests"],"title":"Attributes","description":"⭐️ 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.","href":"/api/payment-requests#attributes"},"398":{"path":["API","Payment Requests"],"title":"Accepted Collections","description":"If a Payment Request contains a centrapay.token.* Payment Option, an array of Accepted Collections will be present inside the centrapay.token Payment Option.\nThe 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.","href":"/api/payment-requests#accepted-collections"},"399":{"path":["API","Payment Requests"],"title":"Attributes","description":"Some Asset Types require conditional approval to pay. Possible Payment Conditions include confirming proof of ID\nor confirming a promotional item was purchased.","href":"/api/payment-requests#attributes"},"400":{"path":["API","Payment Requests"],"title":"Payment Condition Model","description":"Some Asset Types require conditional approval to pay. Possible Payment Conditions include confirming proof of ID\nor confirming a promotional item was purchased.","href":"/api/payment-requests#payment-condition-model"},"401":{"path":["API","Payment Requests"],"title":"Attributes","description":"An order item for which payment is requested.\nThe 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.","href":"/api/payment-requests#attributes"},"402":{"path":["API","Payment Requests"],"title":"Line Item Model","description":"An order item for which payment is requested.\nThe 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.","href":"/api/payment-requests#line-item-model"},"403":{"path":["API","Payment Requests"],"title":"Attributes","description":"The Paid By provides a summary of the transactions after the Payment Request was paid.","href":"/api/payment-requests#attributes"},"404":{"path":["API","Payment Requests"],"title":"Product Classification","description":"The Paid By provides a summary of the transactions after the Payment Request was paid.","href":"/api/payment-requests#product-classification"},"405":{"path":["API","Payment Requests"],"title":"Attributes","description":"The Paid By provides a summary of the transactions after the Payment Request was paid.","href":"/api/payment-requests#attributes"},"406":{"path":["API","Payment Requests"],"title":"Paid By Model","description":"The Paid By provides a summary of the transactions after the Payment Request was paid.","href":"/api/payment-requests#paid-by-model"},"407":{"path":["API","Payment Requests"],"title":"Attributes","description":"A Payment Activity records a transaction that has happened on a Payment Request.\nPayment Activities are created when a Payment Request has been created, paid, refunded, cancelled, or expired.","href":"/api/payment-requests#attributes"},"408":{"path":["API","Payment Requests"],"title":"Asset Totals","description":"A Payment Activity records a transaction that has happened on a Payment Request.\nPayment Activities are created when a Payment Request has been created, paid, refunded, cancelled, or expired.","href":"/api/payment-requests#asset-totals"},"409":{"path":["API","Payment Requests"],"title":"Attributes","description":"A Payment Activity records a transaction that has happened on a Payment Request.\nPayment Activities are created when a Payment Request has been created, paid, refunded, cancelled, or expired.","href":"/api/payment-requests#attributes"},"410":{"path":["API","Payment Requests"],"title":"Payment Activity Model","description":"A Payment Activity records a transaction that has happened on a Payment Request.\nPayment Activities are created when a Payment Request has been created, paid, refunded, cancelled, or expired.","href":"/api/payment-requests#payment-activity-model"},"411":{"path":["API","Payment Requests"],"title":"Attributes","description":"| Name | Description |\n| ----------------- | ----------------------------------------------------------------------------------------------------------- |\n| request | Payment Request was created. |\n| preAuthRequest | Payment Request was created with the preAuth flag set to \"true\". |\n| paid | Payment Request was paid. |\n| payment | A payment was made towards the Payment Request. |\n| refund | Funds were returned to the shopper. |\n| cancellation | Payment Request was cancelled by the merchant or the shopper. |\n| expiry | Payment Request wasn't paid before time out. |\n| accept-condition | A Payment Condition was accepted. |\n| decline-condition | A Payment Condition was declined. |\n| authorization | A Pre Auth Payment Request was approved and confirmations can be made against it. |\n| confirmation | Funds on a Pre Auth have been drawn down on. |\n| release | Pre Auth has been finalised and any remaining funds from Authorization have been returned. |","href":"/api/payment-requests#attributes"},"412":{"path":["API","Payment Requests"],"title":"Payment Activity Types","description":"| Name | Description |\n| ----------------- | ----------------------------------------------------------------------------------------------------------- |\n| request | Payment Request was created. |\n| preAuthRequest | Payment Request was created with the preAuth flag set to \"true\". |\n| paid | Payment Request was paid. |\n| payment | A payment was made towards the Payment Request. |\n| refund | Funds were returned to the shopper. |\n| cancellation | Payment Request was cancelled by the merchant or the shopper. |\n| expiry | Payment Request wasn't paid before time out. |\n| accept-condition | A Payment Condition was accepted. |\n| decline-condition | A Payment Condition was declined. |\n| authorization | A Pre Auth Payment Request was approved and confirmations can be made against it. |\n| confirmation | Funds on a Pre Auth have been drawn down on. |\n| release | Pre Auth has been finalised and any remaining funds from Authorization have been returned. |","href":"/api/payment-requests#payment-activity-types"},"413":{"path":["API","Payment Requests"],"title":"Cancellation Reasons","description":"| Reason | Description |\n| ---------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |\n| CANCELLED_BY_MERCHANT | The merchant cancelled the Payment Request by calling the cancel or void endpoint. |\n| CANCELLED_BY_PATRON | The patron cancelled the transaction. |\n| PATRON_CODE_INVALID | The patron code on the Payment Request was invalid. |\n| PAYMENT_FAILED | The Payment Request failed for an unknown reason. |\n| PATRON_CODE_EXPIRED | The patron code on the Payment Request has expired. |\n| DECLINED_BY_PATRON | The payment was declined by the patron during approval steps. |\n| DECLINED_BY_MERCHANT | The payment was declined by the merchant during approval steps. |\n| 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. |\n| PAYMENT_REQUEST_EXPIRED | The Payment Request has expired. |\n| NO_AVAILABLE_PAYMENT_OPTIONS | No payment options match the requested payment parameters. |\n| INACTIVE_ASSET | The asset used to pay the Payment Request is inactive. |","href":"/api/payment-requests#cancellation-reasons"},"414":{"path":["API","Payment Requests"],"title":"Create a Payment Request","description":"This endpoint allows you to create a Payment Request.","href":"/api/payment-requests#create-a-payment-request"},"415":{"path":["API","Payment Requests"],"title":"Attributes","description":"","description":"Update a user’s mutable attributes. At least one field must be provided in the request.","href":"/api/profiles#update-profile-"},"451":{"path":["API","Profiles"],"title":"Attributes","description":"","description":"This endpoint allows you to retrieve a user's Profile.","href":"/api/profiles#get-profile-"},"453":{"path":["API","Profiles"],"title":"Attributes","description":"No attributes.","href":"/api/profiles#attributes"},"454":{"href":"/api/quotas","path":["API","Quotas"],"title":"Quotas","description":"Quota model and related endpoints"},"455":{"path":["API","Quotas"],"title":"Quota Model","description":"| Type | Description | Scoped | Periods |\n|:------|:--------------------------------------------------------------------|:------:|:-------------------|\n| spend | Value of wallet-based payments or asset transfers from the account. | Yes | monthly yearly |\n| topup | Value of topups from bank accounts linked to the account. | Yes | monthly yearly |","href":"/api/quotas#quota-model"},"456":{"path":["API","Quotas"],"title":"Attributes","description":"| Type | Description | Scoped | Periods |\n|:------|:--------------------------------------------------------------------|:------:|:-------------------|\n| spend | Value of wallet-based payments or asset transfers from the account. | Yes | monthly yearly |\n| topup | Value of topups from bank accounts linked to the account. | Yes | monthly yearly |","href":"/api/quotas#attributes"},"457":{"path":["API","Quotas"],"title":"Supported Quota Types","description":"| Type | Description | Scoped | Periods |\n|:------|:--------------------------------------------------------------------|:------:|:-------------------|\n| spend | Value of wallet-based payments or asset transfers from the account. | Yes | monthly yearly |\n| topup | Value of topups from bank accounts linked to the account. | Yes | monthly yearly |","href":"/api/quotas#supported-quota-types"},"458":{"path":["API","Quotas"],"title":"Get Account Quotas ","description":"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.","href":"/api/quotas#get-account-quotas-"},"459":{"path":["API","Quotas"],"title":"Attributes","description":"No attributes.","href":"/api/quotas#attributes"},"460":{"path":["API","Quotas"],"title":"Errors","description":"If a quota limit is exceeded by an action that enforces quota limits, an 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.","href":"/api/quotas#errors"},"461":{"href":"/api/scanned-codes","path":["API","Scanned Codes"],"title":"Scanned Codes","description":"Scanned Code model and related endpoints"},"462":{"path":["API","Scanned Codes"],"title":"Scanned Code Model","description":"","description":""},"478":{"path":["API","Tokens"],"title":"Attributes","description":"","description":""},"480":{"path":["API","Tokens"],"title":"Attributes","description":"","description":""},"482":{"path":["API","Tokens"],"title":"Attributes","description":"","description":"This endpoint allows you to create a Token Collection.","href":"/api/tokens#create-token-collection-"},"484":{"path":["API","Tokens"],"title":"Attributes","description":"","description":"Returns a paginated list of Token Collections for an Account.","href":"/api/tokens#list-token-collections-"},"486":{"path":["API","Tokens"],"title":"Attributes","description":"","description":"This endpoint allows you to create a Redemption Condition.","href":"/api/tokens#create-redemption-condition-"},"488":{"path":["API","Tokens"],"title":"Attributes","description":"","description":"This endpoint allows you to create a Token.","href":"/api/tokens#create-token-"},"491":{"path":["API","Tokens"],"title":"Attributes","description":"","href":"/api/tokens#attributes"},"492":{"path":["API","Tokens"],"title":"Errors","description":"","href":"/api/tokens#errors"},"493":{"href":"/api/wallets","path":["API","Wallets"],"title":"Wallets","description":"Wallet models and related endpoints"},"494":{"path":["API","Wallets"],"title":"Settlement Wallets ","description":"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.","href":"/api/wallets#settlement-wallets-"},"495":{"path":["API","Wallets"],"title":"Wallet Model","description":" {\nconsole.log('Something went wrong handling OIDC callback');\n});\n/* Restore previous location stored against state param */\nwindow.location.replace(result.state || '/');\n}","href":"/guides/example-oidc-consumer#oidc-client-logout"},"520":{"href":"/guides/farmlands-card-partner-support","path":["Connections","Farmlands","Support Guide"],"title":"Farmlands Card Partner Support Guide","description":"How to for Farmlands Card Partners and Card Holders to request support from the relevant company and teams to get the help they need."},"521":{"path":["Connections","Farmlands","Support Guide"],"title":"Support for Portal Users","description":"Centrapay Platform is unable to process transactions initiated by Card Partners","href":"/guides/farmlands-card-partner-support#support-for-portal-users"},"522":{"path":["Connections","Farmlands","Support Guide"],"title":"Trouble Shooting","description":"Centrapay Platform is unable to process transactions initiated by Card Partners","href":"/guides/farmlands-card-partner-support#trouble-shooting"},"523":{"path":["Connections","Farmlands","Support Guide"],"title":"Support for POS Integrators","description":"Centrapay Platform is unable to process transactions initiated by Card Partners","href":"/guides/farmlands-card-partner-support#support-for-pos-integrators"},"524":{"path":["Connections","Farmlands","Support Guide"],"title":"SLA Support Level","description":"Centrapay Platform is unable to process transactions initiated by Card Partners","href":"/guides/farmlands-card-partner-support#sla-support-level"},"525":{"path":["Connections","Farmlands","Support Guide"],"title":"P1 - Severe Business Disruption","description":"Centrapay Platform is unable to process transactions initiated by Card Partners","href":"/guides/farmlands-card-partner-support#p1---severe-business-disruption"},"526":{"path":["Connections","Farmlands","Support Guide"],"title":"P2 - Major Business Disruption","description":"Centrapay Platform unable to:","href":"/guides/farmlands-card-partner-support#p2---major-business-disruption"},"527":{"path":["Connections","Farmlands","Support Guide"],"title":"P3 - Minor Business Disruption","description":"Centrapay Platform is operational but suffering performance degradation","href":"/guides/farmlands-card-partner-support#p3---minor-business-disruption"},"528":{"path":["Connections","Farmlands","Support Guide"],"title":"P4 - Adhoc requests as requested by Farmlands","description":"Adhoc requests as requested by Farmlands","href":"/guides/farmlands-card-partner-support#p4---adhoc-requests-as-requested-by-farmlands"},"529":{"href":"/guides/farmlands-portal","path":["Connections","Farmlands","Portal Guide"],"title":"Farmlands Portal Guide","description":"Farmlands Co-operative (Farmands) have partnered with Centrapay Payment Gateway (Centrapay) to deliver a secure web portal for Farmlands Card payments."},"530":{"path":["Connections","Farmlands","Portal Guide"],"title":"Getting Started","description":"The initial setup of your Business and all Branches (referred to as Merchants) will be managed by Farmlands. Farmlands will provide Centrapay with the details of a primary Account Owner for the business who will be loaded by Centrapay. Once setup this account owner will be able login and maintain the other members (users) who have or need access to the Account (see Members).","href":"/guides/farmlands-portal#getting-started"},"531":{"path":["Connections","Farmlands","Portal Guide"],"title":"Business Information","description":"The initial setup of your Business and all Branches (referred to as Merchants) will be managed by Farmlands. Farmlands will provide Centrapay with the details of a primary Account Owner for the business who will be loaded by Centrapay. Once setup this account owner will be able login and maintain the other members (users) who have or need access to the Account (see Members).","href":"/guides/farmlands-portal#business-information"},"532":{"path":["Connections","Farmlands","Portal Guide"],"title":"Registration","description":"Once the Business and Merchants are set up in the Centrapay Portal, users will receive an email from Farmlands inviting them to register for the portal. Users must use the email address provided in the initial setup process to register.","href":"/guides/farmlands-portal#registration"},"533":{"path":["Connections","Farmlands","Portal Guide"],"title":"Log In","description":"The Centrapay Business Portal will store your authenticated session for up to 60 days. During this time, it is not necessary to re-authenticate simply enter your email address to log in. After 60 days, you will be prompted to re-authenticate by entering a Verification Code sent to your registered email address.","href":"/guides/farmlands-portal#log-in"},"534":{"path":["Connections","Farmlands","Portal Guide"],"title":"Dashboard","description":"The Dashboard is an overview of Centrapay Business Account and will be your main screen for generating an authorisation or releasing a previous Farmlands Authorisation.","href":"/guides/farmlands-portal#dashboard"},"535":{"path":["Connections","Farmlands","Portal Guide"],"title":"Farmlands Authorisations","description":"The Centrapay Business Portal provides a real-time authorisation of a Farmlands Card when presented as payment for the purchase of goods or services. It validates that the Card is active and there is a sufficient available balance to process the transaction.","href":"/guides/farmlands-portal#farmlands-authorisations"},"536":{"path":["Connections","Farmlands","Portal Guide"],"title":"Authorisation Responses","description":"| Type | Description |\n| ---------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |\n| Authorisation Approved | Funds have now been placed on hold onto the customer account, pending the receipt of the Card Partner’s invoice within the agreed period. |\n| Pending | Card Partner creates the request, but the authorisation is not yet complete. This authorisation is not approved. |\n| Check ID | This response may occur for a high-value sale. This means the transaction is pending authorisation until the Card Partner confirms they have authenticated the customer’s photo ID against the name on the Farmlands Card. |\n| Declined | The authorisation is declined due to an invalid card number, a credit limit exceeded, or Card Partner is unable to verify a high-value transaction. Refer to Farmlands Contact Centre 0800 200 600 |\n| Release | The funds “on hold” are cancelled by Card Partner. This may occur when a Card Partner is unable to fulfil an order. (This is not used for a refund). |","href":"/guides/farmlands-portal#authorisation-responses"},"537":{"path":["Connections","Farmlands","Portal Guide"],"title":"Create a Farmlands Authorisation","description":"Once an approved authorisation has been provided, a full GST invoice must be submitted to Farmlands at vendor.invoices@farmlands.co.nz. The Short Code shown on the Approval screen must be copied and clearly displayed in the PO field of the invoice or where previously confirmed with the Farmlands Team. The Farmlands 9-digit Card number can be provided in addition to the Short Code in another field. Settlement will be completed as per agreed payment terms.","href":"/guides/farmlands-portal#create-a-farmlands-authorisation"},"538":{"path":["Connections","Farmlands","Portal Guide"],"title":"Invoicing & Settlement","description":"Once an approved authorisation has been provided, a full GST invoice must be submitted to Farmlands at vendor.invoices@farmlands.co.nz. The Short Code shown on the Approval screen must be copied and clearly displayed in the PO field of the invoice or where previously confirmed with the Farmlands Team. The Farmlands 9-digit Card number can be provided in addition to the Short Code in another field. Settlement will be completed as per agreed payment terms.","href":"/guides/farmlands-portal#invoicing-&-settlement"},"539":{"path":["Connections","Farmlands","Portal Guide"],"title":"Releasing Funds","description":"The Authorised funds will be held against the Cardholder account for 31 days or until the invoice is received. If the order is cancelled before the invoice is submitted to Farmlands the Authorisation should be released to remove the hold on Cardholder funds.","href":"/guides/farmlands-portal#releasing-funds"},"540":{"path":["Connections","Farmlands","Portal Guide"],"title":"Release Hold on Customer Funds","description":"The Payments page provides a list of transactions that were previously authorised. You can search by using the Authorisation Short Code as the reference. Further search functionality will be available at a later date.","href":"/guides/farmlands-portal#release-hold-on-customer-funds"},"541":{"path":["Connections","Farmlands","Portal Guide"],"title":"Authorisation History","description":"The Payments page provides a list of transactions that were previously authorised. You can search by using the Authorisation Short Code as the reference. Further search functionality will be available at a later date.","href":"/guides/farmlands-portal#authorisation-history"},"542":{"path":["Connections","Farmlands","Portal Guide"],"title":"Setting a Default Merchant","description":"Select your Default Merchant (First-time user) - The default merchant is the branch or outlet that the user normally works from, and which the transaction will be associated with.","href":"/guides/farmlands-portal#setting-a-default-merchant"},"543":{"path":["Connections","Farmlands","Portal Guide"],"title":"Manage My Centrapay Business Account","description":"The Account Owner has access to additional options to manage their Centrapay Business Account, including adding an removing users who have access to complete authorisations on their account.","href":"/guides/farmlands-portal#manage-my-centrapay-business-account"},"544":{"path":["Connections","Farmlands","Portal Guide"],"title":"Merchants","description":"This area relates to the management of new and existing Branches/Locations used for Centrapay’s other payment types e.g gift cards (i.e not Farmlands). Additional merchants added through the Merchants area will not be able to accept Farmlands Card until they are setup by Farmlands.","href":"/guides/farmlands-portal#merchants"},"545":{"path":["Connections","Farmlands","Portal Guide"],"title":"Bank Accounts","description":"This function is only available to businesses who wish to use other Centrapay supported payment methods other than Farmlands Cards. (e.g. Gift Cards or NZD).","href":"/guides/farmlands-portal#bank-accounts"},"546":{"path":["Connections","Farmlands","Portal Guide"],"title":"Members","description":"On the Members page you can manage the members connected to the Centrapay Business Account. An Account Owner can see the list of members and pending invitations and easily add or remove members.","href":"/guides/farmlands-portal#members"},"547":{"path":["Connections","Farmlands","Portal Guide"],"title":"Settings","description":"On the Settings page, you can change your business information. Please note this does not flow through to Farmlands. If you have a change of ownership, please contact Farmlands.","href":"/guides/farmlands-portal#settings"},"548":{"path":["Connections","Farmlands","Portal Guide"],"title":"FAQs","description":"The Support button opens up a form that will allow you to send a support request directly to Centrapay if you have any issues regarding the Centrapay Business Portal.","href":"/guides/farmlands-portal#faqs"},"549":{"path":["Connections","Farmlands","Portal Guide"],"title":"Support","description":"The Support button opens up a form that will allow you to send a support request directly to Centrapay if you have any issues regarding the Centrapay Business Portal.","href":"/guides/farmlands-portal#support"},"550":{"href":"/guides/farmlands-pos-integration","path":["Connections","Farmlands","POS Integration Guide"],"title":"Farmlands POS Integration Guide","description":"Farmlands has partnered with Centrapay to deliver new ways for your business to authorise and process Farmlands Card payments that are faster, easier, and more secure than ever."},"551":{"path":["Connections","Farmlands","POS Integration Guide"],"title":"Centrapay Integration Benefits","description":"Integrating with Centrapay streamlines the process for authorising and invoicing Farmlands Card Payments. The integration provides:","href":"/guides/farmlands-pos-integration#centrapay-integration-benefits"},"552":{"path":["Connections","Farmlands","POS Integration Guide"],"title":"Payment Flow Overview","description":"Farmlands integrations use Centrapay’s Quick Pay Barcode Flow For Merchants to connect to Cardholders and accept Farmlands transactions.","href":"/guides/farmlands-pos-integration#payment-flow-overview"},"553":{"path":["Connections","Farmlands","POS Integration Guide"],"title":"Payment Flow Implementation","description":"The Payment Flow can only be used by existing Farmlands Card Partners. Card Partners must complete the following steps to accept Farmlands transactions.","href":"/guides/farmlands-pos-integration#payment-flow-implementation"},"554":{"path":["Connections","Farmlands","POS Integration Guide"],"title":"Merchant Configuration","description":"Each Card Partner site that needs to accept Farmlands Card payments must be set up as a separate Centrapay Merchant with its own Merchant Config. The Merchant Config contains a Farmlands Payment Option that allows the site to accept Farmlands Payments.","href":"/guides/farmlands-pos-integration#merchant-configuration"},"555":{"path":["Connections","Farmlands","POS Integration Guide"],"title":"Authentication","description":"Requests to Centrapay’s APIs are authenticated by providing an API key in the X-Api-Key header. API Keys provide enduring access to a single Centrapay account.","href":"/guides/farmlands-pos-integration#authentication"},"556":{"path":["Connections","Farmlands","POS Integration Guide"],"title":"Basic Requirements","description":"The Payment Flow needs the following requirements to be met.","href":"/guides/farmlands-pos-integration#basic-requirements"},"557":{"path":["Connections","Farmlands","POS Integration Guide"],"title":"Payment Conditions","description":"This extension enables the POS to enforce requiring an ID check for high-risk transactions.","href":"/guides/farmlands-pos-integration#payment-conditions"},"558":{"path":["Connections","Farmlands","POS Integration Guide"],"title":"Pre Auth","description":"Farmlands Card Partners must support this extension when there is not an invoice number available at the point of sale or the purchase cannot be fulfilled immediately. This might happen if your stock is not on hand or you have a separate fulfilment process.","href":"/guides/farmlands-pos-integration#pre-auth"},"559":{"path":["Connections","Farmlands","POS Integration Guide"],"title":"Cardholder Not Present","description":"Farmlands Card Partners must support this extension if they accept payments when the Cardholder is not physically present when a payment is authorised. For example, to accept phone-based orders or orders where the Farmlands barcode is already known.","href":"/guides/farmlands-pos-integration#cardholder-not-present"},"560":{"path":["Connections","Farmlands","POS Integration Guide"],"title":"Validating Farmlands Barcodes","description":"Farmlands Card Partners may optionally decode a scanned Farmlands Barcode to confirm that it is valid and apply Farmlands discounts before creating a Payment Request.","href":"/guides/farmlands-pos-integration#validating-farmlands-barcodes"},"561":{"path":["Connections","Farmlands","POS Integration Guide"],"title":"Handling Payment Errors","description":"The POS must follow Centrapay’s guidelines on handling errors when dealing with inconsistencies in Payment Request statuses due to network issues or race conditions.","href":"/guides/farmlands-pos-integration#handling-payment-errors"},"562":{"path":["Connections","Farmlands","POS Integration Guide"],"title":"Refunds","description":"Cardholder purchases are refunded by refunding the Payment Request.","href":"/guides/farmlands-pos-integration#refunds"},"563":{"path":["Connections","Farmlands","POS Integration Guide"],"title":"Short Codes","description":"Payment Requests have a short code field that is human- and OCR-friendly. When combined with the date or merchant id, short codes can unambiguously identify the correct Payment Request.","href":"/guides/farmlands-pos-integration#short-codes"},"564":{"path":["Connections","Farmlands","POS Integration Guide"],"title":"Testing Your Integration","description":"Merchant Integrators need to work with Farmlands and Centrapay to get set up to test payments. Please contact Farmlands to organise full end-to-end testing.","href":"/guides/farmlands-pos-integration#testing-your-integration"},"565":{"path":["Connections","Farmlands","POS Integration Guide"],"title":"Certification Requirements","description":"For Centrapay to allow integrations to have production assets turned on, we require partners to complete a Certification Process.","href":"/guides/farmlands-pos-integration#certification-requirements"},"566":{"path":["Connections","Farmlands","POS Integration Guide"],"title":"Next Steps","description":"","href":"/guides/farmlands-pos-integration#next-steps"},"567":{"href":"/guides/initiating-refunds","path":["Reference","Merchant Integrations","Initiating Refunds"],"title":"Initiating Refunds","description":"How to issue refunds on the Centrapay payment platform."},"568":{"path":["Reference","Merchant Integrations","Initiating Refunds"],"title":"Refund Idempotency","description":"Refund requests must provide an externalRef that is unique for all refunds made against the Payment Request.","href":"/guides/initiating-refunds#refund-idempotency"},"569":{"path":["Reference","Merchant Integrations","Initiating Refunds"],"title":"Obtaining a Payment Request Id","description":"Refunds are initiated using the identifier for the Payment Request. However, a patron is NOT expected to have this information available.","href":"/guides/initiating-refunds#obtaining-a-payment-request-id"},"570":{"path":["Reference","Merchant Integrations","Initiating Refunds"],"title":"By Short Code","description":"Call the Get Payment Request by Short Code endpoint using the Centrapay short code that the patron obtains from their paper receipt or digital wallet transaction history.","href":"/guides/initiating-refunds#by-short-code"},"571":{"path":["Reference","Merchant Integrations","Initiating Refunds"],"title":"By Transaction Reference","description":"Lookup the transaction within the merchant system using the transaction reference that the patron obtains from their paper receipt or digital wallet transaction history.","href":"/guides/initiating-refunds#by-transaction-reference"},"572":{"path":["Reference","Merchant Integrations","Initiating Refunds"],"title":"Refund Error Handling","description":"There are a number of reasons why refunds can fail. These are documented on the Refund Payment Request endpoint and should be communicated to the user.","href":"/guides/initiating-refunds#refund-error-handling"},"573":{"path":["Reference","Merchant Integrations","Initiating Refunds"],"title":"Multi-Asset Selection","description":"Payment Requests may be paid by multiple assets. When refunding a multi-asset Payment Request, the refunded asset is not controllable by the merchant.","href":"/guides/initiating-refunds#multi-asset-selection"},"574":{"href":"/guides/integrating-third-party-asset","path":["Reference","Digital Assets","Third-party Asset"],"title":"Third-party Asset","description":"Integrate your assets with Centrapay to unlock the potential to transact with terminals, point-of-sales and merchants already connected with the Centrapay Payments Network."},"575":{"path":["Reference","Digital Assets","Third-party Asset"],"title":"Defining a Payment Method","description":"We require a way of identifying your asset in order to route payments to the correct asset provider. You must define a payment method namespace, description, and list of supported currencies.","href":"/guides/integrating-third-party-asset#defining-a-payment-method"},"576":{"path":["Reference","Digital Assets","Third-party Asset"],"title":"Namespace","description":"The namespace is a unique string to identify your asset. Your namespace must conform to the following properties:","href":"/guides/integrating-third-party-asset#namespace"},"577":{"path":["Reference","Digital Assets","Third-party Asset"],"title":"Liveness","description":"The liveness of a payment method can be either main or test. This can be used to accept test assets through Centrapay.","href":"/guides/integrating-third-party-asset#liveness"},"578":{"path":["Reference","Digital Assets","Third-party Asset"],"title":"Description","description":"Merchants may look at reports or receipts of past transactions. If there was a payment or refund with your asset against their Payment Request, the description of your asset will be displayed.","href":"/guides/integrating-third-party-asset#description"},"579":{"path":["Reference","Digital Assets","Third-party Asset"],"title":"Supported Currencies","description":"Payment Requests have a value determined by the currency a Merchant accepts. You should supply a finite list of three-letter ISO currency codes that is supported by your asset.","href":"/guides/integrating-third-party-asset#supported-currencies"},"580":{"path":["Reference","Digital Assets","Third-party Asset"],"title":"Example Definition","description":"| Field | Type | Description | Examples |\n| --------------------------------------------- | ------ | ------------------------------------------------------------------- | ----------------- |\n| Namespace | String | A name used for uniquely identifying the asset as a payment method. | centrapay-example |\n| Description | String | A short human readable description. | Centrapay Money |\n| Supported Currencies | Array | A list of supported currency codes. | NZD, USD |","href":"/guides/integrating-third-party-asset#example-definition"},"581":{"path":["Reference","Digital Assets","Third-party Asset"],"title":"Uplink API Requirements","description":"To integrate with Centrapay payments, you must implement the Uplink endpoints. An Uplink is a strategy for performing payment or refund transactions for your Asset. These endpoints will be used in the lifecycle of a payment.","href":"/guides/integrating-third-party-asset#uplink-api-requirements"},"582":{"path":["Reference","Digital Assets","Third-party Asset"],"title":"Contact Details","description":"Centrapay requires at least one email address to notify you of integration failures or changes. You may choose to provide us with multiple emails for different priorities of communication.","href":"/guides/integrating-third-party-asset#contact-details"},"583":{"path":["Reference","Digital Assets","Third-party Asset"],"title":"Protocol","description":"Each endpoint must use the HTTPS protocol.","href":"/guides/integrating-third-party-asset#protocol"},"584":{"path":["Reference","Digital Assets","Third-party Asset"],"title":"URL","description":"There are no restrictions regarding the provided URLs, so long as they adhere to the specification for the HTTP method, query parameters, request body, response body, and error codes.","href":"/guides/integrating-third-party-asset#url"},"585":{"path":["Reference","Digital Assets","Third-party Asset"],"title":"Authentication","description":"Endpoints are authenticated against requests using a JSON Web Token (JWT) issued by Centrapay. The JWT will be sent through the Authorization header in the HTTP Request.","href":"/guides/integrating-third-party-asset#authentication"},"586":{"path":["Reference","Digital Assets","Third-party Asset"],"title":"Refund Endpoint","description":"This endpoint is used to refund a Payment Request with status paid. Refunds must be synchronous i.e. the status must be successful or failed.","href":"/guides/integrating-third-party-asset#refund-endpoint"},"587":{"path":["Reference","Digital Assets","Third-party Asset"],"title":"Cancel Endpoint","description":"After initiating a transaction with the pay endpoint, the status may be pending. During this time something may have happened to prevent the payment request from being paid (e.g. payment request timeout or merchant network issues).","href":"/guides/integrating-third-party-asset#cancel-endpoint"},"588":{"path":["Reference","Digital Assets","Third-party Asset"],"title":"Get Transaction Endpoint","description":"After initiating a payment transaction, the status may be pending. This endpoint will be used to poll the status of the transaction attempt. Polling will continue until either the transaction attempt status is successful or failed, or the Centrapay Payment Request is no longer payable (e.g. it has expired).","href":"/guides/integrating-third-party-asset#get-transaction-endpoint"},"589":{"path":["Reference","Digital Assets","Third-party Asset"],"title":"Implementation Checklist","description":"To enable merchants to accept your asset as a payment method, you must complete an integration certification. When you're ready or need assistance/have questions integrating, please contact the Centrapay Engineering team at integrations@centrapay.com.","href":"/guides/integrating-third-party-asset#implementation-checklist"},"590":{"href":"/guides/line-items","path":["Reference","Merchant Integrations","Line Items"],"title":"Line Items","description":"Line items are used to communicate the details of a purchase to a patron."},"591":{"path":["Reference","Merchant Integrations","Line Items"],"title":"Restrictions","description":"Payments via Centrapay can be made against specific line items. This can happen because a user has specifically requested the line items they wish an asset to pay for, or because they were using an asset that can only be redeemed for a specific product, like a Centrapay Token.\nIt's important to communicate to the merchant which line items have been purchased via Centrapay so they are able to make educated decisions when refunding transactions or completing partial payments.\nThis information should also be displayed to a consumer when possible. If any line items were purchased by a specific asset, they will be returned on a Payment Request inside the Asset Totals array.\nIntegrators must iterate through the assetTotals array and display any line items purchased to the merchant. Line items that have been purchased via Centrapay must no longer be able to be purchased using another form of payment.\nThis is especially important for any assets which are only redeemable against specific line items. For example, there could be a case where someone used a digital token to pay for a line item, and then a physical voucher to pay for that same line item, which would mean the second voucher could go towards purchasing something other than the intended line item.","href":"/guides/line-items#restrictions"},"592":{"path":["Reference","Merchant Integrations","Line Items"],"title":"Determining Paid For Line Items","description":"Payments via Centrapay can be made against specific line items. This can happen because a user has specifically requested the line items they wish an asset to pay for, or because they were using an asset that can only be redeemed for a specific product, like a Centrapay Token.\nIt's important to communicate to the merchant which line items have been purchased via Centrapay so they are able to make educated decisions when refunding transactions or completing partial payments.\nThis information should also be displayed to a consumer when possible. If any line items were purchased by a specific asset, they will be returned on a Payment Request inside the Asset Totals array.\nIntegrators must iterate through the assetTotals array and display any line items purchased to the merchant. Line items that have been purchased via Centrapay must no longer be able to be purchased using another form of payment.\nThis is especially important for any assets which are only redeemable against specific line items. For example, there could be a case where someone used a digital token to pay for a line item, and then a physical voucher to pay for that same line item, which would mean the second voucher could go towards purchasing something other than the intended line item.","href":"/guides/line-items#determining-paid-for-line-items"},"593":{"href":"/guides/loading-and-sending-assets","path":["Reference","Digital Assets","Loading and Sending Assets"],"title":"Loading and Sending Assets","description":"Issue and distribute Centrapay Assets such as Giftcards or Tokens to users via SMS."},"594":{"path":["Reference","Digital Assets","Loading and Sending Assets"],"title":"Loading Giftcards","description":"You can load Giftcards by calling our External Assets endpoint. You will need to use the giftcard number for the externalId field. The pin, the issuer and the type need to be on hand too.","href":"/guides/loading-and-sending-assets#loading-giftcards"},"595":{"path":["Reference","Digital Assets","Loading and Sending Assets"],"title":"Sending Assets","description":"You can send Assets such as Tokens and Giftcards by calling our Asset Transfers endpoint. You will need to have the recipient’s phone number for recipientAlias to identify the reciever.","href":"/guides/loading-and-sending-assets#sending-assets"},"596":{"path":["Reference","Digital Assets","Loading and Sending Assets"],"title":"Example: Bulk distribution of Giftcards","description":"Sometimes you might want to load and distribute Giftcards to a large number of recipients. This requires some scripting, but this is not hard. We can do this with:","href":"/guides/loading-and-sending-assets#example:-bulk-distribution-of-giftcards"},"597":{"href":"/guides/merchant-integration-barcode-flow","path":["Reference","Merchant Integrations","Barcode Flow"],"title":"Barcode Flow for Merchants","description":"How merchants can accept payments by scanning a barcode presented by the patron."},"598":{"path":["Reference","Merchant Integrations","Barcode Flow"],"title":"Barcode Flow","description":"The sequence diagram below indicates the expected flow of behavior between the patron, the Point of Sale (POS) and Centrapay.","href":"/guides/merchant-integration-barcode-flow#barcode-flow"},"599":{"path":["Reference","Merchant Integrations","Barcode Flow"],"title":"Quick Pay Flow","description":"Quick Pay is used to immediately confirm the payment without requiring patron approval.","href":"/guides/merchant-integration-barcode-flow#quick-pay-flow"},"600":{"path":["Reference","Merchant Integrations","Barcode Flow"],"title":"Checking Barcode Details","description":"The POS can optionally decode a scanned barcode in order to get further details about a barcode before it creates a Payment Request. For example, the POS can use the barcode provider to apply any provider-specific discounts before creating the Payment Request.","href":"/guides/merchant-integration-barcode-flow#checking-barcode-details"},"601":{"href":"/guides/merchant-integration-error-handling","path":["Reference","Merchant Integrations","Error Handling"],"title":"Merchant Integration Error Handling","description":"How to deal with inconsistencies in Payment Request statuses due to network issues or race conditions."},"602":{"path":["Reference","Merchant Integrations","Error Handling"],"title":"Respect Payment Status","description":"Use the Payment Request status as the source of truth when determining if a Payment Request is paid or expired. For example, if cancelling a Payment Request fails with a REQUEST_PAID error then the terminal should respond accordingly; either by showing the transaction as paid or initiating a void instead.","href":"/guides/merchant-integration-error-handling#respect-payment-status"},"603":{"path":["Reference","Merchant Integrations","Error Handling"],"title":"Void Unknown Status","description":"If the status of a transaction cannot be determined to be successful after retrying, then the Payment Request should be voided. Voiding a Payment Request will cancel the request and trigger any refunds if necessary.","href":"/guides/merchant-integration-error-handling#void-unknown-status"},"604":{"path":["Reference","Merchant Integrations","Error Handling"],"title":"Configure POS Timeout","description":"Payment Requests have a configurable timeout which defaults to 2 minutes. Integrators should make sure that the payment terminal times out 5-10 seconds after the Payment Request.","href":"/guides/merchant-integration-error-handling#configure-pos-timeout"},"605":{"path":["Reference","Merchant Integrations","Error Handling"],"title":"Retry Unknown Errors","description":"When faced with an unknown error while checking the status of a Payment Request, POS integrations should retry at least once before voiding the transaction.","href":"/guides/merchant-integration-error-handling#retry-unknown-errors"},"606":{"path":["Reference","Merchant Integrations","Error Handling"],"title":"Resolving Persistent Errors","description":"For issues that cannot be resolved, please reach out to Centrapay Support at integrations@centrapay.com.","href":"/guides/merchant-integration-error-handling#resolving-persistent-errors"},"607":{"href":"/guides/merchant-integration-qr-code-flow","path":["Reference","Merchant Integrations","QR Code Flow"],"title":"QR Code Flow for Merchants","description":"How merchants can accept payments by presenting a QR code to the patron."},"608":{"href":"/guides/partial-payment-extension","path":["Reference","Merchant Integrations","Partial Payment"],"title":"Partial Payment","description":"A core feature of the Payment Request Protocol that allows integrators to accept a partial transaction through Centrapay."},"609":{"path":["Reference","Merchant Integrations","Partial Payment"],"title":"Partial Payment Flow","description":"A patron asks the merchant to process a specified part of the total basket\namount using Centrapay. This could be due to the patron knowing their Centrapay\nAsset balance wouldn’t cover the complete basket amount or enable them to use a\nset amount of funds from a fixed value asset eg. Gift Card to complete the payment.\nRelated steps in diagram above: 1→2→3→4→5 or 2→3→4→5→6","href":"/guides/partial-payment-extension#partial-payment-flow"},"610":{"path":["Reference","Merchant Integrations","Partial Payment"],"title":"Merchant Driven Scenario","description":"A patron asks the merchant to process a specified part of the total basket\namount using Centrapay. This could be due to the patron knowing their Centrapay\nAsset balance wouldn’t cover the complete basket amount or enable them to use a\nset amount of funds from a fixed value asset eg. Gift Card to complete the payment.\nRelated steps in diagram above: 1→2→3→4→5 or 2→3→4→5→6","href":"/guides/partial-payment-extension#merchant-driven-scenario"},"611":{"path":["Reference","Merchant Integrations","Partial Payment"],"title":"Patron Driven Scenario","description":"A patron using a mobile wallet app may find they lack enough funds to cover the\nfull payment after connecting to a Centrapay Payment Request. Instead of the\ncashier needing to cancel the Payment Request and start over, the patron can\nmake a partial payment with available funds. Once the Centrapay payment is\nsuccessful, the point of sale can take payment for the remaining amount using\nanother method.Related steps in diagram above: 2→3→4→5→6","href":"/guides/partial-payment-extension#patron-driven-scenario"},"612":{"path":["Reference","Merchant Integrations","Partial Payment"],"title":"Hybrid Partial Payment Scenario","description":"A combination of Merchant and App driven partial payments to cater for edge\ncases where needed.Related steps in diagram above: 1→2→3→4→5→6","href":"/guides/partial-payment-extension#hybrid-partial-payment-scenario"},"613":{"path":["Reference","Merchant Integrations","Partial Payment"],"title":"Implementation","description":"When creating a Payment Request,\nopt into partial payment by:","href":"/guides/partial-payment-extension#implementation"},"614":{"path":["Reference","Merchant Integrations","Partial Payment"],"title":"Creating the Payment Request","description":"When creating a Payment Request,\nopt into partial payment by:","href":"/guides/partial-payment-extension#creating-the-payment-request"},"615":{"path":["Reference","Merchant Integrations","Partial Payment"],"title":"Polling for Payment Confirmation","description":"Continue to poll the status of the Payment Request until it is no longer new.\nIf the Payment Request status has been updated to cancelled or expired,\nproceed as you normally would. If the status is paid you need to check the\nremainingAmount property on the Payment Request.","href":"/guides/partial-payment-extension#polling-for-payment-confirmation"},"616":{"path":["Reference","Merchant Integrations","Partial Payment"],"title":"See also","description":"","href":"/guides/partial-payment-extension#see-also"},"617":{"href":"/guides/patron-not-present","path":["Reference","Merchant Integrations","Patron Not Present"],"title":"Patron Not Present","description":"Centrapay’s Patron Not Present extension allows a merchant to complete a payment when the patron is not physically present at the time of payment."},"618":{"href":"/guides/payment-conditions","path":["Reference","Merchant Integrations","Payment Conditions"],"title":"Payment Conditions","description":"Payment Conditions enable integrations to require conditional approval to accept specific Asset Types as payment."},"619":{"path":["Reference","Merchant Integrations","Payment Conditions"],"title":"Implementation","description":"In order to support Payment Conditions, the merchant integration must extend Centrapay's payment protocol by creating the Payment Request with the conditionsEnabled flag set to true.","href":"/guides/payment-conditions#implementation"},"620":{"path":["Reference","Merchant Integrations","Payment Conditions"],"title":"Additional Behaviors","description":"The payment request status must always be polled after accepting or declining a condition as these actions may trigger the additional behaviors below.","href":"/guides/payment-conditions#additional-behaviors"},"621":{"href":"/guides/payment-flows","path":["Reference","Centrapay Experiences","Payment Flows"],"title":"Payment Flows","description":"Centrapay facilitates secure and convenient transactions between customer and merchant devices, with multiple payment flows available for selection. Transact with ease and confidence using Centrapay."},"622":{"path":["Reference","Centrapay Experiences","Payment Flows"],"title":"Merchant-presented","description":"When a merchant terminal has a customer-facing display it can prompt the customer to pay by showing a QR code.","href":"/guides/payment-flows#merchant-presented"},"623":{"path":["Reference","Centrapay Experiences","Payment Flows"],"title":"Dynamic Merchant QR Code","description":"When a merchant terminal is neither capable of displaying nor scanning QR codes or barcodes, such as for unattended vending machines, then a static QR code can be used.","href":"/guides/payment-flows#dynamic-merchant-qr-code"},"624":{"path":["Reference","Centrapay Experiences","Payment Flows"],"title":"Static Merchant QR Code","description":"When a merchant terminal is neither capable of displaying nor scanning QR codes or barcodes, such as for unattended vending machines, then a static QR code can be used.","href":"/guides/payment-flows#static-merchant-qr-code"},"625":{"path":["Reference","Centrapay Experiences","Payment Flows"],"title":"Patron-presented","description":"When a merchant terminal is not capable of displaying a customer-facing QR code, then the payment request can be negotiated with the customer by scanning a barcode or QR code displayed on the customer’s smart device.","href":"/guides/payment-flows#patron-presented"},"626":{"path":["Reference","Centrapay Experiences","Payment Flows"],"title":"Dynamic Patron Barcode","description":"This is a variant on Dynamic Patron Code. If you’ve setup a long lived Centrapay Enabled Barcode then you can use these to pay on behalf of a Customer. You may need to check a Customer’s Photo ID before this goes through.","href":"/guides/payment-flows#dynamic-patron-barcode"},"627":{"path":["Reference","Centrapay Experiences","Payment Flows"],"title":"Static Patron Barcode","description":"This is a variant on Dynamic Patron Code. If you’ve setup a long lived Centrapay Enabled Barcode then you can use these to pay on behalf of a Customer. You may need to check a Customer’s Photo ID before this goes through.","href":"/guides/payment-flows#static-patron-barcode"},"628":{"path":["Reference","Centrapay Experiences","Payment Flows"],"title":"Quick Pay","description":"Quick Pay is used to pay the payment request after it is polled for the first time, without requiring patron approval. Quick Pay can only be triggered using the patron-presented flows, and the patron barcode must be linked to an asset type that allows quick pay.","href":"/guides/payment-flows#quick-pay"},"629":{"href":"/guides/payment-terminals","path":["Reference","Merchant Integrations","Payment Terminal"],"title":"Payment Terminal","description":"How to integrate a payment terminal with Centrapay APIs."},"630":{"path":["Reference","Merchant Integrations","Payment Terminal"],"title":"API Keys","description":"To create API keys, you first need to get in touch with Centrapay to be issued an Integrator Account and an “Account owner” API key. An “Account owner” is a special kind of role that allows you to manage your account.","href":"/guides/payment-terminals#api-keys"},"631":{"path":["Reference","Merchant Integrations","Payment Terminal"],"title":"Merchant Configs","description":"Centrapay Merchant Configs represent an available set of configured payment methods that can be utilized by one or more payment terminals by a Merchant.","href":"/guides/payment-terminals#merchant-configs"},"632":{"path":["Reference","Merchant Integrations","Payment Terminal"],"title":"Example Flows","description":"See Payment Flows for an overview of the API calls required for different payment flows.","href":"/guides/payment-terminals#example-flows"},"633":{"path":["Reference","Merchant Integrations","Payment Terminal"],"title":"Terminal Interface Guidelines","description":"When configuring a terminal with Centrapay there are a few common touch points that require branded assets. Please use the Centrapay Brand Assets when building the UI for these screens.","href":"/guides/payment-terminals#terminal-interface-guidelines"},"634":{"path":["Reference","Merchant Integrations","Payment Terminal"],"title":"Displaying a Button","description":"Illustration of payment terminal displaying Centrapay button","href":"/guides/payment-terminals#displaying-a-button"},"635":{"path":["Reference","Merchant Integrations","Payment Terminal"],"title":"Displaying an Icon","description":"Illustration of payment terminal displaying Centrapay icon","href":"/guides/payment-terminals#displaying-an-icon"},"636":{"path":["Reference","Merchant Integrations","Payment Terminal"],"title":"Displaying QR Codes","description":"Illustration of payment terminal displaying Centrapay QR code","href":"/guides/payment-terminals#displaying-qr-codes"},"637":{"path":["Reference","Merchant Integrations","Payment Terminal"],"title":"Integration Architecture","description":"We strongly recommend Centrapay APIs are invoked from your backend and not directly from your payment terminals. Centralizing the invocation of our APIs from your backend offers the following benefits:","href":"/guides/payment-terminals#integration-architecture"},"638":{"path":["Reference","Merchant Integrations","Payment Terminal"],"title":"Mitigating Network Issues","description":"See the guide on Merchant Integration Error Handling for information on preventing and handling network issues.","href":"/guides/payment-terminals#mitigating-network-issues"},"639":{"href":"/guides/point-of-sale","path":["Reference","Merchant Integrations","Point of Sale"],"title":"Point of Sale","description":"How to integrate a point of sale (POS) terminal with Centrapay APIs."},"640":{"path":["Reference","Merchant Integrations","Point of Sale"],"title":"Core Requirements","description":"Centrapay POS integrations must be able to create, void and refund Payment Requests on behalf of Merchants.","href":"/guides/point-of-sale#core-requirements"},"641":{"path":["Reference","Merchant Integrations","Point of Sale"],"title":"Optional Protocol Extensions","description":"Our payment protocol supports several optional extensions. Please review the extensions below and determine which ones you need for your integration.","href":"/guides/point-of-sale#optional-protocol-extensions"},"642":{"path":["Reference","Merchant Integrations","Point of Sale"],"title":"Contact Us","description":"Contact integrations@centrapay.com to get started with API keys.","href":"/guides/point-of-sale#contact-us"},"643":{"href":"/guides/requesting-payment","path":["Reference","Merchant Integrations","Requesting Payment"],"title":"Requesting Payment","description":"How to request payment on the Centrapay payment platform."},"644":{"path":["Reference","Merchant Integrations","Requesting Payment"],"title":"Connecting With Patrons","description":"The Payment Request object is a core part of Centrapay’s payment protocol. It represents the intention of a merchant to receive payment, defines the amount to be paid, and the acceptable Asset Types for payment.","href":"/guides/requesting-payment#connecting-with-patrons"},"645":{"path":["Reference","Merchant Integrations","Requesting Payment"],"title":"Required Fields","description":"We require compliant integrations to provide the following optional fields when creating a Payment Request.","href":"/guides/requesting-payment#required-fields"},"646":{"path":["Reference","Merchant Integrations","Requesting Payment"],"title":"Short Codes","description":"Payment Requests have a short code that is human- and OCR-friendly. Short codes are recycled every two years. When combined with the date or merchant id, short codes can unambiguously identify the correct Payment Request.","href":"/guides/requesting-payment#short-codes"},"647":{"path":["Reference","Merchant Integrations","Requesting Payment"],"title":"Polling for Payment Confirmation","description":"After connecting with the patron, the POS must poll the Payment Request status every second until the status has changed.","href":"/guides/requesting-payment#polling-for-payment-confirmation"},"648":{"path":["Reference","Merchant Integrations","Requesting Payment"],"title":"Protocol Extensions","description":"Our payment protocol supports several optional extensions. Please review the extensions below and determine which ones you need for your integration.","href":"/guides/requesting-payment#protocol-extensions"},"649":{"path":["Reference","Merchant Integrations","Requesting Payment"],"title":"Handling Payment Errors","description":"Merchant integrations should follow our guidelines in Merchant Integration Error Handling when inconsistencies such as network issues or race conditions occur.","href":"/guides/requesting-payment#handling-payment-errors"},"650":{"href":"/guides/requesting-pre-auth","path":["Reference","Merchant Integrations","Requesting Pre Auth"],"title":"Requesting Pre Auth","description":"Centrapay’s Pre Auth extension allows a patron to authorize payment up to a limit when the actual payment amount is not yet known."},"651":{"path":["Reference","Merchant Integrations","Requesting Pre Auth"],"title":"Restrictions","description":"Pre Auth payments are not supported in all cases.","href":"/guides/requesting-pre-auth#restrictions"},"652":{"path":["Reference","Merchant Integrations","Requesting Pre Auth"],"title":"Pre Auth Flow","description":"Pre Auth payments go through an orthogonal payment flow compared to Centrapay’s standard payment flow.","href":"/guides/requesting-pre-auth#pre-auth-flow"},"653":{"path":["Reference","Merchant Integrations","Requesting Pre Auth"],"title":"Authorize","description":"An authorization is created when the Payment Request is created with the preAuth flag while Requesting Payment.","href":"/guides/requesting-pre-auth#authorize"},"654":{"path":["Reference","Merchant Integrations","Requesting Pre Auth"],"title":"Confirm","description":"Merchants can draw down on authorized funds by making one or more confirmations against an authorized amount. Confirmations must be made with an idempotencyKey in order to prevent merchants from drawing down on authorized funds twice.","href":"/guides/requesting-pre-auth#confirm"},"655":{"path":["Reference","Merchant Integrations","Requesting Pre Auth"],"title":"Release","description":"Authorized funds that have not been confirmed can optionally be released so that the asset holder is granted access to their remaining funds without needing to wait for the authorization to expire.","href":"/guides/requesting-pre-auth#release"},"656":{"path":["Reference","Merchant Integrations","Requesting Pre Auth"],"title":"Expiry","description":"Authorizations automatically expire after 3 months. Any unreleased funds are subsequently released to the Patron.","href":"/guides/requesting-pre-auth#expiry"},"657":{"path":["Reference","Merchant Integrations","Requesting Pre Auth"],"title":"Refund","description":"Refunds can be made against authorizations, confirmations, released authorizations and expired authorizations.","href":"/guides/requesting-pre-auth#refund"},"658":{"path":["Reference","Merchant Integrations","Requesting Pre Auth"],"title":"Void","description":"Voiding a Payment Request will cancel a Payment Request and trigger any refunds necessary. This operation is useful if the POS needs to back out of a transaction due to a network error for example. Voiding can only be used up to 24 hours after the Payment Request was created.","href":"/guides/requesting-pre-auth#void"},"659":{"href":"/guides/third-party-application-payments","path":["Reference","App Integrations","Paying a Payment Request"],"title":"Paying a Payment Request","description":"Integrate your app with Centrapay to pay payment requests on merchant terminals and POS"},"660":{"path":["Reference","App Integrations","Paying a Payment Request"],"title":"Overview","description":"This guide is for a Third-party Asset Provider to enable paying with their\ndigital assets with Centrapay.","href":"/guides/third-party-application-payments#overview"},"661":{"path":["Reference","App Integrations","Paying a Payment Request"],"title":"Authenticating API calls on behalf of users","description":"Third-party applications can make API calls on behalf of users with Centrapay\nAPI keys. All API requests to Centrapay must be made from the integrator’s server.\nCentrapay API keys must also be managed server side and stored as secrets to\nminimize the risk of API keys being compromised.","href":"/guides/third-party-application-payments#authenticating-api-calls-on-behalf-of-users"},"662":{"path":["Reference","App Integrations","Paying a Payment Request"],"title":"Payment Flow Overview","description":"The payment flow below describes how a Third-party Asset Provider should integrate\nwith the Dynamic Merchant QR Code flow to enable digital payments within their\napplication. Below is an overview of the process, followed by a more in-depth\nlook at the integrator’s responsibilities.","href":"/guides/third-party-application-payments#payment-flow-overview"},"663":{"path":["Reference","App Integrations","Paying a Payment Request"],"title":"Payment Flow Implementation","description":"The user will then scan the QR code from inside the app. Valid Centrapay QR Codes\nwill have the format https://app.centrapay.com/pay/{paymentRequestId}. Validate\nthe url by asserting it matches the above format and ignore any malformed QR codes.","href":"/guides/third-party-application-payments#payment-flow-implementation"},"664":{"path":["Reference","App Integrations","Paying a Payment Request"],"title":"Scan Centrapay QR code","description":"The user will then scan the QR code from inside the app. Valid Centrapay QR Codes\nwill have the format https://app.centrapay.com/pay/{paymentRequestId}. Validate\nthe url by asserting it matches the above format and ignore any malformed QR codes.","href":"/guides/third-party-application-payments#scan-centrapay-qr-code"},"665":{"path":["Reference","App Integrations","Paying a Payment Request"],"title":"Get the Payment Request","description":"Once the app has validated the url, use the id of the Payment Request to\ncall the Get Payment Request\nAPI from your server. The returned PaymentRequest model\nwill provide the details needed to determine if the Payment Request can be completed.","href":"/guides/third-party-application-payments#get-the-payment-request"},"666":{"path":["Reference","App Integrations","Paying a Payment Request"],"title":"Pay the Payment Request","description":"If the Payment Request is payable with your Asset then you should display the\nPayment Request details to the user. Some relevant fields to display are:","href":"/guides/third-party-application-payments#pay-the-payment-request"},"667":{"path":["Reference","App Integrations","Paying a Payment Request"],"title":"Payment Extensions","description":"Extensions to the payment protocol can be used to enhance the user's experience\nby providing alternative payment flows.","href":"/guides/third-party-application-payments#payment-extensions"},"668":{"path":["Reference","App Integrations","Paying a Payment Request"],"title":"Partial Pay","description":"If both your app and the merchant support Partial Pay\nthen you may allow the user to pay only a portion of the Payment Request and\nthen pay the remaining amount with an alternative payment method.","href":"/guides/third-party-application-payments#partial-pay"},"669":{"path":["Reference","App Integrations","Paying a Payment Request"],"title":"Testing","description":"Centrapay supports test resources that can be used for integration testing. A test\nmerchant will be provided that accepts test payments. If you have supplied a\ntest third-party asset then this merchant can be configured to accept it as a\npayment method.","href":"/guides/third-party-application-payments#testing"},"670":{"href":"/guides/transaction-reporting","path":["Reference","Merchant Integrations","Transaction Reporting"],"title":"Transaction Reporting","description":"Guidelines on communicating the Asset Types used for payment to the user in any transaction reporting function on the merchant side."}} \ No newline at end of file