Identificá o creá un cliente
Buscá primero un `customer`, crealo sólo cuando no exista y conservá su ID para continuar el recorrido.
Objetivo
Resolver una identidad de Qualth antes de registrar actividad. Al terminar este flujo tenés un customer.id válido para usar en la compra y en la lectura de estado.
Antes de empezar
- Llamá a la Integration API desde tu backend o BFF.
- Usá una
X-API-Keydel tenant correcto. - La búsqueda requiere
customers.read; la creación requierecustomers.write. - Tené disponible el
programIdque corresponde a la integración.
1. Buscá el cliente
Llamá a GET /api/customers/search con programId y email. Si data.customer contiene un cliente, reutilizá su id y no generes una segunda identidad.
Cuando no existe
Un cliente inexistente no se expresa como HTTP 404: la búsqueda devuelve HTTP 200 con data.customer = null y el warning customer_not_found. Ese resultado habilita el paso de creación.
2. Creá sólo después de un miss
Usá POST /api/customers. program_id y email son obligatorios; consultá la API Reference para los demás campos admitidos y su schema exacto.
Si el cliente ya existe
Un email duplicado devuelve HTTP 409 con customer_email_conflict. Volvé a ejecutar la búsqueda y continuá con el customer.id encontrado.
Si el resultado de create es ambiguo
POST /api/customers no define Idempotency-Key. Ante timeout, network failure o un 5xx donde no sabés si el write ocurrió, buscá nuevamente el mismo programId + email antes de crear otra vez.
Resultado esperado
Tanto el camino de búsqueda como el de creación terminan con un customer.id. Conservá ese ID en tu integración y usalo en el siguiente paso.
Registrá una compra y leé el estado resultante
Ejemplos probados
Los ejemplos que siguen se renderizan desde el bundle validado contra el mismo contrato que alimenta la API Reference.
searchCustomerByEmailBuscar un customer existente
- HTTP esperado
- 200
- Última validación
- 2026-08-11
- Evidencia
- deterministic-ci
Customer resolves inside the credential tenant/program boundary.
cURL
curl --request GET \
--url 'https://api.qualth.com/api/customers/search?programId={{program_id}}&email={{existing_customer_email}}' \
--header 'X-API-Key: {{api_key}}' \
--header 'X-Tenant-Subdomain: {{tenant_subdomain}}'JavaScript
const response = await fetch("https://api.qualth.com/api/customers/search?programId={{program_id}}&email={{existing_customer_email}}", {
method: "GET",
headers: {
"X-API-Key": "{{api_key}}",
"X-Tenant-Subdomain": "{{tenant_subdomain}}"
}
})
const data = await response.json()searchCustomerByEmailInterpretar un search miss
- HTTP esperado
- 200
- Última validación
- 2026-08-11
- Evidencia
- deterministic-ci
A miss is a successful 200 response with customer:null and customer_not_found warning.
cURL
curl --request GET \
--url 'https://api.qualth.com/api/customers/search?programId={{program_id}}&email={{new_customer_email}}' \
--header 'X-API-Key: {{api_key}}' \
--header 'X-Tenant-Subdomain: {{tenant_subdomain}}'JavaScript
const response = await fetch("https://api.qualth.com/api/customers/search?programId={{program_id}}&email={{new_customer_email}}", {
method: "GET",
headers: {
"X-API-Key": "{{api_key}}",
"X-Tenant-Subdomain": "{{tenant_subdomain}}"
}
})
const data = await response.json()createCustomerCrear después de un miss
- HTTP esperado
- 201
- Última validación
- 2026-08-11
- Evidencia
- deterministic-ci+controlled-smoke
Create is strict create semantics and returns 201 with created:true.
cURL
curl --request POST \
--url 'https://api.qualth.com/api/customers' \
--header 'X-API-Key: {{api_key}}' \
--header 'X-Tenant-Subdomain: {{tenant_subdomain}}' \
--header 'Content-Type: application/json' \
--data '{
"program_id": {{program_id}},
"email": "{{new_customer_email}}",
"first_name": "Sales",
"last_name": "Path"
}'JavaScript
const response = await fetch("https://api.qualth.com/api/customers", {
method: "POST",
headers: {
"X-API-Key": "{{api_key}}",
"X-Tenant-Subdomain": "{{tenant_subdomain}}",
"Content-Type": "application/json"
},
body: JSON.stringify({
"program_id": Number("{{program_id}}"),
"email": "{{new_customer_email}}",
"first_name": "Sales",
"last_name": "Path"
}),
})
const data = await response.json()createCustomerRecuperar un duplicate create
- HTTP esperado
- 409
- Última validación
- 2026-08-11
- Evidencia
- deterministic-ci
A repeated create is not an upsert; duplicate email is an explicit 409 conflict and callers recover by search.
cURL
curl --request POST \
--url 'https://api.qualth.com/api/customers' \
--header 'X-API-Key: {{api_key}}' \
--header 'X-Tenant-Subdomain: {{tenant_subdomain}}' \
--header 'Content-Type: application/json' \
--data '{
"program_id": {{program_id}},
"email": "{{new_customer_email}}",
"first_name": "Sales",
"last_name": "Path"
}'JavaScript
const response = await fetch("https://api.qualth.com/api/customers", {
method: "POST",
headers: {
"X-API-Key": "{{api_key}}",
"X-Tenant-Subdomain": "{{tenant_subdomain}}",
"Content-Type": "application/json"
},
body: JSON.stringify({
"program_id": Number("{{program_id}}"),
"email": "{{new_customer_email}}",
"first_name": "Sales",
"last_name": "Path"
}),
})
const data = await response.json()