Create Beneficiaries

Beneficiaries are entities (individuals or businesses) registered on the Caliza platform to send or receive funds. When you create a beneficiary, the system automatically initiates the KYX (Know Your Customer/Business) verification process.

Prerequisites

Before you begin, ensure that you have:

Understanding beneficiary types

The Caliza API supports two types of beneficiaries:

  • INDIVIDUAL: A person with personal KYC requirements (name, DOB, citizenship)
  • BUSINESS: A company with corporate KYB requirements (incorporation info, tax ID, authorized contacts)

The type field determines which data structure you must provide in the request. This separation ensures proper regulatory compliance, risk management, and different data structures for personal vs. commercial transactions.

If you're creating a beneficiary for your own business and your account has already completed KYB onboarding, the system automatically approves the beneficiary.

Create an individual beneficiary

To create an individual beneficiary, you need to send a POST request to the /beneficiaries endpoint setting the typeparameter as INDIVIDUAL, along with all the details of the Beneficiary.

Required fields

The following fields are required when creating an individual beneficiary:

FieldTypeDescription
integratorBeneficiaryIdstringYour unique identifier for this beneficiary
typestringMust be "INDIVIDUAL"
personobjectPerson information object (see fields below)
person.firstNamestringFirst name (max 100 characters)
person.lastNamestringLast name (max 100 characters)
person.dateOfBirthstringDate of birth (format: YYYY-MM-DD)
person.citizenshipstringCountry code
person.idNumberstringGovernment-issued identification number
person.emailstringEmail address
person.phoneNumberstringPhone number (format: +[country code][number], 6-20 digits)
person.addressobjectAddress object (see fields below)
person.address.streetOnestringPrimary street address (max 100 characters)
person.address.citystringCity name
person.address.zipcodestringPostal or ZIP code
person.address.statestringState or province (max 3 characters)
person.address.countrystringCountry code (2-character ISO code)

Optional fields

The following fields are optional when creating an individual beneficiary:

FieldTypeDescription
person.address.streetTwostringSecondary address line (max 100 characters)
person.placeOfBirthstringPlace of birth
person.professionstringProfession
person.genderstringGender (MALE, FEMALE, or OTHER)
person.maritalStatusstringMarital status
person.mothersNamestringMother's name
person.industrystringIndustry (see enum values in API spec)
person.incomeSourcestringSource of income (see enum values in API spec)
person.annualIncomenumberAnnual income
person.occupationstringOccupation (see enum values in API spec)
person.wealthSourcestringSource of wealth (see enum values in API spec)
localTargetBankAccountobjectBank account details for receiving payouts
activebooleanWhether the beneficiary is active (defaults to true if not specified)
integratorIdstringYour integrator ID (optional if authenticated)

Example request

curl --location --request POST 'https://api.sandbox.caliza.com/core-api/v1/beneficiaries' \
--header 'Content-Type: application/json' \
--header 'Authorization: Bearer {{ACCESS_TOKEN}}' \
--data-raw '{
  "integratorBeneficiaryId": "{{INTEGRATOR_BENEFICIARY_ID}}",
  "type": "INDIVIDUAL",
  "person": {
    "firstName": "{{FIRST_NAME}}",
    "lastName": "{{LAST_NAME}}",
    "dateOfBirth": "{{DATE_OF_BIRTH}}",
    "citizenship": "{{CITIZENSHIP}}",
    "idNumber": "{{ID_NUMBER}}",
    "email": "{{EMAIL}}",
    "phoneNumber": "{{PHONE_NUMBER}}",
    "address": {
      "streetOne": "{{STREET_ONE}}",
      "streetTwo": "{{STREET_TWO}}",
      "city": "{{CITY}}",
      "zipcode": "{{ZIPCODE}}",
      "state": "{{STATE}}",
      "country": "{{COUNTRY}}"
    },
    "profession": "{{PROFESSION}}",
    "gender": "{{GENDER}}"
  },
  "active": true
}'
const axios = require('axios');

const response = await axios.post(
  'https://api.sandbox.caliza.com/core-api/v1/beneficiaries',
  {
    integratorBeneficiaryId: '{{INTEGRATOR_BENEFICIARY_ID}}',
    type: 'INDIVIDUAL',
    person: {
      firstName: '{{FIRST_NAME}}',
      lastName: '{{LAST_NAME}}',
      dateOfBirth: '{{DATE_OF_BIRTH}}',
      citizenship: '{{CITIZENSHIP}}',
      idNumber: '{{ID_NUMBER}}',
      email: '{{EMAIL}}',
      phoneNumber: '{{PHONE_NUMBER}}',
      address: {
        streetOne: '{{STREET_ONE}}',
        streetTwo: '{{STREET_TWO}}',
        city: '{{CITY}}',
        zipcode: '{{ZIPCODE}}',
        state: '{{STATE}}',
        country: '{{COUNTRY}}'
      },
      profession: '{{PROFESSION}}',
      gender: '{{GENDER}}'
    },
    active: true
  },
  {
    headers: {
      'Content-Type': 'application/json',
      'Authorization': `Bearer ${accessToken}`
    }
  }
);

console.log('Beneficiary ID:', response.data.id);
import requests

response = requests.post(
  'https://api.sandbox.caliza.com/core-api/v1/beneficiaries',
  headers={
    'Content-Type': 'application/json',
    'Authorization': f'Bearer {access_token}'
  },
  json={
    'integratorBeneficiaryId': '{{INTEGRATOR_BENEFICIARY_ID}}',
    'type': 'INDIVIDUAL',
    'person': {
      'firstName': '{{FIRST_NAME}}',
      'lastName': '{{LAST_NAME}}',
      'dateOfBirth': '{{DATE_OF_BIRTH}}',
      'citizenship': '{{CITIZENSHIP}}',
      'idNumber': '{{ID_NUMBER}}',
      'email': '{{EMAIL}}',
      'phoneNumber': '{{PHONE_NUMBER}}',
      'address': {
        'streetOne': '{{STREET_ONE}}',
        'streetTwo': '{{STREET_TWO}}',
        'city': '{{CITY}}',
        'zipcode': '{{ZIPCODE}}',
        'state': '{{STATE}}',
        'country': '{{COUNTRY}}'
      },
      'profession': '{{PROFESSION}}',
      'gender': '{{GENDER}}'
    },
    'active': True
  }
)

beneficiary_data = response.json()
print('Beneficiary ID:', beneficiary_data['id'])

Example response

{
  "id": "6925dd986a93002882da640b",
  "integratorId": "6920925fdbadfe09b1bf9e5e",
  "integratorBeneficiaryId": "individual_jane_doe_001",
  "type": "INDIVIDUAL",
  "person": {
    "firstName": "Jane",
    "lastName": "Doe",
    "dateOfBirth": "1985-11-20",
    "placeOfBirth": null,
    "citizenship": "US",
    "idNumber": "D1234567",
    "email": "[email protected]",
    "phoneNumber": "+12025550148",
    "profession": "Software Engineer",
    "gender": "FEMALE",
    "maritalStatus": null,
    "mothersName": null,
    "address": {
      "streetOne": "1600 Pennsylvania Avenue NW",
      "streetTwo": "Suite 200",
      "geolocation": null,
      "city": "Washington",
      "zipcode": "20500",
      "state": "DC",
      "country": "US"
    },
    "industry": null,
    "incomeSource": null,
    "annualIncome": null,
    "occupation": null,
    "wealthSource": null
  },
  "business": null,
  "localTargetBankAccount": null,
  "files": [],
  "active": true,
  "kycVerified": false,
  "status": "PENDING",
  "termsAndConditions": null,
  "hasValidPixKey": null,
  "createdDate": "2025-01-15T16:47:20.568615486Z",
  "riskScore": null,
  "beneficiaryLifeCycle": null
}

Create a business beneficiary

To create a business beneficiary, send a POST request to /v1/beneficiaries with type set to BUSINESS and include the required business information.

Required fields

The following fields are required when creating a business beneficiary:

FieldTypeDescription
integratorBeneficiaryIdstringYour unique identifier for this beneficiary
typestringMust be "BUSINESS"
businessobjectBusiness information object (see fields below)
business.namestringBusiness name (max 60 characters)
business.dateOfIncorporationstringDate of incorporation (format: YYYY-MM-DD)
business.idNumberstringBusiness tax ID or registration number
business.phoneNumberstringBusiness phone number (format: +[country code][number], 6-20 digits)
business.emailstringBusiness email address
business.addressobjectBusiness address object (see fields below)
business.address.streetOnestringPrimary street address (max 100 characters)
business.address.citystringCity name
business.address.zipcodestringPostal or ZIP code
business.address.statestringState or province (max 3 characters)
business.address.countrystringCountry code (2-character ISO code)
business.contactsarrayArray of at least one contact person (each contact requires the same fields as an individual beneficiary's person object)

Optional fields

The following fields are optional when creating a business beneficiary:

FieldTypeDescription
business.address.streetTwostringSecondary address line (max 100 characters)
business.websitestringBusiness website URL (max 100 characters)
business.descriptionstringBusiness description
business.legalStructurestringLegal structure: MEI, ME, EI, SLU, LTDA, SS, SA, SOLE_PROP, SINGLE_MEMBER_LLC, LLC, GP, LP, LLP, S_CORP, C_CORP, PC, NONPROFIT, B_CORP
localTargetBankAccountobjectBank account details for receiving payouts
localCalizaOwnedBankAccountIdstringID of a Caliza-owned bank account
activebooleanWhether the beneficiary is active (defaults to true if not specified)
integratorIdstringYour integrator ID (optional if authenticated)

Example request

curl --location --request POST 'https://api.sandbox.caliza.com/core-api/v1/beneficiaries' \
--header 'Content-Type: application/json' \
--header 'Authorization: Bearer {{ACCESS_TOKEN}}' \
--data-raw '{
 "integratorBeneficiaryId": "{{INTEGRATOR_BENEFICIARY_ID}}",
 "type": "BUSINESS",
 "business": {
   "name": "{{BUSINESS_NAME}}",
   "dateOfIncorporation": "{{DATE_OF_INCORPORATION}}",
   "idNumber": "{{BUSINESS_ID_NUMBER}}",
   "phoneNumber": "{{BUSINESS_PHONE_NUMBER}}",
   "email": "{{BUSINESS_EMAIL}}",
   "website": "{{BUSINESS_WEBSITE}}",
   "legalStructure": "{{LEGAL_STRUCTURE}}",
   "address": {
     "streetOne": "{{BUSINESS_STREET_ONE}}",
     "streetTwo": "{{BUSINESS_STREET_TWO}}",
     "city": "{{BUSINESS_CITY}}",
     "zipcode": "{{BUSINESS_ZIPCODE}}",
     "state": "{{BUSINESS_STATE}}",
     "country": "{{BUSINESS_COUNTRY}}"
   },
   "contacts": [
     {
       "firstName": "{{CONTACT_FIRST_NAME}}",
       "lastName": "{{CONTACT_LAST_NAME}}",
       "dateOfBirth": "{{CONTACT_DATE_OF_BIRTH}}",
       "citizenship": "{{CONTACT_CITIZENSHIP}}",
       "idNumber": "{{CONTACT_ID_NUMBER}}",
       "email": "{{CONTACT_EMAIL}}",
       "phoneNumber": "{{CONTACT_PHONE_NUMBER}}",
       "address": {
         "streetOne": "{{CONTACT_STREET_ONE}}",
         "streetTwo": "{{CONTACT_STREET_TWO}}",
         "city": "{{CONTACT_CITY}}",
         "zipcode": "{{CONTACT_ZIPCODE}}",
         "state": "{{CONTACT_STATE}}",
         "country": "{{CONTACT_COUNTRY}}"
       }
     }
   ]
 },
 "active": true
}'
const axios = require('axios');

const response = await axios.post(
  'https://api.sandbox.caliza.com/core-api/v1/beneficiaries',
  {
    integratorBeneficiaryId: '{{INTEGRATOR_BENEFICIARY_ID}}',
    type: 'BUSINESS',
    business: {
      name: '{{BUSINESS_NAME}}',
      dateOfIncorporation: '{{DATE_OF_INCORPORATION}}',
      idNumber: '{{BUSINESS_ID_NUMBER}}',
      phoneNumber: '{{BUSINESS_PHONE_NUMBER}}',
      email: '{{BUSINESS_EMAIL}}',
      website: '{{BUSINESS_WEBSITE}}',
      legalStructure: '{{LEGAL_STRUCTURE}}',
      address: {
        streetOne: '{{BUSINESS_STREET_ONE}}',
        streetTwo: '{{BUSINESS_STREET_TWO}}',
        city: '{{BUSINESS_CITY}}',
        zipcode: '{{BUSINESS_ZIPCODE}}',
        state: '{{BUSINESS_STATE}}',
        country: '{{BUSINESS_COUNTRY}}'
      },
      contacts: [
        {
          firstName: '{{CONTACT_FIRST_NAME}}',
          lastName: '{{CONTACT_LAST_NAME}}',
          dateOfBirth: '{{CONTACT_DATE_OF_BIRTH}}',
          citizenship: '{{CONTACT_CITIZENSHIP}}',
          idNumber: '{{CONTACT_ID_NUMBER}}',
          email: '{{CONTACT_EMAIL}}',
          phoneNumber: '{{CONTACT_PHONE_NUMBER}}',
          address: {
            streetOne: '{{CONTACT_STREET_ONE}}',
            streetTwo: '{{CONTACT_STREET_TWO}}',
            city: '{{CONTACT_CITY}}',
            zipcode: '{{CONTACT_ZIPCODE}}',
            state: '{{CONTACT_STATE}}',
            country: '{{CONTACT_COUNTRY}}'
          }
        }
      ]
    },
    active: true
  },
  {
    headers: {
      'Content-Type': 'application/json',
      'Authorization': `Bearer ${accessToken}`
    }
  }
);

console.log('Beneficiary ID:', response.data.id);
import requests

response = requests.post(
  'https://api.sandbox.caliza.com/core-api/v1/beneficiaries',
  headers={
    'Content-Type': 'application/json',
    'Authorization': f'Bearer {access_token}'
  },
  json={
    'integratorBeneficiaryId': '{{INTEGRATOR_BENEFICIARY_ID}}',
    'type': 'BUSINESS',
    'business': {
      'name': '{{BUSINESS_NAME}}',
      'dateOfIncorporation': '{{DATE_OF_INCORPORATION}}',
      'idNumber': '{{BUSINESS_ID_NUMBER}}',
      'phoneNumber': '{{BUSINESS_PHONE_NUMBER}}',
      'email': '{{BUSINESS_EMAIL}}',
      'website': '{{BUSINESS_WEBSITE}}',
      'legalStructure': '{{LEGAL_STRUCTURE}}',
      'address': {
        'streetOne': '{{BUSINESS_STREET_ONE}}',
        'streetTwo': '{{BUSINESS_STREET_TWO}}',
        'city': '{{BUSINESS_CITY}}',
        'zipcode': '{{BUSINESS_ZIPCODE}}',
        'state': '{{BUSINESS_STATE}}',
        'country': '{{BUSINESS_COUNTRY}}'
      },
      'contacts': [
        {
          'firstName': '{{CONTACT_FIRST_NAME}}',
          'lastName': '{{CONTACT_LAST_NAME}}',
          'dateOfBirth': '{{CONTACT_DATE_OF_BIRTH}}',
          'citizenship': '{{CONTACT_CITIZENSHIP}}',
          'idNumber': '{{CONTACT_ID_NUMBER}}',
          'email': '{{CONTACT_EMAIL}}',
          'phoneNumber': '{{CONTACT_PHONE_NUMBER}}',
          'address': {
            'streetOne': '{{CONTACT_STREET_ONE}}',
            'streetTwo': '{{CONTACT_STREET_TWO}}',
            'city': '{{CONTACT_CITY}}',
            'zipcode': '{{CONTACT_ZIPCODE}}',
            'state': '{{CONTACT_STATE}}',
            'country': '{{CONTACT_COUNTRY}}'
          }
        }
      ]
    },
    'active': True
  }
)

beneficiary_data = response.json()
print('Beneficiary ID:', beneficiary_data['id'])

Example response

{
  "id": "{{BENEFICIARY_ID}}",
  "integratorId": "{{INTEGRATOR_ID}}",
  "integratorBeneficiaryId": "{{INTEGRATOR_BENEFICIARY_ID}}",
  "type": "BUSINESS",
  "person": null,
  "business": {
    "name": "{{BUSINESS_NAME}}",
    "dateOfIncorporation": "{{DATE_OF_INCORPORATION}}",
    "idNumber": "{{BUSINESS_ID_NUMBER}}",
    "address": {
      "streetOne": "{{BUSINESS_STREET_ONE}}",
      "streetTwo": "{{BUSINESS_STREET_TWO}}",
      "geolocation": null,
      "city": "{{BUSINESS_CITY}}",
      "zipcode": "{{BUSINESS_ZIPCODE}}",
      "state": "{{BUSINESS_STATE}}",
      "country": "{{BUSINESS_COUNTRY}}"
    },
    "telephone": null,
    "email": "{{BUSINESS_EMAIL}}",
    "contacts": [
      {
        "firstName": "{{CONTACT_FIRST_NAME}}",
        "lastName": "{{CONTACT_LAST_NAME}}",
        "dateOfBirth": "{{CONTACT_DATE_OF_BIRTH}}",
        "placeOfBirth": null,
        "citizenship": "{{CONTACT_CITIZENSHIP}}",
        "idNumber": "{{CONTACT_ID_NUMBER}}",
        "email": "{{CONTACT_EMAIL}}",
        "phoneNumber": "{{CONTACT_PHONE_NUMBER}}",
        "profession": null,
        "gender": null,
        "maritalStatus": null,
        "mothersName": null,
        "address": {
          "streetOne": "{{CONTACT_STREET_ONE}}",
          "streetTwo": "{{CONTACT_STREET_TWO}}",
          "geolocation": null,
          "city": "{{CONTACT_CITY}}",
          "zipcode": "{{CONTACT_ZIPCODE}}",
          "state": "{{CONTACT_STATE}}",
          "country": "{{CONTACT_COUNTRY}}"
        },
        "industry": null,
        "incomeSource": null,
        "annualIncome": null,
        "occupation": null,
        "wealthSource": null
      }
    ]
  },
  "localTargetBankAccount": null,
  "files": [],
  "active": true,
  "kycVerified": false,
  "status": "PENDING",
  "termsAndConditions": null,
  "hasValidPixKey": null,
  "createdDate": "{{CREATED_DATE}}",
  "riskScore": null,
  "beneficiaryLifeCycle": null
}

Understanding the response

The API returns a BeneficiaryResponse object with the following key fields:

  • id: Unique identifier assigned by Caliza
  • status: Current status of the beneficiary. Possible values:
    • CREATED: Beneficiary record created
    • PENDING: Awaiting KYX verification
    • MANUAL_REVIEW: Requires manual review
    • KYC_IN_PROGRESS: KYX verification in progress
    • DISABLED: Beneficiary is disabled
    • FAILED: KYX verification failed
  • kycVerified: Boolean indicating whether KYX verification is complete
  • active: Whether the beneficiary account is active
  • createdDate: Timestamp when the beneficiary was created

KYX verification process

When you create a beneficiary, the system automatically initiates the KYX (Know Your Customer/Business) verification process. This process verifies the beneficiary's identity and compliance status.

The KYX process begins automatically after a beneficiary is created. The system:

  1. Triggers verification: Creating a beneficiary automatically starts KYX
  2. Determines requirements: Required documents depend on the beneficiary's risk profile and jurisdiction
  3. Notifies integrators: The system typically sends webhook notifications about KYX status changes
  4. May direct users: End users may be directed to a third-party verification provider (such as AiPrise) to upload documents or complete verification steps

For individuals, the system typically requests:

  • Government-issued identification

For businesses, the system typically requests:

  • Proof of address
  • Business registration documents
  • Beneficial ownership information

You can monitor KYX status by:

  • Checking the status and kycVerified fields in the beneficiary response
  • Subscribing to webhook notifications
  • Using the GET /v1/beneficiaries/{beneficiaryId} endpoint to check current status
  • Using KYX-specific endpoints:
    • GET /v1/kyx/{id}/kyx/documents - Retrieve submitted KYX documents
    • GET /v1/kyx/{id}/kyx/re-run - Retry identity verification
    • POST /v1/kyx/check-requirements - Check required documents before starting KYX

Important: Beneficiaries must complete KYX verification before they can execute certain transactions. Monitor the status and handle rejections or resubmissions as needed.

Check beneficiary status

After creating a beneficiary, you can check its status using the GET /v1/beneficiaries/{beneficiaryId} endpoint:

curl --location --request GET 'https://api.sandbox.caliza.com/core-api/v1/beneficiaries/{{BENEFICIARY_ID}}' \
--header 'Content-Type: application/json' \
--header 'Authorization: Bearer {{ACCESS_TOKEN}}'

The response includes the current status and kycVerified fields, which indicate the beneficiary's verification state.

Next steps