#!/usr/bin/env bash # API v1 do Rumo CRM com curl: cria um contato, abre um negócio, move de etapa e lista com paginação. # Precisa de curl, jq e uuidgen. Rode com: RUMO_TOKEN=teha_pat_... bash exemplos.sh set -euo pipefail : "${RUMO_TOKEN:?Defina RUMO_TOKEN com um token criado em Configurações → API e integrações}" BASE="https://rumocrm.com/api/v1" AUTH="Authorization: Bearer $RUMO_TOKEN" # 1. Criar (ou atualizar) contato. O mesmo telefone devolve o mesmo contato: repetir não duplica. # Idempotency-Key: repetir este pedido com a mesma chave devolve a mesma resposta (vale 24 h). CONTATO_ID=$(curl -sS --fail-with-body -X POST "$BASE/contacts" \ -H "$AUTH" -H "Content-Type: application/json" \ -H "Idempotency-Key: $(uuidgen)" \ -d '{"name": "Maria Souza", "phone": "(15) 99807-3400", "email": "maria@exemplo.com.br", "tags": ["site"]}' \ | jq -r '.id') echo "Contato: $CONTATO_ID" # 2. Funil padrão e as etapas em andamento dele. FUNIL_ID=$(curl -sS --fail-with-body "$BASE/pipelines" -H "$AUTH" \ | jq -r '([.data[] | select(.isDefault)] + .data)[0].id') SEGUNDA_ETAPA_ID=$(curl -sS --fail-with-body "$BASE/pipelines/$FUNIL_ID/stages" -H "$AUTH" \ | jq -r '[.data[] | select(.type == "open")][1].id // empty') # 3. Criar negócio no funil (nasce na primeira etapa). Valor em centavos: 150000 = R$ 1.500,00. NEGOCIO_ID=$(curl -sS --fail-with-body -X POST "$BASE/deals" \ -H "$AUTH" -H "Content-Type: application/json" \ -H "Idempotency-Key: $(uuidgen)" \ -d "{\"title\": \"Proposta - Maria Souza\", \"pipelineId\": \"$FUNIL_ID\", \"contactId\": \"$CONTATO_ID\", \"valueCents\": 150000}" \ | jq -r '.id') echo "Negócio: $NEGOCIO_ID" # 4. Mover para a segunda etapa (dispara as automações e os webhooks de mudança de fase). if [ -n "$SEGUNDA_ETAPA_ID" ]; then curl -sS --fail-with-body -X POST "$BASE/deals/$NEGOCIO_ID/move" \ -H "$AUTH" -H "Content-Type: application/json" \ -H "Idempotency-Key: $(uuidgen)" \ -d "{\"stageId\": \"$SEGUNDA_ETAPA_ID\"}" | jq '{id, stageId, status}' fi # 5. Listar todos os negócios abertos do funil, página por página (100 por página, o máximo). # Envie o nextCursor exatamente como veio e mantenha os mesmos filtros entre as páginas. CURSOR="" while :; do PAGINA=$(curl -sS --fail-with-body -G "$BASE/deals" -H "$AUTH" \ --data-urlencode "pipelineId=$FUNIL_ID" --data-urlencode "status=open" --data-urlencode "limit=100" \ ${CURSOR:+--data-urlencode "cursor=$CURSOR"}) echo "$PAGINA" | jq -r '.data[] | "\(.id)\t\(.title)\t\(.valueCents // "sem valor")"' [ "$(echo "$PAGINA" | jq -r '.hasMore')" = "true" ] || break CURSOR=$(echo "$PAGINA" | jq -r '.nextCursor') done # Erros vêm sempre no mesmo formato: {"error": {"type", "code", "message", "param", "requestId"}}. # 429 traz o cabeçalho Retry-After (segundos): espere e repita o pedido com a mesma Idempotency-Key.