Customers
List, retrieve, create, update and delete customers
A person the venue knows, with their tags, lists and marketing consent.
The customer object
A test key sees and writes only test rows of this object. See Test data.
idstringrequiredA customer id, cus_ and 22 characters.
object"customer"requiredfirst_namestringrequiredlast_namestringrequirednullablenicknamestringrequirednullableemailstringrequirednullablephonestringrequirednullableE.164, e.g. +61400000000.
date_of_birthstringrequirednullableyyyy-MM-dd.
companystringrequirednullableaddressobjectrequiredaddress.line1stringrequirednullableaddress.line2stringrequirednullableaddress.suburbstringrequirednullableaddress.statestringrequirednullableaddress.postcodestringrequirednullableaddress.countrystringrequirednullableadultbooleanrequirednullablemarketing_consentbooleanrequiredWhether they agreed to marketing email and SMS.
membershipobjectrequiredmembership.memberbooleanrequiredmembership.tierstringrequirednullabletagsarray of objectsrequiredtags[].idstringrequiredA tag id, tag_ and 22 characters.
tags[].namestringrequiredtags[].added_atstringrequirednullableA UTC instant, ISO 8601, e.g. 2026-10-08T03:00:00.000Z.
listsarray of objectsrequiredlists[].idstringrequiredA list id, lst_ and 22 characters.
lists[].namestringrequiredlists[].statusstringrequirednullableactive, or unsubscribed.
lists[].added_atstringrequirednullableA UTC instant, ISO 8601, e.g. 2026-10-08T03:00:00.000Z.
lists[].unsubscribed_atstringrequirednullableA UTC instant, ISO 8601, e.g. 2026-10-08T03:00:00.000Z.
livemodebooleanrequiredFalse for test data, true for real data.
created_atstringrequiredA UTC instant, ISO 8601, e.g. 2026-10-08T03:00:00.000Z.
updated_atstringrequiredA UTC instant, ISO 8601, e.g. 2026-10-08T03:00:00.000Z.
versionstringrequiredSend it quoted as If-Match to change this customer.
{
"id": "cus_0TMXp8QPR6yGvKuV2GZQ10",
"object": "customer",
"first_name": "<string>",
"last_name": "<string>",
"nickname": "<string>",
"email": "alex@example.com",
"phone": "+61400000000",
"date_of_birth": "2026-10-08",
"company": "<string>",
"address": {
"line1": "<string>",
"line2": "<string>",
"suburb": "<string>",
"state": "<string>",
"postcode": "<string>",
"country": "<string>"
},
"adult": true,
"marketing_consent": true,
"membership": {
"member": true,
"tier": "<string>"
},
"tags": [
{
"id": "tag_0TMXp8QPR6yGvKuV2GZQ10",
"name": "<string>",
"added_at": "2026-10-08T03:00:00.000Z"
}
],
"lists": [
{
"id": "lst_0TMXp8QPR6yGvKuV2GZQ10",
"name": "<string>",
"status": "<string>",
"added_at": "2026-10-08T03:00:00.000Z",
"unsubscribed_at": "2026-10-08T03:00:00.000Z"
}
],
"livemode": true,
"created_at": "2026-10-08T03:00:00.000Z",
"updated_at": "2026-10-08T03:00:00.000Z",
"version": "1791428400000000"
}List customers
Every customer the key can see, newest first, a page at a time.
Query parameters
limitintegerHow many to return, 1 to 100. Defaults to 25.
starting_afterstringThe next_cursor of the page before. Omit it for the first page.
updated_sincestringOnly rows changed at or after this instant, ISO 8601 with an offset.
emailstringExact email address, any case.
curl "https://api.hatcel.com/customers?limit=25" \
-H "Authorization: Bearer $HATCEL_API_KEY" \
-H "Hatcel-Version: 2026-10-08"{
"object": "list",
"data": [
{
"id": "cus_0TMXp8QPR6yGvKuV2GZQ10",
"object": "customer",
"first_name": "<string>",
"last_name": "<string>",
"nickname": "<string>",
"email": "alex@example.com",
"phone": "+61400000000",
"date_of_birth": "2026-10-08",
"company": "<string>",
"address": {
"line1": "<string>",
"line2": "<string>",
"suburb": "<string>",
"state": "<string>",
"postcode": "<string>",
"country": "<string>"
},
"adult": true,
"marketing_consent": true,
"membership": {
"member": true,
"tier": "<string>"
},
"tags": [
{
"id": "tag_0TMXp8QPR6yGvKuV2GZQ10",
"name": "<string>",
"added_at": "2026-10-08T03:00:00.000Z"
}
],
"lists": [
{
"id": "lst_0TMXp8QPR6yGvKuV2GZQ10",
"name": "<string>",
"status": "<string>",
"added_at": "2026-10-08T03:00:00.000Z",
"unsubscribed_at": "2026-10-08T03:00:00.000Z"
}
],
"livemode": true,
"created_at": "2026-10-08T03:00:00.000Z",
"updated_at": "2026-10-08T03:00:00.000Z",
"version": "1791428400000000"
}
],
"has_more": true,
"next_cursor": "eyJ0IjoiMjAyNi0xMC0wOFQwMzowMDowMC4wMDBaIiwiaSI6IjBmOGZhZDViIn0"
}Retrieve a customer
One customer by its id, with its version in the ETag header. Another object's id, or one this key cannot see, is a 404.
Path parameters
idstringrequiredThe customer's id, cus_ and 22 characters.
curl "https://api.hatcel.com/customers/cus_0TMXp8QPR6yGvKuV2GZQ10" \
-H "Authorization: Bearer $HATCEL_API_KEY" \
-H "Hatcel-Version: 2026-10-08"{
"id": "cus_0TMXp8QPR6yGvKuV2GZQ10",
"object": "customer",
"first_name": "<string>",
"last_name": "<string>",
"nickname": "<string>",
"email": "alex@example.com",
"phone": "+61400000000",
"date_of_birth": "2026-10-08",
"company": "<string>",
"address": {
"line1": "<string>",
"line2": "<string>",
"suburb": "<string>",
"state": "<string>",
"postcode": "<string>",
"country": "<string>"
},
"adult": true,
"marketing_consent": true,
"membership": {
"member": true,
"tier": "<string>"
},
"tags": [
{
"id": "tag_0TMXp8QPR6yGvKuV2GZQ10",
"name": "<string>",
"added_at": "2026-10-08T03:00:00.000Z"
}
],
"lists": [
{
"id": "lst_0TMXp8QPR6yGvKuV2GZQ10",
"name": "<string>",
"status": "<string>",
"added_at": "2026-10-08T03:00:00.000Z",
"unsubscribed_at": "2026-10-08T03:00:00.000Z"
}
],
"livemode": true,
"created_at": "2026-10-08T03:00:00.000Z",
"updated_at": "2026-10-08T03:00:00.000Z",
"version": "1791428400000000"
}Create a customer
Makes a customer and answers it, with a 201. An email another customer already has is a 409: look it up first with GET /customers?email=.
Headers
Idempotency-KeystringrequiredA unique string, up to 255 characters, reused only to retry this request. See Idempotency.
Body
first_namestringrequiredRequired on create. Cannot be emptied.
last_namestringnullablenicknamestringnullablecompanystringnullableemailstringnullableStored lowercase. One customer per email. Once set, it cannot be changed or cleared here.
phonestringnullableAny readable number. Stored as E.164. Once set, it cannot be changed or cleared here.
date_of_birthstringnullableyyyy-MM-dd.
gender"male" | "female" | "other"nullableadultbooleanThe age group, used only while there is no date of birth. Send it with date_of_birth.
marketing_consentfalseOnly false is accepted: true is a 403. Customers give consent themselves, on the booking page or in their portal.
how_heard_about_usstringnullableaddressobjectaddress.line1stringnullableaddress.line2stringnullableaddress.suburbstringnullableaddress.statestringnullableaddress.postcodestringnullableaddress.countrystringnullablecurl -X POST "https://api.hatcel.com/customers" \
-H "Authorization: Bearer $HATCEL_API_KEY" \
-H "Hatcel-Version: 2026-10-08" \
-H "Idempotency-Key: $(uuidgen)" \
-H "Content-Type: application/json" \
-d '{
"first_name": "Alex",
"last_name": "Taylor",
"email": "alex@example.com"
}'{
"id": "cus_0TMXp8QPR6yGvKuV2GZQ10",
"object": "customer",
"first_name": "<string>",
"last_name": "<string>",
"nickname": "<string>",
"email": "alex@example.com",
"phone": "+61400000000",
"date_of_birth": "2026-10-08",
"company": "<string>",
"address": {
"line1": "<string>",
"line2": "<string>",
"suburb": "<string>",
"state": "<string>",
"postcode": "<string>",
"country": "<string>"
},
"adult": true,
"marketing_consent": true,
"membership": {
"member": true,
"tier": "<string>"
},
"tags": [
{
"id": "tag_0TMXp8QPR6yGvKuV2GZQ10",
"name": "<string>",
"added_at": "2026-10-08T03:00:00.000Z"
}
],
"lists": [
{
"id": "lst_0TMXp8QPR6yGvKuV2GZQ10",
"name": "<string>",
"status": "<string>",
"added_at": "2026-10-08T03:00:00.000Z",
"unsubscribed_at": "2026-10-08T03:00:00.000Z"
}
],
"livemode": true,
"created_at": "2026-10-08T03:00:00.000Z",
"updated_at": "2026-10-08T03:00:00.000Z",
"version": "1791428400000000"
}Update a customer
Changes only the fields sent; null clears a field, and an unknown field is a 400. An email or phone the customer already has cannot be changed or cleared here - that is a 409, and the customer changes it in their portal. An empty one can be filled. With If-Match, a customer changed since you read it is a 412 and nothing is written.
Headers
If-MatchstringThe ETag, or the quoted version, from your last read. See Changing what you read.
Path parameters
idstringrequiredThe customer's id, cus_ and 22 characters.
Body
first_namestringRequired on create. Cannot be emptied.
last_namestringnullablenicknamestringnullablecompanystringnullableemailstringnullableStored lowercase. One customer per email. Once set, it cannot be changed or cleared here.
phonestringnullableAny readable number. Stored as E.164. Once set, it cannot be changed or cleared here.
date_of_birthstringnullableyyyy-MM-dd.
gender"male" | "female" | "other"nullableadultbooleanThe age group, used only while there is no date of birth. Send it with date_of_birth.
marketing_consentfalseOnly false is accepted: true is a 403. Customers give consent themselves, on the booking page or in their portal.
how_heard_about_usstringnullableaddressobjectaddress.line1stringnullableaddress.line2stringnullableaddress.suburbstringnullableaddress.statestringnullableaddress.postcodestringnullableaddress.countrystringnullablecurl -X PATCH "https://api.hatcel.com/customers/cus_0TMXp8QPR6yGvKuV2GZQ10" \
-H "Authorization: Bearer $HATCEL_API_KEY" \
-H "Hatcel-Version: 2026-10-08" \
-H "Content-Type: application/json" \
-d '{
"phone": "0400 000 000",
"address": {
"suburb": "Newtown",
"postcode": "2042"
}
}'{
"id": "cus_0TMXp8QPR6yGvKuV2GZQ10",
"object": "customer",
"first_name": "<string>",
"last_name": "<string>",
"nickname": "<string>",
"email": "alex@example.com",
"phone": "+61400000000",
"date_of_birth": "2026-10-08",
"company": "<string>",
"address": {
"line1": "<string>",
"line2": "<string>",
"suburb": "<string>",
"state": "<string>",
"postcode": "<string>",
"country": "<string>"
},
"adult": true,
"marketing_consent": true,
"membership": {
"member": true,
"tier": "<string>"
},
"tags": [
{
"id": "tag_0TMXp8QPR6yGvKuV2GZQ10",
"name": "<string>",
"added_at": "2026-10-08T03:00:00.000Z"
}
],
"lists": [
{
"id": "lst_0TMXp8QPR6yGvKuV2GZQ10",
"name": "<string>",
"status": "<string>",
"added_at": "2026-10-08T03:00:00.000Z",
"unsubscribed_at": "2026-10-08T03:00:00.000Z"
}
],
"livemode": true,
"created_at": "2026-10-08T03:00:00.000Z",
"updated_at": "2026-10-08T03:00:00.000Z",
"version": "1791428400000000"
}Delete a customer
Removes the customer. Their bookings and orders stay.
Path parameters
idstringrequiredThe customer's id, cus_ and 22 characters.
curl -X DELETE "https://api.hatcel.com/customers/cus_0TMXp8QPR6yGvKuV2GZQ10" \
-H "Authorization: Bearer $HATCEL_API_KEY" \
-H "Hatcel-Version: 2026-10-08"{
"id": "cus_0TMXp8QPR6yGvKuV2GZQ10",
"object": "customer",
"deleted": true
}Tag a customer
Puts a tag the workspace already has on the customer, and answers the customer. Already tagged is not an error.
Headers
Idempotency-KeystringrequiredA unique string, up to 255 characters, reused only to retry this request. See Idempotency.
Path parameters
idstringrequiredThe customer's id, cus_ and 22 characters.
Body
tagstringrequiredThe tag's id, tag_ and 22 characters.
curl -X POST "https://api.hatcel.com/customers/cus_0TMXp8QPR6yGvKuV2GZQ10/tags" \
-H "Authorization: Bearer $HATCEL_API_KEY" \
-H "Hatcel-Version: 2026-10-08" \
-H "Idempotency-Key: $(uuidgen)" \
-H "Content-Type: application/json" \
-d '{
"tag": "tag_0TMXp8QPR6yGvKuV2GZQ10"
}'{
"id": "cus_0TMXp8QPR6yGvKuV2GZQ10",
"object": "customer",
"first_name": "<string>",
"last_name": "<string>",
"nickname": "<string>",
"email": "alex@example.com",
"phone": "+61400000000",
"date_of_birth": "2026-10-08",
"company": "<string>",
"address": {
"line1": "<string>",
"line2": "<string>",
"suburb": "<string>",
"state": "<string>",
"postcode": "<string>",
"country": "<string>"
},
"adult": true,
"marketing_consent": true,
"membership": {
"member": true,
"tier": "<string>"
},
"tags": [
{
"id": "tag_0TMXp8QPR6yGvKuV2GZQ10",
"name": "<string>",
"added_at": "2026-10-08T03:00:00.000Z"
}
],
"lists": [
{
"id": "lst_0TMXp8QPR6yGvKuV2GZQ10",
"name": "<string>",
"status": "<string>",
"added_at": "2026-10-08T03:00:00.000Z",
"unsubscribed_at": "2026-10-08T03:00:00.000Z"
}
],
"livemode": true,
"created_at": "2026-10-08T03:00:00.000Z",
"updated_at": "2026-10-08T03:00:00.000Z",
"version": "1791428400000000"
}Untag a customer
Takes the tag off, and answers the customer. A tag that was not on them is not an error.
Path parameters
idstringrequiredThe customer's id, cus_ and 22 characters.
tagIdstringrequiredThe tag's id, tag_ and 22 characters.
curl -X DELETE "https://api.hatcel.com/customers/cus_0TMXp8QPR6yGvKuV2GZQ10/tags/tag_0TMXp8QPR6yGvKuV2GZQ10" \
-H "Authorization: Bearer $HATCEL_API_KEY" \
-H "Hatcel-Version: 2026-10-08"{
"id": "cus_0TMXp8QPR6yGvKuV2GZQ10",
"object": "customer",
"first_name": "<string>",
"last_name": "<string>",
"nickname": "<string>",
"email": "alex@example.com",
"phone": "+61400000000",
"date_of_birth": "2026-10-08",
"company": "<string>",
"address": {
"line1": "<string>",
"line2": "<string>",
"suburb": "<string>",
"state": "<string>",
"postcode": "<string>",
"country": "<string>"
},
"adult": true,
"marketing_consent": true,
"membership": {
"member": true,
"tier": "<string>"
},
"tags": [
{
"id": "tag_0TMXp8QPR6yGvKuV2GZQ10",
"name": "<string>",
"added_at": "2026-10-08T03:00:00.000Z"
}
],
"lists": [
{
"id": "lst_0TMXp8QPR6yGvKuV2GZQ10",
"name": "<string>",
"status": "<string>",
"added_at": "2026-10-08T03:00:00.000Z",
"unsubscribed_at": "2026-10-08T03:00:00.000Z"
}
],
"livemode": true,
"created_at": "2026-10-08T03:00:00.000Z",
"updated_at": "2026-10-08T03:00:00.000Z",
"version": "1791428400000000"
}Add a customer to a list
Puts the customer on a list the workspace already has, and answers the customer. Somebody who left is put back.
Headers
Idempotency-KeystringrequiredA unique string, up to 255 characters, reused only to retry this request. See Idempotency.
Path parameters
idstringrequiredThe customer's id, cus_ and 22 characters.
Body
liststringrequiredThe list's id, lst_ and 22 characters.
curl -X POST "https://api.hatcel.com/customers/cus_0TMXp8QPR6yGvKuV2GZQ10/lists" \
-H "Authorization: Bearer $HATCEL_API_KEY" \
-H "Hatcel-Version: 2026-10-08" \
-H "Idempotency-Key: $(uuidgen)" \
-H "Content-Type: application/json" \
-d '{
"list": "lst_0TMXp8QPR6yGvKuV2GZQ10"
}'{
"id": "cus_0TMXp8QPR6yGvKuV2GZQ10",
"object": "customer",
"first_name": "<string>",
"last_name": "<string>",
"nickname": "<string>",
"email": "alex@example.com",
"phone": "+61400000000",
"date_of_birth": "2026-10-08",
"company": "<string>",
"address": {
"line1": "<string>",
"line2": "<string>",
"suburb": "<string>",
"state": "<string>",
"postcode": "<string>",
"country": "<string>"
},
"adult": true,
"marketing_consent": true,
"membership": {
"member": true,
"tier": "<string>"
},
"tags": [
{
"id": "tag_0TMXp8QPR6yGvKuV2GZQ10",
"name": "<string>",
"added_at": "2026-10-08T03:00:00.000Z"
}
],
"lists": [
{
"id": "lst_0TMXp8QPR6yGvKuV2GZQ10",
"name": "<string>",
"status": "<string>",
"added_at": "2026-10-08T03:00:00.000Z",
"unsubscribed_at": "2026-10-08T03:00:00.000Z"
}
],
"livemode": true,
"created_at": "2026-10-08T03:00:00.000Z",
"updated_at": "2026-10-08T03:00:00.000Z",
"version": "1791428400000000"
}Remove a customer from a list
Takes the customer off the list, and answers the customer.
Path parameters
idstringrequiredThe customer's id, cus_ and 22 characters.
listIdstringrequiredThe list's id, lst_ and 22 characters.
curl -X DELETE "https://api.hatcel.com/customers/cus_0TMXp8QPR6yGvKuV2GZQ10/lists/lst_0TMXp8QPR6yGvKuV2GZQ10" \
-H "Authorization: Bearer $HATCEL_API_KEY" \
-H "Hatcel-Version: 2026-10-08"{
"id": "cus_0TMXp8QPR6yGvKuV2GZQ10",
"object": "customer",
"first_name": "<string>",
"last_name": "<string>",
"nickname": "<string>",
"email": "alex@example.com",
"phone": "+61400000000",
"date_of_birth": "2026-10-08",
"company": "<string>",
"address": {
"line1": "<string>",
"line2": "<string>",
"suburb": "<string>",
"state": "<string>",
"postcode": "<string>",
"country": "<string>"
},
"adult": true,
"marketing_consent": true,
"membership": {
"member": true,
"tier": "<string>"
},
"tags": [
{
"id": "tag_0TMXp8QPR6yGvKuV2GZQ10",
"name": "<string>",
"added_at": "2026-10-08T03:00:00.000Z"
}
],
"lists": [
{
"id": "lst_0TMXp8QPR6yGvKuV2GZQ10",
"name": "<string>",
"status": "<string>",
"added_at": "2026-10-08T03:00:00.000Z",
"unsubscribed_at": "2026-10-08T03:00:00.000Z"
}
],
"livemode": true,
"created_at": "2026-10-08T03:00:00.000Z",
"updated_at": "2026-10-08T03:00:00.000Z",
"version": "1791428400000000"
}Remove all test data
Removes every customer the workspace's test keys made, and every tag and list membership they added. Live data and anything staff made are never touched. A live key is refused with a 403.
curl -X DELETE "https://api.hatcel.com/test-data" \
-H "Authorization: Bearer $HATCEL_API_KEY" \
-H "Hatcel-Version: 2026-10-08"{
"object": "test_data_removal",
"customers": 2,
"tags": 1,
"list_memberships": 0
}