curl --request PATCH \
--url https://api.revem.ai/tickets/public/v1/{id} \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"status": "won",
"funnelStageId": 14
}
'const options = {
method: 'PATCH',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({status: 'won', funnelStageId: 14})
};
fetch('https://api.revem.ai/tickets/public/v1/{id}', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://api.revem.ai/tickets/public/v1/{id}"
payload = {
"status": "won",
"funnelStageId": 14
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.patch(url, json=payload, headers=headers)
print(response.text){
"id": "c0a8012e-5b3d-4e7f-9a1b-2c3d4e5f6a7b",
"title": "Cotización plan anual",
"status": "active",
"funnelStageId": 12,
"funnelId": "f1e2d3c4-b5a6-4978-8a9b-0c1d2e3f4a5b",
"assignedToProfileId": "9b8a7c6d-5e4f-4a3b-8c2d-1e0f9a8b7c6d",
"createdByProfileId": null,
"pointOfContact": "3f2b6c1e-8d4a-4f0b-9c2e-7a1d5e6f8b90",
"account": null,
"customAttributes": {
"origen": "web"
},
"lossReason": null,
"visibility": "TENANT",
"visibilityGroupId": null,
"postponedUntil": null,
"closedAt": null,
"createdAt": "2026-09-02T12:00:00.000Z",
"updatedAt": "2026-09-03T08:15:30.000Z",
"conversations": [
{
"id": "a1d2c3b4-e5f6-4a7b-8c9d-0e1f2a3b4c5d",
"channelType": "Webchat"
}
]
}{
"ok": true,
"error": "<string>"
}{
"error": "Unauthorized",
"message": "Invalid API key"
}{
"ok": true,
"error": "<string>"
}{
"ok": true,
"error": "<string>"
}{
"ok": false,
"error": "Too many requests. Retry in 1 minute."
}Actualizar un ticket
Modifica uno o más campos de un ticket. Sólo se tocan las claves presentes en el cuerpo.
No se puede crear ni eliminar un ticket por la API: se abren desde una conversación y se conservan para auditoría. Tampoco se puede pasar a postponed, porque posponer programa una reapertura que sólo la app arma.
curl --request PATCH \
--url https://api.revem.ai/tickets/public/v1/{id} \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"status": "won",
"funnelStageId": 14
}
'const options = {
method: 'PATCH',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({status: 'won', funnelStageId: 14})
};
fetch('https://api.revem.ai/tickets/public/v1/{id}', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://api.revem.ai/tickets/public/v1/{id}"
payload = {
"status": "won",
"funnelStageId": 14
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.patch(url, json=payload, headers=headers)
print(response.text){
"id": "c0a8012e-5b3d-4e7f-9a1b-2c3d4e5f6a7b",
"title": "Cotización plan anual",
"status": "active",
"funnelStageId": 12,
"funnelId": "f1e2d3c4-b5a6-4978-8a9b-0c1d2e3f4a5b",
"assignedToProfileId": "9b8a7c6d-5e4f-4a3b-8c2d-1e0f9a8b7c6d",
"createdByProfileId": null,
"pointOfContact": "3f2b6c1e-8d4a-4f0b-9c2e-7a1d5e6f8b90",
"account": null,
"customAttributes": {
"origen": "web"
},
"lossReason": null,
"visibility": "TENANT",
"visibilityGroupId": null,
"postponedUntil": null,
"closedAt": null,
"createdAt": "2026-09-02T12:00:00.000Z",
"updatedAt": "2026-09-03T08:15:30.000Z",
"conversations": [
{
"id": "a1d2c3b4-e5f6-4a7b-8c9d-0e1f2a3b4c5d",
"channelType": "Webchat"
}
]
}{
"ok": true,
"error": "<string>"
}{
"error": "Unauthorized",
"message": "Invalid API key"
}{
"ok": true,
"error": "<string>"
}{
"ok": true,
"error": "<string>"
}{
"ok": false,
"error": "Too many requests. Retry in 1 minute."
}Authorizations
La API key de tu organización, con la forma rvm_<prefijo>.<secreto>, enviada como Authorization: Bearer rvm_…. Revem la emite y sólo se muestra una vez; si la pierdes se reemplaza, no se recupera.
Path Parameters
Id del ticket.
Body
Todos los campos son opcionales, pero el cuerpo debe traer al menos uno.
Título del ticket.
1Etapa del embudo. Debe pertenecer al tenant.
active, won o lost. No se acepta postponed: posponer programa una reapertura y sólo se hace desde la app.
active, won, lost Perfil a asignar, o null para desasignar.
Id de contacto, o null para desvincular.
Id de contacto que actúa como cuenta, o null para desvincular.
Motivo de pérdida. Suele acompañar a status: "lost".
Atributos personalizados del ticket, por id de definición. Reemplaza el conjunto completo.
Response
El ticket actualizado.
active, postponed, won o lost. postponed sólo se alcanza desde la app; la API no puede posponer.
active, postponed, won, lost Etapa del embudo en que está el ticket.
Embudo al que pertenece la etapa. Derivado, no editable.
Perfil del equipo asignado, o null.
Contacto principal del ticket (un id de contacto), o null.
Contacto que actúa como cuenta u organización, o null.
Atributos personalizados del ticket, identificados por el id de su definición.
Motivo de pérdida cuando status es lost.
Modelo de visibilidad para las personas del equipo. Una API key ve todos los tickets del tenant sin importar este valor.
OWNER, OWNER_AND_GROUPS, TENANT Fecha de reapertura cuando el ticket está pospuesto.
Fecha de cierre cuando status es won o lost.
Conversaciones enlazadas al ticket. Puede haber más de una.
Show child attributes
Show child attributes
