Introduction
With our API it is possible to create PayLinks, e-Mandates and import records for our scripts. To use the PayLink and e-Mandate service, additional configuration and setup are required. Please contact our customer support if you would like to use additional services.
Please also read our Import and Result Data formats document.
GraphQL
Our API is written in GraphQL. On How To GraphQL you can read the fundamentals. Creating PayLinks should be as easy as using a REST API. We have added some examples of how to use our API with a GraphQL Client.
To explore our API and its documentation you could use the Altair GraphQL Client. This client has the option to set the required authentication header. Watch this demo video to view how to use the built-in documentation browser.
Image Added
Example collection for Altair
To explore our API and view all available fields, import the following collection to the Altair Client and update the header with your API key.
View file |
---|
name | alphacomm_collectmaxx_example.agc |
---|
|
API endpoint
Code Block |
---|
https://reminders.alphacommapi.com/v1 |
We use load balancers so a IP change is possible at any time.
Test endpoint
Contact us for the test endpoint and credentials.
API Keys
You will need an access key to connect to our API. Your keys can be managed through our portal. At the portal go to "Account → API keys". You must be a portal manager for your company to access this page.
Key usage
For each request set the "X-AUTH-TOKEN"
HTTP header with your key.
Key IP restriction
It is possible to allow keys to only work from certain IP addresses.
Code Block |
---|
127.1.1.1
192.1.0.0/32 |
Code example
We created one request example in PHP to get you started.
APIs
Through our API we provide multiple services. The requirements for fields are defined in the API itself. Use a GraphQL client to view the documentation. In this document, we will give you some examples to get started.
All the dates fields in our responses are formatted in RFC 3339, 'Y-m-d\TH:i:sP'.
Import
The import API is an alternative for our batch SFTP (CSV) import. Through this endpoint, you are able to import records. The records are batched and visible in the portal on the import page.
Note |
---|
When sending records to our API, we still starting import the records according to your account’s Import schedule. These import windows are visible at your upload page. |
Required fields
The scripts that are set up in our portal may be set up for voice messages, text messages or emails, that optionally contain a PayLink or e-Mandate. Each script has its own set of required fields.
When a new script is set up we will provide a list of required fields. You can also use our matrix of required fields for medium and services.
Status codes
More information about status codes, which are used at the portal and API.
Batch statuses
Name | Description |
---|
empty | No records added to this batch yet. |
queued | Records are waiting to be processed. |
running | Records are being processed. |
done | Records have finished processing. |
error | Something went wrong. |
Record statuses
Name | Description |
---|
notLoaded | Records that could not be read. |
loaded | Records that have been read. |
rejected | Records that could not be converted into a job. |
accepted | Records that could be converted into a job. |
enriching | Records that are currently enriching. |
created | Records that have created a new job. |
updated | Records that have updated an existing job. |
dropped | Records that could not be saved to the database. |
Through the 'addRecords' mutation you are able to add records.
Argument | Description | When to use |
---|
rows [RowInput!] | An endpoint that has a preset of fields. | This is the preferred way to deliver your records and usable in most cases. Use this option for small batches or loose records. |
file [FileInput!] | Base64 encoded file. For example: csv, xml, xlsx, xls, ods. | For large batch import, 1000 or more. Or when your script requires fields that are not available at the RowInput. |
If you have questions please contact us.
Examples
When we set up a new script we will inform you about the required fields.
This is an example of a mail with PayLink record using the RowInput.
Query body Code Block |
---|
mutation addRecords (
$file: FileInput,
$rows: [RowInput!]
) {
import {
addRecords(file: $file, rows: $rows) {
name
action
status
records {
scriptId
status
reference
messages {
context
message
level
}
}
}
}
} |
PayLink
To use this service we need to configure your iDEAL bank credentials and setup a landing page. Please contact us if you would like to use this service.
Status codes
Name | Description |
---|
ready | PayLink is created in our service. |
started | Transaction has been started. |
partially_paid | A part of the original PayLink amount is paid. |
paid | The complete PayLink amount is paid. |
cancelled | The last transaction of the PayLink has been cancelled. |
failed | The last transaction of the PayLink has failed. |
Examples
To make your start easier we have added some examples of common actions.
Keep in mind to use the POST method on all your request.
Create PayLink
Query
When using GraphQL you have the ability to define what fields you get in the response. For this example we only want the id of the created PayLink and the URLs.
Code Block |
mutation createPayLink($payLink: PayLinkInput!){
payLink {
create (payLink: $payLink) {
idVariables
Code Block |
---|
{
"rows": [
{
"reference": "f0e7a0c3",
"script": "1001",
"personFamilyName": "Alphacomm",
"toMailAddress": "reminders@alphacomm.nl",
shortUrl "toPhoneNumbers" => [
longUrl } "+31612345678",
} } |
Variables
This is the minimal information we need to create a PayLink.
Code Block |
---|
{ "payLink": { "personName": "Alphacomm",
"invoiceAmount": "15497",
"invoiceCurrency": "EUR",
],
"invoiceDescription": "Example payment",
"invoiceReference": "103482",
"invoiceDate": "2019-02-12T10:00:00+00:00"
}
} |
Response
Code Block |
---|
{04-04",
"datainvoiceDueDate": {"2019-07-30",
"payLinkinvoiceReference": {"40824524",
"createinvoiceCurrency": {"EUR",
"idinvoiceAmount": "a62c3726-d3b2-4b8c-8e4c-48ee0fd9451c56445",
"shortUrlinvoiceNumber": "https://ibanaccept.com/u8t1nbw249075245",
"longUrlpersonBirthDay": "https://alphacomm.ibanaccept.com/pay/a62c3726-d3b2-4b8c-8e4c-48ee0fd9451c2000-01-01"
}
}
]
}
} |
Simple PayLink search
A basic search on all PayLinks.
Query
Code Block |
---|
|
query {
payLinkResponse
We only return the records that were send during the request. This makes it easier to validate if added records are accepted, using the record’s reference.
Code Block |
---|
{
"data": {
payLinks"import": {
items"addRecords": {
status"name": "20190403-965",
id"action": "IMPORT",
} "status": "done",
} } } |
Variables
No variables needed for this query.
Response
Code Block |
---|
{ "datarecords": [
{ "payLink": { {
"payLinks": { "itemsreference": [
{
"status": "paid""f0e7a0c3",
"idscriptId": "a6e8b63c-927f-476b-8d47-d323e20e1a4f"
}1001",
{ "status": "cancelledaccepted",
"idmessages": "348bd90d-da76-4211-93c3-601cbb15f33a"[]
},
]
{ }
}
"status": "ready",
"id": "389f0187-6b5d-4896-8d78-e56a6bb1a156"
}
]
}
}
}
} |
Find single PayLink
An example of how to get the status of a single PayLink.
Query
Code Block |
---|
|
query PayLinks(
$filters: PayLinkFiltersInput
) {
payLink {
payLinks (
filters: $filters
) {
items}
} |
This is an example with FileInput. Your file should be sent as a Base64 encoded string. An imported file will always respond with a status queued. The slight delay is deliberate because we need time to process all records. It is possible to send a second request to get the status of the batch.
Query body Code Block |
---|
mutation addFile (
$file: FileInput,
$rows: [RowInput!]
) {
import {
addRecords(file: $file, rows: $rows) {
name
action
status
}
}
} |
Variables
Code Block |
---|
{
"file": {
"extension": "csv",
"contents": "<<BASE64 ENCODED STRING>>"
}
} |
Response
When a file is imported we will always respond with a status queued. Bacause we need some time to process the file.
Code Block |
---|
{
"data": {
"import": {
"addRecords": {
id "name": "20190404-579",
personName "action": "IMPORT",
personGender "status": "queued",
status "records": []
amountPaid }
}
}
createdOn} |
Search batches
This is an example of searching for a batch by name.
Query body Code Block |
---|
query ImportSearch(
$filters: BatchFiltersInput
) {
import {
updatedOn batches(
} filters: $filters
} ) {
} } |
Variables
Code Block |
---|
{ "filters":items {
"id": { name
"equalTo": "5be41c4f-9fe6-403d-980b-5edc0139ee70" action
} } } |
Response
Code Block |
---|
{ "data":status
{ "payLink": {}
"payLinks":pagination {
"items":offset
[ limit
{ total
"id": "5be41c4f-9fe6-403d-980b-5edc0139ee70",}
}
}
} |
Variables
Code Block |
---|
{
"personNamefilters": "Demo",{
"name": {
"personGenderequalTo": "UTest",
}
}
} |
Response
Code Block |
---|
{
"statusdata": "paid",{
"import": {
"amountPaidbatches": {
"items": [
{
"name": 0"Test",
"createdOnaction": "2019-02-05T09:57:14+00:00VALIDATE",
"updatedOnstatus": "2019-02-05T09:57:14+00:00empty"
}
],
"pagination": {
} }
"offset": 0,
} } |
Advanced PayLink search
An example of how to find all PayLinks with the status paid created on 08-02-2019.
You have the option to set filters, order, offset and limit. All the options are defined in the API docs.
Query
Code Block |
---|
|
query PayLinks( $filters: PayLinkFiltersInput $order"limit": PayLinkOrderInput20,
$offset: Int $limit: Int ) {
payLink {
payLinks (
filters: $filters "total": 1
order: $order }
offset: $offset}
}
limit: $limit
) {
items {
id
personName
personGender
}
} |
PayLink
To use this service we need to configure your iDEAL bank credentials and set up a landing page. Please contact us if you would like to use this service.
Status codes
Name | Description |
---|
ready | PayLink is created in our service. |
started | Transaction has been started. |
partially_paid | A part of the original PayLink amount is paid. |
paid | The complete PayLink amount is paid. |
cancelled | The last transaction of the PayLink has been cancelled. |
failed | The last transaction of the PayLink has failed. |
Examples
To make your start easier we have added some examples of common actions.
Keep in mind to use the POST method on all your request.
Create PayLink
When using GraphQL you have the ability to define what fields you get in the response. For this example, we only want the id of the created PayLink and the URLs.
Query body Code Block |
---|
mutation createPayLink($payLink: PayLinkInput!){
payLink {
create (payLink: $payLink) {
attributes status
{ id value }
id
shortUrl
longUrl
}
}
} |
Variables
This is the minimal information we need to create a PayLink.
Us the field visibleUntil
to set the date when payment should not be possible anymore.
By default, the PayLink expires 90 days after the date of creation.
Code Block |
---|
{
"payLink": {
"attributes": [
{"id": amountPaid
createdOn
updatedOn
}
pagination {
offset
limit
total
}
}
}
} |
Variables
Code Block |
---|
{
"filters": {
"status": {
"equalTo": "paid"
},
"createdOn": {
"greaterThan": "2019-02-08T00:00:00+00:00",
"lesserThan": "2019-02-09T00:00:00+00:00"
}
},
"order": {
"createdOn": "DESCENDING"
},
"offset": 0,
"limit": 20
} |
Response
Code Block |
---|
{
"data": {
"payLink": {
"payLinks": {
"items": [
{
"id": "5be41c4f-9fe6-403d-980b-5edc0139ee70",
"personName": "Demo",
"personGender": "U",
"source", "value": "whatsapp"}
],
"personName": "Alphacomm",
"invoiceAmount": "15497",
"invoiceCurrency": "EUR",
"invoiceDescription": "Example",
"invoiceReference": "103482",
"invoiceDate": "2019-02-12T10:00:00+00:00"
}
} |
Response
Code Block |
---|
{
"data": {
"payLink": {
"create": {
"attributes": [
{
"id": "customer_source",
"value": "whatsapp"
},
{
"id": "origin",
"value": "api"
}
],
"id": "a62c3726-d3b2-4b8c-8e4c-48ee0fd9451c",
"shortUrl": "https://ibanaccept.com/u8t1nbw",
"longUrl": "https://alphacomm.ibanaccept.com/pay/a62c3726-d3b2-4b8c-8e4c-48ee0fd9451c"
}
}
}
} |
Simple PayLink search
A basic search on all PayLinks.
Query body Code Block |
---|
|
query {
payLink {
payLinks {
items {
status
id
}
pagination {
offset
limit
total
}
}
}
} |
Variables
No variables are needed for this query.
Response
Code Block |
---|
{
"data": {
"payLink": {
"payLinks": {
"items": [
{
"status": "paid",
"id": "a6e8b63c-927f-476b-8d47-d323e20e1a4f"
},
{
"status": "cancelled",
"id": "348bd90d-da76-4211-93c3-601cbb15f33a"
},
{
"status": "ready",
"id": "389f0187-6b5d-4896-8d78-e56a6bb1a156"
}
],
"pagination": {
"offset": 0,
"limit": 20,
"total": 3
}
}
}
}
} |
Find Single PayLink
An example of how to get the status of a single PayLink.
Query body Code Block |
---|
|
query PayLinks(
$filters: PayLinkFiltersInput
) {
payLink {
payLinks (
filters: $filters
) {
items {
id
personName
personGender
status
amountPaid
createdOn
updatedOn
}
}
}
} |
Variables
Code Block |
---|
{
"filters": {
"id": {
"equalTo": "5be41c4f-9fe6-403d-980b-5edc0139ee70"
}
}
} |
Response
Code Block |
---|
{
"data": {
"payLink": {
"payLinks": {
"items": [
{
"id": "5be41c4f-9fe6-403d-980b-5edc0139ee70",
"personName": "Demo",
"personGender": "U",
"status": "paid",
"amountPaid": 0,
"createdOn": "2019-02-05T09:57:14+00:00",
"updatedOn": "2019-02-05T09:57:14+00:00"
}
]
}
}
}
} |
Search PayLink with record identifer
PayLinks can not only be created through our API but also though the import to our scripts. In this last case the PayLink is delivered by us via email or SMS.
During a record import you are required to define the ‘idenfification_identifier' or also called 'reference’. In case you want to know what the current status of the PayLink is your are able to search our PayLink service with this reference.
Query body Code Block |
---|
|
query PublicApiPayLinks(
$filters: PayLinkFiltersInput
$order: PayLinkOrderInput
$offset: Int
$limit: Int
) {
payLink {
payLinks (
filters: $filters
order: $order
offset: $offset
limit: $limit
) {
items {
attributes {
id
value
}
id
personName
personGender
status
}
}
}
} |
Variables
Code Block |
---|
{
"filters": {
"attributes": [
{
"id": "reference",
"equalTo": "20220216-6"
}
]
}
} |
Response
Code Block |
---|
{
"data": {
"payLink": {
"payLinks": {
"items": [
{
"attributes": [
{
"id": "origin",
"value": "sms"
},
{
"id": "script",
"value": "1003"
},
{
"id": "reference",
"value": "20220216-6"
}
],
"id": "42c949b9-5945-4273-912d-00f5563df1fd",
"personName": "Alphacomm",
"personGender": "M",
"status": "ready"
}
]
}
}
}
} |
Advanced PayLink search
An example of how to find all PayLinks with the status paid created on 08-02-2019.
You have the option to set filters, order, offset and limit. All the options are defined in the API docs.
Query body Code Block |
---|
|
query PayLinks(
$filters: PayLinkFiltersInput
$order: PayLinkOrderInput
$offset: Int
$limit: Int
) {
payLink {
payLinks (
filters: $filters
order: $order
offset: $offset
limit: $limit
) {
items {
id
personName
personGender
status
amountPaid
createdOn
updatedOn
}
pagination {
offset
limit
total
}
}
}
} |
Variables
Code Block |
---|
{
"filters": {
"status": {
"equalTo": "paid"
},
"createdOn": {
"greaterThan": "2019-02-08T00:00:00+00:00",
"lesserThan": "2019-02-09T00:00:00+00:00"
}
},
"order": {
"createdOn": "DESCENDING"
},
"offset": 0,
"limit": 20
} |
Response
Code Block |
---|
{
"data": {
"payLink": {
"payLinks": {
"items": [
{
"id": "5be41c4f-9fe6-403d-980b-5edc0139ee70",
"personName": "Demo",
"personGender": "U",
"status": "paid",
"amountPaid": 0,
"createdOn": "2019-02-05T09:57:14+00:00",
"updatedOn": "2019-02-05T09:57:14+00:00"
},
{
"id": "96f3cf79-98ab-43d1-80ca-fa5c9fccab23",
"personName": "Test Person",
"personGender": "U",
"status": "paid",
"amountPaid": 0,
"createdOn": "2019-02-01T14:49:35+00:00",
"updatedOn": "2019-02-01T14:49:36+00:00"
}
],
"pagination": {
"offset": 0,
"limit": 0,
"total": 2
}
}
}
}
} |
E-Mandate
To use this service we need to configure your e-Mandate bank credentials and setup a landing page. Please contact us if you would like to use this service.
Status codes
Name | Description |
---|
new | Mandate is created on our service. |
pending | Waiting for second authorization. |
success | Mandate is given. |
Examples
To make your start easier we have added some examples of common actions.
Keep in mind to use the POST method on all your request.
Create Mandate
When using GraphQL you have the ability to define what fields you get in the response. For this example, we only want the id, reference, URLs and type.
Query body Code Block |
---|
mutation createMandate($mandate: MandateInput!){
mandate {
create (mandate: $mandate) {
id
reference
shortUrl
longUrl
type
}
}
} |
Variables
Example values.
Code Block |
---|
{
"mandate": {
"personName": "Alphacomm",
"reference": "AC-HUUR"
"type": "RCUR",
"reason": "huur",
"debtorReference": "20190301"
}
} |
Response
Code Block |
---|
{
"data": {
"mandate": {
"create": {
"id": "4442ddf6-7371-4e6a-8939-087f8fd3b17c",
"reference": "AC-HUUR",
"shortUrl": "https://betaalmachtiging.nl/akps797",
"longUrl": "https://alphacomm.betaalmachtiging.nl/pay/94e592f0-9f21-4404-bdfe-a6e51c6bf547",
"type": "RCUR"
}
}
}
} |
Simple Mandate search
A basic search query for all Mandates.
Query body Code Block |
---|
|
query {
mandate {
mandates {
items {
status
id
}
}
}
} |
Variables
No variables are needed for this query.
Response
Code Block |
---|
{
"data": {
"mandate": {
"mandates": {
"items": [
{
"status": "new",
"id": "a6e8b63c-927f-476b-8d47-d323e20e1a4f"
},
{
"status": "pending",
"id": "348bd90d-da76-4211-93c3-601cbb15f33a"
},
{
"status": "success",
"id": "389f0187-6b5d-4896-8d78-e56a6bb1a156"
}
]
}
}
}
} |
Find Single Mandate
An example of how to get the status of a single Mandate.
Query body Code Block |
---|
|
query Mandates(
$filters: MandateFiltersInput
) {
mandate {
mandates (
filters: $filters
) {
items {
id
personName
status
createdOn
updatedOn
}
}
}
} |
Variables
Code Block |
---|
{
"filters": {
"id": {
"equalTo": "5be41c4f-9fe6-403d-980b-5edc0139ee70"
}
}
} |
Response
Code Block |
---|
{
"data": {
"mandate": {
"mandates": {
"items": [
{
"id": "5be41c4f-9fe6-403d-980b-5edc0139ee70",
"personName": "Demo",
"status": "success",
"createdOn": "2019-02-05T09:57:14+00:00",
"updatedOn": "2019-02-05T09:57:14+00:00"
}
]
}
}
}
} |
Advanced Mandate search
An example of how to find all e-Mandates with the status success, created on 08-02-2019.
You have the option to set filters, order, offset and limit. All the options are defined in the API docs.
Query body Code Block |
---|
|
query Mandates(
$filters: MandateFiltersInput
$order: MandateOrderInput
$offset: Int
$limit: Int
) {
mandate {
mandates (
filters: $filters
order: $order
offset: $offset
limit: $limit
) {
items {
id
personName
status
createdOn
updatedOn
}
pagination {
offset
limit
total
}
}
}
} |
Variables
Code Block |
---|
{
"filters": {
"status": {
"equalTo": "success"
},
"createdOn": {
"greaterThan": "2019-02-08T00:00:00+00:00",
"lesserThan": "2019-02-09T00:00:00+00:00"
}
},
"order": {
"createdOn": "DESCENDING"
},
"offset": 0,
"limit": 20
} |
Response
Code Block |
---|
{
"data": {
"mandate": {
"mandates": {
"items": [
{
"id": "5be41c4f-9fe6-403d-980b-5edc0139ee70",
"personName": "Demo",
"status": "success",
"createdOn": "2019-02-05T09:57:14+00:00",
"updatedOn": "2019-02-05T09:57:14+00:00"
},
{
"id": "96f3cf79-98ab-43d1-80ca-fa5c9fccab23",
"personName": "Test Person",
"status": "success",
"createdOn": "2019-02-01T14:49:35+00:00",
"updatedOn": "2019-02-01T14:49:36+00:00"
}
],
"pagination": {
"offset": 0,
"limit": 0,
"total": 2
}
}
}
}
} |
Voice
To use this service we need to configure a voice script. Please contact us if you would like to use this service.
Examples
To make your start easier we have added some examples of common actions.
Stop Calling
Use this action to remove any leftover scheduled voice calls, related to the specified scriptId and reference.
Query body Code Block |
---|
mutation stopCalling(
$scriptId: Int!
$reference: String!
){
voice {
stopCalling (
scriptId: $scriptId
reference: $reference
)
}
} |
Variables
Code Block |
---|
{
"scriptId": 18301,
"reference": "your_identifier"
} |
Response
Code Block |
---|
{
"data": {
"voice": {
"stopCalling": "done"
}
}
} |
Webhook events
Note |
---|
We are working on adding more events and improving the information in the payload. So the content of the data might change. |
Voice
Call completed
Field | | Format |
---|
datetime string | When the event occurred | RFC3339
2023-10-12T07:20:50.52Z |
id string | Identifying the call. | UUID d670a4af-8562-4d5f-ae30-5cc36acf82ee
|
serviceId string | Identifier of the Call Request.
| UUID a2654d8a-3f8d-402e-a03b-980953802a09
|
serviceId string | voice | |
reference string | Identifier used during import, also know as identification_identifier | |
event string | | Code Block |
---|
VoiceCallCompleted |
|
data array | | See Data table below. |
Data | | |
---|
direction string | Call direction | ENUM DIRECTION Code Block |
---|
outbound
inbound |
|
status string | The call status | ENUM STATUS Code Block |
---|
ringing
active
finished
no answer
busy
rejected
invalid number
failed |
|
localNumber string | | E164 |
remoteNumber string | | E164 |
events array | Array of events during the call, contains the following fields Code Block |
---|
| nodeId: string, node identifier
nodeType: string, ENUM NODETYPE
order: int, event order
type: string, ENUM EVENTTYPE
data: array, data that is specific to the node type and event type
time: string, RFC3339 |
Empty when call is not answered. | Code Block |
---|
NODETYPE:
AddResult
CheckCallAttempt
CheckCounter
CheckGenderBirthday
CheckVariable
DTMF
DTMFString
Forward
Hangup
IsCallOutbound
IsRemoteMobile
IsRemoteVoiceMail
IsTimeInInterval
Sound
WaitForSilence
EVENTTYPE:
NodeStart
NodeUpdate
NodeResult |
|
answeredOn string | not set if the call has not been answered. | RFC3339
2019-10-12T07:20:50.52Z |
Example
Expand |
---|
title | Call completed, answered |
---|
|
Code Block |
---|
{
"datetime": "2022-09-08T14:22:52+00:00",
"id": "f3e445ce-75ee-4c94-9d6d-370949664fd7",
"serviceId": "f3e445ce-75ee-4c94-9d6d-370949664fd7",
"service": "voice",
"reference": "20231208-1547471",
"event": "VoiceCallCompleted",
"data": {
"direction": "outbound",
"status": "finished",
"localNumber": "3225882397",
"remoteNumber": "316123456789",
"answeredOn": "2022-09-08T14:23:10+00:00",
"events": [
{
"nodeId": "vm_beep",
" | statuspaid
amountPaid0
createdOn2019-02-05T09:57:14+00:00NodeStart",
"data": [],
" | updatedOn20190205T095714
id96f3cf79-98ab-43d1-80ca-fa5c9fccab23 personNameTest Person
personGender"U" statuspaid
amountPaid0,
createdOn20190201T144935,"updatedOn":"2019-02-01T14:49:36+00:00" "nodeId": "vm_wait_for_silence",
| } ]"nodeType": "WaitForSilence",
" | pagination{ offset0
limit0 total2
"2022-09-08T14:23:17+00:00"
},
| }}}
} |
E-Mandate
To use this service we need to configure your e-Mandate bank credentials and setup a landing page. Please contact us if you would like to use this service.
Status codes
Name | Description |
---|
new | Mandate is created on our service. |
pending | Waiting for second authorization. |
success | Mandate is given. |
Examples
To make your start easier we have added some examples of common actions.
Keep in mind to use the POST method on all your request.
Create Mandate
Query
When using GraphQL you have the ability to define what fields you get in the response. For this example we only want the id, reference, the URLs and type.
Code Block |
---|
mutation createMandate($mandate: MandateInput!){
mandate {
create (mandate: $mandate) { "nodeId": "vm_wait_for_silence",
"nodeType": "WaitForSilence",
"order": 4,
"type": "NodeResult",
"data": [],
"time": "2022-09-08T14:23:18+00:00"
},
{
"nodeId": "name",
| id
referenceshortUrl longUrltype}}} |
Variables
Example values.
Code Block |
---|
{mandate": {time": "2022-09-08T14:23:18+00:00"
| "personName": "Alphacomm""reference":"AC-HUUR" "type":"RCUR",reasonhuur debtorReference20190301}} |
Response
Code Block |
---|
{data{mandate{create{id4442ddf67371-4e6a-8939-087f8fd3b17c","reference": "AC-HUUR",shortUrlhttps://betaalmachtiging.nl/akps797longUrlhttps://alphacomm.betaalmachtiging.nl/pay/94e592f0-9f21-4404-bdfe-a6e51c6bf547type"RCUR"
} }
}
} |
Simple e-Mandate search
A basic search on all e-Mandates.
Query
Code Block |
---|
|
query {
mandate {"type": "NodeStart",
"data": [],
| mandates{ "time": "2022-09-08T14:23:20+00:00"
| items{status id"nodeId": "invoice_reference",
| }}}} |
Variables
No variables needed for this query.
Response
Code Block |
---|
{data{mandate{mandates{items["2022-09-08T14:23:22+00:00"
},
| { statusnew ida6e8b63c-927f-476b-8d47-d323e20e1a4f" } {
status"pending",
id348bd90dda76-4211-93c3-601cbb15f33a"09-08T14:23:22+00:00"
},
{
| },{ "nodeType": "IsRemoteVoiceMail",
" | status"success" id389f0187-6b5d-4896-8d78-e56a6bb1a156"}]}}
}
} |
Find single Mandate
An example of how to get a status of a single Mandate.
Query
Code Block |
---|
|
query Mandates(
$filters: MandateFiltersInput
) {
mandate {
mandates ( filters: $filters"time": "2022-09-08T14:23:22+00:00"
| ){items{idpersonNamestatuscreatedOnupdatedOn "time": "2022-09-08T14:23:22+00:00"
},
| }}} |
Variables
Code Block |
---|
{filters{
"id": {equalTo5be41c4f-9fe6-403d-980b-5edc0139ee70"
}
}
} |
Response
Code Block |
---|
{data{mandate{mandates{items["2022-09-08T14:23:25+00:00"
},
| { id5be41c4f-9fe6-403d-980b-5edc0139ee70
personNameDemoAddResult",
"order": 13,
" | statussuccessNodeStart",
"data": [],
" | createdOn20190205T09571400:00",updatedOn2019-02-05T09:57:14+00:00"success",
"nodeType": "AddResult",
| } ]}}}} |
Advanced Mandate search
An example on how to find all e-Mandates with the status success, created on 08-02-2019.
You have the option to set filters, order, offset and limit. All the options are defined in the API docs.
Query
Code Block |
---|
|
queryMandates( $filtersMandateFiltersInput$order:MandateOrderInput$offset:Int$limitInt){mandate{mandates( filters: $filters"time": "2022-09-08T14:23:25+00:00"
},
| order:$orderoffset:$offset limit: $limit){items{idpersonName
status"time": "2022-09-08T14:23:25+00:00"
},
| createdOnupdatedOn}pagination{offsetlimittotal}}}} |
Variables
Code Block |
---|
{"filters": {
"status":{equalTosuccess"
},
"createdOn": {"greaterThan": "2019-02-08T00:00:00+00:00",lesserThan20190209T000000
}"order":{"createdOn":"DESCENDING"},offset0"limit":20} |
Response
Code Block |
---|
{data{
"mandate": {mandates{items[ {
id5be41c4f9fe6-403d-980b-5edc0139ee70",
"personName":"Demo",statussuccess
createdOn2019-02-05T09:57:14+00:00 updatedOn"2019-02-05T09:57:14+00:00" } {
id96f3cf7998ab-43d1-80ca-fa5c9fccab23", "personName": "Test Person", "status |
PayLink
Event
Field | | Format |
---|
datetime string | When the event occurred | RFC3339
2023-10-12T07:20:50.52Z |
id string | Identifying the event uniquely | UUID d670a4af-8562-4d5f-ae30-5cc36acf82ee
|
serviceId string | Identifier of the PayLink | UUID a2654d8a-3f8d-402e-a03b-980953802a09
|
serviceId string | paylink | |
reference string | Identifier used during import, also know as identification_identifier | Empty when created through our API. |
event string | | Code Block |
---|
PayLinkVisited
PayLinkPaid |
|
data array | | Code Block |
---|
{
"payment-method": " |
|
successideal",
"transaction-amount": 1344 # Amount in cents
} |
|
Example Paid
Code Block |
---|
{
"createdOndatetime": "20192022-0211-01T1411T11:49:35+00:0011:11.11Z",
"id": "f3e445ce-75ee-4c94-9d6d-370949664fd7",
"reference": "",
"updatedOnserviceId": "2019-02-01T14:49:36+00:00"adbc180b-a494-477f-958d-9f0b050a09c3",
}
]"service": "paylink",
"event": "PayLinkPaid",
"paginationdata": {
"offset"payment-method": 0"ideal",
"transaction-amount": 114
}
"limit": 0,
"total": 2
}
}
}
}
} |
Voice
To use this service we need to configure a voice script. Please contact us if you would like to use this service.
Examples
To make your start easier we have added some examples of common actions.
Keep in mind to use the POST method on all your request.
Stop calling
Use this action to remove any leftover scheduled voice calls, related to the specified scriptId and reference.
Query
Code Block |
---|
mutation stopCalling(
$scriptId: Int!
$reference: String!
){
voice {
stopCalling (
scriptId: $scriptId
reference: $reference
)
}
} |
Variables
Code Block |
---|
{
"scriptId": 18301,
"reference": "your_identifier"
} |
Response
Code Block |
---|
{
"data": {
"voice": {
"stopCalling": "done"
}
}
} |
Webhook
The voice service supports the use of webHooks, the body looks as follows:
Code Block |
---|
|
FORMAT
id: UUID, identifying the call uniquely
attributes: associative array
direction: string, ENUM DIRECTION
status: string, ENUM STATUS
localNumber: string, E164
remoteNumber: string, E164
events: list of associative arrays with the following format
nodeId: string, node identifier
nodeType: string, ENUM NODETYPE
order: int, event order
type: string, ENUM EVENTTYPE
data: array, data that is specific to the node type and event type
time: string, RFC3339
createdOn: string, RFC3339
updatedOn: string, RFC3339
answeredOn: string, RFC3339, not set if the call has not been answered
ENUMS
direction:
outbound
inbound
status:
ringing
active
finished
no answer
busy
rejected
invalid number
failed
nodetype:
AddResult
CheckCallAttempt
CheckCounter
CheckGenderBirthday
CheckVariable
DTMF
DTMFString
Forward
Hangup
IsCallOutbound
IsRemoteMobile
IsRemoteVoiceMail
IsTimeInInterval
Sound
WaitForSilence
eventtype:
NodeStart
NodeUpdate
NodeResult |
Code Block |
---|
|
{
"id": "e7813601-21ae-465c-bd97-96367bebd0ca",
"attributes": {
"origin": "annabel",
"customer": "6500",
"script": "6512",
"job": "eb44f88bd968749a620765a382ef3c75c20a657c37499392d59958c5dd944652-06512"
},
"direction": "outbound",
"status": "finished",
"localNumber": "31513703800",
"remoteNumber": "31640754459",
"host": "8ed68ab81de6",
"events": [}
|
Voice webhook V1
The voice service supports the use of webhook messages. When a voice call has been completed the result will be reported to your webhook URL. We can authenticate to your webhook with basic access authentication.
Contact us to configure your webhook URL.
The webhook request is a standard HTTP POST request with a JSON body, which is formatted as follows.
Field | | Format |
---|
id string | UUID, identifying the call uniquely | |
attributes array | Contains the 'reference' used at import (identification_identifier). | |
direction string | Call direction | ENUM DIRECTION Code Block |
---|
outbound
inbound |
|
status string | The call status | ENUM STATUS Code Block |
---|
ringing
active
finished
no answer
busy
rejected
invalid number
failed |
|
localNumber string | | E164 |
remoteNumber string | | E164 |
events array | Array of events during the call, contains the following fields Code Block |
---|
| nodeId: string, node identifier
nodeType: string, ENUM NODETYPE
order: int, event order
type: string, ENUM EVENTTYPE
data: array, data that is specific to the node type and event type
time: string, RFC3339 |
Empty when call is not answered. | Code Block |
---|
NODETYPE:
AddResult
CheckCallAttempt
CheckCounter
CheckGenderBirthday
CheckVariable
DTMF
DTMFString
Forward
Hangup
IsCallOutbound
IsRemoteMobile
IsRemoteVoiceMail
IsTimeInInterval
Sound
WaitForSilence
EVENTTYPE:
NodeStart
NodeUpdate
NodeResult |
|
createdOn string | | RFC3339
2019-10-12T07:20:50.52Z |
updatedOn string | | RFC3339
2019-10-12T07:20:50.52Z |
answeredOn string | not set if the call has not been answered. | RFC3339
2019-10-12T07:20:50.52Z |
How to determine a call has reached the success point
To determine a call was successful a defined point in the voice message should be reached.
This is always an AddResult type node with a data result value success-ok
Code Block |
---|
...
"events": [
{
"nodeId": "success",
"nodeType": "AddResult",
"order": 16,
"type": "NodeResult",
"data": {
"result": "success-ok"
},
"time": "2020-05-06T08:43:11+00:00"
}
]
... |
Info |
---|
Use the NodeResult type with the data['result'] value when evaluating the events. The NodeId’s are more likely to change when altering voice script flows. |
Example message for an outbound call
Expand |
---|
Code Block |
---|
| {
"id": "e7813601-21ae-465c-bd97-96367bebd0ca",
"attributes": {
"origin": "annabel",
"customer": "6500",
"script": "6512",
"job": "eb44f88bd968749a620765a382ef3c75c20a657c37499392d59958c5dd944652-06512",
"reference": "API reference / identification_identifier"
},
"direction": "outbound",
"status": "finished",
"localNumber": "31513703800",
"remoteNumber": "31640754459",
"events": [{
"nodeId": "vm_beep",
"nodeType": "Sound",
"order": 1,
"type": "NodeStart",
"data": [],
"time": "2020-05-06T08:42:55+00:00"
}, {
"nodeId": "vm_beep",
"nodeType": "Sound",
"order": 2,
"type": "NodeResult",
"data": [],
"time": "2020-05-06T08:42:59+00:00"
}, {
"nodeId": "vm_wait_for_silence",
"nodeType": "WaitForSilence",
"order": 3,
"type": "NodeStart",
"data": [],
"time": "2020-05-06T08:42:59+00:00"
}, {
"nodeId": "vm_is_ | beepSoundIsRemoteVoiceMail",
"order": | 15,
"type": "NodeStart",
"data": [],
"time": "2020-05-06T08: | 425500+00:00"
}, {
"nodeId": " | vm_beeptext10",
"nodeType": "Sound",
"order": | 2NodeResultNodeStart",
"data": [],
"time": "2020-05-06T08: | 425900+00:00"
}, {
"nodeId": " | vm_wait_for_silenceWaitForSilence3NodeStartNodeResult",
"data": [],
"time": "2020-05-06T08: | 425905+00:00"
}, {
"nodeId": " | vm_is_vmIsRemoteVoiceMailCheckGenderBirthday",
"order": | 59,
"type": "NodeStart",
"data": [],
"time": "2020-05-06T08:43: | 0005+00:00"
}, {
"nodeId": " | text10SoundCheckGenderBirthday",
"order": | 7NodeStartNodeResult",
"data": {
"gender": "M",
"age": 2020,
"outcome": | []"man"
},
"time": "2020-05-06T08:43: | 0005+00:00"
}, {
"nodeId": " | text10text11m",
"nodeType": "Sound",
"order": | 8NodeResultNodeStart",
"data": [],
"time": "2020-05-06T08:43:05+00:00"
}, {
"nodeId": " | filterCheckGenderBirthday9NodeStartNodeResult",
"data": [],
"time": "2020-05-06T08:43: | 0508+00:00"
}, {
"nodeId": " | filterCheckGenderBirthday10NodeResult{
"gender": "M",
"age": 2020 outcome": "man"
},
"time": "2020-05-06T08:43: | 0509+00:00"
}, {
"nodeId": " | text11mname",
"nodeType": "Sound",
"order": | 11NodeStartNodeResult",
"data": [],
"time": "2020-05-06T08:43: | 0510+00:00"
}, {
"nodeId": " | text11mSound12NodeResultNodeStart",
"data": [],
"time": "2020-05-06T08:43: | 0811+00:00"
}, {
"nodeId": " | nameSound13NodeStartNodeResult",
"data": {
"result": | [] "success-ok"
},
"time": "2020-05-06T08:43: | 0911+00:00"
}, {
"nodeId": " | namecollect_id",
"nodeType": "Sound",
"order": | 14NodeResultNodeStart",
"data": [],
"time": "2020-05-06T08:43: | 1011+00:00"
}, {
"nodeId": " | successcollect_id",
"nodeType": " | AddResult15NodeStartNodeResult",
"data": [],
"time": "2020-05-06T08:43: | 1116+00:00"
}, {
"nodeId": " | successAddResult16NodeResult{
"result": "success-ok"
}[],
"time": "2020-05-06T08:43: | 1117+00:00"
}, {
"nodeId": " | collect_idtext22",
"nodeType": "Sound",
"order": | 17NodeStartNodeResult",
"data": [],
"time": "2020-05-06T08:43: | 1123+00:00"
}, {
"nodeId": " | collect_idamount",
"nodeType": "Sound",
"order": | 18NodeResultNodeStart",
"data": [],
"time": "2020-05-06T08:43: | 1624+00:00"
}, {
"nodeId": " | text22amount",
"nodeType": "Sound",
"order": | 19NodeStartNodeResult",
"data": [],
"time": "2020-05-06T08:43: | 1728+00:00"
}, {
"nodeId": " | text22text30",
"nodeType": "Sound",
"order": | 20NodeResultNodeStart",
"data": [],
"time": "2020-05-06T08:43: | 2329+00:00"
}, {
"nodeId": " | amounttext30",
"nodeType": "Sound",
"order": | 21NodeStartNodeResult",
"data": [],
"time": "2020-05-06T08:43: | 2445+00:00"
}, {
"nodeId": " | amounttext31",
"nodeType": "Sound",
"order": | 22NodeResultNodeStart",
"data": [],
"time": "2020-05-06T08:43: | 2846+00:00"
}, {
"nodeId": " | text30text31",
"nodeType": "Sound",
"order": | 23NodeStartNodeResult",
"data": [],
"time": "2020-05-06T08: | 432907+00:00"
}, {
"nodeId": " | text30businesshours",
"nodeType": " | SoundIsTimeInInterval",
"order": | 24NodeResultNodeStart",
"data": [],
"time": "2020-05-06T08: | 434507+00:00"
}, {
"nodeId": " | text31businesshours_forward_switch",
"nodeType": " | Sound2529,
"type": "NodeStart",
"data": [],
"time": "2020-05-06T08: | 434607+00:00"
}, {
"nodeId": " | text31Sound26NodeResultNodeStart",
"data": [],
"time": "2020-05-06T08:44:07+00:00"
}, {
"nodeId": " | businesshoursIsTimeInInterval27NodeStartNodeResult",
"data": {
"input": [],
"outcome": "timeout"
},
"time": "2020-05-06T08:44: | 0720+00:00"
}, {
"nodeId": " | businesshours_forward_switchCheckVariable2933,
"type": "NodeStart",
"data": [],
"time": "2020-05-06T08:44: | 0720+00:00"
}, {
"nodeId": " | text40DTMF31NodeStartNodeResult",
"data": [],
"time": "2020-05-06T08:44: | 07
"nodeId": "text40",
"nodeType": "DTMF",
"order": 32,typeNodeResultdata{ input[] outcometimeout}"data": [],
"time": "2020-05-06T08:44: | 2032+00:00"
}, {
"nodeId": " | text43text44",
"nodeType": "Sound",
"order": | 33NodeStartNodeResult",
"data": [],
"time": "2020-05-06T08:44: | 2036+00:00"
}, {
"nodeId": " | text43Sound34NodeResultNodeStart",
"data": [],
"time": "2020-05-06T08:44: | 3237+00:00"
}, {
"nodeId": " | text44Sound35NodeStartNodeResult",
"data": {
"input": [],
"outcome": "timeout"
},
"time": "2020-05-06T08:44: | 3249+00:00"
}, {
"nodeId": " | text44Sound3640,
"type": "NodeResult",
"data": [],
"time": "2020-05-06T08:44 | :36+00:00"
}, {
"nodeId": "text45",
"nodeType": "DTMF",
"order": 37,
"type": "NodeStart",
"data": [],
"time:49+00:00"
}],
"createdOn": "2020-05-06T08:42:48+00:00",
"updatedOn": "2020-05-06T08:44:49+00:00",
"answeredOn": "2020-05-06T08: | 4437
}, {
"nodeId": "text45",
"nodeType": "DTMF",
"order": 38,
"type": "NodeResult",
"data": {
"input": [],
"outcome": "timeout"
},
"time": "2020-05-06T08:44:49+00:00"
}, {
"nodeId": "exit",
"nodeType": "Hangup",
"order": 40,
"type": "NodeResult",
"data": [],
"time": "2020-05-06T08:44:49+00:00"
}],
"createdOn": "2020-05-06T08:42:48+00:00",
"updatedOn": "2020-05-06T08:44:49+00:00",
"answeredOn": "2020-05-06T08:42:54 |
Example message for an anonymous or not recognized an inbound call
It is possible some is calling from a phone number we cannot match to a record or they have blocked their phone number.
In this case, we cannot provide the attribute reference.
Code Block |
---|
{
"id": "94d21117-2768-498c-a401-1b17e581e441",
"attributes": {
"origin": "annabel",
"customer": "1000",
"script": "1001"
},
"direction": "inbound",
"status": "finished",
"localNumber": "31513703800",
"remoteNumber": "anonymous",
"events":
..........
],
"createdOn": "2021-05-19T12:18:25+00:00",
"updatedOn": "2021-05-19T12:18:41+00:00",
"answeredOn": "2021-05-19T12:18:26+00:00"
} |