Mover oportunidad de etapa
https://api.afer.pro/api/v1/crm/opportunities/{id}/stage
POST https://api.afer.pro/moverOportunidadEtapa
Mueve una oportunidad a otra etapa del embudo — o a otro embudo distinto.
El equivalente por API a arrastrar la tarjeta en el kanban del CRM. Por defecto la etapa destino debe pertenecer al mismo embudo de la oportunidad (la misma guarda que aplica Afer internamente).
Para moverla a otro embudo, envía también funnel_fk: se comprueba que el embudo es de tu cuenta y que la etapa le pertenece, y se actualizan ambos a la vez.
Envía tus claves API en las cabeceras X-API-KEY y X-API-SECRET. La cuenta sobre la que se opera se resuelve automáticamente a partir de la clave. Cómo obtener tus claves →
Este endpoint requiere autenticación con API key: sin credenciales responde 401.
Parámetros del cuerpo
El cuerpo de la petición es un objeto JSON con Content-Type: application/json.
oportunidadIdstring|intobligatorio | Oportunidad a mover: id cifrado o numérico legacy. Debe pertenecer a tu cuenta. |
etapaIdstring|intobligatorio | Etapa destino: el etapaId cifrado de listarFunnels o el numérico legacy. |
funnel_fkstring|intopcional | Embudo destino, solo si mueves la oportunidad a otro embudo. La etapa debe pertenecer a él. |
Ejemplo de petición
curl -X PUT 'https://api.afer.pro/api/v1/crm/opportunities/aBc123XyZ…/stage' \
-H 'X-API-KEY: afer_tk_TU_TOKEN' \
-H 'X-API-SECRET: afer_sk_TU_SECRET' \
-H 'Content-Type: application/json' \
-d '{
"etapaId": "dEf456…"
}'
<?php
$data = [
'etapaId' => 'dEf456…',
];
$ch = curl_init('https://api.afer.pro/api/v1/crm/opportunities/aBc123XyZ…/stage');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'PUT');
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, [
'X-API-KEY: afer_tk_TU_TOKEN',
'X-API-SECRET: afer_sk_TU_SECRET',
'Content-Type: application/json',
]);
$respuesta = json_decode(curl_exec($ch), true);
curl_close($ch);
const respuesta = await fetch('https://api.afer.pro/api/v1/crm/opportunities/aBc123XyZ…/stage', {
method: 'PUT',
headers: {
'Content-Type': 'application/json',
'X-API-KEY': 'afer_tk_TU_TOKEN',
'X-API-SECRET': 'afer_sk_TU_SECRET'
},
body: JSON.stringify({
"etapaId": "dEf456…"
})
});
const resultado = await respuesta.json();
Respuesta
{
"errorCode": 200,
"errorMsg": "",
"data": {
"oportunidadId": "aBc123XyZ…",
"titulo": "Reforma local C/ Mayor",
"funnelId": "gHi789…",
"etapaId": "dEf456…",
"etapa": "Propuesta enviada",
"etapa_anterior": {
"etapaId": "jKl012…"
}
}
}
Errores
| Caso | Resultado |
|---|---|
| Sin credenciales de API key | errorCode 401. |
oportunidadId o etapaId ausentes o inválidos |
errorCode 400. |
| La oportunidad, la etapa o el embudo no existen (o no son de tu cuenta) | errorCode 404. |
La etapa no pertenece al embudo de la oportunidad (y no se envió funnel_fk) |
errorCode 422 indicando el motivo. |
- Mover una oportunidad no la cierra: para ganarla o perderla usa cerrarOportunidad.
- Acepta la cabecera
X-IDEMPOTENCY-KEYcontra dobles clicks.