Skip to main content
This guide walks you through ingesting client data into Corsa. Clients are the foundation of your compliance data - all transactions, alerts, and cases are linked back to them. Full API endpoint details are available in the API Reference (requires API credentials).
All SDK examples on this page assume you have initialized the Corsa client as shown in the Node.js SDK Configuration or Python SDK Configuration guide.

Overview

Corsa supports two types of clients:
  • Individuals - Natural persons (retail customers).
  • Corporates - Legal entities (businesses, organizations).
Both types support upsert behavior: if a client with the same referenceId already exists, it will be updated instead of duplicated.

Step 1: Prepare Your Client Data

Before calling the API, gather the required data for each client type.

Individual Clients

CategoryFields
Personal InformationName, Date of Birth, Gender, Citizenship
DocumentsPassport, Driver’s License, etc. (managed via identity verification integrations)
AddressResidential address
Contact DetailsEmail, Phone Number

Corporate Clients

CategoryFields
Entity DetailsLegal Name, Registration Number, Date of Incorporation
Business InfoIndustry, Business Type, Description
StructureOwnership type, Complexity
MembersAssociated Members (Individual or Corporate) who act as UBOs, Directors, or Signatories

Step 2: Ingest Individual Clients

Endpoint: POST /v1/clients/individuals Use the upsert=true query parameter to update an existing client if they already exist (matched by referenceId).
POST /v1/clients/individuals?upsert=true
Content-Type: application/json

{
  "referenceId": "USER-12345",
  "accountStatus": "APPROVED",
  "activityStatus": "ACTIVE",
  "general": {
    "firstName": "John",
    "lastName": "Doe",
    "dateOfBirth": "1985-06-15",
    "citizenship": "USA",
    "personalId": "123-45-6789",
    "gender": "MALE"
  },
  "address": {
    "addressLine1": "123 Main St",
    "city": "New York",
    "country": "USA",
    "postalCode": "10001"
  },
  "contact": {
    "emailAddress": "john.doe@example.com",
    "phoneNumber": "+1-555-0199"
  },
  "tags": ["retail", "high-volume"]
}
The response will include the Corsa-generated client id - save this for linking transactions and alerts later.

Step 3: Ingest Corporate Clients

Endpoint: POST /v1/clients/corporates Use this endpoint to onboard business entities.
POST /v1/clients/corporates?upsert=true
Content-Type: application/json

{
  "referenceId": "CORP-98765",
  "accountStatus": "APPROVED",
  "activityStatus": "ACTIVE",
  "general": {
    "legalEntityName": "Acme Innovations LLC",
    "dateOfIncorporation": "2018-04-12",
    "countryOfIncorporation": "USA"
  },
  "business": {
    "industry": "Technology",
    "description": "SaaS provider for financial services",
    "businessType": "FINANCIAL_INSTITUTIONS",
    "incorporationType": "LIMITED_LIABILITY_COMPANY"
  },
  "address": {
    "registrationAddress": {
      "addressLine1": "456 Tech Park Blvd",
      "city": "Austin",
      "country": "USA",
      "postalCode": "73301"
    }
  },
  "tags": ["enterprise", "saas"]
}

Step 4: Retrieve a Client

Use the GET endpoints to fetch client data by their Corsa-generated ID.

Get an Individual Client

Endpoint: GET /v1/clients/individuals/{clientId}
GET /v1/clients/individuals/client-uuid-123

Get a Corporate Client

Endpoint: GET /v1/clients/corporates/{clientId}
GET /v1/clients/corporates/client-uuid-456

Step 5: Update a Client

Use the PUT endpoints to update existing client data. All fields are optional on update - only include the fields you want to change.

Update an Individual Client

Endpoint: PUT /v1/clients/individuals/{clientId}
PUT /v1/clients/individuals/client-uuid-123
Content-Type: application/json

{
  "general": {
    "firstName": "John",
    "lastName": "Doe-Smith"
  },
  "contact": {
    "emailAddress": "john.doesmith@example.com"
  },
  "accountStatus": "APPROVED",
  "activityStatus": "ACTIVE"
}

Update a Corporate Client

Endpoint: PUT /v1/clients/corporates/{clientId}
PUT /v1/clients/corporates/client-uuid-456
Content-Type: application/json

{
  "activityStatus": "ACTIVE",
  "accountStatus": "APPROVED",
  "business": {
    "industry": "Financial Services",
    "description": "Updated business description"
  }
}

Step 6: Bulk Update Clients

Apply the same field changes to up to 100 clients in a single request. Use this when you need to update risk assessments, statuses, or screening results across a group of clients at once.

Bulk Update Individual Clients

Endpoint: PATCH /v1/clients/individuals/bulk/update
PATCH /v1/clients/individuals/bulk/update
Content-Type: application/json

{
  "clientIds": ["client-uuid-001", "client-uuid-002", "client-uuid-003"],
  "update": {
    "accountStatus": "FROZEN",
    "currentRisk": {
      "score": 90,
      "level": "HIGH",
      "reason": "Periodic review triggered elevated risk score"
    }
  }
}

Bulk Update Corporate Clients

Endpoint: PATCH /v1/clients/corporates/bulk/update
PATCH /v1/clients/corporates/bulk/update
Content-Type: application/json

{
  "clientIds": ["corp-uuid-001", "corp-uuid-002"],
  "update": {
    "sanctionsStatus": "FLAGGED",
    "tagsToAdd": ["under-review"],
    "tagsToRemove": ["clear"]
  }
}

Bulk Update Request Fields

FieldRequiredDescription
clientIdsYesArray of client IDs or referenceIds to update (maximum 100).
updateYesFields to apply to every client in the list.
update.accountStatusNoAPPROVED, WAITING_FOR_REVIEW, IN_REVIEW, REJECTED, OFF_BOARDED, FROZEN, PENDING_DOCUMENTS, CLOSED_BY_CLIENT, APPLICATION_IN_PROGRESS.
update.activityStatusNoACTIVE or NOT_ACTIVE.
update.sanctionsStatusNoCLEAR, FLAGGED, UNDER_REVIEW, NOT_CHECKED.
update.pepStatusNoCLEAR, FLAGGED, UNDER_REVIEW, NOT_CHECKED.
update.adverseMediaStatusNoCLEAR, FLAGGED, UNDER_REVIEW, NOT_CHECKED.
update.currentRiskNoRisk assessment object (score, level, reason, calculatedAt).
update.tagsToAddNoTags to add (additive — existing tags are preserved).
update.tagsToRemoveNoTags to remove.
update.customFieldsNoKey-value custom fields.

Bulk Update Response

{
  "updatedClients": [
    { "id": "client-uuid-001", "referenceId": "USER-001", "appliedChanges": { "accountStatus": "FROZEN" } },
    { "id": "client-uuid-002", "referenceId": "USER-002", "appliedChanges": { "accountStatus": "FROZEN" } }
  ],
  "failedClients": [],
  "totalProcessed": 3,
  "successCount": 2,
  "failureCount": 0
}
The response includes a per-client breakdown so you can identify any partial failures without re-querying each record individually.

What’s Next?

Once your clients are ingested, add their members, accounts, and transactional data.

Ingest Members

Add UBOs, directors, and signatories to corporate clients.

Accounts & Wallets

Ingest bank accounts and blockchain wallets.

Ingest Operations

Ingest deposits, withdrawals, and trades.