Ir al contenido
docs

Editar cliente

El cambio llega a las cajas del negocio por su sincronización normal (en segundos si están en línea; si están sin conexión, al reconectarse).

PATCH /public/v1/customers/{id}

Permiso customers:write · Clientes

Parámetros

Parámetros de ruta

NombreTipoRequeridoDescripción
idstring (uuid)Sí—

Cuerpo de la petición

JSON (Content-Type: application/json): un objeto CustomerUpdate.

Envía al menos 1 campo.

Un campo que no esté en la lista se rechaza con VALIDATION_ERROR.

CampoTipoRequeridoDescripción
namestringNoMáximo 120 caracteres.
last_namestringNoMáximo 120 caracteres.
phonestringNoMáximo 30 caracteres.
emailstring (email) | nullNoMáximo 200 caracteres.
person_typestringNoValores: person, company. Por defecto: person.
document_typestringNoValores: CC, TI, NIT, CE, PASAPORTE. Por defecto: CC.
document_numberstringNoMáximo 30 caracteres.
contact_channelstringNoValores: none, store, whatsapp, instagram, website, referral. Por defecto: none.

Ejemplo de petición

El cuerpo del ejemplo lleva solo los campos obligatorios, con valores ilustrativos: ajústalos a tus datos.

Terminal
curl -X PATCH "https://api.posdata.so/public/v1/customers/3f1c2e8d-7a10-4d0b-9a57-0b6f2f0e5c1d" \
  -H "Authorization: Bearer $POSDATA_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"name":"Café molido 500 g"}'
JavaScript
const res = await fetch('https://api.posdata.so/public/v1/customers/3f1c2e8d-7a10-4d0b-9a57-0b6f2f0e5c1d', {
  method: 'PATCH',
  headers: {
    Authorization: `Bearer ${process.env.POSDATA_API_KEY}`,
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    "name": "Café molido 500 g"
  }),
});
const data = await res.json();
if (!res.ok) throw new Error(`${data.error.code}: ${data.error.message} (${data.error.request_id})`);
Python
import os

import requests

res = requests.patch(
    "https://api.posdata.so/public/v1/customers/3f1c2e8d-7a10-4d0b-9a57-0b6f2f0e5c1d",
    headers={
        "Authorization": f"Bearer {os.environ['POSDATA_API_KEY']}",
    },
    json={
        "name": "Café molido 500 g",
    },
    timeout=30,
)
data = res.json()
if not res.ok:
    raise RuntimeError(f"{data['error']['code']}: {data['error']['message']} ({data['error']['request_id']})")
PHP
<?php
$ch = curl_init('https://api.posdata.so/public/v1/customers/3f1c2e8d-7a10-4d0b-9a57-0b6f2f0e5c1d');
curl_setopt_array($ch, [
    CURLOPT_CUSTOMREQUEST => 'PATCH',
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HTTPHEADER => [
        'Authorization: Bearer ' . getenv('POSDATA_API_KEY'),
        'Content-Type: application/json',
    ],
    CURLOPT_POSTFIELDS => json_encode([
        'name' => 'Café molido 500 g',
    ]),
]);
$data = json_decode(curl_exec($ch), true);
if (curl_getinfo($ch, CURLINFO_RESPONSE_CODE) >= 400) {
    throw new RuntimeException("{$data['error']['code']}: {$data['error']['message']} ({$data['error']['request_id']})");
}

Respuesta

200 Actualizado: un objeto Customer.

CampoTipoRequeridoDescripción
object"customer"Sí—
idstring (uuid)Sí—
namestringSí—
last_namestring | nullSí—
emailstring | nullSí—
phonestring | nullSí—
person_typestringSíperson (persona natural) o company (persona jurídica).
document_typestringSíTipo de identificación: CC, TI, NIT, CE, PASAPORTE.
document_numberstring | nullSí—
contact_channelstring | nullSíCómo llegó el cliente: none, store, whatsapp, instagram, website, referral.
deleted_atstring (date-time) | nullSí—
created_atstring (date-time)Sí—
updated_atstring (date-time)Sí—
Ejemplo de respuesta (valores ilustrativos)
{
  "object": "customer",
  "id": "3f1c2e8d-7a10-4d0b-9a57-0b6f2f0e5c1d",
  "name": "Café molido 500 g",
  "last_name": "texto",
  "email": "[email protected]",
  "phone": "3001234567",
  "person_type": "texto",
  "document_type": "texto",
  "document_number": "texto",
  "contact_channel": "texto",
  "deleted_at": "2026-09-28T15:04:05.000Z",
  "created_at": "2026-09-28T15:04:05.000Z",
  "updated_at": "2026-09-28T15:04:05.000Z"
}

Errores

Todo error responde con un objeto Error y un request_id. Ramifica por error.code, nunca por el mensaje.

Cuerpo: un objeto Error. Qué significa cada código y qué hacer: Errores.

VALIDATION_ERRORINVALID_JSONINVALID_CURSOR

Cuerpo: un objeto Error. Qué significa cada código y qué hacer: Errores.

UNAUTHENTICATEDINVALID_API_KEYAPI_KEY_REVOKEDAPI_KEY_EXPIREDAPI_KEY_WRONG_ENVIRONMENTACCOUNT_INACTIVE

Cuerpo: un objeto Error. Qué significa cada código y qué hacer: Errores.

PLAN_REQUIREDINSUFFICIENT_SCOPEBROWSER_REQUESTS_NOT_ALLOWED

Cuerpo: un objeto Error. Qué significa cada código y qué hacer: Errores.

NOT_FOUND

Cuerpo: un objeto Error. Qué significa cada código y qué hacer: Errores.

CONFLICTSKU_ALREADY_EXISTSIDEMPOTENCY_IN_PROGRESSNO_WAREHOUSEDEVICES_OUTDATEDINSUFFICIENT_STOCKSTOCK_MODE_LEGACY

Cuerpo: un objeto Error. Qué significa cada código y qué hacer: Errores.

IDEMPOTENCY_KEY_REUSEDCOMPOSITE_STOCK_UNSUPPORTED

Cuerpo: un objeto Error. Qué significa cada código y qué hacer: Errores.

RATE_LIMITED

Cuerpo: un objeto Error. Qué significa cada código y qué hacer: Errores.

INTERNAL_ERROR