Actualizar Cliente
Actualiza los datos de un cliente existente. Todos los campos son opcionales, solo se modificarán los que se incluyan en el request.
Endpoint
PATCH https://api.lummy.io/v1/customers/{customerId}
| Entorno | URL |
|---|---|
| Producción | https://api.lummy.io/v1/customers/{customerId} |
| Sandbox | https://sandbox.lummy.io/v1/customers/{customerId} |
Request
Headers
Headers requeridos
{
"Authorization": string,requerido
↳Token JWT obtenido del endpoint de autenticación. Debe incluir el prefijo "Bearer " seguido del token.
↳Ejemplo:
"Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..." "x-organization-id": string,requerido
↳Identificador único de la organización a la que pertenece el cliente. Debe ser un UUID válido de una organización a la que el usuario autenticado tenga acceso.
↳Formato: UUID v4
↳Ejemplo:
"550e8400-e29b-41d4-a716-446655440000" "Content-Type": stringrequerido
↳Tipo de contenido del cuerpo de la petición.
↳Ejemplo:
"application/json"}
Path Parameters
Parámetros de ruta
{
"customerId": stringrequerido
↳Identificador único del cliente que se desea actualizar. Debe ser un UUID válido de un cliente existente en la organización.
↳Formato: UUID v4
↳Ejemplo:
"550e8400-e29b-41d4-a716-446655440000"}
Body
Request BodyDatos del cliente a actualizar. Todos los campos son opcionales, solo se modificarán los incluidos en la petición.
{
"rfc": string,opcional
↳Nuevo Registro Federal de Contribuyentes del cliente. Debe coincidir exactamente con el registrado ante el SAT. Para personas morales son 12 caracteres, para personas físicas son 13 caracteres. Se valida el formato y la estructura según las reglas del SAT.
↳Longitud: 12-13 caracteres · Patrón: ^[A-ZÑ&]{3,4}[0-9]{6}[A-Z0-9]{3}$
↳Ejemplo:
"XEXX010101000" "legalName": string,opcional
↳Nueva razón social o nombre completo del cliente tal como aparece en su Constancia de Situación Fiscal del SAT. Este valor se usará en el campo "Nombre" del receptor en los CFDIs emitidos.
↳Longitud: 1-254 caracteres
↳Ejemplo:
"Empresa Cliente S.A. de C.V." "fiscalRegime": string,opcional
↳Nueva clave del régimen fiscal del cliente según el catálogo c_RegimenFiscal del SAT. Debe corresponder a un régimen vigente y válido para el tipo de persona (física o moral) según el RFC.
↳Catálogo SAT: c_RegimenFiscal · Longitud exacta: 3 caracteres
↳Ejemplo:
"601" "fiscalZipCode": string,opcional
↳Nuevo código postal del domicilio fiscal del cliente. Debe ser un código postal válido de México según el catálogo c_CodigoPostal del SAT.
↳Catálogo SAT: c_CodigoPostal · Longitud exacta: 5 caracteres · Patrón: ^[0-9]{5}$
↳Ejemplo:
"06500" "email": string,opcional
↳Nuevo correo electrónico principal del cliente donde se enviarán los CFDIs emitidos (PDF y XML). Debe ser una dirección de correo válida y activa.
↳Formato: email · Longitud máxima: 254 caracteres
↳Ejemplo:
"nuevo-email@cliente.com" "phone": stringopcional
↳Nuevo número de teléfono de contacto del cliente. Se recomienda incluir el código de país.
↳Ejemplo:
"+525587654321"}
Response
200 OK
Cliente actualizado exitosamente.
Response Body
{
"requestId": string,requerido
↳Identificador único de la petición. Útil para trazabilidad y soporte técnico.
↳Formato: UUID
↳Ejemplo:
"req_abc123-def456-ghi789" "data": {requerido
↳Objeto con los datos actualizados del cliente.
"id": string,requerido
↳Identificador único del cliente en Lummy.
↳Formato: UUID v4
↳Ejemplo:
"550e8400-e29b-41d4-a716-446655440000" "rfc": string,requerido
↳RFC del cliente.
↳Ejemplo:
"XEXX010101000" "legalName": string,requerido
↳Razón social del cliente.
↳Ejemplo:
"Empresa Cliente S.A. de C.V." "fiscalRegime": string,requerido
↳Clave del régimen fiscal.
↳Ejemplo:
"601" "fiscalZipCode": string,requerido
↳Código postal del domicilio fiscal.
↳Ejemplo:
"06500" "email": string,requerido
↳Email de contacto actualizado.
↳Ejemplo:
"nuevo-email@cliente.com" "phone": string,opcional
↳Teléfono de contacto actualizado (si fue proporcionado).
↳Ejemplo:
"+525587654321" "createdAt": string,requerido
↳Fecha y hora de creación del registro (sin cambios).
↳Formato: ISO 8601
↳Ejemplo:
"2025-01-15T10:30:00.000Z" "updatedAt": stringrequerido
↳Fecha y hora de la última actualización.
↳Formato: ISO 8601
↳Ejemplo:
"2025-01-20T14:00:00.000Z" },
"timestamp": string,requerido
↳Marca de tiempo de la respuesta del servidor.
↳Formato: ISO 8601
↳Ejemplo:
"2025-01-20T14:00:00.000Z" "path": string,requerido
↳Ruta del endpoint invocado.
↳Ejemplo:
"/customers/550e8400-e29b-41d4-a716-446655440000" "method": stringrequerido
↳Método HTTP utilizado.
↳Ejemplo:
"PATCH"}
404 Not Found
El cliente especificado no existe en la organización.
{
"requestId": "abc123-def456",
"error": {
"message": "Cliente no encontrado",
"code": "CustomerNotFoundError",
"status": 404
},
"timestamp": "2025-01-20T14:00:00.000Z",
"path": "/customers/550e8400-e29b-41d4-a716-446655440000",
"method": "PATCH"
}
400 Bad Request
Error de validación en los datos enviados.
{
"requestId": "abc123-def456",
"error": {
"message": "Datos invalidos",
"code": "ValidationError",
"status": 400
},
"timestamp": "2025-01-20T14:00:00.000Z",
"path": "/customers/550e8400-e29b-41d4-a716-446655440000",
"method": "PATCH"
}
Ejemplos de Código
- cURL
- Node.js (TypeScript)
- Python
- PHP (Guzzle)
curl -X PATCH https://sandbox.lummy.io/customers/550e8400-e29b-41d4-a716-446655440000 \
-H "Content-Type: application/json" \
-H "Authorization: Bearer ${ACCESS_TOKEN}" \
-H "x-organization-id: ${LUMMY_ORG_ID}" \
-d '{
"email": "nuevo-email@cliente.com",
"phone": "+525587654321"
}'
import axios from 'axios';
interface UpdateCustomerPayload {
rfc?: string;
legalName?: string;
fiscalRegime?: string;
fiscalZipCode?: string;
email?: string;
phone?: string;
}
async function actualizarCliente(
customerId: string,
updates: UpdateCustomerPayload
) {
const API_URL = `https://sandbox.lummy.io/customers/${customerId}`;
const response = await axios.patch(API_URL, updates, {
headers: {
'Content-Type': 'application/json',
'Authorization': `Bearer ${process.env.ACCESS_TOKEN}`,
'x-organization-id': process.env.LUMMY_ORG_ID!,
},
});
console.log('Cliente actualizado');
return response.data;
}
actualizarCliente('550e8400-e29b-41d4-a716-446655440000', {
email: 'nuevo-email@cliente.com',
phone: '+525587654321',
});
import os
import requests
def actualizar_cliente(customer_id, updates):
api_url = f"https://sandbox.lummy.io/customers/{customer_id}"
headers = {
"Content-Type": "application/json",
"Authorization": f"Bearer {os.getenv('ACCESS_TOKEN')}",
"x-organization-id": os.getenv("LUMMY_ORG_ID"),
}
response = requests.patch(api_url, json=updates, headers=headers)
response.raise_for_status()
print("Cliente actualizado")
return response.json()
if __name__ == "__main__":
actualizar_cliente("550e8400-e29b-41d4-a716-446655440000", {
"email": "nuevo-email@cliente.com",
"phone": "+525587654321",
})
<?php
require 'vendor/autoload.php';
use GuzzleHttp\Client;
function actualizarCliente(string $customerId, array $updates): array
{
$client = new Client([
'base_uri' => 'https://sandbox.lummy.io',
'headers' => [
'Content-Type' => 'application/json',
'Authorization' => 'Bearer ' . getenv('ACCESS_TOKEN'),
'x-organization-id' => getenv('LUMMY_ORG_ID'),
],
]);
$response = $client->patch("/customers/{$customerId}", [
'json' => $updates,
]);
echo "Cliente actualizado\n";
return json_decode($response->getBody(), true);
}
actualizarCliente('550e8400-e29b-41d4-a716-446655440000', [
'email' => 'nuevo-email@cliente.com',
'phone' => '+525587654321',
]);