Skip to main content

# API REST - Krayin CRM v2.1.6

API REST - Krayin CRM v2.1.6

Guia completo para instalação, configuração e uso da API REST do Krayin CRM.


📋 Índice

  1. Visão Geral
  2. Instalação
  3. Autenticação
  4. Estrutura de URLs
  5. Rate Limiting
  6. Primeiros Passos
  7. Troubleshooting

Visão Geral

A API REST do Krayin CRM é construída sobre Laravel Sanctum e fornece acesso completo a todas as entidades do CRM:

RecursoOperaçõesEndpoint Base
LeadsCRUD, Conversão/api/v1/leads
Contacts/PersonsCRUD/api/v1/contacts/persons
OrganizationsCRUD/api/v1/contacts/organizations
ProductsCRUD/api/v1/products
ActivitiesCRUD/api/v1/activities
QuotesCRUD/api/v1/quotes
WebhooksCRUD/api/v1/webhooks
TagsCRUD/api/v1/tags

Instalação

Passo 1: Instalar o Pacote da API

# Dentro do container
docker exec -it krayin bash

# Instalar pacote
composer require krayin/rest-api

Passo 2: Executar Instalação

php artisan krayin-rest-api:install

Passo 3: Configurar .env

# Adicionar ao .env
SANCTUM_STATEFUL_DOMAINS=crm.memudecore.com.br

# Para desenvolvimento local
# SANCTUM_STATEFUL_DOMAINS=localhost

Passo 4: Verificar Instalação

Acesse a documentação interativa:

https://crm.memudecore.com.br/api/admin/documentation

Autenticação

Obter Token de Acesso

curl -X POST "https://crm.memudecore.com.br/api/v1/login" \
  -H "Accept: application/json" \
  -H "Content-Type: application/x-www-form-urlencoded" \
  -d "email=admin@example.com&password=sua_senha&device_name=MeuApp"

Resposta:

{
  "token": "1|LargeRandomTokenString1234567890",
  "message": "login successfully"
}

Usar Token nas Requisições

curl -X GET "https://crm.memudecore.com.br/api/v1/leads" \
  -H "Authorization: Bearer 1|LargeRandomTokenString1234567890" \
  -H "Accept: application/json"

Características do Token

AspectoDetalhe
Formato`{id}
ValidadeAté novo login ou revogação
Múltiplos TokensCada login gera novo token, invalida anteriores
ArmazenamentoGuardar de forma segura, nunca expor no frontend

Criar Token Permanente (via Tinker)

docker exec -it krayin php artisan tinker
$user = User::where('email', 'admin@example.com')->first();
$token = $user->createToken('Integration-Token');
echo $token->plainTextToken;
// Saída: 1|abc123xyz...

Token com Expiração

// Token válido por 30 dias
$token = $user->createToken('API-Token', ['*'], now()->addDays(30));

Estrutura de URLs

Base URL

https://crm.memudecore.com.br/api/v1

Exemplos de Endpoints

OperaçãoMétodoEndpoint
LoginPOST/api/v1/login
Listar LeadsGET/api/v1/leads
Criar LeadPOST/api/v1/leads
Ver LeadGET/api/v1/leads/{id}
Atualizar LeadPUT/api/v1/leads/{id}
Deletar LeadDELETE/api/v1/leads/{id}
Converter LeadPOST/api/v1/leads/{id}/convert
DocumentaçãoGET/api/admin/documentation

⚠️ Importante

  • NÃO use /public na URL
  • NÃO use barra final (/leads/ ❌ → /leads ✅)
  • SEMPRE use HTTPS em produção

Rate Limiting

Limites Recomendados

EndpointLimiteMotivo
/api/v1/login10/minPrevenir brute force
GET /api/v1/*100/minLeituras são seguras
POST /api/v1/*50/minEscritas requerem cuidado
Default60/minSegurança geral

Headers de Rate Limit

X-RateLimit-Limit: 60
X-RateLimit-Remaining: 45
X-RateLimit-Reset: 1705425600

Resposta Quando Excede

HTTP/1.1 429 Too Many Requests

{
  "message": "Too Many Requests"
}

Configurar Rate Limiting Personalizado

Edite routes/api.php:

Route::middleware(['throttle:60,1'])->group(function () {
    Route::get('/leads', [LeadController::class, 'index']);
});

Primeiros Passos

Exemplo Completo: Criar Lead

#!/bin/bash

# 1. Obter token
TOKEN_RESPONSE=$(curl -s -X POST "https://crm.memudecore.com.br/api/v1/login" \
  -H "Content-Type: application/x-www-form-urlencoded" \
  -d "email=admin@example.com&password=admin123&device_name=Script")

TOKEN=$(echo $TOKEN_RESPONSE | jq -r '.token')
echo "Token obtido: $TOKEN"

# 2. Criar lead
curl -X POST "https://crm.memudecore.com.br/api/v1/leads" \
  -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "title": "Novo Cliente - Empresa ABC",
    "source_id": 1,
    "lead_type_id": 1,
    "sales_owner_id": 1,
    "value": 5000,
    "description": "Lead criado via API"
  }'

Exemplo JavaScript/Fetch

// Login
const loginResponse = await fetch('https://crm.memudecore.com.br/api/v1/login', {
  method: 'POST',
  headers: {
    'Content-Type': 'application/x-www-form-urlencoded',
  },
  body: 'email=admin@example.com&password=admin123&device_name=WebApp'
});

const { token } = await loginResponse.json();

// Criar Lead
const leadResponse = await fetch('https://crm.memudecore.com.br/api/v1/leads', {
  method: 'POST',
  headers: {
    'Authorization': `Bearer ${token}`,
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    title: 'Lead via JavaScript',
    source_id: 1,
    lead_type_id: 1,
    sales_owner_id: 1,
    value: 3000
  })
});

const lead = await leadResponse.json();
console.log('Lead criado:', lead);

Troubleshooting

Erro 401 Unauthorized

Causa: Token inválido ou expirado

Solução:

# Gerar novo token
curl -X POST "https://crm.memudecore.com.br/api/v1/login" \
  -d "email=admin@example.com&password=admin123"

Erro 422 Validation Error

Causa: Campos obrigatórios faltando

Resposta típica:

{
  "message": "The given data was invalid.",
  "errors": {
    "title": ["The title field is required."],
    "source_id": ["The source id field is required."]
  }
}

Erro 429 Too Many Requests

Causa: Rate limit excedido

Solução: Aguardar tempo indicado no header X-RateLimit-Reset

Erro 500 Internal Server Error

Causa: Erro no servidor

Verificar:

docker exec krayin tail -50 storage/logs/laravel.log

CORS Error (Browser)

Causa: Domínio não autorizado

Solução: Verificar config/cors.php e SANCTUM_STATEFUL_DOMAINS


📚 Documentação Relacionada

DocumentoConteúdo
API-ENDPOINTS.mdLista completa de endpoints
WEBHOOKS.mdConfiguração de webhooks
INTEGRATIONS.mdN8N, WhatsApp, Operaes

  • Documentação Oficial: https://devdocs.krayincrm.com
  • API Docs Interativo: https://crm.memudecore.com.br/api/admin/documentation
  • GitHub REST API: https://github.com/krayin/rest-api
  • Fóruns: https://forums.krayincrm.com

Última atualização: Janeiro 2026