Synchronous and asynchronous messaging
There are two ways in which we inform about processing status changes
Synchronous - which is regular response to request send to our system
Asynchronous - where we send a request to provided
callbackUrl
on some events
For more about requests and responses check First Request
More about callbackUrl
parameter you can find under Gateway Transaction
Synchronous response
Is a regular HTTP response for your request. Structure and parameters
are described under Transaction Response
Asynchronous callback
If callbackUrl
is provided within GatewayTransaction
we notify your system about case status changes if some events occur (see TransactionChecks callbacks or CustomerChecks callbacks)
Order of requests
Due to asynchronous nature of our system synchronous request and callback requests are processed independently.
It is possible that asynchronous request which might be sent before synchronous request completes.
Security
In order to secure communication between systems we use two layers:
callbackUrl
needs to be an HTTPS URLSECRET
which is added as HTTP header to each request
SECRET
can be used by your system to authenticate incoming requests to ensure they come from our system.
To configure SECRET
visit Case Manager and Workflows & Users section.
static IP address
All callbacks are sent via a static IPv4 address. For the test environment this IP is 35.157.34.99
. See more under environments.
TransactionChecks callbacks
Event | Description |
---|---|
Immediate decision | Once an immediate decision is available, executed in addition to synchronous response |
Complete decision | Once a complete decision is available |
Operator action | Once an operator performs an action |
Callback response
Dynamic integration
Clients must configure thier integration to safely ignore any fields it doesn't recognize.
This encourages best practice: Integration should parse the data it needs and disregard the rest. This ensures that your integration won't break when with the addition of new features or metadata in the future.
Field name | Description |
---|---|
payload | Top-level object that contains all properties |
createdAt | Indicates when the action was created |
tenantID | A UUID of the tenant that the case belongs to |
caseId | A UUID that is assigned to transaction |
tenantTransactionId | ID of the transaction at the tenant. |
transactionStatus | Status of processing transaction, one of: |
processingStatus | Result of processing case, one of: |
investigationStatus | Result of processing case, one of: |
decisionType | Completeness state of processing, one of: |
assignedTo | Indicates the email address of the current assignee of the case. Can be null if no one is assigned |
feedbackStatus | Indicates the feedback buttons clicked when closing a transaction case. Possible values are “yes”, “no”, “inconclusive” and null |
Use case: using callbacks to react on unblocking of previously blocked transactions
When the synchronous API responds with flag proceed=false you would stop/park a transaction from execution. Yet that somehow needs to be released.
The proceed=true/false is derived from what the Case Manager calls and the Callback reports as "transactionStatus".
A transactionStatus=blocked will lead to a proceed=false. So transactionStatus is the flag you want to listen to in the callback
When then an operator investigates a case he/she would assign a case and then close it because it turns out to be not suspicious in Case Manager you will get a callback with transactionStatus=unb.locked - that is when you release the transaction.
If you have cases in a case group in Case Manager (our system groups similar cases) it will send you callbacks for each transaction as you need to unblock each and every one of them even though it appears and is worked on in one go in the Case Manager.
CustomerChecks callbacks
Customer checks callbacks have differect structure than TransactionChecks callbacks because of some fields are valid only for Customer Check (like customerStatus
or customerId
) and some are valid only for Aml Check (like transactionStatus
or transactionId
)
Event | Description |
---|---|
Complete decision | Once processing is completes and case has been created |
Operator action | Once an operator performs an action |
Callback response
Dynamic integration
Clients must configure thier integration to safely ignore any fields it doesn't recognize.
This encourages best practice: Integration should parse the data it needs and disregard the rest. This ensures that your integration won't break when with the addition of new features or metadata in the future.
Example of Decline callback:
Field name | Description |
---|---|
payload | Top-level object that contains all properties |
caseId | A UUID that is assigned to transaction |
customerId | A customer id, could generated UUID if was not provided in request |
processingStatus | Result of processing case, one of: |
customerStatus | Indicates customer status, one of: |
screeningResultConfirmed | Contains screening types which had been confirmed by operator by selecting MATCH under screening hit |
riskLevel | Contains new risk level set for customerId by using manual risk level change |
assignedTo | Indicates the email address of the current assignee of the customer case. Can be null if no one is assigned |
createdAt | Indicates when the action was created |
Example Use Case
The webhook is used to present the gateways callbacks functionality. Webhook simulates the server and presents all the API responses triggered by operator actions or events in the gateway.
Bank transfer with recipient from sanction list is used in the example use case to present how operator and the gateway solution actions generate API responses and use callback feature to inform the server about the case update.
Scenario introduction
Step id | Action | Result |
---|---|---|
1 | Bank transfer details with recipient from a sanction list is sent via the API. |
|
2 | Operator assigns the case to himself | API call response is registered in webhook |
3 | Operator selects "no match" for each rule break and accepts the changes |
|
Scenario detailed description
Open webhook, copy "Your unique URL" and put it in the callbackUrl
field of the request body.
Open Test Scenario Tool, insert json request body into the test scenario API request.
Click on "New IBAN/Timestamp" to generate unique tenantProcessingTimestamp
and accountNumber
Click on "RUN ON TEST" to make an API call.
API response with proceed:false
should be generated.
New case is opened in the Case Manager, transaction is blocked.
Two API call responces are generated and can be found in the webhook.
Operator assigns the case to himself.
API call responce is generated and can be found in the webhook.
Operator selects "NO MATCH" for each rule break and accepts the change.
API call responce is generated and can be found in the webhook.
Case status in the Case Manager is changed to Closed.
Processing status in the Case manager is changed to Accepted.
Transaction is unlocked.