Base URL https://api.afer.pro Referencia aferapp.com Reservar demo

Mover oportunidad de etapa

PUT https://api.afer.pro/api/v1/crm/opportunities/{id}/stage
Alias en castellano (v0, sigue operativo): 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.

Autenticación

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|int
obligatorio
Oportunidad a mover: id cifrado o numérico legacy. Debe pertenecer a tu cuenta.
etapaIdstring|int
obligatorio
Etapa destino: el etapaId cifrado de listarFunnels o el numérico legacy.
funnel_fkstring|int
opcional
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

200 · application/json
{
    "errorCode": 200,
    "errorMsg": "",
    "data": {
        "oportunidadId": "aBc123XyZ…",
        "titulo": "Reforma local C/ Mayor",
        "funnelId": "gHi789…",
        "etapaId": "dEf456…",
        "etapa": "Propuesta enviada",
        "etapa_anterior": {
            "etapaId": "jKl012…"
        }
    }
}

Errores

CasoResultado
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.
Notas