Skip to navigation

Manage people with the API

Beta
Learn how to create, read, update, and search the people behind a business with the Payabli API
View as MarkdownOpen in Claude
Applies to:Developers

Intelligent boarding is in beta. To opt in, reach out to your Payabli contact.

A person is an individual associated with a business, such as an owner, director, signer, contact, or employee. Use the people API to create and manage those records as you board a paypoint. For how people fit into the wider model, see the boarding overview.

Considerations

  • The boarding API uses OAuth2. Send a Bearer token on every request. See OAuth2 authentication.
  • A person’s nationality decides which identity number applies. For US, send ssn. For any other nationality, send nationalIdNumber and nationalIdIssuer instead. Creating a person doesn’t check these, but an owner needs them to be validated.
  • A person’s job title and signer status (isSigner) belong to the person’s link with each business. Set them in businessRelationship when you create the person, or on the link later. The same person can have a different title at each business.
  • Reads mask sensitive fields such as ssn, nationalIdNumber, dateOfBirth, and identification document numbers. Use the unmasked endpoint when you need the raw values.

Create a person

Send a POST request to /v2/people with the person’s details. Only firstName and lastName are required. See the API reference for this endpoint for full documentation.

To link the person to a business as you create them, include a businessRelationship object with the businessReference and the person’s role in personType. For an owner, ownershipPercentage is required, from 0 to 100. Leave it out for every other role. Application validation holds every role except Employee to the owner requirements, so link anyone who doesn’t own part of the business, such as a contact, as an Employee. The relationship’s contact fields and addresses are separate from the person’s own top-level contact fields.

POST
/api/v2/people
curl -X POST https://api-sandbox.payabli.com/api/v2/people \
-H "Authorization: Bearer <token>" \
-H "Content-Type: application/json" \
-d '{
"firstName": "Marcus",
"lastName": "Delgado",
"middleName": "James",
"primaryEmail": "marcus.delgado@example.com",
"secondaryEmail": "m.delgado@example.net",
"primaryPhoneNumber": "3055551212",
"secondaryPhoneNumber": "3055559876",
"dateOfBirth": "1985-03-14",
"ssn": "412-55-9021",
"nationality": "US",
"driversLicenseNumber": "D1234567",
"driversLicenseState": "FL",
"externalId": "person-001",
"customData": {
"department": "finance"
},
"addresses": [
{
"addressLine1": "123 Main Street",
"addressLine2": "Suite 400",
"cityLocality": "Miami",
"stateProvince": "FL",
"postalCode": "33101",
"country": "US",
"type": "legal"
}
],
"identificationDocuments": [
{
"type": "passport",
"number": "X1234567",
"issuingCountry": "US",
"expirationDate": "2030-06-30"
}
],
"businessRelationship": {
"businessReference": "019fed1a-3d6e-75d3-a81e-cba3874b0a55",
"personType": "Owner",
"ownershipPercentage": 100,
"isPrimaryController": true,
"isSigner": true,
"title": "CEO",
"primaryEmail": "contact@example.com",
"secondaryEmail": "contact.alt@example.net",
"primaryPhoneNumber": "3055551212",
"secondaryPhoneNumber": "3055559876",
"billingAddress": {
"addressLine1": "123 Main Street",
"cityLocality": "Miami",
"stateProvince": "FL",
"postalCode": "33101",
"country": "US",
"type": "billing"
},
"mailingAddress": {
"addressLine1": "456 Oak Avenue",
"cityLocality": "Miami",
"stateProvince": "FL",
"postalCode": "33102",
"country": "US",
"type": "mailing"
}
}
}'

The response returns the new person with sensitive fields masked:

Response
{
"success": true,
"message": "Person created successfully",
"traceId": "0HNNQ4R2OT26Q:0000001D",
"data": {
"personReference": "01a0014d-ce1a-7110-9bac-c4c59647a88d",
"firstName": "Marcus",
"lastName": "Delgado",
"verificationStatus": "not_started",
"createdAt": "2026-08-14T17:24:31.3877241Z",
"lastUpdated": "2026-08-14T17:24:31.3877242Z",
"_links": {
"self": "/v2/people/01a0014d-ce1a-7110-9bac-c4c59647a88d",
"business": "/v2/businesses/019fed1a-3d6e-75d3-a81e-cba3874b0a55"
},
"externalId": "person-001",
"middleName": "James",
"primaryEmail": "marcus.delgado@example.com",
"secondaryEmail": "m.delgado@example.net",
"primaryPhoneNumber": "3055551212",
"secondaryPhoneNumber": "3055559876",
"dateOfBirth": "****-**-14",
"ssn": "***-**-9021",
"nationality": "US",
"driversLicenseNumber": "D1***567",
"driversLicenseState": "FL",
"customData": {
"department": "finance"
},
"businessRelationship": {
"businessReference": "019fed1a-3d6e-75d3-a81e-cba3874b0a55",
"personType": "owner",
"ownershipPercentage": 100,
"beneficialOwner": true,
"isPrimaryController": true,
"isSigner": true,
"title": "CEO",
"primaryEmail": "contact@example.com",
"secondaryEmail": "contact.alt@example.net",
"primaryPhoneNumber": "3055551212",
"secondaryPhoneNumber": "3055559876",
"billingAddressUuid": "01a0014d-ce1a-7110-9bac-c4c59647a891",
"mailingAddressUuid": "01a0014d-ce1a-7110-9bac-c4c59647a892"
}
}
}

The personReference in the response is the reference you use to read and manage the person.

If linking an owner would push the business’s total ownership over 100%, Payabli still creates the person but doesn’t complete the link. The request still returns 201, but success is false, the person has no businessRelationship, and the warnings array contains a LINK_OWNERSHIP_EXCEEDED entry:

Response
{
"success": false,
"message": "Person created, but the business link did not complete. See warnings for details.",
"traceId": "0HNONVRI1SQDV:0000001F",
"data": {
"personReference": "01a0d492-62c6-7151-9411-86ed90094a97",
"firstName": "Grace",
"lastName": "Delgado",
"verificationStatus": "not_started",
"createdAt": "2026-09-24T17:59:18.4704404Z",
"lastUpdated": "2026-09-24T17:59:18.4704404Z",
"_links": {
"self": "/v2/people/01a0d492-62c6-7151-9411-86ed90094a97"
},
"externalId": null,
"middleName": null,
"primaryEmail": null,
"primaryPhoneNumber": null,
"dateOfBirth": null,
"ssn": null,
"nationality": "US",
"driversLicenseNumber": null,
"driversLicenseState": null
},
"warnings": [
{
"code": "LINK_OWNERSHIP_EXCEEDED",
"message": "Combined ownership would exceed 100% (existing 100.00%, attempted 50%)."
}
]
}

Check warnings on every create response, not only the status code. To finish linking the person, first lower an existing owner’s ownershipPercentage so the total leaves room, then link the person to the business. While the total is already at 100%, the link request fails with 400.

Get a person

Send a GET request to /v2/people/{personReference}. Sensitive fields such as ssn are masked. See the API reference for this endpoint for full documentation.

GET
/api/v2/people/:personReference
curl https://api-sandbox.payabli.com/api/v2/people/01a0014d-ce1a-7110-9bac-c4c59647a88d \
-H "Authorization: Bearer <token>"

The response returns the person’s detail with sensitive fields masked:

Response
{
"success": true,
"message": "Person retrieved successfully",
"traceId": "0HNNQ4R2OT25J:00000069",
"data": {
"personReference": "01a0014d-ce1a-7110-9bac-c4c59647a88d",
"firstName": "Marcus",
"lastName": "Delgado",
"verificationStatus": "not_started",
"createdAt": "2026-08-14T17:24:31.387724",
"lastUpdated": "2026-08-14T17:24:31.387724",
"_links": {
"self": "/v2/people/01a0014d-ce1a-7110-9bac-c4c59647a88d"
},
"externalId": "person-001",
"middleName": "James",
"primaryEmail": "marcus.delgado@example.com",
"secondaryEmail": "m.delgado@example.net",
"primaryPhoneNumber": "3055551212",
"secondaryPhoneNumber": "3055559876",
"dateOfBirth": "****-**-14",
"ssn": "***-**-9021",
"nationality": "US",
"driversLicenseNumber": "D1***567",
"driversLicenseState": "FL",
"customData": {
"department": "finance"
},
"addresses": [
{
"addressLine1": "123 Main Street",
"addressLine2": "Suite 400",
"cityLocality": "Miami",
"stateProvince": "FL",
"postalCode": "33101",
"country": "US",
"type": "legal"
}
],
"identificationDocuments": [
{
"type": "passport",
"number": "****4567",
"issuingCountry": "US",
"expirationDate": "2030-06-30"
}
]
}
}

Get unmasked person detail

To read the raw values of masked fields, send a GET request to /v2/people/{personReference}/unmasked. See the API reference for this endpoint for full documentation.

GET
/api/v2/people/:personReference/unmasked
curl https://api-sandbox.payabli.com/api/v2/people/01a0014d-ce1a-7110-9bac-c4c59647a88d/unmasked \
-H "Authorization: Bearer <token>"

The response returns the same detail with sensitive fields unmasked:

Response
{
"success": true,
"message": "Person retrieved successfully",
"traceId": "0HNNQ4R2OT26Q:0000001E",
"data": {
"personReference": "01a0014d-ce1a-7110-9bac-c4c59647a88d",
"firstName": "Marcus",
"lastName": "Delgado",
"verificationStatus": "not_started",
"createdAt": "2026-08-14T17:24:31.387724",
"lastUpdated": "2026-08-14T17:24:31.387724",
"_links": {
"self": "/v2/people/01a0014d-ce1a-7110-9bac-c4c59647a88d"
},
"externalId": "person-001",
"middleName": "James",
"primaryEmail": "marcus.delgado@example.com",
"secondaryEmail": "m.delgado@example.net",
"primaryPhoneNumber": "3055551212",
"secondaryPhoneNumber": "3055559876",
"dateOfBirth": "1985-03-14",
"ssn": "412-55-9021",
"nationality": "US",
"driversLicenseNumber": "D1234567",
"driversLicenseState": "FL",
"customData": {
"department": "finance"
},
"addresses": [
{
"addressLine1": "123 Main Street",
"addressLine2": "Suite 400",
"cityLocality": "Miami",
"stateProvince": "FL",
"postalCode": "33101",
"country": "US",
"type": "legal"
}
],
"identificationDocuments": [
{
"type": "passport",
"number": "X1234567",
"issuingCountry": "US",
"expirationDate": "2030-06-30"
}
]
}
}

List people

Send a GET request to /v2/people. Filter and page the results with the query parameters: name, email, verificationStatus, limit, page, sortBy, and sortOrder. See the API reference for this endpoint for full documentation.

GET
/api/v2/people
curl -G https://api-sandbox.payabli.com/api/v2/people \
-H "Authorization: Bearer <token>" \
-d limit=1 \
-d page=1

The response returns a page of people with pagination metadata:

Response
{
"success": true,
"message": "People retrieved successfully",
"traceId": "0HNNQ4R2OT25J:0000005A",
"data": {
"data": [
{
"_links": {
"self": "/v2/people/01a0014d-ce1a-7110-9bac-c4c59647a88d"
},
"personReference": "01a0014d-ce1a-7110-9bac-c4c59647a88d",
"firstName": "Marcus",
"lastName": "Delgado",
"verificationStatus": "notstarted",
"createdAt": "2026-08-14T17:24:31.387724",
"lastUpdated": "2026-08-14T17:24:31.387724",
"email": "marcus.delgado@example.com"
}
],
"pagination": {
"page": 1,
"totalPages": 1587,
"totalRecords": 1587,
"pageSize": 1,
"hasNext": true,
"hasPrevious": false
}
}
}

Update a person

Send a PATCH request to /v2/people/{personReference} with only the fields you want to change. See the API reference for this endpoint for full documentation.

You can’t change ssn, nationalIdNumber, or dateOfBirth after you create a person, so set them correctly when you create the person.

PATCH
/api/v2/people/:personReference
curl -X PATCH https://api-sandbox.payabli.com/api/v2/people/01a0014d-ce1a-7110-9bac-c4c59647a88d \
-H "Authorization: Bearer <token>" \
-H "Content-Type: application/json" \
-d '{
"primaryPhoneNumber": "3055550199"
}'

The response confirms the update and returns the new timestamp:

Response
{
"success": true,
"message": "Person updated successfully",
"traceId": "0HNNQ4R2OT26Q:00000027",
"data": {
"personReference": "01a0014d-ce1a-7110-9bac-c4c59647a88d",
"lastUpdated": "2026-08-14T17:27:06.4473841Z",
"_links": {
"self": "/v2/people/01a0014d-ce1a-7110-9bac-c4c59647a88d"
}
}
}

Search people

Send a POST request to /v2/people/search with at least one of firstName or lastName. Pass your organization’s entry name in the entry query parameter and its ID in orgId. Both are required. The entry name is OrgEntryName in the organization details. If you pass a paypoint’s entry name instead, the search covers only that paypoint’s business. See the API reference for this endpoint for full documentation.

Use search during boarding to check whether a person already exists in your organization, linked to another business, before you create them. It matches on identity details such as name, date of birth, email, and SSN. An external identity vendor can also enrich the results. To read the people already on the business, list the business’s people instead.

POST
/api/v2/people/search
curl -X POST "https://api-sandbox.payabli.com/api/v2/people/search?entry=8cfec329267&orgId=123" \
-H "Authorization: Bearer <token>" \
-H "Content-Type: application/json" \
-d '{
"firstName": "Marcus",
"lastName": "Delgado"
}'

The response returns each match with a matchScore, plus the total count. A result with isFromVendor set to true came only from the identity vendor and has no personReference:

Response
{
"success": true,
"message": "People search completed",
"traceId": "0HNONVR8FH4GO:00000030",
"data": {
"results": [
{
"personReference": "01a0014d-ce1a-7110-9bac-c4c59647a88d",
"firstName": "Marcus",
"lastName": "Delgado",
"dateOfBirth": "****-**-14",
"primaryEmail": "marcus.delgado@example.com",
"primaryPhone": "+13055551212",
"riskDecision": null,
"matchScore": 0.6,
"isTopMatch": true,
"isFromVendor": false,
"phones": [
"+13055551212"
],
"emails": [
"marcus.delgado@example.com"
],
"addressCount": 0,
"phoneCount": 1,
"emailCount": 1
}
],
"total": 1,
"isEnrichedByVendor": false
}
}

Search results mask each person’s dateOfBirth. To get the full value, send the same request to /v2/people/search/unmasked. See the API reference for this endpoint for full documentation.

A person can be linked to more than one business. To link someone you’ve already created, or to change or remove a link, use the people endpoints under the business. See Manage the people on a business.

See these related resources to help you get the most out of Payabli.