Skip to main content
Creates a new application for a given configuration and returns a unique link for the primary contact to complete their submission.
POST /api/external/applications

Authentication

Requires an API key with applications:create scope.
Authorization: Bearer klara_{client_id}.{secret}

Request body

config_id
string
required
Application config ID. Must belong to the organization associated with the API key.
primary_contact
object
required
The main contact who will complete the application.
company_name
string
Name of the company being onboarded.
company_number
string
Company registration number.
country
string
ISO 3166-1 alpha-2 country code (e.g., GB for United Kingdom, IE for Ireland).
pre_auth
boolean
default:"false"
When true, generates a pre-authentication code that allows the participant to bypass email verification. The code expires after 72 hours.

Response

Returns 201 Created on success.
application_id
string
Unique identifier (UUID) for the created application.
URL where the participant should be redirected to complete their application.
participants
array
List of participants associated with this application.
pre_auth_code
string
Pre-authentication code (only present when pre_auth: true). Expires 72 hours after creation.
warning
string
Warning message (only present if the invite email failed to send). The application is still created successfully — the email can be resent.

Examples

Basic request

curl -X POST https://app.klara-ai.com/api/external/applications \
  -H "Authorization: Bearer klara_abc123def456.your-secret-here" \
  -H "Content-Type: application/json" \
  -d '{
    "config_id": "kyc-standard",
    "primary_contact": {
      "email": "sophie@acme.com",
      "name": "Sophie Mitchell"
    },
    "company_name": "Acme Financial Ltd",
    "company_number": "12345678",
    "country": "GB"
  }'
Response:
{
  "application_id": "550e8400-e29b-41d4-a716-446655440000",
  "link": "https://app.klara-ai.com/external/acme-corp/application/ABC123",
  "participants": [
    {
      "id": "660e8400-e29b-41d4-a716-446655440001",
      "link_slug": "7f3k9m2p4q8r1s5t",
      "email": "sophie@acme.com",
      "role": "primary"
    }
  ]
}

With pre-authentication

Include pre_auth: true to generate a code that bypasses email verification:
curl -X POST https://app.klara-ai.com/api/external/applications \
  -H "Authorization: Bearer klara_abc123def456.your-secret-here" \
  -H "Content-Type: application/json" \
  -d '{
    "config_id": "kyc-standard",
    "primary_contact": {
      "email": "sophie@acme.com",
      "name": "Sophie Mitchell"
    },
    "company_name": "Acme Financial Ltd",
    "pre_auth": true
  }'
Response:
{
  "application_id": "550e8400-e29b-41d4-a716-446655440000",
  "link": "https://app.klara-ai.com/external/acme-corp/application/ABC123",
  "participants": [
    {
      "id": "660e8400-e29b-41d4-a716-446655440001",
      "link_slug": "7f3k9m2p4q8r1s5t",
      "email": "sophie@acme.com",
      "role": "primary"
    }
  ],
  "pre_auth_code": "X7K9M2P4Q8R1S5T3"
}
When using pre-authentication, redirect the user to the link within the 72-hour window. If the code expires, the user will be prompted to verify their email instead — no error occurs, they just go through the standard verification flow.
Need to re-issue a pre-auth code after it expires or gets consumed? Use the Refresh Pre-Auth endpoint instead of creating a new application.

Errors

{
  "error": "config_id and primary_contact.email are required"
}
ErrorCause
config_id and primary_contact.email are requiredOne or both required fields are missing
Invalid email address for primary_contact.emailThe provided email address is not valid
Invalid config_idThe config ID does not exist
Invalid API keyAPI key is invalid, expired, or inactive
API key missing required scopesAPI key doesn’t have the applications:create scope
Config not available for this organizationThe config belongs to a different organization
Internal server errorAn unexpected error occurred on the server