API Documentation

15 min read

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 Integration Guide 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. 


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.

Download: alphacomm_collectmaxx_example.agc

Collectmaxx API overview #

API endpoint #

https://reminders.alphacommapi.com/v1

📃
We use load balancers so an 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 will need to 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.

127.1.1.1192.1.0.0/32

Code example #

We created one request example in PHP to get you started.

API instructions #

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.

⚠️
When sending records to our API, we start importing the records according to your account’s Import schedule. These import windows are visible on your upload page.

ℹ️
The reminder results are reported at the end of the day in one or multiple result files, grouped by script. For more information, see our Import and Result Data formats document.

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

NameDescription
emptyNo records added to this batch yet.
queuedRecords are waiting to be processed.
runningRecords are being processed.
doneRecords have finished processing.
errorSomething went wrong.

Record statuses

NameDescription
notLoadedRecords that could not be read.
loadedRecords that have been read.
rejectedRecords that could not be converted into a job.
acceptedRecords that could be converted into a job.
enrichingRecords that are currently enriching.
createdRecords that have created a new job.
updatedRecords that have updated an existing job.
droppedRecords that could not be saved to the database.

Input options #

Through the ‘addRecords’ mutation, you are able to add records.

ArgumentDescriptionWhen 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.

Row Input

This is an example of a mail with PayLink record using the RowInput.

POST Query body
mutation addRecords (
  $file: FileInput,
  $rows: [RowInput!]
) {
  import {
    addRecords(file: $file, rows: $rows) {
      name
      action
      status
      records {
        scriptId
        status
        reference
        messages {
          context
          message
          level
        }
      }
    }
  }
}
Variables
{
    "rows": [
      {
        "reference": "f0e7a0c3",
        "script": "1001",
        "personFamilyName": "Alphacomm",
        "toMailAddress": "reminders@alphacomm.nl",
        "toPhoneNumbers" => [
         "+31612345678",
        ],
        "invoiceDescription": "Example payment",
        "invoiceDate": "2019-04-04",
        "invoiceDueDate": "2019-07-30",
        "invoiceReference": "40824524",
        "invoiceCurrency": "EUR",
        "invoiceAmount": "56445",
        "invoiceNumber": "249075245",
        "personBirthDay": "2000-01-01"
      }
    ]
}
Response 200

📃
We only return the records that were sent during the request. This makes it easier to validate if added records are accepted, using the record’s reference.

{
  "data": {
    "import": {
      "addRecords": {
        "name": "20190403-965",
        "action": "IMPORT",
        "status": "done",
        "records": [
          {
            "reference": "f0e7a0c3",
            "scriptId": "1001",
            "status": "accepted",
            "messages": []
          }
        ]
      }
    }
  }
}

File Input

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.

POST Query body
mutation addFile (
  $file: FileInput,
  $rows: [RowInput!]
) {
  import {
    addRecords(file: $file, rows: $rows) {
      name
      action
      status
    }
  }
}
Variables
{
  "file": {
   "extension": "csv",
   "contents": "<<BASE64 ENCODED STRING>>"
  }
}
Response 200

📃
When a file is imported, we will always respond with a status queued. Because we need some time to process the file.

{
  "data": {
    "import": {
      "addRecords": {
        "name": "20190404-579",
        "action": "IMPORT",
        "status": "queued",
        "records": []
      }
    }
  }
}

Search batches

This is an example of searching for a batch by name.

POST Query body
query ImportSearch(
  $filters: BatchFiltersInput
) {
  import {
    batches(
      filters: $filters
    ) {
      items {
        name
        action
        status
      }
      pagination {
        offset
        limit
        total
      }
    }
  }
}
Variables
{
  "filters": {
    "name": {
      "equalTo": "Test"
    }
  }
}
Response 200
{
  "data": {
    "import": {
      "batches": {
        "items": [
          {
            "name": "Test",
            "action": "VALIDATE",
            "status": "empty"
          }
        ],
        "pagination": {
          "offset": 0,
          "limit": 20,
          "total": 1
        }
      }
    }
  }
}

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.

NameDescription
readyPayLink is created in our service.
startedTransaction has been started.
partially_paidA part of the original PayLink amount is paid.
paidThe complete PayLink amount is paid.
cancelledThe last transaction of the PayLink has been cancelled.
failedThe last transaction of the PayLink has failed.

To make your start easier, we have added some examples of common actions. Keep in mind to use the POST method on all your requests.

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.

POST Query body
mutation createPayLink($payLink: PayLinkInput!){
  payLink {
    create (payLink: $payLink) {
      attributes { id value }
      id
      shortUrl
      longUrl
    }
  }
}
Variables

This is the minimal information we need to create a PayLink. Use 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.

{
   "payLink": {
    "attributes": [
      {"id": "source", "value": "whatsapp"}
    ],
    "personName": "Alphacomm",
    "invoiceAmount": "15497",
    "invoiceCurrency": "EUR",
    "invoiceDescription": "Example",
    "invoiceReference": "103482",
    "invoiceDate": "2019-02-12T10:00:00+00:00"
  }
}
Response 200
{
  "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"
      }
    }
  }
}

A basic search on all PayLinks.

POST Query body
query {
  payLink {
    payLinks {
      items {
        status
        id
      }
      pagination {
        offset
        limit
        total
      }
    }
  }
}
Variables

No variables are needed for this query.

{}
Response 200
{
  "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
        }
      }
    }
  }
}

An example of how to get the status of a single PayLink.

POST Query body
query PayLinks(
  $filters: PayLinkFiltersInput
) {
  payLink {
    payLinks (
      filters: $filters
    ) {
        items {
          id
          personName
          personGender
          status
          amountPaid
          createdOn
          updatedOn
        }
      }
    }
}
Variables
{
  "filters": {
    "id": {
      "equalTo": "5be41c4f-9fe6-403d-980b-5edc0139ee70"
    }
  }
}
Response 200
{
  "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"
          }
        ]
      }
    }
  }
}

PayLinks can not only be created through our API but also through 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’ also called ‘reference’. In case you want to know what the current status of the PayLink is, you can search our PayLink service with this reference.

POST Query body
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
{
  "filters": {
    "attributes": [
      {
      	"id": "reference",
      	"equalTo": "20220216-6"
    	}
    ]
  }
}
Response 200
{
  "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"
          }
        ]
      }
    }
  }
}

An example of how to find all PayLinks with the status paid and created on 08-02-2023.

You have the option to set filters, order, offset and limit. All the options are defined in the API docs.

POST Query body
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
{
  "filters": {
    "status": {
      "equalTo": "paid"
    },
    "createdOn": {
      "greaterThan": "2023-02-08T00:00:00+00:00",
      "lesserThan": "2023-02-09T00:00:00+00:00"
    }
  },
  "order": {
    "createdOn": "DESCENDING"
  },
  "offset": 0,
  "limit": 20
}
Response 200
{
  "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
        }
      }
    }
  }
}

Webhook #

E-Mandate #

To use this service, we need to configure your e-Mandate bank credentials and set up a landing page. Please contact us if you would like to use this service.

Status codes #

NameDescription
newMandate is created on our service.
pendingWaiting for second authorization.
successMandate 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 requests.

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.

POST Query body
mutation createMandate($mandate: MandateInput!){
  mandate {
    create (mandate: $mandate) {
      id
      reference
      shortUrl
      longUrl
      type
    }
  }
}
Variables

Example values.

{
  "mandate": {
    "personName": "Alphacomm",
    "reference": "AC-HUUR"
    "type": "RCUR",
    "reason": "huur",     
    "debtorReference": "20190301"
  }
}
Response 200
{
  "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"
      }
    }
  }
}

A basic search query for all Mandates.

POST Query body
query {
  mandate {
    mandates {
      items {
        status
        id
      }
    }
  }
}
Variables

No variables are needed for this query.

{}
Response 200
{
  "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.

POST Query body
query Mandates(
  $filters: MandateFiltersInput
) {
  mandate {
    mandates (
      filters: $filters
    ) {
        items {
          id
          personName
          status
          createdOn
          updatedOn
        }
      }
    }
}
Variables
{
  "filters": {
    "id": {
      "equalTo": "5be41c4f-9fe6-403d-980b-5edc0139ee70"
    }
  }
}
Response 200
{
  "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"
          }
        ]
      }
    }
  }
}

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.

POST Query body
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
{
  "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 200
{
  "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.

POST Query body
mutation stopCalling(
  $scriptId: Int!
  $reference: String!
){
  voice {
    stopCalling (
      scriptId: $scriptId
      reference: $reference
    )
  }
}
Variables
{
  "scriptId": 18301,
  "reference": "your_identifier"
}
Response 200
{
  "data": {
    "voice": {
      "stopCalling": "done"
    }
  }
}

Webhook #

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.

Format

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 directionENUM DIRECTION
outbound
inbound
status
string
The call statusENUM STATUS
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

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 the call is not answered.
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

...
	"events": [
      {
        "nodeId": "success",
        "nodeType": "AddResult",
        "order": 16,
        "type": "NodeResult",
        "data": {
			"result": "success-ok"
        },
        "time": "2020-05-06T08:43:11+00:00"
      }
    ]
...

ℹ️
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

{
	"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_vm",
		"nodeType": "IsRemoteVoiceMail",
		"order": 5,
		"type": "NodeStart",
		"data": [],
		"time": "2020-05-06T08:43:00+00:00"
	}, {
		"nodeId": "text10",
		"nodeType": "Sound",
		"order": 7,
		"type": "NodeStart",
		"data": [],
		"time": "2020-05-06T08:43:00+00:00"
	}, {
		"nodeId": "text10",
		"nodeType": "Sound",
		"order": 8,
		"type": "NodeResult",
		"data": [],
		"time": "2020-05-06T08:43:05+00:00"
	}, {
		"nodeId": "filter",
		"nodeType": "CheckGenderBirthday",
		"order": 9,
		"type": "NodeStart",
		"data": [],
		"time": "2020-05-06T08:43:05+00:00"
	}, {
		"nodeId": "filter",
		"nodeType": "CheckGenderBirthday",
		"order": 10,
		"type": "NodeResult",
		"data": {
			"gender": "M",
			"age": 2020,
			"outcome": "man"
		},
		"time": "2020-05-06T08:43:05+00:00"
	}, {
		"nodeId": "text11m",
		"nodeType": "Sound",
		"order": 11,
		"type": "NodeStart",
		"data": [],
		"time": "2020-05-06T08:43:05+00:00"
	}, {
		"nodeId": "text11m",
		"nodeType": "Sound",
		"order": 12,
		"type": "NodeResult",
		"data": [],
		"time": "2020-05-06T08:43:08+00:00"
	}, {
		"nodeId": "name",
		"nodeType": "Sound",
		"order": 13,
		"type": "NodeStart",
		"data": [],
		"time": "2020-05-06T08:43:09+00:00"
	}, {
		"nodeId": "name",
		"nodeType": "Sound",
		"order": 14,
		"type": "NodeResult",
		"data": [],
		"time": "2020-05-06T08:43:10+00:00"
	}, {
		"nodeId": "success",
		"nodeType": "AddResult",
		"order": 15,
		"type": "NodeStart",
		"data": [],
		"time": "2020-05-06T08:43:11+00:00"
	}, {
		"nodeId": "success",
		"nodeType": "AddResult",
		"order": 16,
		"type": "NodeResult",
		"data": {
			"result": "success-ok"
		},
		"time": "2020-05-06T08:43:11+00:00"
	}, {
		"nodeId": "collect_id",
		"nodeType": "Sound",
		"order": 17,
		"type": "NodeStart",
		"data": [],
		"time": "2020-05-06T08:43:11+00:00"
	}, {
		"nodeId": "collect_id",
		"nodeType": "Sound",
		"order": 18,
		"type": "NodeResult",
		"data": [],
		"time": "2020-05-06T08:43:16+00:00"
	}, {
		"nodeId": "text22",
		"nodeType": "Sound",
		"order": 19,
		"type": "NodeStart",
		"data": [],
		"time": "2020-05-06T08:43:17+00:00"
	}, {
		"nodeId": "text22",
		"nodeType": "Sound",
		"order": 20,
		"type": "NodeResult",
		"data": [],
		"time": "2020-05-06T08:43:23+00:00"
	}, {
		"nodeId": "amount",
		"nodeType": "Sound",
		"order": 21,
		"type": "NodeStart",
		"data": [],
		"time": "2020-05-06T08:43:24+00:00"
	}, {
		"nodeId": "amount",
		"nodeType": "Sound",
		"order": 22,
		"type": "NodeResult",
		"data": [],
		"time": "2020-05-06T08:43:28+00:00"
	}, {
		"nodeId": "text30",
		"nodeType": "Sound",
		"order": 23,
		"type": "NodeStart",
		"data": [],
		"time": "2020-05-06T08:43:29+00:00"
	}, {
		"nodeId": "text30",
		"nodeType": "Sound",
		"order": 24,
		"type": "NodeResult",
		"data": [],
		"time": "2020-05-06T08:43:45+00:00"
	}, {
		"nodeId": "text31",
		"nodeType": "Sound",
		"order": 25,
		"type": "NodeStart",
		"data": [],
		"time": "2020-05-06T08:43:46+00:00"
	}, {
		"nodeId": "text31",
		"nodeType": "Sound",
		"order": 26,
		"type": "NodeResult",
		"data": [],
		"time": "2020-05-06T08:44:07+00:00"
	}, {
		"nodeId": "businesshours",
		"nodeType": "IsTimeInInterval",
		"order": 27,
		"type": "NodeStart",
		"data": [],
		"time": "2020-05-06T08:44:07+00:00"
	}, {
		"nodeId": "businesshours_forward_switch",
		"nodeType": "CheckVariable",
		"order": 29,
		"type": "NodeStart",
		"data": [],
		"time": "2020-05-06T08:44:07+00:00"
	}, {
		"nodeId": "text40",
		"nodeType": "DTMF",
		"order": 31,
		"type": "NodeStart",
		"data": [],
		"time": "2020-05-06T08:44:07+00:00"
	}, {
		"nodeId": "text40",
		"nodeType": "DTMF",
		"order": 32,
		"type": "NodeResult",
		"data": {
			"input": [],
			"outcome": "timeout"
		},
		"time": "2020-05-06T08:44:20+00:00"
	}, {
		"nodeId": "text43",
		"nodeType": "Sound",
		"order": 33,
		"type": "NodeStart",
		"data": [],
		"time": "2020-05-06T08:44:20+00:00"
	}, {
		"nodeId": "text43",
		"nodeType": "Sound",
		"order": 34,
		"type": "NodeResult",
		"data": [],
		"time": "2020-05-06T08:44:32+00:00"
	}, {
		"nodeId": "text44",
		"nodeType": "Sound",
		"order": 35,
		"type": "NodeStart",
		"data": [],
		"time": "2020-05-06T08:44:32+00:00"
	}, {
		"nodeId": "text44",
		"nodeType": "Sound",
		"order": 36,
		"type": "NodeResult",
		"data": [],
		"time": "2020-05-06T08:44:36+00:00"
	}, {
		"nodeId": "text45",
		"nodeType": "DTMF",
		"order": 37,
		"type": "NodeStart",
		"data": [],
		"time": "2020-05-06T08:44:37+00:00"
	}, {
		"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+00:00"
}

Example message for an anonymous or not recognized inbound call

It is possible someone 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.

{
    "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"
}