Appropriateness Test
Before a natural person may trade certain asset types, they must complete an appropriateness test. The test establishes that the customer understands the risks of the instrument class, and it is a regulatory precondition - not an optional questionnaire.
The flow is: fetch the current test for an asset type, present the questions to the customer, submit their answers, then read back the outcome.
Asset types that require a test
| Asset type | Value |
|---|---|
| Security token | SECURITY_TOKEN |
| Tracker certificate | TRACKER_CERTIFICATE |
A test is taken per asset type. Passing the test for one asset type says nothing about the other.
1. Fetch the current test
GET /appropriateness-test/asset-types/{appropriatenessTestAssetType}Returns the latest version of the test for that asset type. The response carries an appropriatenessTestId, a version, and the list of questions:
{
"appropriatenessTestId": "c855e259-15d8-4385-a60f-bdf8f7695ef7",
"version": 3,
"assetType": "SECURITY_TOKEN",
"questions": [
{
"questionCode": "Q1",
"category": "KNOWLEDGE",
"questionText": "How would you describe your experience with security tokens?",
"answers": [
{ "answerCode": "A", "answerText": "No experience" },
{ "answerCode": "B", "answerText": "Some experience" }
]
}
],
"createdOn": "2026-01-15T10:30:00Z"
}Pass the TradingProfileLanguage query parameter to receive the question and answer texts in the customer's language.
Important
Always fetch the test immediately before presenting it. The version you receive here is the one you must submit back - see below.
2. Submit the answers
POST /entities/natural-persons/{naturalPersonId}/appropriateness-test/asset-types/{appropriatenessTestAssetType}/responses
{
"TradingProfileLanguage": "de",
"version": 3,
"responses": [
{ "questionCode": "Q1", "answerCode": "B" },
{ "questionCode": "Q2", "answerCode": "A" }
]
}Requires the Requestor-ID header.
All three body fields are required. version must be the version you fetched in step 1 - this is what prevents answers being scored against a test the customer never saw. If the test has been updated in the meantime, fetch it again and re-present it.
You submit questionCode and answerCode pairs, not free text. The response returns an appropriatenessTestResponseId.
The endpoint returns 202 Accepted: scoring is asynchronous. The submission is not the outcome.
3. Read the outcome
The result arrives as a status on the response record. Poll for it, or read a specific submission directly.
GET /entities/natural-persons/{naturalPersonId}/appropriateness-test/asset-types/{appropriatenessTestAssetType}/responsesReturns a paginated list of that person's submissions for the asset type. Supports cursor, limit, TradingProfileLanguage, and TradingProfileStatus to filter by outcome.
GET /entities/natural-persons/appropriateness-test/responses/{appropriatenessTestResponseId}Returns one submission, including the answers given and the resulting status.
Outcome values
| Status | Meaning |
|---|---|
RECEIVED |
Submitted, not yet scored |
PASSED |
Customer may trade this asset type |
FAILED |
Customer did not pass |
INVALID |
Submission was rejected - for example the version no longer matches the current test |
Only PASSED unlocks trading for that asset type. Treat RECEIVED as "not yet", never as success.
Where this sits in onboarding
The appropriateness test is tied to the natural person, not to the customer role, so it can be completed independently of the onboarding process. What it gates is trading in the relevant asset types - a customer can be fully onboarded and still be blocked from trading a security token until the test is passed.
For the surrounding entity flow, see Natural Person Management.