This documentation aims to provide all the information you need to work with our API.
In this API, all datetime values are represented in Coordinated Universal Time (UTC) timezone. This ensures uniformity and accuracy across various time-related operations. Please note that regardless of the user's or system's local timezone, all datetime inputs and outputs are converted to and from UTC for consistent handling of time-related data.
In Pascal 6.2 we replaced the `jurisdiction` field with a `country` field in cases:
You can configure webhooks in the organization settings -> integrations page.
You can also see recent webhook calls and their payloads there.
Our webhooks are sent using the following IP address: 51.105.166.62
Although authenticity is commonly verified using IP addresses, we recommend against this approach. Instead we only send you an 'ID' of a resource (like a case) and you can use our authenticated API to fetch the resource.
Our IP address may change in the future, if this happens we will notify you.
In response to Pascal calling your webhook, you only have to return an HTTP status of 2xx.
Pascal then knows your system correctly processed the request. In case you return a different status we will keep trying for a few hours.
Our webhook calls time out after 15 seconds. Even if you return a 200 HTTP status code after 16 seconds, we mark the request as failed and try again later.
In total we will call your webhook 10 times with an increasing interval. If after the 10th call we still do not get a 2xx status response, we will stop trying. We use the following intervals between attempts while trying to call your webhook:
| Attempt | Interval | Time after initial call |
|---|---|---|
| 1st | - | 00:00 |
| 2nd | 1 minute | 00:01 |
| 3rd | 2 minutes | 00:03 |
| 4th | 4 minutes | 00:07 |
| 5th | 8 minutes | 00:15 |
| 6th | 16 minutes | 00:31 |
| 7th | 29 minutes | 01:00 |
| 8th | 1 hour | 02:00 |
| 9th | 2 hours | 04:00 |
| 10th | 22 hours | 26:00 |
Pascal sends POST requests with `Content-Type: application/json` to your configured URL. The following request body shows an example of all available webhook events that we can send:
{
"events": [
{
"event": "Case created",
"organization_id": 1,
"case_id": 1,
"case_uuid": "6e182844-727e-4f04-a2a1-e6096baacc1b"
},
{
"event": "Case searched",
"organization_id": 1,
"case_id": 1,
"case_uuid": "6e182844-727e-4f04-a2a1-e6096baacc1b"
},
{
"event": "Case hits found",
"organization_id": 1,
"case_id": 1,
"case_uuid": "6e182844-727e-4f04-a2a1-e6096baacc1b"
},
{
"event": "Case resolved",
"organization_id": 1,
"case_id": 1,
"case_uuid": "6e182844-727e-4f04-a2a1-e6096baacc1b"
}
]
}
We may or may not send multiple events in one webhook call. The `events` array contains one or more event objects. There is no guarantee that events are sent together or in order.
You may use our API to fetch the updated information after receiving a webhook call.
Our API returns 4xx status codes when there is something wrong with your request.
Common client errors are:
To authenticate requests, include an Authorization header with the value "Bearer {YOUR_AUTH_KEY}".
All authenticated endpoints are marked with a requires authentication badge in the documentation below.
You can retrieve your token by visiting your personal settings page and clicking Add API token.
Who this guide is for
This guide is intended for developers who wish to integrate Pascal into any onboarding, screening, or monitoring workflow.
Concepts
Case. In Pascal, a case is the central record used to screen a single entity, whether a person, business, or asset. It contains all associated searches, potential matches (hits), decisions, and monitoring activity.
Client. In Pascal, a client is a container used to group related cases. It represents an organisation-level view, for example a company that holds several directors and UBOs. Clients can be created, searched, and linked to cases, making it easier to manage relationships between multiple entities.
Hit. Hit - A hit in Pascal is a potential match against screening categories such as sanctions, PEPs, enforcements, or media. Hits may be unresolved (awaiting review) or resolved (classified as true or false positives). Pascal tracks hit counts per source on each case.
Unresolved hit. An unresolved hit is a potential match that still requires review, usually by a compliance officer. It indicates that further investigation is needed to determine whether it is relevant. The hits-key-information endpoint provides a compact overview of unresolved hits.
Resolved hit. A resolved hit is one that has been reviewed and classified as either a true positive (confirmed match) or a false positive (not relevant). Resolved hits remain recorded in the case history for audit purposes.
Monitoring. Monitoring in Pascal means automatically re-screening a case at defined intervals to detect new or updated hits. Monitoring frequency can be set per data source. Typically, a case status moves from In review during initial screening to Monitored when ongoing checks are required.
UUID. A UUID (Universal Unique Identifier) is the unique reference Pascal assigns to a case upon creation or import. It is used in API calls for searches, updates, and filtering, ensuring consistent identification across integrations.
Important things to know early
Everything begins with a Case - In Pascal, nearly all data, including hits, is tied to a case ID. Without a case, attempts to retrieve hits or screening results will not return anything.
search=true on Update Case - Adding search=true will perform a new search. All unresolved hits are cleared, resolved hits are kept, and both refound and new hits can appear again as unresolved. This is typically used when you want to restart the compliance review cycle.
Clients vs Cases - why both? - In Pascal, both clients and cases serve distinct but complementary purposes. A client provides the organisation-level view: it groups together all related cases for the same customer, such as a company with its directors and UBOs. Clients also let you link related customers and manage onboarding workflows in a structured way. A case, by contrast, is the detailed record of screening for one entity – person, business, or asset - It contains all associated searches, potential matches (hits), decisions, and monitoring activity.
Example onboarding flow
When no sanctions are found, the onboarding process might look like this:
Create a Client - e.g. “Acme Corp”.
Import a case for the entity you want to screen - person, business or asset. Import is asynchronous and returns UUIDs so you can track progress.
Check search status or fetch key hit info - cases/searches for list views, or cases/{id}/hits-key-information for a concise unresolved view while the reviewer decides.
Resolve hits in your process - once unresolved items are reviewed, set the case to Monitored and configure monitoring frequencies as needed.
Re-check later - when you need a new search (apart from monitoring), call Update Case with search=true. This resets the unresolved set for a new cycle without losing previous resolutions.
Example interpretation of "no hits"
A newly created case might return no hits, in which situation onboarding could simply continue. If unresolved hits appear instead, a compliance officer might review them and decide to include true positives (which could block onboarding) or exclude false positives (after which onboarding could proceed).
Quick start
Below is a minimal recipe to see the flow end-to-end.
Create a Client POST /api/v1/clients - returns the client id.
Import a case POST /api/v1/cases/import - send up to 200 entities; you get case UUIDs back and can deduplicate or update duplicates.
Poll for cases or search POST /api/v1/cases/searches - list cases and check source success and hit counts.
Retrieve unresolved items GET /api/v1/cases/{id}/hits-key-information - show what needs manual review.
Move to monitoring or re-check PATCH /api/v1/cases/{id} - set status to Monitored and monitoring frequencies; later, use search=true to start a fresh search cycle.
Webhooks
Pascal expects any 2xx to consider delivery successful. Calls time out after 15 seconds - a 200 after 16 seconds is treated as failed and retried. Up to 10 attempts are made using increasing intervals, then Pascal stops retrying.
You can subscribe from your organisation settings and you will receive a JSON events array per request.
Import a list of bank accounts asynchronously.
You can provide up to 200 bank accounts per request.
The returned id is a batch ID, which you can use to check the progress of the import using the 'Get batch' endpoint.
Note: Access to transaction monitoring is required to use this endpoint.
curl --request POST \
"https://app.pascal.vartion.com/api/v1/bank-accounts/import" \
--header "Authorization: Bearer {YOUR_AUTH_KEY}" \
--header "Content-Type: application/json" \
--header "Accept: application/json" \
--header "OrganizationId: 1" \
--data "{
\"bank_accounts\": [
{
\"name\": \"Main Business Account\",
\"account_number\": \"NL91ABNA0417164300\",
\"swift_code\": \"ABNANL2A\",
\"bank_name\": \"ABN AMRO Bank N.V.\",
\"currency\": \"EUR\",
\"account_type\": \"current\",
\"account_creation_date\": \"2024-01-15\",
\"clients\": [
\"Client A\"
],
\"client_identifiers\": [
\"ID123\"
],
\"active\": false
}
],
\"batch_id\": \"99cbb5f6-49a7-492c-a1de-92ff356d98d8\",
\"count\": 150
}"
{
"id": "1abd0c71-dadd-4dad-8e20-1bd83aea25b3",
"created_at": "2024-06-10T12:00:00.000000Z",
"finished_at": null
}
This endpoint allows you to retrieve the status of a batch.
Batches are created when importing cases, clients, transactions, or bank accounts.
When a batch is finished (finished_at is not null), all jobs have been processed.
This allows you to track the progress of long-running imports.
A finished batch is deleted 48 hours after it is finished and can no longer be found.
If a batch is not finished after 72 hours, it is also deleted and can no longer be found.
You can find the batch ID in the response when starting an import.
curl --request GET \
--get "https://app.pascal.vartion.com/api/v1/batches/1abd0c71-dadd-4dad-8e20-1bd83aea25b3" \
--header "Authorization: Bearer {YOUR_AUTH_KEY}" \
--header "Content-Type: application/json" \
--header "Accept: application/json" \
--header "OrganizationId: 1" {
"id": "1abd0c71-dadd-4dad-8e20-1bd83aea25b3",
"created_at": "2024-06-10T12:00:00.000000Z",
"finished_at": null
}
Import and search a list of new cases asynchronously.
After making a request, a list of case UUIDs will be returned in the same order as your request.
A list of "imported" case UUIDs will also be returned. This allows you to distinguish between cases that were imported and those that were deduplicated.
You can use the 'Search cases' endpoint to check the status of the imported cases.
The returned id is a batch ID, which you can use to check the progress of the import using the 'Get batch' endpoint.
curl --request POST \
"https://app.pascal.vartion.com/api/v1/cases/import" \
--header "Authorization: Bearer {YOUR_AUTH_KEY}" \
--header "Content-Type: application/json" \
--header "Accept: application/json" \
--header "OrganizationId: 1" \
--data "{
\"cases\": [
{
\"type\": \"Person\",
\"status\": \"In review\",
\"name\": \"John Doe\",
\"confidence\": \"Relative\",
\"aliases\": [
\"J. Doe\"
],
\"additional_terms\": [
\"CEO\"
],
\"description\": \"Relation of a high risk client\",
\"clients\": [
\"[\'Johns\']\"
],
\"client_identifiers\": [
\"ID123\"
],
\"sources\": [
\"sanctions\"
],
\"gender\": \"Male\",
\"nationalities\": [
\"NLD\"
],
\"country_of_birth\": \"NLD\",
\"country_of_residence\": \"NLD\",
\"date_of_birth\": \"2000-01-31\",
\"passportVerificationForm\": {
\"country\": \"NLD\",
\"dateOfExpiry\": \"2025-11-12\",
\"documentNumber\": \"bngzmiy\",
\"givenNames\": \"v\",
\"lastName\": \"d\",
\"nationality\": \"NLD\",
\"optionalData\": \"ljnikhwaykcmyu\"
},
\"company_number\": \"NL123\",
\"country\": \"NLD\",
\"address\": \"3721 West Fork Street, Montana\",
\"asset_type\": \"vessel\",
\"identifier\": \"123456\"
}
],
\"deduplicate\": false,
\"update_duplicates\": false,
\"update_duplicates_clients\": false,
\"batch_id\": \"99cbb5f6-49a7-492c-a1de-92ff356d98d8\",
\"count\": 150
}"
{
"id": "1abd0c71-dadd-4dad-8e20-1bd83aea25b3",
"created_at": "2024-06-10T12:00:00.000000Z",
"finished_at": null,
"uuids": [
"a2546955-de2d-4907-a533-0846ee46f719",
"d6253422-5197-429c-a8eb-4af7f6f7fffc",
"052c7db6-bdca-4b95-b872-363b4287200f"
],
"imported": [
"a2546955-de2d-4907-a533-0846ee46f719"
]
}
Create and search a single case synchronously, returning results immediately. Case deduplication is optional - when enabled, the first matching case will be searched for changes and returned instead of creating duplicates.
curl --request POST \
"https://app.pascal.vartion.com/api/v1/cases" \
--header "Authorization: Bearer {YOUR_AUTH_KEY}" \
--header "Content-Type: application/json" \
--header "Accept: application/json" \
--header "OrganizationId: 1" \
--data "{
\"type\": \"Person\",
\"status\": \"In review\",
\"name\": \"John Doe\",
\"aliases\": [
\"J. Doe\"
],
\"confidence\": \"Relative\",
\"additional_terms\": [
\"CEO\"
],
\"client_ids\": [
1
],
\"deduplicate\": false,
\"allow_duplicate_conversion\": false,
\"gender\": \"Male\",
\"nationalities\": [
\"NLD\"
],
\"country_of_birth\": \"NLD\",
\"country_of_residence\": \"NLD\",
\"date_of_birth\": \"2000-01-31\",
\"company_number\": \"NL123\",
\"country\": \"NL\",
\"address\": \"3721 West Fork Street, Montana\",
\"asset_type\": \"vessel\",
\"identifier\": \"123456\"
}"
{
"additional_terms": [
"CEO"
],
"address": "3721 West Fork Street, Montana",
"aliases": [
"J. Doe"
],
"asset_type": null,
"clients": [
{
"name": "John Doe",
"id": 1
}
],
"company_number": null,
"confidence": "Relative",
"country": null,
"country_of_birth": "NLD",
"country_of_residence": "NLD",
"created_at": "2023-08-02T18:48:22.000000Z",
"date_of_birth": null,
"deleted_at": null,
"description": "Relation of a high risk client",
"excluded_terms": [],
"gender": null,
"group_id": null,
"id": 2049050,
"identifier": null,
"monitoring_frequency_sanctions": 90,
"monitoring_frequency_peps": 90,
"monitoring_frequency_news": 90,
"monitoring_frequency_enforcements": 90,
"monitoring_frequency_other": 90,
"name": "My test case",
"nationalities": null,
"organization_id": 19,
"origin": "public-api",
"risk": 0.12,
"searched_at": "2023-08-02T18:48:32.000000Z",
"hits_unresolved_count": 0,
"resolve_progress": 100,
"hit_counts": {
"negative": {
"enforcements": 0,
"news": 0,
"other": 0,
"peps": 0,
"sanctions": 0
},
"positive": {
"enforcements": 0,
"news": 0,
"other": 0,
"peps": 0,
"sanctions": 0
},
"unresolved": {
"enforcements": 0,
"news": 0,
"other": 0,
"peps": 0,
"sanctions": 0
}
},
"sources": [
{
"active": true,
"case_id": 2049050,
"data_source": {
"active": true,
"deactivated_at": "2023-02-21T12:57:31.000000Z",
"id": 409,
"source": "peps",
"vendor": "default"
},
"data_source_id": 409,
"id": 18320030,
"searched_at": "2023-08-02T18:48:22.000000Z",
"succeeded": true
},
{
"active": true,
"case_id": 2049050,
"data_source": {
"active": true,
"deactivated_at": "2023-02-21T12:57:31.000000Z",
"id": 413,
"source": "news",
"vendor": "default"
},
"data_source_id": 413,
"id": 18320031,
"searched_at": "2023-08-02T18:48:22.000000Z",
"succeeded": true
}
],
"status": "Monitored",
"type": "Person",
"unresolved_risk": 0,
"updated_at": "2023-08-02T18:48:22.000000Z",
"user_id": null,
"uuid": "a2546955-de2d-4907-a533-0846ee46f719"
}
Search for cases using filters. Returning basic information on a list of cases. Paginating through results is possible using the per_page and page parameters.
curl --request POST \
"https://app.pascal.vartion.com/api/v1/cases/searches" \
--header "Authorization: Bearer {YOUR_AUTH_KEY}" \
--header "Content-Type: application/json" \
--header "Accept: application/json" \
--header "OrganizationId: 1" \
--data "{
\"per_page\": 10,
\"page\": 1,
\"sort_by\": \"updated_at\",
\"sort_order\": \"desc\",
\"secondary_sort_by\": \"uuid\",
\"secondary_sort_order\": \"desc\",
\"with\": [
\"hitCountsPerSource\"
],
\"user_id\": [
1
],
\"group_id\": [
1
],
\"created_at\": [
\"2025-01-01\",
\"2025-01-31\"
],
\"updated_at\": [
\"2025-01-01\",
\"2025-01-31\"
],
\"deleted\": false,
\"uuid\": [
\"a2546955-de2d-4907-a533-0846ee46f719\"
],
\"nationalities\": [
\"NLD\"
],
\"country_of_birth\": [
\"NLD\"
],
\"country_of_residence\": [
\"NLD\"
],
\"company_number\": \"b\",
\"address\": \"n\",
\"country\": [
\"NLD\"
],
\"hit_resolution\": [
\"positive\"
],
\"hit_source\": null,
\"hit_time_range\": [
\"2025-01-01\",
\"2025-01-31\"
],
\"client_status\": [
\"Active\"
],
\"clients\": {
\"cases_count\": [
1
],
\"clients_count\": [
1
],
\"created_at\": [
\"2025-01-01\",
\"2025-01-31\"
],
\"risk\": [
\"very high\"
],
\"updated_at\": [
\"2025-01-01\",
\"2025-01-31\"
],
\"identifier\": [
\"ID123\"
]
}
}"
{
"additional_terms": [
"CEO"
],
"address": "3721 West Fork Street, Montana",
"aliases": [
"J. Doe"
],
"asset_type": null,
"clients": [
{
"name": "John Doe",
"id": 1
}
],
"company_number": null,
"confidence": "Relative",
"country": null,
"country_of_birth": "NLD",
"country_of_residence": "NLD",
"created_at": "2023-08-02T18:48:22.000000Z",
"date_of_birth": null,
"deleted_at": null,
"description": "Relation of a high risk client",
"excluded_terms": [],
"gender": null,
"group_id": null,
"id": 2049050,
"identifier": null,
"monitoring_frequency_sanctions": 90,
"monitoring_frequency_peps": 90,
"monitoring_frequency_news": 90,
"monitoring_frequency_enforcements": 90,
"monitoring_frequency_other": 90,
"name": "My test case",
"nationalities": null,
"organization_id": 19,
"origin": "import",
"risk": 0.12,
"searched_at": "2023-08-02T18:48:32.000000Z",
"hits_unresolved_count": 0,
"resolve_progress": 100,
"hit_counts": {
"negative": {
"enforcements": 0,
"news": 0,
"other": 0,
"peps": 0,
"sanctions": 0
},
"positive": {
"enforcements": 0,
"news": 0,
"other": 0,
"peps": 0,
"sanctions": 0
},
"unresolved": {
"enforcements": 0,
"news": 0,
"other": 0,
"peps": 0,
"sanctions": 0
}
},
"sources": [
{
"active": true,
"case_id": 2049050,
"data_source": {
"active": true,
"deactivated_at": "2023-02-21T12:57:31.000000Z",
"id": 409,
"source": "peps",
"vendor": "default"
},
"data_source_id": 409,
"id": 18320030,
"searched_at": "2023-08-02T18:48:22.000000Z",
"succeeded": true
},
{
"active": true,
"case_id": 2049050,
"data_source": {
"active": true,
"deactivated_at": "2023-02-21T12:57:31.000000Z",
"id": 413,
"source": "news",
"vendor": "default"
},
"data_source_id": 413,
"id": 18320031,
"searched_at": "2023-08-02T18:48:22.000000Z",
"succeeded": true
}
],
"status": "Monitored",
"type": "Person",
"unresolved_risk": 0,
"updated_at": "2023-08-02T18:48:22.000000Z",
"user_id": null,
"uuid": "a2546955-de2d-4907-a533-0846ee46f719"
}
Edit the specifications or status of an existing case. Only fields provided will be updated, fields that are not provided will remain in the current state. Will return the updated case information.
curl --request PATCH \
"https://app.pascal.vartion.com/api/v1/cases/B3b1a0de-E464-0660-dEBB-cE54cDE1a84b|15" \
--header "Authorization: Bearer {YOUR_AUTH_KEY}" \
--header "Content-Type: application/json" \
--header "Accept: application/json" \
--header "OrganizationId: 1" \
--data "{
\"clients\": null,
\"status\": \"Monitored\",
\"monitoring_frequency\": \"7\",
\"name\": \"John Doe\",
\"aliases\": null,
\"confidence\": \"Relative\",
\"gender\": \"Male\",
\"nationalities\": [
\"NLD\"
],
\"country_of_birth\": \"NLD\",
\"country_of_residence\": \"NLD\",
\"date_of_birth\": \"2000-01-31\",
\"passportVerificationForm\": {
\"country\": \"NLD\",
\"dateOfExpiry\": \"2025-11-12\",
\"documentNumber\": \"bngzmiy\",
\"givenNames\": \"v\",
\"lastName\": \"d\",
\"nationality\": \"NLD\",
\"optionalData\": \"ljnikhwaykcmyu\"
},
\"company_number\": \"NL123\",
\"country\": \"NLD\",
\"address\": \"3721 West Fork Street, Montana\",
\"asset_type\": \"vessel\",
\"identifier\": \"123456\"
}"
{
"additional_terms": [
"CEO"
],
"address": "3721 West Fork Street, Montana",
"aliases": [
"J. Doe"
],
"asset_type": null,
"clients": [
{
"name": "John Doe",
"id": 1
}
],
"company_number": null,
"confidence": "Relative",
"country": null,
"country_of_birth": "NLD",
"country_of_residence": "NLD",
"created_at": "2023-08-02T18:48:22.000000Z",
"date_of_birth": null,
"deleted_at": null,
"description": "Relation of a high risk client",
"excluded_terms": [],
"gender": null,
"group_id": null,
"id": 2049050,
"identifier": null,
"monitoring_frequency_sanctions": 90,
"monitoring_frequency_peps": 90,
"monitoring_frequency_news": 90,
"monitoring_frequency_enforcements": 90,
"monitoring_frequency_other": 90,
"name": "My test case",
"nationalities": null,
"organization_id": 19,
"origin": "import",
"risk": 0.12,
"searched_at": "2023-08-02T18:48:32.000000Z",
"sources": [
{
"active": true,
"case_id": 2049050,
"data_source": {
"active": true,
"deactivated_at": "2023-02-21T12:57:31.000000Z",
"id": 409,
"source": "peps",
"vendor": "default"
},
"data_source_id": 409,
"id": 18320030,
"searched_at": "2023-08-02T18:48:22.000000Z",
"succeeded": true
},
{
"active": true,
"case_id": 2049050,
"data_source": {
"active": true,
"deactivated_at": "2023-02-21T12:57:31.000000Z",
"id": 413,
"source": "news",
"vendor": "default"
},
"data_source_id": 413,
"id": 18320031,
"searched_at": "2023-08-02T18:48:22.000000Z",
"succeeded": true
}
],
"status": "Monitored",
"type": "Person",
"unresolved_risk": 0,
"updated_at": "2023-08-02T18:48:22.000000Z",
"user_id": null,
"uuid": "a2546955-de2d-4907-a533-0846ee46f719"
}
Retrieve the key information of a case's hits.
curl --request GET \
--get "https://app.pascal.vartion.com/api/v1/cases/B3b1a0de-E464-0660-dEBB-cE54cDE1a84b|15/hits-key-information" \
--header "Authorization: Bearer {YOUR_AUTH_KEY}" \
--header "Content-Type: application/json" \
--header "Accept: application/json" \
--header "OrganizationId: 1" {
"unresolved": {
"enforcements": [
{
"data": {
"birth_dates": null,
"connections": null,
"name": "John Doe",
"nationalities": [
{
"country": "United States of America"
}
]
},
"resolution": "unresolved",
"source": "enforcements"
}
],
"sanctions": [
{
"data": {
"birth_dates": null,
"connections": null,
"name": "John Doe",
"nationalities": [
{
"country": "United States of America"
}
]
},
"resolution": "unresolved",
"source": "sanctions"
}
]
},
"positive": {
"enforcements": [
{
"data": {
"birth_dates": null,
"connections": null,
"name": "John Doe",
"nationalities": [
{
"country": "United States of America"
}
]
},
"resolution": "positive",
"source": "enforcements"
}
],
"sanctions": [
{
"data": {
"birth_dates": null,
"connections": null,
"name": "John Doe",
"nationalities": [
{
"country": "United States of America"
}
]
},
"resolution": "positive",
"source": "sanctions"
}
]
}
}
Create a new client.
curl --request POST \
"https://app.pascal.vartion.com/api/v1/clients" \
--header "Authorization: Bearer {YOUR_AUTH_KEY}" \
--header "Content-Type: application/json" \
--header "Accept: application/json" \
--header "OrganizationId: 1" \
--data "{
\"name\": \"My client\",
\"identifier\": \"ID123\",
\"description\": \"A description of the client.\"
}"
{
"id": 13152,
"name": "Pauline Lindgren III",
"organization_id": 91,
"created_at": "2025-08-28T13:40:59.000000Z",
"updated_at": "2025-08-28T13:40:59.000000Z",
"description": "Accusantium quod voluptas ut. Rerum dolorum soluta rerum dolores. Ut officia quia velit maxime non ducimus.",
"status": "Active",
"assignee_user_id": null,
"onboarding_status": null,
"onboarding_risk": null,
"cases_count": 8,
"risk": 0.12,
"hits_total_count": 0,
"hits_unresolved_count": 0,
"resolve_progress": 100,
"approval_steps": []
}
Get detailed information on a specific client.
curl --request GET \
--get "https://app.pascal.vartion.com/api/v1/clients/564" \
--header "Authorization: Bearer {YOUR_AUTH_KEY}" \
--header "Content-Type: application/json" \
--header "Accept: application/json" \
--header "OrganizationId: 1" {
"id": 1,
"name": "My client",
"identifier": "ABC-123",
"organization_id": 1,
"created_at": "2025-08-28T13:40:59.000000Z",
"updated_at": "2025-08-28T14:20:59.000000Z",
"description": "A description of the client.",
"status": "Active",
"assignee_user_id": null,
"onboarding_status": "waiting for approval",
"onboarding_risk": null,
"cases_count": 8,
"risk": 0.12,
"hits_total_count": 0,
"hits_unresolved_count": 0,
"resolve_progress": 100,
"approval_steps": [
{
"id": 328,
"user_id": 2194,
"approved": true,
"updated_at": "2025-08-28T14:20:59.000000Z",
"approved_by_function": "Compliance Officer",
"user_name": "John Smith"
},
{
"id": 329,
"user_id": null,
"approved": null,
"updated_at": "2025-08-28T14:20:59.000000Z",
"approved_by_function": null,
"user_name": null
}
]
}
Search for clients using filters. Returning basic information on a list of clients. Paginating through results is possible using the per_page and page parameters.
curl --request POST \
"https://app.pascal.vartion.com/api/v1/clients/searches" \
--header "Authorization: Bearer {YOUR_AUTH_KEY}" \
--header "Content-Type: application/json" \
--header "Accept: application/json" \
--header "OrganizationId: 1" \
--data "{
\"id\": null,
\"not_id\": null,
\"identifier\": [
\"ID123\"
],
\"assignee_user_id\": [
16
],
\"client_client_id\": [
22
],
\"not_client_client_id\": [
67
],
\"not_cases_id\": [
66
],
\"onboarding_status\": [
\"completed\"
],
\"organization_id\": null,
\"page\": 1,
\"per_page\": 10,
\"sort_by\": \"updated_at\",
\"sort_order\": \"desc\",
\"updated_at\": [
\"2025-01-01\",
\"2025-01-31\"
],
\"created_at\": [
\"2025-01-01\",
\"2025-01-31\"
],
\"risk\": [
[
\"high\",
\"very high\"
]
],
\"cases_count\": [
1
],
\"clients_count\": [
1
],
\"custom_filters\": [
\"has_onboarding_forms\"
],
\"cases\": {
\"group_id\": [
1
],
\"user_id\": [
1
],
\"country\": [
\"NLD\"
],
\"created_at\": [
\"2025-01-01\",
\"2025-01-31\"
],
\"nationalities\": [
\"NLD\"
],
\"status\": null,
\"type\": null,
\"updated_at\": [
\"2025-01-01\",
\"2025-01-31\"
],
\"hits\": {
\"resolution\": [
[
\"unresolved\",
\"positive\"
]
],
\"source\": null,
\"time_range\": [
\"2025-01-01\",
\"2025-01-31\"
]
}
},
\"with\": [
\"approvalSteps\"
]
}"
{
"data": [
{
"id": 1,
"identifier": "ABC-123",
"name": "My client",
"organization_id": 1,
"created_at": "2025-08-28T13:40:59.000000Z",
"updated_at": "2025-08-28T13:40:59.000000Z",
"description": "A description of the client.",
"status": "Active",
"assignee_user_id": null,
"onboarding_status": null,
"onboarding_risk": null,
"cases_count": 8,
"risk": 0.12,
"hits_total_count": 0,
"hits_unresolved_count": 0,
"resolve_progress": 100,
"approval_steps": []
}
],
"meta": {
"current_page": 1,
"from": 1,
"last_page": 1,
"per_page": 10,
"to": 1,
"total": 1
}
}
Link a client to other clients.
curl --request POST \
"https://app.pascal.vartion.com/api/v1/clients/1/clients" \
--header "Authorization: Bearer {YOUR_AUTH_KEY}" \
--header "Content-Type: application/json" \
--header "Accept: application/json" \
--data "{
\"client_ids\": [
2,
3
]
}"
[Empty response]
Edit the specifications of an existing client.
curl --request PATCH \
"https://app.pascal.vartion.com/api/v1/clients/564" \
--header "Authorization: Bearer {YOUR_AUTH_KEY}" \
--header "Content-Type: application/json" \
--header "Accept: application/json" \
--header "OrganizationId: 1" \
--data "{
\"name\": \"My client\"
}"
{
"id": 1,
"name": "My client",
"identifier": "ABC-123",
"organization_id": 1,
"created_at": "2025-08-28T13:40:59.000000Z",
"updated_at": "2025-08-28T14:20:59.000000Z",
"description": "A description of the client.",
"status": "Active",
"assignee_user_id": null,
"onboarding_status": "waiting for approval",
"onboarding_risk": null,
"cases_count": 8,
"risk": 0.12,
"hits_total_count": 0,
"hits_unresolved_count": 0,
"resolve_progress": 100,
"approval_steps": [
{
"id": 328,
"user_id": 2194,
"approved": true,
"updated_at": "2025-08-28T14:20:59.000000Z",
"approved_by_function": "Compliance Officer",
"user_name": "John Smith"
},
{
"id": 329,
"user_id": null,
"approved": null,
"updated_at": "2025-08-28T14:20:59.000000Z",
"approved_by_function": null,
"user_name": null
}
]
}
Unlink a client from other clients.
curl --request DELETE \
"https://app.pascal.vartion.com/api/v1/clients/1/clients" \
--header "Authorization: Bearer {YOUR_AUTH_KEY}" \
--header "Content-Type: application/json" \
--header "Accept: application/json" \
--data "{
\"client_ids\": [
2,
3
]
}"
[Empty response]
Import a list of clients asynchronously. You can use the 'Search clients' endpoint to check the status of the imported clients. The returned 'batch_id' is a batch ID, which you can use to check the progress of the import using the 'Get batch' endpoint.
curl --request POST \
"https://app.pascal.vartion.com/api/v1/clients/import" \
--header "Authorization: Bearer {YOUR_AUTH_KEY}" \
--header "Content-Type: application/json" \
--header "Accept: application/json" \
--data "{
\"clients\": [
{
\"type\": \"Person\",
\"name\": \"John Doe\",
\"identifier\": \"ID123\",
\"status\": \"Active\",
\"address\": \"123 Main St, Springfield\",
\"phone_number\": \"+31612345678\",
\"email\": \"[email protected]\",
\"incorporation_date\": \"2020-01-31\",
\"company_number\": \"12345678\",
\"country\": \"NLD\",
\"nationalities\": [
\"NLD\"
],
\"date_of_birth\": \"1990-01-31\",
\"standard_industry_classifications\": [
\"01110\"
],
\"account_creation_date\": \"2023-01-31\",
\"risk_indicators\": [
\"PEP\"
],
\"estimated_incoming_amount\": 100000,
\"estimated_incoming_currency\": \"EUR\",
\"estimated_outgoing_amount\": 50000,
\"estimated_outgoing_currency\": \"EUR\",
\"description\": \"Important client\",
\"user_risk_score\": 0.06,
\"assignee_user_id\": 1,
\"profession\": \"Software Engineer\",
\"gender\": \"male\",
\"cash_incoming_currency\": \"USD\",
\"cash_incoming_amount\": 10000,
\"cash_outgoing_currency\": \"USD\",
\"cash_outgoing_amount\": 5000,
\"cash_percentage\": 12.5,
\"transaction_count\": 120,
\"transaction_volume_incoming\": 200000,
\"transaction_volume_outgoing\": 150000,
\"transaction_count_cross_border\": 10,
\"transaction_volume_cross_border_incoming\": 50000,
\"transaction_volume_cross_border_outgoing\": 30000,
\"transaction_countries\": [
\"NLD\"
]
}
],
\"deduplication_fields\": [
\"name\"
],
\"ignore_empty_fields\": false,
\"batch_id\": \"99cbb5f6-49a7-492c-a1de-92ff356d98d8\",
\"count\": 250
}"
{
"batch_id": "1abd0c71-dadd-4dad-8e20-1bd83aea25b3"
}
Search for any created onboarding form templates. Paginating through results is possible using the per_page and page parameters.
curl --request POST \
"https://app.pascal.vartion.com/api/v1/onboarding-form-templates/searches" \
--header "Authorization: Bearer {YOUR_AUTH_KEY}" \
--header "Content-Type: application/json" \
--header "Accept: application/json" \
--header "OrganizationId: 1" \
--data "{
\"page\": 1,
\"per_page\": 10,
\"updated_at\": [
\"2025-01-01\",
\"2025-01-31\"
],
\"sort_by\": \"updated_at\",
\"sort_order\": \"desc\"
}"
{
"data": [
{
"created_at": "2024-11-28T08:34:03.000000Z",
"external_name": "Standard Form",
"id": 88,
"name": "Standard Form",
"organization_id": 15,
"updated_at": "2024-11-28T08:34:03.000000Z"
}
],
"meta": {
"current_page": 1,
"from": 1,
"last_page": 1,
"per_page": 10,
"to": 1,
"total": 1
}
}
Create an onboarding form for an existing client.
Adding an onboarding form to a client will make it visible in the Onboarding application.
curl --request POST \
"https://app.pascal.vartion.com/api/v1/onboarding-forms" \
--header "Authorization: Bearer {YOUR_AUTH_KEY}" \
--header "Content-Type: application/json" \
--header "Accept: application/json" \
--header "OrganizationId: 1" \
--data "{
\"assignee_user_email\": \"[email protected]\",
\"external_users\": [
{
\"first_name\": \"g\",
\"last_name\": \"z\",
\"email\": \"[email protected]\"
}
],
\"onboarding_form_template_id\": 16,
\"client_id\": 22
}"
{
"assignee_user_id": 24,
"client_id": 2834,
"created_at": "2025-03-31T11:22:10.000000Z",
"external_name": "Standard Form",
"external_questions_open": 1,
"external_questions_total": 1,
"id": 273,
"name": "Standard Form",
"organization_id": 10240,
"questions_open": 1,
"questions_total": 1,
"status": "in progress",
"updated_at": "2025-03-31T11:22:10.000000Z"
}
Search for onboarding forms using filters. Returning basic information on a list of onboarding forms. Paginating through results is possible using the per_page and page parameters.
curl --request POST \
"https://app.pascal.vartion.com/api/v1/onboarding-forms/searches" \
--header "Authorization: Bearer {YOUR_AUTH_KEY}" \
--header "Content-Type: application/json" \
--header "Accept: application/json" \
--header "OrganizationId: 1" \
--data "{
\"page\": 1,
\"per_page\": 10,
\"name\": \"b\",
\"updated_at\": [
\"2025-01-01\",
\"2025-01-31\"
],
\"sort_by\": \"updated_at\",
\"sort_order\": \"desc\",
\"external_user_ids\": [
22
],
\"client_id\": [
67
],
\"with\": [
\"user\"
]
}"
cache-control
: no-cache, private
content-type
: application/json
x-ratelimit-limit
: 1000
x-ratelimit-remaining
: 995
vary
: Precognition, Origin
{
"data": [],
"meta": {
"current_page": 1,
"from": null,
"last_page": 1,
"per_page": 10,
"to": null,
"total": 0
}
}
Search for onboarding form questions using filters.
curl --request POST \
"https://app.pascal.vartion.com/api/v1/onboarding-form-questions/searches" \
--header "Authorization: Bearer {YOUR_AUTH_KEY}" \
--header "Content-Type: application/json" \
--header "Accept: application/json" \
--header "OrganizationId: 1" \
--data "{
\"external_ids\": [
\"ID123\"
],
\"page\": 1,
\"per_page\": 10,
\"onboarding_form_ids\": null
}"
{
"data": [
{
"id": 164,
"question_id": 2,
"parent_question_id": null,
"title": "Yes / No",
"answer": "Yes",
"type": "true_false",
"created_at": "2024-04-18T09:55:40.000000Z",
"updated_at": "2024-04-18T09:55:48.000000Z"
},
{
"id": 178,
"question_id": 3,
"parent_question_id": null,
"title": "Date of birth",
"answer": "2024-04-02",
"type": "datepicker",
"created_at": "2024-04-19T07:47:24.000000Z",
"updated_at": "2024-04-19T07:58:17.000000Z"
},
{
"id": 168,
"question_id": 4,
"parent_question_id": null,
"title": "True or false",
"answer": "Yes",
"type": "true_false",
"created_at": "2024-04-18T10:01:46.000000Z",
"updated_at": "2024-04-18T10:01:54.000000Z"
},
{
"id": 173,
"question_id": 5,
"parent_question_id": null,
"title": "Yes / No",
"answer": "Yes",
"type": "true_false",
"created_at": "2024-04-18T11:40:29.000000Z",
"updated_at": "2024-04-18T11:51:59.000000Z"
},
{
"id": 175,
"question_id": 6,
"parent_question_id": null,
"title": "Name",
"answer": "John Doe",
"type": "text",
"created_at": "2024-04-18T11:51:56.000000Z",
"updated_at": "2024-04-18T11:52:01.000000Z"
},
{
"id": 176,
"question_id": 7,
"parent_question_id": null,
"title": "E-mail",
"answer": "[email protected]",
"type": "text",
"created_at": "2024-04-18T11:51:56.000000Z",
"updated_at": "2024-04-18T11:52:04.000000Z"
},
{
"id": 548,
"question_id": 8,
"parent_question_id": null,
"title": "Name",
"answer": null,
"type": "text",
"created_at": "2024-05-28T11:15:07.000000Z",
"updated_at": "2024-05-28T11:15:07.000000Z"
},
{
"id": 170,
"question_id": 9,
"parent_question_id": null,
"title": "Website",
"answer": null,
"type": "url",
"created_at": "2024-04-18T10:01:46.000000Z",
"updated_at": "2024-05-07T07:39:07.000000Z"
},
{
"id": 166,
"question_id": 10,
"parent_question_id": null,
"title": "Please give a number",
"answer": "2",
"type": "number",
"created_at": "2024-04-18T10:01:46.000000Z",
"updated_at": "2024-04-23T12:42:32.000000Z"
},
{
"id": 167,
"question_id": 11,
"parent_question_id": null,
"title": "Website",
"answer": "http://example.com",
"type": "url",
"created_at": "2024-04-18T10:01:46.000000Z",
"updated_at": "2024-04-23T12:42:38.000000Z"
},
{
"id": 171,
"question_id": 12,
"parent_question_id": null,
"title": "Choose a fruit",
"answer": null,
"type": "dropdown",
"created_at": "2024-04-18T10:01:46.000000Z",
"updated_at": "2024-05-07T07:39:10.000000Z"
},
{
"id": 172,
"question_id": 13,
"parent_question_id": null,
"title": "Choose another fruit",
"answer": "a",
"type": "dropdown",
"created_at": "2024-04-18T10:01:46.000000Z",
"updated_at": "2024-04-23T12:42:40.000000Z"
},
{
"id": 177,
"question_id": 14,
"parent_question_id": null,
"title": "Please upload your document",
"answer": null,
"type": "upload",
"created_at": "2024-04-18T11:51:56.000000Z",
"updated_at": "2024-04-18T11:51:56.000000Z"
},
{
"id": 189,
"question_id": 15,
"parent_question_id": null,
"title": "Persons to email",
"answer": null,
"type": "repeater",
"created_at": "2024-04-22T08:11:43.000000Z",
"updated_at": "2024-04-23T14:28:48.000000Z"
},
{
"id": 185,
"question_id": 16,
"parent_question_id": 15,
"title": "E-mail",
"answer": null,
"type": "text",
"created_at": "2024-04-22T08:11:43.000000Z",
"updated_at": "2024-04-23T14:28:48.000000Z"
},
{
"id": 169,
"question_id": 17,
"parent_question_id": null,
"title": "Please choose another number",
"answer": "2",
"type": "number",
"created_at": "2024-04-18T10:01:46.000000Z",
"updated_at": "2024-04-23T12:43:29.000000Z"
}
],
"meta": {
"current_page": 1,
"from": 1,
"last_page": 13,
"per_page": 15,
"to": 15,
"total": 187
}
}
Download an uploaded file for a question in an onboarding form.
curl --request GET \
--get "https://app.pascal.vartion.com/api/v1/onboarding-form-question-uploads/1" \
--header "Authorization: Bearer {YOUR_AUTH_KEY}" \
--header "Content-Type: application/json" \
--header "Accept: */*" \
--header "OrganizationId: 1"
The usual flow for a one time case link is as follows:
Create one time case links.
curl --request POST \
"https://app.pascal.vartion.com/api/v1/one-time-case-links" \
--header "Authorization: Bearer {YOUR_AUTH_KEY}" \
--header "Content-Type: application/json" \
--header "Accept: application/json" \
--header "OrganizationId: 1" \
--data "{
\"case_uuid\": \"ac6962da-4ff0-42ad-b5ee-35153d15e924\",
\"user_email\": \"[email protected]\",
\"return_url\": \"https:\\/\\/localhost\",
\"expires_at\": \"1970-01-31 23:00:00\",
\"interface_language\": \"en-gb\"
}"
{
"case_uuid": "ac6962da-4ff0-42ad-b5ee-35153d15e924",
"created_at": "2023-08-14T10:50:25.000000Z",
"created_by_id": 4,
"expires_at": "2099-01-31T23:00:00.000000Z",
"id": 11,
"return_url": "https://localhost",
"token": "ehgwKBKPPubqQ7CC",
"updated_at": "2023-08-14T10:50:25.000000Z",
"user_id": 13989
}
View a one time case link.
curl --request GET \
--get "https://app.pascal.vartion.com/api/v1/one-time-case-links/1" \
--header "Authorization: Bearer {YOUR_AUTH_KEY}" \
--header "Content-Type: application/json" \
--header "Accept: application/json" \
--header "OrganizationId: 1" {
"case_uuid": "ac6962da-4ff0-42ad-b5ee-35153d15e924",
"created_at": "2023-08-14T10:50:25.000000Z",
"created_by_id": 4,
"expires_at": "2099-01-31T23:00:00.000000Z",
"id": 11,
"return_url": "https://localhost",
"updated_at": "2023-08-14T10:50:25.000000Z",
"used_at": null,
"user_id": 13989
}
Delete a one time case link.
curl --request DELETE \
"https://app.pascal.vartion.com/api/v1/one-time-case-links/1" \
--header "Authorization: Bearer {YOUR_AUTH_KEY}" \
--header "Content-Type: application/json" \
--header "Accept: application/json" \
--header "OrganizationId: 1"
cache-control
: no-cache, private
content-type
: application/json
x-ratelimit-limit
: 1000
x-ratelimit-remaining
: 994
vary
: Precognition, Origin
{
"message": ""
}
Authenticate using a one time case link.
When successful, the user will be redirected to the page where they can resolve the linked case.
When unsuccessful, the user will be redirected the the login page.
curl --request GET \
--get "https://app.pascal.vartion.com/v1/one-time-case-link-authentication" \
--header "Content-Type: application/x-www-form-urlencoded" \
--header "Accept: text/html" \
--data "id=1&token=fpncIktnu0GfUKJl"
<!DOCTYPE html>
<html lang="en-gb">
...
</html>
Authenticate using a one time case link.
When successful, the user will be redirected to the page where they can resolve the linked case.
When unsuccessful, the user will be redirected the the login page.
curl --request POST \
"https://app.pascal.vartion.com/v1/one-time-case-link-authentication" \
--header "Content-Type: application/x-www-form-urlencoded" \
--header "Accept: text/html" \
--data "id=1&token=fpncIktnu0GfUKJl"
<!DOCTYPE html>
<html lang="en-gb">
...
</html>
Start the generation of one or more PDF case reports. Cases to be used are selected using the filter parameter. An id is returned which can be used to check if the download is finished and download the PDF when it is finished.
curl --request POST \
"https://app.pascal.vartion.com/api/v1/pdf/case" \
--header "Authorization: Bearer {YOUR_AUTH_KEY}" \
--header "Content-Type: application/json" \
--header "Accept: application/json" \
--header "OrganizationId: 1" \
--data "{
\"batch_name\": \"b\",
\"filename\": \"n\",
\"detailed\": false,
\"language\": \"en-gb\",
\"pages\": [
\"overview\"
],
\"comment\": \"Automatically generated from the Pascal API\",
\"to_email\": false,
\"filters\": {
\"user_id\": [
1
],
\"group_id\": [
1
],
\"created_at\": [
\"2025-01-01\",
\"2025-01-31\"
],
\"updated_at\": [
\"2025-01-01\",
\"2025-01-31\"
],
\"deleted\": false,
\"uuid\": [
\"a2546955-de2d-4907-a533-0846ee46f719\"
],
\"nationalities\": [
\"NLD\"
],
\"country_of_birth\": [
\"NLD\"
],
\"country_of_residence\": [
\"NLD\"
],
\"company_number\": \"g\",
\"address\": \"z\",
\"country\": [
\"NLD\"
],
\"hit_resolution\": [
\"positive\"
],
\"hit_source\": null,
\"hit_time_range\": [
\"2025-01-01\",
\"2025-01-31\"
],
\"client_status\": [
\"Active\"
],
\"clients\": {
\"cases_count\": [
1
],
\"clients_count\": [
1
],
\"created_at\": [
\"2025-01-01\",
\"2025-01-31\"
],
\"risk\": [
\"very high\"
],
\"updated_at\": [
\"2025-01-01\",
\"2025-01-31\"
],
\"identifier\": [
\"ID123\"
]
}
}
}"
{
"id": "1abd0c71-dadd-4dad-8e20-1bd83aea25b3",
"created_at": "2024-06-10T12:00:00.000000Z",
"finished_at": null
}
Download a previously generated report, using a report id or a report job id.
curl --request GET \
--get "https://app.pascal.vartion.com/api/v1/reports/B3b1a0de-E464-0660-dEBB-cE54cDE1a84b|15/download" \
--header "Authorization: Bearer {YOUR_AUTH_KEY}" \
--header "Content-Type: application/json" \
--header "Accept: application/pdf" \
--header "OrganizationId: 1" PDF report file
This endpoint returns the transaction monitoring risk configuration.
Note: Access to transaction monitoring is required to use this endpoint.
curl --request GET \
--get "https://app.pascal.vartion.com/api/v1/transaction-monitoring-risk-config" \
--header "Authorization: Bearer {YOUR_AUTH_KEY}" \
--header "Content-Type: application/json" \
--header "Accept: application/json" \
--header "OrganizationId: 1" {
"blocked_countries": [
"NLD",
"USA",
"JPN"
]
}
Import a list of transactions asynchronously.
Note: Access to transaction monitoring is required to use this endpoint.
curl --request POST \
"https://app.pascal.vartion.com/api/v1/transactions/import" \
--header "Authorization: Bearer {YOUR_AUTH_KEY}" \
--header "Content-Type: application/json" \
--header "Accept: application/json" \
--header "OrganizationId: 1" \
--data "{
\"transactions\": [
{
\"client_account_number\": \"1234567890\",
\"client_swift_code\": \"ABNANL2A\",
\"client_bank_account_country\": \"NLD\",
\"identifier\": \"TXN123456\",
\"amount\": 1000.5,
\"currency\": \"EUR\",
\"direction\": \"incoming\",
\"counter_party_name\": \"John Doe\",
\"counter_party_currency\": \"USD\",
\"counter_party_account_number\": \"0987654321\",
\"counter_party_swift_code\": \"RABONL2U\",
\"counter_party_bank_name\": \"Rabobank\",
\"counter_party_bank_account_country\": \"NLD\",
\"description\": \"Invoice payment #12345\",
\"transaction_date\": \"2023-08-02T14:30:00+02:00\",
\"type\": \"wire_transfer\",
\"balance_after_transaction\": 15000.75
}
],
\"batch_id\": \"99cbb5f6-49a7-492c-a1de-92ff356d98d8\",
\"count\": 150
}"
{
"id": "1abd0c71-dadd-4dad-8e20-1bd83aea25b3",
"created_at": "2024-06-10T12:00:00.000000Z",
"finished_at": null
}