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.

Recent changes

In Pascal 6.2 we replaced the `jurisdiction` field with a `country` field in cases:

  • The `country` field is an ISO 3166-1 alpha-3 country code string.
  • The `jurisdiction` field was removed.
  • These changes apply to the "Import cases", "Search cases", and "Update case" endpoints.

Webhooks

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

Webhook events

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.

Client errors

Our API returns 4xx status codes when there is something wrong with your request.
Common client errors are:

  • 401 Unauthorized. You are either missing the `Authorization` header or the specified `Authorization` header is incorrect.
  • 403 Forbidden. This usually means that your account is not allowed to access the given resource. Maybe you forgot to add the `OrganizationId` header.
  • 404 Not Found. The resource you are trying to access does not exist.
  • 419 Session Expired. Your session has expired. This can happen if you use a session cookie to authenticate with the API. We recommend you use `API tokens` instead as described under `Authenticating requests`.
  • 422 Unprocessable Entity. Something in the request body is incorrect. Every endpoint has its own validation rules. This error means that the request did not comply with those rules. The response usually contains information about what fields are incorrect.
  • 429 Too Many Requests. Our API has a global rate limit of 1.000 requests per minute per user. This error means that that limit was reached.

Authenticating requests

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.

Getting started

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.

Bank Accounts

Import bank accounts

POST
https://app.pascal.vartion.com
/api/v1/bank-accounts/import
requires authentication

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.

Example request:
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
}"
Example response:
{
    "id": "1abd0c71-dadd-4dad-8e20-1bd83aea25b3",
    "created_at": "2024-06-10T12:00:00.000000Z",
    "finished_at": null
}

Batches

Get batch

GET
https://app.pascal.vartion.com
/api/v1/batches/{id}
requires authentication

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.

Example request:
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"
Example response:
{
    "id": "1abd0c71-dadd-4dad-8e20-1bd83aea25b3",
    "created_at": "2024-06-10T12:00:00.000000Z",
    "finished_at": null
}

Cases

Import cases

POST
https://app.pascal.vartion.com
/api/v1/cases/import
requires authentication

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.

Example request:
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
}"
Example response:
{
    "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 case

POST
https://app.pascal.vartion.com
/api/v1/cases
requires authentication

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.

Example request:
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\"
}"
Example response:
{
    "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"
}
{
    "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"
}
{
    "message": "Maximum concurrent requests (3) reached. Please wait for existing requests to complete."
}
{
    "message": "Duplicate case found in 'Preview' status. Set 'allow_duplicate_conversion' to true to allow conversion to a searchable status, or update the case status manually.",
    "id": 1,
    "uuid": "a41199d4-69eb-459e-809e-d169fb94a076"
}
{
    "message": "Search failed"
}

List cases

POST
https://app.pascal.vartion.com
/api/v1/cases/searches
requires authentication

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.

Example request:
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\"
        ]
    }
}"
Example response:
{
    "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"
}

Update case

PATCH
https://app.pascal.vartion.com
/api/v1/cases/{id}
requires authentication

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.

Example request:
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\"
}"
Example response:
{
    "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"
}

Case hits key information

GET
https://app.pascal.vartion.com
/api/v1/cases/{id}/hits-key-information
requires authentication

Retrieve the key information of a case's hits.

Example request:
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"
Example response:
{
    "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"
            }
        ]
    }
}

Clients

Create client

POST
https://app.pascal.vartion.com
/api/v1/clients
requires authentication

Create a new client.

Example request:
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.\"
}"
Example response:
{
    "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": []
}
{
    "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
        }
    ]
}

Get client

GET
https://app.pascal.vartion.com
/api/v1/clients/{id}
requires authentication

Get detailed information on a specific client.

Example request:
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"
Example response:
{
    "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
        }
    ]
}

List clients

POST
https://app.pascal.vartion.com
/api/v1/clients/searches
requires authentication

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.

Example request:
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\"
    ]
}"
Example response:
{
    "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 clients

POST
https://app.pascal.vartion.com
/api/v1/clients/{id}/clients
requires authentication

Link a client to other clients.

Example request:
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
    ]
}"
Example response:
[Empty response]

Update client

PATCH
https://app.pascal.vartion.com
/api/v1/clients/{id}
requires authentication

Edit the specifications of an existing client.

Example request:
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\"
}"
Example response:
{
    "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 clients

DELETE
https://app.pascal.vartion.com
/api/v1/clients/{id}/clients
requires authentication

Unlink a client from other clients.

Example request:
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
    ]
}"
Example response:
[Empty response]

Import clients

POST
https://app.pascal.vartion.com
/api/v1/clients/import
requires authentication

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.

Example request:
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
}"
Example response:
{
    "batch_id": "1abd0c71-dadd-4dad-8e20-1bd83aea25b3"
}

Onboarding forms

List onboarding form templates

POST
https://app.pascal.vartion.com
/api/v1/onboarding-form-templates/searches
requires authentication

Search for any created onboarding form templates. Paginating through results is possible using the per_page and page parameters.

Example request:
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\"
}"
Example response:
{
    "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 onboarding form

POST
https://app.pascal.vartion.com
/api/v1/onboarding-forms
requires authentication

Create an onboarding form for an existing client.
Adding an onboarding form to a client will make it visible in the Onboarding application.

Example request:
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
}"
Example response:
{
    "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"
}

List onboarding forms

POST
https://app.pascal.vartion.com
/api/v1/onboarding-forms/searches
requires authentication

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.

Example request:
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\"
    ]
}"
Example response:
Headers

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

List onboarding form questions

POST
https://app.pascal.vartion.com
/api/v1/onboarding-form-questions/searches
requires authentication

Search for onboarding form questions using filters.

Example request:
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
}"
Example response:
{
    "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 `upload` question file

GET
https://app.pascal.vartion.com
/api/v1/onboarding-form-question-uploads/{id}
requires authentication

Download an uploaded file for a question in an onboarding form.

Example request:
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"
Example response:

One time case links

The usual flow for a one time case link is as follows:

  1. Create a one time case link using your personal access token.
  2. Store the generated one time case link id and token somewhere secure.
  3. Use a one time case link (this is done by your user). See: Authenticate using a one time case link
POST
https://app.pascal.vartion.com
/api/v1/one-time-case-links
requires authentication

Create one time case links.

Example request:
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\"
}"
Example response:
GET
https://app.pascal.vartion.com
/api/v1/one-time-case-links/{id}
requires authentication

View a one time case link.

Example request:
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"
Example response:
DELETE
https://app.pascal.vartion.com
/api/v1/one-time-case-links/{id}
requires authentication

Delete a one time case link.

Example request:
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"
Example response:
GET
https://app.pascal.vartion.com
/v1/one-time-case-link-authentication

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.

Example request:
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"
Example response:
POST
https://app.pascal.vartion.com
/v1/one-time-case-link-authentication

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.

Example request:
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"
Example response:

Reports

Generate case reports

POST
https://app.pascal.vartion.com
/api/v1/pdf/case
requires authentication

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.

Example request:
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\"
            ]
        }
    }
}"
Example response:
{
    "id": "1abd0c71-dadd-4dad-8e20-1bd83aea25b3",
    "created_at": "2024-06-10T12:00:00.000000Z",
    "finished_at": null
}

Download reports

GET
https://app.pascal.vartion.com
/api/v1/reports/{id}/download
requires authentication

Download a previously generated report, using a report id or a report job id.

Example request:
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"
Example response:
PDF report file
Report is not (yet) generated

Transaction monitoring risk config

Get risk config

GET
https://app.pascal.vartion.com
/api/v1/transaction-monitoring-risk-config
requires authentication

This endpoint returns the transaction monitoring risk configuration.

Note: Access to transaction monitoring is required to use this endpoint.

Example request:
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"
Example response:
{
    "blocked_countries": [
        "NLD",
        "USA",
        "JPN"
    ]
}

Transactions

Import transactions

POST
https://app.pascal.vartion.com
/api/v1/transactions/import
requires authentication

Import a list of transactions asynchronously.

Note: Access to transaction monitoring is required to use this endpoint.

Example request:
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
}"
Example response:
{
    "id": "1abd0c71-dadd-4dad-8e20-1bd83aea25b3",
    "created_at": "2024-06-10T12:00:00.000000Z",
    "finished_at": null
}