# Table of Contents - [Obtain access token using OAuth 2.0.](#obtain-access-token-using-oauth-2-0-) - [Payments Platform](#payments-platform) - [CM.com Developers Portal - APIs, References & Integration](#cm-com-developers-portal-apis-references-integration) - [POS Payments](#pos-payments) - [Changelog](#changelog) - [/paymentmethods/ideal/v1/issuers](#-paymentmethods-ideal-v1-issuers) - [/paymentmethods/idealqr/v1/transactions/{transactionId}](#-paymentmethods-idealqr-v1-transactions-transactionid-) - [Get Started](#get-started) - [Introduction](#introduction) - [POS Payments](#pos-payments) - [Test Card Numbers](#test-card-numbers) - [Authorization](#authorization) - [Introduction](#introduction) - [Introduction](#introduction) - [Webhooks](#webhooks) - [Checkout](#checkout) - [Verification](#verification) - [Status Transitions](#status-transitions) - [Diagrams](#diagrams) - [Customer Journey](#customer-journey) - [Create Transaction](#create-transaction) - [Introduction](#introduction) - [Get Transaction](#get-transaction) - [Introduction](#introduction) - [Introduction](#introduction) - [Create a Refund](#create-a-refund) - [Overview](#overview) - [Introduction](#introduction) - [Schemas](#schemas) - [iDEAL](#ideal) - [PG 1.27.0](#pg-1-27-0) - [Status Transitions](#status-transitions) - [PG 1.26.2](#pg-1-26-2) - [Diagrams](#diagrams) - [Create Transaction](#create-transaction) - [PG 1.26.1](#pg-1-26-1) - [Get Transaction](#get-transaction) - [PS 25.12](#ps-25-12) - [Create a Refund](#create-a-refund) - [Payments Platform](#payments-platform) - [PS 25.06.0](#ps-25-06-0) - [PS 24.11](#ps-24-11) - [Fast Checkout (Snel Bestellen)](#fast-checkout-snel-bestellen-) - [Schemas](#schemas) - [Create a Refund](#create-a-refund) - [PS 25.15.0](#ps-25-15-0) - [Bancontact](#bancontact) - [iDEAL QR](#ideal-qr) - [PS 24.10](#ps-24-10) - [Status Transitions](#status-transitions) - [Changelog](#changelog) - [PS 24.09](#ps-24-09) - [Schemas](#schemas) - [Retrieve details about the available APIKeys](#retrieve-details-about-the-available-apikeys) - [Credit Card](#credit-card) - [Diagrams](#diagrams) - [Create Transaction](#create-transaction) - [Start Transaction](#start-transaction) - [Before integrating](#before-integrating) - [Get Transaction](#get-transaction) - [Status Transitions](#status-transitions) - [Apple Pay](#apple-pay) - [Schemas](#schemas) - [Start transaction](#start-transaction) - [Getting started with Cloud Integration](#getting-started-with-cloud-integration) - [Diagrams](#diagrams) - [Initialize transaction](#initialize-transaction) - [Create a Refund](#create-a-refund) - [Get Transaction](#get-transaction) - [Create a Refund](#create-a-refund) - [Authorize transaction](#authorize-transaction) - [Google Pay](#google-pay) - [Schemas](#schemas) - [Payments Platform](#payments-platform) - [Before integrating](#before-integrating) - [Status Transitions](#status-transitions) - [Diagrams](#diagrams) - [Authorize transaction](#authorize-transaction) - [Create a Refund](#create-a-refund) - [Initialize transaction](#initialize-transaction) - [Dynamic Integration](#dynamic-integration) - [Changelog](#changelog) - [About](#about) - [in3](#in3) - [Get Transaction](#get-transaction) - [Diagrams](#diagrams) - [Status Transitions](#status-transitions) - [Schemas](#schemas) - [Change the Language / Locale](#change-the-language-locale) - [Events](#events) - [Getting Started](#getting-started) - [Frequently Asked Questions](#frequently-asked-questions) - [Recipes](#recipes) - [Shopper & Order Items Data Flows](#shopper-order-items-data-flows) - [Orders List](#orders-list) - [Subscription Flow](#subscription-flow) - [Include Invite in Your Own System](#include-invite-in-your-own-system) - [Common Payment Flows](#common-payment-flows) - [Send Invite Using WhatsApp Business Platform](#send-invite-using-whatsapp-business-platform) - [Send Invite Using SMS](#send-invite-using-sms) - [Require Identification](#require-identification) - [Your First Conversation](#your-first-conversation) - [Advanced Features](#advanced-features) - [Order Details](#order-details) - [Customer Information](#customer-information) - [Customer Lifetime](#customer-lifetime) - [Channels](#channels) - [Search](#search) - [Supported Features](#supported-features) - [Context](#context) - [Customer POST](#customer-post) - [Online Payments](#online-payments) - [API Overview](#api-overview) - [Your First Dialog](#your-first-dialog) - [Transactional Dialogs](#transactional-dialogs) - [Getting started](#getting-started) - [Validation Webhook](#validation-webhook) - [Ask a question](#ask-a-question) - [Require Payment](#require-payment) - [Introduction](#introduction) - [POS Payments](#pos-payments) - [Transaction Webhook](#transaction-webhook) - [About](#about) - [Create dossier](#create-dossier) --- # Obtain access token using OAuth 2.0. ShellNodeRubyPHPPython Click `Try It!` to start a request and see the response here! [](https://www.cm.com/) * [Privacy Policy](https://www.cm.com/app/legal/cm-com/privacy-policy/) * [Terms and Conditions](https://www.cm.com/app/legal/cm-com/terms-and-conditions/) * [Cookie Policy](https://www.cm.com/about-cm/cookie-policy/) Jump to Product page Conversational AI Cloud Mobile Service Cloud Mobile Marketing Cloud Messaging Ticketing Payments Platform Voice Sign --- # Payments Platform ![payments-dark icon](https://www.cm.com/app/aurora/svg/apps/large/default/payments.svg) Online Payments [](https://developers.cm.com/payments-platform/#online-payments) ------------------------------------------------------------------------------------ Online Payments API allows merchants to create Online Payments. [Find out more](https://developers.cm.com/payments-platform/docs/cm-payments) ![voice-dark icon](https://www.cm.com/app/aurora/svg/apps/large/default/pos-terminal.svg) POS Payments [](https://developers.cm.com/payments-platform/#pos-payments) ------------------------------------------------------------------------------ POS Payments covers both ECR (Electronic Cash Register) solutions and integrations, as well as Smart POS Terminals. We have solutions to connect external ECRs to Smart POS Terminals through our Cloud Integration solution. On top of that we also enable 3rd party integrators to integrate directly with our Android based Terminal app and run side by side on the Smart POS Terminal! [Find out more](https://developers.cm.com/payments-platform/v22.06/docs/pos-payments) ![payments-dark icon](https://www.cm.com/app/aurora/svg/apps/large/default/payments.svg) Online Payments (Legacy) [](https://developers.cm.com/payments-platform/#online-payments-legacy) ---------------------------------------------------------------------------------------------------- Online Payments API allows merchants to create Online Payments. [Find out more](https://developers.cm.com/payments-platform/v22.06/docs/introduction) [](https://www.cm.com/) * [Privacy Policy](https://www.cm.com/app/legal/cm-com/privacy-policy/) * [Terms and Conditions](https://www.cm.com/app/legal/cm-com/terms-and-conditions/) * [Cookie Policy](https://www.cm.com/about-cm/cookie-policy/) Jump to Product page Conversational AI Cloud Mobile Service Cloud Mobile Marketing Cloud Messaging Ticketing Payments Platform Voice Sign --- # CM.com Developers Portal - APIs, References & Integration [![cpaas-dark icon](https://www.cm.com/app/aurora/svg/solutions/medium/light/default/solution-cpaas.svg)\ \ ### Messaging\ \ Send messages from your own platform via SMS, RCS, WhatsApp, Apple Messages for Business and more.\ \ Find out more](https://developers.cm.com/messaging/docs) [![caic-dark icon](https://www.cm.com/app/aurora/svg/solutions/medium/light/default/solution-caic.svg)\ \ ### Conversational AI Cloud\ \ Automate, manage, and guide experiences through Conversational AI Cloud's APIs and web hooks.\ \ Find out more](https://developers.cm.com/conversational-ai-cloud/docs) [![mmc-dark icon](https://www.cm.com/app/aurora/svg/solutions/medium/light/default/solution-mmc.svg)\ \ ### Mobile Marketing Cloud\ \ Start testing all Mobile Marketing Cloud applications from your own environment. Get access to E-mail and SMS, and add different other conversational channels using the platform's channels app.\ \ Find out more](https://developers.cm.com/mobile-marketing-cloud/docs) [![msc-dark icon](https://www.cm.com/app/aurora/svg/solutions/medium/light/default/solution-msc.svg)\ \ ### Mobile Service Cloud\ \ Information about the APIs for adding the functionalities of the Mobile Service Cloud into your own products.\ \ Find out more](https://developers.cm.com/mobile-service-cloud/docs) [![sign-dark icon](https://www.cm.com/app/aurora/svg/solutions/medium/light/default/solution-sign.svg)\ \ ### Sign\ \ Offer a great and integrated electronic signing experience within your own software using our Sign API.\ \ Find out more](https://developers.cm.com/sign/docs) [![identity icon](https://www.cm.com/app/aurora-static/svg/solutions/medium/dark/default/solution-mobile-identity-services.svg)\ \ ### Verification\ \ Increase trust in any workflow by adding one or more verification services increasing the level of identity assurance.\ \ Find out more](https://developers.cm.com/verification) [![payments-dark icon](https://www.cm.com/app/aurora/svg/solutions/medium/light/default/solution-payments.svg)\ \ ### Payments Platform\ \ Integrate our payments API into your webshop or e-commerce site. The API allows customers full access to all payment methods and functionalities.\ \ Find out more](https://developers.cm.com/payments-platform) [![voice-dark icon](https://www.cm.com/app/aurora-static/svg/solutions/medium/light/default/solution-voice.svg)\ \ ### Voice\ \ Manage your SIP accounts, incoming numbers and Call Detail Records linked to your voice account. Or configure outgoing scenarios for notifications, One Time Passwords and Request DTMF.\ \ Find out more](https://developers.cm.com/voice/docs) [![ticketing-dark icon](https://www.cm.com/app/aurora/svg/solutions/medium/light/default/solution-ticketing.svg)\ \ ### Ticketing\ \ Build your own ticket shop with ease using the ticketing APIs. Create and adjust orders, and have customers pay on a checkout page.\ \ Find out more](https://developers.cm.com/ticketing/docs) [![ticketing-dark icon](https://www.cm.com/app/aurora-static/svg/solutions/medium/light/default/solution-central-services.svg)\ \ ### Central Services\ \ Integrate with our platform services. These services are building blocks used within CM's own software and can be directly integrated with for your custom needs.\ \ Find out more](https://developers.cm.com/central-services/docs) [](https://www.cm.com/) * [Privacy Policy](https://www.cm.com/app/legal/cm-com/privacy-policy/) * [Terms and Conditions](https://www.cm.com/app/legal/cm-com/terms-and-conditions/) * [Cookie Policy](https://www.cm.com/about-cm/cookie-policy/) Jump to Product page Conversational AI Cloud Mobile Service Cloud Mobile Marketing Cloud Messaging Ticketing Payments Platform Voice Sign --- # POS Payments POS Payments [](https://developers.cm.com/payments-platform/v1.0.2/docs/pos-payments#pos-payments) ====================================================================================================== POS Payments covers both ECRs as (Electronic Cash Registers) and smart payment terminals. Both can run on separate devices but we also have solutions where both can be run on the same device! Smart payment terminals [](https://developers.cm.com/payments-platform/v1.0.2/docs/pos-payments#smart-payment-terminals) ---------------------------------------------------------------------------------------------------------------------------- With our lineup of Sunmi devices, we support Android based smart payment terminals that are no longer single purpose devices. With these smart terminals, customers are able to connect remotely to these terminals using our Cloud API or, to implement their own Android based ECR app which communicates to our terminal app by means of app to app communication. | | | | --- | --- | | [![](https://files.readme.io/e4f7b6f-cloud.png)
**Cloud Integration**](https://developers.cm.com/payments-platform/v1.0.2/docs/merchant-api) | [![](https://files.readme.io/79b889e-cloud-removebg-preview.png)
**ECR App 2 Terminal App Integration**](https://developers.cm.com/payments-platform/v1.0.2/docs/app-2-app-integration) | Choose your desired way of integration in the Link to next Steps to find out more! Updated almost 3 years ago * * * * [Getting started with Cloud Integration](https://developers.cm.com/payments-platform/v1.0.2/docs/merchant-api) * [Getting started with App 2 App Integration](https://developers.cm.com/payments-platform/v1.0.2/docs/app-2-app-integration) [](https://www.cm.com/) * [Privacy Policy](https://www.cm.com/app/legal/cm-com/privacy-policy/) * [Terms and Conditions](https://www.cm.com/app/legal/cm-com/terms-and-conditions/) * [Cookie Policy](https://www.cm.com/about-cm/cookie-policy/) Jump to Product page Conversational AI Cloud Mobile Service Cloud Mobile Marketing Cloud Messaging Ticketing Payments Platform Voice Sign --- # Changelog [PG 1.27.0](https://developers.cm.com/payments-platform/changelog/pg-1270) =========================================================================== 13 days ago by [\[email protected\]](https://developers.cm.com/cdn-cgi/l/email-protection) These are the changes we’ll be releasing on acceptance on 08-10-2025 [PG 1.26.2](https://developers.cm.com/payments-platform/changelog/pg-1262) =========================================================================== 27 days ago by [\[email protected\]](https://developers.cm.com/cdn-cgi/l/email-protection) The following changes will be deployed to acceptance on 24-09-2025. [PS 25.15.0](https://developers.cm.com/payments-platform/changelog/psp-ps-25-15) ================================================================================= about 1 month ago by ReadMe API Feature Changes [PG 1.26.1](https://developers.cm.com/payments-platform/changelog/pg-1261) =========================================================================== about 1 month ago by [\[email protected\]](https://developers.cm.com/cdn-cgi/l/email-protection) The following changes will be deployed to acceptance on 10-09-2025 before going to production after 2 weeks. [PS 25.12](https://developers.cm.com/payments-platform/changelog/psp-ps-25-12) =============================================================================== 4 months ago by ReadMe API Feature Changes [PS 25.06.0](https://developers.cm.com/payments-platform/changelog/psp-ps-25-06) ================================================================================= 9 months ago by ReadMe API Various bug fixes and optimizations. [PS 24.11](https://developers.cm.com/payments-platform/changelog/psp-ps-24-11) =============================================================================== 11 months ago by ReadMe API Feature changes [PS 24.10](https://developers.cm.com/payments-platform/changelog/psp-ps-24-10) =============================================================================== about 1 year ago by ReadMe API Feature changes [PS 24.09](https://developers.cm.com/payments-platform/changelog/psp-ps-24-09) =============================================================================== over 1 year ago by ReadMe API Bug Fixes improved [PS 24.08](https://developers.cm.com/payments-platform/changelog/psp-ps-24-08) =============================================================================== over 1 year ago by ReadMe API * Features * Improvided the client side encryption library to allow merchant key and/or merchant name [](https://www.cm.com/) * [Privacy Policy](https://www.cm.com/app/legal/cm-com/privacy-policy/) * [Terms and Conditions](https://www.cm.com/app/legal/cm-com/terms-and-conditions/) * [Cookie Policy](https://www.cm.com/about-cm/cookie-policy/) Jump to Product page Conversational AI Cloud Mobile Service Cloud Mobile Marketing Cloud Messaging Ticketing Payments Platform Voice Sign --- # /paymentmethods/ideal/v1/issuers ShellNodeRubyPHPPython Bearer [Log in to use your API keys](https://developers.cm.com/login?redirect_uri=/payments-platform/reference/getidealissuers) Click `Try It!` to start a request and see the response here! [](https://www.cm.com/) * [Privacy Policy](https://www.cm.com/app/legal/cm-com/privacy-policy/) * [Terms and Conditions](https://www.cm.com/app/legal/cm-com/terms-and-conditions/) * [Cookie Policy](https://www.cm.com/about-cm/cookie-policy/) Jump to Product page Conversational AI Cloud Mobile Service Cloud Mobile Marketing Cloud Messaging Ticketing Payments Platform Voice Sign --- # /paymentmethods/idealqr/v1/transactions/{transactionId} ShellNodeRubyPHPPython Bearer [Log in to use your API keys](https://developers.cm.com/login?redirect_uri=/payments-platform/reference/getidealqrtransaction) Click `Try It!` to start a request and see the response here! [](https://www.cm.com/) * [Privacy Policy](https://www.cm.com/app/legal/cm-com/privacy-policy/) * [Terms and Conditions](https://www.cm.com/app/legal/cm-com/terms-and-conditions/) * [Cookie Policy](https://www.cm.com/about-cm/cookie-policy/) Jump to Product page Conversational AI Cloud Mobile Service Cloud Mobile Marketing Cloud Messaging Ticketing Payments Platform Voice Sign --- # Get Started Set up your account [](https://developers.cm.com/payments-platform/docs/get-started#set-up-your-account) ============================================================================================================ Contact our support team and they will help you to create an account on our test environment. Once your test account is created they will provide you with the API credentials that you'll need when building your integration against our TEST environment. Once your integration is completed and you are ready to go live please contact our support team and they will help you to create an account on our production environment. | Environment | Description | | --- | --- | | [TEST](https://gateway.acceptance.cmpayments.nl/api/v1/docs/) | Build your integration using this environment. There are test card numbers that you can use to test your integration. Find more details [here](https://developers.cm.com/payments-platform/docs/testing-data)
. | | [PRODUCTION](https://api.pay.cm.com/api/v1/docs/) | Use this environment when you are ready to go live. | * * * Build your integration [](https://developers.cm.com/payments-platform/docs/get-started#build-your-integration) ================================================================================================================== * Integrate with a pre-built CM.com checkout You do not want to create your own checkout user interface, instead you build an integration with our pre-built CM.com [Checkout](https://developers.cm.com/payments-platform/docs/checkout-1) where your customers can be redirected to in order to continue with the payment. When the payment process is completed customers will be redirected to the URL you specify on your checkout. * Create your own user interface and integrate separately per payment method You want to create your own user interface and you will build an integration for each payment method you want to make available on your interface. This is the list of available payment methods you can integrate with: * [iDEAL](https://developers.cm.com/payments-platform/docs/ideal-1) * [iDEAL QR](https://developers.cm.com/payments-platform/docs/ideal-qr) * [Credit Card](https://developers.cm.com/payments-platform/docs/credit-card) * [Bancontact](https://developers.cm.com/payments-platform/docs/bancontact-1) * [Apple Pay](https://developers.cm.com/payments-platform/docs/applepay-1) * [Google Pay](https://developers.cm.com/payments-platform/docs/googlepay-1) * [in3](https://developers.cm.com/payments-platform/docs/in3-1) Requests / Responses [](https://developers.cm.com/payments-platform/docs/get-started#requests--responses) ------------------------------------------------------------------------------------------------------------- In the following documentation you'll find examples of the request and response payloads per payment flow. We will usually provide a few options since we have optional parameters. Each payment flow will contain a JSON example of the full-request with all optional parameters being set and possibly some examples with only the mandatory fields and/or examples with conditional fields (if applicable). After the requests we have written down the response you can expect. OpenAPI [](https://developers.cm.com/payments-platform/docs/get-started#openapi) ------------------------------------------------------------------------------------ We have an up-to-date [openapi.yaml](https://api.pay.cm.com/api/v1/docs/openapi.yaml) specification available for those that want to use it. Updated 11 months ago * * * [](https://www.cm.com/) * [Privacy Policy](https://www.cm.com/app/legal/cm-com/privacy-policy/) * [Terms and Conditions](https://www.cm.com/app/legal/cm-com/terms-and-conditions/) * [Cookie Policy](https://www.cm.com/about-cm/cookie-policy/) Jump to Product page Conversational AI Cloud Mobile Service Cloud Mobile Marketing Cloud Messaging Ticketing Payments Platform Voice Sign --- # Introduction The CM.com Online Payments API enables you to manage (online) orders and payments. If you are looking for the POS Payments API, then follow this [link](https://developers.cm.com/payments-platform/v1.0.2/docs) . Updated over 2 years ago * * * [](https://www.cm.com/) * [Privacy Policy](https://www.cm.com/app/legal/cm-com/privacy-policy/) * [Terms and Conditions](https://www.cm.com/app/legal/cm-com/terms-and-conditions/) * [Cookie Policy](https://www.cm.com/about-cm/cookie-policy/) Jump to Product page Conversational AI Cloud Mobile Service Cloud Mobile Marketing Cloud Messaging Ticketing Payments Platform Voice Sign --- # POS Payments POS Payments [](https://developers.cm.com/payments-platform/v22.06/docs/pos-payments#pos-payments) ====================================================================================================== POS Payments covers both ECRs as (Electronic Cash Registers) and smart payment terminals. Both can run on separate devices but we also have solutions where both can be run on the same device! Smart payment terminals [](https://developers.cm.com/payments-platform/v22.06/docs/pos-payments#smart-payment-terminals) ---------------------------------------------------------------------------------------------------------------------------- With our lineup of Sunmi devices, we support Android based smart payment terminals that are no longer single purpose devices. With these smart terminals, customers are able to connect remotely to these terminals using our Cloud API or, to implement their own Android based ECR app which communicates to our terminal app by means of app to app communication. | | | | --- | --- | | [![](https://files.readme.io/e4f7b6f-cloud.png)
**Cloud Integration**](https://developers.cm.com/payments-platform/v1.0.2/docs/merchant-api) | [![](https://files.readme.io/79b889e-cloud-removebg-preview.png)
**ECR App 2 Terminal App Integration**](https://developers.cm.com/payments-platform/v1.0.2/docs/app-2-app-integration) | Updated almost 3 years ago * * * [](https://www.cm.com/) * [Privacy Policy](https://www.cm.com/app/legal/cm-com/privacy-policy/) * [Terms and Conditions](https://www.cm.com/app/legal/cm-com/terms-and-conditions/) * [Cookie Policy](https://www.cm.com/about-cm/cookie-policy/) Jump to Product page Conversational AI Cloud Mobile Service Cloud Mobile Marketing Cloud Messaging Ticketing Payments Platform Voice Sign --- # Test Card Numbers Each number must be prefixed to get a complete card number: * for American Express: 3411 1111 111; * for Visa & VPay: 4111 1111 1111; * for Mastercard: 5555 5555 5555; * for Bancontact & Maestro: 6703 9999 8800. | Scenario | Scheme | Last Four Digits | Authentication Scenario | | --- | --- | --- | --- | | | **American Express** | 1111 | Standard test card number; authentication required. | | 51 | | 1517 | Frictionless, no authentication required. | | 52 | | 1525 | Card is soft-declined during first authorization attempt. | | 53 | | 1533 | Card is always soft-declined. | | 55 | | 1558 | Card is not enrolled for 3DSv2 and with reason code 13. | | 56 | | 1566 | Unknown error during authentication. | | 57 | | 1574 | Card is rejected at authentication. | | 59 | | 1590 | Card not supported by the issuer. | | 61 | | 1616 | 3RI with decoupled successful authentication (5 seconds delay). | | 62 | | 1624 | 3RI with decoupled failed authentication (5 seconds delay). | | 65 | | 1657 | 3RI decoupled authentication not supported, authentication success. | | 66 | | 1665 | 3RI decoupled authentication not supported, authentication failed. | | | | wxyz | Any other 4 digits not mentioned; authentication required. | | | **MasterCard** | 4444 | Standard test card number; authentication required. | | 51 | | 4519 | Frictionless, no authentication required. | | 52 | | 4527 | Card is soft-declined during first authorization attempt. | | 53 | | 4535 | Card is always soft-declined. | | 54 | | 4543 | Card is not enrolled for 3DSv2 and with reason code 82. | | 55 | | 4550 | Card is not enrolled for 3DSv2 and with reason code 13. | | 56 | | 4568 | Unknown error during authentication. | | 57 | | 4576 | Card is rejected at authentication. | | 59 | | 4592 | Card not supported by the issuer. | | 61 | | 4618 | 3RI with decoupled successful authentication (5 seconds delay). | | 62 | | 4626 | 3RI with decoupled failed authentication (5 seconds delay). | | 65 | | 4659 | 3RI decoupled authentication not supported, authentication success. | | 66 | | 4667 | 3RI decoupled authentication not supported, authentication failed. | | | | wxyz | Any other 4 digits not mentioned; authentication required. | | | **Visa** | 1111 | Standard test card number; authentication required. | | 51 | | 1517 | Frictionless, no authentication required. | | 52 | | 1525 | Card is soft-declined during first authorization attempt. | | 53 | | 1533 | Card is always soft-declined. | | 55 | | 1558 | Card is not enrolled for 3DSv2 and with reason code 13. | | 56 | | 1556 | Unknown error during authentication. | | 57 | | 1574 | Card is rejected at authentication. | | 59 | | 1590 | Card not supported by the issuer. | | 61 | | 1616 | 3RI with decoupled successful authentication (5 seconds delay). | | 62 | | 1624 | 3RI with decoupled failed authentication (5 seconds delay). | | 65 | | 1657 | 3RI decoupled authentication not supported, authentication success. | | 66 | | 1665 | 3RI decoupled authentication not supported, authentication failed. | | | | wxyz | Any other 4 digits not mentioned; authentication required. | | | **Bancontact** | 1111 | Standard test card number; authentication required. | | 51 | | 1517 | Frictionless, no authentication required. | | 52 | | 1525 | Card is soft-declined during first authorization attempt. | | 53 | | 1533 | Card is always soft-declined. | | 55 | | 1558 | Card is not enrolled for 3DSv2 and with reason code 13. | | 56 | | 1556 | Unknown error during authentication. | | 57 | | 1574 | Card is rejected at authentication. | | 59 | | 1590 | Card not supported by the issuer. | | 61 | | 1616 | 3RI with decoupled successful authentication (5 seconds delay). | | 62 | | 1624 | 3RI with decoupled failed authentication (5 seconds delay). | | 65 | | 1657 | 3RI decoupled authentication not supported, authentication success. | | 66 | | 1665 | 3RI decoupled authentication not supported, authentication failed. | | | | wxyz | Any other 4 digits not mentioned; authentication required. | **The column 'Scenario' can be used for in communication with support if there are any (integration) questions.** Updated about 1 year ago * * * [](https://www.cm.com/) * [Privacy Policy](https://www.cm.com/app/legal/cm-com/privacy-policy/) * [Terms and Conditions](https://www.cm.com/app/legal/cm-com/terms-and-conditions/) * [Cookie Policy](https://www.cm.com/about-cm/cookie-policy/) Jump to Product page Conversational AI Cloud Mobile Service Cloud Mobile Marketing Cloud Messaging Ticketing Payments Platform Voice Sign --- # Authorization In order to integrate with our CM.com Online Payments API you need to be authorized. The current authorization process follows the standard OAuth 2.0 client credentials flow: Client Credentials Flow [](https://developers.cm.com/payments-platform/docs/authorization-3#client-credentials-flow) ======================================================================================================================== The Client Credentials Flow ([defined in OAuth 2.0 RFC 6749, section 4.4](https://datatracker.ietf.org/doc/html/rfc6749#section-4.4) ) requires an application exchanging its application credentials (`clientID` and `clientSecret`) for an access token. The access token should be provided as a `Bearer` token in the Authorization header on subsequent calls to the API. How does it work? [](https://developers.cm.com/payments-platform/docs/authorization-3#how-does-it-work) ----------------------------------------------------------------------------------------------------------- ![](https://files.readme.io/4e1eb27-SQ_-_Authorization.svg) In the diagram above the following steps are performed: 1. You make a request to [Get an access token](https://developers.cm.com/payments-platform/docs/authorization-3#get-an-access-token) . This is a request to our public `oauth2/token` API endpoint using the API credentials (clientID and clientSecret) provided by CM. 2. If you get a successful response an `access_token` will be retrieved. The `access_token` has a lifetime (indicated by `expires_in` on the retrieved response), so you can use the same `access_token` as `Bearer` token in several subsequent calls to the API as long as the token is not expired. If the token expires **there is no refresh token in this flow**, so you should do a new request to [Get an access token](https://developers.cm.com/payments-platform/docs/authorization-3#get-an-access-token) , receive a new `access_token` and repeat this step. You do not have reinvent the wheel in your code because there are already known OAuth2 libraries in many languages that automate this: [OAuth libraries](https://oauth.net/code/) . Get an Access token [](https://developers.cm.com/payments-platform/docs/authorization-3#get-an-access-token) ================================================================================================================ Request [](https://developers.cm.com/payments-platform/docs/authorization-3#request) ---------------------------------------------------------------------------------------- Get an Access token - Example Request `curl -X POST \ --url https://api.pay.cm.com/api/v1/authorization/oauth2/token \ --header 'Content-Type: application/x-www-form-urlencoded' \ --header 'Accept: application/json' \ --data-urlencode 'client_id=' \ --data-urlencode 'client_secret=' \ --data-urlencode 'grant_type=client_credentials'` Parameter [](https://developers.cm.com/payments-platform/docs/authorization-3#parameter) -------------------------------------------------------------------------------------------- | Name | Type | Description | | --- | --- | --- | | client\_id | String | This is part of the API credentials provided by CM. | | client\_secret | String | This is part of the API credentials provided by CM. | | grant\_type | String | This is a fixed value: 'client\_credentials' | Response [](https://developers.cm.com/payments-platform/docs/authorization-3#response) ------------------------------------------------------------------------------------------ Get an Access token - Example Response `{ "access_token": "YWMXMDI0YWQTODU0NI0ZZMRKLWFKOTUTYJQ5MZU0MTI3M2RI", "expires_in": 3600, "token_type": "Bearer" }` Parameter [](https://developers.cm.com/payments-platform/docs/authorization-3#parameter-1) ---------------------------------------------------------------------------------------------- | Name | Type | Description | | --- | --- | --- | | access\_token | String | **This is the access token that you use as a `Bearer` token in subsequent API calls.** | | expires\_in | Int | The lifetime in seconds of the access token. If the token expires **there is no refresh token in this flow**, so you should do a new request to [Get an access token](https://developers.cm.com/payments-platform/docs/authorization-3#get-an-access-token)
. | | token\_type | String | This is a fixed value: 'Bearer' | Make API calls using Access token as `Bearer` token [](https://developers.cm.com/payments-platform/docs/authorization-3#make-api-calls-using-access-token-as-bearer-token) ============================================================================================================================================================================== Once you made the request to [Get an access token](https://developers.cm.com/payments-platform/docs/authorization-3#get-an-access-token) you can use the retrieved `access_token` as `Bearer` token in your subsequent API calls as long as the token is not expired. Example, given `"access_token": "YWMXMDI0YWQTODU0NI0ZZMRKLWFKOTUTYJQ5MZU0MTI3M2RI"` we make an API call to create a checkout transaction using the `access_token` as `Bearer` in the Authorization header: Make API call using Access token - Example `curl -X POST \ --url https://api.pay.cm.com/api/v1/paymentmethods/checkout/v1/transactions \ --header 'Authorization: Bearer YWMXMDI0YWQTODU0NI0ZZMRKLWFKOTUTYJQ5MZU0MTI3M2RI' \ --header 'Content-Type: application/json' \ --header 'Accept: application/json' \ --data '{ ... ...` Updated about 1 year ago * * * [](https://www.cm.com/) * [Privacy Policy](https://www.cm.com/app/legal/cm-com/privacy-policy/) * [Terms and Conditions](https://www.cm.com/app/legal/cm-com/terms-and-conditions/) * [Cookie Policy](https://www.cm.com/about-cm/cookie-policy/) Jump to Product page Conversational AI Cloud Mobile Service Cloud Mobile Marketing Cloud Messaging Ticketing Payments Platform Voice Sign --- # Introduction The Attractions Ticketing (previously GlobalTicket) Scan API allows API users to retrieve and set a status of barcodes for connected clients. This information can be used to set up scanning services. It can also be used to create reservations in the availability of the client, so sell timeslot tickets on-site. Financially, this API allows for users to retrieve the turnover and number of tickets sold for a selected period. **SSL connection** Please use for every request the HTTPS protocol. Requests via HTTP are not working and will result in an error message. **apiKey / apiSecret** Every client has a different public and private key. The apiKey is a public key and needs to be included in every request. The apiSecret is a private key and never needs to be exchanged or included in the requests. Please use the apiSecret to sign the data with Base64 encode - SHA256 and include this value as “HMACKey”. Updated almost 3 years ago * * * [](https://www.cm.com/) * [Privacy Policy](https://www.cm.com/app/legal/cm-com/privacy-policy/) * [Terms and Conditions](https://www.cm.com/app/legal/cm-com/terms-and-conditions/) * [Cookie Policy](https://www.cm.com/about-cm/cookie-policy/) Jump to Product page Conversational AI Cloud Mobile Service Cloud Mobile Marketing Cloud Messaging Ticketing Payments Platform Voice Sign --- # Introduction Sign by CM.com is a service to have users sign PDF documents online. You can use the [Sign application](https://www.cm.com/app/sign/) or, if you want an integration with your own systems, [request access](https://www.cm.com/app/sign-registration/) to our API. This documentation focuses on the API integration. For a complete technical documentation with specifications for all field types, JSON objects and methods, you can consult our complete API reference: [API reference](https://developers.cm.com/sign/reference/document) If you need technical assistance, please contact your account manager or support ([\[email protected\]](https://developers.cm.com/cdn-cgi/l/email-protection#5e2d2b2e2e312c2a1e3d33703d3133) ). Service description [](https://developers.cm.com/sign/docs/introduction#service-description) ------------------------------------------------------------------------------------------------ ### Dossiers [](https://developers.cm.com/sign/docs/introduction#dossiers) A dossier is a collection of information related to the signing process of a document. Dossiers consist, among other things, of: * Files: the PDF document(s) to be signed * Invitees: the persons who have to sign or review the dossier * Owners (optional): the contact person who will be informed about status updates of the dossier * Attachments (optional): files attached to the dossier which doesn't have to be signed A dossier expires after 30 days by default, this can be customised when creating the dossier (up to 90 days). ### Files [](https://developers.cm.com/sign/docs/introduction#files) Files are the PDF documents presented to the user to be signed. When a dossier is completed, the fields are added to the file, which is then digitally signed with a certificate. This certificate is trusted by Adobe Reader, as it is part of the [Adobe Approved Trust List](https://helpx.adobe.com/acrobat/kb/approved-trust-list2.html) . The signature allows end users to verify the integrity of the document, proves the document has not been altered, and by whom and when the document has been signed. ### Invitees [](https://developers.cm.com/sign/docs/introduction#invitees) Invitees are persons asked to sign or review a dossier. Invitees' properties: * Name: the name that will be used in communication to address the invitee * Fields: locations within a PDF document for information to be added. See [fields](https://developers.cm.com/sign/docs/introduction#fields) . * Email (optional): the email address that will be used to notify the invitee about this dossier and send the signed document * Locale (optional): the locale to be used in invitations and the UI, the default locale is `en-US` * Position (optional): positions determine the order of signing, lower positions will be invited earlier * Authentication methods (optional): additional authentication before the user can view the dossier * Identification methods (optional): additional identification in order to sign the dossier * Notifications (optional): which notifications should be sent, by default all notifications are sent * Payments (optional): additional payment before signing the dossier * Phone number (optional): the phone number to be used to send an invite or OTP to * Reference (optional): allows the invitee it to be linked to an ID known within your organisation * Read-only (optional): when read-only the invitee will review instead of sign the dossier * Redirect URL (optional): URL to redirect the invitee to after signing, approving or declining the dossier ### Fields [](https://developers.cm.com/sign/docs/introduction#fields) Fields are locations within a PDF document where information will be added. Fields belong to a specific file and invitee and have parameters to configure its position(s) in the document. Supported field types: * `signature`: the invitee is asked for a signature * `initials`: the invitee is asked for its initials. Initials can be specified for a page range and the invitee has to confirm its initials each page. * `signatureDate`: the date the invitee signed the document, automatically determined * `text`: a text field that can be filled in by the invitee * `textarea`: a multi-line text field that can be filled in by the invitee * `label`: a text field that contains a predefined text which cannot be modified * `checkbox`: a box which can be checked by the user * `radio`: a group of radio buttons, of which one option must be selected * `stamp`: the invitee is asked for its stamp/seal (hanko), mostly used in Asia and Africa ### Invites [](https://developers.cm.com/sign/docs/introduction#invites) An invite is a unique URL linked to an invitee to view the dossier. Sign can send these invites to the invitees or you can distribute the URL yourself, for example by redirecting or sending emails yourself. An invite can have a custom expiration time, specified during creation. Creating multiple invites for an invitee is possible. Supported message channels: * `email`: the invite is send to the email address of the invitee. * `sms`: the invite is send via sms to the phone number of the invitee (only available when configured). * `whatsapp`: the invite is send via WhatsApp Business Platform to the phone number of the invitee (only available when configured). * default: the invite URL will be returned in the response for you to distribute yourself. ### Owners [](https://developers.cm.com/sign/docs/introduction#owners) A dossier owner is a contact person who will be informed about status updates of the dossier. If set, the owner's name will be used in communication to the invitees, otherwise the organisation name is used instead. ### Attachments [](https://developers.cm.com/sign/docs/introduction#attachments) Attachments are files attached to the dossier which doesn't have to be signed, for example, a Terms and Conditions document. ### Audit report [](https://developers.cm.com/sign/docs/introduction#audit-report) The audit report contains all info and events related to the dossier for evidence purposes, like documents, owners, invitees, fields and events. ### Data retention [](https://developers.cm.com/sign/docs/introduction#data-retention) Sign is only a signing service and does not store or retain dossiers and documents beyond the expiration date of the dossier, to comply with the General Data Protection Regulation (GDPR). Documents and personal data are anonymized or deleted. It's thus required to download dossiers after completion and to store them within your own company records. Environments [](https://developers.cm.com/sign/docs/introduction#environments) ---------------------------------------------------------------------------------- Sign provides two environments: * Sandbox: `https://api.cm.com/sign-sandbox/v1/` * Production: `https://api.cm.com/sign/v1/` The sandbox environment is intended to do your initial experimentation with. Unlike the production environment, it doesn't add a cryptographic signature to the document and you will not be billed for using the sandbox environment. > Please note that the credentials for sandbox and production environment are different. Updated over 1 year ago * * * [](https://www.cm.com/) * [Privacy Policy](https://www.cm.com/app/legal/cm-com/privacy-policy/) * [Terms and Conditions](https://www.cm.com/app/legal/cm-com/terms-and-conditions/) * [Cookie Policy](https://www.cm.com/about-cm/cookie-policy/) Jump to Product page Conversational AI Cloud Mobile Service Cloud Mobile Marketing Cloud Messaging Ticketing Payments Platform Voice Sign --- # Webhooks Webhooks are used to communicate changes in transactions. You can subscribe on multiple events types for the same transaction when creating the transaction. A transaction will have an optional field called "webhooks" where you can specify the webhook for a specific event. If you don't specify any webhooks, none will be sent. Key Considerations [](https://developers.cm.com/payments-platform/docs/webhooks-1#key-considerations) --------------------------------------------------------------------------------------------------------- > 🚧 > > webhooks are only a "best effort" mechanism > > > ------------------------------------------------- > > In the payment process, it is essential to stay informed about the status of a transaction (e.g., whether it has been successfully paid or has expired). > > Receiving a webhook notification (if configured) is helpful, but you should not depend on it to check the transaction details. > > Once a transaction is created, you can retrieve its latest details at any time, and **it is your responsibility to do so**. > > For example, if a transaction has been created and a significant amount of time has passed without receiving a webhook notification, but you suspect the payment status may have changed, then you can directly request the latest details to verify whether the status has been updated. Webhook events [](https://developers.cm.com/payments-platform/docs/webhooks-1#webhook-events) ------------------------------------------------------------------------------------------------- Each event type can be used at most once per transaction. A URL can have multiple events. json `{ ... "webhooks": [ { "url": "https://yourdomain.tld/statuschange?purchaseId=order123", "events": [ "FINALSTATUS","STATUS_CHANGE" ] }, { "url": "https://yourdomain.tld/refundchange?purchaseId=order123", "events": [ "REFUND_STATUS" ] } ] ... }` All event types: | Webhook Events | Description | | --- | --- | | `FINALSTATUS` | When the status of the transaction becomes `SUCCESS`, `CANCELLED`, `EXPIRED`, `FAILURE`. | | `STATUS_CHANGE` | When the status of the transaction has any change. | | `REFUND_STATUS` | When the status of a refund on the transaction has changed. | | `QR_PAYMENT_CREATED` | When a payment is created using an iDEAL QR code. | Not all transaction types support the same webhook events. Below is a list specifying which event types are available per transaction type. | Transaction type | Supported Webhook Events | | --- | --- | | Checkout transaction | `FINALSTATUS`, `STATUS_CHANGE`, `REFUND_STATUS` | | iDEAL transaction | `FINALSTATUS`, `STATUS_CHANGE`, `REFUND_STATUS` | | iDEAL QR transaction | `FINALSTATUS`, `STATUS_CHANGE`, `REFUND_STATUS`, `QR_PAYMENT_CREATED` | | Credit Card transaction | `FINALSTATUS`, `STATUS_CHANGE`, `REFUND_STATUS` | | Bancontact transaction | `FINALSTATUS`, `STATUS_CHANGE`, `REFUND_STATUS` | | Apple Pay transaction | `FINALSTATUS`, `STATUS_CHANGE`, `REFUND_STATUS` | | Google Pay transaction | `FINALSTATUS`, `STATUS_CHANGE`, `REFUND_STATUS` | | in3 transaction | `FINALSTATUS`, `STATUS_CHANGE` | Request Body [](https://developers.cm.com/payments-platform/docs/webhooks-1#request-body) --------------------------------------------------------------------------------------------- JSON `{ "createdAt": "2006-01-02T15:04:05Z", "event": "FINALSTATUS", "transaction": "8db1e7fa-ba8a-4189-92fd-67a20217443d", "reference": "20210623130413", "payment": "fe77cd5f-2054-432d-b1c7-f019282785b2" }` Parameters [](https://developers.cm.com/payments-platform/docs/webhooks-1#parameters) ----------------------------------------------------------------------------------------- | Parameter | Type | Description | Constraints | | --- | --- | --- | --- | | createdAt | String(RFC3339) | The creation time of the webhook. | ISO 8601 date and time. | | event | String | The event that triggered the webhook. | The possible values are: `FINALSTATUS`, `STATUS_CHANGE` , `REFUND_STATUS`, `QR_PAYMENT_CREATED`. | | transaction | String(36) | The unique identifier of the transaction to which the webhook belongs. | | | reference | String(1...255) | The `reference` you provided in the original transaction request | | Optional parameters [](https://developers.cm.com/payments-platform/docs/webhooks-1#optional-parameters) ----------------------------------------------------------------------------------------------------------- | Parameter | Type | Description | Constraint | | --- | --- | --- | --- | | payment | String(36) | The unique identifier of a payment related to a transaction. | Only for specific webhook events such as `QR_PAYMENT_CREATED`. | What to do after receiving a webhook [](https://developers.cm.com/payments-platform/docs/webhooks-1#what-to-do-after-receiving-a-webhook) --------------------------------------------------------------------------------------------------------------------------------------------- A webhook call on its own does not contain the information you usually require to update the transaction in your application. Best practice is to see the webhook as a trigger. This trigger should then cause your application to GET the transaction. This insures you have the latest data and that the data originates from CM.com instead of being spoofed. Error handling [](https://developers.cm.com/payments-platform/docs/webhooks-1#error-handling) ------------------------------------------------------------------------------------------------- In cases where your response is not a `2xx` status code we will retry the webhook at a later time. We will attempt up to 50 deliveries over a span of about 14 days for the same webhook. If the webhook was not delivered successfully within that time, it will be discarded and not tried again. > 📘 > > Our webhook mechanism uses a circuit breaker pattern, by temporarily blocking requests to a host after detecting a certain number of consecutive failures, allowing time for the issue to resolve before trying again. > > > ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- Updated 11 months ago * * * [](https://www.cm.com/) * [Privacy Policy](https://www.cm.com/app/legal/cm-com/privacy-policy/) * [Terms and Conditions](https://www.cm.com/app/legal/cm-com/terms-and-conditions/) * [Cookie Policy](https://www.cm.com/about-cm/cookie-policy/) Jump to Product page Conversational AI Cloud Mobile Service Cloud Mobile Marketing Cloud Messaging Ticketing Payments Platform Voice Sign --- # Checkout A checkout, also known as Hosted Checkout, is a payment page that is hosted by CM.com. Using a checkout allows you to accept payments from your customers without building your own user interface and integrating for each payment method you want to make available for your customers. You simply create a checkout using our API and redirect the customer to the pre-built CM.com Checkout. After the customer finishes their payment, they'll be redirected back to your webshop. How does it work? [](https://developers.cm.com/payments-platform/docs/checkout-1#how-does-it-work) ====================================================================================================== ![](https://files.readme.io/dfe2159-Canvas_-_Webshop.png) 1. Customer opens your webshop, adds some items to the shopping basket, and clicks on 'Proceed to Checkout'. 2. After creating a Checkout transaction using the [create Checkout transaction](https://developers.cm.com/payments-platform/docs/create-transaction) endpoint, you redirect the customer to our pre-built CM.com Checkout. 3. Depending on the payment method, the customer might need to provide additional information. 4. Depending on the payment method, the customer might need to authenticate the transaction with their bank or card issuer. 5. The customer completes the payment process, you receive a webhook (if you configured it for your Checkout transaction), and the customer is redirected to the Return URL(s) you specified on your Checkout transaction. 6. You make a request to the [get Checkout transaction](https://developers.cm.com/payments-platform/docs/get-transaction-1) endpoint, and use its latest details to update your system. > 📘 > > When using webhooks, be aware that they are only a "best effort" mechanism. Find more details [here](https://developers.cm.com/payments-platform/docs/webhooks-1) > . > > > ------------------------------------------------------------------------------------------------------------------------------------------------------------------------- Supported Payment Methods [](https://developers.cm.com/payments-platform/docs/checkout-1#supported-payment-methods) ======================================================================================================================= ![](https://files.readme.io/71e11b5-2.png) ![](https://files.readme.io/fa3c2c77e341e3cbff8133d4719b5707414064530c2ebd688ca92d1b27d3e65f-Webshop-2.png) ![](https://files.readme.io/ace89b71a998741d6689dd3cbd155fbdcf1fb7dd0e8df7c87e65380290c06a22-image_7.png) Customization Options [](https://developers.cm.com/payments-platform/docs/checkout-1#customization-options) =============================================================================================================== Our pre-built CM.com Checkout looks like this: ![](https://files.readme.io/463f1b0b7b552af474a8330dfdb1d7748541e4f83398c3f0b37d545fda70607a-Screenshot_2025-03-31_at_11.05.51.png) Please contact our support team and they will help you to configure the following: * The background image and the CM icon can be replaced with the ones you provide. * If you only need a specific subset of payment methods to be available on the Checkout, our support team can configure that for you. Updated 11 days ago * * * [](https://www.cm.com/) * [Privacy Policy](https://www.cm.com/app/legal/cm-com/privacy-policy/) * [Terms and Conditions](https://www.cm.com/app/legal/cm-com/terms-and-conditions/) * [Cookie Policy](https://www.cm.com/about-cm/cookie-policy/) Jump to Product page Conversational AI Cloud Mobile Service Cloud Mobile Marketing Cloud Messaging Ticketing Payments Platform Voice Sign --- # Verification ![](https://www.cm.com/cdn/web/icon/idin.svg) iDIN [](https://developers.cm.com/verification#idin) -------------------------------------------------------- iDIN is a service by the banks, that allows customers to identify themselves with websites, using the same secure methods as their own bank uses. It is similar to the iDEAL system in how it works and operates. [Find out more](https://developers.cm.com/verification/docs/idin) ![IBAN verification](https://www.cm.com/cdn/web/icon/iban.svg) IBAN Verification [](https://developers.cm.com/verification#iban-verification) ---------------------------------------------------------------------------------- Use the IBAN Verification API to retrieve a person's IBAN number using iDEAL. [Find out more](https://developers.cm.com/verification/docs/iban-verification) ![One Time Password](https://www.cm.com/app/aurora/svg/apps/large/default/otp.svg) OTP as a Service [](https://developers.cm.com/verification#otp-as-a-service) -------------------------------------------------------------------------------- Protect your organisation and users against fraudulent login attempts and potential catastrophic effects on your business. CM.com offers a unique Hybrid Two-factor, One Time Password solution that can be delivered via our high quality SMS routes, as a Voice message, via an email, via a WhatsApp message, or to your app via Push. [Find out more](https://developers.cm.com/verification/docs/one-time-password) ![ID Scan](https://www.cm.com/cdn/web/icon/id-scan.svg) ID Scan [](https://developers.cm.com/verification#id-scan) -------------------------------------------------------------- With ID Scan, you can verify your customer's identity by letting them scan their identity document using a mobile device, like a passport or a driver's license. An advanced OCR engine abstracts data from their document and detects the customer as a living human being via their device's camera. [Find out more](https://developers.cm.com/verification/docs/id-scan) ![Mobile Identity](https://www.cm.com/app/aurora-static/svg/apps/large/default/identity-match.svg) Mobile Identity Services [](https://developers.cm.com/verification#mobile-identity-services) ------------------------------------------------------------------------------------------------ Verify a user's identity through only their mobile phone using a variety of services: Number Verify, Takeover Protection (SIM Swap), and Identity Match. [Find out more](https://developers.cm.com/verification/docs/mobile-identity) [](https://www.cm.com/) * [Privacy Policy](https://www.cm.com/app/legal/cm-com/privacy-policy/) * [Terms and Conditions](https://www.cm.com/app/legal/cm-com/terms-and-conditions/) * [Cookie Policy](https://www.cm.com/about-cm/cookie-policy/) Jump to Product page Conversational AI Cloud Mobile Service Cloud Mobile Marketing Cloud Messaging Ticketing Payments Platform Voice Sign --- # Status Transitions Checkout transaction statuses [](https://developers.cm.com/payments-platform/docs/status-transitions#checkout-transaction-statuses) --------------------------------------------------------------------------------------------------------------------------------------- `OPEN` - Checkout has been created. This is the initial status. `PENDING` - Checkout can't make new payment attempts, but the payments are still `OPEN` `SUCCESS` - Checkout has succeeded. `CANCELLED` - Checkout has not succeeded; cancelled by the consumer. `EXPIRED` - Checkout has not succeeded; expired. `FAILURE` - Checkout has not succeeded; unknown reason. `AUTHORIZED` - Checkout is authorized. Status Transitions [](https://developers.cm.com/payments-platform/docs/status-transitions#status-transitions) ----------------------------------------------------------------------------------------------------------------- The diagram below shows all state transitions a checkout could go through. ![](https://files.readme.io/d5eaed3-State_-_Checkout_Statuses.png) Once a checkout has been created the status will be `OPEN`. While the state of a Checkout is `OPEN` a consumer can make payment attempts. Once a payment is successful, the checkout status will transition to `SUCCESS`. This is the happy-flow. At this point the consumer has paid and the funds will eventually make its way to your accounts. Of course there are other possibilities as you will have seen in the state diagram. A Checkout can transition from `OPEN` to `PENDING` if the checkout is about to transition to a _final_ state, but not all payment attempts have had a status update yet. * It could transition to `CANCELLED` if the consumer has clicked on the cancel button. * It could transition to `EXPIRED` if the `expiresAt` timestamp has been reached and all payments have a non-success final state. `expiresAt` only means no new payments can be created. The state transition can happen later. * It could transition to `FAILURE` if all payment attempts failed. This scenario is most likely if a consumer reaches the `maxRetries` count and all payment attempts failed. * It could transition to `SUCCESS` if a payment was `SUCCESS`. This scenario is likely if a callback of a successful payment is delayed. `AUTHORIZED` is an odd status. It means that the consumer has authorized a payment, but the confirmation that funds are going to be moved is not yet sent. An example where this can happen is via `SEPA Direct Debit`. It could take several hours or days until a confirmation is given. There is nothing left to do for the consumer in this process, so from their point of view they'll be redirected according to the `SUCCESS`\-flow . Updated about 1 year ago * * * [](https://www.cm.com/) * [Privacy Policy](https://www.cm.com/app/legal/cm-com/privacy-policy/) * [Terms and Conditions](https://www.cm.com/app/legal/cm-com/terms-and-conditions/) * [Cookie Policy](https://www.cm.com/about-cm/cookie-policy/) Jump to Product page Conversational AI Cloud Mobile Service Cloud Mobile Marketing Cloud Messaging Ticketing Payments Platform Voice Sign --- # Diagrams Create a Checkout transaction [](https://developers.cm.com/payments-platform/docs/diagrams#create-a-checkout-transaction) ----------------------------------------------------------------------------------------------------------------------------- The CM.com Online Payments API enables you to create a Checkout transaction. The diagram below presents the interaction that takes place between Consumer, Merchant (You) and CM.com Online Payments API when creating a Checkout transaction: ![](https://files.readme.io/bd5a0c7-SQ_-_Checkout_Transaction.svg) In the diagram above the following steps are performed: 1. Consumer wants to start a payment. 2. Merchant makes a request to create a Checkout transaction. 3. Merchant receives a successful response and redirects the Consumer to the received Checkout URL. 4. Consumer opens Checkout UI, selects a payment method and continues with the payment process. **There is also a scenario where a Consumer will be presented with a customer data input form, where email and land or a more detailed billing address has to be filled in. This form will appear on the Checkout UI when the `consumer` specified by the Merchant in the original request does not have all the required details and if both the selected payment method and/or the configuration of your account on CM.com Online Payments API require the Customer details.** 5. When the payment flow is completed, the status of the Checkout is updated on the CM.com Online Payments API and the Consumer is redirected to the return URL that the Merchant specified in the original request to create the Checkout. 6. If the Merchant also specified webhooks in the original request then CM.com Online Payments API will trigger the proper webhooks and make the requests to the webhook URLs specified by the Merchant. **When using webhooks, be aware that they are only a "best effort" mechanism**. 7. Merchant gets the latest details of the transaction. This usually happens once the Merchant receives a webhook request. The API endpoints involved on this flow are: * [Create Transaction](https://developers.cm.com/payments-platform/docs/create-transaction) * [Get Transaction](https://developers.cm.com/payments-platform/docs/get-transaction-1) Create a refund for the payment made with a Checkout [](https://developers.cm.com/payments-platform/docs/diagrams#create-a-refund-for-the-payment-made-with-a-checkout) --------------------------------------------------------------------------------------------------------------------------------------------------------------------------- The CM.com Online Payments API enables you to create a refund for a payment made with a Checkout transaction. The diagram below presents the interaction that takes place between Merchant (You) and CM.com Online Payments API when creating a refund for the payment made for a Checkout: ![](https://files.readme.io/1cbf5c4-SQ_-_Checkout_Refund.svg) The API endpoints involved on this flow are: * [Create a Refund](https://developers.cm.com/payments-platform/docs/create-a-refund) Updated about 1 year ago * * * [](https://www.cm.com/) * [Privacy Policy](https://www.cm.com/app/legal/cm-com/privacy-policy/) * [Terms and Conditions](https://www.cm.com/app/legal/cm-com/terms-and-conditions/) * [Cookie Policy](https://www.cm.com/about-cm/cookie-policy/) Jump to Product page Conversational AI Cloud Mobile Service Cloud Mobile Marketing Cloud Messaging Ticketing Payments Platform Voice Sign --- # Customer Journey Common checkout path [](https://developers.cm.com/payments-platform/docs/customer-journey#common-checkout-path) =================================================================================================================== 1. Customer wants to proceed with the payment checkout. 2. You create a Checkout transaction using the [create Checkout transaction](https://developers.cm.com/payments-platform/docs/create-transaction) endpoint (once a Checkout transaction is created it has status `OPEN`), and redirect the customer to the retrieved Checkout URL. 3. Customer lands on our pre-built CM.com Checkout. This is the Checkout payment method selection page on our CM.com Checkout: ![](https://files.readme.io/fa4a59873d23f00509444a64fae220b78ac92469d37ce3a61847c884f072ba79-Screenshot_2025-03-31_at_11.05.51.png) What happens when the customer lands on the CM.com Checkout? [](https://developers.cm.com/payments-platform/docs/customer-journey#what-happens-when-the-customer-lands-on-the-cmcom-checkout) ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- The main goal of our pre-built CM.com Checkout is to allow customers to select a payment method and continue with the payment process, but depending on the selected payment method additional customer information might need to be entered by the customer while using the Checkout. This scenario is because some payment methods like Credit Card/Bancontact follow a 3DS authentication flow where specific customer details are required. Other payment methods like Klarna require a detailed customer billing address to continue its process. In both cases **either you provide the required `consumer` data in your request when creating the Checkout transaction or your customer will be presented with a Consumer Form page in the Checkout where the required missing consumer data must be filled in.** ![](https://files.readme.io/0bfbd93-Checkout_Customer_Journey_-_Lucid-Flowchart.png) These are just some examples of the flow displayed above: * If you only have Credit Card configured for your Checkout (the customer will not be presented with the Checkout payment method selection page), and you did not provide enough `consumer` details while making the request to create the Checkout transaction, then your customer will be presented with a Consumer Form page where email and land must be filled in before proceeding to the page where card details can be entered. After that information is filled in the consumer will continue with the payment flow. * If you only have Credit Card configured for your Checkout (the customer will not be presented with the Checkout payment method selection page), and you did provide all the `consumer` details while making the request to create the Checkout transaction, then no consumer details would be missing and your customer will be presented with the page where card details can be entered. After that information is filled in the consumer will continue with the payment flow. * If you only have 1 payment method configured for your Checkout and the payment method is iDEAL, Apple Pay or Google Pay (the customer will be presented with the Checkout payment method selection page). Once the customer selects the payment method they will continue with the payment flow. * If you have iDEAL, and Klarna configured for your Checkout the customer will be presented with the Checkout payment method selection page. Then if iDEAL is selected the customer will be redirected to the iDEAL environment in order to continue with the payment. If Klarna is selected and you did not provide enough `consumer` details while making the request to create the Checkout transaction, then your customer will be presented with a Consumer Form page in the Checkout where the billing address must be entered, and after that information is filled in the customer will continue with the payment flow. If Klarna is selected, and you did provided the `consumer` billing address then your customer will continue directly with the payment flow. What is the next step in the journey? [](https://developers.cm.com/payments-platform/docs/customer-journey#what-is-the-next-step-in-the-journey) ---------------------------------------------------------------------------------------------------------------------------------------------------- The next step depends on the path that is taken, and the path is directly related to what the customer decides to do with the Checkout. These are only some examples of the possible paths that the journey can take: ### Path where customer successfully completes the payment [](https://developers.cm.com/payments-platform/docs/customer-journey#path-where-customer-successfully-completes-the-payment) If the customer selected a payment method, provided additional information (if needed), proceed and completed the payment flow successfully. Then the customer would be redirected to the Return URL(s) you specified on your Checkout transaction and the Customer journey would end. The Checkout transaction status would transition from `OPEN` to `SUCCESS`. ### Path where customer cancels the journey [](https://developers.cm.com/payments-platform/docs/customer-journey#path-where-customer-cancels-the-journey) If the customer selected 'Go back' on the Checkout. Then the customer would be redirected to the Return URL(s) you specified on your Checkout transaction and the Customer journey would end. The Checkout transaction status would transition from `OPEN` to `CANCELLED`. ### Path where customer did not use the Checkout and the Checkout expiration time has passed [](https://developers.cm.com/payments-platform/docs/customer-journey#path-where-customer-did-not-use-the-checkout-and-the-checkout-expiration-time-has-passed) The Checkout transaction status would transition from `OPEN` to `EXPIRED`. If at some point the customer opens an `EXPIRED` Checkout he/she/they will be redirected to the Return URL(s) you specified on your Checkout transaction. The customer journey is directly related to how the Checkout transaction status transitions, and the paths described above represent only a subset of all the possible paths for a customer journey to go. Please see the section related to how the status transitions in order for you to understand other possible paths. Find more details [here](https://developers.cm.com/payments-platform/docs/status-transitions) . Updated 7 months ago * * * [](https://www.cm.com/) * [Privacy Policy](https://www.cm.com/app/legal/cm-com/privacy-policy/) * [Terms and Conditions](https://www.cm.com/app/legal/cm-com/terms-and-conditions/) * [Cookie Policy](https://www.cm.com/about-cm/cookie-policy/) Jump to Product page Conversational AI Cloud Mobile Service Cloud Mobile Marketing Cloud Messaging Ticketing Payments Platform Voice Sign --- # Create Transaction You can use this call to create a new Checkout transaction. Prerequisite [](https://developers.cm.com/payments-platform/docs/create-transaction#prerequisite) ----------------------------------------------------------------------------------------------------- Get an `access_token` and use it as 'Bearer' token in your request. Find more details [here](https://developers.cm.com/payments-platform/docs/authorization-3) . Request [](https://developers.cm.com/payments-platform/docs/create-transaction#request) ------------------------------------------------------------------------------------------- Text `POST https://api.pay.cm.com/api/v1/paymentmethods/checkout/v1/transactions` ### Request body examples [](https://developers.cm.com/payments-platform/docs/create-transaction#request-body-examples) These are only some examples of the request body to create a transaction: Full Request with ReturnURLsFull Request with ReturnURLMinimal Request with ReturnURLs `{ "reference": "20210623130413", "amount": 1200, "currency": "EUR", "consumer": { "givenName": "John", "middleName": "", "familyName": "Doe", "email": "[[email protected]](https://developers.cm.com/cdn-cgi/l/email-protection) ", "gender": null, "address": { "street": "Rustenburgerlaan", "houseNumber": "25", "postalCode": "2012AL", "city": "Haarlem", "countryCode": "NL", "state": "Noord-Holland", "additionalData": "Right-hand portal" }, "phone": "06-95613259", "dateOfBirth": "1996-12-01" }, "merchantOrderReference": "order123", "description": "Order at yourdomain.tld", "paymentMethods": [ "ideal", "bancontact", "klarna" ], "orderItems": [ { "code": "SDC4/32GB-2ADP", "name": "Kingston microSD 32GB", "description": "Best seller SD card", "unitPrice": 600, "quantity": 2, "vatAmount": 100, "vatRate": 20 } ], "expiresAt": "2006-01-02T15:04:05Z", "language": "nl", "webhooks": [ { "url": "https://yourdomain.tld/order-webhooks?purchaseId=order123", "events": [ "FINALSTATUS" ] }, { "url": "https://yourdomain.tld/payment-webhooks?purchaseId=order123", "events": [ "REFUND_STATUS" ] }, { "url": "https://yourdomain.tld/payment-webhooks?purchaseId=order123", "events": [ "STATUS_CHANGE" ] } ], "maxRetries": 10, "returnUrls": { "success": "https://yourdomain.tld/order/payment-success.html", "cancelled": "https://yourdomain.tld/order/payment-cancelled.html", "expired": "https://yourdomain.tld/order/payment-expired.html", "failed": "https://yourdomain.tld/order/payment-failed.html" } }` `{ "reference": "20210623130413", "amount": 1200, "currency": "EUR", "consumer": { "givenName": "John", "middleName": "", "familyName": "Doe", "email": "[[email protected]](https://developers.cm.com/cdn-cgi/l/email-protection) ", "gender": null, "address": { "street": "Rustenburgerlaan", "houseNumber": "25", "postalCode": "2012AL", "city": "Haarlem", "countryCode": "NL", "state": "Noord-Holland", "additionalData": "Right-hand portal" }, "phone": "06-95613259", "dateOfBirth": "1996-12-01" }, "merchantOrderReference": "order123", "description": "Order at yourdomain.tld", "paymentMethods": [ "ideal", "bancontact", "klarna" ], "orderItems": [ { "code": "SDC4/32GB-2ADP", "name": "Kingston microSD 32GB", "description": "Best seller SD card", "unitPrice": 600, "quantity": 2, "vatAmount": 100, "vatRate": 20 } ], "expiresAt": "2006-01-02T15:04:05Z", "language": "nl", "webhooks": [ { "url": "https://yourdomain.tld/order-webhooks?purchaseId=order123", "events": [ "FINALSTATUS" ] }, { "url": "https://yourdomain.tld/payment-webhooks?purchaseId=order123", "events": [ "REFUND_STATUS" ] }, { "url": "https://yourdomain.tld/payment-webhooks?purchaseId=order123", "events": [ "STATUS_CHANGE" ] } ], "maxRetries": 10, "returnUrl": "https://yourdomain.tld/order/payment-completed.html" }` `{ "reference": "20210623130413", "amount": 1200, "merchantOrderReference": "order123", "description": "Order at yourdomain.tld", "expiresAt": "2006-01-02T15:04:05Z", "language": "nl", "returnUrls": { "success": "https://yourdomain.tld/order/payment-success.html", "cancelled": "https://yourdomain.tld/order/payment-cancelled.html", "expired": "https://yourdomain.tld/order/payment-expired.html", "failed": "https://yourdomain.tld/order/payment-failed.html" } }` "**Full Request with ReturnURLs**" and "**Full Request with ReturnURL**" are examples where all the request parameters are provided. If `returnUrls` is defined then customers will be redirected to a different URL depending on the status of the transaction when the payment process is completed. If `returnUrl` is defined then customers will be redirected to the same URL no matter the status of the transaction when the payment process is completed. "**Minimal Request with ReturnURLs**" is an example of the minimal request to create a transaction. This example, is using `returnUrls`, but you can replace it for `returnUrl` depending on what is better for your use case. Parameters [](https://developers.cm.com/payments-platform/docs/create-transaction#parameters) ------------------------------------------------------------------------------------------------- | Parameter | Type | Description | Constraints | | --- | --- | --- | --- | | reference | String(1...255) | An identifier specified by you. If webhooks were specified in the request this identifier is added to the webhook request payload. | | | amount | Int(1...99999999) | Integer representing the amount of the checkout. Denomination in the smallest currency subunit (e.g. eurocents). **If `orderItems` is provided, then a calculated amount, based on the sum of the product of item.UnitPrice and item.Quantity for all the items, will be used as checkout amount instead of the value provided in this field.** | For payment methods like in3, this value should be `>= 5000 cents`. **If in3 is enabled on your configuration, the amount (or calculated amount based on the orderItems) is `<5000 cents`, and you did not specify in3 in the `paymentMethods` request parameter, then you will NOT see in3 in the `paymentMethods` response parameter (so it will not be included in the checkout payment method selection page). If in3 is enabled on your configuration, the amount (or calculated amount based on the orderItems) is `<5000 cents`, but if you specify in3 in the `paymentMethods` request parameter, then you will get a validation error while creating the checkout transaction.** | | merchantOrderReference | String(1...35) | Identification of the order within your system. Ultimately appears on the payment confirmation (statement and confirmation screen). | Must be an alphanumeric value | | description | String(1...35) | Description of the transaction. | | | expiresAt | String(RFC3339) | Specifies the time at which new payments cannot be started in the Checkout. At the time of expiration the Checkout status will transition to `PENDING` if there are still `OPEN` or `PENDING` payments. Once the payments are no longer `OPEN` or `PENDING` the status of the checkout will transaction to `EXPIRED` or in the case of a successful payment to `SUCCESS`. | ISO 8601 date and time. | | language | String(ISO 639-1) | Preferred language of the user interface. | The available languages are: `[ cs, da, de, en, es, fi, fr, hu, it, nl, no, pl, pt, sv, tr ]`. | | returnUrl | String(2000) | Specifies the URL where your customers will be redirected to when the payment process is completed. | Either `returnUrl` or `returnUrls` must be specified, but not both. | | returnUrls | [returnUrls](https://developers.cm.com/payments-platform/docs/schemas#returnurls)
Object | Specifies a URL where your customers will be redirected to (per transaction status) when the payment process is completed. For example, your customers will be redirected to `returnUrls.success` when the status of the transaction changes to `SUCCESS`. | Either `returnUrl` or `returnUrls` must be specified, but not both. | Optional parameters [](https://developers.cm.com/payments-platform/docs/create-transaction#optional-parameters) ------------------------------------------------------------------------------------------------------------------- | Parameter | Type | Description | Constraints | | --- | --- | --- | --- | | currency | String (ISO 4217) | Currency code. | ISO 4217 currency code. | | consumer | [consumerInRequest](https://developers.cm.com/payments-platform/docs/schemas#consumerInRequest)
Object | Customer details. | If `consumer` is provided then the following fields are mandatory: `givenName`, `familyName`, `email`, `phone`.

If `consumer.address` is provided then the following fields are mandatory: `street`, `houseNumber`, `postalCode`, `city`, `countryCode`.

For in3, the following consumer details are required: `familyName`, `phone`, `email`, `dateOfBirth`, `address.street`, `address.houseNumber`, `address.postalCode`, `address.city`, and `address.countryCode`. If any required information is missing in the request, then the consumer form will be displayed in the checkout to collect the missing details. | | paymentMethods | Array of strings | This parameter indicates which payment methods you want the checkout to make available for your customers on the checkout payment methods selection page. **Note: some payment methods like Klarna or in3 require stricter validation to be enabled. If you specify `klarna` or `in3` in this parameter, then the validation will be done while creating the transaction. If you do not specify them in this parameter, then given your configuration and the other values you provided in your request, it might cause these payment methods not to be included in the `paymentMethods` response parameter (so they will NOT be included on the checkout payment methods selection page).** | The available payment methods are: `[ bancontact, creditcard, ideal, maestro, belfius, klarna, google_pay, apple_pay, in3 ]`. The selected payment methods _must_ be enabled in your configuration. | | webhooks | Array of objects | Webhooks enable receiving a web request once a given event occurs. | Find more details [here](https://developers.cm.com/payments-platform/docs/webhooks-1)
. | | maxRetries | Int(0...255) | Maximum number of retries allowed to pay the checkout. | | | orderItems | Array of [orderItem](https://developers.cm.com/payments-platform/docs/schemas#orderitem)
objects | Required only for some payment methods (e.g. Klarna or in3). **If (Klarna or in3) is enabled in your configuration, but you did not specify neither `orderItems` on your request nor (Klarna or in3) on the `paymentMethods` request parameter, then you will NOT see (Klarna or in3) on the `paymentMethods` response parameter (so they will not be included in the checkout payment method selection page). If (Klarna or in3) is enabled in your configuration, and you do not specify `orderItems` in your request, but you specify (Klarna or in3) in the `paymentMethods` request parameter, then you will get a validation error while creating the checkout transaction. Apart from that, if `orderItems` is provided, then a calculated amount, based on the sum of the product of item.UnitPrice and item.Quantity for all the items, will be used as checkout amount instead of the value provided as `amount` on the request.** | | Response [](https://developers.cm.com/payments-platform/docs/create-transaction#response) --------------------------------------------------------------------------------------------- JSON `{ "id": "8db1e7fa-ba8a-4189-92fd-67a20217443d", "reference": "20210623130413", "amount": 1200, "currency": "EUR", "consumer": { "givenName": "John", "middleName": "", "familyName": "Doe", "email": "[[email protected]](https://developers.cm.com/cdn-cgi/l/email-protection) ", "gender": null, "address": { "street": "Rustenburgerlaan", "houseNumber": "25", "postalCode": "2012AL", "city": "Haarlem", "countryCode": "NL", "state": "Noord-Holland", "additionalData": "Right-hand portal" }, "phone": "06-95613259", "dateOfBirth": "1996-12-01" }, "merchantOrderReference": "order123", "description": "Order at yourdomain.tld", "paymentMethods": [ "ideal", "bancontact", "klarna" ], "orderItems": [ { "code": "SDC4/32GB-2ADP", "name": "Kingston microSD 32GB", "description": "Best seller SD card", "unitPrice": 600, "quantity": 2, "vatAmount": 100, "vatRate": 20 } ], "expiresAt": "2006-01-02T15:04:05Z", "language": "nl", "webhooks": [ { "url": "https://yourdomain.tld/order-webhooks?purchaseId=order123", "events": [ "FINALSTATUS" ] }, { "url": "https://yourdomain.tld/payment-webhooks?purchaseId=order123", "events": [ "REFUND_STATUS" ] }, { "url": "https://yourdomain.tld/payment-webhooks?purchaseId=order123", "events": [ "STATUS_CHANGE" ] } ], "maxRetries": 10, "status": "OPEN", "action": { "redirect": { "url": "https://checkout.cmpayments.com/?hostedCheckoutId=0863a7aadb99bf1c6ae770936db45eb33e61c917" } }, "createdAt": "2006-01-02T15:04:05Z", "refunds": { "refundedAmount": 300, "refundedPendingAmount": 100 }, "returnUrls": { "success": "https://yourdomain.tld/order/payment-success.html", "cancelled": "https://yourdomain.tld/order/payment-cancelled.html", "expired": "https://yourdomain.tld/order/payment-expired.html", "failed": "https://yourdomain.tld/order/payment-failed.html" } }` Parameters [](https://developers.cm.com/payments-platform/docs/create-transaction#parameters-1) --------------------------------------------------------------------------------------------------- | Parameter | Type | Description | Constraints | | --- | --- | --- | --- | | id | String(36) | Transaction unique identifier. | | | reference | String(1...255) | An identifier specified by you. If webhooks were specified in the request this identifier is added to the webhook request payload. | Specified in the request. | | amount | Int(1...99999999) | Integer representing the amount of the checkout. Denomination in the smallest currency subunit (e.g. eurocents). | Specified in the request. | | currency | String (ISO 4217) | Currency code. | Specified in the request. | | merchantOrderReference | String(1...35) | Identification of the order within your system. Ultimately appears on the payment confirmation (statement and confirmation screen). | Specified in the request. | | description | String(1...255) | Description of the transaction. | Specified in the request. | | expiresAt | String(RFC3339) | Specifies the time at which new payments cannot be started in the Checkout. At the time of expiration the Checkout status will transition to `PENDING` if there are still `OPEN` or `PENDING` payments. Once the payments are no longer `OPEN` or `PENDING` the status of the checkout will transaction to `EXPIRED` or in the case of a successful payment to `SUCCESS`. | Specified in the request. | | status | String | `OPEN` - Checkout has been created. This is the initial status.
`SUCCESS` - Checkout successfully paid.
`CANCELLED` - Checkout has been cancelled by your customers.
`EXPIRED` - Checkout has not succeeded; expired.
`FAILURE` - Checkout has not succeeded; unknown reason.
`AUTHORIZED` - Checkout payment is authorized.
`PENDING` - Checkout payment could not be completed yet; waiting for something. | | | action | [action](https://developers.cm.com/payments-platform/docs/schemas#action)
Object | The next action to be performed by you for this transaction. This includes a URL where you should `redirect` your customer to perform the payment. | This parameter is nullable, and it is only available while the transaction is `OPEN`. | | createdAt | String(RFC3339) | Creation time. | ISO 8601 date and time. | | returnUrl | String(2000) | Specifies the URL where your customers will be redirected to when the payment process is completed. | Specified in the request. | | returnUrls | Object | Specifies a URL where your customers will be redirected to (per transaction status) when the payment process is completed. For example, your customers will be redirected to `returnUrls.success` when the status of the transaction changes to `SUCCESS`. | Specified in the request. | Optional parameters [](https://developers.cm.com/payments-platform/docs/create-transaction#optional-parameters-1) --------------------------------------------------------------------------------------------------------------------- | Parameter | Type | Description | Constraints | | --- | --- | --- | --- | | consumer | Object | Customer details. | Specified in the request or by the configuration of your account. | | paymentMethods | Array of strings | This is an important field because here **you can validate which payment methods will be available for your customers on the checkout payment method selection page**. | **Even if you provided specific values as `paymentMethods` in your request, the value in the response might not be the same, given that it also depends on your configuration and on other values you provided in your request. For this reason, it is recommended that you always check this value in the response.** | | orderItems | Array of objects | Required only for some payment methods (e.g. Klarna or in3). | Specified in the request. | | language | String(ISO 639-1) | Preferred language of the user interface. | Specified in the request. | | webhooks | Array of objects | Webhooks enable receiving a web request once a given event occurs. | Specified in the request. | | maxRetries | Int(0...255) | Maximum number of retries allowed to pay the checkout. | Specified in the request. | | refunds | [refund](https://developers.cm.com/payments-platform/docs/schemas#refund)
Object | Indicates refundedAmount and refundedPendingAmount. | | Response codes [](https://developers.cm.com/payments-platform/docs/create-transaction#response-codes) --------------------------------------------------------------------------------------------------------- | HTTP status | Description | | --- | --- | | 201 | Successful transaction. | | 4XX | Client error response (See message for details). This response is given when the user input was incorrect or something illegal was attempted (eg. using a service without having that service configured for the user, or not being authorized). | | 5XX | Server error response (See message for details). | Updated 10 days ago * * * [](https://www.cm.com/) * [Privacy Policy](https://www.cm.com/app/legal/cm-com/privacy-policy/) * [Terms and Conditions](https://www.cm.com/app/legal/cm-com/terms-and-conditions/) * [Cookie Policy](https://www.cm.com/about-cm/cookie-policy/) Jump to Product page Conversational AI Cloud Mobile Service Cloud Mobile Marketing Cloud Messaging Ticketing Payments Platform Voice Sign --- # Introduction Mobile Service Cloud is our customer service software. It is an umbrella name for a few applications that can be used in conjunction to offer a top of the line customer service experience. These applications are listed below, you can see their respective documentation by clicking on the name links or navigating to them via the menu. * [Agent Inbox](https://developers.cm.com/mobile-service-cloud/docs/msc) (formerly ROBIN) * [Scripted Chatbot](https://developers.cm.com/mobile-service-cloud/docs/scripted-chatbot) * [Conversational Router](https://developers.cm.com/mobile-service-cloud/docs/conversational-router) Please keep in mind we are actively working on improving this documentation. Please suggest an edit, to the upper right, if you have feedback or other input. Updated over 1 year ago * * * [](https://www.cm.com/) * [Privacy Policy](https://www.cm.com/app/legal/cm-com/privacy-policy/) * [Terms and Conditions](https://www.cm.com/app/legal/cm-com/terms-and-conditions/) * [Cookie Policy](https://www.cm.com/about-cm/cookie-policy/) Jump to Product page Conversational AI Cloud Mobile Service Cloud Mobile Marketing Cloud Messaging Ticketing Payments Platform Voice Sign --- # Get Transaction You can use this call to retrieve details of a Checkout transaction. Prerequisite [](https://developers.cm.com/payments-platform/docs/get-transaction-1#prerequisite) ---------------------------------------------------------------------------------------------------- Get an `access_token` and use it as 'Bearer' token in your request. Find more details [here](https://developers.cm.com/payments-platform/docs/authorization-3) . Request [](https://developers.cm.com/payments-platform/docs/get-transaction-1#request) ------------------------------------------------------------------------------------------ Text `GET https://api.pay.cm.com/api/v1/paymentmethods/checkout/v1/transactions/{transactionId}` Response [](https://developers.cm.com/payments-platform/docs/get-transaction-1#response) -------------------------------------------------------------------------------------------- JSON `{ "id": "8db1e7fa-ba8a-4189-92fd-67a20217443d", "reference": "20210623130413", "amount": 1200, "currency": "EUR", "consumer": { "givenName": "John", "middleName": "", "familyName": "Doe", "email": "[[email protected]](https://developers.cm.com/cdn-cgi/l/email-protection) ", "gender": null, "address": { "street": "Rustenburgerlaan", "houseNumber": "25", "postalCode": "2012AL", "city": "Haarlem", "countryCode": "NL", "state": "Noord-Holland", "additionalData": "Right-hand portal" }, "phone": "06-95613259", "dateOfBirth": "1996-12-01" }, "merchantOrderReference": "order123", "description": "Order at yourdomain.tld", "paymentMethods": [ "ideal", "bancontact", "klarna" ], "orderItems": [ { "code": "SDC4/32GB-2ADP", "name": "Kingston microSD 32GB", "description": "Best seller SD card", "unitPrice": 600, "quantity": 2, "vatAmount": 100, "vatRate": 20 } ], "expiresAt": "2006-01-02T15:04:05Z", "language": "nl", "webhooks": [ { "url": "https://yourdomain.tld/order-webhooks?purchaseId=order123", "events": [ "FINALSTATUS" ] }, { "url": "https://yourdomain.tld/payment-webhooks?purchaseId=order123", "events": [ "REFUND_STATUS" ] }, { "url": "https://yourdomain.tld/payment-webhooks?purchaseId=order123", "events": [ "STATUS_CHANGE" ] } ], "maxRetries": 10, "payments": [ { "id": "8db1e7fa-ba8a-4189-92fd-67a20217443d", "type": "bancontact", "status": "OPEN", "createdAt": "2006-01-02T15:04:05Z" } ], "status": "OPEN", "action": { "redirect": { "url": "https://checkout.cmpayments.com/?hostedCheckoutId=0863a7aadb99bf1c6ae770936db45eb33e61c917" } }, "createdAt": "2006-01-02T15:04:05Z", "refunds": { "refundedAmount": 300, "refundedPendingAmount": 100 }, "returnUrls": { "success": "https://yourdomain.tld/order/payment-success.html", "cancelled": "https://yourdomain.tld/order/payment-cancelled.html", "expired": "https://yourdomain.tld/order/payment-expired.html", "failed": "https://yourdomain.tld/order/payment-failed.html" } }` Parameters [](https://developers.cm.com/payments-platform/docs/get-transaction-1#parameters) ------------------------------------------------------------------------------------------------ | Parameter | Type | Description | Constraints | | --- | --- | --- | --- | | id | String(36) | Transaction unique identifier. | | | reference | String(1...255) | An identifier specified by you. If webhooks were specified in the request this identifier is added to the webhook request payload. | | | amount | Int(1...99999999) | Integer representing the amount of the Checkout. Denomination in the smallest currency subunit (e.g. eurocents). | | | currency | String (ISO 4217) | Currency code. | ISO 4217 currency code. | | merchantOrderReference | String(1...35) | Identification of the order within your system. Ultimately appears on the payment confirmation (statement and confirmation screen). | | | description | String(1...255) | Description of the transaction. | | | expiresAt | String(RFC3339) | Specifies the time at which new payments cannot be started in the Checkout. At the time of expiration the Checkout status will transition to `PENDING` if there are still `OPEN` or `PENDING` payments. Once the payments are no longer `OPEN` or `PENDING` the status of the Checkout will transaction to `EXPIRED` or in the case of a successful payment to `SUCCESS`. | ISO 8601 date and time. | | status | String | `OPEN` - Checkout has been created. This is the initial status.
`SUCCESS` - Checkout successfully paid.
`CANCELLED` - Checkout has been cancelled by your customers.
`EXPIRED` - Checkout has not succeeded; expired.
`FAILURE` - Checkout has not succeeded; unknown reason.
`AUTHORIZED` - Checkout payment is authorized.
`PENDING` - Checkout payment could not be completed yet; waiting for something. | | | action | [action](https://developers.cm.com/payments-platform/docs/schemas#action)
Object | The next action to be performed by you for this transaction. This includes a URL where you should `redirect` your customer to perform the payment. `action` is only available while the transaction is `OPEN`. | This parameter is nullable, and it is only available while the transaction is `OPEN`. | | createdAt | String(RFC3339) | Creation time. | ISO 8601 date and time. | | returnUrl | String(2000) | Specifies the URL where your customers will be redirected to when the payment process is completed. | Either `returnUrl` or `returnUrls` must be specified, but not both. | | returnUrls | [returnUrls](https://developers.cm.com/payments-platform/docs/schemas#returnurls)
Object | Specifies a URL where your customers will be redirected to (per transaction status) when the payment process is completed. For example, your customers will be redirected to `returnUrls.success` when the status of the transaction changes to `SUCCESS`. | Either `returnUrl` or `returnUrls` must be specified, but not both. | Optional parameters [](https://developers.cm.com/payments-platform/docs/get-transaction-1#optional-parameters) ------------------------------------------------------------------------------------------------------------------ | Parameter | Type | Description | Constraints | | --- | --- | --- | --- | | consumer | [consumer](https://developers.cm.com/payments-platform/docs/schemas#consumer)
Object | Customer details. | | | paymentMethods | Array of strings | This is an important parameter because here **you can validate which payment methods are available for your customers on the checkout payment method selection page**. | | | orderItems | Array of [orderItem](https://developers.cm.com/payments-platform/docs/schemas#orderitem)
objects | Required only for some payment methods (e.g. Klarna or in3). | | | language | String(ISO 639-1) | Preferred language of the user interface. | The available languages are: `[ cs, da, de, en, es, fi, fr, hu, it, nl, no, pl, pt, sv, tr ]`. | | webhooks | Array of objects | Webhooks enable receiving a web request once a given event occurs. | Find more details [here](https://developers.cm.com/payments-platform/docs/webhooks-1)
. | | maxRetries | Int(0...255) | Maximum number of retries allowed to pay the Checkout. | | | payments | Array of [payment](https://developers.cm.com/payments-platform/docs/schemas#payment)
objects | List of payments made by the customer while using the Checkout. The payment object contains the `Status`, `Type` and `ID` of each payment. | | | refunds | [refund](https://developers.cm.com/payments-platform/docs/schemas#refund)
Object | Indicates refundedAmount and refundedPendingAmount. | | Response codes [](https://developers.cm.com/payments-platform/docs/get-transaction-1#response-codes) -------------------------------------------------------------------------------------------------------- | HTTP status | Description | | --- | --- | | 200 | Transaction details are successfully retrieved | | 4XX | Client error response (See message for details). This response is given when the User input was incorrect or something illegal was attempted (eg. using a service without having that service configured for the user, or not being authorized). | | 5XX | Server error response (See message for details) | Updated 11 months ago * * * [](https://www.cm.com/) * [Privacy Policy](https://www.cm.com/app/legal/cm-com/privacy-policy/) * [Terms and Conditions](https://www.cm.com/app/legal/cm-com/terms-and-conditions/) * [Cookie Policy](https://www.cm.com/about-cm/cookie-policy/) Jump to Product page Conversational AI Cloud Mobile Service Cloud Mobile Marketing Cloud Messaging Ticketing Payments Platform Voice Sign --- # Introduction Welcome to Conversational AI Cloud's developer documentation portal! Here you'll find everything you need as a developer to get started with Conversational AI Cloud's API's and product suite. To give you a brief overview of our API's we've listed some of them below, along with some of their most popular use cases. * [Gateway API](https://developers.cm.com/conversational-ai-cloud/reference/get_ask) - provides answers based on a given input, retrieves articles (FAQs) from the knowledge base, and additional features such as feedback. * [Context Store API](https://developers.cm.com/conversational-ai-cloud/reference/get_sessions-sessionid-1) - provides the ability to create sessions, read sessions, and update sessions. * [Reporting API](https://developers.cm.com/conversational-ai-cloud/reference/get_customerkey-projects-projectkey-interactions-1) - provides the ability to retrieve interaction logs generated for each Gateway interaction. * [Auto complete API](https://developers.cm.com/conversational-ai-cloud/reference/get_customerkey-projects-projectkey-culture-autocomplete-suggestions) - provides word suggestions based on conversational content * [APM API](https://developers.cm.com/conversational-ai-cloud/reference/get_customerkey-projects-projectkey-contextvariablewebhooklogs) - provides insights into webhook performance Aside from our API's we also offer our customers different ways to integrate their existing environment with Conversational AI Cloud through the use of webhooks. Webhooks are called at various stages during the conversational flow, and you can find more information on them throughout our documentation, and in our [API reference](https://developers.cm.com/conversational-ai-cloud/reference/post_transactionaldialogslot) . What to expect [](https://developers.cm.com/conversational-ai-cloud/docs/introduction#what-to-expect) --------------------------------------------------------------------------------------------------------- Our developer documentation consists of three sections: * 📖 Guided documentation where we highlight use cases, solve common issues, and examine the product closer to make sure you get as much value out of our products as possible. * 👩‍💻 Code recipes where we provide code snippets that solve an issue or use-case in a step-by-step fashion (**coming soon!**). * 🚀 API reference documentation that explains all API endpoints, and the different parameters you can utilize to fulfill your use case. Updated over 1 year ago * * * [](https://www.cm.com/) * [Privacy Policy](https://www.cm.com/app/legal/cm-com/privacy-policy/) * [Terms and Conditions](https://www.cm.com/app/legal/cm-com/terms-and-conditions/) * [Cookie Policy](https://www.cm.com/about-cm/cookie-policy/) Jump to Product page Conversational AI Cloud Mobile Service Cloud Mobile Marketing Cloud Messaging Ticketing Payments Platform Voice Sign --- # Introduction In order to receive inbound calls on the CM.com Voice platform, you need to either request new phone numbers, or port over your existing phone numbers from your current number provider to the CM.com platform. In this article we will guide you through the process of requesting new phone numbers. Updated over 1 year ago * * * * [Company profiles](https://developers.cm.com/voice/docs/company-profiles) [](https://www.cm.com/) * [Privacy Policy](https://www.cm.com/app/legal/cm-com/privacy-policy/) * [Terms and Conditions](https://www.cm.com/app/legal/cm-com/terms-and-conditions/) * [Cookie Policy](https://www.cm.com/about-cm/cookie-policy/) Jump to Product page Conversational AI Cloud Mobile Service Cloud Mobile Marketing Cloud Messaging Ticketing Payments Platform Voice Sign --- # Create a Refund Use this call to create a new refund for a payment made on a Checkout transaction. Prerequisite [](https://developers.cm.com/payments-platform/docs/create-a-refund#prerequisite) -------------------------------------------------------------------------------------------------- Get an `access_token` and use it as 'Bearer' token in your request. Find more details [here](https://developers.cm.com/payments-platform/docs/authorization-3) . Request [](https://developers.cm.com/payments-platform/docs/create-a-refund#request) ---------------------------------------------------------------------------------------- Text `POST https://api.pay.cm.com/api/v1/paymentmethods/checkout/v1/transactions/{transactionId}/refunds` JSON `{ "amount": 1200, "reason": "Refund required by customer." }` Optional parameters [](https://developers.cm.com/payments-platform/docs/create-a-refund#optional-parameters) ---------------------------------------------------------------------------------------------------------------- | Parameter | Type | Description | Constraints | | --- | --- | --- | --- | | amount | Int(1...99999999) | Denomination in the smallest currency subunit (e.g. eurocents). If empty, the refund amount will be the remaining available amount of the transaction (e.g. total payment amount minus already refunded amounts minus the amounts of the pending refund requests). | Must be lower than or equal to the original transaction amount. | | reason | String(255) | The description for the refund. | | Response [](https://developers.cm.com/payments-platform/docs/create-a-refund#response) ------------------------------------------------------------------------------------------ If refund has been successfully created then the response is the [Get Transaction](https://developers.cm.com/payments-platform/docs/get-transaction-1) response with an updated refunds.refundedAmount and refunds.refundedPendingAmount. Response codes [](https://developers.cm.com/payments-platform/docs/create-a-refund#response-codes) ------------------------------------------------------------------------------------------------------ | HTTP status | Description | | --- | --- | | 201 | Refund successfully created. | | 4XX | Client error response (See message for details). This response is given when the User input was incorrect or something illegal was attempted (eg. using a service without having that service configured for the user, or not being authorized). | | 5XX | Server error response (See message for details). | Updated about 1 year ago * * * [](https://www.cm.com/) * [Privacy Policy](https://www.cm.com/app/legal/cm-com/privacy-policy/) * [Terms and Conditions](https://www.cm.com/app/legal/cm-com/terms-and-conditions/) * [Cookie Policy](https://www.cm.com/about-cm/cookie-policy/) Jump to Product page Conversational AI Cloud Mobile Service Cloud Mobile Marketing Cloud Messaging Ticketing Payments Platform Voice Sign --- # Overview The business messaging API allows you to send messages to devices all over the world. It can handle single messages, but also very high volumes of messages. The API offers SMS of course, but the same API can be used to send messages using a variety of other messaging channels. These are the messaging channels we currently support: * [Apple Messages for Business](https://developers.cm.com/messaging/docs/apple-messages-for-business) * [Facebook Messenger](https://developers.cm.com/messaging/docs/facebook-messenger) * [Instagram Messaging](https://developers.cm.com/messaging/docs/instagram-messaging) * [LINE](https://developers.cm.com/messaging/docs/line) * [Push (for Android and iOS apps)](https://developers.cm.com/messaging/docs/push) * [RCS Business Messages](https://developers.cm.com/messaging/docs/rcs) * [SMS](https://developers.cm.com/messaging/docs/sms) * [Telegram](https://developers.cm.com/messaging/docs/telegram) * [Viber for Business](https://developers.cm.com/messaging/docs/viber) * [WhatsApp](https://developers.cm.com/messaging/docs/whatsapp) It is also possible to receive replies to, and status reports about your messages by setting up a webhook in our platform. SMS and OTT Channels [](https://developers.cm.com/messaging/docs/introduction#sms-and-ott-channels) ------------------------------------------------------------------------------------------------------- We call the channels that have features beyond just text, **OTT** (Over The Top) channels. In practice, every channel we support besides SMS is an OTT channel, although [Push](https://developers.cm.com/messaging/docs/push) might be debatable. For OTT channels, our API supports sending complex messages with advanced features such as images, audio and video, quick reply buttons, rich cards and stickers, to name a few. SMS Fallback [](https://developers.cm.com/messaging/docs/introduction#sms-fallback) --------------------------------------------------------------------------------------- Channels that identify recipients by phone number like WhatsApp, can be configured to have an SMS fallback. This means that when a message can't be delivered, a fallback message can be sent to the same phone number via SMS. > 📘 > > Note > > > ---------- > > Fallback needs to be configured on our side in the routing rules for your messages. If you wish to enable this, please contact us. Other Features [](https://developers.cm.com/messaging/docs/introduction#other-features) ------------------------------------------------------------------------------------------- * batch messages - send multiple messages in one request * bulk sending - send the same message to a list of recipients in one request * tagging messages - we have custom grouping fields you can use to tag messages for reporting or filtering * validity period - when a message is time-sensitive, you can add a validity period to make sure messages that can't be delivered in time will get discarded. * conversations - bundling multiple items like text and images in the same OTT message Messaging Trial [](https://developers.cm.com/messaging/docs/introduction#messaging-trial) --------------------------------------------------------------------------------------------- If you quickly want to see how easy it is to integrate the CM.com Business Messaging API in your own software, we have a trial that will allow you to test most of the capabilities of the Business Messaging API in a couple of minutes, without onboarding to our platform or configuring your own channels. The video below will show you exactly how. Updated 8 months ago * * * [](https://www.cm.com/) * [Privacy Policy](https://www.cm.com/app/legal/cm-com/privacy-policy/) * [Terms and Conditions](https://www.cm.com/app/legal/cm-com/terms-and-conditions/) * [Cookie Policy](https://www.cm.com/about-cm/cookie-policy/) Jump to Product page Conversational AI Cloud Mobile Service Cloud Mobile Marketing Cloud Messaging Ticketing Payments Platform Voice Sign --- # Introduction CM.com's Events API enables you to enrich your profiles within the Customer Data Platform (CDP) environment. You can integrate this in your application by communicating with our API. The CDP Events API is a REST API that uses JSON to communicate. Authentication [](https://developers.cm.com/mobile-marketing-cloud/docs/introduction#authentication) -------------------------------------------------------------------------------------------------------- Your account has a tenant Id, which you need to submit events. You can find the tenant Id in the settings page in your CDP environment. A product token is a tenant specific token that allows you to authorize an application within the CDP environment. The settings page in your CDP environment allows you to view and create new product tokens. For most methods described in this API, the product token should be provided by including it in the `X-CM-PRODUCTTOKEN` header. Getting started [](https://developers.cm.com/mobile-marketing-cloud/docs/introduction#getting-started) ---------------------------------------------------------------------------------------------------------- We have an open source .NET standard library available [(link)](https://github.com/cmdotcom/cdp-events-sdk-dotnet) that enables you to use the API directly from a .NET application. You can install it from NuGet using the following command in NuGet Package Manager Console: `Install-Package CM.Cdp.Events.Sdk` Or search for CM.Cdp.Events.Sdk in the NuGet Pacakage Manager. This is the easiest way to send your first event, but if you are using another programming language or platform, sending a POST command with a JSON body should be self explanatory. Updated over 3 years ago * * * * [Events](https://developers.cm.com/mobile-marketing-cloud/docs/events) [](https://www.cm.com/) * [Privacy Policy](https://www.cm.com/app/legal/cm-com/privacy-policy/) * [Terms and Conditions](https://www.cm.com/app/legal/cm-com/terms-and-conditions/) * [Cookie Policy](https://www.cm.com/about-cm/cookie-policy/) Jump to Product page Conversational AI Cloud Mobile Service Cloud Mobile Marketing Cloud Messaging Ticketing Payments Platform Voice Sign --- # Schemas Schemas used in requests/responses of our API: returnUrls [](https://developers.cm.com/payments-platform/docs/schemas#returnurls) -------------------------------------------------------------------------------------- | Parameter | Type | Description | Constraints | Required | | --- | --- | --- | --- | --- | | success | String(1...2000) | Return URL to use when the transaction succeeds. | | ✅ | | cancelled | String(1...2000) | Return URL to use when the transaction is cancelled. | | ✅ | | expired | String(1...2000) | Return URL to use when the transaction is expired. | | ✅ | | failed | String(1...2000) | Return URL to use when the transaction is failed. | | ✅ | consumerInRequest [](https://developers.cm.com/payments-platform/docs/schemas#consumerinrequest) ---------------------------------------------------------------------------------------------------- | Parameter | Type | Description | Constraints | Required | | --- | --- | --- | --- | --- | | givenName | String(1...35) | Customer given name. | | | | middleName | String(1...35) | Customer middle name. | | | | familyName | String(1...35) | Customer family name. | | | | email | String | Email provided by customer. | | | | gender | String(1...2000) | Gender of the customer. | The possible values are: `m`, `f` , or `null`. | | | address | [addressInRequest](https://developers.cm.com/payments-platform/docs/schemas#addressInRequest)
Object | Customer address. | | | | phone | String | Customer phone number. | | | | dateOfBirth | String | Date of birth of the customer. | | | addressInRequest [](https://developers.cm.com/payments-platform/docs/schemas#addressinrequest) -------------------------------------------------------------------------------------------------- | Parameter | Type | Description | Constraints | Required | | --- | --- | --- | --- | --- | | street | String(1...100) | Street. | | | | houseNumber | String(1...35) | House and number. | | | | postalCode | String(1...35) | Postal code. | | | | city | String(1...35) | City. | | | | countryCode | String | Country code. | ISO 3166-1 country code. | | | state | String(1...40) | State. | | | | additionalData | String(1...35) | Additional address information. | | | consumer [](https://developers.cm.com/payments-platform/docs/schemas#consumer) ---------------------------------------------------------------------------------- | Parameter | Type | Description | Constraints | Required | | --- | --- | --- | --- | --- | | givenName | String(1...35) | Customer given name. | | | | middleName | String(1...35) | Customer middle name. | | | | familyName | String(1...35) | Customer family name. | | | | email | String | Email provided by customer. | | | | gender | String(1...2000) | Gender of the customer. | The possible values are: `m`, `f` , or `null`. | | | address | [address](https://developers.cm.com/payments-platform/docs/schemas#address)
Object | Customer address. | | | | phone | String | Customer phone number. | | | | dateOfBirth | String | Date of birth of the customer. | | | address [](https://developers.cm.com/payments-platform/docs/schemas#address) -------------------------------------------------------------------------------- | Parameter | Type | Description | Constraints | Required | | --- | --- | --- | --- | --- | | street | String(1...100) | Street. | | | | houseNumber | String(1...35) | House and number. | | | | postalCode | String(1...35) | Postal code. | | | | city | String(1...35) | City. | | | | countryCode | String | Country code. | ISO 3166-1 country code. | | | state | String(1...40) | State. | | | | additionalData | String(1...35) | Additional address information. | | | orderItem [](https://developers.cm.com/payments-platform/docs/schemas#orderitem) ------------------------------------------------------------------------------------ | Parameter | Type | Description | Constraints | Required | | --- | --- | --- | --- | --- | | code | String(1...50) | A code that identifies the item. | | ✅ | | name | String(1...50) | A human readable name for the item. | | | | description | String(1...100) | Additional item description. | | | | unitPrice | Int(1...99999999) | Unit price (including VAT) of the item, specified in the smallest currency subunit, as for example eurocents. | | ✅ | | quantity | Int(1...1000000000) | The number of items. | | ✅ | | vatAmount | Int(1...99999999) | VAT amount of one unit, specified in the smallest currency subunit, as for example eurocents. | | ✅ | | vatRate | Number(0...99.9) | Percentage of VAT applied. Only the first decimal value will be taken into account, the rest will be ignored. | | ✅ | action [](https://developers.cm.com/payments-platform/docs/schemas#action) ------------------------------------------------------------------------------ | Parameter | Type | Description | Constraints | Required | | --- | --- | --- | --- | --- | | redirect | [redirect](https://developers.cm.com/payments-platform/docs/schemas#redirect)
Object | Next action to be performed by merchant (or consumer) to complete the payment. | | | redirect [](https://developers.cm.com/payments-platform/docs/schemas#redirect) ---------------------------------------------------------------------------------- | Parameter | Type | Description | Constraints | Required | | --- | --- | --- | --- | --- | | url | String | URL where consumer should be redirected to by the merchant to perform the payment. | | | refund [](https://developers.cm.com/payments-platform/docs/schemas#refund) ------------------------------------------------------------------------------ | Parameter | Type | Description | Constraints | Required | | --- | --- | --- | --- | --- | | refundedAmount | Int(0...99999999) | Amount in the smallest currency subunit, as for example eurocents, that has already been refunded. | | ✅ | | refundedPendingAmount | Int(1...99999999) | Amount in the smallest currency subunit, as for example eurocents, that has been requested to be refunded. | | ✅ | payment [](https://developers.cm.com/payments-platform/docs/schemas#payment) -------------------------------------------------------------------------------- | Parameter | Type | Description | Constraints | Required | | --- | --- | --- | --- | --- | | id | String(36) | Payment unique identifier. | | ✅ | | type | String | The type of payment. | The possible values are: `bancontact`, `creditcard`, `ideal`, `paypal`, `giropay`. | ✅ | | status | String | `OPEN` - Payment has been created. This is the initial status.
`SUCCESS` - Payment has succeeded.
`CANCELLED` - Payment has not succeeded; cancelled by the consumer.
`EXPIRED` - Payment has not succeeded; expired.
`FAILURE` - Payment has not succeeded; unknown reason.
`AUTHORIZED` - Payment is authorized.
`PENDING` - Payment could not be completed yet; waiting for something.
`CHARGEBACK` - Payment chargeback was created. | | ✅ | | createdAt | String(RFC3339) | Creation time. | ISO 8601 date and time. | ✅ | Updated about 1 year ago * * * [](https://www.cm.com/) * [Privacy Policy](https://www.cm.com/app/legal/cm-com/privacy-policy/) * [Terms and Conditions](https://www.cm.com/app/legal/cm-com/terms-and-conditions/) * [Cookie Policy](https://www.cm.com/about-cm/cookie-policy/) Jump to Product page Conversational AI Cloud Mobile Service Cloud Mobile Marketing Cloud Messaging Ticketing Payments Platform Voice Sign --- # iDEAL ![](https://files.readme.io/50a13ae-ideal2.png) Integrate your own checkout with our API and allow your customers to make payments with iDEAL. How does it work? [](https://developers.cm.com/payments-platform/docs/ideal-1#how-does-it-work) =================================================================================================== 1. Customer opens your webshop, adds some items to the shopping basket, and clicks on 'Proceed to Checkout'. 2. Customer lands on your own checkout, and selects iDEAL. 3. After creating an iDEAL transaction using the [create iDEAL transaction](https://developers.cm.com/payments-platform/docs/create-transaction-1) endpoint, you redirect the customer to the provided URL. 4. The customer completes the payment process, you receive a webhook (if you configured it for your iDEAL transaction), and the customer is redirected to the Return URL(s) you specified on your iDEAL transaction. 5. You make a request to the [get iDEAL transaction](https://developers.cm.com/payments-platform/docs/get-transaction) endpoint, and use its latest details to update your system. > 📘 > > When using webhooks, be aware that they are only a "best effort" mechanism. Find more details [here](https://developers.cm.com/payments-platform/docs/webhooks-1) > . > > > ------------------------------------------------------------------------------------------------------------------------------------------------------------------------- Updated about 1 year ago * * * [](https://www.cm.com/) * [Privacy Policy](https://www.cm.com/app/legal/cm-com/privacy-policy/) * [Terms and Conditions](https://www.cm.com/app/legal/cm-com/terms-and-conditions/) * [Cookie Policy](https://www.cm.com/about-cm/cookie-policy/) Jump to Product page Conversational AI Cloud Mobile Service Cloud Mobile Marketing Cloud Messaging Ticketing Payments Platform Voice Sign --- # PG 1.27.0 [Back to All](https://developers.cm.com/payments-platform/changelog) These are the changes we’ll be releasing on acceptance on 08-10-2025 Changelog: Features: • Our checkout now has data-testid values for each component it uses. This allows automated tests to run against these IDs instead of having to rely on specific names/values. • Added an endpoint to get the refunds created through using the checkout refunds endpoint. This functionality was previously possible by implementing the payment method specific endpoints but is now also available through the checkout endpoints. • The REFUND\_STATUS event request body now also contains the refundID • (internal) We can now get refunds for a checkout using checkout-api • (internal) We can now process transaction status updates in our checkout-api project. Improvements: • (internal) Update packages. • (internal) Improved the data retention job to speed up some queries • (internal) Instead of returning the “UNKNOWN” status which is undocumented we now return a 500 internal server error. • (internal) Removed code to interact with the old hosted checkout. All merchants have been migrated to our own hosted checkout. • (internal) Configured the creditcard psp URLs in common-api and checkout-ui to enable the creditcard transactions using our new psp on production. • (internal) refactored IN3 docs, this change won’t be live until every payment method doc has been refactored. • VAT amounts for items (aka order lines) are now the total vat amount of the order line, no longer per item. This allows for fewer currency/amount calculations to happen in the Klarna process. • Removed an old debug endpoint (trigger-webhooks) which has not worked or been used for years Fixes: • [](https://www.cm.com/) * [Privacy Policy](https://www.cm.com/app/legal/cm-com/privacy-policy/) * [Terms and Conditions](https://www.cm.com/app/legal/cm-com/terms-and-conditions/) * [Cookie Policy](https://www.cm.com/about-cm/cookie-policy/) Jump to Product page Conversational AI Cloud Mobile Service Cloud Mobile Marketing Cloud Messaging Ticketing Payments Platform Voice Sign --- # Status Transitions iDEAL transaction statuses [](https://developers.cm.com/payments-platform/docs/status-transitions-1#ideal-transaction-statuses) ----------------------------------------------------------------------------------------------------------------------------------- `OPEN` - iDEAL transaction has been created. This is the initial status. `SUCCESS` - iDEAL transaction has been successfully paid. `CANCELLED` - iDEAL transaction has not succeeded; cancelled by the consumer. `EXPIRED` - iDEAL transaction has not succeeded; expired. `FAILURE` - iDEAL transaction has not succeeded; unknown reason. Status Transitions [](https://developers.cm.com/payments-platform/docs/status-transitions-1#status-transitions) ------------------------------------------------------------------------------------------------------------------- The diagram below shows all state transitions an iDEAL transaction could go through. ![](https://files.readme.io/99c5224-State_-_iDEAL_Statuses.png) Once an iDEAL transaction has been created the status will be `OPEN`. While the state of an iDEAL transaction is `OPEN` a consumer can try to make a payment with it. Once a payment is successful, the transaction status will transition to `SUCCESS`. This is the happy-flow. At this point the consumer has paid and the funds will eventually make its way to your accounts. Of course there are other possibilities as you will have seen in the state diagram. It could transition to `CANCELLED` if the consumer did not complete the payment and instead clicked on the cancel button. It could transition to `EXPIRED` if the `expiresAt` timestamp has been reached and the transaction is still `OPEN`. It could transition to `FAILURE` if the payment failed. Updated about 1 year ago * * * [](https://www.cm.com/) * [Privacy Policy](https://www.cm.com/app/legal/cm-com/privacy-policy/) * [Terms and Conditions](https://www.cm.com/app/legal/cm-com/terms-and-conditions/) * [Cookie Policy](https://www.cm.com/about-cm/cookie-policy/) Jump to Product page Conversational AI Cloud Mobile Service Cloud Mobile Marketing Cloud Messaging Ticketing Payments Platform Voice Sign --- # PG 1.26.2 [Back to All](https://developers.cm.com/payments-platform/changelog) The following changes will be deployed to acceptance on 24-09-2025. Changelog: Features: • The GET creditcard v1 endpoint now also returns the card provider (maestro, visa, mastercard, etc.) when a transaction is fetched. Improvements: • (internal) Update packages. • (internal) refactoring openapi spec for ideal qr (not going live until every payment method has been refactored) • (internal) reduced the amount of duplicate configuration stored for webhooks. This will improved performance and reduce the amount of storage used. • (internal) added a new data retention binary to implement our data retention policy of 18 months. • (internal) Created a Bruno collection containing examples of all our endpoints. • (internal) Removed unused code related to ideal orders. We keep the orderId field to remain backwards compatible. Fixes: • (internal) fixed a case where google pay would sometimes contain unknown fields during local development • (internal) we no longer render payment methods that are not implemented in the checkout frontend. • If a payment fails to be created in our downstream systems we now set the status immediately to ‘canceled’ or ‘failed’ instead of leaving it ‘open’. We have had this implementation for some payment methods (creditcard/paypal/ideal) for a while already, but now we implemented it for all the remaining payment methods. • The iDEAL issuer list has been deprecated for over a year now. With this release the endpoint is no longer available and will return a 410 and [](https://www.cm.com/) * [Privacy Policy](https://www.cm.com/app/legal/cm-com/privacy-policy/) * [Terms and Conditions](https://www.cm.com/app/legal/cm-com/terms-and-conditions/) * [Cookie Policy](https://www.cm.com/about-cm/cookie-policy/) Jump to Product page Conversational AI Cloud Mobile Service Cloud Mobile Marketing Cloud Messaging Ticketing Payments Platform Voice Sign --- # Diagrams Create an iDEAL transaction [](https://developers.cm.com/payments-platform/docs/diagrams-1#create-an-ideal-transaction) --------------------------------------------------------------------------------------------------------------------------- The CM.com Online Payments API enables you to create an iDEAL transaction. The diagram below presents the interaction that takes place between Consumer, Merchant (You) and CM.com Online Payments API when creating an iDEAL transaction: ![](https://files.readme.io/a0830dd-SQ_-_iDEAL_Transaction.svg) In the diagram above the following steps are performed: 1. Consumer wants to start a payment. 2. Merchant makes a request to create an iDEAL transaction. 3. Merchant receives a successful response and redirects the Consumer to the provided URL. 4. Consumer continues with the payment and eventually is redirected to the CM.com Online Payments API returnURL. 5. When the status of the iDEAL transaction is updated on the CM.com Online Payments API, the Consumer is redirected to the return URL that the Merchant specified in the original request to create the iDEAL transaction. 6. If the Merchant also specified webhooks in the original request then CM.com Online Payments API will trigger the proper webhooks and make the requests to the webhook URLs specified by the Merchant. **When using webhooks, be aware that they are only a "best effort" mechanism**. 7. Merchant gets the latest details of the transaction. This usually happens once the Merchant received a webhook request. The API endpoints involved on this flow are: * [Create Transaction](https://developers.cm.com/payments-platform/docs/create-transaction-1) * [Get Transaction](https://developers.cm.com/payments-platform/docs/get-transaction) Create a refund for the payment made with an iDEAL transaction [](https://developers.cm.com/payments-platform/docs/diagrams-1#create-a-refund-for-the-payment-made-with-an-ideal-transaction) ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- The CM.com Online Payments API enables you to create a refund for the payment made with an iDEAL transaction. The diagram below presents the interaction that takes place between Merchant (You) and CM.com Online Payments API when requesting a refund for the payment made with an iDEAL transaction: ![](https://files.readme.io/877361d-SQ_-_iDEAL_Refund.svg) The API endpoints involved on this flow are: * [Create a Refund](https://developers.cm.com/payments-platform/docs/create-a-refund-1) Updated about 1 year ago * * * [](https://www.cm.com/) * [Privacy Policy](https://www.cm.com/app/legal/cm-com/privacy-policy/) * [Terms and Conditions](https://www.cm.com/app/legal/cm-com/terms-and-conditions/) * [Cookie Policy](https://www.cm.com/about-cm/cookie-policy/) Jump to Product page Conversational AI Cloud Mobile Service Cloud Mobile Marketing Cloud Messaging Ticketing Payments Platform Voice Sign --- # Create Transaction You can use this call to create a new iDEAL transaction. Prerequisite [](https://developers.cm.com/payments-platform/docs/create-transaction-1#prerequisite) ------------------------------------------------------------------------------------------------------- Get an `access_token` and use it as 'Bearer' token in your request. Find more details [here](https://developers.cm.com/payments-platform/docs/authorization-3) . Request [](https://developers.cm.com/payments-platform/docs/create-transaction-1#request) --------------------------------------------------------------------------------------------- Text `POST https://api.pay.cm.com/api/v1/paymentmethods/ideal/v1/transactions` ### Request body examples [](https://developers.cm.com/payments-platform/docs/create-transaction-1#request-body-examples) These are only some examples of the request body to create a transaction: Full Request with ReturnURLsFull Request with ReturnURLMinimal Request with ReturnURLFast Checkout (Snel Bestellen) `{ "reference": "20210623130413", "amount": 1200, "currency": "EUR", "purchaseId": "order123", "description": "Order at yourdomain.tld", "expiresAt": "2006-01-02T15:04:05Z", "language": "nl", "webhooks": [ { "url": "https://yourdomain.tld/order-webhooks?purchaseId=order123", "events": [ "FINALSTATUS" ] }, { "url": "https://yourdomain.tld/payment-webhooks?purchaseId=order123", "events": [ "REFUND_STATUS" ] }, { "url": "https://yourdomain.tld/payment-webhooks?purchaseId=order123", "events": [ "STATUS_CHANGE" ] } ], "returnUrls": { "success": "https://yourdomain.tld/order/payment-success.html", "cancelled": "https://yourdomain.tld/order/payment-cancelled.html", "expired": "https://yourdomain.tld/order/payment-expired.html", "failed": "https://yourdomain.tld/order/payment-failed.html" } }` `{ "reference": "20210623130413", "amount": 1200, "currency": "EUR", "purchaseId": "order123", "description": "Order at yourdomain.tld", "expiresAt": "2006-01-02T15:04:05Z", "language": "nl", "webhooks": [ { "url": "https://yourdomain.tld/order-webhooks?purchaseId=order123", "events": [ "FINALSTATUS" ] }, { "url": "https://yourdomain.tld/payment-webhooks?purchaseId=order123", "events": [ "REFUND_STATUS" ] }, { "url": "https://yourdomain.tld/payment-webhooks?purchaseId=order123", "events": [ "STATUS_CHANGE" ] } ], "returnUrl": "https://yourdomain.tld/order/payment-completed.html" }` `{ "reference": "20210623130413", "amount": 1200, "purchaseId": "order123", "description": "Order at yourdomain.tld", "returnUrl": "https://yourdomain.tld/order/payment-completed.html" }` `{ "reference": "20210623130413", "amount": 1200, "currency": "EUR", "purchaseId": "order123", "description": "Order at yourdomain.tld", "expiresAt": "2006-01-02T15:04:05Z", "language": "nl", "checkout": { "shippingCost": 100, "requestedDetails": { "debtorContactDetails": { "firstName": true, "lastName": false, "phoneNumber": false, "email": false }, "shippingAddress": false, "invoiceAddress": false } }, "webhooks": [ { "url": "https://yourdomain.tld/order-webhooks?purchaseId=order123", "events": [ "FINALSTATUS" ] }, { "url": "https://yourdomain.tld/payment-webhooks?purchaseId=order123", "events": [ "REFUND_STATUS" ] }, { "url": "https://yourdomain.tld/payment-webhooks?purchaseId=order123", "events": [ "STATUS_CHANGE" ] } ], "returnUrls": { "success": "https://yourdomain.tld/order/payment-success.html", "cancelled": "https://yourdomain.tld/order/payment-cancelled.html", "expired": "https://yourdomain.tld/order/payment-expired.html", "failed": "https://yourdomain.tld/order/payment-failed.html" } }` "**Full Request with ReturnURLs**" and "**Full Request with ReturnURL**" are examples where all the request parameters are provided. If `returnUrls` is defined then customers will be redirected to a different URL depending on the status of the transaction when the payment process is completed. If `returnUrl` is defined then customers will be redirected to the same URL no matter the status of the transaction when the payment process is completed. "**Minimal Request with ReturnURLs**" is an example of the minimal request to create a transaction. This example, is using `returnUrls`, but you can replace it for `returnUrl` depending on what is better for your use case. Parameters [](https://developers.cm.com/payments-platform/docs/create-transaction-1#parameters) --------------------------------------------------------------------------------------------------- | Parameter | Type | Description | Constraints | | --- | --- | --- | --- | | reference | String(1...255) | An identifier specified by you. If webhooks were specified in the request this identifier is added to the webhook request payload. | | | amount | Int(1...99999999) | Integer representing the amount of the transaction. Denomination in the smallest currency subunit (e.g. eurocents). | For test, the maximum amount is €999,99 | | purchaseId | String(1...35) | Identification of the order within your system. Ultimately appears on the payment confirmation (statement and confirmation screen). | | | description | String(1...255) | Description of the transaction. | | | returnUrl | String(2000) | Specifies the URL where your customers will be redirected to when the payment process is completed. | Either `returnUrl` or `returnUrls` must be specified, but not both. | | returnUrls | [returnUrls](https://developers.cm.com/payments-platform/docs/schemas-1#returnurls)
Object | Specifies a URL where your customers will be redirected to (per transaction status) when the payment process is completed. For example, your customers will be redirected to `returnUrls.success` when the status of the transaction changes to `SUCCESS`. | Either `returnUrl` or `returnUrls` must be specified, but not both. | Optional parameters [](https://developers.cm.com/payments-platform/docs/create-transaction-1#optional-parameters) --------------------------------------------------------------------------------------------------------------------- | Parameter | Type | Description | Constraints | | --- | --- | --- | --- | | expiresAt | String(RFC3339) | Expiration time. | ISO 8601 date and time. | | language | String(ISO 639-1) | Preferred language of the user interface. | ISO 639-1 language. | | currency | String (ISO 4217) | Currency code. | ISO 4217 currency code. | | webhooks | Array of objects | Webhooks enable receiving a web request once a given event occurs. | Find more details [here](https://developers.cm.com/payments-platform/docs/webhooks-1)
. | | checkout | Object | Contains optional values used by Fast Checkout. | Find more details [here](https://developers.cm.com/payments-platform/docs/fast-checkout-snel-bestellen) | Response [](https://developers.cm.com/payments-platform/docs/create-transaction-1#response) ----------------------------------------------------------------------------------------------- JSON `{ "id": "8db1e7fa-ba8a-4189-92fd-67a20217443d", "orderId": "8db1e7fa-ba8a-4189-92fd-67a20217443d", "reference": "20210623130413", "issuer": "RABONL2U", "amount": 1200, "currency": "EUR", "purchaseId": "order123", "description": "Order at yourdomain.tld", "expiresAt": "2006-01-02T15:04:05Z", "language": "nl", "webhooks": [ { "url": "https://yourdomain.tld/order-webhooks?purchaseId=order123", "events": [ "FINALSTATUS" ] }, { "url": "https://yourdomain.tld/payment-webhooks?purchaseId=order123", "events": [ "REFUND_STATUS" ] }, { "url": "https://yourdomain.tld/payment-webhooks?purchaseId=order123", "events": [ "STATUS_CHANGE" ] } ], "status": "OPEN", "action": { "redirect": { "url": "https://issuer.tld/ideal/start?trxid=213981209381209390821&random=wreq0dq90vgq0ew923123" } }, "createdAt": "2006-01-02T15:04:05Z", "consumer": { "name": "John", "bic": "RABONL2U", "iban": "NL24RABO8487376045" }, "refunds": { "refundedAmount": 300, "refundedPendingAmount": 100 }, "idealTransactionId": "1234567890123456", "returnUrls": { "success": "https://yourdomain.tld/order/payment-success.html", "cancelled": "https://yourdomain.tld/order/payment-cancelled.html", "expired": "https://yourdomain.tld/order/payment-expired.html", "failed": "https://yourdomain.tld/order/payment-failed.html" } }` Parameters [](https://developers.cm.com/payments-platform/docs/create-transaction-1#parameters-1) ----------------------------------------------------------------------------------------------------- | Parameter | Type | Description | Constraints | | --- | --- | --- | --- | | id | String(36) | Transaction unique identifier. | | | orderId | String(36) | Unique identifier. | | | reference | String(1...255) | An identifier specified by you. If webhooks were specified in the request this identifier is added to the webhook request payload. | Specified in the request. | | amount | Int(1...99999999) | Integer representing the amount of the checkout. Denomination in the smallest currency subunit (e.g. eurocents). | Specified in the request. | | currency | String (ISO 4217) | Currency code. | Specified in the request. | | purchaseId | String(1...35) | Identification of the order within your system. Ultimately appears on the payment confirmation (statement and confirmation screen). | Specified in the request. | | description | String(1...255) | Description of the transaction. | Specified in the request. | | expiresAt | String(RFC3339) | Expiration time. | | | status | String | `OPEN` - Transaction has been created. This is the initial status.
`SUCCESS` - Transaction successfully paid.
`CANCELLED` - Transaction has been cancelled by your customers.
`EXPIRED` - Transaction has not succeeded; expired.
`FAILURE` - Transaction has not succeeded; unknown reason. | | | action | [action](https://developers.cm.com/payments-platform/docs/schemas-1#action)
Object | The next action to be performed by you for this transaction. This includes a URL where you should `redirect` your customer to perform the payment. | This parameter is nullable, and it is only available while the transaction is `OPEN`. | | createdAt | String(RFC3339) | Creation time. | ISO 8601 date and time. | | idealTransactionId | String(16) | The 16-digit transaction ID within the iDEAL scheme as known by the issuing bank. The value can have leading zeros. | This value is null if the status is `OPEN` or `FAILURE`. | | returnUrl | String(2000) | Specifies the URL where your customers will be redirected to when the payment process is completed. | Specified in the request. | | returnUrls | Object | Specifies a URL where your customers will be redirected to (per transaction status) when the payment process is completed. For example, your customers will be redirected to `returnUrls.success` when the status of the transaction changes to `SUCCESS`. | Specified in the request. | Optional parameters [](https://developers.cm.com/payments-platform/docs/create-transaction-1#optional-parameters-1) ----------------------------------------------------------------------------------------------------------------------- | Parameter | Type | Description | Constraints | | --- | --- | --- | --- | | issuer | String(8...11) | Bank Identification Code. | | | language | String(ISO 639-1) | Preferred language of the user interface. | Specified in the request. | | webhooks | Array of objects | Webhooks enable receiving a web request once a given event occurs. | Specified in the request. | | consumer | [consumer](https://developers.cm.com/payments-platform/docs/schemas-1#consumer)
Object | Contains the Name, Bank Identification Code, and IBAN used by the customer that completed the payment. | This field is `null` until the payment is completed. | | refunds | [refund](https://developers.cm.com/payments-platform/docs/schemas-1#refund)
Object | Indicates refundedAmount and refundedPendingAmount. | | Response codes [](https://developers.cm.com/payments-platform/docs/create-transaction-1#response-codes) ----------------------------------------------------------------------------------------------------------- | HTTP status | Description | | --- | --- | | 201 | Successful transaction. | | 4XX | Client error response (See message for details). This response is given when the user input was incorrect or something illegal was attempted (eg. using a service without having that service configured for the user, or not being authorized). | | 5XX | Server error response (See message for details). | Updated 6 months ago * * * [](https://www.cm.com/) * [Privacy Policy](https://www.cm.com/app/legal/cm-com/privacy-policy/) * [Terms and Conditions](https://www.cm.com/app/legal/cm-com/terms-and-conditions/) * [Cookie Policy](https://www.cm.com/about-cm/cookie-policy/) Jump to Product page Conversational AI Cloud Mobile Service Cloud Mobile Marketing Cloud Messaging Ticketing Payments Platform Voice Sign --- # PG 1.26.1 [Back to All](https://developers.cm.com/payments-platform/changelog) The following changes will be deployed to acceptance on 10-09-2025 before going to production after 2 weeks. Changelog: Features: · Always require the email and telephone number fields at consumer level for a new credit card transaction (v2) if one or both are empty. Improvements: · (internal) Update packages. Fixes: · (internal) a panic when a bancontact transactions was queried for the 3DS flow but did not have any 3DS data [](https://www.cm.com/) * [Privacy Policy](https://www.cm.com/app/legal/cm-com/privacy-policy/) * [Terms and Conditions](https://www.cm.com/app/legal/cm-com/terms-and-conditions/) * [Cookie Policy](https://www.cm.com/about-cm/cookie-policy/) Jump to Product page Conversational AI Cloud Mobile Service Cloud Mobile Marketing Cloud Messaging Ticketing Payments Platform Voice Sign --- # Get Transaction You can use this call to retrieve details of an iDEAL transaction. Prerequisite [](https://developers.cm.com/payments-platform/docs/get-transaction#prerequisite) -------------------------------------------------------------------------------------------------- Get an `access_token` and use it as 'Bearer' token in your request. Find more details [here](https://developers.cm.com/payments-platform/docs/authorization-3) . Request [](https://developers.cm.com/payments-platform/docs/get-transaction#request) ---------------------------------------------------------------------------------------- Text `GET https://api.pay.cm.com/api/v1/paymentmethods/ideal/v1/transactions/{transactionId}` Response [](https://developers.cm.com/payments-platform/docs/get-transaction#response) ------------------------------------------------------------------------------------------ JSON `{ "id": "8db1e7fa-ba8a-4189-92fd-67a20217443d", "orderId": "8db1e7fa-ba8a-4189-92fd-67a20217443d", "reference": "20210623130413", "issuer": "RABONL2U", "amount": 1200, "currency": "EUR", "purchaseId": "order123", "description": "Order at yourdomain.tld", "expiresAt": "2006-01-02T15:04:05Z", "language": "nl", "webhooks": [ { "url": "https://yourdomain.tld/order-webhooks?purchaseId=order123", "events": [ "FINALSTATUS" ] }, { "url": "https://yourdomain.tld/payment-webhooks?purchaseId=order123", "events": [ "REFUND_STATUS" ] }, { "url": "https://yourdomain.tld/payment-webhooks?purchaseId=order123", "events": [ "STATUS_CHANGE" ] } ], "status": "OPEN", "action": { "redirect": { "url": "https://issuer.tld/ideal/start?trxid=213981209381209390821&random=wreq0dq90vgq0ew923123" } }, "createdAt": "2006-01-02T15:04:05Z", "consumer": { "name": "John", "bic": "RABONL2U", "iban": "NL24RABO8487376045" }, "refunds": { "refundedAmount": 300, "refundedPendingAmount": 100 }, "idealTransactionId": "1234567890123456", "returnUrls": { "success": "https://yourdomain.tld/order/payment-success.html", "cancelled": "https://yourdomain.tld/order/payment-cancelled.html", "expired": "https://yourdomain.tld/order/payment-expired.html", "failed": "https://yourdomain.tld/order/payment-failed.html" } }` Parameters [](https://developers.cm.com/payments-platform/docs/get-transaction#parameters) ---------------------------------------------------------------------------------------------- | Parameter | Type | Description | Constraints | | --- | --- | --- | --- | | id | String(36) | Transaction unique identifier. | | | orderId | String(36) | Unique identifier. | | | reference | String(1...255) | An identifier specified by you. If webhooks were specified in the request this identifier is added to the webhook request payload. | | | amount | Int(1...99999999) | Integer representing the amount of the checkout. Denomination in the smallest currency subunit (e.g. eurocents). | | | currency | String (ISO 4217) | Currency code. | ISO 4217 currency code. | | purchaseId | String(1...35) | Identification of the order within your system. Ultimately appears on the payment confirmation (statement and confirmation screen). | | | description | String(1...255) | Description of the transaction. | | | expiresAt | String(RFC3339) | Expiration time. | | | status | String | `OPEN` - Transaction has been created. This is the initial status.
`SUCCESS` - Transaction successfully paid.
`CANCELLED`\- Transaction has been cancelled by your customers.
`EXPIRED` - Transaction has not succeeded; expired.
`FAILURE` - Transaction has not succeeded; unknown reason. | | | action | [action](https://developers.cm.com/payments-platform/docs/schemas-1#action)
Object | The next action to be performed by you for this transaction. This includes a URL where you should `redirect` your customer to perform the payment. | This parameter is nullable, and it is only available while the transaction is `OPEN`. | | createdAt | String(RFC3339) | Creation time. | ISO 8601 date and time. | | idealTransactionId | String(16) | The 16-digit transaction ID within the iDEAL scheme as known by the issuing bank. The value can have leading zeros. | This value is null if the status is `OPEN` or `FAILURE`. | | returnUrl | String(2000) | Specifies the URL where your customers will be redirected to when the payment process is completed. | Either `returnUrl` or `returnUrls` must be specified, but not both. | | returnUrls | [returnUrls](https://developers.cm.com/payments-platform/docs/schemas-1#returnurls)
Object | Specifies a URL where your customers will be redirected to (per transaction status) when the payment process is completed. For example, your customers will be redirected to `returnUrls.success` when the status of the transaction changes to `SUCCESS`. | Either `returnUrl` or `returnUrls` must be specified, but not both. | Optional parameters [](https://developers.cm.com/payments-platform/docs/get-transaction#optional-parameters) ---------------------------------------------------------------------------------------------------------------- | Parameter | Type | Description | Constraints | | --- | --- | --- | --- | | issuer | String(8...11) | Bank Identification Code. | | | language | String(ISO 639-1) | Preferred language of the user interface. | ISO 639-1 language. | | webhooks | Array of objects | Webhooks enable receiving a web request once a given event occurs. | Find more details [here](https://developers.cm.com/payments-platform/docs/webhooks-1)
. | | consumer | [consumer](https://developers.cm.com/payments-platform/docs/schemas-1#consumer)
Object | Contains the Name, Bank Identification Code, and IBAN used by the customer that completed the payment. | This field is `null` until the payment is completed. | | refunds | [refund](https://developers.cm.com/payments-platform/docs/schemas-1#refund)
Object | Indicates refundedAmount and refundedPendingAmount. | | Response codes [](https://developers.cm.com/payments-platform/docs/get-transaction#response-codes) ------------------------------------------------------------------------------------------------------ | HTTP status | Description | | --- | --- | | 200 | Transaction details are successfully retrieved. | | 4XX | Client error response (See message for details). This response is given when the User input was incorrect or something illegal was attempted (eg. using a service without having that service configured for the user, or not being authorized). | | 5XX | Server error response (See message for details). | Updated about 1 year ago * * * [](https://www.cm.com/) * [Privacy Policy](https://www.cm.com/app/legal/cm-com/privacy-policy/) * [Terms and Conditions](https://www.cm.com/app/legal/cm-com/terms-and-conditions/) * [Cookie Policy](https://www.cm.com/about-cm/cookie-policy/) Jump to Product page Conversational AI Cloud Mobile Service Cloud Mobile Marketing Cloud Messaging Ticketing Payments Platform Voice Sign --- # PS 25.12 [Back to All](https://developers.cm.com/payments-platform/changelog) Feature Changes * Added support for Ideal Fast-Check Out * The e-mail address in the Order-request is now optional. * Added support for Act-as-Other-Merchant * Chargeback reversal are now added to the status report of an Order/Payment. Various Bug Fixes * Payments now transition to status CANCELED, when there is a technical when canceling the payment. * The checkout menu shows a waiting-for-payment banner when an Ideal QR code is scanned. [](https://www.cm.com/) * [Privacy Policy](https://www.cm.com/app/legal/cm-com/privacy-policy/) * [Terms and Conditions](https://www.cm.com/app/legal/cm-com/terms-and-conditions/) * [Cookie Policy](https://www.cm.com/about-cm/cookie-policy/) Jump to Product page Conversational AI Cloud Mobile Service Cloud Mobile Marketing Cloud Messaging Ticketing Payments Platform Voice Sign --- # Create a Refund You can use this call to create a refund for a payment made with an iDEAL transaction. Request [](https://developers.cm.com/payments-platform/docs/create-a-refund-1#request) ------------------------------------------------------------------------------------------ Text `POST https://api.pay.cm.com/api/v1/paymentmethods/ideal/v1/transactions/{transactionId}/refunds` JSON `{ "amount": 1200, "reason": "Refund required by customer." }` Optional parameters [](https://developers.cm.com/payments-platform/docs/create-a-refund-1#optional-parameters) ------------------------------------------------------------------------------------------------------------------ | Parameter | Type | Description | Constraints | | --- | --- | --- | --- | | amount | Int(1...99999999) | Denomination in the smallest currency subunit (e.g. eurocents). If empty, the refund amount will be the remaining available amount of the transaction (e.g. total payment amount minus already refunded amounts minus the amounts of the pending refund requests). | Must be lower than or equal to the original transaction amount. | | reason | String(255) | The description for the refund. | | Response [](https://developers.cm.com/payments-platform/docs/create-a-refund-1#response) -------------------------------------------------------------------------------------------- If refund has been successfully created then the response is the [Get Transaction](https://developers.cm.com/payments-platform/docs/get-transaction) response with an updated refunds.refundedAmount and refunds.refundedPendingAmount. Response codes [](https://developers.cm.com/payments-platform/docs/create-a-refund-1#response-codes) -------------------------------------------------------------------------------------------------------- | HTTP status | Description | | --- | --- | | 201 | Refund successfully created. | | 4XX | Client error response (See message for details). This response is given when the User input was incorrect or something illegal was attempted (eg. using a service without having that service configured for the user, or not being authorized). | | 5XX | Server error response (See message for details). | Updated about 1 year ago * * * [](https://www.cm.com/) * [Privacy Policy](https://www.cm.com/app/legal/cm-com/privacy-policy/) * [Terms and Conditions](https://www.cm.com/app/legal/cm-com/terms-and-conditions/) * [Cookie Policy](https://www.cm.com/about-cm/cookie-policy/) Jump to Product page Conversational AI Cloud Mobile Service Cloud Mobile Marketing Cloud Messaging Ticketing Payments Platform Voice Sign --- # Payments Platform ![payments-dark icon](https://www.cm.com/app/aurora/svg/apps/large/default/payments.svg) Online Payments [](https://developers.cm.com/payments-platform/v1.0.2/#online-payments) ------------------------------------------------------------------------------------------- Online Payments API allows merchants to create Online Payments. [Find out more](https://developers.cm.com/payments-platform/docs/cm-payments) ![voice-dark icon](https://www.cm.com/app/aurora/svg/apps/large/default/pos-terminal.svg) POS Payments [](https://developers.cm.com/payments-platform/v1.0.2/#pos-payments) ------------------------------------------------------------------------------------- POS Payments covers both ECR (Electronic Cash Register) solutions and integrations, as well as Smart POS Terminals. We have solutions to connect external ECRs to Smart POS Terminals through our Cloud Integration solution. On top of that we also enable 3rd party integrators to integrate directly with our Android based Terminal app and run side by side on the Smart POS Terminal! [Find out more](https://developers.cm.com/payments-platform/v22.06/docs/pos-payments) ![payments-dark icon](https://www.cm.com/app/aurora/svg/apps/large/default/payments.svg) Online Payments (Legacy) [](https://developers.cm.com/payments-platform/v1.0.2/#online-payments-legacy) ----------------------------------------------------------------------------------------------------------- Online Payments API allows merchants to create Online Payments. [Find out more](https://developers.cm.com/payments-platform/v22.06/docs/introduction) [](https://www.cm.com/) * [Privacy Policy](https://www.cm.com/app/legal/cm-com/privacy-policy/) * [Terms and Conditions](https://www.cm.com/app/legal/cm-com/terms-and-conditions/) * [Cookie Policy](https://www.cm.com/about-cm/cookie-policy/) Jump to Product page Conversational AI Cloud Mobile Service Cloud Mobile Marketing Cloud Messaging Ticketing Payments Platform Voice Sign --- # PS 25.06.0 [Back to All](https://developers.cm.com/payments-platform/changelog) Various bug fixes and optimizations. [](https://www.cm.com/) * [Privacy Policy](https://www.cm.com/app/legal/cm-com/privacy-policy/) * [Terms and Conditions](https://www.cm.com/app/legal/cm-com/terms-and-conditions/) * [Cookie Policy](https://www.cm.com/about-cm/cookie-policy/) Jump to Product page Conversational AI Cloud Mobile Service Cloud Mobile Marketing Cloud Messaging Ticketing Payments Platform Voice Sign --- # PS 24.11 [Back to All](https://developers.cm.com/payments-platform/changelog) Feature changes * Giropay/Evopayments payment method is deprecated and is no longer accepted by the system. Existing payment with Giropay/Evopayments are still reported, as such. Api changes * Pagination is supported for the subscription Api [](https://www.cm.com/) * [Privacy Policy](https://www.cm.com/app/legal/cm-com/privacy-policy/) * [Terms and Conditions](https://www.cm.com/app/legal/cm-com/terms-and-conditions/) * [Cookie Policy](https://www.cm.com/about-cm/cookie-policy/) Jump to Product page Conversational AI Cloud Mobile Service Cloud Mobile Marketing Cloud Messaging Ticketing Payments Platform Voice Sign --- # Fast Checkout (Snel Bestellen) Introduction [](https://developers.cm.com/payments-platform/docs/fast-checkout-snel-bestellen#introduction) --------------------------------------------------------------------------------------------------------------- Fast Checkout also known as Snel Bestellen is an iDEAL 2.0 feature where a merchant (you) can request the Billing and Invoice Address data from a customer when they pay using iDEAL. This functionality allows for a faster (guest) checkout since the customer does not have to enter their details in your checkout. Instead an iDEAL Snel Bestellen button can be used as part of the guest checkout. Once a customer has paid using iDEAL Fast Checkout the requested information will become available in the iDEAL transaction response in the 'consumer' object. To start using iDEAL Fast Checkout you'll need to add an additional object in the request body when creating an iDEAL transaction. This object is called `checkout`. The object contains the following fields: JSON `checkout: { shippingCost: 100, requestedDetails: { debtorContactDetails: { firstName: false, lastName: false, phoneNumber: false, email: false }, shippingAddress: false, invoiceAddress: false } }` To request certain information you simply have to send in `true` for the value you'd like to receive. This will inform the consumer when they check out in the iDEAL process. For fast checkout you must select at least 1 element to be requested from the consumer. For GDPR there are requirements to only request data that you actually need. Guidelines [](https://developers.cm.com/payments-platform/docs/fast-checkout-snel-bestellen#guidelines) ----------------------------------------------------------------------------------------------------------- There are some guidelines when displaying Fast Checkout (a.k.a. Snel Bestellen) in your checkout. At the bottom of this page are 6 variations of the button available as SVGs. 1. Label Use “Snel bestellen” (default) or “Checkout”, matching your site/app language. Format: Sentence case (e.g., "Snel bestellen"). Do not modify, shorten, translate, or fully capitalize the text. 2. Font Montserrat (medium weight, 0% letter spacing). Size = 0.65 × logo height (h), within 13pt (min) – 26pt (max). Do not use other fonts, weights, or exceed size limits. 3. Logo Use the official **iDEAL Snel bestellen** logo (min. 20dp height, never below 16dp). Must always appear with the text label. Do not modify colors, resize improperly, or use the logo alone. 4. Style Available in magenta or white—ensure contrast with background. Default corner radius: 5, but can match other payment buttons. Do not alter button styling. 5. Button States Supports enabled, hover/pressed, and focused states. The focus state can match your site/app’s design. 6. Sizing Button must be equal to or larger than other payment buttons. Resize proportionally per guidelines to maintain correct font and layout. Do not make it smaller than the minimum required size. 7. Clear Space & Placement Maintain at least 8px of spacing around the button. Best practice: Display as the primary payment option. ### Button Examples [](https://developers.cm.com/payments-platform/docs/fast-checkout-snel-bestellen#button-examples) ![](https://files.readme.io/248fd35a782747c3c1532683a24aed21bb6fedacb62fb9a9cf8788149ef0a29d-image.png) ![](https://files.readme.io/10ceaaecd63ba65c646bf1eb258619ee349ccb389d431791c36893258f1de333-image.png) Assets [](https://developers.cm.com/payments-platform/docs/fast-checkout-snel-bestellen#assets) --------------------------------------------------------------------------------------------------- You can use the following SVGs for the Fast Checkout (Snel Bestellen) button in your webshop. Snel bestellen\_focused\_magenta\_border: ![](https://files.readme.io/9c9ef740378fbfa1218d60a406113b1eddf4d1e8d8e4cc9e1ad9b2ff0960e181-Snel_bestellen_focused_magenta_border.svg) Snel bestellen\_focused\_no\_border: ![](https://files.readme.io/87f329b898f7bbdc513d6cb74087e9ceca1d5d44078d4a325435ede9cd7f3040-Snel_bestellen_focused_no_border.svg) Snel bestellen\_pressed\_magenta\_border: ![](https://files.readme.io/bb8f83995e0de69ecaf00639253714e517d584b27c8224974deed800d63e93a0-Snel_bestellen_pressed_magenta_border.svg) Snel bestellen\_pressed\_no\_border: ![](https://files.readme.io/db3c15fa1097e1ab19fb7acc3abeda779a5c3e6c076397dbb50e98f313bdef99-Snel_bestellen_pressed_no_border.svg) Snel bestellen\_reg\_magenta\_border: ![](https://files.readme.io/ecad5a204f575e442413ecd568aa8cad4b59a40e0edf898fbaf13bb6ce5951ae-Snel_bestellen_reg_magenta_border.svg) Snel bestellen\_reg\_no\_border: ![](https://files.readme.io/20c068b1b5352dbcccc6a22d6388b26720d5ec873ca163d7f080b974a15c8e36-Snel_bestellen_reg_no_border.svg) Updated 8 months ago * * * [](https://www.cm.com/) * [Privacy Policy](https://www.cm.com/app/legal/cm-com/privacy-policy/) * [Terms and Conditions](https://www.cm.com/app/legal/cm-com/terms-and-conditions/) * [Cookie Policy](https://www.cm.com/about-cm/cookie-policy/) Jump to Product page Conversational AI Cloud Mobile Service Cloud Mobile Marketing Cloud Messaging Ticketing Payments Platform Voice Sign --- # Schemas Schemas used in requests/responses of our API: returnUrls [](https://developers.cm.com/payments-platform/docs/schemas-1#returnurls) ---------------------------------------------------------------------------------------- | Parameter | Type | Description | Constraints | Required | | --- | --- | --- | --- | --- | | success | String(1...2000) | Return URL to use when the transaction succeeds. | | ✅ | | cancelled | String(1...2000) | Return URL to use when the transaction is cancelled. | | ✅ | | expired | String(1...2000) | Return URL to use when the transaction is expired. | | ✅ | | failed | String(1...2000) | Return URL to use when the transaction is failed. | | ✅ | action [](https://developers.cm.com/payments-platform/docs/schemas-1#action) -------------------------------------------------------------------------------- | Parameter | Type | Description | Constraints | Required | | --- | --- | --- | --- | --- | | redirect | [redirect](https://developers.cm.com/payments-platform/docs/schemas-1#redirect)
Object | Next action to be performed by merchant (or consumer) to complete the payment. | | | redirect [](https://developers.cm.com/payments-platform/docs/schemas-1#redirect) ------------------------------------------------------------------------------------ | Parameter | Type | Description | Constraints | Required | | --- | --- | --- | --- | --- | | url | String | URL where consumer should be redirected to by the merchant to perform the payment. | | | consumer [](https://developers.cm.com/payments-platform/docs/schemas-1#consumer) ------------------------------------------------------------------------------------ | Parameter | Type | Description | Constraints | Required | | --- | --- | --- | --- | --- | | name | String | Customer name. | | | | bic | String(8...11) | Bank Identification Code used by the customer. | | | | iban | String | IBAN used by the customer. | | | | checkoutDetails | Object | Contains the optional Fast Checkout details requested during the transaction creation. | | | ### Checkout Details [](https://developers.cm.com/payments-platform/docs/schemas-1#checkout-details) | Parameter | Type | Description | Constraints | Required | | --- | --- | --- | --- | --- | | contactDetails | Object | Contact details of the consumer | Available if requested | | | shippingAddress | Object | Shipping Address of the consumer | Available if requested | | | invoiceAddress | Object | Invoice Address of the consumer | Available if requested | | ### Contact Details [](https://developers.cm.com/payments-platform/docs/schemas-1#contact-details) | Parameter | Type | Description | Constraints | Required | | --- | --- | --- | --- | --- | | firstName | String | The first name of the consumer as configured in their Currence profile | Available if requested | | | lastName | String | The last name of the consumer as configured in their Currence profile | Available if requested | | | phoneNumber | String | The phone number of the consumer as configured in their Currence profile | Available if requested | | | email | String | The email of the consumer as configured in their Currence profile | Available if requested | | ### Address [](https://developers.cm.com/payments-platform/docs/schemas-1#address) | Parameter | Type | Description | Constraints | Required | | --- | --- | --- | --- | --- | | firstName | String | The first name of the consumer as configured in their Currence profile | Available if requested | | | lastName | String | The last name of the consumer as configured in their Currence profile | Available if requested | | | companyName | String | The company name of the consumer as configured in their Currence profile | Available if requested | | | postalCode | String | The postal code of the consumer as configured in their Currence profile | Available if requested | | | houseNumber | String | The house number of the consumer as configured in their Currence profile | Available if requested | | | addition | String | Addition to the house number of the consumer as configured in their Currence profile | Available if requested | | | street | String | The street of the consumer as configured in their Currence profile | Available if requested | | | city | String | The city of the consumer as configured in their Currence profile | Available if requested | | | countryName | String | The countryName of the consumer as configured in their Currence profile | Available if requested | | refund [](https://developers.cm.com/payments-platform/docs/schemas-1#refund) -------------------------------------------------------------------------------- | Parameter | Type | Description | Constraints | Required | | --- | --- | --- | --- | --- | | refundedAmount | Int(0...99999999) | Amount in the smallest currency subunit, as for example eurocents, that has already been refunded. | | ✅ | | refundedPendingAmount | Int(1...99999999) | Amount in the smallest currency subunit, as for example eurocents, that has been requested to be refunded. | | ✅ | Updated 8 months ago * * * [](https://www.cm.com/) * [Privacy Policy](https://www.cm.com/app/legal/cm-com/privacy-policy/) * [Terms and Conditions](https://www.cm.com/app/legal/cm-com/terms-and-conditions/) * [Cookie Policy](https://www.cm.com/about-cm/cookie-policy/) Jump to Product page Conversational AI Cloud Mobile Service Cloud Mobile Marketing Cloud Messaging Ticketing Payments Platform Voice Sign --- # Create a Refund You can use this call to create a refund for a payment made with a Credit Card transaction. Prerequisite [](https://developers.cm.com/payments-platform/docs/create-a-refund-3#prerequisite) ---------------------------------------------------------------------------------------------------- Get an `access_token` and use it as 'Bearer' token in your request. Find more details [here](https://developers.cm.com/payments-platform/docs/authorization-3) . Request [](https://developers.cm.com/payments-platform/docs/create-a-refund-3#request) ------------------------------------------------------------------------------------------ Text `POST https://api.pay.cm.com/api/v1/paymentmethods/creditcard/v1/transactions/{transactionId}/refunds` JSON `{ "amount": 1200, "reason": "Refund required by customer." }` Optional parameters [](https://developers.cm.com/payments-platform/docs/create-a-refund-3#optional-parameters) ------------------------------------------------------------------------------------------------------------------ | Parameter | Type | Description | Constraints | | --- | --- | --- | --- | | amount | Int(1...99999999) | Denomination in the smallest currency subunit (e.g. eurocents). If empty, the refund amount will be the remaining available amount of the transaction (e.g. total payment amount minus already refunded amounts minus the amounts of the pending refund requests). | Must be lower than or equal to the original transaction amount. | | reason | String(255) | The description for the refund. | | Response [](https://developers.cm.com/payments-platform/docs/create-a-refund-3#response) -------------------------------------------------------------------------------------------- If refund has been successfully created then the response is the [Get Transaction](https://developers.cm.com/payments-platform/docs/get-transaction-3) response with an updated refunds.refundedAmount and refunds.refundedPendingAmount. Response codes [](https://developers.cm.com/payments-platform/docs/create-a-refund-3#response-codes) -------------------------------------------------------------------------------------------------------- | HTTP status | Description | | --- | --- | | 201 | Refund successfully created. | | 4XX | Client error response (See message for details). This response is given when the User input was incorrect or something illegal was attempted (eg. using a service without having that service configured for the user, or not being authorized). | | 5XX | Server error response (See message for details). | Updated about 1 year ago * * * [](https://www.cm.com/) * [Privacy Policy](https://www.cm.com/app/legal/cm-com/privacy-policy/) * [Terms and Conditions](https://www.cm.com/app/legal/cm-com/terms-and-conditions/) * [Cookie Policy](https://www.cm.com/about-cm/cookie-policy/) Jump to Product page Conversational AI Cloud Mobile Service Cloud Mobile Marketing Cloud Messaging Ticketing Payments Platform Voice Sign --- # PS 25.15.0 [Back to All](https://developers.cm.com/payments-platform/changelog) Feature Changes * Ideal 2.0 * E-mail address and country fields are now optional. * Not providing a country or email address may limit the execution of risk checks, as well as the availability of certain payment methods. Bug Fixes * Payments menu now properly expands payment methods, even if PayPal is not available. [](https://www.cm.com/) * [Privacy Policy](https://www.cm.com/app/legal/cm-com/privacy-policy/) * [Terms and Conditions](https://www.cm.com/app/legal/cm-com/terms-and-conditions/) * [Cookie Policy](https://www.cm.com/about-cm/cookie-policy/) Jump to Product page Conversational AI Cloud Mobile Service Cloud Mobile Marketing Cloud Messaging Ticketing Payments Platform Voice Sign --- # Bancontact ![](https://files.readme.io/9583355-Bancontact-Original-logo-RGB.png) Integrate your own checkout with our API and allow your customers to make payments with Bancontact. How does it work? [](https://developers.cm.com/payments-platform/docs/bancontact-1#how-does-it-work) ======================================================================================================== 1. Customer opens your webshop, adds some items to the shopping basket, and clicks on 'Proceed to Checkout'. 2. Customer lands on your own checkout, and selects Bancontact. 3. After creating a Bancontact transaction using the [create Bancontact transaction](https://developers.cm.com/payments-platform/docs/create-transaction-4) endpoint, there are several options for the customer to continue with the payment flow: 1. You can present the created QR code, allowing the customer to scan it and continue with the payment. This option is also known as Bancontact Mobile. 2. You can share the retrieved intent URL, allowing the customer to open it and continue with the payment on the mobile app. This option is also known as Bancontact Mobile. 3. You can present a page on your own checkout where the customer can enter card details for the payment. These card details must be client-side encrypted before submitting them. Once submitted, you use them to start the transaction with the [start Bancontact transaction](https://developers.cm.com/payments-platform/docs/start-transaction) endpoint. When a successful response is received you redirect the customer to the provided URL. This option is also known as Bancontact Card. 4. The customer completes the payment process, you receive a webhook (if you configured it for your Bancontact transaction), and the customer is redirected to the Return URL(s) you specified on your Bancontact transaction. 5. You make a request to the [get Bancontact transaction](https://developers.cm.com/payments-platform/docs/get-transaction-4) endpoint, and use its latest details to update your system. > 📘 > > When using webhooks, be aware that they are only a "best effort" mechanism. Find more details [here](https://developers.cm.com/payments-platform/docs/webhooks-1) > . > > > ------------------------------------------------------------------------------------------------------------------------------------------------------------------------- Updated 6 months ago * * * [](https://www.cm.com/) * [Privacy Policy](https://www.cm.com/app/legal/cm-com/privacy-policy/) * [Terms and Conditions](https://www.cm.com/app/legal/cm-com/terms-and-conditions/) * [Cookie Policy](https://www.cm.com/about-cm/cookie-policy/) Jump to Product page Conversational AI Cloud Mobile Service Cloud Mobile Marketing Cloud Messaging Ticketing Payments Platform Voice Sign --- # iDEAL QR ![](https://files.readme.io/55b8d23-ideal-qr-logo_2023-10-06-112526_ipav.webp) Integrate your own checkout with our API and create iDEAL QR codes that can be used by your customers to make payments. How does it work? [](https://developers.cm.com/payments-platform/docs/ideal-qr#how-does-it-work) ==================================================================================================== Create a QR code on your checkout page [](https://developers.cm.com/payments-platform/docs/ideal-qr#create-a-qr-code-on-your-checkout-page) ----------------------------------------------------------------------------------------------------------------------------------------------- 1. Customer opens your webshop, adds some items to the shopping basket, and clicks on 'Proceed to Checkout'. 2. Customer lands on your own checkout, and selects iDEAL QR. 3. After creating an iDEAL QR transaction using the [create iDEAL QR transaction](https://developers.cm.com/payments-platform/docs/create-transaction-2) endpoint (specifying the QR code as not reusable, so it can only be use to pay once), you present the created QR code to the customer. 4. The customer scans the QR code and completes the payment process. You will receive a webhook (if you configured it for your iDEAL QR transaction), and the customer is redirected to the Return URL(s) you specified on your iDEAL QR transaction. 5. You make a request to the [get iDEAL QR transaction](https://developers.cm.com/payments-platform/docs/get-transaction-2) endpoint, and use its latest details to update your system. > 📘 > > When using webhooks, be aware that they are only a "best effort" mechanism. Find more details [here](https://developers.cm.com/payments-platform/docs/webhooks-1) > . > > > ------------------------------------------------------------------------------------------------------------------------------------------------------------------------- Create multiple QR codes in bulk [](https://developers.cm.com/payments-platform/docs/ideal-qr#create-multiple-qr-codes-in-bulk) ----------------------------------------------------------------------------------------------------------------------------------- If you need to create several QR codes you can either make several requests to the [create iDEAL QR transaction](https://developers.cm.com/payments-platform/docs/create-transaction-2) endpoint, or you can make 1 request to the [create transactions in bulk](https://developers.cm.com/payments-platform/docs/create-transactions-in-bulk) endpoint. These are just 2 different ways of creating several QR codes. Create a QR code that can be used to make multiple payments [](https://developers.cm.com/payments-platform/docs/ideal-qr#create-a-qr-code-that-can-be-used-to-make-multiple-payments) ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- No matter how you create a QR code (1 per request or several QR codes in bulk) you can specify it to be reusable, so that you can share it with your customers who can scan it and make multiple payments with it until it expires. Updated about 1 year ago * * * [](https://www.cm.com/) * [Privacy Policy](https://www.cm.com/app/legal/cm-com/privacy-policy/) * [Terms and Conditions](https://www.cm.com/app/legal/cm-com/terms-and-conditions/) * [Cookie Policy](https://www.cm.com/about-cm/cookie-policy/) Jump to Product page Conversational AI Cloud Mobile Service Cloud Mobile Marketing Cloud Messaging Ticketing Payments Platform Voice Sign --- # PS 24.10 [Back to All](https://developers.cm.com/payments-platform/changelog) Feature changes * Giropay/Evopayments payment method is deprecated. * Kosovo is now accepted as country for card payments. [](https://www.cm.com/) * [Privacy Policy](https://www.cm.com/app/legal/cm-com/privacy-policy/) * [Terms and Conditions](https://www.cm.com/app/legal/cm-com/terms-and-conditions/) * [Cookie Policy](https://www.cm.com/about-cm/cookie-policy/) Jump to Product page Conversational AI Cloud Mobile Service Cloud Mobile Marketing Cloud Messaging Ticketing Payments Platform Voice Sign --- # Status Transitions Bancontact transaction statuses [](https://developers.cm.com/payments-platform/docs/introduction-4#bancontact-transaction-statuses) --------------------------------------------------------------------------------------------------------------------------------------- `OPEN` - Bancontact transaction has been created. This is the initial status. `SUCCESS` - Bancontact transaction has been successfully paid. `CANCELLED` - Bancontact transaction has not succeeded; cancelled by the consumer. `EXPIRED` - Bancontact transaction has not succeeded; expired. `FAILURE` - Bancontact transaction has not succeeded; unknown reason. Status Transitions [](https://developers.cm.com/payments-platform/docs/introduction-4#status-transitions) ------------------------------------------------------------------------------------------------------------- The diagram below shows all state transitions a Bancontact transaction could go through. ![](https://files.readme.io/b675b73-State_-_Bancontact_Statuses.png) Once a Bancontact transaction has been created the status will be `OPEN`. While the state of a Bancontact transaction is `OPEN` a consumer can try to start a payment with it (via the presented QR code, intent URL or by filling and submitting the card details). Once a payment process is complete and the payment is successful, the transaction status will transition to `SUCCESS`. This is the happy-flow. At this point the consumer has paid and the funds will eventually make its way to your accounts. Of course there are other possibilities as you will have seen in the state diagram. It could transition to `CANCELLED` if the consumer did not complete the payment and instead clicked on the cancel button. It could transition to `EXPIRED` if the `expiresAt` timestamp has been reached and the transaction is still `OPEN`. It could transition to `FAILURE` if the payment failed. Updated about 1 year ago * * * [](https://www.cm.com/) * [Privacy Policy](https://www.cm.com/app/legal/cm-com/privacy-policy/) * [Terms and Conditions](https://www.cm.com/app/legal/cm-com/terms-and-conditions/) * [Cookie Policy](https://www.cm.com/about-cm/cookie-policy/) Jump to Product page Conversational AI Cloud Mobile Service Cloud Mobile Marketing Cloud Messaging Ticketing Payments Platform Voice Sign --- # Changelog [PG 1.27.0](https://developers.cm.com/payments-platform/v1.0.2/changelog/pg-1270) ================================================================================== 13 days ago by [\[email protected\]](https://developers.cm.com/cdn-cgi/l/email-protection) These are the changes we’ll be releasing on acceptance on 08-10-2025 [PG 1.26.2](https://developers.cm.com/payments-platform/v1.0.2/changelog/pg-1262) ================================================================================== 27 days ago by [\[email protected\]](https://developers.cm.com/cdn-cgi/l/email-protection) The following changes will be deployed to acceptance on 24-09-2025. [PS 25.15.0](https://developers.cm.com/payments-platform/v1.0.2/changelog/psp-ps-25-15) ======================================================================================== about 1 month ago by ReadMe API Feature Changes [PG 1.26.1](https://developers.cm.com/payments-platform/v1.0.2/changelog/pg-1261) ================================================================================== about 1 month ago by [\[email protected\]](https://developers.cm.com/cdn-cgi/l/email-protection) The following changes will be deployed to acceptance on 10-09-2025 before going to production after 2 weeks. [PS 25.12](https://developers.cm.com/payments-platform/v1.0.2/changelog/psp-ps-25-12) ====================================================================================== 4 months ago by ReadMe API Feature Changes [PS 25.06.0](https://developers.cm.com/payments-platform/v1.0.2/changelog/psp-ps-25-06) ======================================================================================== 9 months ago by ReadMe API Various bug fixes and optimizations. [PS 24.11](https://developers.cm.com/payments-platform/v1.0.2/changelog/psp-ps-24-11) ====================================================================================== 11 months ago by ReadMe API Feature changes [PS 24.10](https://developers.cm.com/payments-platform/v1.0.2/changelog/psp-ps-24-10) ====================================================================================== about 1 year ago by ReadMe API Feature changes [PS 24.09](https://developers.cm.com/payments-platform/v1.0.2/changelog/psp-ps-24-09) ====================================================================================== over 1 year ago by ReadMe API Bug Fixes improved [PS 24.08](https://developers.cm.com/payments-platform/v1.0.2/changelog/psp-ps-24-08) ====================================================================================== over 1 year ago by ReadMe API * Features * Improvided the client side encryption library to allow merchant key and/or merchant name [](https://www.cm.com/) * [Privacy Policy](https://www.cm.com/app/legal/cm-com/privacy-policy/) * [Terms and Conditions](https://www.cm.com/app/legal/cm-com/terms-and-conditions/) * [Cookie Policy](https://www.cm.com/about-cm/cookie-policy/) Jump to Product page Conversational AI Cloud Mobile Service Cloud Mobile Marketing Cloud Messaging Ticketing Payments Platform Voice Sign --- # PS 24.09 [Back to All](https://developers.cm.com/payments-platform/changelog) Bug Fixes Feature updates * For iDEAL payment method, issuer is marked as deprecated to support iDEAL2.0. * For iDEAL payments it is no longer required to provide issuer. if provided, it will be ignored. [](https://www.cm.com/) * [Privacy Policy](https://www.cm.com/app/legal/cm-com/privacy-policy/) * [Terms and Conditions](https://www.cm.com/app/legal/cm-com/terms-and-conditions/) * [Cookie Policy](https://www.cm.com/about-cm/cookie-policy/) Jump to Product page Conversational AI Cloud Mobile Service Cloud Mobile Marketing Cloud Messaging Ticketing Payments Platform Voice Sign --- # Schemas Schemas used in requests/responses of our API: consumer [](https://developers.cm.com/payments-platform/docs/schemas-3#consumer) ------------------------------------------------------------------------------------ | Parameter | Type | Description | Constraints | Required | | --- | --- | --- | --- | --- | | name | [name](https://developers.cm.com/payments-platform/docs/schemas-3#name)
Object | Customer name. | | ✅ | | address | [address](https://developers.cm.com/payments-platform/docs/schemas-3#address)
Object | Customer address. | | ✅ | | email | String | Email provided by customer. | | ✅ | | businessName | String(1...35) | Business name. | | | | phone | String | Customer phone number. | | ✅ | | gender | String(1...2000) | Gender of the customer. | The possible values are: `m`, `f` , or `null`. | | | dateOfBirth | String | Date of birth of the customer. | | | name [](https://developers.cm.com/payments-platform/docs/schemas-3#name) ---------------------------------------------------------------------------- | Parameter | Type | Description | Constraints | Required | | --- | --- | --- | --- | --- | | firstName | String(1...35) | Customer first name. | | ✅ | | lastName | String(1...35) | Customer last name. | | ✅ | | middleName | String(1...35) | Customer middle name. | | | address [](https://developers.cm.com/payments-platform/docs/schemas-3#address) ---------------------------------------------------------------------------------- | Parameter | Type | Description | Constraints | Required | | --- | --- | --- | --- | --- | | street | String(1...100) | Street. | | | | houseNumber | String(1...35) | House and number. | | | | postalCode | String(1...35) | Postal code. | | | | city | String(1...35) | City. | | | | countryCode | String | Country code. | ISO 3166-1 country code. | ✅ | | state | String(1...40) | State. | | | | additionalData | String(1...35) | Additional address information. | | | cardDetails [](https://developers.cm.com/payments-platform/docs/schemas-3#carddetails) ------------------------------------------------------------------------------------------ | Parameter | Type | Description | Constraints | Required | | --- | --- | --- | --- | --- | | cardProvider | String | The provider for the credit-card \[amex, mastercard, visa, etc\]. | | ✅ | | browserInformation | [browserInformation](https://developers.cm.com/payments-platform/docs/schemas-3#browserInformation)
Object | Browser information details. | | ✅ | | encryptedCardDetails | [encryptedCardDetails](https://developers.cm.com/payments-platform/docs/schemas-3#encryptedCardDetails)
Object | Encrypted card details. | | ✅ | browserInformation [](https://developers.cm.com/payments-platform/docs/schemas-3#browserinformation) -------------------------------------------------------------------------------------------------------- | Parameter | Type | Description | Constraints | Required | | --- | --- | --- | --- | --- | | shopperIp | String(1...39) | IPv4 or IPv6 address for the consumer. | | ✅ | | accept | String | Content-type accepted by the client browser. | | ✅ | | userAgent | String | User-Agent of the consumer' browser. | | ✅ | encryptedCardDetails [](https://developers.cm.com/payments-platform/docs/schemas-3#encryptedcarddetails) ------------------------------------------------------------------------------------------------------------ | Parameter | Type | Description | Constraints | Required | | --- | --- | --- | --- | --- | | data | String | Client-side encrypted card details. | Find more details [here](https://developers.cm.com/payments-platform/docs/client-side-encryption-library)
. | ✅ | returnUrls [](https://developers.cm.com/payments-platform/docs/schemas-3#returnurls) ---------------------------------------------------------------------------------------- | Parameter | Type | Description | Constraints | Required | | --- | --- | --- | --- | --- | | success | String(1...2000) | Return URL to use when the transaction succeeds. | | ✅ | | cancelled | String(1...2000) | Return URL to use when the transaction is cancelled. | | ✅ | | expired | String(1...2000) | Return URL to use when the transaction is expired. | | ✅ | | failed | String(1...2000) | Return URL to use when the transaction is failed. | | ✅ | action [](https://developers.cm.com/payments-platform/docs/schemas-3#action) -------------------------------------------------------------------------------- | Parameter | Type | Description | Constraints | Required | | --- | --- | --- | --- | --- | | redirect | [redirect](https://developers.cm.com/payments-platform/docs/schemas-3#redirect)
Object | Next action to be performed by merchant (or consumer) to complete the payment. | | | redirect [](https://developers.cm.com/payments-platform/docs/schemas-3#redirect) ------------------------------------------------------------------------------------ | Parameter | Type | Description | Constraints | Required | | --- | --- | --- | --- | --- | | url | String | URL where consumer should be redirected to by the merchant to perform the payment. | | | refund [](https://developers.cm.com/payments-platform/docs/schemas-3#refund) -------------------------------------------------------------------------------- | Parameter | Type | Description | Constraints | Required | | --- | --- | --- | --- | --- | | refundedAmount | Int(0...99999999) | Amount in the smallest currency subunit, as for example eurocents, that has already been refunded. | | ✅ | | refundedPendingAmount | Int(1...99999999) | Amount in the smallest currency subunit, as for example eurocents, that has been requested to be refunded. | | ✅ | Updated about 1 year ago * * * [](https://www.cm.com/) * [Privacy Policy](https://www.cm.com/app/legal/cm-com/privacy-policy/) * [Terms and Conditions](https://www.cm.com/app/legal/cm-com/terms-and-conditions/) * [Cookie Policy](https://www.cm.com/about-cm/cookie-policy/) Jump to Product page Conversational AI Cloud Mobile Service Cloud Mobile Marketing Cloud Messaging Ticketing Payments Platform Voice Sign --- # Retrieve details about the available APIKeys ShellNodeRubyPHPPython [Log in to use your API keys](https://developers.cm.com/login?redirect_uri=/payments-platform/v1.0.2/reference/get_apikeys) Click `Try It!` to start a request and see the response here! [](https://www.cm.com/) * [Privacy Policy](https://www.cm.com/app/legal/cm-com/privacy-policy/) * [Terms and Conditions](https://www.cm.com/app/legal/cm-com/terms-and-conditions/) * [Cookie Policy](https://www.cm.com/about-cm/cookie-policy/) Jump to Product page Conversational AI Cloud Mobile Service Cloud Mobile Marketing Cloud Messaging Ticketing Payments Platform Voice Sign --- # Credit Card ![](https://files.readme.io/5fb3506-6.png) How does it work? [](https://developers.cm.com/payments-platform/docs/credit-card#how-does-it-work) ======================================================================================================= 1. Customer opens your webshop, adds some items to the shopping basket, and clicks on 'Proceed to Checkout'. 2. Customer lands on your own checkout, and selects Credit Card. 3. Customer lands on your Credit Card page, fills in the card details and clicks on submit (card details must be client-side encrypted before submitting them). 4. After creating a Credit Card transaction (using the submitted encrypted card details) with the [create Credit Card transaction](https://developers.cm.com/payments-platform/docs/create-transaction-3) endpoint, you redirect the customer to the provided URL. 5. The customer completes the payment process, you receive a webhook (if you configured it for your iDEAL transaction), and the customer is redirected to the Return URL(s) you specified on your iDEAL transaction. 6. You make a request to the [get Credit Card transaction](https://developers.cm.com/payments-platform/docs/get-transaction-3) endpoint, and use its latest details to update your system. > 📘 > > When using webhooks, be aware that they are only a "best effort" mechanism. Find more details [here](https://developers.cm.com/payments-platform/docs/webhooks-1) > . > > > ------------------------------------------------------------------------------------------------------------------------------------------------------------------------- Updated about 1 year ago * * * [](https://www.cm.com/) * [Privacy Policy](https://www.cm.com/app/legal/cm-com/privacy-policy/) * [Terms and Conditions](https://www.cm.com/app/legal/cm-com/terms-and-conditions/) * [Cookie Policy](https://www.cm.com/about-cm/cookie-policy/) Jump to Product page Conversational AI Cloud Mobile Service Cloud Mobile Marketing Cloud Messaging Ticketing Payments Platform Voice Sign --- # Diagrams Create a Bancontact transaction [](https://developers.cm.com/payments-platform/docs/status-diagrams-3#create-a-bancontact-transaction) ------------------------------------------------------------------------------------------------------------------------------------------ The CM.com Online Payments API enables you to create a Bancontact transaction. The diagram below presents the interaction that takes place between Consumer, Merchant (You) and CM.com Online Payments API when creating a Bancontact transaction: ![](https://files.readme.io/8bc705e-SQ_-_Bancontact_Transaction.svg) In the diagram above the following steps are performed: 1. A Merchant wants to enable Bancontact payments for the Consumer. In order to do this, the Merchant makes a request to create a Bancontact transaction. 2. Merchant receives a successful response. This response enables 3 possible alternatives to continue the payment flow: 1. It provides a QR code that the Merchant can present to the Consumer, who will scan the QR code and continue with the payment flow. 2. It provides an intent URL that the Merchant can share to the Consumer, who will open that URL and continue with the payment flow. 3. The Merchant presents a page where the Consumer can enter card details for the payment. The page should encrypt the provided card details before submitting them. Find more details [here](https://developers.cm.com/payments-platform/docs/client-side-encryption-library) . Once submitted, the Merchant uses the encrypted card details to make a request to start the Bancontact transaction using the API. When a successful response is received the Merchant redirects the Consumer to the provided URL. 3. Consumer pays, and eventually is redirected to the CM.com Online Payments API returnURL. 4. When the status of the Bancontact transaction is updated on the CM.com Online Payments API, the Consumer is redirected to the return URL that the Merchant specified in the original request to create the Bancontact transaction. 5. If the Merchant also specified webhooks in the original request then CM.com Online Payments API will trigger the proper webhooks and make the requests to the webhook URLs specified by the Merchant. **When using webhooks, be aware that they are only a "best effort" mechanism**. 6. Merchant gets the latest details of the transaction. This usually happens once the Merchant received a webhook request. The API endpoints involved on this flow are: * [Create Transaction](https://developers.cm.com/payments-platform/docs/create-transaction-4) * [Start Transaction](https://developers.cm.com/payments-platform/docs/start-transaction) * [Get Transaction](https://developers.cm.com/payments-platform/docs/get-transaction-4) Create a refund for the payment made with a Bancontact transaction [](https://developers.cm.com/payments-platform/docs/status-diagrams-3#create-a-refund-for-the-payment-made-with-a-bancontact-transaction) ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- The CM.com Online Payments API enables you to create a refund for the payment made with a Bancontact transaction. The diagram below presents the interaction that takes place between Merchant (You) and CM.com Online Payments API when requesting a refund for the payment made with a Bancontact transaction: ![](https://files.readme.io/0f65e65-SQ_-_Bancontact_Refund.svg) The API endpoints involved on this flow are: * [Create a Refund](https://developers.cm.com/payments-platform/docs/create-a-refund-4) Updated about 1 year ago * * * [](https://www.cm.com/) * [Privacy Policy](https://www.cm.com/app/legal/cm-com/privacy-policy/) * [Terms and Conditions](https://www.cm.com/app/legal/cm-com/terms-and-conditions/) * [Cookie Policy](https://www.cm.com/about-cm/cookie-policy/) Jump to Product page Conversational AI Cloud Mobile Service Cloud Mobile Marketing Cloud Messaging Ticketing Payments Platform Voice Sign --- # Create Transaction You can use this call to create a new Bancontact transaction. Prerequisite [](https://developers.cm.com/payments-platform/docs/create-transaction-4#prerequisite) ------------------------------------------------------------------------------------------------------- Get an `access_token` and use it as 'Bearer' token in your request. Find more details [here](https://developers.cm.com/payments-platform/docs/authorization-3) . Request [](https://developers.cm.com/payments-platform/docs/create-transaction-4#request) --------------------------------------------------------------------------------------------- Text `POST https://api.pay.cm.com/api/v1/paymentmethods/bancontact/v1/transactions` ### Request body examples [](https://developers.cm.com/payments-platform/docs/create-transaction-4#request-body-examples) These are only some examples of the request body to create a transaction: Full Request with ReturnURLsFull Request with ReturnURLMinimal Request with ReturnURL `{ "reference": "98494949", "description": "Order at yourdomain.tld", "amount": 1200, "currency": "EUR", "expiresAt": "2024-06-14T15:04:05Z", "language": "en", "consumer": { "name": { "firstName": "John", "lastName": "Lopez", "middleName": "A" }, "address": { "street": "Rustenburgerlaan", "houseNumber": "25", "postalCode": "2012AL", "city": "Haarlem", "countryCode": "BE", "state": "Noord-Holland", "additionalData": "Right-hand portal" }, "email": "[[email protected]](https://developers.cm.com/cdn-cgi/l/email-protection) ", "businessName": "CM", "phone": "06-95613259", "gender": null, "dateOfBirth": "1996-12-01" }, "webhooks": [ { "url": "https://yourdomain.tld/order-webhooks?purchaseId=order123", "events": [ "FINALSTATUS" ] }, { "url": "https://yourdomain.tld/payment-webhooks?purchaseId=order123", "events": [ "REFUND_STATUS" ] }, { "url": "https://yourdomain.tld/payment-webhooks?purchaseId=order123", "events": [ "STATUS_CHANGE" ] } ], "returnUrls": { "success": "https://yourdomain.tld/order/payment-success.html", "cancelled": "https://yourdomain.tld/order/payment-cancelled.html", "expired": "https://yourdomain.tld/order/payment-expired.html", "failed": "https://yourdomain.tld/order/payment-failed.html" } }` `{ "reference": "98494949", "description": "Order at yourdomain.tld", "amount": 1200, "currency": "EUR", "expiresAt": "2024-06-14T15:04:05Z", "language": "en", "consumer": { "name": { "firstName": "John", "lastName": "Lopez", "middleName": "A" }, "address": { "street": "Rustenburgerlaan", "houseNumber": "25", "postalCode": "2012AL", "city": "Haarlem", "countryCode": "BE", "state": "Noord-Holland", "additionalData": "Right-hand portal" }, "email": "[[email protected]](https://developers.cm.com/cdn-cgi/l/email-protection) ", "businessName": "CM", "phone": "06-95613259", "gender": null, "dateOfBirth": "1996-12-01" }, "webhooks": [ { "url": "https://yourdomain.tld/order-webhooks?purchaseId=order123", "events": [ "FINALSTATUS" ] }, { "url": "https://yourdomain.tld/payment-webhooks?purchaseId=order123", "events": [ "REFUND_STATUS" ] }, { "url": "https://yourdomain.tld/payment-webhooks?purchaseId=order123", "events": [ "STATUS_CHANGE" ] } ], "returnUrl": "https://yourdomain.tld/order/payment-completed.html" }` `{ "reference": "98494949", "description": "Order at yourdomain.tld", "amount": 1200, "expiresAt": "2024-06-14T15:04:05Z", "language": "en", "returnUrl": "https://yourdomain.tld/order/payment-completed.html" }` "**Full Request with ReturnURLs**" and "**Full Request with ReturnURL**" are examples where all the request parameters are provided. If `returnUrls` is defined then customers will be redirected to a different URL depending on the status of the transaction when the payment process is completed. If `returnUrl` is defined then customers will be redirected to the same URL no matter the status of the transaction when the payment process is completed. "**Minimal Request with ReturnURLs**" is an example of the minimal request to create a transaction. This example, is using `returnUrls`, but you can replace it for `returnUrl` depending on what is better for your use case. Parameters [](https://developers.cm.com/payments-platform/docs/create-transaction-4#parameters) --------------------------------------------------------------------------------------------------- | Parameter | Type | Description | Constraints | | --- | --- | --- | --- | | reference | String(1...255) | An identifier specified by you. If webhooks were specified in the request this identifier is added to the webhook request payload. | | | amount | Int(1...99999999) | Integer representing the amount of the transaction. Denomination in the smallest currency subunit (e.g. eurocents). | | | description | String(1...255) | Description of the transaction. | | | expiresAt | String(RFC3339) | Expiration time. | ISO 8601 date and time. | | language | String(ISO 639-1) | Preferred language of the user interface. | ISO 639-1 language. | | returnUrl | String(2000) | Specifies the URL where your customers will be redirected to when the payment process is completed. | Either `returnUrl` or `returnUrls` must be specified, but not both. | | returnUrls | [returnUrls](https://developers.cm.com/payments-platform/docs/schemas-4#returnurls)
Object | Specifies a URL where your customers will be redirected to (per transaction status) when the payment process is completed. For example, your customers will be redirected to `returnUrls.success` when the status of the transaction changes to `SUCCESS`. | Either `returnUrl` or `returnUrls` must be specified, but not both. | Optional parameters [](https://developers.cm.com/payments-platform/docs/create-transaction-4#optional-parameters) --------------------------------------------------------------------------------------------------------------------- | Parameter | Type | Description | Constraints | | --- | --- | --- | --- | | currency | String (ISO 4217) | Currency code. | ISO 4217 currency code. | | consumer | [consumer](https://developers.cm.com/payments-platform/docs/schemas-4#consumer)
Object | Customer details. | The following fields are mandatory: `name.firstName`, `name.lastName`, `address.street`, `address.houseNumber`, `address.postalCode`, `address.city`, `address.countryCode`, `email`. Besides that, Bancontact is usually enabled for `BE` as the value of the `address.countryCode`. | | webhooks | Array of objects | Webhooks enable receiving a web request once a given event occurs. | Find more details [here](https://developers.cm.com/payments-platform/docs/webhooks-1)
. | Response [](https://developers.cm.com/payments-platform/docs/create-transaction-4#response) ----------------------------------------------------------------------------------------------- JSON `{ "id": "8db1e7fa-ba8a-4189-92fd-67a20217443d", "orderId": "8db1e7fa-ba8a-4189-92fd-67a20217443d", "reference": "20210623130413", "amount": 1200, "currency": "EUR", "description": "Order at yourdomain.tld", "expiresAt": "2006-01-02T15:04:05Z", "language": "nl", "country": "BE", "webhooks": [ { "url": "https://yourdomain.tld/order-webhooks?purchaseId=order123", "events": [ "FINALSTATUS" ] }, { "url": "https://yourdomain.tld/payment-webhooks?purchaseId=order123", "events": [ "REFUND_STATUS" ] }, { "url": "https://yourdomain.tld/payment-webhooks?purchaseId=order123", "events": [ "STATUS_CHANGE" ] } ], "status": "OPEN", "action": { "qrcode": { "url": "https://qrbackend.tld/images/213981209381209390821.png" }, "intent": { "url": "https://docdata.tld/pay?order=123" }, "redirect": { "url": "https://checkout.tld/3ds/bancontact/v1/123" } }, "createdAt": "2006-01-02T15:04:05Z", "refunds": { "refundedAmount": 300, "refundedPendingAmount": 100 }, "returnUrls": { "success": "https://yourdomain.tld/order/payment-success.html", "cancelled": "https://yourdomain.tld/order/payment-cancelled.html", "expired": "https://yourdomain.tld/order/payment-expired.html", "failed": "https://yourdomain.tld/order/payment-failed.html" } }` Parameters [](https://developers.cm.com/payments-platform/docs/create-transaction-4#parameters-1) ----------------------------------------------------------------------------------------------------- | Parameter | Type | Description | Constraints | | --- | --- | --- | --- | | id | String(36) | Transaction unique identifier. | | | orderId | String(36) | Unique identifier. | | | reference | String(1...255) | An identifier specified by you. If webhooks were specified in the request this identifier is added to the webhook request payload. | Specified in the request. | | amount | Int(1...99999999) | Integer representing the amount of the checkout. Denomination in the smallest currency subunit (e.g. eurocents). | Specified in the request. | | currency | String (ISO 4217) | Currency code. | Specified in the request. | | description | String(1...255) | Description of the transaction. | Specified in the request. | | expiresAt | String(RFC3339) | Expiration time. | Specified in the request. | | language | String(ISO 639-1) | Preferred language of the user interface. | Specified in the request. | | country | String | Country of the Customer. | | | status | String | `OPEN` - Transaction has been created. This is the initial status.
`SUCCESS` - Transaction successfully paid.
`CANCELLED` - Transaction has been cancelled by your customers.
`EXPIRED` - Transaction has not succeeded; expired.
`FAILURE` - Transaction has not succeeded; unknown reason. | | | action | [action](https://developers.cm.com/payments-platform/docs/schemas-4#action)
Object | The next action to be performed by you for this transaction. This includes the `qrcode` action (which includes the URL of the Bancontact QR code image to be shown to your customer), and the `intent` action (which includes the intent URL to be shared with your customer). | This parameter is nullable, and it is only available while the transaction is `OPEN`. | | createdAt | String(RFC3339) | Creation time. | ISO 8601 date and time. | | returnUrl | String(2000) | Specifies the URL where your customers will be redirected to when the payment process is completed. | Specified in the request. | | returnUrls | Object | Specifies a URL where your customers will be redirected to (per transaction status) when the payment process is completed. For example, your customers will be redirected to `returnUrls.success` when the status of the transaction changes to `SUCCESS`. | Specified in the request. | Optional parameters [](https://developers.cm.com/payments-platform/docs/create-transaction-4#optional-parameters-1) ----------------------------------------------------------------------------------------------------------------------- | Parameter | | Description | Constraints | | --- | --- | --- | --- | | webhooks | Array of objects | Webhooks enable receiving a web request once a given event occurs. | Specified in the request. | | refunds | [refund](https://developers.cm.com/payments-platform/docs/schemas-4#refund)
Object | Indicates refundedAmount and refundedPendingAmount. | | Response codes [](https://developers.cm.com/payments-platform/docs/create-transaction-4#response-codes) ----------------------------------------------------------------------------------------------------------- | HTTP status | Description | | --- | --- | | 201 | Successful transaction. | | 4XX | Client error response (See message for details). This response is given when the user input was incorrect or something illegal was attempted (eg. using a service without having that service configured for the user, or not being authorized). | | 5XX | Server error response (See message for details). | Updated about 1 year ago * * * [](https://www.cm.com/) * [Privacy Policy](https://www.cm.com/app/legal/cm-com/privacy-policy/) * [Terms and Conditions](https://www.cm.com/app/legal/cm-com/terms-and-conditions/) * [Cookie Policy](https://www.cm.com/about-cm/cookie-policy/) Jump to Product page Conversational AI Cloud Mobile Service Cloud Mobile Marketing Cloud Messaging Ticketing Payments Platform Voice Sign --- # Start Transaction You can use this call to start an existing Bancontact transaction using the CM.com Online Payments API. Prerequisite [](https://developers.cm.com/payments-platform/docs/start-transaction#prerequisite) ---------------------------------------------------------------------------------------------------- Get an `access_token` and use it as 'Bearer' token in your request. Find more details [here](https://developers.cm.com/payments-platform/docs/authorization-3) . Request [](https://developers.cm.com/payments-platform/docs/start-transaction#request) ------------------------------------------------------------------------------------------ Text `POST https://api.pay.cm.com/api/v1/paymentmethods/bancontact/v1/transactions/{transactionId}/start` Full Request `{ "browserInformation": { "shopperIp": "0.0.0.0", "accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8", "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.102 Safari/537.36 Edge/18.18363" }, "encryptedCardDetails": { "data": "string" } }` Parameters [](https://developers.cm.com/payments-platform/docs/start-transaction#parameters) ------------------------------------------------------------------------------------------------ | Parameter | Type | Description | Constraints | | --- | --- | --- | --- | | browserInformation | [browserInformation](https://developers.cm.com/payments-platform/docs/schemas-4#browserInformation)
Object | Browser information details. | | | encryptedCardDetails | [encryptedCardDetails](https://developers.cm.com/payments-platform/docs/schemas-4#encryptedCardDetails)
Object | Encrypted card details. | | Response [](https://developers.cm.com/payments-platform/docs/start-transaction#response) -------------------------------------------------------------------------------------------- JSON `{ "id": "8db1e7fa-ba8a-4189-92fd-67a20217443d", "action": { "redirect": { "url": "https://issuer.tld/ideal/start?trxid=213981209381209390821&random=wreq0dq90vgq0ew923123" } } }` Parameters [](https://developers.cm.com/payments-platform/docs/start-transaction#parameters-1) -------------------------------------------------------------------------------------------------- | Parameter | Type | Description | Constraints | | --- | --- | --- | --- | | id | String(36) | Unique identifier. | | | action | [action(redirect)](https://developers.cm.com/payments-platform/docs/schemas-4#action(redirect))
Object | The next action to be performed by you for this transaction. This includes a URL where you should `redirect` your customer to perform the payment. | | Response codes [](https://developers.cm.com/payments-platform/docs/start-transaction#response-codes) -------------------------------------------------------------------------------------------------------- | HTTP status | Description | | --- | --- | | 201 | Transaction was started. | | 4XX | Client error response (See message for details). This response is given when the User input was incorrect or something illegal was attempted (eg. using a service without having that service configured for the user, or not being authorized). | | 5XX | Server error response (See message for details). | Updated about 1 year ago * * * [](https://www.cm.com/) * [Privacy Policy](https://www.cm.com/app/legal/cm-com/privacy-policy/) * [Terms and Conditions](https://www.cm.com/app/legal/cm-com/terms-and-conditions/) * [Cookie Policy](https://www.cm.com/about-cm/cookie-policy/) Jump to Product page Conversational AI Cloud Mobile Service Cloud Mobile Marketing Cloud Messaging Ticketing Payments Platform Voice Sign --- # Before integrating Prerequisites [](https://developers.cm.com/payments-platform/docs/introduction-5#prerequisites) --------------------------------------------------------------------------------------------------- The following prerequisites need to be fulfilled: * The Consumer needs an Apple Pay compatible device. * Apple Pay (and relevant credit and debit card payment methods) needs to be enabled on your account. * Besides implementing the requests to [initialize Apple Pay transaction](https://developers.cm.com/payments-platform/docs/initialize-transaction) , [start Apple Pay transaction](https://developers.cm.com/payments-platform/docs/start-transaction-1) and [authorize Apple Pay transaction](https://developers.cm.com/payments-platform/docs/authorize-transaction) on the CM.com Online Payments API, Apple Pay JS API has to be used. Merchant Enrollment [](https://developers.cm.com/payments-platform/docs/introduction-5#merchant-enrollment) --------------------------------------------------------------------------------------------------------------- Apple Pay can only be used on your own page after you have been enrolled as merchant at Apple. Part of the enrollment is the verification of your domain by Apple. CM.com handles setting up the required IDs and certificates. Contact us for details on the enrollment as Apple Pay Merchant. Apple Pay button styling [](https://developers.cm.com/payments-platform/docs/introduction-5#apple-pay-button-styling) ------------------------------------------------------------------------------------------------------------------------- Apple has described how to [display the Apple Pay Button](https://developer.apple.com/documentation/apple_pay_on_the_web/displaying_apple_pay_buttons_using_css) using CSS templates in Safari. Apple has strict requirements on the look, size and placement on the Apple Pay button. See the [Human Interface Guidelines > Apple Pay](https://developer.apple.com/design/human-interface-guidelines/apple-pay) for more details. Updated about 1 year ago * * * [](https://www.cm.com/) * [Privacy Policy](https://www.cm.com/app/legal/cm-com/privacy-policy/) * [Terms and Conditions](https://www.cm.com/app/legal/cm-com/terms-and-conditions/) * [Cookie Policy](https://www.cm.com/about-cm/cookie-policy/) Jump to Product page Conversational AI Cloud Mobile Service Cloud Mobile Marketing Cloud Messaging Ticketing Payments Platform Voice Sign --- # Get Transaction You can use this call to retrieve details of a Bancontact transaction. Prerequisite [](https://developers.cm.com/payments-platform/docs/get-transaction-4#prerequisite) ---------------------------------------------------------------------------------------------------- Get an `access_token` and use it as 'Bearer' token in your request. Find more details [here](https://developers.cm.com/payments-platform/docs/authorization-3) . Request [](https://developers.cm.com/payments-platform/docs/get-transaction-4#request) ------------------------------------------------------------------------------------------ Text `GET https://api.pay.cm.com/api/v1/paymentmethods/bancontact/v1/transactions/{transactionId}` Response [](https://developers.cm.com/payments-platform/docs/get-transaction-4#response) -------------------------------------------------------------------------------------------- JSON `{ "id": "8db1e7fa-ba8a-4189-92fd-67a20217443d", "orderId": "8db1e7fa-ba8a-4189-92fd-67a20217443d", "reference": "20210623130413", "amount": 1200, "currency": "EUR", "description": "Order at yourdomain.tld", "expiresAt": "2006-01-02T15:04:05Z", "language": "nl", "country": "BE", "webhooks": [ { "url": "https://yourdomain.tld/order-webhooks?purchaseId=order123", "events": [ "FINALSTATUS" ] }, { "url": "https://yourdomain.tld/payment-webhooks?purchaseId=order123", "events": [ "REFUND_STATUS" ] }, { "url": "https://yourdomain.tld/payment-webhooks?purchaseId=order123", "events": [ "STATUS_CHANGE" ] } ], "status": "OPEN", "action": { "qrcode": { "url": "https://qrbackend.tld/images/213981209381209390821.png" }, "intent": { "url": "https://docdata.tld/pay?order=123" }, "redirect": { "url": "https://checkout.tld/3ds/bancontact/v1/123" } }, "createdAt": "2006-01-02T15:04:05Z", "refunds": { "refundedAmount": 300, "refundedPendingAmount": 100 }, "returnUrls": { "success": "https://yourdomain.tld/order/payment-success.html", "cancelled": "https://yourdomain.tld/order/payment-cancelled.html", "expired": "https://yourdomain.tld/order/payment-expired.html", "failed": "https://yourdomain.tld/order/payment-failed.html" } }` Parameters [](https://developers.cm.com/payments-platform/docs/get-transaction-4#parameters) ------------------------------------------------------------------------------------------------ | Parameter | Type | Description | Constraints | | --- | --- | --- | --- | | id | String(36) | Transaction unique identifier. | | | orderId | String(36) | Unique identifier. | | | reference | String(1...255) | An identifier specified by you. If webhooks were specified in the request this identifier is added to the webhook request payload. | | | amount | Int(1...99999999) | Integer representing the amount of the checkout. Denomination in the smallest currency subunit (e.g. eurocents). | | | currency | String (ISO 4217) | Currency code. | ISO 4217 currency code. | | description | String(1...255) | Description of the transaction. | | | expiresAt | String(RFC3339) | Expiration time. | | | language | String(ISO 639-1) | Preferred language of the user interface. | | | country | String | Country of the Customer. | ISO 3166 Country Code. | | status | String | `OPEN` - Transaction has been created. This is the initial status.
`SUCCESS` - Transaction successfully paid.
`CANCELLED` - Transaction has been cancelled by your customers.
`EXPIRED` - Transaction has not succeeded; expired.
`FAILURE` - Transaction has not succeeded; unknown reason. | | | action | [action](https://developers.cm.com/payments-platform/docs/schemas-4#action)
Object | The next action to be performed by you for this transaction. If a transaction has been created (so not yet started) then `qrcode` action (which includes the URL of the Bancontact QR code image to be shown to your customer), and `intent` action (which includes the intent URL to be shared with your customer) will appear as possible actions. If the transaction has been successfully started using `/paymentmethods/bancontact/v1/transactions/{transactionId}/start` then only `redirect` action will appear. | This parameter is nullable, and it is only available while the transaction is `OPEN`. | | createdAt | String(RFC3339) | Creation time. | ISO 8601 date and time. | | returnUrl | String(2000) | Specifies the URL where your customers will be redirected to. | Either `returnUrl` or `returnUrls` must be specified, but not both. | | returnUrls | [returnUrls](https://developers.cm.com/payments-platform/docs/schemas-4#returnurls)
Object | Specifies a URL where your customers will be redirected to per transaction status. For example, your customers will be redirected to `returnUrls.success` when the status of the transaction changes to `SUCCESS`. | Either `returnUrl` or `returnUrls` must be specified, but not both. | Optional parameters [](https://developers.cm.com/payments-platform/docs/get-transaction-4#optional-parameters) ------------------------------------------------------------------------------------------------------------------ | Parameter | Type | Description | Constraints | | --- | --- | --- | --- | | webhooks | Array of objects | Webhooks enable receiving a web request once a given event occurs. | Find more details [here](https://developers.cm.com/payments-platform/docs/webhooks-1)
. | | refunds | [refund](https://developers.cm.com/payments-platform/docs/schemas-4#refund)
Object | Indicates refundedAmount and refundedPendingAmount. | | Response codes [](https://developers.cm.com/payments-platform/docs/get-transaction-4#response-codes) -------------------------------------------------------------------------------------------------------- | HTTP status | Description | | --- | --- | | 200 | Transaction details are successfully retrieved. | | 4XX | Client error response (See message for details). This response is given when the User input was incorrect or something illegal was attempted (eg. using a service without having that service configured for the user, or not being authorized). | | 5XX | Server error response (See message for details). | Updated about 1 year ago * * * [](https://www.cm.com/) * [Privacy Policy](https://www.cm.com/app/legal/cm-com/privacy-policy/) * [Terms and Conditions](https://www.cm.com/app/legal/cm-com/terms-and-conditions/) * [Cookie Policy](https://www.cm.com/about-cm/cookie-policy/) Jump to Product page Conversational AI Cloud Mobile Service Cloud Mobile Marketing Cloud Messaging Ticketing Payments Platform Voice Sign --- # Status Transitions Apple Pay transaction statuses [](https://developers.cm.com/payments-platform/docs/status-transitions-copy#apple-pay-transaction-statuses) ---------------------------------------------------------------------------------------------------------------------------------------------- `OPEN` - transaction has been created. This is the initial status. `AUTHORIZED` - transaction payment is authorized. `SUCCESS` - transaction has been successfully paid. `CANCELLED` - transaction has not succeeded; cancelled by the consumer. `EXPIRED` - transaction has not succeeded; expired. `FAILURE` - transaction has not succeeded; unknown reason. Status Transitions [](https://developers.cm.com/payments-platform/docs/status-transitions-copy#status-transitions) ---------------------------------------------------------------------------------------------------------------------- The diagram below shows all state transitions a transaction could go through. ![](https://files.readme.io/fc9f6a8-State_-_ApplePay_Statuses.png) Once a transaction has been created the status will be `OPEN`. While the state of a transaction is `OPEN` a consumer can try to make a payment with it. Once a payment is successful, the transaction status will transition to `SUCCESS`. This is the happy-flow. At this point the consumer has paid and the funds will eventually make its way to your accounts. It can also happen that the payment of a transaction has been authorized, but not yet paid, in this case the status will be `AUTHORIZED`. Eventually it can transitions to `SUCCESS`. Of course there are other possibilities as you will have seen in the state diagram. It could transition to `CANCELLED` if the consumer did not complete the payment and instead clicked on the cancel button. It could transition to `EXPIRED` if the `expiresAt` timestamp has been reached and the transaction is still `OPEN`. It could transition to `FAILURE` if the payment failed. Updated about 1 year ago * * * [](https://www.cm.com/) * [Privacy Policy](https://www.cm.com/app/legal/cm-com/privacy-policy/) * [Terms and Conditions](https://www.cm.com/app/legal/cm-com/terms-and-conditions/) * [Cookie Policy](https://www.cm.com/about-cm/cookie-policy/) Jump to Product page Conversational AI Cloud Mobile Service Cloud Mobile Marketing Cloud Messaging Ticketing Payments Platform Voice Sign --- # Apple Pay ![](https://files.readme.io/bea2dd1-apple-pay.png) Integrate your own checkout with our API and allow your customers to make payments with Apple Pay (when using an Apple device). How does it work? [](https://developers.cm.com/payments-platform/docs/applepay-1#how-does-it-work) ====================================================================================================== You make the following steps possible by using [Apple Pay JS API](https://developer.apple.com/documentation/apple_pay_on_the_web/apple_pay_js_api) together with our CM.com Online Payments API: 1. Customer opens your webshop, adds some items to the shopping basket, and clicks on 'Proceed to Checkout'. 2. After initializing an Apple Pay transaction with the [initialize Apple Pay transaction](https://developers.cm.com/payments-platform/docs/initialize-transaction) endpoint, you can use the retrieved `details` to render an Apple Pay button (after checking that Apple Pay is available for the device of the customer) on your checkout page. 3. The customer clicks on the Apple Pay button, making you to create and begin an Apple Pay session, triggering the display of a payment sheet in the device of the customer. You will have to handle the merchant validation event for the Apple Pay session where you can make a request to the [start Apple Pay transaction](https://developers.cm.com/payments-platform/docs/start-transaction-1) endpoint of our API. After that Apple will require the customer to authenticate, and when a customer authenticates with Touch ID, Face ID, or passcode Apple will initiate the authorization of the payment, so you will have to handle the payment authorized event for the Apple Pay session where you can make a request to the [authorize Apple Pay transaction](https://developers.cm.com/payments-platform/docs/authorize-transaction) endpoint of our API. After the Payment is authorized the response must be used to complete the payment on the Apple Pay session. This will show the result of the authorization on the payment sheet, and close the payment sheet within 2 minutes automatically in the customer device. Besides, If the authorization was successful the response will also contain a `redirect.url` where your customer should be redirected to, making the customer to land on a CM.com Online Payments API url. 4. When the status of the transaction is updated in the CM.com Online Payments API, you will receive a webhook (if you configured it for your Apple Pay transaction), and the customer will be redirected to the Return URL(s) you specified when you initialized your Apple Pay transaction. 5. You make a request to the [get Apple Pay transaction](https://developers.cm.com/payments-platform/docs/get-transaction-5) endpoint, and use its latest details to update your system. > 📘 > > When using webhooks, be aware that they are only a "best effort" mechanism. Find more details [here](https://developers.cm.com/payments-platform/docs/webhooks-1) > . > > > ------------------------------------------------------------------------------------------------------------------------------------------------------------------------- Updated about 1 year ago * * * [](https://www.cm.com/) * [Privacy Policy](https://www.cm.com/app/legal/cm-com/privacy-policy/) * [Terms and Conditions](https://www.cm.com/app/legal/cm-com/terms-and-conditions/) * [Cookie Policy](https://www.cm.com/about-cm/cookie-policy/) Jump to Product page Conversational AI Cloud Mobile Service Cloud Mobile Marketing Cloud Messaging Ticketing Payments Platform Voice Sign --- # Schemas returnUrls [](https://developers.cm.com/payments-platform/docs/schemas-4#returnurls) ---------------------------------------------------------------------------------------- | Parameter | Type | Description | Constraints | Required | | --- | --- | --- | --- | --- | | success | String(1...2000) | Return URL to use when the transaction succeeds. | | ✅ | | cancelled | String(1...2000) | Return URL to use when the transaction is cancelled. | | ✅ | | expired | String(1...2000) | Return URL to use when the transaction is expired. | | ✅ | | failed | String(1...2000) | Return URL to use when the transaction is failed. | | ✅ | consumer [](https://developers.cm.com/payments-platform/docs/schemas-4#consumer) ------------------------------------------------------------------------------------ | Parameter | Type | Description | Constraints | Required | | --- | --- | --- | --- | --- | | name | [name](https://developers.cm.com/payments-platform/docs/schemas-4#name)
Object | Customer name. | | | | address | [address](https://developers.cm.com/payments-platform/docs/schemas-4#address)
Object | Customer address. | | ✅ | | email | String | Email provided by customer. | | ✅ | | businessName | String(1...35) | Business name. | | | | phone | String | Customer phone number. | | | | gender | String(1...2000) | Gender of the customer. | The possible values are: `m`, `f` , or `null`. | | | dateOfBirth | String | Date of birth of the customer. | | | name [](https://developers.cm.com/payments-platform/docs/schemas-4#name) ---------------------------------------------------------------------------- | Parameter | Type | Description | Constraints | Required | | --- | --- | --- | --- | --- | | firstName | String(1...35) | Customer first name. | | ✅ | | lastName | String(1...35) | Customer last name. | | ✅ | | middleName | String(1...35) | Customer middle name. | | | address [](https://developers.cm.com/payments-platform/docs/schemas-4#address) ---------------------------------------------------------------------------------- | Parameter | Type | Description | Constraints | Required | | --- | --- | --- | --- | --- | | street | String(1...100) | Street. | | | | houseNumber | String(1...35) | House and number. | | | | postalCode | String(1...35) | Postal code. | | | | city | String(1...35) | City. | | | | countryCode | String | Country code. | ISO 3166-1 country code. | ✅ | | state | String(1...40) | State. | | | | additionalData | String(1...35) | Additional address information. | | | action [](https://developers.cm.com/payments-platform/docs/schemas-4#action) -------------------------------------------------------------------------------- | Parameter | Type | Description | Constraints | Required | | --- | --- | --- | --- | --- | | qrcode | [qrcode](https://developers.cm.com/payments-platform/docs/schemas-4#qrcode)
Object | Next action to be performed by merchant (or consumer) to complete the payment. | | | | intent | [intent](https://developers.cm.com/payments-platform/docs/schemas-4#intent)
Object | Next action to be performed by merchant (or consumer) to complete the payment. | | | qrcode [](https://developers.cm.com/payments-platform/docs/schemas-4#qrcode) -------------------------------------------------------------------------------- | Parameter | Type | Description | Constraints | Required | | --- | --- | --- | --- | --- | | url | String | URL of the Bancontact QR code image to be shown to your customer. | | | intent [](https://developers.cm.com/payments-platform/docs/schemas-4#intent) -------------------------------------------------------------------------------- | Parameter | Type | Description | Constraints | Required | | --- | --- | --- | --- | --- | | url | String | intent URL to be shared with customer. | | | refund [](https://developers.cm.com/payments-platform/docs/schemas-4#refund) -------------------------------------------------------------------------------- | Parameter | Type | Description | Constraints | Required | | --- | --- | --- | --- | --- | | refundedAmount | Int(0...99999999) | Amount in the smallest currency subunit, as for example eurocents, that has already been refunded. | | ✅ | | refundedPendingAmount | Int(1...99999999) | Amount in the smallest currency subunit, as for example eurocents, that has been requested to be refunded. | | ✅ | browserInformation [](https://developers.cm.com/payments-platform/docs/schemas-4#browserinformation) -------------------------------------------------------------------------------------------------------- | Parameter | Type | Description | Constraints | Required | | --- | --- | --- | --- | --- | | shopperIp | String(1...39) | IPv4 or IPv6 address for the consumer. | | ✅ | | accept | String | Content-type accepted by the client browser. | | ✅ | | userAgent | String | User-Agent of the consumer' browser. | | ✅ | encryptedCardDetails [](https://developers.cm.com/payments-platform/docs/schemas-4#encryptedcarddetails) ------------------------------------------------------------------------------------------------------------ | Parameter | Type | Description | Constraints | Required | | --- | --- | --- | --- | --- | | data | String | Client-side encrypted card details. | Find more details [here](https://developers.cm.com/payments-platform/docs/client-side-encryption-library)
. | ✅ | action(redirect) [](https://developers.cm.com/payments-platform/docs/schemas-4#actionredirect) -------------------------------------------------------------------------------------------------- | Parameter | Type | Description | Constraints | Required | | --- | --- | --- | --- | --- | | redirect | [redirect](https://developers.cm.com/payments-platform/docs/schemas-4#redirect)
Object | Next action to be performed by merchant (or consumer) to complete the payment. | | | redirect [](https://developers.cm.com/payments-platform/docs/schemas-4#redirect) ------------------------------------------------------------------------------------ | Parameter | Type | Description | Constraints | Required | | --- | --- | --- | --- | --- | | url | String | URL where consumer should be redirected to by the merchant to perform the payment. | | | Updated about 1 year ago * * * [](https://www.cm.com/) * [Privacy Policy](https://www.cm.com/app/legal/cm-com/privacy-policy/) * [Terms and Conditions](https://www.cm.com/app/legal/cm-com/terms-and-conditions/) * [Cookie Policy](https://www.cm.com/about-cm/cookie-policy/) Jump to Product page Conversational AI Cloud Mobile Service Cloud Mobile Marketing Cloud Messaging Ticketing Payments Platform Voice Sign --- # Start transaction You can use this call to start an existing Apple Pay transaction using the CM.com Online Payments API. This step generates a valid payment session by interacting with Apple Pay servers. Prerequisite [](https://developers.cm.com/payments-platform/docs/start-transaction-1#prerequisite) ------------------------------------------------------------------------------------------------------ Get an `access_token` and use it as 'Bearer' token in your request. Find more details [here](https://developers.cm.com/payments-platform/docs/authorization-3) . Request [](https://developers.cm.com/payments-platform/docs/start-transaction-1#request) -------------------------------------------------------------------------------------------- Text `POST https://api.pay.cm.com/api/v1/paymentmethods/apple-pay/v1/transactions/{transactionId}/start` JSON `{ "validationUrl": "https://apple-pay-gateway-cert.apple.com/paymentservices/startSession", "displayName": "My merchant commercial name", "domainName": "https://app-domain.tld" }` Parameters [](https://developers.cm.com/payments-platform/docs/start-transaction-1#parameters) -------------------------------------------------------------------------------------------------- | Parameter | Type | Description | Constraints | | --- | --- | --- | --- | | validationUrl | String | The validation URL that is generated by the Apple device. | | | displayName | String | The name to display on the the payment sheet. You get this information from the initialize transaction endpoint. | | | domainName | String | The domain of the website on which the payment will occur. The value must match the domain from which the request is started. If there is a mismatch between this field and the domain that the Apple device determined, then the Apple Pay session will be terminated by the Apple device (with a generic error message or nothing happens). | | Response [](https://developers.cm.com/payments-platform/docs/start-transaction-1#response) ---------------------------------------------------------------------------------------------- The response is an opaque merchant session object. You pass the merchant session object to your Apple Pay session’s completeMerchantValidation method (`session.completeMerchantValidation(merchantSession);`). You can use the merchant session object a single time. It expires five minutes after it is created. Text `{ "..." : "...", }` Response codes [](https://developers.cm.com/payments-platform/docs/start-transaction-1#response-codes) ---------------------------------------------------------------------------------------------------------- | HTTP status | Description | | --- | --- | | 201 | Apple Pay merchant session successfully retrieved. | | 4XX | Client error response (See message for details). This response is given when the User input was incorrect or something illegal was attempted (eg. using a service without having that service configured for the user, or not being authorized). | | 5XX | Server error response (See message for details). | Updated about 1 year ago * * * [](https://www.cm.com/) * [Privacy Policy](https://www.cm.com/app/legal/cm-com/privacy-policy/) * [Terms and Conditions](https://www.cm.com/app/legal/cm-com/terms-and-conditions/) * [Cookie Policy](https://www.cm.com/about-cm/cookie-policy/) Jump to Product page Conversational AI Cloud Mobile Service Cloud Mobile Marketing Cloud Messaging Ticketing Payments Platform Voice Sign --- # Getting started with Cloud Integration [](https://developers.cm.com/payments-platform/v1.0.2/docs/merchant-api#section-) ==================================================================================== Introduction [](https://developers.cm.com/payments-platform/v1.0.2/docs/merchant-api#introduction) ====================================================================================================== Target Audience [](https://developers.cm.com/payments-platform/v1.0.2/docs/merchant-api#target-audience) ------------------------------------------------------------------------------------------------------------ This document is relevant for you as a customer if: * You are a merchant. * You are a reseller/integrator serving multiple merchants. The _Cloud Integration_ is a solution meant to help customers looking to connect their electronic cash register solution via the cloud with a complete payment solution. When deciding for the cloud integration option available via CM.com POS Payments, customers get easy and secure access to the whole payment network involved in processing card present transactions. The Cloud Integration is currently in Beta phase, hence is not fully available to the entire customer base. If you are interested in becoming a Beta customer, please contact your Sales Representative. Cloud Integration explained [](https://developers.cm.com/payments-platform/v1.0.2/docs/merchant-api#cloud-integration-explained) ------------------------------------------------------------------------------------------------------------------------------------ Using _Cloud Integration_ is an option for customers to start using Sunmi Terminals, where the initiation of the transaction is being done via the cloud, usually by the backend of the customer selling platform. That backend will connect to the _MerchantAPI_ of the CM.com POS Payment Platform. Another possibility for the initiation of the transaction is available via the on-device app-to-app integration from a custom-made Android ECR application. Please contact your CM.com POS Payments Sales representative in case you require access to the app-to-app integration guide. Via the _MerchantAPI_ customers are able to notify the CM.com Payments Platform that a transaction is requested on a specific terminal for a specific amount and ask for the status of their initiated transaction The _Sunmi Terminals_ involved will be configured upon onboarding with a _Cloud Integration Enabled_ option, which will result in the terminal to poll the CM.com Payments Platform regularly to inquire if there is a new transaction to be handled. Concretely polling means a terminal will proactively look for and inquire the CM Payment Platform every X period (a configured interval, usually less than 10 seconds) for a transaction to be processed. System Overview [](https://developers.cm.com/payments-platform/v1.0.2/docs/merchant-api#system-overview) ------------------------------------------------------------------------------------------------------------ ![763](https://files.readme.io/f932762-diag-e5cfbfd8702805541605177bc246e027.png "diag-e5cfbfd8702805541605177bc246e027.png") Processing a transaction [](https://developers.cm.com/payments-platform/v1.0.2/docs/merchant-api#processing-a-transaction) ------------------------------------------------------------------------------------------------------------------------------ ![699](https://files.readme.io/2dd28aa-diag-0748996c0991c9eb901b5d34610cba66.png "diag-0748996c0991c9eb901b5d34610cba66.png") The diagram above describes a cardholder tapping a card to a terminal. Possible ways to authorise a payment are tapping, swiping or inserting a card into the terminal. Retrieving the status of a transaction [](https://developers.cm.com/payments-platform/v1.0.2/docs/merchant-api#retrieving-the-status-of-a-transaction) ---------------------------------------------------------------------------------------------------------------------------------------------------------- After the creation of a transaction by a Customer System, that system will need to be able to determine the status of the transaction. The MerchantAPI allows a Customer System to retrieve information about any transaction. ![467](https://files.readme.io/3a1324a-diag-0e864f3f59f259056efd60079e47748b.png "diag-0e864f3f59f259056efd60079e47748b.png") Terminal in Cloud Integrated Mode [](https://developers.cm.com/payments-platform/v1.0.2/docs/merchant-api#terminal-in-cloud-integrated-mode) ------------------------------------------------------------------------------------------------------------------------------------------------ Upon startup the terminals will be retrieving/updating their configuration. **Figure 2. Terminal loading its configuration** ![467](https://files.readme.io/0050ca3-terminal-loading-configuration.png "terminal-loading-configuration.png") Within the configuration there are settings to inform a terminal that it should operate in 'Cloud Integration'-mode. If the terminal is in 'Cloud Integration'-mode and connected to the internet it will be polling by default. This is how a terminal user can check that a terminal polls: **Figure 1. Terminal connected and polling.** _If the bar is blue, then the terminal is connected and polling._ ![469](https://files.readme.io/e82e50d-terminal-polling-successful.png "terminal-polling-successful.png") ### Some error scenarios [](https://developers.cm.com/payments-platform/v1.0.2/docs/merchant-api#some-error-scenarios) Terminals do not poll if they are turned off, in standby, or while retrieving/updating their configuration. Errors in polling are signaled by the terminal and will result in an error message being shown. **Figure 3. Terminal is offline** ![468](https://files.readme.io/8e02f78-terminal-is-offline.png "terminal-is-offline.png") **Figure 4. Terminal failing to retrieve configuration** ![470](https://files.readme.io/09d676b-terminal-failed-to-load-configuration.png "terminal-failed-to-load-configuration.png") Getting started [](https://developers.cm.com/payments-platform/v1.0.2/docs/merchant-api#getting-started) ============================================================================================================ Prerequisites [](https://developers.cm.com/payments-platform/v1.0.2/docs/merchant-api#prerequisites) -------------------------------------------------------------------------------------------------------- In order to interact with the MerchantAPI a customer has to be configured within the CM.com POS Payments system and an APIKey has to be assigned and securely provided to the customer. The configuration within the CM.com POS Payments system is executed by CM.com POS Payments Customer Care Center during onboarding based on a valid contract presented by CM.com POS Payments Sales team. Connectivity [](https://developers.cm.com/payments-platform/v1.0.2/docs/merchant-api#connectivity) ------------------------------------------------------------------------------------------------------ * The MerchantAPI is hosted on `payplaza.com`. * All the messages will be formatted as `JSON`. * The messages are communicated using the format of the `HTTP/1.1`\-protocol as described in [RFC 2616 \ HTTP/1.1](https://www.ietf.org/rfc/rfc2616.txt) * All communication between Customer systems and the CM.com POS Payment Platform will be encrypted using **TLS**. This results in the MerchantAPI being offered as **HTTPS**. * All available operations are documented using the [OpenAPI \ Specification](https://oai.github.io/Documentation/) * The MerchantAPI does not have a Rate Limit. Start using the MerchantAPI [](https://developers.cm.com/payments-platform/v1.0.2/docs/merchant-api#start-using-the-merchantapi) ------------------------------------------------------------------------------------------------------------------------------------ 1. Download the OpenAPI specification of the MerchantAPI 2. Create a client compatible with the retrieved specification in the programming language you are using. 1. For various programming languages [OpenAPI Client \ Generators](https://github.com/OpenAPITools/openapi-generator) are available, which can help with this. 3. Include the generated client into your system 4. Include the provided APIKey into your system configuration 5. Adjust your system to invoke MerchantAPI operations when needed Swagger [](https://developers.cm.com/payments-platform/v1.0.2/docs/merchant-api#swagger) -------------------------------------------------------------------------------------------- | Environment | BaseURL | | --- | --- | | Development | [https://api.dev.payplaza.com/merchant/v1/q/swagger-ui/](https://api.dev.payplaza.com/merchant/v1/q/swagger-ui/) | Authentication [](https://developers.cm.com/payments-platform/v1.0.2/docs/merchant-api#authentication) ========================================================================================================== The MerchantAPI is protected from unauthorized access. In order for a customer to identify itself when invoking any operation of the MerchantAPI, the HTTP request MUST contain a header with the name `API-Key`. Make sure the case and all the characters match this exactly. The value of that header MUST be the API key, which CM.com POS Payments provided during the onboarding. Failure to Authenticate [](https://developers.cm.com/payments-platform/v1.0.2/docs/merchant-api#failure-to-authenticate) ---------------------------------------------------------------------------------------------------------------------------- * Any request sent to the MerchantAPI without the `API-Key` header will get an HTTP `401 Unauthorized` response. * Any request sent to the MerchantAPI with an invalid `API-Key` header will get an HTTP `403 Forbidden` response. APIKey Rotation [](https://developers.cm.com/payments-platform/v1.0.2/docs/merchant-api#apikey-rotation) ------------------------------------------------------------------------------------------------------------ In order to mitigate security concerns customers are enabled and encouraged to frequently change their APIKey. After a customer has received their initial APIKey securely from CM.com POS Payments they are able to handle APIKey rotation themselves via a dedicated endpoint in the MerchantAPI. This `/apikeys` endpoint supports: * Getting an overview of current APIKeys issued to the organization * Requesting a new APIKey for the organization * Revoke access for a specific APIKey ### Getting started [](https://developers.cm.com/payments-platform/v1.0.2/docs/merchant-api#getting-started-1) Interaction with the APIKey-endpoint is protected with an APIKey itself. In order to get access initially CM.com POS Payments will generate a first APIKey and transfer that securely to the Customer. ![751](https://files.readme.io/6c2e687-diag-224ff2cb99d4447916d2544b133f599a.png "diag-224ff2cb99d4447916d2544b133f599a.png") Customers will be able to see an overview of their current APIKeys. ![595](https://files.readme.io/f69b7d6-diag-a47b14ab9028aace57f2d201f5fdde40.png "diag-a47b14ab9028aace57f2d201f5fdde40.png") ### Starting APIKey Rotation [](https://developers.cm.com/payments-platform/v1.0.2/docs/merchant-api#starting-apikey-rotation) The process can be done completely by the Customer themselves without assistance of CM.com POS Payments employees and this can be done as follows: 1. Customer generates a new APIKey 2. Customer updates their MerchantSystem to use the new APIKey 3. Customer revokes access on the old APIKey \[block:image\] { "images": \[ \ { \ "image": \[ \ "https://files.readme.io/9c76826-diag-dd25d37c9ae4605c2a2bba5a5977dce8.png", \ "diag-dd25d37c9ae4605c2a2bba5a5977dce8.png", \ 885, \ 545, \ "#f2f3f2" \ \] \ } \ \] } \[/block\] **Example JSON Body for a request for a new APIKey** `{ "label": "2022 2nd half" // REQUIRED "validity" : { // OPTIONAL "from" : "2022-07-01T00:00:00+00:00", "until": "2023-01-01T00:00:00+00:00" }` **Example JSON Response to a request for a new APIKey** `{ "id": 854844465, "label":"Our 2nd APIKey", "apikey": "tioreutopert443543uiyffudh.jfyiuf.453" }` #### Rules [](https://developers.cm.com/payments-platform/v1.0.2/docs/merchant-api#rules) * Customers MUST provide a `Label` for the new APIKey. * APIKeys MAY be used indefinitely. * APIKeys CAN be created with a validity period, which will cause an APIKey to expire after certain period. * The actual APIKey will be shown only ONCE in the reply. The overview will not contain the actual key. After an additional key has been generated, the overview will show all valid keys. ![507](https://files.readme.io/3154dec-diag-928e7708d5fd91295fe67c76c278ba4f.png "diag-928e7708d5fd91295fe67c76c278ba4f.png") **Example JSON Response to a request for an overview of APIKeys** JSON `[ { "id": 767854635839, // REQUIRED "label": "Initial API Key", // REQUIRED "lastUsage": "2022-05-06T11:53:46+02:00" // OPTIONAL }, { "id": 854844465, // REQUIRED "label": "2022 2nd half", // REQUIRED "validity" : { // OPTIONAL "from": "2022-07-01T00:00:00+00:00", "until": "2023-01-01T00:00:00+00:00" } } ]` ![496](https://files.readme.io/e7b3626-diag-2787916919e74d7439c60b54cf486a75.png "diag-2787916919e74d7439c60b54cf486a75.png") #### Rules [](https://developers.cm.com/payments-platform/v1.0.2/docs/merchant-api#rules-1) * A customer can NOT revoke access to their last APIkey * A customer can NOT revoke access on the APIKey they are using for the request to revoke a key \[block:image\] { "images": \[ \ { \ "image": \[ \ "https://files.readme.io/5cc9f16-diag-e2704e8135dcff00f11927b7eddddc63.png", \ "diag-e2704e8135dcff00f11927b7eddddc63.png", \ 494, \ 347, \ "#edefed" \ \] \ } \ \] } \[/block\] Resources [](https://developers.cm.com/payments-platform/v1.0.2/docs/merchant-api#resources) ================================================================================================ The MerchantAPI provides various resource for the customer to use. Listing Stores [](https://developers.cm.com/payments-platform/v1.0.2/docs/merchant-api#listing-stores) ---------------------------------------------------------------------------------------------------------- The MerchantAPI allows customers to retrieve a listing of their registered stores. Should the customer have registered stores across different merchants, all the stores of all their merchants will be shown via this request. Format `GET /stores` _Supports Pagination_ Listing Terminals [](https://developers.cm.com/payments-platform/v1.0.2/docs/merchant-api#listing-terminals) ---------------------------------------------------------------------------------------------------------------- The MerchantAPI allows customers to retrieve a listing of their registered terminals. Should the customer have registered terminals across multiple stores, all their terminals, across all stores will be shown via this request. Format `GET /terminals` _Supports Pagination_ Receipt note [](https://developers.cm.com/payments-platform/v1.0.2/docs/merchant-api#receipt-note) ------------------------------------------------------------------------------------------------------ The Merchant API returns a plain text EFT receipt for any transaction for which a receipt is applicable. Per the card schemes regulations, a receipt should always be available for cardholders/customers. All the mandatory information required on the receipt from a transaction point of view will be included in the plain text receipt. In addition to this information, integrators are required to make available to their cardholders/customers a description and the price of each product and service purchased or returned, including applicable taxes, in detail sufficient to identify the transaction. Transaction related endpoints [](https://developers.cm.com/payments-platform/v1.0.2/docs/merchant-api#transaction-related-endpoints) ---------------------------------------------------------------------------------------------------------------------------------------- All transactions within the CM.com POS Payment Solution are related to a terminal. Therefor within the MerchantAPI all requests related to transactions require some identifiers of the target terminal. Within the CM.com POS Payment Solution terminals are identified by their manufacturer, model and serial number. The customer is responsible for selecting the proper values for manufacturer, model and serial to target the proper terminal from the Customer System. ### Finding the identifiers. [](https://developers.cm.com/payments-platform/v1.0.2/docs/merchant-api#finding-the-identifiers) There are various ways to obtain the manufacturer, model and serial for a device. #### Read from the menu of the Terminal App [](https://developers.cm.com/payments-platform/v1.0.2/docs/merchant-api#read-from-the-menu-of-the-terminal-app) The easiest ways being getting the information from the hamburger menu of the terminal app: System report → Device serial number (or using the Sunmi device: Settings→About device→Serial number) ![467](https://files.readme.io/4974bec-terminal-showing-make-model-serial.png "terminal-showing-make-model-serial.png") A Sales representative could enter these values in their Customer System for a sale to delegate the transaction to that terminal. #### Read from the QR Code of the Terminal App [](https://developers.cm.com/payments-platform/v1.0.2/docs/merchant-api#read-from-the-qr-code-of-the-terminal-app) If the Customer System has the capability to scan QR code, the manual entry of the identifiers could be circumvented, since the Terminal App has the ability to display a QR-code, which contains the serial information. ![467](https://files.readme.io/e736328-terminal-showing-qrcode.png "terminal-showing-qrcode.png") **Example of data encoded in the QR code** JSON `{ "manufacturer":"SUNMI", "model":"P2lite", "serial":"PL09214300501" }` ##### Read from the Serialnumber from the device. [](https://developers.cm.com/payments-platform/v1.0.2/docs/merchant-api#read-from-the-serialnumber-from-the-device) The info can be derived from the device itself as well, but that will require taking out the battery (which we do not recommend). ### Listing Transactions per terminal [](https://developers.cm.com/payments-platform/v1.0.2/docs/merchant-api#listing-transactions-per-terminal) The MerchantAPI allows customers to retrieve a listing of their registered transactions per terminal. Format `GET /terminals/{manufacturer}-{model}-{serial}/transactions` Example `GET /terminals/SUNMI-P2lite-PL0919CQ00305/transactions` _Supports pagination_ ### Initiating a payment [](https://developers.cm.com/payments-platform/v1.0.2/docs/merchant-api#initiating-a-payment) After identifying the target terminal for a transaction the Customer System will need to POST a message to the MerchantAPI of the CM.com POS Payment Solution. Format `POST /terminals/{manufacturer}-{model}-{serial}/transactions` The message needs to contain the following: the `amount`, `currency` and `merchantReferenceCode` The MerchantAPI will make sure only one payment is available for a terminal to processed. The Customer System may send two consecutive messages for payment A and payment B for the same terminal. If payment A has not been retrieved by the terminal when sending payment B the MerchantAPI will abort payment A, and the terminal will receive payment B. #### Transaction Request [](https://developers.cm.com/payments-platform/v1.0.2/docs/merchant-api#transaction-request) The actual message needs to be sent as JSON. Detailed information about the fields can be found in the OpenAPI specification. **Example** JSON `{ "type": "PURCHASE", "merchant_order_reference": "inv2112280004", "amount": { "value": 98.75, "currency": "EUR" } }` #### Transaction Response [](https://developers.cm.com/payments-platform/v1.0.2/docs/merchant-api#transaction-response) In response to the initiated transaction the CM.com POS Payment Solution will generate an identifier and will send the information back including the status on the transaction. Initially the transaction will only contain a small set of relevant fields. **Example** JSON `{ "type": "PURCHASE", "id": "5456485215432746823746654987115", "merchant_order_reference": "inv2112280004", "creation_datetime": "2022-01-18T14:30:05.619Z", "amount": { "value": 98.75, "currency": "EUR" }, "status": "CREATED" }` The important value is available in the field `id`, since the Customer System needs that identifier further on to retrieve updates in the status. ### Initiate a referenced refund [](https://developers.cm.com/payments-platform/v1.0.2/docs/merchant-api#initiate-a-referenced-refund) A customer can initiate a refund in a similar manner as a purchase. In the message the customer must supply the id of the original purchase which is being refunded as a `reference`. **Example of a referenced refund** JSON `{ "type": "REFUND", "merchant_order_reference": "invoice-202112280004-r", "amount": { "value": 98.75, "currency": "EUR" }, "reference": { "id": "5456485215432746823746654987115" } }` ### Initiate an unreferenced refund [](https://developers.cm.com/payments-platform/v1.0.2/docs/merchant-api#initiate-an-unreferenced-refund) A customer can initiate a refund in a similar manner as a purchase. In the message the customer does not supply an id of the original purchase. **Example of an unreferenced refund** JSON `{ "type": "REFUND", "merchant_order_reference": "invoice-202112280004-r", "amount": { "value": 98.75, "currency": "EUR" } }` ### Getting the status of a transaction [](https://developers.cm.com/payments-platform/v1.0.2/docs/merchant-api#getting-the-status-of-a-transaction) If the Customer System wants to get information about the status of a transaction, it can ask the MerchantAPI for that. In order to do so it needs to send an HTTP GET to a specific endpoint. Format `GET /terminals/{manufacturer}-{model}-{serial}/transactions/{id}` Example `GET /terminals/SUNMI-P2Lite-PL0919CQ00305/transactions/5456485215432746823746` Initially the data will be the same as the response to the POST, which created the transaction. **Example** JSON `{ "type": "PURCHASE", "id": "5456485215432746823746654987115", "merchant_order_reference": "inv2112280004", "creation_datetime": "2022-01-18T14:30:05.619Z", "amount": { "value": 98.75, "currency": "EUR" }, "status": "CREATED" }` After the consumer has provided their bankcard and the transaction has been processed, the response will contain more data. **Example** JSON `{ "merchant_order_reference": "inv2112280004", "amount": { "value": 98.75, "currency": "EUR" }, "id": "5456485215432746823746654987115", "creation_datetime": "2022-01-18T14:30:05.619Z", "transaction_datetime": "2022-01-18T14:31:02Z", "system_trace_audit_number": "155890", "brand": "V_PAY", "receipt": " CARDHOLDER NAME \n....\nPAYMENT ACCEPTED \n\n..... ", "merchant_receipt": " MERCHANT NAME \n....\nPAYMENT ACCEPTED \n\n..... ", "result": "APPROVED", "status": "CLEARED", "type": "PURCHASE", "store": { "uuid": "3fa85f64-5717-4562-b3fc-2c963f66afa6", "name": "The configured Shopname" } }` #### Statuses and result of a Transaction [](https://developers.cm.com/payments-platform/v1.0.2/docs/merchant-api#statuses-and-result-of-a-transaction) A transaction can have the following statuses: | | | | --- | --- | | CREATED | Transaction is created and waiting authorization. | | AUTHORIZED | Transaction is authorized by the Acquirer and awaiting clearance. | | CLEARED | Transaction is cleared and is completed successfully. This status indicates that the transaction will be settled by the Acquirer to the merchant. | | CANCELLED | Transaction is cancelled and is completed unsuccessfully | A transaction can have the following result values: | | | | --- | --- | | APPROVED | Indicates that the bank of the consumer authorized the payment. | | DECLINED | Indicates that the bank of the consumer does NOT approve the payment. | #### Flow for a Successful transaction through the statuses [](https://developers.cm.com/payments-platform/v1.0.2/docs/merchant-api#flow-for-a-successful-transaction-through-the-statuses) ![807](https://files.readme.io/d9a9eac-diag-def913b14819d9ed5120de06506b9314.png "diag-def913b14819d9ed5120de06506b9314.png") #### Flow for a declined transaction through the statusses [](https://developers.cm.com/payments-platform/v1.0.2/docs/merchant-api#flow-for-a-declined-transaction-through-the-statusses) ![741](https://files.readme.io/006864d-diag-0ec9867a5605039ae7a3b5b93f863a02.png "diag-0ec9867a5605039ae7a3b5b93f863a02.png") #### Flow for a transaction where the Consumer cancels [](https://developers.cm.com/payments-platform/v1.0.2/docs/merchant-api#flow-for-a-transaction-where-the-consumer-cancels) ![719](https://files.readme.io/7fd7cc7-diag-f914185f7582f5ef9b3b731226182e11.png "diag-f914185f7582f5ef9b3b731226182e11.png") Cancel a transaction [](https://developers.cm.com/payments-platform/v1.0.2/docs/merchant-api#cancel-a-transaction) ---------------------------------------------------------------------------------------------------------------------- If the Customer System wants to cancel a transaction, before it is handled by a terminal (it has the CREATED status), it can instruct the MerchantAPI to do so. In order to do so it needs to send an HTTP DELETE to a specific endpoint, identifying the transaction. Format `DELETE /terminals/{manufacturer}-{model}-{serial}/transactions/{id}` Example `DELETE /terminals/SUNMI-P2Lite-PL0919CQ00305/transactions/5456485215432746823746` When the transaction is still in a state to be cancelled a response with HTTP status `204` will be the result. If the transaction is already in a state, where it can not be cancelled anymore (because a card has been presented on the terminal), then a HTTP status `409 Conflict` will be the result. ### Retrieve day totals per terminal [](https://developers.cm.com/payments-platform/v1.0.2/docs/merchant-api#retrieve-day-totals-per-terminal) The MerchantAPI allows customers to retrieve the day totals of their registered transactions per terminal. The day totals will be presented as a formatted receipt. Format `GET /terminals/{manufacturer}-{model}-{serial}/daytotals/today` Example `GET /terminals/SUNMI-P2lite-PL0919CQ00305/daytotals/today` Pagination [](https://developers.cm.com/payments-platform/v1.0.2/docs/merchant-api#pagination) ================================================================================================== All endpoints, which return a listing, allow pagination by supporting two query parameters on the requests. | Parameter name | Description | Default value | | --- | --- | --- | | `page` | Identifies the requested page. \*First page has number **1\*** | 1 | | `size` | Defines the number of entries to show on each page. \*Maximum value is **100\*** | 10 | | | | | --- | --- | | Format | `GET ?page=$pageNumber&size=$pageSize` | | Example | `GET /stores?page=2&size=25` | | Explanation | Would return the 26th until the 50th store entries. | Pagination information in response [](https://developers.cm.com/payments-platform/v1.0.2/docs/merchant-api#pagination-information-in-response) -------------------------------------------------------------------------------------------------------------------------------------------------- On all responses to any requests for a listing there will be two headers, which provide information about the pagination. | | | | --- | --- | | `X-Total-Count` | Total number of entries available | | `Link` | Multiple links providing information about how to navigate through the entries. Links are separated by a comma ',' Format is compliant with [RFC 8288 Web Linking](https://datatracker.ietf.org/doc/html/rfc8288)

_If the page size is larger than the total number of entries, then this header will be empty._ | Example [](https://developers.cm.com/payments-platform/v1.0.2/docs/merchant-api#example) -------------------------------------------------------------------------------------------- Given there is a merchant with 67 stores, when the merchant sends the following request: `/stores?page=3&size=10` then the response will contain the following headers: `X-Total-Count: 67 Link: ; rel="prev",; rel="next",; rel="first",; rel="last"` Troubleshooting error situations [](https://developers.cm.com/payments-platform/v1.0.2/docs/merchant-api#troubleshooting-error-situations) ============================================================================================================================================== Standardized way of describing problems [](https://developers.cm.com/payments-platform/v1.0.2/docs/merchant-api#standardized-way-of-describing-problems) ------------------------------------------------------------------------------------------------------------------------------------------------------------ When an error or exception occurs while processing a request and the result will be a HTTP Status `4xx` of `5xx`, then the body of the response will contain more information about what caused the problem. Those responses will have the content-type `application/problem+json`. [Problem Details for HTTP \ APIs](https://datatracker.ietf.org/doc/html/rfc7807) is a standardized way of describing any kind of error thrown by an API. **Example of a Problem JSON response** JSON `{ "status": 403, "title": "Forbidden", "detail": "Invalid API Key.", "instance": "/stores" }` Failure during authentication [](https://developers.cm.com/payments-platform/v1.0.2/docs/merchant-api#failure-during-authentication) ---------------------------------------------------------------------------------------------------------------------------------------- | Error Code | Description | Solution | | --- | --- | --- | | 401 | The Consumer System failed to include the `API-Key`\-Header in the request. | Add an `API-Key` Header to the request with a valid APIKey. | | 403 | The Consumer System included an invalid API-Key in the Header in the request. | Replace the APIKey with a valid APIKey. Contact CM.com POS Payment’s Customer Care Center for getting a new valid APIKey if necessary. | Disconnects during communication [](https://developers.cm.com/payments-platform/v1.0.2/docs/merchant-api#disconnects-during-communication) ---------------------------------------------------------------------------------------------------------------------------------------------- When a Consumer System sends a request to the MerchantAPI but fails to receive a HTTP response due to some network issue, the request still might have been received and handled correctly by the CM POS Payment Platform. * All GET operations can be retried by the Consumer System. * For other operations the Consumer System might want to retrieve the current status before a retry since a new transaction might have been created or an aborted transaction might actually have been aborted. * The id of a transaction can be found by requesting a list of transactions per terminal and find the transaction by the `merchant_order_reference`. Failure to abort a transaction [](https://developers.cm.com/payments-platform/v1.0.2/docs/merchant-api#failure-to-abort-a-transaction) ------------------------------------------------------------------------------------------------------------------------------------------ When a Consumer System attempts to abort a transaction and gets a `409 Conflict` response, then the abort did not succeed since the terminal has already started to process that transactions. The Consumer System should then get the status of the transaction and if the result for that transaction is `APPROVED`, then the consumer probably will want to initiate a refund for that transaction. How to continue [](https://developers.cm.com/payments-platform/v1.0.2/docs/merchant-api#how-to-continue) ============================================================================================================ **Congratulations!** Reviewing the _Cloud Integration_ Guide is the first step towards understanding how the solution works. Please be reminded that before being able to use this solution, a potential customer needs to: * Agree on commercial conditions and the setup needed for each customer’s case (number of terminals, type of terminals, configuration needed, etc) * Get onboarded. During this step, customers will be setup throughout CM.com POS Payments systems to be able to start their integration * Integration time. During this step, customers will use the existing documentation to integrate the API and test it accordingly * Testing time. During this step, based on a common strategy, CM.com POS Payments and the customer will execute the necessary testing that make both parties comfortable to launch * Launching preparations. During this step, both parties perform all necessary configurations allowing live transaction processing and defining the success criteria for launch. * Launch day and initial period monitoring. During this step, both parties monitor the initial phase of live transaction processing making sure the success criteria is met. * Normal operations. Once the initial period has concluded successfully, the customer enters the stage of normal operations. Glossary of Terms [](https://developers.cm.com/payments-platform/v1.0.2/docs/merchant-api#glossary-of-terms) ================================================================================================================ Cardholder A person who has been given permission to use a card which allows them to do payments, for example a credit card or debit card. CM.com POS Payment Platform CM.com POS Payments’s proprietary payment gateway/host that connects payment terminals with payment processors. Customer A party – reseller/partner or merchants – entering a contractual relationship with CM.com POS Payments. Merchant A party selling goods and owning stores that are using CM.com POS Payments’s terminals for accepting card present transactions. The merchant can be a direct customer of CM.com POS Payments or a direct customer of one of CM.com POS Payments partners/resellers. Terminal A terminal is a device that has the ability to read credit/debit cards in at least one of the common methods (Swipe for magnetic stripe, insert for ICC or tap for NFC). A terminal runs a software application created by CM.com POS Payments to securely perform payment transactions. Transaction types The different flows the merchant supports. Purchase, refund and pre-authorization are the tree types commonly used in CM.com POS Payments ecosystem. Updated about 2 months ago * * * [](https://www.cm.com/) * [Privacy Policy](https://www.cm.com/app/legal/cm-com/privacy-policy/) * [Terms and Conditions](https://www.cm.com/app/legal/cm-com/terms-and-conditions/) * [Cookie Policy](https://www.cm.com/about-cm/cookie-policy/) Jump to Product page Conversational AI Cloud Mobile Service Cloud Mobile Marketing Cloud Messaging Ticketing Payments Platform Voice Sign --- # Diagrams Create an Apple Pay transaction [](https://developers.cm.com/payments-platform/docs/diagrams-3#create-an-apple-pay-transaction) ----------------------------------------------------------------------------------------------------------------------------------- The CM.com Online Payments API enables you to create an Apple Pay transaction. The diagram below presents the interaction that takes place between Consumer/Apple Device, Merchant (You), CM.com Online Payments API, and Apple when creating an Apple Pay transaction: ![](https://files.readme.io/c6dd567-image.png) In the diagram above the following steps are performed: 1. A Merchant wants to enable Apple Pay payments for a Consumer/Apple Device. In order to do this, a Merchant makes a request to [initialize Apple Pay transaction](https://developers.cm.com/payments-platform/docs/initialize-transaction) . 2. Merchant receives a successful transaction response including `details`. These details are passed to Consumer/Apple Device because they are necessary to render the Apple Pay button on the Apple Device. 3. Checking for Apple Pay availability; before showing the Apple Pay button to the Consumer/Apple Device the availability of Apple Pay needs to be checked. For more details see: [Checking for Apple Pay Availability](https://developer.apple.com/documentation/apple_pay_on_the_web/apple_pay_js_api/checking_for_apple_pay_availability) . Example javascript: JavaScript `function canMakePaymentsWithApplePay() { if (window.ApplePaySession) { try { if (ApplePaySession.canMakePayments()) { return true; } else { console.log("Can not make Apple Pay payments."); } } catch (e) { console.log("Starting an Apple Pay session requires an secure document.", e); } } else { console.log("Apple Pay JS API is not available."); } return false; }` 4. Creating an Apple Pay session; after the Consumer clicks on the Apple Pay button a session has to be created specifying the payment details. The following payments details need to be provided in the request (For more details see: [Creating an Apple Pay Session](https://developer.apple.com/documentation/apple_pay_on_the_web/apple_pay_js_api/creating_an_apple_pay_session) ): | Field | Description | Required | | --- | --- | --- | | countryCode | The country of the merchant. | ✅ | | currencyCode | The currency for the payment. | ✅ | | supportedNetworks | The payment networks supported by the merchant. The supported values are 'visa', 'masterCard', 'maestro'. (Depending on the payment methods enabled on your account.) | ✅ | | merchantCapabilities | The payment capabilities supported by the merchant. The only supported value is 'supports3DS'. | ✅ | | total.label | The name of the shop that is shown to the consumer. | ✅ | | total.amount | The payment amount in major unit, i.e. including a decimal point. | ✅ | Example javascript: JavaScript `let request = { countryCode: transactionJson.details.merchantCountry, currencyCode: transactionJson.currency, supportedNetworks: transactionJson.details.allowedCardNetworks, merchantCapabilities: ['supports3DS'], total: { label: transactionJson.details?.merchantName || 'Undefined merchant display name', amount: (transactionJson.amount / 100).toString() } }; var session = new ApplePaySession(4, request);` 5. After the session is created, call its [begin-method](https://developer.apple.com/documentation/apple_pay_on_the_web/applepaysession/1778001-begin) to show the payment sheet. Example javascript: JavaScript `session.begin()` 6. Validating the merchant; Apple initiates the validation of the merchant when the payment sheet is shown using the [On Validate Merchant](https://developer.apple.com/documentation/apple_pay_on_the_web/applepaysession/1778021-onvalidatemerchant) event. So, `session.onvalidatemerchant(event)` event handler is called when the payment sheet is displayed. The event parameter contains the validation URL attribute (`event.validationURL`), which should be used in the call to [start Apple Pay transaction](https://developers.cm.com/payments-platform/docs/start-transaction-1) . The response is an opaque merchant session object, so If successful the returned merchant session must be used to [complete the merchant validation](https://developer.apple.com/documentation/apple_pay_on_the_web/applepaysession/1778015-completemerchantvalidation) . Otherwise, the session must be aborted. Example javascript: JavaScript ``session.onvalidatemerchant = event => { console.log(event); let controller = new AbortController(); const signal = controller.signal; const reqOptions = { method: "POST", headers: { 'Content-Type': "application/json", Authorization: `Bearer ${document.getElementById('token').value}`, Accept: `application/json` }, mode: "cors", body: JSON.stringify({ validationUrl: event.validationURL, displayName: transactionJson.details.merchantName, domainName: window.location.hostname }), signal: signal }; // Call your own server to request a new merchant session. fetch(baseUrl + "/start", reqOptions) .then(response => { if (!response.ok) { console.error(response); displayMessage(response.statusText); session.abort(); controller.abort(); } return response.json(); }) .then(merchantSession => { console.log(`Merchant session:`, merchantSession); session.completeMerchantValidation(merchantSession); }) .catch(err => { console.error("Error fetching merchant session", err); controller.abort(); }); };`` 7. Authorizing the payment; Apple initiates the authorization of the payment when the consumer authenticates the payment using the [On Payment Authorized](https://developer.apple.com/documentation/apple_pay_on_the_web/applepaysession/1778020-onpaymentauthorized) event. So, `session.onpaymentauthorized(event)` event handler is called when the user has authorized the Apple Pay payment with Touch ID, Face ID, or passcode. The event parameter contains the payment attribute (`event.payment`) containing the encrypted card details. The payment attribute must be sent as-is in the call to [authorize Apple Pay transaction](https://developers.cm.com/payments-platform/docs/authorize-transaction) . Example javascript: JavaScript ``session.onpaymentauthorized = function(event) { console.log(JSON.stringify(event)); let controller = new AbortController(); const signal = controller.signal; const reqOptions = { method: "POST", headers: { 'Content-Type': "application/json", Authorization: `Bearer ${document.getElementById('token').value}`, Accept: `application/json` }, mode: "cors", body: JSON.stringify(event.payment), signal: signal }; fetch(baseUrl + "/authorize", reqOptions) .then(response => { if (!response.ok) { console.error(response); displayMessage(response.statusText); session.completePayment({status: ApplePaySession.STATUS_FAILURE}); controller.abort(); } else { session.completePayment({status: ApplePaySession.STATUS_SUCCESS}); } return response.json(); }) .then(result => { console.log('Authorization response:', result); let responseElement = document.getElementById('response'); let btnRedirect = document.getElementById('btnRedirect'); responseElement.innerHTML = `
${JSON.stringify(result, null, 2)}
`; responseElement.classList.remove('d-none'); btnRedirect.classList.remove('d-none'); document.getElementById('btnRedirect').addEventListener("click", function () { window.location.href = result.action.redirect?.url; }); document.querySelector('#apple-pay-btn').remove(); }) .catch(err => { console.error("Error authorizing payment", err); displayMessage(err); controller.abort(); }); };`` 1. While authorizing an Apple Pay transaction, the CM.com Online Payments API decrypts the provided card details and authorizes the payment. After the Payment is authorized the result must be used to [complete the payment on the session](https://developer.apple.com/documentation/apple_pay_on_the_web/applepaysession/1778012-completepayment) (e.g. `session.completePayment({status: ApplePaySession.STATUS_SUCCESS});`). This will show the result of the authorization on the payment sheet, and close the payment sheet within 2 minutes automatically. 2. If successful the [authorize Apple Pay transaction](https://developers.cm.com/payments-platform/docs/authorize-transaction) response also contains an `action.redirect.url` where Consumers should be redirected to. This will make them land on the CM.com Online Payments API 'redirect action' url. 3. When the Consumer dismisses the payment sheet instead of authenticating the payment, the On Cancel event is called by Apple. Example javascript: JavaScript `session.oncancel = function() { window.pollOrderStatus(); };` 8. Eventually the status of the CM.com Online Payments API transaction will be updated and that will redirect Consumers again from the 'redirect action' url to the returnUrl(s) specified by the Merchant when transaction was initialize. 9. If the Merchant also specified webhooks in the original request then CM.com Online Payments API will trigger the proper webhooks and make the requests to the webhook URLs specified by the Merchant. **When using webhooks, be aware that they are only a "best effort" mechanism**. 10. Merchant gets the latest details of the transaction. This usually happens once the Merchant received a webhook request. The API endpoints involved on this flow are: * [Initialize Transaction](https://developers.cm.com/payments-platform/docs/initialize-transaction) * [Start transaction](https://developers.cm.com/payments-platform/docs/start-transaction-1) * [Authorize transaction](https://developers.cm.com/payments-platform/docs/authorize-transaction) * [Get Transaction](https://developers.cm.com/payments-platform/docs/get-transaction-5) Create a refund for the payment made with an Apple Pay transaction [](https://developers.cm.com/payments-platform/docs/diagrams-3#create-a-refund-for-the-payment-made-with-an-apple-pay-transaction) --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- The CM.com Online Payments API enables you to create a refund for the payment made with an Apple Pay transaction. The diagram below presents the interaction that takes place between Merchant (You) and CM.com Online Payments API when requesting a refund for the payment made with an Apple Pay transaction. ![](https://files.readme.io/707d17c-SQ_-ApplePay_Refund.png) The API endpoints involved on this flow are: * [Create a Refund](https://developers.cm.com/payments-platform/docs/create-a-refund-5) Updated about 1 year ago * * * [](https://www.cm.com/) * [Privacy Policy](https://www.cm.com/app/legal/cm-com/privacy-policy/) * [Terms and Conditions](https://www.cm.com/app/legal/cm-com/terms-and-conditions/) * [Cookie Policy](https://www.cm.com/about-cm/cookie-policy/) Jump to Product page Conversational AI Cloud Mobile Service Cloud Mobile Marketing Cloud Messaging Ticketing Payments Platform Voice Sign --- # Initialize transaction You can use this call to initialize a new Apple Pay transaction. Prerequisite [](https://developers.cm.com/payments-platform/docs/initialize-transaction#prerequisite) --------------------------------------------------------------------------------------------------------- Get an `access_token` and use it as 'Bearer' token in your request. Find more details [here](https://developers.cm.com/payments-platform/docs/authorization-3) . Request [](https://developers.cm.com/payments-platform/docs/initialize-transaction#request) ----------------------------------------------------------------------------------------------- Text `POST https://api.pay.cm.com/api/v1/paymentmethods/apple-pay/v1/transactions/initialize` ### Request body examples [](https://developers.cm.com/payments-platform/docs/initialize-transaction#request-body-examples) These are only some examples of the request body to create a transaction: Full Request with ReturnURLsFull Request with ReturnURLMinimal Request with ReturnURL `{ "reference": "20210623130413", "description": "Order at yourdomain.tld", "amount": 1200, "currency": "EUR", "expiresAt": "2006-01-02T15:04:05Z", "language": "nl", "consumer": { "name": { "firstName": "John", "lastName": "Lopez", "middleName": "A" }, "address": { "street": "Rustenburgerlaan", "houseNumber": "25", "postalCode": "2012AL", "city": "Haarlem", "countryCode": "NL", "state": "Noord-Holland", "additionalData": "Right-hand portal" }, "email": "[[email protected]](https://developers.cm.com/cdn-cgi/l/email-protection) ", "businessName": "CM", "phone": "06-95613259", "gender": null, "dateOfBirth": "1996-12-01" }, "webhooks": [ { "url": "https://yourdomain.tld/order-webhooks?purchaseId=order123", "events": [ "FINALSTATUS" ] }, { "url": "https://yourdomain.tld/payment-webhooks?purchaseId=order123", "events": [ "REFUND_STATUS" ] }, { "url": "https://yourdomain.tld/payment-webhooks?purchaseId=order123", "events": [ "STATUS_CHANGE" ] } ], "returnUrls": { "success": "https://yourdomain.tld/order/payment-success.html", "cancelled": "https://yourdomain.tld/order/payment-cancelled.html", "expired": "https://yourdomain.tld/order/payment-expired.html", "failed": "https://yourdomain.tld/order/payment-failed.html" } }` `{ "reference": "20210623130413", "description": "Order at yourdomain.tld", "amount": 1200, "currency": "EUR", "expiresAt": "2006-01-02T15:04:05Z", "language": "nl", "consumer": { "name": { "firstName": "John", "lastName": "Lopez", "middleName": "A" }, "address": { "street": "Rustenburgerlaan", "houseNumber": "25", "postalCode": "2012AL", "city": "Haarlem", "countryCode": "NL", "state": "Noord-Holland", "additionalData": "Right-hand portal" }, "email": "[[email protected]](https://developers.cm.com/cdn-cgi/l/email-protection) ", "businessName": "CM", "phone": "06-95613259", "gender": null, "dateOfBirth": "1996-12-01" }, "webhooks": [ { "url": "https://yourdomain.tld/order-webhooks?purchaseId=order123", "events": [ "FINALSTATUS" ] }, { "url": "https://yourdomain.tld/payment-webhooks?purchaseId=order123", "events": [ "REFUND_STATUS" ] }, { "url": "https://yourdomain.tld/payment-webhooks?purchaseId=order123", "events": [ "STATUS_CHANGE" ] } ], "returnUrl": "https://yourdomain.tld/order/payment-completed.html" }` `{ "reference": "20210623130413", "description": "Order at yourdomain.tld", "amount": 1200, "expiresAt": "2006-01-02T15:04:05Z", "language": "nl", "returnUrl": "https://yourdomain.tld/order/payment-completed.html" }` "**Full Request with ReturnURLs**" and "**Full Request with ReturnURL**" are examples where all the request parameters are provided. If `returnUrls` is defined then customers will be redirected to a different URL depending on the status of the transaction when the payment process is completed. If `returnUrl` is defined then customers will be redirected to the same URL no matter the status of the transaction when the payment process is completed. "**Minimal Request with ReturnURLs**" is an example of the minimal request to create a transaction. This example, is using `returnUrls`, but you can replace it for `returnUrl` depending on what is better for your use case. Parameters [](https://developers.cm.com/payments-platform/docs/initialize-transaction#parameters) ----------------------------------------------------------------------------------------------------- | Parameter | Type | Description | Constraints | | --- | --- | --- | --- | | reference | String(1...255) | An identifier specified by you. If webhooks were specified in the request this identifier is added to the webhook request payload. | | | description | String(1...255) | Description of the transaction. | | | amount | Int(1...99999999) | Integer representing the amount of the transaction. Denomination in the smallest currency subunit (e.g. eurocents). | | | expiresAt | String(RFC3339) | Expiration time. | ISO 8601 date and time. | | language | String(ISO 639-1) | Preferred language of the user interface. | ISO 639-1 language. | | returnUrl | String(2000) | Specifies the URL where your customers will be redirected to. | Either `returnUrl` or `returnUrls` must be specified, but not both. | | returnUrls | [returnUrls](https://developers.cm.com/payments-platform/docs/schemas-5#returnurls)
Object | Specifies a URL where your customers will be redirected to per transaction status. For example, your customers will be redirected to `returnUrls.success` when the status of the transaction changes to `SUCCESS`. | Either `returnUrl` or `returnUrls` must be specified, but not both. | Optional parameters [](https://developers.cm.com/payments-platform/docs/initialize-transaction#optional-parameters) ----------------------------------------------------------------------------------------------------------------------- | Parameter | Type | Description | Constraints | | --- | --- | --- | --- | | currency | String (ISO 4217) | Currency code. | ISO 4217 currency code. | | consumer | [consumer](https://developers.cm.com/payments-platform/docs/schemas-5#consumer)
Object | Customer details. | The following fields are mandatory: `name.firstName`, `name.lastName`, `address.street`, `address.houseNumber`, `address.postalCode`, `address.city`, `address.countryCode`, `email`. | | webhooks | Array of objects | Webhooks enable receiving a web request once a given event occurs. | Find more details [here](https://developers.cm.com/payments-platform/docs/webhooks-1)
. | Response [](https://developers.cm.com/payments-platform/docs/initialize-transaction#response) ------------------------------------------------------------------------------------------------- JSON `{ "id": "8db1e7fa-ba8a-4189-92fd-67a20217443d", "orderId": "8db1e7fa-ba8a-4189-92fd-67a20217443d", "reference": "20210623130413", "amount": 1200, "currency": "EUR", "description": "Order at yourdomain.tld", "expiresAt": "2006-01-02T15:04:05Z", "language": "nl", "country": "NL", "webhooks": [ { "url": "https://yourdomain.tld/order-webhooks?purchaseId=order123", "events": [ "FINALSTATUS" ] }, { "url": "https://yourdomain.tld/payment-webhooks?purchaseId=order123", "events": [ "REFUND_STATUS" ] }, { "url": "https://yourdomain.tld/payment-webhooks?purchaseId=order123", "events": [ "STATUS_CHANGE" ] } ], "status": "OPEN", "details": { "merchantCountry": "DE", "serverUrl": "https://www.example.com/api/", "allowedCardNetworks": [ "mastercard" ], "merchantName": "My Merchant Name" }, "createdAt": "2006-01-02T15:04:05Z", "refunds": { "refundedAmount": 300, "refundedPendingAmount": 100 }, "returnUrls": { "success": "https://yourdomain.tld/order/payment-success.html", "cancelled": "https://yourdomain.tld/order/payment-cancelled.html", "expired": "https://yourdomain.tld/order/payment-expired.html", "failed": "https://yourdomain.tld/order/payment-failed.html" } }` Parameters [](https://developers.cm.com/payments-platform/docs/initialize-transaction#parameters-1) ------------------------------------------------------------------------------------------------------- | Parameter | Type | Description | Constraints | | --- | --- | --- | --- | | id | String(36) | Transaction unique identifier. | | | orderId | String(36) | Unique identifier. | | | reference | String(1...255) | An identifier specified by you. If webhooks were specified in the request this identifier is added to the webhook request payload. | Specified in the request. | | amount | Int(1...99999999) | Integer representing the amount of the checkout. Denomination in the smallest currency subunit (e.g. eurocents). | Specified in the request. | | currency | String (ISO 4217) | Currency code. | Specified in the request. | | description | String(1...255) | Description of the transaction. | Specified in the request. | | expiresAt | String(RFC3339) | Expiration time. | Specified in the request. | | language | String(ISO 639-1) | Preferred language of the user interface. | Specified in the request. | | country | String | Country of the Customer. | | | status | String | `OPEN` - Transaction has been created. This is the initial status.
`SUCCESS` - Transaction successfully paid.
`CANCELLED` - Transaction has been cancelled by your customers.
`EXPIRED` - Transaction has not succeeded; expired.
`FAILURE` - Transaction has not succeeded; unknown reason.
`AUTHORIZED` - Transaction is authorized. | | | createdAt | String(RFC3339) | Creation time. | ISO 8601 date and time. | | returnUrl | String(2000) | Specifies the URL where your customers will be redirected to. | Specified in the request. | | returnUrls | [returnUrls](https://developers.cm.com/payments-platform/docs/schemas-5#returnurls)
Object | Specifies a URL where your customers will be redirected to per transaction status. For example, your customers will be redirected to `returnUrls.success` when the status of the transaction changes to `SUCCESS`. | Specified in the request. | Optional parameters [](https://developers.cm.com/payments-platform/docs/initialize-transaction#optional-parameters-1) ------------------------------------------------------------------------------------------------------------------------- | Parameter | Type | Description | Constraints | | --- | --- | --- | --- | | webhooks | Array of objects | Webhooks enable receiving a web request once a given event occurs. | Specified in the request. | | details | [details](https://developers.cm.com/payments-platform/docs/schemas-5#details)
Object | These are the details used to render the Apple Pay button in your own page. | This is nullable. | | refunds | [refund](https://developers.cm.com/payments-platform/docs/schemas-5#refund)
Object | Indicates refundedAmount and refundedPendingAmount. | | Response codes [](https://developers.cm.com/payments-platform/docs/initialize-transaction#response-codes) ------------------------------------------------------------------------------------------------------------- | HTTP status | Description | | --- | --- | | 201 | Transaction initialized. | | 4XX | Client error response (See message for details). This response is given when the user input was incorrect or something illegal was attempted (eg. using a service without having that service configured for the user, or not being authorized). | | 5XX | Server error response (See message for details). | Updated about 1 year ago * * * [](https://www.cm.com/) * [Privacy Policy](https://www.cm.com/app/legal/cm-com/privacy-policy/) * [Terms and Conditions](https://www.cm.com/app/legal/cm-com/terms-and-conditions/) * [Cookie Policy](https://www.cm.com/about-cm/cookie-policy/) Jump to Product page Conversational AI Cloud Mobile Service Cloud Mobile Marketing Cloud Messaging Ticketing Payments Platform Voice Sign --- # Create a Refund You can use this call to create a refund for a payment made with a Bancontact transaction. Prerequisite [](https://developers.cm.com/payments-platform/docs/create-a-refund-4#prerequisite) ---------------------------------------------------------------------------------------------------- Get an `access_token` and use it as 'Bearer' token in your request. Find more details [here](https://developers.cm.com/payments-platform/docs/authorization-3) . Request [](https://developers.cm.com/payments-platform/docs/create-a-refund-4#request) ------------------------------------------------------------------------------------------ Text `POST https://api.pay.cm.com/api/v1/paymentmethods/bancontact/v1/transactions/{transactionId}/refunds` JSON `{ "amount": 1200, "reason": "Refund required by customer." }` Optional parameters [](https://developers.cm.com/payments-platform/docs/create-a-refund-4#optional-parameters) ------------------------------------------------------------------------------------------------------------------ | Parameter | Type | Description | Constraints | | --- | --- | --- | --- | | amount | Int(1...99999999) | Denomination in the smallest currency subunit (e.g. eurocents). If empty, the refund amount will be the remaining available amount of the transaction (e.g. total payment amount minus already refunded amounts minus the amounts of the pending refund requests). | Must be lower than or equal to the original transaction amount. | | reason | String(255) | The description for the refund. | | Response [](https://developers.cm.com/payments-platform/docs/create-a-refund-4#response) -------------------------------------------------------------------------------------------- If refund has been successfully created then the response is the [Get Transaction](https://developers.cm.com/payments-platform/docs/get-transaction-4) response with an updated refunds.refundedAmount and refunds.refundedPendingAmount. Updated about 1 year ago * * * [](https://www.cm.com/) * [Privacy Policy](https://www.cm.com/app/legal/cm-com/privacy-policy/) * [Terms and Conditions](https://www.cm.com/app/legal/cm-com/terms-and-conditions/) * [Cookie Policy](https://www.cm.com/about-cm/cookie-policy/) Jump to Product page Conversational AI Cloud Mobile Service Cloud Mobile Marketing Cloud Messaging Ticketing Payments Platform Voice Sign --- # Get Transaction You can use this call to retrieve details of an Apple Pay transaction. Prerequisite [](https://developers.cm.com/payments-platform/docs/get-transaction-5#prerequisite) ---------------------------------------------------------------------------------------------------- Get an `access_token` and use it as 'Bearer' token in your request. Find more details [here](https://developers.cm.com/payments-platform/docs/authorization-3) . Request [](https://developers.cm.com/payments-platform/docs/get-transaction-5#request) ------------------------------------------------------------------------------------------ Text `GET https://api.pay.cm.com/api/v1/paymentmethods/apple-pay/v1/transactions/{transactionId}` Response [](https://developers.cm.com/payments-platform/docs/get-transaction-5#response) -------------------------------------------------------------------------------------------- JSON `{ "id": "8db1e7fa-ba8a-4189-92fd-67a20217443d", "orderId": "8db1e7fa-ba8a-4189-92fd-67a20217443d", "reference": "20210623130413", "amount": 1200, "currency": "EUR", "description": "Order at yourdomain.tld", "expiresAt": "2006-01-02T15:04:05Z", "language": "nl", "country": "NL", "webhooks": [ { "url": "https://yourdomain.tld/order-webhooks?purchaseId=order123", "events": [ "FINALSTATUS" ] }, { "url": "https://yourdomain.tld/payment-webhooks?purchaseId=order123", "events": [ "REFUND_STATUS" ] }, { "url": "https://yourdomain.tld/payment-webhooks?purchaseId=order123", "events": [ "STATUS_CHANGE" ] } ], "status": "OPEN", "details": { "merchantCountry": "DE", "serverUrl": "https://www.example.com/api/", "allowedCardNetworks": [ "mastercard" ], "merchantName": "My Merchant Name" }, "action": { "redirect": { "url": "https://checkout.tld/3ds/v2/creditcard/123" } }, "createdAt": "2006-01-02T15:04:05Z", "refunds": { "refundedAmount": 300, "refundedPendingAmount": 100 }, "returnUrls": { "success": "https://yourdomain.tld/order/payment-success.html", "cancelled": "https://yourdomain.tld/order/payment-cancelled.html", "expired": "https://yourdomain.tld/order/payment-expired.html", "failed": "https://yourdomain.tld/order/payment-failed.html" } }` Parameters [](https://developers.cm.com/payments-platform/docs/get-transaction-5#parameters) ------------------------------------------------------------------------------------------------ | Parameter | Type | Description | Constraints | | --- | --- | --- | --- | | id | String(36) | Transaction unique identifier. | | | orderId | String(36) | Unique identifier. | | | reference | String(1...255) | An identifier specified by you. If webhooks were specified in the request this identifier is added to the webhook request payload. | | | amount | Int(1...99999999) | Integer representing the amount of the checkout. Denomination in the smallest currency subunit (e.g. eurocents). | | | currency | String (ISO 4217) | Currency code. | ISO 4217 currency code. | | description | String(1...255) | Description of the transaction. | | | expiresAt | String(RFC3339) | Expiration time. | | | language | String(ISO 639-1) | Preferred language of the user interface. | | | country | String | Country of the Customer. | ISO 3166 Country Code. | | status | String | `OPEN` - Transaction has been created. This is the initial status.
`SUCCESS` - Transaction successfully paid.
`CANCELLED` - Transaction has been cancelled by your customers.
`EXPIRED` - Transaction has not succeeded; expired.
`FAILURE` - Transaction has not succeeded; unknown reason.
`AUTHORIZED` - Transaction is authorized. | | | createdAt | String(RFC3339) | Creation time. | ISO 8601 date and time. | | returnUrl | String(2000) | Specifies the URL where your customers will be redirected to. | Either `returnUrl` or `returnUrls` must be specified, but not both. | | returnUrls | [returnUrls](https://developers.cm.com/payments-platform/docs/schemas-5#returnurls)
Object | Specifies a URL where your customers will be redirected to per transaction status. For example, your customers will be redirected to `returnUrls.success` when the status of the transaction changes to `SUCCESS`. | Either `returnUrl` or `returnUrls` must be specified, but not both. | Optional parameters [](https://developers.cm.com/payments-platform/docs/get-transaction-5#optional-parameters) ------------------------------------------------------------------------------------------------------------------ | Parameter | Type | Description | Constraints | | --- | --- | --- | --- | | webhooks | Array of objects | Webhooks enable receiving a web request once a given event occurs. | Specified in the request. | | details | [details](https://developers.cm.com/payments-platform/docs/schemas-5#details)
Object | These are the details used to render the Apple Pay button in your own page. | This is nullable. | | action | [action](https://developers.cm.com/payments-platform/docs/schemas-5#action)
Object | The next action to be performed by you for this transaction. This includes a URL where you should `redirect` your customer to. | This is nullable. | | refunds | [refund](https://developers.cm.com/payments-platform/docs/schemas-5#refund)
Object | Indicates refundedAmount and refundedPendingAmount. | | Response codes [](https://developers.cm.com/payments-platform/docs/get-transaction-5#response-codes) -------------------------------------------------------------------------------------------------------- | HTTP status | Description | | --- | --- | | 200 | Transaction details are successfully retrieved. | | 4XX | Client error response (See message for details). This response is given when the User input was incorrect or something illegal was attempted (eg. using a service without having that service configured for the user, or not being authorized). | | 5XX | Server error response (See message for details). | Updated about 1 year ago * * * [](https://www.cm.com/) * [Privacy Policy](https://www.cm.com/app/legal/cm-com/privacy-policy/) * [Terms and Conditions](https://www.cm.com/app/legal/cm-com/terms-and-conditions/) * [Cookie Policy](https://www.cm.com/about-cm/cookie-policy/) Jump to Product page Conversational AI Cloud Mobile Service Cloud Mobile Marketing Cloud Messaging Ticketing Payments Platform Voice Sign --- # Create a Refund You can use this call to create a refund for a payment made with an Apple Pay transaction. Prerequisite [](https://developers.cm.com/payments-platform/docs/create-a-refund-5#prerequisite) ---------------------------------------------------------------------------------------------------- Get an `access_token` and use it as 'Bearer' token in your request. Find more details [here](https://developers.cm.com/payments-platform/docs/authorization-3) . Request [](https://developers.cm.com/payments-platform/docs/create-a-refund-5#request) ------------------------------------------------------------------------------------------ Text `POST https://api.pay.cm.com/api/v1/paymentmethods/apple-pay/v1/transactions/{transactionId}/refunds` JSON `{ "amount": 1200, "reason": "Refund required by customer." }` Optional parameters [](https://developers.cm.com/payments-platform/docs/create-a-refund-5#optional-parameters) ------------------------------------------------------------------------------------------------------------------ | Parameter | Type | Description | Constraints | | --- | --- | --- | --- | | amount | Int(1...99999999) | Denomination in the smallest currency subunit (e.g. eurocents). If empty, the refund amount will be the remaining available amount of the transaction (e.g. total payment amount minus already refunded amounts minus the amounts of the pending refund requests). | Must be lower than or equal to the original transaction amount. | | reason | String(255) | The description for the refund. | | Response [](https://developers.cm.com/payments-platform/docs/create-a-refund-5#response) -------------------------------------------------------------------------------------------- If refund has been successfully created then the response is the [Get Transaction](https://developers.cm.com/payments-platform/docs/get-transaction-5) response with an updated refunds.refundedAmount and refunds.refundedPendingAmount. Updated about 1 year ago * * * [](https://www.cm.com/) * [Privacy Policy](https://www.cm.com/app/legal/cm-com/privacy-policy/) * [Terms and Conditions](https://www.cm.com/app/legal/cm-com/terms-and-conditions/) * [Cookie Policy](https://www.cm.com/about-cm/cookie-policy/) Jump to Product page Conversational AI Cloud Mobile Service Cloud Mobile Marketing Cloud Messaging Ticketing Payments Platform Voice Sign --- # Authorize transaction You can use this call to authorize an existing Apple Pay transaction using the CM.com Online Payments API. Prerequisite [](https://developers.cm.com/payments-platform/docs/authorize-transaction#prerequisite) -------------------------------------------------------------------------------------------------------- Get an `access_token` and use it as 'Bearer' token in your request. Find more details [here](https://developers.cm.com/payments-platform/docs/authorization-3) . Request [](https://developers.cm.com/payments-platform/docs/authorize-transaction#request) ---------------------------------------------------------------------------------------------- Text `POST https://api.pay.cm.com/api/v1/paymentmethods/apple-pay/v1/transactions/{transactionId}/authorize` The request data is passed on as-is received from the Apple device in the on authorize payment event. **Modifications are not allowed**. Response [](https://developers.cm.com/payments-platform/docs/authorize-transaction#response) ------------------------------------------------------------------------------------------------ JSON `{ "id": "8db1e7fa-ba8a-4189-92fd-67a20217443d", "orderId": "8db1e7fa-ba8a-4189-92fd-67a20217443d", "reference": "20210623130413", "amount": 1200, "currency": "EUR", "description": "Order at yourdomain.tld", "expiresAt": "2006-01-02T15:04:05Z", "language": "nl", "country": "NL", "webhooks": [ { "url": "https://yourdomain.tld/order-webhooks?purchaseId=order123", "events": [ "FINALSTATUS" ] }, { "url": "https://yourdomain.tld/payment-webhooks?purchaseId=order123", "events": [ "REFUND_STATUS" ] }, { "url": "https://yourdomain.tld/payment-webhooks?purchaseId=order123", "events": [ "STATUS_CHANGE" ] } ], "status": "OPEN", "details": { "merchantCountry": "DE", "serverUrl": "https://www.example.com/api/", "allowedCardNetworks": [ "mastercard" ], "merchantName": "My Merchant Name" }, "action": { "redirect": { "url": "https://checkout.tld/3ds/v2/creditcard/123" } }, "createdAt": "2006-01-02T15:04:05Z", "refunds": { "refundedAmount": 300, "refundedPendingAmount": 100 }, "returnUrls": { "success": "https://yourdomain.tld/order/payment-success.html", "cancelled": "https://yourdomain.tld/order/payment-cancelled.html", "expired": "https://yourdomain.tld/order/payment-expired.html", "failed": "https://yourdomain.tld/order/payment-failed.html" } }` Parameters [](https://developers.cm.com/payments-platform/docs/authorize-transaction#parameters) ---------------------------------------------------------------------------------------------------- | Parameter | Type | Description | Constraints | | --- | --- | --- | --- | | id | String(36) | Transaction unique identifier. | | | orderId | String(36) | Unique identifier. | | | reference | String(1...255) | An identifier specified by you. If webhooks were specified in the request this identifier is added to the webhook request payload. | Specified in the `initialize transaction` request. | | amount | Int(1...99999999) | Integer representing the amount of the checkout. Denomination in the smallest currency subunit (e.g. eurocents). | Specified in the `initialize transaction` request. | | currency | String (ISO 4217) | Currency code. | Specified in the `initialize transaction` request. | | description | String(1...255) | Description of the transaction. | Specified in the `initialize transaction` request. | | expiresAt | String(RFC3339) | Expiration time. | ISO 8601 date and time. | | language | String(ISO 639-1) | Preferred language of the user interface. | Specified in the `initialize transaction` request. | | country | String | Country of the Customer. | Specified in the `initialize transaction` request. | | status | String | `OPEN` - Transaction has been created. This is the initial status.
`SUCCESS` - Transaction successfully paid.
`CANCELLED` - Transaction has been cancelled by your customers.
`EXPIRED` - Transaction has not succeeded; expired.
`FAILURE` - Transaction has not succeeded; unknown reason.
`AUTHORIZED` - Transaction is authorized. | | | createdAt | String(RFC3339) | Creation time. | ISO 8601 date and time. | | returnUrl | String(2000) | Specifies the URL where your customers will be redirected to. | Specified in the `initialize transaction` request. | | returnUrls | [returnUrls](https://developers.cm.com/payments-platform/docs/schemas-5#returnurls)
Object | Specifies a URL where your customers will be redirected to per transaction status. For example, your customers will be redirected to `returnUrls.success` when the status of the transaction changes to `SUCCESS`. | Specified in the `initialize transaction` request. | Optional parameters [](https://developers.cm.com/payments-platform/docs/authorize-transaction#optional-parameters) ---------------------------------------------------------------------------------------------------------------------- | Parameter | Type | Description | Constraints | | --- | --- | --- | --- | | webhooks | Array of objects | Webhooks enable receiving a web request once a given event occurs. | Specified in the `initialize transaction` request. | | details | [details](https://developers.cm.com/payments-platform/docs/schemas-5#details)
Object | These are the details used to render the Apple Pay button in your own page. | This is nullable. | | action | [action](https://developers.cm.com/payments-platform/docs/schemas-5#action)
Object | The next action to be performed by you for this transaction. This includes a URL where you should `redirect` your customer to. | This is nullable. | | refunds | [refund](https://developers.cm.com/payments-platform/docs/schemas-5#refund)
Object | Indicates refundedAmount and refundedPendingAmount. | | Response codes [](https://developers.cm.com/payments-platform/docs/authorize-transaction#response-codes) ------------------------------------------------------------------------------------------------------------ | HTTP status | Description | | --- | --- | | 201 | Transaction authorized. | | 4XX | Client error response (See message for details). This response is given when the user input was incorrect or something illegal was attempted (eg. using a service without having that service configured for the user, or not being authorized). | | 5XX | Server error response (See message for details). | Updated about 1 year ago * * * [](https://www.cm.com/) * [Privacy Policy](https://www.cm.com/app/legal/cm-com/privacy-policy/) * [Terms and Conditions](https://www.cm.com/app/legal/cm-com/terms-and-conditions/) * [Cookie Policy](https://www.cm.com/about-cm/cookie-policy/) Jump to Product page Conversational AI Cloud Mobile Service Cloud Mobile Marketing Cloud Messaging Ticketing Payments Platform Voice Sign --- # Google Pay ![](https://files.readme.io/6fc2c7f-google-pay-2.png) Integrate your own checkout with our API and allow your customers to make payments with Google Pay. How does it work? [](https://developers.cm.com/payments-platform/docs/googlepay-1#how-does-it-work) ======================================================================================================= You make the following steps possible by using [Google Pay JS API](https://developers.google.com/pay/api/web/reference/request-objects?authuser=1#IsReadyToPayRequest) together with our CM.com Online Payments API: 1. Customer opens your webshop, adds some items to the shopping basket, and clicks on 'Proceed to Checkout'. 2. After initializing a Google Pay transaction with the [initialize Google Pay transaction](https://developers.cm.com/payments-platform/docs/initialize-transaction-1) endpoint, you use the retrieved `details` to generate a Google Pay payment button (after checking that Google Pay is available for the device of the customer) on your checkout page. 3. The customer clicks on the Google Pay button. This will make you ask the Google payments client to load the payment data. As a result, a payment sheet will be displayed in the device of the customer, allowing them to select a card or enter a new card. When the customer has selected a card, the details are returned as payment data by the Google payments client. Within the payment data you will find the payment method data which must be sent as-is in your request to the [auhorize Google Pay transaction](https://developers.cm.com/payments-platform/docs/authorize-transaction-1) endpoint. After the Payment is authorized the response will contain a `redirect.url` where your customer should be redirected to, making the customer to land on a CM.com Online Payments API url. 4. When the status of the transaction is updated in the CM.com Online Payments API, you will receive a webhook (if you configured it for your Google Pay transaction), and the customer will be redirected to the Return URL(s) you specified when you initialized your Google Pay transaction. 5. You make a request to the [get Google Pay transaction](https://developers.cm.com/payments-platform/docs/get-transaction-6) endpoint, and use its latest details to update your system. > 📘 > > When using webhooks, be aware that they are only a "best effort" mechanism. Find more details [here](https://developers.cm.com/payments-platform/docs/webhooks-1) > . > > > ------------------------------------------------------------------------------------------------------------------------------------------------------------------------- Updated about 1 year ago * * * [](https://www.cm.com/) * [Privacy Policy](https://www.cm.com/app/legal/cm-com/privacy-policy/) * [Terms and Conditions](https://www.cm.com/app/legal/cm-com/terms-and-conditions/) * [Cookie Policy](https://www.cm.com/about-cm/cookie-policy/) Jump to Product page Conversational AI Cloud Mobile Service Cloud Mobile Marketing Cloud Messaging Ticketing Payments Platform Voice Sign --- # Schemas returnUrls [](https://developers.cm.com/payments-platform/docs/schemas-5#returnurls) ---------------------------------------------------------------------------------------- | Parameter | Type | Description | Constraints | Required | | --- | --- | --- | --- | --- | | success | String(1...2000) | Return URL to use when the transaction succeeds. | | ✅ | | cancelled | String(1...2000) | Return URL to use when the transaction is cancelled. | | ✅ | | expired | String(1...2000) | Return URL to use when the transaction is expired. | | ✅ | | failed | String(1...2000) | Return URL to use when the transaction is failed. | | ✅ | consumer [](https://developers.cm.com/payments-platform/docs/schemas-5#consumer) ------------------------------------------------------------------------------------ | Parameter | Type | Description | Constraints | Required | | --- | --- | --- | --- | --- | | name | [name](https://developers.cm.com/payments-platform/docs/schemas-5#name)
Object | Customer name. | | | | address | [address](https://developers.cm.com/payments-platform/docs/schemas-5#address)
Object | Customer address. | | ✅ | | email | String | Email provided by customer. | | ✅ | | businessName | String(1...35) | Business name. | | | | phone | String | Customer phone number. | | | | gender | String(1...2000) | Gender of the customer. | The possible values are: `m`, `f` , or `null`. | | | dateOfBirth | String | Date of birth of the customer. | | | name [](https://developers.cm.com/payments-platform/docs/schemas-5#name) ---------------------------------------------------------------------------- | Parameter | Type | Description | Constraints | Required | | --- | --- | --- | --- | --- | | firstName | String(1...35) | Customer first name. | | ✅ | | lastName | String(1...35) | Customer last name. | | ✅ | | middleName | String(1...35) | Customer middle name. | | | address [](https://developers.cm.com/payments-platform/docs/schemas-5#address) ---------------------------------------------------------------------------------- | Parameter | Type | Description | Constraints | Required | | --- | --- | --- | --- | --- | | street | String(1...100) | Street. | | | | houseNumber | String(1...35) | House and number. | | | | postalCode | String(1...35) | Postal code. | | | | city | String(1...35) | City. | | | | countryCode | String | Country code. | ISO 3166-1 country code. | ✅ | | state | String(1...40) | State. | | | | additionalData | String(1...35) | Additional address information. | | | details [](https://developers.cm.com/payments-platform/docs/schemas-5#details) ---------------------------------------------------------------------------------- | Parameter | Type | Description | Constraints | Required | | --- | --- | --- | --- | --- | | merchantCountry | String | The country code where the transaction is processed. | ISO 3166-1 alpha-2 country code. | | | serverUrl | String | The URL to the Mobile Pay Server. | | | | allowedCardNetworks | String | The supported card networks for Payment via Apple Pay. | The possible values are: `mastercard`, `visa`. | | | merchantName | String | The name to display on the the payment sheet. | | | action [](https://developers.cm.com/payments-platform/docs/schemas-5#action) -------------------------------------------------------------------------------- | Parameter | Type | Description | Constraints | Required | | --- | --- | --- | --- | --- | | redirect | [redirect](https://developers.cm.com/payments-platform/docs/schemas-5#redirect)
Object | Next action to be performed by merchant (or consumer) to complete the payment. | | | redirect [](https://developers.cm.com/payments-platform/docs/schemas-5#redirect) ------------------------------------------------------------------------------------ | Parameter | Type | Description | Constraints | Required | | --- | --- | --- | --- | --- | | url | String | URL where consumer should be redirected to by the merchant to perform the payment. | | | refund [](https://developers.cm.com/payments-platform/docs/schemas-5#refund) -------------------------------------------------------------------------------- | Parameter | Type | Description | Constraints | Required | | --- | --- | --- | --- | --- | | refundedAmount | Int(0...99999999) | Amount in the smallest currency subunit, as for example eurocents, that has already been refunded. | | ✅ | | refundedPendingAmount | Int(1...99999999) | Amount in the smallest currency subunit, as for example eurocents, that has been requested to be refunded. | | ✅ | Updated about 1 year ago * * * [](https://www.cm.com/) * [Privacy Policy](https://www.cm.com/app/legal/cm-com/privacy-policy/) * [Terms and Conditions](https://www.cm.com/app/legal/cm-com/terms-and-conditions/) * [Cookie Policy](https://www.cm.com/about-cm/cookie-policy/) Jump to Product page Conversational AI Cloud Mobile Service Cloud Mobile Marketing Cloud Messaging Ticketing Payments Platform Voice Sign --- # Payments Platform ![payments-dark icon](https://www.cm.com/app/aurora/svg/apps/large/default/payments.svg) Online Payments [](https://developers.cm.com/payments-platform/v22.06/#online-payments) ------------------------------------------------------------------------------------------- Online Payments API allows merchants to create Online Payments. [Find out more](https://developers.cm.com/payments-platform/docs/cm-payments) ![voice-dark icon](https://www.cm.com/app/aurora/svg/apps/large/default/pos-terminal.svg) POS Payments [](https://developers.cm.com/payments-platform/v22.06/#pos-payments) ------------------------------------------------------------------------------------- POS Payments covers both ECR (Electronic Cash Register) solutions and integrations, as well as Smart POS Terminals. We have solutions to connect external ECRs to Smart POS Terminals through our Cloud Integration solution. On top of that we also enable 3rd party integrators to integrate directly with our Android based Terminal app and run side by side on the Smart POS Terminal! [Find out more](https://developers.cm.com/payments-platform/v22.06/docs/pos-payments) ![payments-dark icon](https://www.cm.com/app/aurora/svg/apps/large/default/payments.svg) Online Payments (Legacy) [](https://developers.cm.com/payments-platform/v22.06/#online-payments-legacy) ----------------------------------------------------------------------------------------------------------- Online Payments API allows merchants to create Online Payments. [Find out more](https://developers.cm.com/payments-platform/v22.06/docs/introduction) [](https://www.cm.com/) * [Privacy Policy](https://www.cm.com/app/legal/cm-com/privacy-policy/) * [Terms and Conditions](https://www.cm.com/app/legal/cm-com/terms-and-conditions/) * [Cookie Policy](https://www.cm.com/about-cm/cookie-policy/) Jump to Product page Conversational AI Cloud Mobile Service Cloud Mobile Marketing Cloud Messaging Ticketing Payments Platform Voice Sign --- # Before integrating Prerequisites [](https://developers.cm.com/payments-platform/docs/introduction-6#prerequisites) --------------------------------------------------------------------------------------------------- For Google Pay the following prerequisites need to be fulfilled: * Enable Google Pay on your account: Google Pay (and relevant credit and debit card payment methods) needs to be enabled on your account. * Integration Checklist: To ensure that you have completed all the required steps in your web integration, check [integration checklist](https://developers.google.com/pay/api/web/guides/test-and-deploy/integration-checklist) . * Google Pay acceptance policy: All merchants must adhere to the Google Pay APIs [Acceptable Use Policy](https://payments.developers.google.com/terms/aup) and accept the terms defined in the [Google Pay API Terms of Service](https://payments.developers.google.com/terms/sellertos) . * Besides implementing the requests to [initialize Google Pay transaction](https://developers.cm.com/payments-platform/docs/initialize-transaction-1) , and [authorize Google Pay transaction](https://developers.cm.com/payments-platform/docs/authorize-transaction-1) on the CM.com Online Payments API, [Google Pay JS API](https://developers.google.com/pay/api/web/reference/request-objects?authuser=1#IsReadyToPayRequest) has to be used. More details about the Google Pay API can be found at: [Google Pay web developer documentation](https://developers.google.com/pay/api/web/overview) Updated about 1 year ago * * * [](https://www.cm.com/) * [Privacy Policy](https://www.cm.com/app/legal/cm-com/privacy-policy/) * [Terms and Conditions](https://www.cm.com/app/legal/cm-com/terms-and-conditions/) * [Cookie Policy](https://www.cm.com/about-cm/cookie-policy/) Jump to Product page Conversational AI Cloud Mobile Service Cloud Mobile Marketing Cloud Messaging Ticketing Payments Platform Voice Sign --- # Status Transitions Google Pay transaction statuses [](https://developers.cm.com/payments-platform/docs/status-transitions-copy-1#google-pay-transaction-statuses) -------------------------------------------------------------------------------------------------------------------------------------------------- `OPEN` - transaction has been created. This is the initial status. `AUTHORIZED` - transaction payment is authorized. `SUCCESS` - transaction has been successfully paid. `CANCELLED` - transaction has not succeeded; cancelled by the consumer. `EXPIRED` - transaction has not succeeded; expired. `FAILURE` - transaction has not succeeded; unknown reason. Status Transitions [](https://developers.cm.com/payments-platform/docs/status-transitions-copy-1#status-transitions) ------------------------------------------------------------------------------------------------------------------------ The diagram below shows all state transitions a transaction could go through. ![](https://files.readme.io/88f042a-State_-_GooglePay_Statuses.png) Once a transaction has been created the status will be `OPEN`. While the state of a transaction is `OPEN` a consumer can try to make a payment with it. Once a payment is successful, the transaction status will transition to `SUCCESS`. This is the happy-flow. At this point the consumer has paid and the funds will eventually make its way to your accounts. It can also happen that the payment of a transaction has been authorized, but not yet paid, in this case the status will be `AUTHORIZED`. Eventually it can transitions to `SUCCESS`. Of course there are other possibilities as you will have seen in the state diagram. It could transition to `CANCELLED` if the consumer did not complete the payment and instead clicked on the cancel button. It could transition to `EXPIRED` if the `expiresAt` timestamp has been reached and the transaction is still `OPEN`. It could transition to `FAILURE` if the payment failed. Updated about 1 year ago * * * [](https://www.cm.com/) * [Privacy Policy](https://www.cm.com/app/legal/cm-com/privacy-policy/) * [Terms and Conditions](https://www.cm.com/app/legal/cm-com/terms-and-conditions/) * [Cookie Policy](https://www.cm.com/about-cm/cookie-policy/) Jump to Product page Conversational AI Cloud Mobile Service Cloud Mobile Marketing Cloud Messaging Ticketing Payments Platform Voice Sign --- # Diagrams Create a Google Pay transaction [](https://developers.cm.com/payments-platform/docs/diagrams-4#create-a-google-pay-transaction) ----------------------------------------------------------------------------------------------------------------------------------- The CM.com Online Payments API enables you to create a Google Pay transaction. The diagram below presents the interaction that takes place between Consumer/Device, Merchant (You), CM.com Online Payments API, and Google when creating a Google Pay transaction: ![](https://files.readme.io/5344b11-SQ_-_GooglePay_Transaction.png) In the diagram above the following steps are performed: 1. A Merchant wants to enable Google Pay payments for a Consumer/Device. In order to do this, a Merchant makes a request to [initialize Google Pay transaction](https://developers.cm.com/payments-platform/docs/initialize-transaction-1) . 2. Merchant receives a successful transaction response including `details`. These details are passed to Consumer/Device because they are used to render the Google Pay button on the Device. 3. Checking for Google availability; before showing the Google Pay button to the Consumer/Device the availability of Google Pay needs to be checked. This must be done with the `isReadyToPay` method of the Google Payments client (PaymentsClient). For more details see: [Checking For Google Pay Availability](https://developers.google.com/pay/api/web/guides/tutorial?authuser=1#isreadytopay) , [PaymentsClient.isReadyToPay](https://developers.google.com/pay/api/web/reference/client?authuser=1#isReadyToPay) , [IsReadyToPayRequest](https://developers.google.com/pay/api/web/reference/request-objects?authuser=1#IsReadyToPayRequest) . 1. Example IsReadyToPayRequest: JSON `{ "apiVersion": 2, "apiVersionMinor": 0, "allowedPaymentMethods": [ { "type": "CARD", "parameters": { "allowedAuthMethods": ["PAN_ONLY", "CRYPTOGRAM_3DS"], "allowedCardNetworks": ["MASTERCARD", "VISA"] } } ] }` 2. Example javascript: JavaScript `function isReadyToPayWithGooglePay(environment, request, name) { const paymentsClient = getGooglePaymentsClient(environment); paymentsClient.isReadyToPay(JSON.parse(request)) .then(function (response) { console.info("Can pay with Google Pay: " + response.result); if (response.result) { addGooglePayButton(environment, name) } window.canPayWithGooglePay(response.result); }) .catch(function (e) { console.error("Error checking if ready to pay with Google Pay.", e); window.canPayWithGooglePay(false); }); } function addGooglePayButton(environment, name) { let elements = document.getElementsByName(name); if (elements.length != 0) { let element = elements.item(0); if (!element.hasChildNodes()) { // When there are child nodes the button was already added. const paymentsClient = getGooglePaymentsClient(environment); const button = paymentsClient.createButton({ onClick: function () { }, buttonType: "short", buttonColor: "black", buttonSizeMode: "fill" }); element.appendChild(button); } } else { console.error("No elements with name " + name); } } function getGooglePaymentsClient(environment) { if ( paymentsClient === null ) { paymentsClient = new google.payments.api.PaymentsClient({environment: environment}); } return paymentsClient; }` 4. Loading Payment Data; after the Consumer clicks on the Google Pay button the Google payments client should be asked to load the payment data. This will make the payment sheet pop-up appear, allowing the customer to select a card or enter a new card. 1. The merchant id, merchant name, allowed card networks, gateway (id), and country code (merchant country) for the request can be determined using the retrieved Google Pay transaction `details`. The merchant key should be used as `gatewayMerchantId`. Note that only `CRYPTOGRAM_3DS` is supported as allowed authentication method. For more details see: [Register an event handler for user gestures](https://developers.google.com/pay/api/web/guides/tutorial?authuser=1#event-handler) , [PaymentsClient.loadPaymentData](https://developers.google.com/pay/api/web/reference/client?authuser=1#loadPaymentData) , [PaymentDataRequest](https://developers.google.com/pay/api/web/reference/request-objects?authuser=1#PaymentDataRequest) . 1. Example PaymentDataRequest: `{ "apiVersion": 2, "apiVersionMinor": 0, "merchantInfo": { "merchantId": googlePayTransaction.details.merchantId, "merchantName": googlePayTransaction.details.merchantName, }, "allowedPaymentMethods": [ { "type": "CARD", "parameters": { "allowedAuthMethods": ["PAN_ONLY", "CRYPTOGRAM_3DS"], "allowedCardNetworks": googlePayTransaction.details.allowedCardNetworks, }, "tokenizationSpecification": { "type": "PAYMENT_GATEWAY", "parameters": { "gateway": googlePayTransaction.details.gatewayId, "gatewayMerchantId": googlePayTransaction.details.merchantKey, // The merchant key goes here } } } ], "transactionInfo": { "totalPriceStatus": "FINAL", "totalPrice": (googlePayTransaction.amount / 100).toString(), "currencyCode": googlePayTransaction.currency, "countryCode": googlePayTransaction.details.merchantCountry } }` 2. Example javascript: `/** * Authorize a Google Pay payment. * * @param {string} merchantKey The merchant key. * @param {string} orderKey The order key. * @param {string} serverUrl The url of the Payment System Mobile services: *
    *
  • Sandbox/test: https://testsecure.docdatapayments.com/mobile
  • *
  • Production: https://secure.docdatapayments.com/mobile
  • *
* @param {string} environment The environment of Google to use. Either production (value 'PRODUCTION') or test (value 'TEST'). * @param {json} request The PaymentDataRequest as JSON * @see Google Pay for Payments - Web - Tutorial */ function authorizeGooglePayPayment(googlePayTransaction, paymentDataRequest) { const paymentsClient = getGooglePaymentsClient(); paymentsClient.loadPaymentData(paymentDataRequest) .then(function(paymentData) { window.showGooglePaySpinner(); // handle the response processPayment(googlePayTransaction, paymentData)); }) .catch(function(e) { console.error(e); }); }` 5. Authorizing the payment; when the customer has selected a card, the details are returned as `paymentData` by the Google payments client. The `paymentData.paymentMethodData` must be sent as-is in your request to the [authorize Google Pay transaction](https://developers.cm.com/payments-platform/docs/authorize-transaction-1) endpoint. If this endpoint gives a successful response it will contain an `action.redirect.url` where customers should be redirected to. This will make them land on a CM.com Online Payments API 'redirect action' url. 1. Example javascript: ``/** * Process payment data returned by the Google Pay API * * @param googlePayTransaction * @param {object} paymentData response from Google Pay API after user approves payment * @see {@link https://developers.google.com/pay/api/web/reference/response-objects#PaymentData|PaymentData object reference} */ function processPayment(googlePayTransaction, paymentData) { // show returned data in developer console for debugging console.log("Payment data returned by Google Pay is: ", paymentData); let controller = new AbortController(); const signal = controller.signal; const reqOptions = { method: "POST", headers: { 'Content-Type': "application/json", Authorization: `Bearer ${document.getElementById('token').value}`, Accept: `application/json` }, mode: "cors", body: JSON.stringify(paymentData.paymentMethodData), signal: signal }; console.debug('Authorization URL:', `${googlePayTransaction.details.serverUrl}/api/v1/paymentmethods/google-pay/v1/transactions/${googlePayTransaction.id}/authorize`); document.getElementById('paymentLoader').classList.remove('d-none'); // Execute fetch fetch(`${googlePayTransaction.details.serverUrl}/api/v1/paymentmethods/google-pay/v1/transactions/${googlePayTransaction.id}/authorize`, reqOptions) .then(response => { if (!response.ok) { console.error(response); displayMessage(response.statusText); controller.abort(); } return response.json(); }) .then(result => { console.log('Authorization response:', result); let responseElement = document.getElementById('response'); let btnRedirect = document.getElementById('btnRedirect'); responseElement.innerHTML = `
${JSON.stringify(result, null, 2)}
`; responseElement.classList.remove('d-none'); btnRedirect.classList.remove('d-none'); document.getElementById('btnRedirect').addEventListener("click", function () { window.location.href = result.action.redirect?.url; }); document.querySelector('#gpay-container button').remove(); }) .catch(displayMessage) .finally(() => { displayStatus(false); }); }`` 6. Eventually the status of the CM.com Online Payments API transaction will be updated and that will redirect Consumers again from the 'redirect action' url to the returnUrl(s) specified by you when the transaction was initialized. 7. If you specified webhooks in the original request then CM.com Online Payments API will trigger the proper webhooks requests. **When using webhooks, be aware that they are only a "best effort" mechanism**. 8. You get eventually the latest details of the transaction by making a call to the get transaction endpoint. You can use the latest details to update your system. The API endpoints involved on this flow are: * [Initialize Transaction](https://developers.cm.com/payments-platform/docs/initialize-transaction-1) * [Authorize transaction](https://developers.cm.com/payments-platform/docs/authorize-transaction-1) * [Get Transaction](https://developers.cm.com/payments-platform/docs/get-transaction-6) Create a refund for the payment made with a Google Pay transaction [](https://developers.cm.com/payments-platform/docs/diagrams-4#create-a-refund-for-the-payment-made-with-a-google-pay-transaction) --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- The CM.com Online Payments API enables you to create a refund for the payment made with a Google Pay transaction. The diagram below presents the interaction that takes place between Merchant (You) and CM.com Online Payments API when requesting a refund for the payment made with a Google Pay transaction ![](https://files.readme.io/52b06a7-SQ_-GooglePay_Refund.png) The API endpoints involved on this flow are: * [Create a Refund](https://developers.cm.com/payments-platform/docs/create-a-refund-6) Updated about 1 year ago * * * [](https://www.cm.com/) * [Privacy Policy](https://www.cm.com/app/legal/cm-com/privacy-policy/) * [Terms and Conditions](https://www.cm.com/app/legal/cm-com/terms-and-conditions/) * [Cookie Policy](https://www.cm.com/about-cm/cookie-policy/) Jump to Product page Conversational AI Cloud Mobile Service Cloud Mobile Marketing Cloud Messaging Ticketing Payments Platform Voice Sign --- # Authorize transaction You can use this call to authorize an existing Google Pay transaction using the CM.com Online Payments API. Prerequisite [](https://developers.cm.com/payments-platform/docs/authorize-transaction-1#prerequisite) ---------------------------------------------------------------------------------------------------------- Get an `access_token` and use it as 'Bearer' token in your request. Find more details [here](https://developers.cm.com/payments-platform/docs/authorization-3) . Request [](https://developers.cm.com/payments-platform/docs/authorize-transaction-1#request) ------------------------------------------------------------------------------------------------ Text `POST https://api.pay.cm.com/api/v1/paymentmethods/google-pay/v1/transactions/{transactionId}/authorize` When the customer has selected a card in the payment sheet, the details are returned as `paymentData` by the Google payments client. The retrieved `paymentData.paymentMethodData` must be sent as-is in the request body to this endpoint. Response [](https://developers.cm.com/payments-platform/docs/authorize-transaction-1#response) -------------------------------------------------------------------------------------------------- JSON `{ "id": "8db1e7fa-ba8a-4189-92fd-67a20217443d", "orderId": "8db1e7fa-ba8a-4189-92fd-67a20217443d", "reference": "20210623130413", "amount": 1200, "currency": "EUR", "description": "Order at yourdomain.tld", "expiresAt": "2006-01-02T15:04:05Z", "language": "nl", "country": "NL", "webhooks": [ { "url": "https://yourdomain.tld/order-webhooks?purchaseId=order123", "events": [ "FINALSTATUS" ] }, { "url": "https://yourdomain.tld/payment-webhooks?purchaseId=order123", "events": [ "REFUND_STATUS" ] }, { "url": "https://yourdomain.tld/payment-webhooks?purchaseId=order123", "events": [ "STATUS_CHANGE" ] } ], "status": "OPEN", "details": { "merchantCountry": "DE", "gatewayId": "example-gateway", "environment": "TEST", "merchantId": "exampleMerchantId", "merchantName": "www.example.com", "merchantKey": "8db1e7fa-ba8a-4189-92fd-67a20217443d", "allowedCardNetworks": [ "AMEX" ], "serverUrl": "https://www.example.com/api/" }, "action": { "redirect": { "url": "https://checkout.tld/3ds/v2/creditcard/123" } }, "createdAt": "2006-01-02T15:04:05Z", "refunds": { "refundedAmount": 300, "refundedPendingAmount": 100 }, "returnUrls": { "success": "https://yourdomain.tld/order/payment-success.html", "cancelled": "https://yourdomain.tld/order/payment-cancelled.html", "expired": "https://yourdomain.tld/order/payment-expired.html", "failed": "https://yourdomain.tld/order/payment-failed.html" } }` Parameters [](https://developers.cm.com/payments-platform/docs/authorize-transaction-1#parameters) ------------------------------------------------------------------------------------------------------ | Parameter | Type | Description | Constraints | | --- | --- | --- | --- | | id | String(36) | Transaction unique identifier. | | | orderId | String(36) | Unique identifier. | | | reference | String(1...255) | An identifier specified by you. If webhooks were specified in the request this identifier is added to the webhook request payload. | Specified in the `initialize transaction` request. | | amount | Int(1...99999999) | Integer representing the amount of the checkout. Denomination in the smallest currency subunit (e.g. eurocents). | Specified in the `initialize transaction` request. | | currency | String (ISO 4217) | Currency code. | Specified in the `initialize transaction` request. | | description | String(1...255) | Description of the transaction. | Specified in the `initialize transaction` request. | | expiresAt | String(RFC3339) | Expiration time. | ISO 8601 date and time. | | language | String(ISO 639-1) | Preferred language of the user interface. | Specified in the `initialize transaction` request. | | country | String | Country of the Customer. | Specified in the `initialize transaction` request. | | status | String | `OPEN` - Transaction has been created. This is the initial status.
`SUCCESS` - Transaction successfully paid.
`CANCELLED` - Transaction has been cancelled by your customers.
`EXPIRED` - Transaction has not succeeded; expired.
`FAILURE` - Transaction has not succeeded; unknown reason.
`AUTHORIZED` - Transaction is authorized. | | | createdAt | String(RFC3339) | Creation time. | ISO 8601 date and time. | | returnUrl | String(2000) | Specifies the URL where your customers will be redirected to. | Specified in the `initialize transaction` request. | | returnUrls | [returnUrls](https://developers.cm.com/payments-platform/docs/schemas-6#returnurls)
Object | Specifies a URL where your customers will be redirected to per transaction status. For example, your customers will be redirected to `returnUrls.success` when the status of the transaction changes to `SUCCESS`. | Specified in the `initialize transaction` request. | Optional parameters [](https://developers.cm.com/payments-platform/docs/authorize-transaction-1#optional-parameters) ------------------------------------------------------------------------------------------------------------------------ | Parameter | Type | Description | Constraints | | --- | --- | --- | --- | | webhooks | Array of objects | Webhooks enable receiving a web request once a given event occurs. | Specified in the `initialize transaction` request. | | details | [details](https://developers.cm.com/payments-platform/docs/schemas-6#details)
Object | These are the details used to render the Google Pay button in your own page. | This is nullable. | | action | [action](https://developers.cm.com/payments-platform/docs/schemas-6#action)
Object | The next action to be performed by you for this transaction. This includes a URL where you should `redirect` your customer to. | This is nullable. | | refunds | [refund](https://developers.cm.com/payments-platform/docs/schemas-6#refund)
Object | Indicates refundedAmount and refundedPendingAmount. | | Response codes [](https://developers.cm.com/payments-platform/docs/authorize-transaction-1#response-codes) -------------------------------------------------------------------------------------------------------------- | HTTP status | Description | | --- | --- | | 201 | Transaction authorized. | | 4XX | Client error response (See message for details). This response is given when the user input was incorrect or something illegal was attempted (eg. using a service without having that service configured for the user, or not being authorized). | | 5XX | Server error response (See message for details). | Updated about 1 year ago * * * [](https://www.cm.com/) * [Privacy Policy](https://www.cm.com/app/legal/cm-com/privacy-policy/) * [Terms and Conditions](https://www.cm.com/app/legal/cm-com/terms-and-conditions/) * [Cookie Policy](https://www.cm.com/about-cm/cookie-policy/) Jump to Product page Conversational AI Cloud Mobile Service Cloud Mobile Marketing Cloud Messaging Ticketing Payments Platform Voice Sign --- # Create a Refund You can use this call to create a refund for a payment made with a Google Pay transaction. Prerequisite [](https://developers.cm.com/payments-platform/docs/create-a-refund-6#prerequisite) ---------------------------------------------------------------------------------------------------- Get an `access_token` and use it as 'Bearer' token in your request. Find more details [here](https://developers.cm.com/payments-platform/docs/authorization-3) . Request [](https://developers.cm.com/payments-platform/docs/create-a-refund-6#request) ------------------------------------------------------------------------------------------ Text `POST https://api.pay.cm.com/api/v1/paymentmethods/google-pay/v1/transactions/{transactionId}/refunds` JSON `{ "amount": 1200, "reason": "Refund required by customer." }` Optional parameters [](https://developers.cm.com/payments-platform/docs/create-a-refund-6#optional-parameters) ------------------------------------------------------------------------------------------------------------------ | Parameter | Type | Description | Constraints | | --- | --- | --- | --- | | amount | Int(1...99999999) | Denomination in the smallest currency subunit (e.g. eurocents). If empty, the refund amount will be the remaining available amount of the transaction (e.g. total payment amount minus already refunded amounts minus the amounts of the pending refund requests). | Must be lower than or equal to the original transaction amount. | | reason | String(255) | The description for the refund. | | Response [](https://developers.cm.com/payments-platform/docs/create-a-refund-6#response) -------------------------------------------------------------------------------------------- If refund has been successfully created then the response is the [Get Transaction](https://developers.cm.com/payments-platform/docs/get-transaction-6) response with an updated refunds.refundedAmount and refunds.refundedPendingAmount. Updated about 1 year ago * * * [](https://www.cm.com/) * [Privacy Policy](https://www.cm.com/app/legal/cm-com/privacy-policy/) * [Terms and Conditions](https://www.cm.com/app/legal/cm-com/terms-and-conditions/) * [Cookie Policy](https://www.cm.com/about-cm/cookie-policy/) Jump to Product page Conversational AI Cloud Mobile Service Cloud Mobile Marketing Cloud Messaging Ticketing Payments Platform Voice Sign --- # Initialize transaction You can use this call to initialize a new Google Pay transaction. Prerequisite [](https://developers.cm.com/payments-platform/docs/initialize-transaction-1#prerequisite) ----------------------------------------------------------------------------------------------------------- Get an `access_token` and use it as 'Bearer' token in your request. Find more details [here](https://developers.cm.com/payments-platform/docs/authorization-3) . Request [](https://developers.cm.com/payments-platform/docs/initialize-transaction-1#request) ------------------------------------------------------------------------------------------------- Text `POST https://api.pay.cm.com/api/v1/paymentmethods/google-pay/v1/transactions/initialize` ### Request body examples [](https://developers.cm.com/payments-platform/docs/initialize-transaction-1#request-body-examples) These are only some examples of the request body to create a transaction: Full Request with ReturnURLsFull Request with ReturnURLMinimal Request with ReturnURL `{ "reference": "20210623130413", "description": "Order at yourdomain.tld", "amount": 1200, "currency": "EUR", "expiresAt": "2006-01-02T15:04:05Z", "language": "nl", "consumer": { "name": { "firstName": "John", "lastName": "Lopez", "middleName": "A" }, "address": { "street": "Rustenburgerlaan", "houseNumber": "25", "postalCode": "2012AL", "city": "Haarlem", "countryCode": "NL", "state": "Noord-Holland", "additionalData": "Right-hand portal" }, "email": "[[email protected]](https://developers.cm.com/cdn-cgi/l/email-protection) ", "businessName": "CM", "phone": "06-95613259", "gender": null, "dateOfBirth": "1996-12-01" }, "webhooks": [ { "url": "https://yourdomain.tld/order-webhooks?purchaseId=order123", "events": [ "FINALSTATUS" ] }, { "url": "https://yourdomain.tld/payment-webhooks?purchaseId=order123", "events": [ "REFUND_STATUS" ] }, { "url": "https://yourdomain.tld/payment-webhooks?purchaseId=order123", "events": [ "STATUS_CHANGE" ] } ], "returnUrls": { "success": "https://yourdomain.tld/order/payment-success.html", "cancelled": "https://yourdomain.tld/order/payment-cancelled.html", "expired": "https://yourdomain.tld/order/payment-expired.html", "failed": "https://yourdomain.tld/order/payment-failed.html" } }` `{ "reference": "20210623130413", "description": "Order at yourdomain.tld", "amount": 1200, "currency": "EUR", "expiresAt": "2006-01-02T15:04:05Z", "language": "nl", "consumer": { "name": { "firstName": "John", "lastName": "Lopez", "middleName": "A" }, "address": { "street": "Rustenburgerlaan", "houseNumber": "25", "postalCode": "2012AL", "city": "Haarlem", "countryCode": "NL", "state": "Noord-Holland", "additionalData": "Right-hand portal" }, "email": "[[email protected]](https://developers.cm.com/cdn-cgi/l/email-protection) ", "businessName": "CM", "phone": "06-95613259", "gender": null, "dateOfBirth": "1996-12-01" }, "webhooks": [ { "url": "https://yourdomain.tld/order-webhooks?purchaseId=order123", "events": [ "FINALSTATUS" ] }, { "url": "https://yourdomain.tld/payment-webhooks?purchaseId=order123", "events": [ "REFUND_STATUS" ] }, { "url": "https://yourdomain.tld/payment-webhooks?purchaseId=order123", "events": [ "STATUS_CHANGE" ] } ], "returnUrl": "https://yourdomain.tld/order/payment-completed.html" }` `{ "reference": "20210623130413", "description": "Order at yourdomain.tld", "amount": 1200, "expiresAt": "2006-01-02T15:04:05Z", "language": "nl", "returnUrl": "https://yourdomain.tld/order/payment-completed.html" }` "**Full Request with ReturnURLs**" and "**Full Request with ReturnURL**" are examples where all the request parameters are provided. If `returnUrls` is defined then customers will be redirected to a different URL depending on the status of the transaction when the payment process is completed. If `returnUrl` is defined then customers will be redirected to the same URL no matter the status of the transaction when the payment process is completed. "**Minimal Request with ReturnURLs**" is an example of the minimal request to create a transaction. This example, is using `returnUrls`, but you can replace it for `returnUrl` depending on what is better for your use case. Parameters [](https://developers.cm.com/payments-platform/docs/initialize-transaction-1#parameters) ------------------------------------------------------------------------------------------------------- | Parameter | Type | Description | Constraints | | --- | --- | --- | --- | | reference | String(1...255) | An identifier specified by you. If webhooks were specified in the request this identifier is added to the webhook request payload. | | | description | String(1...255) | Description of the transaction. | | | amount | Int(1...99999999) | Integer representing the amount of the transaction. Denomination in the smallest currency subunit (e.g. eurocents). | | | expiresAt | String(RFC3339) | Expiration time. | ISO 8601 date and time. | | language | String(ISO 639-1) | Preferred language of the user interface. | ISO 639-1 language. | | returnUrl | String(2000) | Specifies the URL where your customers will be redirected to. | Either `returnUrl` or `returnUrls` must be specified, but not both. | | returnUrls | [returnUrls](https://developers.cm.com/payments-platform/docs/schemas-6#returnurls)
Object | Specifies a URL where your customers will be redirected to per transaction status. For example, your customers will be redirected to `returnUrls.success` when the status of the transaction changes to `SUCCESS`. | Either `returnUrl` or `returnUrls` must be specified, but not both. | Optional parameters [](https://developers.cm.com/payments-platform/docs/initialize-transaction-1#optional-parameters) ------------------------------------------------------------------------------------------------------------------------- | Parameter | Type | Description | Constraints | | --- | --- | --- | --- | | currency | String (ISO 4217) | Currency code. | ISO 4217 currency code. | | consumer | [consumer](https://developers.cm.com/payments-platform/docs/schemas-6#consumer)
Object | Customer details. | The following fields are mandatory: `name.firstName`, `name.lastName`, `address.street`, `address.houseNumber`, `address.postalCode`, `address.city`, `address.countryCode`, `email`. | | webhooks | Array of objects | Webhooks enable receiving a web request once a given event occurs. | Find more details [here](https://developers.cm.com/payments-platform/docs/webhooks-1)
. | Response [](https://developers.cm.com/payments-platform/docs/initialize-transaction-1#response) --------------------------------------------------------------------------------------------------- JSON `{ "id": "8db1e7fa-ba8a-4189-92fd-67a20217443d", "orderId": "8db1e7fa-ba8a-4189-92fd-67a20217443d", "reference": "20210623130413", "amount": 1200, "currency": "EUR", "description": "Order at yourdomain.tld", "expiresAt": "2006-01-02T15:04:05Z", "language": "nl", "country": "NL", "webhooks": [ { "url": "https://yourdomain.tld/order-webhooks?purchaseId=order123", "events": [ "FINALSTATUS" ] }, { "url": "https://yourdomain.tld/payment-webhooks?purchaseId=order123", "events": [ "REFUND_STATUS" ] }, { "url": "https://yourdomain.tld/payment-webhooks?purchaseId=order123", "events": [ "STATUS_CHANGE" ] } ], "status": "OPEN", "details": { "merchantCountry": "DE", "gatewayId": "example-gateway", "environment": "TEST", "merchantId": "exampleMerchantId", "merchantName": "www.example.com", "merchantKey": "8db1e7fa-ba8a-4189-92fd-67a20217443d", "allowedCardNetworks": [ "AMEX" ], "serverUrl": "https://www.example.com/api/" }, "action": { "redirect": { "url": "https://checkout.tld/3ds/v2/creditcard/123" } }, "createdAt": "2006-01-02T15:04:05Z", "refunds": { "refundedAmount": 300, "refundedPendingAmount": 100 }, "returnUrls": { "success": "https://yourdomain.tld/order/payment-success.html", "cancelled": "https://yourdomain.tld/order/payment-cancelled.html", "expired": "https://yourdomain.tld/order/payment-expired.html", "failed": "https://yourdomain.tld/order/payment-failed.html" } }` Parameters [](https://developers.cm.com/payments-platform/docs/initialize-transaction-1#parameters-1) --------------------------------------------------------------------------------------------------------- | Parameter | Type | Description | Constraints | | --- | --- | --- | --- | | id | String(36) | Transaction unique identifier. | | | orderId | String(36) | Unique identifier. | | | reference | String(1...255) | An identifier specified by you. If webhooks were specified in the request this identifier is added to the webhook request payload. | Specified in the request. | | amount | Int(1...99999999) | Integer representing the amount of the checkout. Denomination in the smallest currency subunit (e.g. eurocents). | Specified in the request. | | currency | String (ISO 4217) | Currency code. | Specified in the request. | | description | String(1...255) | Description of the transaction. | Specified in the request. | | expiresAt | String(RFC3339) | Expiration time. | Specified in the request. | | language | String(ISO 639-1) | Preferred language of the user interface. | Specified in the request. | | country | String | Country of the Customer. | | | status | String | `OPEN` - Transaction has been created. This is the initial status.
`SUCCESS` - Transaction successfully paid.
`CANCELLED` - Transaction has been cancelled by your customers.
`EXPIRED` - Transaction has not succeeded; expired.
`FAILURE` - Transaction has not succeeded; unknown reason.
`AUTHORIZED` - Transaction is authorized. | | | createdAt | String(RFC3339) | Creation time. | ISO 8601 date and time. | | returnUrl | String(2000) | Specifies the URL where your customers will be redirected to. | Specified in the request. | | returnUrls | [returnUrls](https://developers.cm.com/payments-platform/docs/schemas-6#returnurls)
Object | Specifies a URL where your customers will be redirected to per transaction status. For example, your customers will be redirected to `returnUrls.success` when the status of the transaction changes to `SUCCESS`. | Specified in the request. | Optional parameters [](https://developers.cm.com/payments-platform/docs/initialize-transaction-1#optional-parameters-1) --------------------------------------------------------------------------------------------------------------------------- | Parameter | Type | Description | Constraints | | --- | --- | --- | --- | | webhooks | Array of objects | Webhooks enable receiving a web request once a given event occurs. | Specified in the request. | | details | [details](https://developers.cm.com/payments-platform/docs/schemas-6#details)
Object | These are the details used to render the Google Pay button in your own page. | This is nullable. | | refunds | [refund](https://developers.cm.com/payments-platform/docs/schemas-6#refund)
Object | Indicates refundedAmount and refundedPendingAmount. | | Response codes [](https://developers.cm.com/payments-platform/docs/initialize-transaction-1#response-codes) --------------------------------------------------------------------------------------------------------------- | HTTP status | Description | | --- | --- | | 201 | Transaction initialized. | | 4XX | Client error response (See message for details). This response is given when the user input was incorrect or something illegal was attempted (eg. using a service without having that service configured for the user, or not being authorized). | | 5XX | Server error response (See message for details). | Updated about 1 year ago * * * [](https://www.cm.com/) * [Privacy Policy](https://www.cm.com/app/legal/cm-com/privacy-policy/) * [Terms and Conditions](https://www.cm.com/app/legal/cm-com/terms-and-conditions/) * [Cookie Policy](https://www.cm.com/about-cm/cookie-policy/) Jump to Product page Conversational AI Cloud Mobile Service Cloud Mobile Marketing Cloud Messaging Ticketing Payments Platform Voice Sign --- # Dynamic Integration In the settings of Agent Inbox it is possible to configure the endpoints with headers and also get the authentication (API key and API secret) for the POST requests. Go to the Settings > Integrations > Dynamic API and hit the "Add"-button. Now you can configure the integration according to your wishes. Authentication [](https://developers.cm.com/mobile-service-cloud/docs/dynamic-integration#authentication) ------------------------------------------------------------------------------------------------------------- The authentication of the dynamic API is done by a pre shared key which must be communicated to Agent Inbox. You can define an API key and secret in the Agent Inbox configuration. When issuing requests to the dynamic API endpoint you have to include a Basic authentication header. The value you have to sent is a base64-encoding of `{apiKey}:{apiSecret}`. For example you have set up API key to `abc` and API secret to `def`. The value would be `base64(abc:def)`, which resolves to `YWJjOmRlZg==`. The full authorization header is: `Authorization: Basic YWJjOmRlZg==` The Dynamic API has five endpoints and two POSTs, which are explained in separate chapters: * [Customer Information](https://developers.cm.com/mobile-service-cloud/docs/customer-information) * [Orders List](https://developers.cm.com/mobile-service-cloud/docs/orders-list) * [Order Details](https://developers.cm.com/mobile-service-cloud/docs/order-details) * [Search](https://developers.cm.com/mobile-service-cloud/docs/search) * [Customer Lifetime](https://developers.cm.com/mobile-service-cloud/docs/customer-lifetime) * [Customer POST](https://developers.cm.com/mobile-service-cloud/docs/customer-post) * [Order POST](https://developers.cm.com/mobile-service-cloud/docs/order-post) Updated over 1 year ago * * * [](https://www.cm.com/) * [Privacy Policy](https://www.cm.com/app/legal/cm-com/privacy-policy/) * [Terms and Conditions](https://www.cm.com/app/legal/cm-com/terms-and-conditions/) * [Cookie Policy](https://www.cm.com/about-cm/cookie-policy/) Jump to Product page Conversational AI Cloud Mobile Service Cloud Mobile Marketing Cloud Messaging Ticketing Payments Platform Voice Sign --- # Changelog [PG 1.27.0](https://developers.cm.com/payments-platform/v22.06/changelog/pg-1270) ================================================================================== 13 days ago by [\[email protected\]](https://developers.cm.com/cdn-cgi/l/email-protection) These are the changes we’ll be releasing on acceptance on 08-10-2025 [PG 1.26.2](https://developers.cm.com/payments-platform/v22.06/changelog/pg-1262) ================================================================================== 27 days ago by [\[email protected\]](https://developers.cm.com/cdn-cgi/l/email-protection) The following changes will be deployed to acceptance on 24-09-2025. [PS 25.15.0](https://developers.cm.com/payments-platform/v22.06/changelog/psp-ps-25-15) ======================================================================================== about 1 month ago by ReadMe API Feature Changes [PG 1.26.1](https://developers.cm.com/payments-platform/v22.06/changelog/pg-1261) ================================================================================== about 1 month ago by [\[email protected\]](https://developers.cm.com/cdn-cgi/l/email-protection) The following changes will be deployed to acceptance on 10-09-2025 before going to production after 2 weeks. [PS 25.12](https://developers.cm.com/payments-platform/v22.06/changelog/psp-ps-25-12) ====================================================================================== 4 months ago by ReadMe API Feature Changes [PS 25.06.0](https://developers.cm.com/payments-platform/v22.06/changelog/psp-ps-25-06) ======================================================================================== 9 months ago by ReadMe API Various bug fixes and optimizations. [PS 24.11](https://developers.cm.com/payments-platform/v22.06/changelog/psp-ps-24-11) ====================================================================================== 11 months ago by ReadMe API Feature changes [PS 24.10](https://developers.cm.com/payments-platform/v22.06/changelog/psp-ps-24-10) ====================================================================================== about 1 year ago by ReadMe API Feature changes [PS 24.09](https://developers.cm.com/payments-platform/v22.06/changelog/psp-ps-24-09) ====================================================================================== over 1 year ago by ReadMe API Bug Fixes improved [PS 24.08](https://developers.cm.com/payments-platform/v22.06/changelog/psp-ps-24-08) ====================================================================================== over 1 year ago by ReadMe API * Features * Improvided the client side encryption library to allow merchant key and/or merchant name [](https://www.cm.com/) * [Privacy Policy](https://www.cm.com/app/legal/cm-com/privacy-policy/) * [Terms and Conditions](https://www.cm.com/app/legal/cm-com/terms-and-conditions/) * [Cookie Policy](https://www.cm.com/about-cm/cookie-policy/) Jump to Product page Conversational AI Cloud Mobile Service Cloud Mobile Marketing Cloud Messaging Ticketing Payments Platform Voice Sign --- # About Welcome to the documentation site of Agent Inbox API, part of [Mobile Service Cloud](https://developers.cm.com/mobile-service-cloud/docs/msc) . MSC Agent Inbox is a leading conversational helpdesk system designed to help customer service teams deliver excellent customer service experiences in the most efficient way. The get the most out of the your Agent Inbox helpdesk system, you can connect several system in different ways. Updated over 1 year ago * * * [](https://www.cm.com/) * [Privacy Policy](https://www.cm.com/app/legal/cm-com/privacy-policy/) * [Terms and Conditions](https://www.cm.com/app/legal/cm-com/terms-and-conditions/) * [Cookie Policy](https://www.cm.com/about-cm/cookie-policy/) Jump to Product page Conversational AI Cloud Mobile Service Cloud Mobile Marketing Cloud Messaging Ticketing Payments Platform Voice Sign --- # in3 ![](https://files.readme.io/c5675ee56b9b8e3c4f43593cd7d8d3c0a9595641d080282985003b15fbff3fae-iDEAL_in3_RGB_onwhite_compact.png) Integrate your own checkout with our API and allow your customers to make payments with in3. How does it work? [](https://developers.cm.com/payments-platform/docs/in3-1#how-does-it-work) ================================================================================================= 1. Customer opens your webshop, adds some items to the shopping basket, and clicks on 'Proceed to Checkout'. 2. Customer lands on your own checkout, and selects iDEAL in3. 3. After creating an in3 transaction using the [create in3 transaction](https://developers.cm.com/payments-platform/docs/create-transaction-5) endpoint, you redirect the customer to the provided URL. 4. The customer completes the first instalment payment, you receive a webhook (if you configured it for your in3 transaction), and the customer is redirected to the Return URL(s) you specified on your in3 transaction. 5. You make a request to the [get in3 transaction](https://developers.cm.com/payments-platform/docs/get-transaction-7) endpoint, and use its latest details to update your system. > 📘 > > When using webhooks, be aware that they are only a "best effort" mechanism. Find more details [here](https://developers.cm.com/payments-platform/docs/webhooks-1) > . > > > ------------------------------------------------------------------------------------------------------------------------------------------------------------------------- Updated 11 months ago * * * [](https://www.cm.com/) * [Privacy Policy](https://www.cm.com/app/legal/cm-com/privacy-policy/) * [Terms and Conditions](https://www.cm.com/app/legal/cm-com/terms-and-conditions/) * [Cookie Policy](https://www.cm.com/about-cm/cookie-policy/) Jump to Product page Conversational AI Cloud Mobile Service Cloud Mobile Marketing Cloud Messaging Ticketing Payments Platform Voice Sign --- # Get Transaction You can use this call to retrieve details of a Google Pay transaction. Prerequisite [](https://developers.cm.com/payments-platform/docs/get-transaction-6#prerequisite) ---------------------------------------------------------------------------------------------------- Get an `access_token` and use it as 'Bearer' token in your request. Find more details [here](https://developers.cm.com/payments-platform/docs/authorization-3) . Request [](https://developers.cm.com/payments-platform/docs/get-transaction-6#request) ------------------------------------------------------------------------------------------ Text `GET https://api.pay.cm.com/api/v1/paymentmethods/google-pay/v1/transactions/{transactionId}` Response [](https://developers.cm.com/payments-platform/docs/get-transaction-6#response) -------------------------------------------------------------------------------------------- JSON `{ "id": "8db1e7fa-ba8a-4189-92fd-67a20217443d", "orderId": "8db1e7fa-ba8a-4189-92fd-67a20217443d", "reference": "20210623130413", "amount": 1200, "currency": "EUR", "description": "Order at yourdomain.tld", "expiresAt": "2006-01-02T15:04:05Z", "language": "nl", "country": "NL", "webhooks": [ { "url": "https://yourdomain.tld/order-webhooks?purchaseId=order123", "events": [ "FINALSTATUS" ] }, { "url": "https://yourdomain.tld/payment-webhooks?purchaseId=order123", "events": [ "REFUND_STATUS" ] }, { "url": "https://yourdomain.tld/payment-webhooks?purchaseId=order123", "events": [ "STATUS_CHANGE" ] } ], "status": "OPEN", "details": { "merchantCountry": "DE", "gatewayId": "example-gateway", "environment": "TEST", "merchantId": "exampleMerchantId", "merchantName": "www.example.com", "merchantKey": "8db1e7fa-ba8a-4189-92fd-67a20217443d", "allowedCardNetworks": [ "AMEX" ], "serverUrl": "https://www.example.com/api/" }, "action": { "redirect": { "url": "https://checkout.tld/3ds/v2/creditcard/123" } }, "createdAt": "2006-01-02T15:04:05Z", "refunds": { "refundedAmount": 300, "refundedPendingAmount": 100 }, "returnUrls": { "success": "https://yourdomain.tld/order/payment-success.html", "cancelled": "https://yourdomain.tld/order/payment-cancelled.html", "expired": "https://yourdomain.tld/order/payment-expired.html", "failed": "https://yourdomain.tld/order/payment-failed.html" } }` Parameters [](https://developers.cm.com/payments-platform/docs/get-transaction-6#parameters) ------------------------------------------------------------------------------------------------ | Parameter | Type | Description | Constraints | | --- | --- | --- | --- | | id | String(36) | Transaction unique identifier. | | | orderId | String(36) | Unique identifier. | | | reference | String(1...255) | An identifier specified by you. If webhooks were specified in the request this identifier is added to the webhook request payload. | | | amount | Int(1...99999999) | Integer representing the amount of the checkout. Denomination in the smallest currency subunit (e.g. eurocents). | | | currency | String (ISO 4217) | Currency code. | ISO 4217 currency code. | | description | String(1...255) | Description of the transaction. | | | expiresAt | String(RFC3339) | Expiration time. | | | language | String(ISO 639-1) | Preferred language of the user interface. | | | country | String | Country of the Customer. | ISO 3166 Country Code. | | status | String | `OPEN` - Transaction has been created. This is the initial status.
`SUCCESS` - Transaction successfully paid.
`CANCELLED` - Transaction has been cancelled by your customers.
`EXPIRED` - Transaction has not succeeded; expired.
`FAILURE` - Transaction has not succeeded; unknown reason.
`AUTHORIZED` - Transaction is authorized. | | | createdAt | String(RFC3339) | Creation time. | ISO 8601 date and time. | | returnUrl | String(2000) | Specifies the URL where your customers will be redirected to. | Either `returnUrl` or `returnUrls` must be specified, but not both. | | returnUrls | [returnUrls](https://developers.cm.com/payments-platform/docs/schemas-6#returnurls)
Object | Specifies a URL where your customers will be redirected to per transaction status. For example, your customers will be redirected to `returnUrls.success` when the status of the transaction changes to `SUCCESS`. | Either `returnUrl` or `returnUrls` must be specified, but not both. | Optional parameters [](https://developers.cm.com/payments-platform/docs/get-transaction-6#optional-parameters) ------------------------------------------------------------------------------------------------------------------ | Parameter | Type | Description | Constraints | | --- | --- | --- | --- | | webhooks | Array of objects | Webhooks enable receiving a web request once a given event occurs. | Specified in the request. | | details | [details](https://developers.cm.com/payments-platform/docs/schemas-6#details)
Object | These are the details used to render the Apple Pay button in your own page. | This is nullable. | | action | [action](https://developers.cm.com/payments-platform/docs/schemas-6#action)
Object | The next action to be performed by you for this transaction. This includes a URL where you should `redirect` your customer to. | This is nullable. | | refunds | [refund](https://developers.cm.com/payments-platform/docs/schemas-6#refund)
Object | Indicates refundedAmount and refundedPendingAmount. | | Response codes [](https://developers.cm.com/payments-platform/docs/get-transaction-6#response-codes) -------------------------------------------------------------------------------------------------------- | HTTP status | Description | | --- | --- | | 200 | Transaction details are successfully retrieved. | | 4XX | Client error response (See message for details). This response is given when the User input was incorrect or something illegal was attempted (eg. using a service without having that service configured for the user, or not being authorized). | | 5XX | Server error response (See message for details). | Updated about 1 year ago * * * [](https://www.cm.com/) * [Privacy Policy](https://www.cm.com/app/legal/cm-com/privacy-policy/) * [Terms and Conditions](https://www.cm.com/app/legal/cm-com/terms-and-conditions/) * [Cookie Policy](https://www.cm.com/about-cm/cookie-policy/) Jump to Product page Conversational AI Cloud Mobile Service Cloud Mobile Marketing Cloud Messaging Ticketing Payments Platform Voice Sign --- # Diagrams Create an in3 transaction [](https://developers.cm.com/payments-platform/docs/diagrams-5#create-an-in3-transaction) ----------------------------------------------------------------------------------------------------------------------- The CM.com Online Payments API enables you to create an in3 transaction. The diagram below presents the interaction that takes place between Consumer, Merchant (You), CM.com Online Payments API, and IN3 when creating an in3 transaction: ![](https://files.readme.io/0b43fc9e3bd3342626655d040c34ecc446ede35396d42e72e4a3f7011e32b869-SQ_-_in3_Transaction.png) In the diagram above the following steps are performed: 1. Consumer wants to start a payment. 2. Merchant makes a request to create an in3 transaction. 3. Merchant receives a successful response and redirects the Consumer to the provided URL. 4. Consumer completes the first instalment payment, and eventually is redirected to the CM.com Online Payments API returnURL. 5. When the status of the in3 transaction is updated on the CM.com Online Payments API, the Consumer is redirected to the return URL that the Merchant specified in the original request to create the in3 transaction. 6. If the Merchant also specified webhooks in the original request then CM.com Online Payments API will trigger the proper webhooks and make the requests to the webhook URLs specified by the Merchant. **When using webhooks, be aware that they are only a "best effort" mechanism**. 7. Merchant gets the latest details of the transaction. This usually happens once the Merchant received a webhook request. The API endpoints involved on this flow are: * [Create Transaction](https://developers.cm.com/payments-platform/docs/create-transaction-5) * [Get Transaction](https://developers.cm.com/payments-platform/docs/get-transaction-7) Create a refund for the payment made with an in3 transaction [](https://developers.cm.com/payments-platform/docs/diagrams-5#create-a-refund-for-the-payment-made-with-an-in3-transaction) --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- The CM.com Online Payments API enables you to create a refund for the payment made with an in3 transaction. The diagram below presents the interaction that takes place between Merchant (You) and CM.com Online Payments API when requesting a refund for the payment made with an in3 transaction: ![](https://files.readme.io/d807b67f75fb48a4bcc804dcba535302a9b56c0aab6f1085ab49bbf06b37245a-SQ_-_in3_Refund.png) The API endpoints involved on this flow are: * [Create a Refund](https://developers.cm.com/payments-platform/docs/create-a-refund-7) Get refunds of an in3 transaction [](https://developers.cm.com/payments-platform/docs/diagrams-5#get-refunds-of-an-in3-transaction) --------------------------------------------------------------------------------------------------------------------------------------- The CM.com Online Payments API enables you to get the details of the refunds created for the payments made with an in3 transaction. The diagram below presents the interaction that takes place between Merchant (You) and CM.com Online Payments API when requesting refunds related to an in3 transaction: ![](https://files.readme.io/c9289656838bd3742730edebca4552f607789d72a47bbdf4fb8ec534790154a1-SQ_-_in3_Refunds.png) The API endpoints involved on this flow are: * [Get Refunds](https://developers.cm.com/payments-platform/docs/get-refunds) Updated 11 months ago * * * [](https://www.cm.com/) * [Privacy Policy](https://www.cm.com/app/legal/cm-com/privacy-policy/) * [Terms and Conditions](https://www.cm.com/app/legal/cm-com/terms-and-conditions/) * [Cookie Policy](https://www.cm.com/about-cm/cookie-policy/) Jump to Product page Conversational AI Cloud Mobile Service Cloud Mobile Marketing Cloud Messaging Ticketing Payments Platform Voice Sign --- # Status Transitions in3 transaction statuses [](https://developers.cm.com/payments-platform/docs/status-transitions-3#in3-transaction-statuses) ------------------------------------------------------------------------------------------------------------------------------- `OPEN` - Transaction has been created. This is the initial status. `PENDING` - Transaction's first instalment payment is in progress. `SUCCESS` - Transaction's first instalment payment successfully paid. `CANCELLED` - Transaction's first instalment payment has been cancelled by your customers. `EXPIRED` - Transaction's first instalment payment has not succeeded; expired. `FAILURE` - Transaction's first instalment payment has not succeeded; unknown reason. Status Transitions [](https://developers.cm.com/payments-platform/docs/status-transitions-3#status-transitions) ------------------------------------------------------------------------------------------------------------------- The diagram below shows all state transitions an in3 transaction could go through. ![](https://files.readme.io/8d4a25ddd3ace2a69b43f3d2870f2fb53545be88079617cc0c073a4891ee3972-State_-_in3_Statuses.png) Once an in3 transaction has been created the status will be `OPEN`. Once your customer is redirected to the in3 environment where they can complete the first instalment payment, the status will transition to `PENDING`. Once the first instalment payment is successful, the transaction status will transition to `SUCCESS`. This is the happy-flow. Of course there are other possibilities as you have seen in the state diagram. It could transition to `CANCELLED` if the consumer did not complete the first instalment payment on the in3 environment and instead clicked on 'Return to webshop' button. It could transition to `EXPIRED` if the `expiresAt` timestamp has been reached and the first instalment payment has not been completed. It could transition to `FAILURE` if the first instalment payment failed. Updated 11 months ago * * * [](https://www.cm.com/) * [Privacy Policy](https://www.cm.com/app/legal/cm-com/privacy-policy/) * [Terms and Conditions](https://www.cm.com/app/legal/cm-com/terms-and-conditions/) * [Cookie Policy](https://www.cm.com/about-cm/cookie-policy/) Jump to Product page Conversational AI Cloud Mobile Service Cloud Mobile Marketing Cloud Messaging Ticketing Payments Platform Voice Sign --- # Schemas returnUrls [](https://developers.cm.com/payments-platform/docs/schemas-6#returnurls) ---------------------------------------------------------------------------------------- | Parameter | Type | Description | Constraints | Required | | --- | --- | --- | --- | --- | | success | String(1...2000) | Return URL to use when the transaction succeeds. | | ✅ | | cancelled | String(1...2000) | Return URL to use when the transaction is cancelled. | | ✅ | | expired | String(1...2000) | Return URL to use when the transaction is expired. | | ✅ | | failed | String(1...2000) | Return URL to use when the transaction is failed. | | ✅ | consumer [](https://developers.cm.com/payments-platform/docs/schemas-6#consumer) ------------------------------------------------------------------------------------ | Parameter | Type | Description | Constraints | Required | | --- | --- | --- | --- | --- | | name | [name](https://developers.cm.com/payments-platform/docs/schemas-6#name)
Object | Customer name. | | | | address | [address](https://developers.cm.com/payments-platform/docs/schemas-6#address)
Object | Customer address. | | ✅ | | email | String | Email provided by customer. | | ✅ | | businessName | String(1...35) | Business name. | | | | phone | String | Customer phone number. | | | | gender | String(1...2000) | Gender of the customer. | The possible values are: `m`, `f` , or `null`. | | | dateOfBirth | String | Date of birth of the customer. | | | name [](https://developers.cm.com/payments-platform/docs/schemas-6#name) ---------------------------------------------------------------------------- | Parameter | Type | Description | Constraints | Required | | --- | --- | --- | --- | --- | | firstName | String(1...35) | Customer first name. | | ✅ | | lastName | String(1...35) | Customer last name. | | ✅ | | middleName | String(1...35) | Customer middle name. | | | address [](https://developers.cm.com/payments-platform/docs/schemas-6#address) ---------------------------------------------------------------------------------- | Parameter | Type | Description | Constraints | Required | | --- | --- | --- | --- | --- | | street | String(1...100) | Street. | | | | houseNumber | String(1...35) | House and number. | | | | postalCode | String(1...35) | Postal code. | | | | city | String(1...35) | City. | | | | countryCode | String | Country code. | ISO 3166-1 country code. | ✅ | | state | String(1...40) | State. | | | | additionalData | String(1...35) | Additional address information. | | | details [](https://developers.cm.com/payments-platform/docs/schemas-6#details) ---------------------------------------------------------------------------------- | Parameter | Type | Description | Constraints | Required | | --- | --- | --- | --- | --- | | merchantCountry | String | The country code where the transaction is processed. | ISO 3166-1 alpha-2 country code. | | | gatewayId | String | The gateway's identifier, which is issued by Google. | | | | environment | String | The environment defines the payment methods to use. `TEST` is used where dummy payment methods are suitable for testing. `PRODUCTION` is used to return chargeable payment methods when a valid Google merchant ID is specified and configured for the domain. | The possible values are: `TEST`, `PRODUCTION`. | | | merchantId | String | The Google merchant identifier. | | | | merchantName | String | The merchant name encoded as UTF-8. Merchant name is rendered in the payment sheet. In TEST environment, or if a merchant isn't recognized, a “Pay Unverified Merchant” message is displayed in the payment sheet. | | | | merchantKey | String(36) | The unique identifier for your integration. Should be used as gateway merchant id. | | | | allowedCardNetworks | String | The supported card networks for Payment via Google Pay. | The possible values are: `AMEX`, `DISCOVER`, `INTERAC`, `JCB`, `MASTERCARD`, `VISA`. | | | serverUrl | String | The URL to the Mobile Pay Server. | | | action [](https://developers.cm.com/payments-platform/docs/schemas-6#action) -------------------------------------------------------------------------------- | Parameter | Type | Description | Constraints | Required | | --- | --- | --- | --- | --- | | redirect | [redirect](https://developers.cm.com/payments-platform/docs/schemas-6#redirect)
Object | Next action to be performed by merchant (or consumer) to complete the payment. | | | redirect [](https://developers.cm.com/payments-platform/docs/schemas-6#redirect) ------------------------------------------------------------------------------------ | Parameter | Type | Description | Constraints | Required | | --- | --- | --- | --- | --- | | url | String | URL where consumer should be redirected to by the merchant to perform the payment. | | | refund [](https://developers.cm.com/payments-platform/docs/schemas-6#refund) -------------------------------------------------------------------------------- | Parameter | Type | Description | Constraints | Required | | --- | --- | --- | --- | --- | | refundedAmount | Int(0...99999999) | Amount in the smallest currency subunit, as for example eurocents, that has already been refunded. | | ✅ | | refundedPendingAmount | Int(1...99999999) | Amount in the smallest currency subunit, as for example eurocents, that has been requested to be refunded. | | ✅ | Updated about 1 year ago * * * [](https://www.cm.com/) * [Privacy Policy](https://www.cm.com/app/legal/cm-com/privacy-policy/) * [Terms and Conditions](https://www.cm.com/app/legal/cm-com/terms-and-conditions/) * [Cookie Policy](https://www.cm.com/about-cm/cookie-policy/) Jump to Product page Conversational AI Cloud Mobile Service Cloud Mobile Marketing Cloud Messaging Ticketing Payments Platform Voice Sign --- # Change the Language / Locale To change the language for a dossier you can set the `locale` field. The locale can be set on a dossier and invitee level. The following locales are supported: `de-DE,` `en-US`, `es-ES`, `fr-FR`, `hu-HU`, `it-IT`, `ja-JP`, `nl-NL`, `pl-PL`, `pt-PT`, `ro-RO` and `sk-SK`. Dossier locale [](https://developers.cm.com/sign/docs/change-language-locale#dossier-locale) ------------------------------------------------------------------------------------------------ The default locale is `en-US`. The dossier locale affects the language of the audit report and the emails sent to the dossier owner. `POST /dossiers` **Request body** JSON `{ "name": "Contract", "locale": "nl-NL" }` Invitee locale [](https://developers.cm.com/sign/docs/change-language-locale#invitee-locale) ------------------------------------------------------------------------------------------------ The default invitee locale is inherited from the dossier locale. In the example below, the locale for John Doe is set to `de-DE`. As no locale is set for Jane Doe, it'll inherit the locale `nl-NL` from the dossier level. `POST /dossiers` **Request body** JSON `{ "name": "Contract", "locale": "nl-NL", "invitees": [ { "name": "John Doe", "locale": "de-DE" }, { "name": "Jane Doe" } ] }` Updated about 3 years ago * * * [](https://www.cm.com/) * [Privacy Policy](https://www.cm.com/app/legal/cm-com/privacy-policy/) * [Terms and Conditions](https://www.cm.com/app/legal/cm-com/terms-and-conditions/) * [Cookie Policy](https://www.cm.com/about-cm/cookie-policy/) Jump to Product page Conversational AI Cloud Mobile Service Cloud Mobile Marketing Cloud Messaging Ticketing Payments Platform Voice Sign --- # Events A webhook can be added to subscribe to events that occur. When an event occurs, a trigger is sent to a predefined URL. Event webhooks [](https://developers.cm.com/sign/docs/events#event-webhooks) -------------------------------------------------------------------------------- Supported event types: `dossier.invite.created`: an invite has been created. `dossier.invite.expired`: an invite has expired. `dossier.invite.undelivered`: an invite cannot be delivered. `dossier.invite.viewed`: the invite has been viewed by the invitee. `dossier.invitee.state.updated`: the invitee state is updated. For example, to `approved` or `declined`. `dossier.prepared`: the prepare step has been completed: fields are added to the dossier and invites should be sent. `dossier.state.updated`: the state of the dossier is updated. For example, from `pending` to `completed`. `dossier.invitee.reassignRequest.state.updated`: the state of the reassign request is updated. For example, from `pending` to `approved`. By default the the `dossier.state.updated`, `dossier.prepared` and `dossier.invite.undelivered` events are sent. Subscribe to event(s) [](https://developers.cm.com/sign/docs/events#subscribe-to-events) -------------------------------------------------------------------------------------------- Adding a webhook can be done by the using the webhook endpoint. It is mandatory to start the URL with `https://`. `POST https://api.cm.com/sign/v1/clients/{kid}/webhooks` > Replace {kid} with the client Key ID **Request headers** `Content-Type: application/json Authorization: Bearer GENERATED_TOKEN_HERE` **Request body** JSON `{ "url": "https://example.com", "events": [ "dossier.state.updated", "dossier.prepared", "dossier.invite.undelivered" ] }` **Custom headers** Custom headers can optionally be provided in the `headers` field: JSON `{ "url": "https://example.com", "headers": { "My-Custom-Header": "Example" } }` **Response body** JSON `{ "id": "77e79832-1708-4a49-9528-3536ba4057d7", "url": "https://example.com", "events": [ "dossier.state.updated", "dossier.prepared" ], "headers": null, "updatedAt": "2022-01-01T00:00:00+00:00", "createdAt": "2022-01-01T00:00:00+00:00" }` Retrieve status callback [](https://developers.cm.com/sign/docs/events#retrieve-status-callback) ---------------------------------------------------------------------------------------------------- A webhook URL can be configured for your Key ID so you get notified about status updates for dossiers. Webhooks can be configured via the API. Check the [API reference](https://developers.cm.com/sign/reference/webhook) for more details. **Request headers** `Content-Type: application/json` **Request body** JSON `{ "id": "b041a287-bc92-4469-801e-ae1a39c08f6e", "type": "dossier.state.updated", "dossier": { "id": "b659c273-954e-43cf-893a-0f74a7f87153", "state": "completed" }, "created": "2022-01-01T00:00:00+00:00" }` **Response** The status code should be in the 2xx range (between 200 and 300), the response body doesn't matter as it's ignored. In case of status code 5xx, the webhook will be retried several times with an exponentially increasing delay. Updated 4 months ago * * * [](https://www.cm.com/) * [Privacy Policy](https://www.cm.com/app/legal/cm-com/privacy-policy/) * [Terms and Conditions](https://www.cm.com/app/legal/cm-com/terms-and-conditions/) * [Cookie Policy](https://www.cm.com/about-cm/cookie-policy/) Jump to Product page Conversational AI Cloud Mobile Service Cloud Mobile Marketing Cloud Messaging Ticketing Payments Platform Voice Sign --- # Getting Started Authentication [](https://developers.cm.com/mobile-service-cloud/docs/getting-started#authentication) --------------------------------------------------------------------------------------------------------- If you want access for the Agent Inbox API, please contact our support team. They will grant you access by providing you with the right combination of API key and API Secret. If you are setting up a dynamic integration, you will find an explanation about how to access the API [here](https://developers.cm.com/mobile-service-cloud/docs/dynamic-integration) . API urls [](https://developers.cm.com/mobile-service-cloud/docs/getting-started#api-urls) --------------------------------------------------------------------------------------------- Unlike most CM APIs, the Agent Inbox APIs are currently hosted on robinhq.com domain names. ROBIN is the old name of the Agent Inbox product. Limits [](https://developers.cm.com/mobile-service-cloud/docs/getting-started#limits) ----------------------------------------------------------------------------------------- Because we have to make sure our system does not get overloaded by API calls, The Agent Inbox API works with request limits. As soon as you make a request (a request can be all verbs GET, POST, PUT, DELETE etc the API supports). The current limits are: | Timeframe | Number of requests | | --- | --- | | Per second | 3 | | Per minute | 180 | | Per hour | 10000 | | Per day | 100000 | Updated over 1 year ago * * * [](https://www.cm.com/) * [Privacy Policy](https://www.cm.com/app/legal/cm-com/privacy-policy/) * [Terms and Conditions](https://www.cm.com/app/legal/cm-com/terms-and-conditions/) * [Cookie Policy](https://www.cm.com/about-cm/cookie-policy/) Jump to Product page Conversational AI Cloud Mobile Service Cloud Mobile Marketing Cloud Messaging Ticketing Payments Platform Voice Sign --- # Frequently Asked Questions Frequently asked questions * Question: How do I specify the id of the stylesheet for the menu when creating a new order? Only one stylesheet can be used for the menu. * Question: How do I determine the status of an order? When can I start shipping the order? The status of an order can be determined via the request [get the order details](https://developers.cm.com/payments-platform/v22.06/reference/psp-api-orders#return-details-of-order) . If the response contains the element `considered_safe` it is safe to ship the order. * Question: How do I change the order of payment methods in the menu? The order of the payment methods in the menu can be controlled by using a profile. A profile is used to control which payment methods are available for consideration in the menu. For example, if you have the payment methods iDEAL, BankTransfer and SEPA direct debit available and configure a profile with only IDeal and BankTransfer then only iDEAL and BankTransfer will be shown in the menu. A profile is created in the [Portal](https://services.docdatapayments.com/portal) and the profile name is provided when [creating an order](https://developers.cm.com/payments-platform/v22.06/reference/psp-api-orders#create-order) . If the profile does not exist the following error message is returned: "Invalid payment profile for the order". Updated 7 months ago * * * [](https://www.cm.com/) * [Privacy Policy](https://www.cm.com/app/legal/cm-com/privacy-policy/) * [Terms and Conditions](https://www.cm.com/app/legal/cm-com/terms-and-conditions/) * [Cookie Policy](https://www.cm.com/about-cm/cookie-policy/) Jump to Product page Conversational AI Cloud Mobile Service Cloud Mobile Marketing Cloud Messaging Ticketing Payments Platform Voice Sign --- # Recipes Recipes ======= [](https://www.cm.com/) * [Privacy Policy](https://www.cm.com/app/legal/cm-com/privacy-policy/) * [Terms and Conditions](https://www.cm.com/app/legal/cm-com/terms-and-conditions/) * [Cookie Policy](https://www.cm.com/about-cm/cookie-policy/) Jump to Product page Conversational AI Cloud Mobile Service Cloud Mobile Marketing Cloud Messaging Ticketing Payments Platform Voice Sign --- # Shopper & Order Items Data Flows The Payment System provides a functionality through which a shopper's billing address, including name of the shopper, can be organized independent of orders. The provided key can be used in the order API to create an Order request. See [Shoppers API](https://developers.cm.com/payments-platform/v22.06/reference/psp-api-shoppers) for the possible API requests. Shopper Data Flow [](https://developers.cm.com/payments-platform/v22.06/docs/psp-shopper-data-flow#shopper-data-flow) ========================================================================================================================= The data flow with providing shopper data is as followed: ![Payment Flow via Menu with Shopper](https://static.cmpayments.com/ps/rest-api-doc/v1/public/assets/Payment_Flow_via_Menu_with_Shopper.png) Steps: 1. The shopper has finished shopping and continues to check out to pay for the order. 2. The shopper creates shopper details (Name and Address) using the resource provided by the merchant. The Payment System returns a unique shopper key and address key. 3. The merchant then creates an order using the address key obtained from above step by supplying an amount and an order reference among other parameters. The Payment System returns a unique order key and the URL to the menu. The URL contains all the references to identify the order to be paid. 4. The shopper is redirected to the payment menu. The further steps are similar to the payment flow as shown in the previous diagram of "Payment Flow Via Menu". Order Item Flow [](https://developers.cm.com/payments-platform/v22.06/docs/psp-shopper-data-flow#order-item-flow) ===================================================================================================================== The data flow for adding Order Items is similar to that of adding Shopper Data. The only difference is that items can only be added after creating an order and the use of a different endpoint. Updated 7 months ago * * * [](https://www.cm.com/) * [Privacy Policy](https://www.cm.com/app/legal/cm-com/privacy-policy/) * [Terms and Conditions](https://www.cm.com/app/legal/cm-com/terms-and-conditions/) * [Cookie Policy](https://www.cm.com/about-cm/cookie-policy/) Jump to Product page Conversational AI Cloud Mobile Service Cloud Mobile Marketing Cloud Messaging Ticketing Payments Platform Voice Sign --- # Orders List The Order list endpoint shows the general points of the order in the Customer panel. `GET https://example.com/orders?=$EmailAddress&$FilterField=$FilterValue` Parameters [](https://developers.cm.com/mobile-service-cloud/docs/orders-list#parameters) --------------------------------------------------------------------------------------------- | Name | Required | Description | | --- | --- | --- | | $EmailAddress | Yes\* | The email address of the customer | | $PhoneNumber | Yes\* | The phone number of the customer | | $FilterField | No\*\* | The name of the field that contains the unique identifier for the customer profile\*\* | | $FilterValue | No\*\* | The unique identifier for the customer profile\*\* | \*At least one of the parameters need to be configured. \*\* Refer to the section _Customer profile selection_ for more details on how to use these parameters. [](https://developers.cm.com/mobile-service-cloud/docs/orders-list#section-) ------------------------------------------------------------------------------- \## Response body JSON `{ "orders": [ { "order_number": "CMO1234", "list_view": { "order_number": "CMO1234", "date": "29-01-2021 12:34", "status": "In progress" } } ] }` Response body when customer has no order [](https://developers.cm.com/mobile-service-cloud/docs/orders-list#response-body-when-customer-has-no-order) --------------------------------------------------------------------------------------------------------------------------------------------------------- JSON `{ "orders": [] }` Response schema [](https://developers.cm.com/mobile-service-cloud/docs/orders-list#response-schema) ------------------------------------------------------------------------------------------------------- | Name | Type | Required | Description | | --- | --- | --- | --- | | orders | Array | Yes | The parent object to store all order\_number objects in | | order\_number | String | Yes | The number of the order which is also used as parameter for the Order details endpoint. | | list\_view | Object | Yes | Inside `list_view` you can add custom fields to show information per order in the panel | | custom\_field | String | No | This variable is placed inside `list_view`. You can rename the key and the value to anything you'd like -- as long as the value is returned in a string form | Updated over 1 year ago * * * [](https://www.cm.com/) * [Privacy Policy](https://www.cm.com/app/legal/cm-com/privacy-policy/) * [Terms and Conditions](https://www.cm.com/app/legal/cm-com/terms-and-conditions/) * [Cookie Policy](https://www.cm.com/about-cm/cookie-policy/) Jump to Product page Conversational AI Cloud Mobile Service Cloud Mobile Marketing Cloud Messaging Ticketing Payments Platform Voice Sign --- # Subscription Flow The Payment System provides a functionality through which a subscription can be created by a merchant and recurring payments can be done using that subscription. See [Subscription API](https://developers.cm.com/payments-platform/v22.06/reference/psp-api-subscriptions) for the possible API requests. Subscription Flow [](https://developers.cm.com/payments-platform/v22.06/docs/psp-subscription-flow#subscription-flow) ========================================================================================================================= The data flow for subscription is as followed: ![Subscription Flow](https://static.cmpayments.com/ps/rest-api-doc/v1/public/assets/Subscription_Flow.png) Steps: 1. Create a new subscription. 2. Initial payment 1. Create a new order for a subscription. 2. Start initial payment. 3. Recurring payment 1. Create a new order for a subscription for each recurring payment. 2. Start recurring payment Updated 7 months ago * * * [](https://www.cm.com/) * [Privacy Policy](https://www.cm.com/app/legal/cm-com/privacy-policy/) * [Terms and Conditions](https://www.cm.com/app/legal/cm-com/terms-and-conditions/) * [Cookie Policy](https://www.cm.com/about-cm/cookie-policy/) Jump to Product page Conversational AI Cloud Mobile Service Cloud Mobile Marketing Cloud Messaging Ticketing Payments Platform Voice Sign --- # Include Invite in Your Own System When you don't want to use any of the channels offered by Sign, you can retrieve the invite URL. You can distribute this URL in any way you want, for example: * Redirect from your own website or software * Send custom emails * Send using a different channel `POST https://api.cm.com/sign/v1/dossiers/{dossierId}/invites` **Request headers** `Content-Type: application/json Authorization: Bearer GENERATED_TOKEN_HERE` **Request body** JSON `[ { "inviteeId": "d079c1a6-ca7e-494f-bfcc-9e12fb87e8ac", "expiresIn": 2592000 } ]` **Response body** JSON `[ { "id": "d55ac986-656a-454f-9fac-1aabe879442d", "inviteeId": "d079c1a6-ca7e-494f-bfcc-9e12fb87e8ac", "inviteUri": "https://www.cm.com/en-us/app/sign/invites/HbmN8fb2lhElgv3cEgByjGNfmG0okiWxbibP84i9qyR1cymFA0...", "readOnly": false, "authenticationMethods": [], "identificationMethods": [], "channel": null, "reminder": false, "emailSentAt": null, "emailBouncedAt": null, "expiresIn": 2592000, "expiresAt": "2022-02-01T0:00:00+00:00", "createdAt": "2022-01-01T0:00:00+00:00" } ]` The invite URL can be retrieved from the `inviteUri` field. Updated 4 months ago * * * [](https://www.cm.com/) * [Privacy Policy](https://www.cm.com/app/legal/cm-com/privacy-policy/) * [Terms and Conditions](https://www.cm.com/app/legal/cm-com/terms-and-conditions/) * [Cookie Policy](https://www.cm.com/about-cm/cookie-policy/) Jump to Product page Conversational AI Cloud Mobile Service Cloud Mobile Marketing Cloud Messaging Ticketing Payments Platform Voice Sign --- # Common Payment Flows There are several possibilities on how to interact with the Payment System. Below are the most common flows for interactions between shopper, merchant, issuer, and the Payment System. Payment Flow Via Menu [](https://developers.cm.com/payments-platform/v22.06/docs/psp-payment-flows#payment-flow-via-menu) ----------------------------------------------------------------------------------------------------------------------------- The Payments System provides a menu that can be used to let a shopper pay for an order. This provides the simplest integration with the Payment System. The following diagram shows the payment flow using the menu. ![Payment Flow Via Menu](https://static.cmpayments.com/ps/rest-api-doc/v1/public/assets/Payment_Flow_Via_Menu.png) Steps: 1. The shopper has finished shopping and continues to check out to pay for the order. 2. The merchant first creates an order supplying an amount and an order reference among other parameters. The Payment System returns a unique order key and the URL to the menu. The URL contains all the references to identify the order to be paid. 3. The shopper is redirected to the payment menu. 4. The Shopper selects a payment method from menu and enter the payment details and submits request to PS for processing. 5. The Payment System authorizes the payment. Depending on the payment method the shopper can optionally be redirected to an acquirer for authentication. 6. If the order is fully authorized the shopper is redirected back to the Merchant's webshop. Otherwise, he can attempt another payment, or cancel and return to the webshop without paying. 7. By means of an asynchronous Status Change Notification the Payment System notifies the merchant when the status of an order including any payments has been updated. 8. The merchant checks the status of the order (and whether the order is considered safe) using the order key as provided in the response of the create request. 9. Payment System sends back the Status response with Confidence level (considered safe) which helps merchant decide whether to ship the products. 10. The shopper returns to Merchant's webshop. 11. The landing page of the webshop can be used to display a confirmation of the order to the shopper. Payment Flow Via WebDirect without Redirect to Issuer [](https://developers.cm.com/payments-platform/v22.06/docs/psp-payment-flows#payment-flow-via-webdirect-without-redirect-to-issuer) --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- The following diagram shows the payment flow using API calls (WebDirect) without a redirect to an issuer. ![Payment Flow Via Webdirect Without Redirect To Issuer](https://static.cmpayments.com/ps/rest-api-doc/v1/public/assets/Payment_Via_Webdirect_Without_Redirect_To_Issuer_Flow.png) Steps: 1. The shopper has finished shopping and continues to check out to pay for the order. 2. The merchant first creates an order supplying an amount and an order reference among other parameters. The Payment System returns a unique order key and the URL to the menu. The URL contains all the references to identify the order to be paid.The menu URL can be ignored. 3. Using the unique digital key as provided in the response of the CREATE request, the merchant then initiates the creation of a (Payment) Order using the START request. 4. The Payment System authorizes the payment depending on the provided details. 5. Payment System will return the status of the payment. 6. By means of an asynchronous Status Update call Payment System notifies the merchant when the status of an Order has been updated. 7. The merchant checks the status of the order (and whether the payment has been authorized successfully) using the order key as provided in the response of the CREATE request. 8. Payment System sends back the Status response with Confidence level (considered safe) which helps merchant decide whether to ship the products. 9. Merchant confirms to shopper that order is being processed. Payment Flow Via Webdirect with Redirect to Issuer [](https://developers.cm.com/payments-platform/v22.06/docs/psp-payment-flows#payment-flow-via-webdirect-with-redirect-to-issuer) --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- The following diagram shows the payment flow using API calls (WebDirect) with a redirect to an issuer. ![Payment Flow Via Webdirect With Redirect To Issuer](https://static.cmpayments.com/ps/rest-api-doc/v1/public/assets/Payment_Via_Webdirect_With_Redirect_To_Issuer_Flow.png) Steps: 1. The shopper has finished shopping and continues to check out to pay for the order. 2. The merchant first creates an order supplying an amount and an order reference among other parameters. The Payment System returns a unique order key and the url to the menu. The url contains all the references to identify the order to be paid.The menu url can be ignored. 3. Using the unique digital key as provided in the response of the CREATE request the merchant then initiates the creation of a (Payment) Order using the START request. 4. The Payment System authorizes the payment depending on the provided details. 5. Payment System returns the status of the payment and redirect information. 6. Merchant sends the redirect information to Shopper. 7. Shopper is redirected to his/her Issuing bank for Authorizing payment. 8. Payment System receives Authorization Response from Issuing bank. 9. Payment System will process the Authorization Response. 10. By means of an asynchronous Status Update call Payment System notifies the merchant when the status of an Order has been updated. 11. The merchant checks the status of the order (and whether the payment has been authorized successfully) using the order key as provided in the response of the CREATE request. 12. Payment System sends back the Status response with Confidence level (considered safe) which helps merchant decide whether to ship the products. 13. Merchant confirms to shopper that order is being processed. Updated 7 months ago * * * [](https://www.cm.com/) * [Privacy Policy](https://www.cm.com/app/legal/cm-com/privacy-policy/) * [Terms and Conditions](https://www.cm.com/app/legal/cm-com/terms-and-conditions/) * [Cookie Policy](https://www.cm.com/about-cm/cookie-policy/) Jump to Product page Conversational AI Cloud Mobile Service Cloud Mobile Marketing Cloud Messaging Ticketing Payments Platform Voice Sign --- # Send Invite Using WhatsApp Business Platform It's possible to send invites via WhatsApp Business Platform to the phone number of the invitee. Sending invites via WhatsApp can only be done if channel `whatsapp` is activated. Add a phone number to an invitee [](https://developers.cm.com/sign/docs/send-invite-using-whatsapp-business-platform#add-a-phone-number-to-an-invitee) ---------------------------------------------------------------------------------------------------------------------------------------------------------- To send an invite via WhatsApp Business Platform, it's required to provide the `phoneNumber` of the invitee (in [E.164](https://en.wikipedia.org/wiki/E.164) format). `POST https://api.cm.com/sign/v1/dossiers` **Request headers** `Content-Type: application/json Authorization: Bearer GENERATED_TOKEN_HERE` **Request body** JSON `{ "name": "Purchase contract", "reminderIn": 604800, "invitees": [ { "name": "Invitee", "email": "[[email protected]](https://developers.cm.com/cdn-cgi/l/email-protection) ", "phoneNumber": "+31612345678" } ] }` **Response body** JSON `{ "id": "302935b2-8a22-4e25-bffb-fccda8963bd4", "name": "Purchase contract", "state": "draft", "locale": "en-US", "completed": false, "reminderIn": 604800, "invitees": [ { "id": "f6d1afd5-aa6a-4c5e-8348-bf5a5310b5d2", "name": "Invitee", "email": "[[email protected]](https://developers.cm.com/cdn-cgi/l/email-protection) ", "phoneNumber": "+31612345678", "authenticationMethods": [], "identificationMethods": [], "reference": null, "readOnly": false, "state": null, "stateChanged": null, "position": null, "locale": "nl-NL" } ], "expiresIn": 2592000, "expiresAt": "2022-01-31T00:00:00+00:00", "createdAt": "2022-01-01T00:00:00+00:00" }` Sending an invite via WhatsApp Business Platform [](https://developers.cm.com/sign/docs/send-invite-using-whatsapp-business-platform#sending-an-invite-via-whatsapp-business-platform) ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ To send an invite via WhatsApp Business Platform the channel needs to be configured to `whatsapp`. `POST https://api.cm.com/sign/v1/dossiers/{dossierId}/invites` **Request headers** `Content-Type: application/json Authorization: Bearer GENERATED_TOKEN_HERE` **Request body** JSON `[ { "inviteeId": "80692813-3493-40e9-86c3-d3b6f7378929", "channel": "whatsapp", "expiresIn": 2592000 } ]` **Response body** JSON `[ { "id": "22b33b45-bde6-45f4-a45a-ec1fa53ffffa", "inviteeId": "80692813-3493-40e9-86c3-d3b6f7378929", "inviteUri": null, "readOnly": false, "authenticationMethods": [], "identificationMethods": [], "channel": "whatsapp", "reminder": false, "emailSentAt": null, "emailBouncedAt": null, "expiresIn": 2592000, "expiresAt": "2022-01-31T00:00:00+00:00", "createdAt": "2022-01-01T00:00:00+00:00" } ]` Updated 4 months ago * * * [](https://www.cm.com/) * [Privacy Policy](https://www.cm.com/app/legal/cm-com/privacy-policy/) * [Terms and Conditions](https://www.cm.com/app/legal/cm-com/terms-and-conditions/) * [Cookie Policy](https://www.cm.com/about-cm/cookie-policy/) Jump to Product page Conversational AI Cloud Mobile Service Cloud Mobile Marketing Cloud Messaging Ticketing Payments Platform Voice Sign --- # Send Invite Using SMS It's possible to send invites via SMS to the phone number of the invitee. Sending invites via SMS can only be done if channel `sms` is activated. Add a phone number to an invitee [](https://developers.cm.com/sign/docs/send-invite-using-sms#add-a-phone-number-to-an-invitee) ----------------------------------------------------------------------------------------------------------------------------------- To send an invite via SMS, it's required to provide the `phoneNumber` of the invitee (in [E.164](https://en.wikipedia.org/wiki/E.164) format). `POST https://api.cm.com/sign/v1/dossiers` **Request headers** `Content-Type: application/json Authorization: Bearer GENERATED_TOKEN_HERE` **Request body** JSON `{ "name": "Purchase contract", "reminderIn": 604800, "invitees": [ { "name": "Invitee", "email": "[[email protected]](https://developers.cm.com/cdn-cgi/l/email-protection) ", "phoneNumber": "+31612345678" } ] }` **Response body** JSON `{ "id": "302935b2-8a22-4e25-bffb-fccda8963bd4", "name": "Purchase contract", "state": "draft", "locale": "en-US", "completed": false, "reminderIn": 604800, "invitees": [ { "id": "f6d1afd5-aa6a-4c5e-8348-bf5a5310b5d2", "name": "Invitee", "email": "[[email protected]](https://developers.cm.com/cdn-cgi/l/email-protection) ", "phoneNumber": "+31612345678", "authenticationMethods": [], "identificationMethods": [], "reference": null, "readOnly": false, "state": null, "stateChanged": null, "position": null, "locale": "nl-NL" } ], "expiresIn": 2592000, "expiresAt": "2022-01-31T00:00:00+00:00", "createdAt": "2022-01-01T00:00:00+00:00" }` Sending an invite via SMS [](https://developers.cm.com/sign/docs/send-invite-using-sms#sending-an-invite-via-sms) --------------------------------------------------------------------------------------------------------------------- To send an invite via SMS the channel needs to be configured to `sms`. `POST https://api.cm.com/sign/v1/dossiers/{dossierId}/invites` **Request headers** `Content-Type: application/json Authorization: Bearer GENERATED_TOKEN_HERE` **Request body** JSON `[ { "inviteeId": "80692813-3493-40e9-86c3-d3b6f7378929", "channel": "sms", "expiresIn": 2592000 } ]` **Response body** JSON `[ { "id": "22b33b45-bde6-45f4-a45a-ec1fa53ffffa", "inviteeId": "80692813-3493-40e9-86c3-d3b6f7378929", "inviteUri": null, "readOnly": false, "authenticationMethods": [], "identificationMethods": [], "channel": "sms", "reminder": false, "emailSentAt": null, "emailBouncedAt": null, "expiresIn": 2592000, "expiresAt": "2022-01-31T00:00:00+00:00", "createdAt": "2022-01-01T00:00:00+00:00" } ]` Updated 4 months ago * * * [](https://www.cm.com/) * [Privacy Policy](https://www.cm.com/app/legal/cm-com/privacy-policy/) * [Terms and Conditions](https://www.cm.com/app/legal/cm-com/terms-and-conditions/) * [Cookie Policy](https://www.cm.com/about-cm/cookie-policy/) Jump to Product page Conversational AI Cloud Mobile Service Cloud Mobile Marketing Cloud Messaging Ticketing Payments Platform Voice Sign --- # Require Identification Additional user identification can be added to the sign process. These extra steps first need to be completed before the user can sign the document. This extra information is included in the audit report. Please note that the identification methods first need to be configured for your account. Please contact your account manager if you want to use this feature. Supported identification methods: * One Time Password via SMS (`otp_sms`): A code is sent separately to the invitee via SMS. They enter the verification code on the sign page. An E.164 phone number must be provided for the invitee in a `phoneNumber` field. * One Time Password via Email (`otp_email`): A code is sent separately to the invitee via Email. They enter the verification code on the sign page. * One Time Password via WhatsApp (`otp_whatsapp`): A code is sent separately to the invitee via WhatsApp. They enter the verification code on the sign page. An E.164 phone number must be provided for the invitee in a `phoneNumber` field. * One Time Password via Voice (`otp_voice`): A code is sent separately to the invitee via a phone call. They enter the verification code on the sign page. An E.164 phone number must be provided for the invitee in a `phoneNumber` field. * IBAN verification (`iban`): The user makes a one cent payment via their bank using iDEAL. After payment we receive the IBAN of their bank account. * iDIN (`idin`): The user performs an online identification via their bank. The name and date of birth will be requested. * Qualified signature (`qualified`): The user verifies their identity in a mobile app. The process includes a liveness check and requires an ID Document with NFC chip. When this identification method is used the invitee must have a unique position. To add an identification for an invite set the following field on an `invitee`: JSON `{ "identificationMethods": [ "idin" ] }` `identificationMethods`: An array containing one or more identification methods. Retrieve identification status [](https://developers.cm.com/sign/docs/require-identification#retrieve-identification-status) -------------------------------------------------------------------------------------------------------------------------------- To retrieve the identification status the request below can be sent. `GET /dossiers/{dossierId}/invitees/{inviteeId}/identifications` **Response body** JSON `[ { "identificationMethod": "idin", "status": "success", "result": { "transactionId": "123456789123456789", "issuerId": "ABNANL2A", "status": "success", "bin": "ABNANL2A3xOcyYKUhR8s0mS+tbkNO2xF2/U/Ns3eIyMOWYWmOZeUGw8StPKPhAdRTyN1XWne1rgJQA", "name": { "initials": "A", "firstName": "Andre", "lastName": "Dijk", "lastNamePrefix": "van" }, "age": { "dateOfBirth": "1974-01-31", "18yOrOlder": true } } } ]` You usually don't have to retrieve the identification status, because a dossier can only be signed after the identification has been completed. When you received the dossier completed webhook or email, you know that the invitee has successfully identified themselves. Updated 4 months ago * * * [](https://www.cm.com/) * [Privacy Policy](https://www.cm.com/app/legal/cm-com/privacy-policy/) * [Terms and Conditions](https://www.cm.com/app/legal/cm-com/terms-and-conditions/) * [Cookie Policy](https://www.cm.com/about-cm/cookie-policy/) Jump to Product page Conversational AI Cloud Mobile Service Cloud Mobile Marketing Cloud Messaging Ticketing Payments Platform Voice Sign --- # Your First Conversation Welcome to the Conversational AI Cloud getting started guide aimed at getting your first conversation off the ground! 🚀 Introduction [](https://developers.cm.com/conversational-ai-cloud/docs/your-first-conversation#introduction) ---------------------------------------------------------------------------------------------------------------- Conversational AI Cloud is a Conversational AI Platform that makes it easy to have a conversation with your customers. In order to have a basic conversation we offer a single API called our Gateway API. There’s also other API’s like the Context Store API, or our web hook based integrations, but those generally come into play whenever customers are looking to create a more personalised and integrated conversation. In this guide we’ll be relying on the Gateway API to send in questions, and receive answers (also called an interaction), and to manage our conversation through what is called a session. We’ll be looking at the response models, and looking at the most important parts of the response in order to get started with our API(s). > 📘 > > Pre-requisites > > > -------------------- > > To follow along with this guide you'll need to have the following available to you: > > * Conversational AI Cloud environment provisioned, and ready-to-use > * Project within your Conversational AI Cloud environment > * Your projects credentials ready-to-use: > * Customer key > * Project key > * Culture of your projects content > * API key for your project Any code examples in this guide are written in Node, but feel free to code along in any language you prefer. Your first message [](https://developers.cm.com/conversational-ai-cloud/docs/your-first-conversation#your-first-message) ---------------------------------------------------------------------------------------------------------------------------- Sending a message to the Conversational AI Cloud means calling the [/ask endpoint](https://cmcom-group.readme.io/conversational-ai-cloud/reference/get_ask) on the [Gateway API](https://cmcom-group.readme.io/conversational-ai-cloud/reference/get_ask) . JavaScript `const axios = require("axios").default; const options = { method: 'GET', url: 'https://api.digitalcx.com/ask', params: { customerKey: 'your-customer-key', projectKey: 'your-project-key', culture: 'your-projects-culture', apiKey: 'your-api-key', q: 'Hello! How are you doing?' } headers: { Accept: 'application/json, standard' } }; axios.request(options).then(function (response) { console.log(response.data); }).catch(function (error) { console.error(error); });` The above request is a simple example of a GET request. Submitting this request will provide us with the following response object: JSON `{ "outputs": [ { "outputId": 0, "kbaId": 272, "interactionValue": "Hello! How are you doing?", "isDefault": true, "dimensionValues": [], "outputParts": [ { "type": "answer", "text": "I'm doing great! Is there anything I can help you with today?", "links": [], "projectConstants": [], "dialogOptions": [], "metadata": {}, "images": [], "videos": [] } ], "kbaCategories": [] } ], "sessionId": "0d5bf3ad-2f4f-4a57-ab1d-c3b20f229e72", "interactionId": "e187019a-2b4d-4d33-bbc3-0b465f59c432", "culture": "en", "inputs": { "originalInputText": "Hello! How are you doing?" } }` Inspecting the root of the response object shows us a few key variables: * Outputs, an array containing the answer response on the first index. * InteractionId, a unique GUID generated for this specific interaction. The interaction ID can be used to provide feedback, or examine the interaction in our analytics environment. * SessionId, a unique GUID generated for each new session on the Conversational AI Cloud gateway. Taking a look at the answer response contained in the outputs array provides us with the following: JSON `{ "outputId": 0, "kbaId": 272, "interactionValue": "Hello! How are you doing?", "isDefault": true, "dimensionValues": [], "outputParts": [ { "type": "answer", "text": "I'm doing great! Is there anything I can help you with today?", "links": [], "projectConstants": [], "dialogOptions": [], "metadata": {}, "images": [], "videos": [] }], "kbaCategories": [] }` We can see that the answer object contains a number of properties, most of which we won’t get into in this article. A few topics are particularly important when getting started with Conversational AI Cloud: * interactionValue, the original question we sent in to the Gateway * outputParts, the object containing the actual answer text along with any additional properties such as media, links, and dialog options And last, but not least. If we look specifically at the outputParts section we get: JSON `{ "type": "answer", "text": "I'm doing great! Is there anything I can help you with today?", "links": [], "projectConstants": [], "dialogOptions": [], "metadata": {}, "images": [], "videos": [] }` We see that the outputParts section consists of the following properties: * type, the type of response (always set to ‘answer’) * text, the answer text containing the response * links, images, videos: arrays of objects containing information on the specific media type or link. * Each media type has a different format, the ID in the object is referenced in the replacement tag when present in the response (see the “replacement tag” section of this article). * projectConstants, all project constants present in the answer text (pre-replaced) * dialogOptions, any dialog options defined in the CMS content for this answer * metadata, any values added to the answer that can be used by the caller to further process the request Continuing the conversation [](https://developers.cm.com/conversational-ai-cloud/docs/your-first-conversation#continuing-the-conversation) ---------------------------------------------------------------------------------------------------------------------------------------------- Now that we’ve sent our first message through the Gateway API, it's time for us to continue the conversation. Whenever a single interaction is sent to the Gateway API, it generates an interaction ID ([learn more about interactions here](https://developers.cm.com/conversational-ai-cloud/docs/interactions) ), and a session ID ([learn more about sessions here](https://developers.cm.com/conversational-ai-cloud/docs/sessions) ). These ID’s are used to both continue the conversation (session ID), or to look up a specific interaction in Conversational AI Cloud’s analytics environment (interaction ID). For this section of the guide we’ll be looking specifically at continuing the conversation using through the session ID. As stated before, a unique session ID is generated for any interaction without a session ID, or for any interaction with an expired session ID. A session in Conversational AI Cloud is: * Unique to each customer-project-culture combination * Valid for a period of 15 minutes, or 24 hours. * A way to group individual interactions together into a conversation * A container for any information that you want to keep in the session in order to personalise and optimise interactions to better serve your end-users. Sessions are required for more extensive interactions with the Gateway API like (transactional) dialogs. Continuing a conversation through sessions is as easy as providing the session ID provided in the response from one interaction, as a query parameter for the next interaction: JavaScript `const axios = require("axios").default; const options = { method: 'GET', url: 'https://api.digitalcx.com/ask', params: { customerKey: 'your-customer-key', projectKey: 'your-project-key', culture: 'your-projects-culture', apiKey: 'your-api-key', q: 'Can you help me with returning my order?', // Here we include the session ID returned from a previous interaction 'session.id': '0d5bf3ad-2f4f-4a57-ab1d-c3b20f229e72' } headers: { Accept: 'application/json, standard' } }; axios.request(options).then(function (response) { console.log(response.data); }).catch(function (error) { console.error(error); });` All we did to carry on the conversation within the session that was generated for us is include the ‘session.id’ query parameter. This is enough for Conversational AI Cloud to process the interaction in the scope of the session. If the provided session ID has expired, a new session will be generated (linked to the previous session) and returned in the output. Next steps [](https://developers.cm.com/conversational-ai-cloud/docs/your-first-conversation#next-steps) ------------------------------------------------------------------------------------------------------------ In this guide we took a look at the [/ask endpoint](https://cmcom-group.readme.io/conversational-ai-cloud/reference/get_ask) on the [Gateway API](https://cmcom-group.readme.io/conversational-ai-cloud/reference/get_ask) . We sent in two interactions, the first one generating a new session, and the second interaction picking up the conversation through the use of the session id parameter. By taking those two steps, we essentially have the basics of a conversation between your end-users and Conversational AI Cloud! Of course there's a lot of other Conversational AI Cloud features you could integrate it! Make sure to take a look at some of our other articles that explain core concepts like events, dialogs, and context to learn more about how to get started with CM.com's Conversational AI Cloud! Updated over 1 year ago * * * [](https://www.cm.com/) * [Privacy Policy](https://www.cm.com/app/legal/cm-com/privacy-policy/) * [Terms and Conditions](https://www.cm.com/app/legal/cm-com/terms-and-conditions/) * [Cookie Policy](https://www.cm.com/about-cm/cookie-policy/) Jump to Product page Conversational AI Cloud Mobile Service Cloud Mobile Marketing Cloud Messaging Ticketing Payments Platform Voice Sign --- # Advanced Features The payment system supports various advanced features related to order/payment initiation and payment details registration. These features are: * [Subscriptions (recurring payments)](https://developers.cm.com/payments-platform/v22.06/reference/psp-subscription-flow) * [Payment Tokenization](https://developers.cm.com/payments-platform/v22.06/reference/psp-tokenized-payment-details) * [Executing request on Behalf of Another Merchant](https://developers.cm.com/payments-platform/v22.06/reference/psp-api-intermerchant) For some features an additional contract may be required, as well as some additional account configuration. Contact support or sales for more details. Updated 7 months ago * * * [](https://www.cm.com/) * [Privacy Policy](https://www.cm.com/app/legal/cm-com/privacy-policy/) * [Terms and Conditions](https://www.cm.com/app/legal/cm-com/terms-and-conditions/) * [Cookie Policy](https://www.cm.com/about-cm/cookie-policy/) Jump to Product page Conversational AI Cloud Mobile Service Cloud Mobile Marketing Cloud Messaging Ticketing Payments Platform Voice Sign --- # Order Details The “Order details” endpoint shows the details of one order so the Agent Inbox agent can see more information of one particular order from the customer. Once a Agent Inbox agent clicks on order shown in the “Order list” from Endpoint 2, Endpoint 3 will be called by the parameter “ID” filled with the order\_number in the object of “orders” from Endpoint 2 “Order list”. `GET https://example.com/orderdetails?=$Id` Parameters [](https://developers.cm.com/mobile-service-cloud/docs/order-details#parameters) ----------------------------------------------------------------------------------------------- | Name | Required | Description | | --- | --- | --- | | $Id | Yes | The order\_number of the clicked object of “orders” from Endpoint 2 “Order list” | Response body [](https://developers.cm.com/mobile-service-cloud/docs/order-details#response-body) ----------------------------------------------------------------------------------------------------- JSON `{ "details_view": [ { "display_as": "details", "data": { "date": "29-01-2021 12:34", "status": "In progress", "payment_status": "Partially paid", "shipment_status": "Partially shipped", "": "" } }, { "display_as": "columns", "caption": "products", "data": [ { "product": "Phone", "quantity": "1", "price": "$695.50" }, { "product": "Tablet", "quantity": "2", "price": "$898.00" }, { "product": "Shipment", "quantity": "", "price": "$10.00" }, { "product": "Total", "quantity": "", "price": "$1603.50" } ] }, { "display_as": "rows", "caption": "invoices", "data": [ { "shipment": "CMI01", "status": "Paid", "amount": "$1200.00" }, { "shipment": "CMI02", "status": "Not paid", "amount": "$403.50" } ] }, { "display_as": "rows", "caption": "Empty", "data": [] } ] }` The `details_view` Array can hold multiple objects. Each object represents a section in the Sidebar view of agent inbox for an order. The above example has 4 sections, the default one and 3 named Products, Invoices and Empty respectively. The sections can return information in one of three data structure types: `details`, `rows`, `columns`. * In `details` mode, the data attribute is an object of multiple key / values of type string. This will show as a 2 column section in the Agent Inbox. * `columns` requires the data attribute to be an array of objects, each object representing a single row. Each object has multiple key/value pairs, where they keys are the column names and the values the column values. * `rows` requires the data attribute to be an array of objects, each object representing a single row, itself containing multiple rows. Each object has multiple key/value pairs, where the keys are the headers of the nested row and the values are the row values. Response schema [](https://developers.cm.com/mobile-service-cloud/docs/order-details#response-schema) --------------------------------------------------------------------------------------------------------- | Name | Type | Required | Description | | --- | --- | --- | --- | | display\_as | String | Yes | The layout the information in showed in the panel (details, rows and columns) | | caption | String | Yes\* | The caption used for this section in the details view of the order | | data | Array or Object | Yes | This is the object where all the information is returned. | \* A caption is not required for the first section Updated over 1 year ago * * * [](https://www.cm.com/) * [Privacy Policy](https://www.cm.com/app/legal/cm-com/privacy-policy/) * [Terms and Conditions](https://www.cm.com/app/legal/cm-com/terms-and-conditions/) * [Cookie Policy](https://www.cm.com/about-cm/cookie-policy/) Jump to Product page Conversational AI Cloud Mobile Service Cloud Mobile Marketing Cloud Messaging Ticketing Payments Platform Voice Sign --- # Customer Information This endpoint has been designed to showcase the details of the customer. This endpoint gives the customer service rep a general overview of who the person is and his history with the company. `GET https://example.com/customers?=$EmailAddress&=$PhoneNumber&$FilterField=$FilterValue` Parameters [](https://developers.cm.com/mobile-service-cloud/docs/customer-information#parameters) ------------------------------------------------------------------------------------------------------ | Name | Required | Description | | --- | --- | --- | | $EmailAddress | Yes\* | The email address of the customer | | $PhoneNumber | Yes\* | The phone number of the customer | | $FilterField | No\*\* | The name of the field that contains the unique identifier of the customer profile\*\* | | $FilterValue | No\*\* | The unique identifier of the customer profile\*\* | \*At least one of the parameters need to be configured. \*\* Refer to the section _Customer profile selection_ for more details of how to use these parameters Response body [](https://developers.cm.com/mobile-service-cloud/docs/customer-information#response-body) ------------------------------------------------------------------------------------------------------------ JSON `{ "email_address": "[[email protected]](https://developers.cm.com/cdn-cgi/l/email-protection) ", "customer_since": "2021-01-28", "order_count": 12, "total_spent": "$154.95", "name": "John Doe", "phone_number": "+31612345678", "panel_view": { "custom_field1": "Value 1", "custom_field2": "Value 2" } }` Response schema [](https://developers.cm.com/mobile-service-cloud/docs/customer-information#response-schema) ---------------------------------------------------------------------------------------------------------------- | Name | Type | Required | Description | | --- | --- | --- | --- | | name | String | Yes | Returns the full name of the customer | | email\_address | String | Yes | Returns the email address of the customer | | phone\_number | String | Yes | Returns the phone number of the customer | | customer\_since | String | Yes | Shows the date when the customer purchased his first order. Date format is: "YYYY-MM-DD" | | total\_spent | String | Yes | Returns the total amount the customer has spend at the store(s) | | order\_count | Float | Yes | Returns the total amount of orders the customer has at the store(s) | | panel\_view | Object | No | A JSON object to put custom fields in to show more information about the customer | | custom\_field | String | No | This variable is placed inside `panel_view`. You can rename the key and the value to anything you'd like -- as long as the value is returned in a string form | Updated over 1 year ago * * * [](https://www.cm.com/) * [Privacy Policy](https://www.cm.com/app/legal/cm-com/privacy-policy/) * [Terms and Conditions](https://www.cm.com/app/legal/cm-com/terms-and-conditions/) * [Cookie Policy](https://www.cm.com/about-cm/cookie-policy/) Jump to Product page Conversational AI Cloud Mobile Service Cloud Mobile Marketing Cloud Messaging Ticketing Payments Platform Voice Sign --- # Customer Lifetime The “Customer Lifetime” endpoint shows the total amount of orders and the total amount of revenue per customer. The data will be shown for an inbox item. `GET https://example.com/search?=$Email` Parameters [](https://developers.cm.com/mobile-service-cloud/docs/customer-lifetime#parameters) --------------------------------------------------------------------------------------------------- | Name | Required | Description | | --- | --- | --- | | $Email | Yes | The email address of the customer | Response body [](https://developers.cm.com/mobile-service-cloud/docs/customer-lifetime#response-body) --------------------------------------------------------------------------------------------------------- JSON `{ "email_address": "[[email protected]](https://developers.cm.com/cdn-cgi/l/email-protection) ", "customer_since": "2021-01-12T12:34:56Z", "order_count": 12, "currency": "$", "total_revenue": 154.95, "last_order_date": "2021-04-05T12:34:56Z" }` Response schema [](https://developers.cm.com/mobile-service-cloud/docs/customer-lifetime#response-schema) ------------------------------------------------------------------------------------------------------------- | Name | Type | Required | Description | | --- | --- | --- | --- | | email\_address | String | Yes | Email address of the customer | | customer\_since | String | Yes | Date of the first order | | order\_count | Integer | Yes | Total amount of orders the customer has | | currency | String | Yes | Default currency of the customer | | total\_revenue | Float | Yes | Total amount of revenue the customer has brought in | | last\_order\_date | String | Yes | Date of the last order | Updated about 3 years ago * * * [](https://www.cm.com/) * [Privacy Policy](https://www.cm.com/app/legal/cm-com/privacy-policy/) * [Terms and Conditions](https://www.cm.com/app/legal/cm-com/terms-and-conditions/) * [Cookie Policy](https://www.cm.com/about-cm/cookie-policy/) Jump to Product page Conversational AI Cloud Mobile Service Cloud Mobile Marketing Cloud Messaging Ticketing Payments Platform Voice Sign --- # Channels Conversational AI Cloud allows customers to define custom channels for their conversational AI. Each channel can have a unique set of answers defined, allowing for a smooth omni-channel experience when interacting with the conversational AI. When calling the Gateway API customers can choose to provide the **channels** query parameter. The channels query parameter behaves as follows: * When specified Conversational AI Cloud's recognition engine will attempt to select the answer set for the provided channel. * If the channel is correctly specified, and the matched article has at least 1 answer defined for that channel, that answer set will be used for context evaluation to provide an answer to the end-user. * If the channel is correctly specified, and the matched article does not have any answers defined for it the channel query parameter will be ignored, and the default answer set will be used to provide an answer to the end-user. * If the channel is incorrectly specified the channel query parameter will be ignored Updated over 2 years ago * * * [](https://www.cm.com/) * [Privacy Policy](https://www.cm.com/app/legal/cm-com/privacy-policy/) * [Terms and Conditions](https://www.cm.com/app/legal/cm-com/terms-and-conditions/) * [Cookie Policy](https://www.cm.com/about-cm/cookie-policy/) Jump to Product page Conversational AI Cloud Mobile Service Cloud Mobile Marketing Cloud Messaging Ticketing Payments Platform Voice Sign --- # Search The “Search” endpoint shows results of the search expression so that the Agent Inbox agent can see all known orders, customers and conversations relating to the search keyword. `GET https://example.com/search?=$Expression` Parameters [](https://developers.cm.com/mobile-service-cloud/docs/search#parameters) ---------------------------------------------------------------------------------------- | Name | Required | Description | | --- | --- | --- | | $Expression | Yes | The search expression filled in the Agent Inbox Search field by the agent | Response body [](https://developers.cm.com/mobile-service-cloud/docs/search#response-body) ---------------------------------------------------------------------------------------------- JSON `{ "customers": [ { "email_address": "[[email protected]](https://developers.cm.com/cdn-cgi/l/email-protection) ", "name": "Fullname", "phone_number": "+31612345678", "order_count": "1", "total_spent": "€123,45" } ], "orders": [ { "email_address": "[[email protected]](https://developers.cm.com/cdn-cgi/l/email-protection) ", "order_number": "CM1234", "order_date": "2021-01-12T12:34:56Z", "revenue": "€12,34", "name": "Fullname" } ] }` Response body with no results [](https://developers.cm.com/mobile-service-cloud/docs/search#response-body-with-no-results) ------------------------------------------------------------------------------------------------------------------------------ If there is no customer or an order for the expression, make sure you response with the an empty array for customers and/or orders. JSON `{ "customers": [], "orders": [] }` Response schema [](https://developers.cm.com/mobile-service-cloud/docs/search#response-schema) -------------------------------------------------------------------------------------------------- | Name | Type | Required | Description | | --- | --- | --- | --- | | customers | Array | Yes | Customer specific contact details | | email\_address | String | Yes | E-mail of the customer which resembles the search expression | | name | String | Yes | Name of the customer | | phone\_number | String | Yes | Phone number of the customer | | order\_count | String | Yes | Total amount of orders the customer has | | total\_spent | String | Yes | Total amount of money the customer has spent | | orders | Array | Yes | Array which contains order details that resembles the search expression | | email\_address | String | Yes | The email address of the customer who filled in the order | | order\_number | String | Yes | Number from the order | | order\_date | String | Yes | Date of the order | | revenue | String | Yes | Total amount of money that the order resembles | | name | String | Yes | Name of the customer that has filled in the order | Updated over 1 year ago * * * [](https://www.cm.com/) * [Privacy Policy](https://www.cm.com/app/legal/cm-com/privacy-policy/) * [Terms and Conditions](https://www.cm.com/app/legal/cm-com/terms-and-conditions/) * [Cookie Policy](https://www.cm.com/about-cm/cookie-policy/) Jump to Product page Conversational AI Cloud Mobile Service Cloud Mobile Marketing Cloud Messaging Ticketing Payments Platform Voice Sign --- # Supported Features The following features are supported in the Payments Rest API. * Payments via Menu * iDEAL, iDEAL QR * BankTransfer * Credit/Debit Cards (American Express, Mastercard, Maestro, Visa, V-Pay) * Bancontact, Bancontact Mobile * Paysafecard * ELV * Belfius Pay Button * Gift cards * Point Of Sale (using a physical terminal) * Apple Pay, Apple Business Chat * Google Pay * PayPal * Sepa Direct Debit * Riverty * Klarna * IN3 * Przelewy24, BLIK * [Captures](https://developers.cm.com/payments-platform/v22.06/reference/psp-api-captures) * [Refunds](https://developers.cm.com/payments-platform/v22.06/reference/psp-api-refunds) * [Shopper Data](https://developers.cm.com/payments-platform/v22.06/reference/psp-api-shoppers) * [Order Items](https://developers.cm.com/payments-platform/v22.06/reference/psp-api-order-items) * List payment methods per Order [Orders](https://developers.cm.com/payments-platform/v22.06/reference/psp-api-orders#list-payment-methods) * Payments via API ([Start Payment Request](https://developers.cm.com/payments-platform/v22.06/reference/psp-api-payments#start-payment) ) * iDEAL, iDEAL QR * PayPal * Credit Cards (American Express, Mastercard, Maestro, Visa, V-Pay) * BanContact, Bancontact Mobile * Klarna * Przelewy24, BLIK * Bank transfer * Sepa Direct Debit * Point Of Sale * IN3 * Apple Pay, Apple Business Chat * Google Pay * [Subscriptions](https://developers.cm.com/payments-platform/v22.06/reference/psp-api-subscriptions) (Recurring payments) The following is not supported * Cancellation of order Updated 7 months ago * * * [](https://www.cm.com/) * [Privacy Policy](https://www.cm.com/app/legal/cm-com/privacy-policy/) * [Terms and Conditions](https://www.cm.com/app/legal/cm-com/terms-and-conditions/) * [Cookie Policy](https://www.cm.com/about-cm/cookie-policy/) Jump to Product page Conversational AI Cloud Mobile Service Cloud Mobile Marketing Cloud Messaging Ticketing Payments Platform Voice Sign --- # Context Depending on the state of a conversation you might want to provide a different answer to your end-users. Conversational AI Cloud calls this conversation state context, and the factors that might influence it are determined through context variables. A context variable is a single indicator of the state (or environment) a conversation is taking place in. An example could be the context variable "logged\_in" that could be true if your end-user is authenticated on your website, and false if they aren't authenticated. You might want to present a different answer to that individual if they are logged in versus when they aren't. Context variables are: * A pre-defined variable with a pre-determined set of possible allowed values [(learn more about how to work with them in our CMS)](https://support.digitalcx.com/article/97-740-3169) * Evaluated for every individual interaction And they can be set via: * A query parameter when calling the [Gateway API](https://developers.cm.com/conversational-ai-cloud/reference/get_ask) * A [context variable webhook](https://developers.cm.com/conversational-ai-cloud/docs/context-variable-web-hook) * [Web Conversations JavaScript API](https://developers.cm.com/conversational-ai-cloud/docs/customising-web-conversations) (when using Web Conversations) If the same context variable is set in different ways for an interaction then the following order is used to prevent conflicting definitions (first in the list is the lowest priority): 1. Web Conversations JavaScript API 2. Query parameter 3. Context Variable webhook The sole purpose of a context variable is to provide a different answer once an article (Q&A), event, or dialog (node) is matched by Conv. AI Cloud. Contextual answers can be defined through the Conv. AI Cloud CMS. Updated over 2 years ago * * * [](https://www.cm.com/) * [Privacy Policy](https://www.cm.com/app/legal/cm-com/privacy-policy/) * [Terms and Conditions](https://www.cm.com/app/legal/cm-com/terms-and-conditions/) * [Cookie Policy](https://www.cm.com/about-cm/cookie-policy/) Jump to Product page Conversational AI Cloud Mobile Service Cloud Mobile Marketing Cloud Messaging Ticketing Payments Platform Voice Sign --- # Customer POST The “Customer Lifetime” endpoint shows the total amount of orders and the total amount of revenue per customer for every new conversation. But for older conversation you'll need the POST to update this information. `POST https://api.robinhq.com/dynamic/customers/` Response codes [](https://developers.cm.com/mobile-service-cloud/docs/customer-post#response-codes) ------------------------------------------------------------------------------------------------------- | Code | Description | | --- | --- | | 201 | Created | | 400 | Bad Request | | 401 | Invalid authorisation data | Request body [](https://developers.cm.com/mobile-service-cloud/docs/customer-post#request-body) --------------------------------------------------------------------------------------------------- JSON `{ "customers": [ { "email_address": "[[email protected]](https://developers.cm.com/cdn-cgi/l/email-protection) ", "customer_since": "2021-01-29T12:34:56Z", "order_count": 12, "total_revenue": 123.45, "currency": "$", "last_order_date": "2021-04-05T12:34:56Z" } ] }` Request schema [](https://developers.cm.com/mobile-service-cloud/docs/customer-post#request-schema) ------------------------------------------------------------------------------------------------------- | Name | Type | Required | Description | | --- | --- | --- | --- | | email\_address | String | Yes | Email address of the customer | | customer\_since | String | Yes | Date of the first order | | order\_count | Integer | Yes | Total amount of orders the customer has | | currency | String | Yes | Default currency of the customer | | total\_revenue | Float | Yes | Total amount of revenue the customer has brought in | | last\_order\_date | String | Yes | Date of the last order | Updated over 1 year ago * * * [](https://www.cm.com/) * [Privacy Policy](https://www.cm.com/app/legal/cm-com/privacy-policy/) * [Terms and Conditions](https://www.cm.com/app/legal/cm-com/terms-and-conditions/) * [Cookie Policy](https://www.cm.com/about-cm/cookie-policy/) Jump to Product page Conversational AI Cloud Mobile Service Cloud Mobile Marketing Cloud Messaging Ticketing Payments Platform Voice Sign --- # Online Payments Introduction [](https://developers.cm.com/payments-platform/v22.06/docs/psp-online-payments#introduction) ============================================================================================================= This guide describes the API to be used with the CM Payments System. Order vs. Payment [](https://developers.cm.com/payments-platform/v22.06/docs/psp-online-payments#order-vs-payment) ====================================================================================================================== The Payment System makes a distinction between Orders and Payments. An order is an instruction for a specific amount to be paid by a shopper and can obtain shopping basket items. A payment is an attempt to pay an order by a shopper. This attempt is not necessarily successful, in which case the shopper can try again to pay the order. Furthermore, the shopper can pay the order with multiple partial payments, typically using gift cards. Therefore, an order can have multiple payments. In addition, each order and each payment have their own unique identifier. These identifiers are used throughout the various API calls, but are also helpful when communicating with support. Payment Flows [](https://developers.cm.com/payments-platform/v22.06/docs/psp-online-payments#payment-flows) =============================================================================================================== There are several possibilities on how to interact with the Payment System. Below are the most common flows for interactions between shopper, merchant, issuer, and the Payment System. See the section [Common Payment Flows](https://developers.cm.com/payments-platform/v22.06/docs/psp-payment-flows) for several samples. Shopper Data and Order Items [](https://developers.cm.com/payments-platform/v22.06/docs/psp-online-payments#shopper-data-and-order-items) --------------------------------------------------------------------------------------------------------------------------------------------- For some payment methods additional data is required to be able to successfully process the payment request. For those situations the following pages are applicable [Shopper Data](https://developers.cm.com/payments-platform/v22.06/reference/psp-api-shoppers) and [Order Items](https://developers.cm.com/payments-platform/v22.06/reference/psp-api-order-items) . Status Notification and Considered Safe [](https://developers.cm.com/payments-platform/v22.06/docs/psp-online-payments#status-notification-and-considered-safe) =================================================================================================================================================================== The merchant is notified of a change in the status of the order (including any payment) by an asynchronous call to an Update Url that is configured in his account. This Update Url does **not** contain any status information of the order or payment(s). It only notifies that the status of order or payment(s) has changed. This change might or might not be relevant for the merchant. The Update Url can be parameterized by including one or multiple placeholders: | Field | Type | Description | | --- | --- | --- | | country | Country | The (billing) country of the shopper as ISO 3166-1 Alpha 2. | | currency | Currency | The order currency as ISO 4217 Alpha 3, e.g. "EUR". | | client\_id | String(1, 50) | The id of the shopper. | | order\_key | OrderKey | The generated order key. | | language | Language | The language of the shopper as ISO 639-1 Alpha 2. | | merchant\_name | String(1, 50) | The name of the merchant. | | order\_reference | String(1, 255) | The order reference from the merchant. | For example the Update Url `https://www.myshop.com/payments/notification?order=${order_key}&country=${country}`, with the parameters `order_key` and `country`, is called as `https://www.myshop.com/payments/notification?order=16965E9DA949EA65A6D73E31FE0E88B3&country=NL`. If the Update Url ends with an equal sign ('=') or a forward slash ('/'), then the order reference, as supplied in the [create order request](https://developers.cm.com/payments-platform/v22.06/reference/psp-api-orders#create-order) , is appended to the Url. For example the Url `https://www.myshop.com/payments/notification?id=` becomes commandline `https://www.myshop.com/payments/notification?id=vk20170224p` To determine the status of the order, and if the order can be shipped, get the details of the order. If the response contains the element `considered_safe` it is safe to ship the order. Considered Safe does not only consider the status of the payments, but also the payment methods used. Depending on the payment method, an order can be set directly to safe after authorization, but it can also be delayed when the payment is captured, or even longer until the actual money is received by the Payment System. Source IP-addresses [](https://developers.cm.com/payments-platform/v22.06/docs/psp-online-payments#source-ip-addresses) --------------------------------------------------------------------------------------------------------------------------- The notifications are send from the following IP-addresses: * 85.119.54.14 * 85.119.54.30 If your environment employs a whitelist and/or rate-throtteling, then allow the mentioned addresses to be able to properly and timely receive notifications. Restrictions [](https://developers.cm.com/payments-platform/v22.06/docs/psp-online-payments#restrictions) ------------------------------------------------------------------------------------------------------------- * The Update Url works only for ports 80 (http) and 443 (https), due to security constraints on the Payments platform. This restriction applies to both the production and sandbox environments. * Any unknown or unmatched placeholder is replaced by a blank value, such that the resulting Url is still valid. Contact [](https://developers.cm.com/payments-platform/v22.06/docs/psp-online-payments#contact) =================================================================================================== If you have questions about the API, or need specific payment methods in your test account, contact us at [\[email protected\]](https://developers.cm.com/cdn-cgi/l/email-protection#614e4e121411110e13154f1100180c040f151221020c4f020e0c) You can sign up for a test account [here](https://www.cm.com/en-gb/app/paymentsonboarding/) . Updated about 1 month ago * * * * [Getting Started](https://developers.cm.com/payments-platform/v22.06/docs/getting-started) * [Common Payment Flows](https://developers.cm.com/payments-platform/v22.06/docs/payment-flows) [](https://www.cm.com/) * [Privacy Policy](https://www.cm.com/app/legal/cm-com/privacy-policy/) * [Terms and Conditions](https://www.cm.com/app/legal/cm-com/terms-and-conditions/) * [Cookie Policy](https://www.cm.com/about-cm/cookie-policy/) Jump to Product page Conversational AI Cloud Mobile Service Cloud Mobile Marketing Cloud Messaging Ticketing Payments Platform Voice Sign --- # API Overview The Rest API works by sending http calls to specific resources identified by URLs. The HTTP verb (e.g. GET or POST) defines the action on the resource. Overview of the API entry points [](https://developers.cm.com/payments-platform/v22.06/reference/psp-api-overview#overview-of-the-api-entry-points) ======================================================================================================================================================= | Resource | Description | | --- | --- | | [Orders](https://developers.cm.com/payments-platform/v22.06/reference/psp-api-orders) | Create, list and query order details. | | [Order Items](https://developers.cm.com/payments-platform/v22.06/reference/psp-api-order-items) | Create and list order items. | | [Payments](https://developers.cm.com/payments-platform/v22.06/reference/psp-api-payments) | Start the Payment for a given Order. | | [Captures](https://developers.cm.com/payments-platform/v22.06/reference/psp-api-captures) | Create and update captures. | | [Shoppers](https://developers.cm.com/payments-platform/v22.06/reference/psp-api-shoppers) | Create shopper details. | | [Refunds](https://developers.cm.com/payments-platform/v22.06/reference/psp-api-refunds) | Refund an already processed payment. | | [Subscriptions](https://developers.cm.com/payments-platform/v22.06/reference/psp-api-subscriptions) | Create and list subscriptions, and start recurring payments | | [Apple Pay](https://developers.cm.com/payments-platform/v22.06/reference/psp-api-apple-pay) | Initialize and authorize Apple Pay payments. | | [Google Pay](https://developers.cm.com/payments-platform/v22.06/reference/psp-api-google-pay) | Authorize Google Pay payments. | | [Additional payment data](https://developers.cm.com/payments-platform/v22.06/reference/psp-api-payment-method-data) | Manage additional payment method specific payment data. | | [Tokenization](https://developers.cm.com/payments-platform/v22.06/reference/psp-api-tokenization) | Manage payment details tokenization. | For credit card payments authentication of the shopper is required. Details about credit card authentication can be found on [Card Authentication](https://developers.cm.com/payments-platform/v22.06/reference/psp-api-credit-card-authentication) . Data Retention [](https://developers.cm.com/payments-platform/v22.06/reference/psp-api-overview#data-retention) =================================================================================================================== Be aware that the offered services (APIs) cannot be used as an archive, as to protect end-consumer data the data will be removed. If you need to keep the data for a prolonged period (for example due to taxation laws), then you must do that on your own accord according to the applicable laws. [](https://www.cm.com/) * [Privacy Policy](https://www.cm.com/app/legal/cm-com/privacy-policy/) * [Terms and Conditions](https://www.cm.com/app/legal/cm-com/terms-and-conditions/) * [Cookie Policy](https://www.cm.com/about-cm/cookie-policy/) Jump to Product page Conversational AI Cloud Mobile Service Cloud Mobile Marketing Cloud Messaging Ticketing Payments Platform Voice Sign --- # Your First Dialog Welcome to the Conversational AI Cloud getting started guide aimed at getting your first dialog interactions off the ground! 🚀 Introduction [](https://developers.cm.com/conversational-ai-cloud/docs/your-first-dialog#introduction) ---------------------------------------------------------------------------------------------------------- In our guide called [Your First Conversation](https://developers.cm.com/conversational-ai-cloud/docs/your-first-conversation) we took a look at: * Sending in basic interactions to Conversational AI Cloud through the [Gateway API](https://developers.cm.com/conversational-ai-cloud/reference/get_ask) * Using the session ID to continue the conversation after your first interaction The next step in shaping your end-users' conversational experience is to implement what are called dialogs. Dialogs are a way for you to have a back-and-forth with your end-users in the conversation to guide them towards their goal. It is essentially a decision tree that your end-user walks through, where you can guide them with (dialog) options along the way. So, let's take a look at how to implement this using the Gateway API, building on what we already explored in our previous getting started guide. In this guide we'll be: * Triggering a dialog by sending in a question to the /ask endpoint on the Gateway API * Looking at the response object to find out how we can tell whether or not we're in a dialog * Using the session ID, and one of the dialog options, we'll continue the conversation through the dialog > 📘 > > Pre-requisites > > > -------------------- > > To follow along with this guide you'll need to have the following available to you: > > * Conversational AI Cloud environment provisioned, and ready-to-use > * Project within your Conversational AI Cloud environment > * Your projects credentials ready-to-use: > * Customer key > * Project key > * Culture of your projects content > * API key for your project > * A dialog set-up in your projects content > * An article (Q&A) that triggers a dialog in your projects content Triggering a Dialog [](https://developers.cm.com/conversational-ai-cloud/docs/your-first-dialog#triggering-a-dialog) ------------------------------------------------------------------------------------------------------------------------ Triggering a dialog is done by triggering an event, or asking a question that links to an article with a dialog as its answer. For now, we're going to send in a question through the /ask endpoint on the Gateway, and then we'll take a look at the response to see if we find anything different from what we've seen before. JavaScript `const axios = require("axios").default; const options = { method: 'GET', url: 'https://api.digitalcx.com/ask', params: { customerKey: 'your-customer-key', projectKey: 'your-project-key', culture: 'your-projects-culture', apiKey: 'your-api-key', q: 'What options do you have available for me?' } headers: { Accept: 'application/json, standard' } }; axios.request(options).then(function (response) { console.log(response.data); }).catch(function (error) { console.error(error); });` If we send in this request we'll get a response that roughly looks like this: JSON `{ "outputs": [ { "outputId": 129, "kbaId": 282, "dialogPath": "83:43", "interactionValue": "What options do you have available for me?", "isDefault": true, "dimensionValues": [ [] ], "outputParts": [ { "type": "answer", "text": "I understood that you're looking for more information around returning your order. I'd be happy to help you further. \n \nFirst off, what specifically do you want me to help you out with?\n\r\n\r\n\r\n* %{DialogOption(I want to know about your return policy)}\r\n* %{DialogOption(I want to return my order)}", "links": [], "projectConstants": [], "dialogOptions": [ "I want to know about your return policy", "I want to return my order" ], "metadata": {}, "images": [], "videos": [] } ], "kbaCategories": [] } ], "sessionId": "36088b09-7082-4c15-bebf-3cd4a4540dd3", "interactionId": "00000000-0000-0000-0000-000000000000", "culture": "en", "inputs": { "originalInputText": "What options do you have available for me?" } }` Immediately there's a few things that stand out: * The **dialogPath** property is filled inside the outputs * Looking at the **outputParts** as part of the outputs array we see that the **dialogOptions** array is filled with two options: **I want to know about your return policy** and **I want to return my order** If we're looking for a way to reliably determine if the conversation is in a dialog, we should always look at the **dialogPath** property since dialog options are optional, and dependent on the content defined. > 🚧 > > Session ID > > > ---------------- > > Make sure to always send in a session ID if you have one! That way Conversational AI Cloud can continue stateful interactions such as dialogs, and match interactions from the same user in its analytics environment 🤓 Now let's continue through this dialog by calling the Gateway API again with one of the dialog options as input, and the session ID as a query parameter: JavaScript `const axios = require("axios").default; const options = { method: 'GET', url: 'https://api.digitalcx.com/ask', params: { customerKey: 'your-customer-key', projectKey: 'your-project-key', culture: 'your-projects-culture', apiKey: 'your-api-key', q: 'I want to know about your return policy', 'session.id': '36088b09-7082-4c15-bebf-3cd4a4540dd3', } headers: { Accept: 'application/json, standard' } }; axios.request(options).then(function (response) { console.log(response.data); }).catch(function (error) { console.error(error); });` And if we look at the response from the Gateway it'll look something like: JSON `{ "outputs": [ { "outputId": 130, "kbaId": 44, "dialogPath": "83:43/44", "interactionValue": "I want to know about your return policy", "isDefault": true, "dimensionValues": [ [] ], "outputParts": [ { "type": "answer", "text": "You can return any order within 14 days of receiving it. \n \nI could help you with that if you want, just let me know and we can get started!\n\r\n\r\n\r\n* %{DialogOption(Yes)}\r\n* %{DialogOption(No thank you)}", "links": [], "projectConstants": [], "dialogOptions": [ "Yes", "No thank you" ], "metadata": {}, "images": [], "videos": [] } ], "kbaCategories": [] } ], "sessionId": "36088b09-7082-4c15-bebf-3cd4a4540dd3", "interactionId": "00000000-0000-0000-0000-000000000000", "culture": "en", "inputs": { "originalInputText": "I want to know about your return policy" } }` If we take another look at the response we see that: * The **session ID** that was returned to us hasn't changed (sessions expire after 15 mins or 24 hours of inactivity) * The **outputParts** contain a different answer, with the information we requested (information on the return policy) * The **outputParts** contain **new dialog options** to continue through the dialog * The **dialogPath** has changed from **83:43** to **83:43/44** meaning that we went one step further in the dialog! So by providing the session ID, and choosing one of the dialog options returned by the Gateway API we've been able to step through the dialog as if we were an end-user. As a developer you can easily tell if your end-user is in a dialog or not by looking at the **dialogPath** property, and you can help your end-users by providing them with suggestions in the form of dialog options! Different Types of Dialogs [](https://developers.cm.com/conversational-ai-cloud/docs/your-first-dialog#different-types-of-dialogs) -------------------------------------------------------------------------------------------------------------------------------------- So far we've taken a look at just one type of dialog in Conversational AI Cloud, but there's actually a total of two different types of dialogs: * (standard) dialogs, and; * transactional dialogs A (standard) dialog is a decision tree that guides users through your conversational content. It helps them get from a broad question, or issue to a more specific answer to resolve their initial question. A dialog can have different paths depending on the options a user selects. On the other hand we have transactional dialogs. A transactional dialog is how we actively request data from an end-user as part of a process (or transaction). A transactional dialog is a linear flow with a clearly defined starting point, and ending point where at the end of the transactional dialog we've received all the data required to complete any given transaction. For now we only took a look at (standard) dialogs from a developers point of view, if you want to know more about transactional dialogs, there's a separate guide for that **coming soon**, so stay tuned! Next Steps [](https://developers.cm.com/conversational-ai-cloud/docs/your-first-dialog#next-steps) ------------------------------------------------------------------------------------------------------ Now that you've had [Your First Conversation](https://developers.cm.com/conversational-ai-cloud/docs/your-first-conversation) and know how to work with dialogs 👏 it's time to dive a bit deeper into other conversational concepts available in Conversational AI Cloud. Make sure to take a look at the different [Concepts](https://developers.cm.com/conversational-ai-cloud/docs/concepts) in Conversational AI Cloud's API's to see what's possible, or take a look at [Getting started with Web Conversations](https://developers.cm.com/conversational-ai-cloud/docs/getting-started-with-web-conversations) to see what our standard UI modules could mean for you! Updated over 1 year ago * * * [](https://www.cm.com/) * [Privacy Policy](https://www.cm.com/app/legal/cm-com/privacy-policy/) * [Terms and Conditions](https://www.cm.com/app/legal/cm-com/terms-and-conditions/) * [Cookie Policy](https://www.cm.com/about-cm/cookie-policy/) Jump to Product page Conversational AI Cloud Mobile Service Cloud Mobile Marketing Cloud Messaging Ticketing Payments Platform Voice Sign --- # Transactional Dialogs In this article we'll introduce the concept of transactional dialogs in Conversational AI Cloud and what it means for a developer to work with them. Introduction [](https://developers.cm.com/conversational-ai-cloud/docs/transactional-dialogs#introduction) -------------------------------------------------------------------------------------------------------------- Conversational AI Cloud offers transactional dialogs as a way to actively request data from end-users. A transactional dialog is a linear flow that consists of one or multiple steps, and an end-slot that wraps up the dialogs flow. > 📘 > > Integrating External Systems and Data > > > ------------------------------------------- > > External systems can be integrated through validation and transaction web hooks within transactional dialogs. You can learn more about the flow of transactional dialogs [here](https://developers.cm.com/conversational-ai-cloud/docs/transactional-dialogs#how-does-it-work) What Does A Transactional Dialog Consist Of? [](https://developers.cm.com/conversational-ai-cloud/docs/transactional-dialogs#what-does-a-transactional-dialog-consist-of) ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------- Transactional Dialogs are linear flows that customers can use to actively ask for data points on their end-users to achieve a particular goal, like getting data from or changing data in a CRM, OMS, or ERP. It consists of one or multiple slots and a single end slot. Each slot (aside from the end slot) can have: * A missing value output message, provided in the conversation when asking the end-user to provide input for the slot e.g., "What's your first name". * An error output message, provided in the conversation when validation of the value provided by the end-user fails e.g., "Please provide your e-mail address in the following format...". * An ok output message, provided in the conversation when the value provided by the end-user is accepted by the system e.g., "Thank you for providing your e-mail address". * One or multiple quick replies. * An input pattern. * Validation through either a web hook, or a regular expression. * Linked conversation variable. * Any relevant additions (metadata) that need to be passed along to the optional validation web hook, or returned by the Conv. AI Cloud API. An end slot consists of the following values: * A missing value output message, provided in the conversation when asking the end-user to provide input for the slot e.g., "What's your first name". * An error output message, provided in the conversation when validation of the value provided by the end-user fails e.g., "Please provide your e-mail address in the following format...". * An ok output message, provided in the conversation when the value provided by the end-user is accepted by the system e.g., "Thank you for providing your e-mail address". * Transaction script (web hook) to process all of the data requested throughout the transactional dialog. * Transaction end event that can be triggered by the caller of the Conv. AI Cloud API to continue the conversation once the transactional dialog is finished. * Any relevant additions (metadata) that need to be passed along to the optional validation web hook, or returned by the Conv. AI Cloud API. Aside from that transactional dialogs offer two types of web hooks: * [Validation Web Hook](https://developers.cm.com/conversational-ai-cloud/docs/validation-web-hook) * [Transaction Web Hook](https://developers.cm.com/conversational-ai-cloud/docs/transaction-web-hook) How Does It Work? [](https://developers.cm.com/conversational-ai-cloud/docs/transactional-dialogs#how-does-it-work) ----------------------------------------------------------------------------------------------------------------------- As stated before transactional dialogs are a linear flow that customers can walk through. However, when working with web hooks it is possible to pre-fill slots in the transactional dialog based on what you may already know about your end-user. For example, if you already know your end-users postal code (because you may have captured it through a [conversation variable](https://support.digitalcx.com/article/97-740-9514) ) there's no need to ask for it again. For this reason, each unfulfilled transactional dialog slot (with a validation web hook defined) will be evaluated in parallel. > 📘 > > Web Hook Evaluation > > > ------------------------- > > Validation web hooks are evaluated in parallel, meaning that they'll all get called at the same time every time user input is provided during dialog evaluation. Slots that already have a filled value will not have their web hook called. ![2017](https://files.readme.io/1cea6fb-Untitled-2023-02-23-1535.png "Untitled-2023-02-23-1535.png") Transactional dialog flow The diagram above describes a situation where we have a transactional dialog with 2 validation slots and an end slot. Whenever the end-user triggers the transactional dialog Conv. AI Cloud will call both validation web hooks configured on the transactional dialog slots. If one of them returns a valid value, the end-user will not be prompted with the question to fill out that slot. Every time the end-user provides input during the evaluation of the transactional dialog all validation web hooks are called in parallel for every slot that does not have a value set yet. Once all slots are assigned a value the end slot transaction web hook will be called. This web hook can then decide to reset specific slots, or finalise the transactional dialog depending on the logic implemented in the web hook. The transaction web hook receives all data received throughout the transactional dialog to decide whether or not the dialog is finished. Transactional Dialog Events [](https://developers.cm.com/conversational-ai-cloud/docs/transactional-dialogs#transactional-dialog-events) -------------------------------------------------------------------------------------------------------------------------------------------- For every transactional dialog you can choose to attach an event to the end slot of the transactional dialog. This event will be returned to the caller of the gateway API in the response from Conversational AI Cloud. The caller can then decide to trigger the event through the [events endpoints on the gateway API](https://developers.cm.com/conversational-ai-cloud/reference/get_event-eventname) to continue the conversation with the end-user as the conversation designer intended. Updated over 2 years ago * * * [](https://www.cm.com/) * [Privacy Policy](https://www.cm.com/app/legal/cm-com/privacy-policy/) * [Terms and Conditions](https://www.cm.com/app/legal/cm-com/terms-and-conditions/) * [Cookie Policy](https://www.cm.com/about-cm/cookie-policy/) Jump to Product page Conversational AI Cloud Mobile Service Cloud Mobile Marketing Cloud Messaging Ticketing Payments Platform Voice Sign --- # Getting started The steps for using the service are: 1. Upload one or more PDF documents that need to be signed 2. Create a dossier which references these documents. A dossier includes information about the end users who need to sign the document, as well as the location within the PDF document(s) where they need to place their signature and/or initials. 3. Create an invite for each invitee to sign/review the document 4. The end user is directed to the invite URL, for example via email 5. The end user is presented a web interface where he can read and sign or review and approve the document 6. The dossier owner is notified of the completion of the dossier 7. Retrieve the signed document and audit report after receiving the webhook notification Authentication [](https://developers.cm.com/sign/docs/getting-started#authentication) ----------------------------------------------------------------------------------------- Before you can start using the API, you need API credentials. Credentials consist of a key ID and secret. They can be obtained by [registering](https://www.cm.com/app/sign-registration/) for the Sign API, this will grant you access to the sandbox environment. Contact your account manager to get production credentials. Credentials should be kept secret. In order to authenticate you need to use your credentials to generate a JWT Bearer token. The [JWT token](https://jwt.io/introduction/) has to be generated using the `HS256` algorithm and your credentials. This JWT has to contain the following attributes: `iat`, `nbf`, `exp` in the payload, as well as the attribute `kid` in the header of the JWT. This `kid` attribute needs to contain the Key ID of your credentials. The generated token needs to be passed via the HTTP Authorization header: `Authorization: Bearer GENERATED_TOKEN_HERE` There are many libraries available for different programming languages that can help you to generate a JWT. See the Libraries tab on [https://jwt.io](https://jwt.io/) . **Example** Assuming we want to create a token that is valid for 60 seconds and we have received the following credentials: Key ID: `3b438437-04a4-40bb-8389-54bb02766fba` Secret: `AC4Etykn7jusGR5FwLDAtILtQbiQbTMKedP31szXg4WlSbjGEXyNMZ` We need to create a JWT with the following properties: JWT header: JSON `{ "alg": "HS256", "typ": "JWT", "kid": "3b438437-04a4-40bb-8389-54bb02766fba" }` JWT payload: JSON `{ "iat": 1546300800, "nbf": 1546300800, "exp": 1546300860 }` * `iat`: the time when the token was generated * `nbf`: the time after which the token is valid, usually equal to `iat` * `exp`: the time when the token will expire > Make sure these are UNIX timestamps in seconds This results in the following token: `eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCIsImtpZCI6IjNiNDM4NDM3LTA0YTQtNDBiYi04Mzg5LTU0YmIwMjc2NmZiYSJ9.eyJpYXQiOjE1NDYzMDA4MDAsIm5iZiI6MTU0NjMwMDgwMCwiZXhwIjoxNTQ2MzAwODYwfQ.bwqCUHS1d5d8guAPHDsdd9-a8oXxH1q45O0tDP1asTo` Add this token to the `Authorization` header in the API request. `Authorization: Bearer GENERATED_TOKEN_HERE` > The [https://jwt.io](https://jwt.io/) > website provides a way to inspect or validate JWT tokens. Upload a document [](https://developers.cm.com/sign/docs/getting-started#upload-a-document) ----------------------------------------------------------------------------------------------- Every dossier requires at least one file, the first step is to upload your PDF document. `POST https://api.cm.com/sign/v1/upload` This is a `multipart/form-data` request where the `file` parameter is the key for the file to be uploaded. **Request headers** `Content-Type: multipart/form-data Authorization: Bearer GENERATED_TOKEN_HERE` **Example** `curl -X POST \ https://api.cm.com/sign/v1/upload \ -H 'Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCIsImtpZCI6IjNiNDM4NDM3LTA0YTQtNDBiYi04Mzg5LTU0YmIwMjc2NmZiYSJ9.eyJpYXQiOjE1NDYzMDA4MDAsIm5iZiI6MTU0NjMwMDgwMCwiZXhwIjoxNTQ2MzAwODYwfQ.bwqCUHS1d5d8guAPHDsdd9-a8oXxH1q45O0tDP1asTo' \ -H 'content-type: multipart/form-data' \ -F 'file=@/tmp/Document.pdf'` **Response body** JSON `{ "id": "3fa4ddab-56a4-48bb-9072-8a61b422ea82", "name": "Document", "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", "contentType": "application/pdf", "uploadDateTime": "2022-01-01T00:00:00+00:00" }` The response of this request contains a description of the file as registered within Sign. The most important attribute in this response is the file `id`. This `id` is the unique identifier for this file to be passed along when creating the actual dossier. Create a dossier [](https://developers.cm.com/sign/docs/getting-started#create-a-dossier) --------------------------------------------------------------------------------------------- A dossier is the primary container for all information regarding the documents to be signed. It contains the file(s) to be signed, the invitees who will be invited to sign or review the document. ### Owners [](https://developers.cm.com/sign/docs/getting-started#owners) Owners receive status updates about the dossier, for example when a dossier has been signed by one of the invitees, and receive the audit report when the dossier has been completed. Owners are optional, multiple owners can be specified. More info: [dossiers](https://developers.cm.com/sign/docs/introduction#dossiers) ### Invitees [](https://developers.cm.com/sign/docs/getting-started#invitees) To define a sign order, set the `position` attribute on an invitee. For example, if there are two invitees, set position `1` for the first invitee and position `2` for the second invitee. This way, the second invitee will only receive his invite after the first invitee has signed. It is possible to set multiple invitees on the same position. > Make sure the positions are consecutive and there is no gap between them. Sometimes you want a dossier to be reviewed and approved (without signing it) by someone before you can sign the document. You can set `readOnly` to `true` on invitee that needs to review the document. More info: [invitees](https://developers.cm.com/sign/docs/introduction#invitees) ### Fields [](https://developers.cm.com/sign/docs/getting-started#fields) For each field, you have to pass the id of the file on which the field will be placed. With the unit `point`, the locations of fields are determined using 72 DPI. The coordinates are from top-left to bottom-right. Next to supplying locations, the location can also be automatically determined based on a `tag`. The tag acts as a placeholder; the range and location of the field will be determined based on the location(s) of the tag in the document. In case of initials, add the tag to every page the field should be added to. The tag should be hidden, for example, by setting the text color to white. Fields and field locations can also be determined by using the web interface of Sign. To use this feature set `prepare: true` in the `POST` request to `/dossiers`. The response will contain the `prepareUrl` field. This URL is valid for 60 minutes. Open this URL in the browser, add fields to the invitees and submit the page. After the page is submitted the user is shown a success page or you can redirect to your own page by providing `prepareReturnUrl` to the dossier request. If you use webhooks then you can also enable the `dossier.prepared` event to be sent. More info: [fields](https://developers.cm.com/sign/docs/introduction#fields) ### Reminders [](https://developers.cm.com/sign/docs/getting-started#reminders) To increase conversion, it's recommended to use automatic reminders. Automatic reminders can be enabled by specifying the `reminderIn` field. Its value is the time in seconds after the invite was sent to an invitee, after which the reminder will be sent. Reminders only work if the invite emails, SMS or WhatsApp Business Platform notifications were sent by Sign. ### Request [](https://developers.cm.com/sign/docs/getting-started#section-request) `POST https://api.cm.com/sign/v1/dossiers` **Request headers** `Content-Type: application/json Authorization: Bearer GENERATED_TOKEN_HERE` **Request body** Example with field points, tags JSON `{ "name": "Purchase contract", "files": [ { "id": "3fa4ddab-56a4-48bb-9072-8a61b422ea82" } ], "reminderIn": 604800, "invitees": [ { "name": "Invitee", "email": "[[email protected]](https://developers.cm.com/cdn-cgi/l/email-protection) ", "position": 1, "locale": "nl-NL", "fields": [ { "type": "signature", "file": "3fa4ddab-56a4-48bb-9072-8a61b422ea82", "locations": [ { "range": "1", "unit": "point", "x": 500, "y": 750, "width": 100, "height": 50 } ] }, { "type": "initials", "file": "3fa4ddab-56a4-48bb-9072-8a61b422ea82", "tag": "{init1}" }, { "type": "initials", "file": "3fa4ddab-56a4-48bb-9072-8a61b422ea82", "tag": "{optionalTag}", "tagRequired": false } ] } ], "owners": [ { "name": "Owner", "email": "[[email protected]](https://developers.cm.com/cdn-cgi/l/email-protection) " }, { "name": "Owner Copy", "email": "[[email protected]](https://developers.cm.com/cdn-cgi/l/email-protection) ", "cc": true } ] }` **Response body** JSON `{ "id": "302935b2-8a22-4e25-bffb-fccda8963bd4", "name": "Purchase contract", "state": "draft", "locale": "en-US", "completed": false, "reminderIn": 604800, "owners": [ { "id": "0474a0f6-0901-4ca1-810d-01ea8c830c97", "name": "Owner", "email": "[[email protected]](https://developers.cm.com/cdn-cgi/l/email-protection) ", "cc": false }, { "id": "3a4f3799-4480-4d07-945a-e4e96fd51e4e", "name": "Owner Copy", "email": "[[email protected]](https://developers.cm.com/cdn-cgi/l/email-protection) ", "cc": true } ], "files": [ { "id": "3fa4ddab-56a4-48bb-9072-8a61b422ea82", "name": "Document", "hash": "a497a1df892b6d2f205460b730b09c3a00c366061fa8975a388ce9672a39e833", "contentType": "application/pdf", "uploadDateTime": "2022-01-01T00:00:00+00:00" } ], "invitees": [ { "id": "f6d1afd5-aa6a-4c5e-8348-bf5a5310b5d2", "name": "Invitee", "email": "[[email protected]](https://developers.cm.com/cdn-cgi/l/email-protection) ", "phoneNumber": null, "authenticationMethods": [], "identificationMethods": [], "reference": null, "readOnly": false, "state": null, "stateChanged": null, "position": null, "locale": "nl-NL", "fields": [ { "id": "a4542a27-5f93-483e-910d-a520770c9444", "type": "signature", "tag": null, "file": "3fa4ddab-56a4-48bb-9072-8a61b422ea82", "invitee": "f6d1afd5-aa6a-4c5e-8348-bf5a5310b5d2", "locations": [ { "range": "1", "unit": "point", "x": 500, "y": 750, "width": 100, "height": 50 } ] }, { "id": "7ead6deb-962a-475c-8a9f-c764b7e55357", "type": "initials", "tag": "{init1}", "file": "3fa4ddab-56a4-48bb-9072-8a61b422ea82", "invitee": "f6d1afd5-aa6a-4c5e-8348-bf5a5310b5d2", "locations": [ { "range": "1-3", "unit": "point", "x": 341.2251, "y": 775.2541, "width": 30.0294, "height": 30.0294 } ] } ] } ], "expiresIn": 2592000, "expiresAt": "2022-01-31T00:00:00+00:00", "createdAt": "2022-01-01T00:00:00+00:00" }` ### Request [](https://developers.cm.com/sign/docs/getting-started#section-request) Field placement via web interface. **Request body** JSON `{ "name": "Purchase contract", "files": [ { "id": "3fa4ddab-56a4-48bb-9072-8a61b422ea82" } ], "invitees": [ { "name": "Invitee", "email": "[[email protected]](https://developers.cm.com/cdn-cgi/l/email-protection) ", "position": 1, "locale": "nl-NL" } ], "reminderIn": 604800, "prepare": true, "prepareReturnUrl": "https://example.com" }` **Response body** JSON `{ "id": "abb39845-421b-479a-a384-2e07580c0f0b", "name": "Purchase contract", "state": "draft", "locale": "en-US", "completed": false, "owners": [], "files": [ { "id": "3fa4ddab-56a4-48bb-9072-8a61b422ea82", "name": "Document", "hash": "a497a1df892b6d2f205460b730b09c3a00c366061fa8975a388ce9672a39e833", "contentType": "application/pdf", "uploadDateTime": "2022-01-01T00:00:00+00:00" } ], "invitees": [ { "id": "51b45bd2-5a1a-4375-9799-a19c58fa9924", "name": "Invitee", "email": "[[email protected]](https://developers.cm.com/cdn-cgi/l/email-protection) ", "phoneNumber": null, "authenticationMethods": [], "identificationMethods": [], "reference": null, "readOnly": false, "state": null, "stateComment": null, "stateChanged": null, "position": 1, "locale": "nl-NL", "redirectUrl": null, "fields": [] } ], "reminderIn": 604800, "prepareUrl": "https://www.cm.com/app/sign/prepare/abb39845-421b-479a-a384-2e07580c0f0b?t=eyJ0eXAiOiJKV1Qi...", "expiresIn": 2592000, "expiresAt": "2022-01-31T00:00:00+00:00", "createdAt": "2022-01-01T00:00:00+00:00" }` Send invites [](https://developers.cm.com/sign/docs/getting-started#send-invites) ------------------------------------------------------------------------------------- Once you have a complete dossier, you will have to send out a link to the invitees who will have to sign these documents. Sign can send emails automatically if you set `channel` to `email`. If you don't set the `channel` option, the invite URL will be included in the response. In this case you have to redirect the user to the `inviteUri` yourself. Invites have a configurable expiration time in seconds, the default is 30 days. > Please note if you place fields using the web interface this step first needs to complete before you can send an invite. `POST https://api.cm.com/sign/v1/dossiers/{dossierId}/invites` **Request headers** `Content-Type: application/json Authorization: Bearer GENERATED_TOKEN_HERE` **Request body** JSON `[ { "inviteeId": "80692813-3493-40e9-86c3-d3b6f7378929", "channel": "email", "expiresIn": 2592000 } ]` **Request body** (with custom message) JSON `[ { "inviteeId": "80692813-3493-40e9-86c3-d3b6f7378929", "channel": "email", "emailConfig": { "message": "Custom message here" }, "expiresIn": 2592000 } ]` **Response body** JSON `[ { "id": "22b33b45-bde6-45f4-a45a-ec1fa53ffffa", "inviteeId": "80692813-3493-40e9-86c3-d3b6f7378929", "inviteUri": null, "readOnly": false, "identificationMethod": null, "channel": "email", "reminder": false, "emailSentAt": "2022-01-01T00:00:00+00:00", "expiresIn": 2592000, "expiresAt": "2022-01-31T00:00:00+00:00", "createdAt": "2022-01-01T00:00:00+00:00" } ]` Download files [](https://developers.cm.com/sign/docs/getting-started#download-files) ----------------------------------------------------------------------------------------- Once the dossier is completed, you can download the documents. > Please note that the dossier can only be downloaded until the expiry of the dossier set by the `expiresIn` field. ### Document [](https://developers.cm.com/sign/docs/getting-started#document) To download the signed document, specifying the `type=file` query parameter. `GET https://api.cm.com/sign/v1/dossiers/{dossierId}/download?type=file` When there are multiple documents per dossier you will need to specify the file id. `GET https://api.cm.com/sign/v1/dossiers/{dossierId}/download?type=file&file=8d817359-7eb8-4b6e-9030-17ac286b7dc0` ### Audit Report [](https://developers.cm.com/sign/docs/getting-started#audit-report) The audit report contains all info and events related to the dossier for evidence purposes, specify the `type=auditReport` query parameter. `GET https://api.cm.com/sign/v1/dossiers/{dossierId}/download?type=auditReport` ### Full ZIP [](https://developers.cm.com/sign/docs/getting-started#full-zip) The ZIP file contains all signed documents, attachments and the audit report. `GET https://api.cm.com/sign/v1/dossiers/{dossierId}/download` Events [](https://developers.cm.com/sign/docs/getting-started#events) ------------------------------------------------------------------------- To get notified when a dossier is completed or other events occurred, you can subscribe to events. See: [Events](https://developers.cm.com/sign/docs/events) . Error handling [](https://developers.cm.com/sign/docs/getting-started#error-handling) ----------------------------------------------------------------------------------------- When an error occurs, you will receive a JSON response describing the error. The error codes per endpoint can be found in the [API reference](https://developers.cm.com/sign/reference/document) . Example: JSON `{ "status": 400, "message": "Error message" }` Updated about 2 months ago * * * [](https://www.cm.com/) * [Privacy Policy](https://www.cm.com/app/legal/cm-com/privacy-policy/) * [Terms and Conditions](https://www.cm.com/app/legal/cm-com/terms-and-conditions/) * [Cookie Policy](https://www.cm.com/about-cm/cookie-policy/) Jump to Product page Conversational AI Cloud Mobile Service Cloud Mobile Marketing Cloud Messaging Ticketing Payments Platform Voice Sign --- # Validation Webhook In this article we'll introduce the concept of validation webhooks in Conversational AI Cloud and what it means for a developer to work with them. > 📘 > > API Specification > > > ----------------------- > > If you want to know more about the request and response for the validation webhook go to the [API reference section here](https://developers.cm.com/conversational-ai-cloud/reference/post_transactionaldialogslot-1) Introduction [](https://developers.cm.com/conversational-ai-cloud/docs/validation-web-hook#introduction) ------------------------------------------------------------------------------------------------------------ Validation webhooks are used to validate the slots in a [transactional dialog](https://developers.cm.com/conversational-ai-cloud/docs/transactional-dialogs) . If there are multiple slots configured with validation webhooks for a single transactional dialog they'll get called in parallel. Use Cases [](https://developers.cm.com/conversational-ai-cloud/docs/validation-web-hook#use-cases) ------------------------------------------------------------------------------------------------------ A validation webhook can serve a variety of use cases, but are generally scoped to working within the confines of that specific transactional dialog slot however, as it is a webhook use cases are endless. Validation webhooks can be used to: * Validate provided user input against an external system like a CRM or OMS. * Validate provided user input against custom logic defined within the webhook. * Provide dynamic quick replies based on the state (session) of the conversation. * Provide dynamic metadata that'll be passed along to the caller of the Gateway API. Best-Practices [](https://developers.cm.com/conversational-ai-cloud/docs/validation-web-hook#best-practices) ---------------------------------------------------------------------------------------------------------------- When working with the validation webhook its important to keep a few things into account: * Since all validation webhooks will be called in parallel, you will receive calls on your webhook that aren't for the "active" slot. Make sure to always check if the call you're receiving is meant for the slot that your webhook is being called for. You can do this by checking matching the "inputSlotName" with the "slot.name" values in the input. If they match, the input you're provided with is for the slot your end-user saw. * Only set the "success" value to false if you want the "generic error message" to be returned. The success value should be set to true in all other circumstances. A valid scenario could be an unexpected internal error within the webhook. * It is not possible to mutate the state of the conversation (session) directly from a validation webhook. * Each validation webhook receives the entire state of the conversation automatically, make sure to use it to determine whether you already have the value you're planning to ask the user for. E.g., if you already have the postal code available in the conversation session, there is no need to ask the end-user for their postal code again, simply pre-fill it through your webhook. * Any output that'll be presented to the end-user will come from the webhook (if configured) this means that any message going to the end-user can be fully dynamic. Updated over 1 year ago * * * [](https://www.cm.com/) * [Privacy Policy](https://www.cm.com/app/legal/cm-com/privacy-policy/) * [Terms and Conditions](https://www.cm.com/app/legal/cm-com/terms-and-conditions/) * [Cookie Policy](https://www.cm.com/about-cm/cookie-policy/) Jump to Product page Conversational AI Cloud Mobile Service Cloud Mobile Marketing Cloud Messaging Ticketing Payments Platform Voice Sign --- # Ask a question ShellNodeRubyPHPPython [Log in to use your API keys](https://developers.cm.com/login?redirect_uri=/conversational-ai-cloud/reference/get_ask) Base URL https://api.digitalcx.com/ask Click `Try It!` to start a request and see the response here! [](https://www.cm.com/) * [Privacy Policy](https://www.cm.com/app/legal/cm-com/privacy-policy/) * [Terms and Conditions](https://www.cm.com/app/legal/cm-com/terms-and-conditions/) * [Cookie Policy](https://www.cm.com/about-cm/cookie-policy/) Jump to Product page Conversational AI Cloud Mobile Service Cloud Mobile Marketing Cloud Messaging Ticketing Payments Platform Voice Sign --- # Require Payment Sometimes a payment is required in order to Sign a document. For example a rental agreement. To use this feature you first need to have a payment contract. Please contact your customer success manager if you want to use this feature. To request a payment, provide the amount and currency. This is part of the `POST` request to `/dossiers`. `POST /dossiers` **Request body** JSON `{ "invitees":[ { "name": "John Doe", "payments":[ { "amount":100, "currency":"EUR" } ] } ] }` * `amount`: The amount of the payment in cents. * `currency`: The currency of the payment in [ISO 4217](https://en.wikipedia.org/wiki/ISO_4217) format. Retrieve payment status [](https://developers.cm.com/sign/docs/require-payment#retrieve-payment-status) ----------------------------------------------------------------------------------------------------------- `GET /dossiers/{dossierId}/invitees/{inviteeId}/payments` **Response body** JSON `[ { "amount": 100, "currency": "EUR", "status": "success", "paymentMethod": "IDEAL", "paymentReference": "ch-9a0a32bc-bb25-4f5f-8aeb-681276a738fe" } ]` * `amount`: The amount of the payment in cents. * `currency`: The currency of the payment in [ISO 4217](https://en.wikipedia.org/wiki/ISO_4217) format. * `status`: The payment status. * `paymentMethod`: The selected payment method. * `paymentReference`: The payment reference in the payment system. You usually don't have to retrieve the payment status, because a dossier can only be signed after the payment has been completed. When you received the dossier completed webhook or email, you know that the invitee has successfully paid. Updated 4 months ago * * * [](https://www.cm.com/) * [Privacy Policy](https://www.cm.com/app/legal/cm-com/privacy-policy/) * [Terms and Conditions](https://www.cm.com/app/legal/cm-com/terms-and-conditions/) * [Cookie Policy](https://www.cm.com/about-cm/cookie-policy/) Jump to Product page Conversational AI Cloud Mobile Service Cloud Mobile Marketing Cloud Messaging Ticketing Payments Platform Voice Sign --- # Introduction * * * [](https://www.cm.com/) * [Privacy Policy](https://www.cm.com/app/legal/cm-com/privacy-policy/) * [Terms and Conditions](https://www.cm.com/app/legal/cm-com/terms-and-conditions/) * [Cookie Policy](https://www.cm.com/about-cm/cookie-policy/) Jump to Product page Conversational AI Cloud Mobile Service Cloud Mobile Marketing Cloud Messaging Ticketing Payments Platform Voice Sign --- # POS Payments * * * [](https://www.cm.com/) * [Privacy Policy](https://www.cm.com/app/legal/cm-com/privacy-policy/) * [Terms and Conditions](https://www.cm.com/app/legal/cm-com/terms-and-conditions/) * [Cookie Policy](https://www.cm.com/about-cm/cookie-policy/) Jump to Product page Conversational AI Cloud Mobile Service Cloud Mobile Marketing Cloud Messaging Ticketing Payments Platform Voice Sign --- # Transaction Webhook In this article we'll introduce the concept of transaction webhooks in Conversational AI Cloud and what it means for a developer to work with them. > 📘 > > API Specification > > > ----------------------- > > If you want to know more about the request and response for the validation webhook go to the [API reference section here](https://developers.cm.com/conversational-ai-cloud/reference/post_transactionaldialogendslot-1) Introduction [](https://developers.cm.com/conversational-ai-cloud/docs/transaction-web-hook#introduction) ------------------------------------------------------------------------------------------------------------- Transaction webhooks are used to validate the end slot in a [transactional dialog](https://developers.cm.com/conversational-ai-cloud/docs/transactional-dialogs) . An end slot in a transactional dialog is called only when all slots in the transactional dialog have been filled in. Its the final check to determine whether all slots are filled in correctly, and can also be used to post data to an external system like a CRM/OMS or to fetch data based on the acquired data. Use Cases [](https://developers.cm.com/conversational-ai-cloud/docs/transaction-web-hook#use-cases) ------------------------------------------------------------------------------------------------------- A transaction webhook can serve a variety of use cases but as it is a webhook use cases are endless. Transaction webhooks can be used to: * Validate the sum of provided user input across all slots against an external system like a CRM or OMS. * Validate the sum of provided user input across all slots against custom logic defined within the webhook. * Reset a slot of the transactional dialog if validation doesn't pass * Update the state of the conversation by mutating the session object and returning it in the response of the webhook Best-Practices [](https://developers.cm.com/conversational-ai-cloud/docs/transaction-web-hook#best-practices) ----------------------------------------------------------------------------------------------------------------- When working with the validation webhook its important to keep a few things into account: * A transaction webhook is called once when all slots in the transactional dialog have a set value. If the transaction webhook decides to reset a slot, it will be called again once that slot is filled again. Ensure you don't get your end-users stuck in a validation loop inside the transactional dialog. * Only set the "success" value to false if you want the "generic error message" to be returned. The success value should be set to true in all other circumstances. A valid scenario could be an unexpected internal error within the webhook. * It is not possible to mutate the state of the conversation (session) directly from a validation webhook. * Transaction webhooks can mutate the state of a session in Conv. AI Cloud. You can however only set a key on the session if that key is defined as a conversation variable in the projects configuration. * When updating the session object through the webhooks response, it isn't required to specify the entire session object, a partial session object can also be returned. If a partial object is returned it'll be merged with the original session object. Updated over 1 year ago * * * [](https://www.cm.com/) * [Privacy Policy](https://www.cm.com/app/legal/cm-com/privacy-policy/) * [Terms and Conditions](https://www.cm.com/app/legal/cm-com/terms-and-conditions/) * [Cookie Policy](https://www.cm.com/about-cm/cookie-policy/) Jump to Product page Conversational AI Cloud Mobile Service Cloud Mobile Marketing Cloud Messaging Ticketing Payments Platform Voice Sign --- # About > ❗️ > > Disclaimer > > > ---------------- > > Please find the Conversational Router docs at [their new place on Readme](https://developers.cm.com/cmconnect/docs/about) > . Updated about 1 year ago * * * [](https://www.cm.com/) * [Privacy Policy](https://www.cm.com/app/legal/cm-com/privacy-policy/) * [Terms and Conditions](https://www.cm.com/app/legal/cm-com/terms-and-conditions/) * [Cookie Policy](https://www.cm.com/about-cm/cookie-policy/) Jump to Product page Conversational AI Cloud Mobile Service Cloud Mobile Marketing Cloud Messaging Ticketing Payments Platform Voice Sign --- # Create dossier onStatusUpdate post https://yourwebhook/ ShellNodeRubyPHPPython [Log in to use your API keys](https://developers.cm.com/login?redirect_uri=/sign/reference/post_dossiers) Base URL https://api.cm.com/sign/v1/dossiers Click `Try It!` to start a request and see the response here! [](https://www.cm.com/) * [Privacy Policy](https://www.cm.com/app/legal/cm-com/privacy-policy/) * [Terms and Conditions](https://www.cm.com/app/legal/cm-com/terms-and-conditions/) * [Cookie Policy](https://www.cm.com/about-cm/cookie-policy/) Jump to Product page Conversational AI Cloud Mobile Service Cloud Mobile Marketing Cloud Messaging Ticketing Payments Platform Voice Sign ---