Skip to main content
Use this endpoint to create a new contact in your account. Contacts can represent either a payee (a vendor you manage) or a business (an independent Cleo business). To make a contact payment-ready at creation time, include bankAccount and taxInfo in the request body.

Base URL

Authentication

All requests must include a Bearer token in the Authorization header.

Request Body

displayName
string
required
The display name for the contact. This is the primary identifier shown in the Cleo Pay dashboard.
emails
string[]
List of email addresses for the contact. Maximum 5 addresses. Only applicable to payee-type contacts — this field is ignored for business-type contacts.
phone
string
Phone number for the contact, in any standard format. Optional.
address
object
Mailing address for the contact. Optional.
bankAccount
object
Bank account details for the contact. Providing this field makes the contact eligible to receive ACH payments. All fields within this object are write-only — they are never returned in API responses. Only last4 is returned after creation.
taxInfo
object
Tax identification information for the contact. Providing this field is required for 1099 reporting. The full tax ID is write-only — only the last four digits are returned as taxIdMask after creation.
allowDuplicates
boolean
default:"false"
When false (the default), Cleo Pay checks for an existing contact with a matching name or email and returns an error if a potential duplicate is found. Set this to true to bypass the duplicate-contact guard and force creation.
The bankAccount.accountNumber, bankAccount.routingNumber, and taxInfo.taxId fields are strictly write-only. They are accepted on creation but never returned in any API response. Use bankAccount.last4 and taxInfo.taxIdMask to confirm the values that were saved.

Response

Returns the created Contact object with HTTP status 201 Created.
id
string
Unique identifier for the newly created contact.
type
string
The contact type: payee or business.
status
string
Initial status of the contact. Newly created contacts have a status of active.
displayName
string | null
The display name provided in the request.
emails
string[]
Email addresses associated with the contact. Empty for business-type contacts.
phone
string | null
Phone number, if provided.
paymentDirection
string
Allowed payment direction: bidirectional, can_pay, can_be_paid, or none.
netTerms
number | null
Net payment terms in days, if configured.
bankAccount
object | null
Summary of the linked bank account.
taxInfo
object | null
Tax information summary.
paymentReady
boolean
Whether the contact can currently receive payments. This is true when a valid bank account is linked.
createdAt
datetime
ISO 8601 timestamp of contact creation.
updatedAt
datetime | null
ISO 8601 timestamp of the most recent update. null immediately after creation.
archivedAt
datetime | null
ISO 8601 timestamp of archival. null for newly created contacts.

Example Request

curl

Example Response

201
To add a contact without bank or tax details now and complete them later, omit bankAccount and taxInfo from the request. You can update the contact’s display name, emails, phone, address, and net terms via a subsequent PATCH /v1/contacts/{contactId} call.