Eliminar y archivar contactos
Cambio que rompe: DELETE /v1/contacts/{id} y POST /v1/contacts/bulk-delete eliminan en lugar de archivar, y la eliminación no se puede deshacer desde la API. Archivar pasa a POST /v1/contacts/{id}/archive, está siempre permitido y sigue siendo reversible. Se publica el evento webhook contact.deleted y desaparece el subcode contact_has_commercial_references.
Dar de baja un contacto significaba una sola cosa: DELETE /v1/contacts/{contact}
lo archivaba, y el archivado se rechazaba con 422 en cuanto alguno de sus roles
tenía detrás facturas, contratos u ofertas de proveedor. No había forma de hacer
desaparecer un contacto, ni de apartar uno que se hubiera usado alguna vez.
Ahora existen las dos operaciones, las dos están siempre permitidas y ninguna destruye el histórico fiscal.
Dos bajas, dos rutas
| Operación | Ruta | Efecto |
|---|---|---|
| Archivar | POST /v1/contacts/{contact}/archive | El contacto sigue siendo consultable con is_archived: true, conserva todos sus documentos y vuelve con PUT /v1/contacts/{contact}/restore. Idempotente. |
| Archivar en lote | POST /v1/contacts/bulk/archive | El mismo efecto, hasta 500 ids, con éxito parcial. |
| Eliminar | DELETE /v1/contacts/{contact} | Borrado lógico: el contacto desaparece de todas las superficies de lectura y su detalle responde 404 contact_not_found. Los documentos se conservan. Irreversible desde la API. |
| Eliminar en lote | POST /v1/contacts/bulk-delete | El mismo efecto, hasta 500 ids, con éxito parcial. |
Las cuatro requieren contacts:delete. PUT /v1/contacts/{contact}/restore
solo desarchiva; no recupera un contacto eliminado.
Cambio que rompe: DELETE y bulk-delete ahora eliminan
Si tu integración llamaba a DELETE /v1/contacts/{contact} o a
POST /v1/contacts/bulk-delete para archivar un contacto, ahora lo elimina y
no podrás deshacerlo desde la API. Lleva esas llamadas a
POST /v1/contacts/{contact}/archive y POST /v1/contacts/bulk/archive.
DELETE /v1/contacts/{contact} responde 200 con el acuse de la eliminación en
lugar del contacto:
{
"data": {
"id": "01931b3e-7c4a-7f2e-9a8b-3c5d6e7f8a01",
"object": "contact",
"deleted": true
}
}Qué hace una eliminación, y qué no:
- El contacto desaparece del listado, la búsqueda, las opciones y los selectores, las estadísticas, la exportación, las actividades, la deduplicación de importaciones y la resolución de alias legacy, y ya no se puede usar en documentos nuevos.
- Su fila, sus roles, los perfiles direccionales, las cuentas bancarias, los alias legacy y todas las facturas, presupuestos, albaranes o facturas de compra que lo referencian se conservan intactos, y esos documentos siguen mostrando sus datos de cliente o de proveedor.
- Su NIF y su
external_idquedan liberados, así que la misma identidad se puede volver a dar de alta como un contacto distinto. - Eliminar un
iddesconocido, de otra empresa o ya eliminado devuelve404 contact_not_found.
Archivar ya no se bloquea nunca
El 422 business_rule_violation con
subcode: contact_has_commercial_references se retira: ninguna operación lo
emite ya. Un contacto con facturas de compra, contratos u ofertas de proveedor se
puede archivar, y archivar uno ya archivado devuelve 200 y conserva el primer
archived_at.
Evento nuevo: contact.deleted
Suscríbete a contact.deleted en POST /v1/webhook-endpoints para enterarte de
que un contacto ha salido de la aplicación. A diferencia de contact.archived y
contact.restored, no lleva snapshot: ya no queda nada que leer.
{
"id": "01931b3e-7c4a-7f2e-9a8b-3c5d6e7f8a01",
"object": "contact",
"deleted": true
}contact.archived y contact.restored no cambian.
MCP
| Tool | Cambio |
|---|---|
delete_contact | Elimina (borrado lógico). Antes archivaba. Devuelve { id, object: "contact", deleted: true }. |
bulk_delete_contacts | Nueva. Elimina hasta 500 contactos con éxito parcial. |
archive_contact | Nueva. Archiva un contacto y lo devuelve. |
bulk_archive_contacts | Sin cambios. |
restore_contact | Sin cambios: solo desarchiva. |
Las cinco requieren contacts:delete y son destructive; delete_contact y
bulk_delete_contacts constan además como irreversibles, así que un asistente
las confirma antes de ejecutarlas. Consulta el
catálogo de tools MCP.
Migración
- Toda llamada cuya intención era «aparta este contacto» pasa de
DELETE /v1/contacts/{contact}aPOST /v1/contacts/{contact}/archive, y dePOST /v1/contacts/bulk-deleteaPOST /v1/contacts/bulk/archive. - Los reintentos o el tratamiento de errores que ramificaban por
subcode: contact_has_commercial_referencessobran: archivar ya no falla por ese motivo. - Si usabas
PUT /v1/contacts/{contact}/restorepara deshacer unDELETE, archiva en su lugar. Restaurar un contacto eliminado es una operación de soporte sobre la base de datos, no una llamada de la API. - Consultar un contacto que has eliminado devuelve
404: trata ese código como «ya no existe», no como un fallo pasajero.
Lee Contactos.
Nuevos endpoints1
| Endpoint | Descripción |
|---|---|
POST/v1/contacts/{contact}/archive | Archivar un contacto |
Endpoints actualizados3
| Endpoint | Descripción |
|---|---|
DEL/v1/contacts/{contact} | Eliminar un contacto |
POST/v1/contacts/bulk-delete | Eliminar contactos en lote |
POST/v1/contacts/bulk/archive | Archivar contactos en lote |