REST API · v1 · Estável

Agendamentos
sob seu controle.

Integre agendamentos ao seu software, app ou CRM com a API REST do Agendaki. Autenticação por chave, webhooks em tempo real, SDKs para as principais linguagens.

Exemplo rápido
curl https://api.agendaki.app/v1/availability \
  -H "Authorization: Bearer ak_live_••••••••" \
  -d professional_id=prof_abc123 \
  -d service_id=svc_xyz789 \
  -d date=2026-05-10

{
  "ok": true,
  "slots": [
    { "time": "09:00", "available": true },
    { "time": "09:30", "available": true },
    { "time": "10:00", "available": false },
    { "time": "10:30", "available": true }
  ]
}
99.9%
Uptime SLA
< 80ms
P95 latência
12
Endpoints REST
SHA-256 + HMAC
Auth

Sua primeira chamada em 3 minutos

1

Crie uma API key

No dashboard, vá em Configurações → API e clique em Nova chave. Escolha os escopos e copie a chave — ela só aparece uma vez.

2

Faça sua primeira chamada

Use a chave no header Authorization como Bearer token. Todas as rotas são HTTPS-only.

3

Configure webhooks

Receba eventos em tempo real quando um agendamento for criado, cancelado ou remarcado. Sem polling.

bash
# Teste de conectividade — busca slots disponíveis
curl https://api.agendaki.app/v1/availability \
  -H "Authorization: Bearer ak_live_YOUR_KEY_HERE" \
  -G \
  --data-urlencode "professional_id=PROF_ID" \
  --data-urlencode "service_id=SERVICE_ID" \
  --data-urlencode "date=2026-05-10"

# Cria um agendamento
curl -X POST https://api.agendaki.app/v1/appointments \
  -H "Authorization: Bearer ak_live_YOUR_KEY_HERE" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: $(uuidgen)" \
  -d '{
    "professional_id": "PROF_ID",
    "service_id": "SERVICE_ID",
    "customer": {
      "name": "João Silva",
      "phone": "+55 11 91234-5678"
    },
    "starts_at": "2026-05-10T09:00:00-03:00"
  }'

API Keys + Bearer Token

Toda chamada precisa de um header Authorization: Bearer <sua-chave>. Chaves de produção começam com ak_live_ e de teste com ak_test_.

Armazenamento seguro

Nunca armazenamos sua chave em texto plano — apenas o hash SHA-256. Guarde sua chave como um segredo.

Escopos por plano

Cada chave tem um conjunto de escopos (appointments:read, appointments:write, etc.) configurado na criação.

http
GET /v1/availability HTTP/1.1
Host: api.agendaki.app
Authorization: Bearer ak_live_4xKj9mRzQp8nVs2wYe3bDcFgHjKm
Content-Type: application/json
PlanoChaves ativasRate limitEscopos disponíveis
Free130 req/minavailability:read, appointments:read
Starter260 req/min+ appointments:write, customers:read
Pro5300 req/min+ customers:write, professionals:read, services:read
Business1 000 req/minTodos os escopos + webhooks:manage
Enterprise1 000 req/minTodos os escopos + SLA dedicado
Base URLhttps://api.agendaki.app/v1
Todas as respostas são JSON · TLS 1.2+ obrigatório

Referência da API

Disponibilidade
GET/availability
Lista slots livres de um profissional em uma data ou período (máx. 14 dias)availability:read
json
// GET /v1/availability?professional_id=X&service_id=Y&date=2026-05-10
{
  "ok": true,
  "date": "2026-05-10",
  "slots": [
    { "time": "09:00", "starts_at": "2026-05-10T09:00:00-03:00", "available": true,  "duration_min": 60 },
    { "time": "10:00", "starts_at": "2026-05-10T10:00:00-03:00", "available": false, "duration_min": 60 },
    { "time": "11:00", "starts_at": "2026-05-10T11:00:00-03:00", "available": true,  "duration_min": 60 }
  ]
}
Agendamentos
GET/appointments
Lista agendamentos com filtros e paginação por cursorappointments:read
POST/appointments
Cria um agendamento. Idempotência via Idempotency-Key headerappointments:write
GET/appointments/:id
Detalhes de um agendamento específicoappointments:read
PATCH/appointments/:id
Atualiza status (confirmed / completed / cancelled / no_show)appointments:write
json
// POST /v1/appointments
// Header: Idempotency-Key: <uuid>
{
  "professional_id": "prof_abc123",
  "service_id":      "svc_xyz789",
  "customer": {
    "name":  "Maria Oliveira",
    "phone": "+55 11 91234-5678",
    "email": "maria@email.com"   // opcional
  },
  "starts_at": "2026-05-10T14:00:00-03:00",
  "notes": "Trazer exames anteriores" // opcional
}

// 201 Created
{
  "ok": true,
  "appointment": {
    "id":         "appt_8fKq2m",
    "status":     "confirmed",
    "starts_at":  "2026-05-10T14:00:00-03:00",
    "ends_at":    "2026-05-10T15:00:00-03:00",
    "customer":   { "id": "cust_7gJp1n", "name": "Maria Oliveira" },
    "professional": { "id": "prof_abc123", "name": "Dr. Carlos" },
    "service":    { "id": "svc_xyz789", "name": "Consulta inicial", "price_cents": 25000 }
  }
}
Clientes
GET/customers
Busca clientes por nome, telefone ou e-mailcustomers:read
POST/customers
Cria ou atualiza cliente por telefone (upsert)customers:write
GET/customers/:id
Perfil do cliente com últimos 5 agendamentoscustomers:read
PATCH/customers/:id
Atualiza name, email, notes, custom_fieldscustomers:write
Profissionais & Serviços
GET/professionals
Lista profissionais ativos com seus serviçosprofessionals:read
GET/services
Lista serviços ativos da empresaservices:read

Eventos em tempo real

Configure um endpoint HTTPS e receba eventos JSON assim que algo acontece — sem precisar fazer polling. Cada entrega inclui um header de assinatura HMAC-SHA256 para você verificar a autenticidade.

appointment.createdNovo agendamento confirmado
appointment.cancelledAgendamento cancelado
appointment.rescheduledData/hora alterada
appointment.completedMarcado como concluído
appointment.no_showCliente não compareceu
customer.createdNovo cliente cadastrado
typescript
// Verificação de assinatura (Node.js / Edge)
import { createHmac } from "crypto";

export function verifyWebhook(
  rawBody: string,
  signature: string,  // header X-Agendaki-Signature
  secret:    string,
): boolean {
  const expected = createHmac("sha256", secret)
    .update(rawBody)
    .digest("hex");
  // timing-safe comparison
  return expected === signature;
}

// Handler de exemplo (Next.js Route Handler)
export async function POST(req: Request) {
  const rawBody  = await req.text();
  const sig      = req.headers.get("X-Agendaki-Signature") ?? "";
  const verified = verifyWebhook(rawBody, sig, process.env.WEBHOOK_SECRET!);

  if (!verified) return new Response("Unauthorized", { status: 401 });

  const event = JSON.parse(rawBody);
  switch (event.type) {
    case "appointment.created":
      await handleNewAppointment(event.data);
      break;
    case "appointment.cancelled":
      await handleCancellation(event.data);
      break;
  }

  return new Response("ok");
}

Códigos de erro

Todos os erros seguem um formato consistente com ok: false, um code legível por máquina e uma message em português.

json
// Exemplo de resposta de erro
{
  "ok":      false,
  "code":    "SLOT_UNAVAILABLE",
  "message": "O horário solicitado não está mais disponível.",
  "details": {
    "starts_at": "2026-05-10T14:00:00-03:00"
  }
}
HTTPcodeDescrição
400INVALID_PARAMParâmetro malformado ou ausente
401UNAUTHORIZEDChave inválida, revogada ou ausente
403FORBIDDENEscopo insuficiente para esta operação
404NOT_FOUNDRecurso não encontrado
409SLOT_UNAVAILABLEHorário já ocupado no momento da reserva
422INVALID_PARAMValidação semântica falhou
429RATE_LIMITEDLimite de requisições atingido
500INTERNAL_ERRORErro interno — tentativa com back-off exponencial

Controle de tráfego

Rate limiting por chave de API usando token bucket. Quando atingido, a resposta é 429 Too Many Requests com headers indicando quando você pode tentar novamente.

http
HTTP/1.1 429 Too Many Requests
X-RateLimit-Limit:     300
X-RateLimit-Remaining: 0
X-RateLimit-Reset:     1746892800
Retry-After:           12

{
  "ok":      false,
  "code":    "RATE_LIMITED",
  "message": "Limite de requisições atingido. Tente novamente em 12 segundos."
}

Cursor-based pagination

Endpoints de listagem usam paginação por cursor para resultados consistentes e performáticos. Envie cursor e limit (máx. 100) como query params.

json
// GET /v1/appointments?limit=50&cursor=eyJpZCI6...
{
  "ok":   true,
  "data": [ /* ... 50 agendamentos ... */ ],
  "meta": {
    "total":       1240,
    "has_more":    true,
    "next_cursor": "eyJpZCI6Ijg5MDEyMzQ1LTY3ODktYWJjZCJ9",
    "prev_cursor": null
  }
}

Bibliotecas oficiais

Node.js / TypeScriptstable
npm install @agendaki/sdk
import { AgendakiClient } from "@agendaki/sdk";

const agendaki = new AgendakiClient({
  apiKey: process.env.AGENDAKI_API_KEY,
});

const slots = await agendaki.availability.list({
  professionalId: "prof_abc123",
  serviceId:      "svc_xyz789",
  date:           "2026-05-10",
});
Pythonbeta
pip install agendaki
from agendaki import AgendakiClient

client = AgendakiClient(api_key=os.environ["AGENDAKI_API_KEY"])

slots = client.availability.list(
    professional_id="prof_abc123",
    service_id="svc_xyz789",
    date="2026-05-10",
)

Pronto para integrar?

Crie sua conta grátis, gere uma chave de API e faça sua primeira chamada em menos de 5 minutos.

14 dias grátisSem cartãoSuporte por WhatsApp