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.
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 }
]
}No dashboard, vá em Configurações → API e clique em Nova chave. Escolha os escopos e copie a chave — ela só aparece uma vez.
Use a chave no header Authorization como Bearer token. Todas as rotas são HTTPS-only.
Receba eventos em tempo real quando um agendamento for criado, cancelado ou remarcado. Sem polling.
# 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"
}'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_.
Nunca armazenamos sua chave em texto plano — apenas o hash SHA-256. Guarde sua chave como um segredo.
Cada chave tem um conjunto de escopos (appointments:read, appointments:write, etc.) configurado na criação.
GET /v1/availability HTTP/1.1
Host: api.agendaki.app
Authorization: Bearer ak_live_4xKj9mRzQp8nVs2wYe3bDcFgHjKm
Content-Type: application/json| Plano | Chaves ativas | Rate limit | Escopos disponíveis |
|---|---|---|---|
| Free | 1 | 30 req/min | availability:read, appointments:read |
| Starter | 2 | 60 req/min | + appointments:write, customers:read |
| Pro | 5 | 300 req/min | + customers:write, professionals:read, services:read |
| Business | ∞ | 1 000 req/min | Todos os escopos + webhooks:manage |
| Enterprise | ∞ | 1 000 req/min | Todos os escopos + SLA dedicado |
/availability// 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 }
]
}/appointments/appointments/appointments/:id/appointments/:id// 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 }
}
}/customers/customers/customers/:id/customers/:id/professionals/servicesConfigure 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 confirmadoappointment.cancelledAgendamento canceladoappointment.rescheduledData/hora alteradaappointment.completedMarcado como concluídoappointment.no_showCliente não compareceucustomer.createdNovo cliente cadastrado// 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");
}Todos os erros seguem um formato consistente com ok: false, um code legível por máquina e uma message em português.
// 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"
}
}| HTTP | code | Descrição |
|---|---|---|
| 400 | INVALID_PARAM | Parâmetro malformado ou ausente |
| 401 | UNAUTHORIZED | Chave inválida, revogada ou ausente |
| 403 | FORBIDDEN | Escopo insuficiente para esta operação |
| 404 | NOT_FOUND | Recurso não encontrado |
| 409 | SLOT_UNAVAILABLE | Horário já ocupado no momento da reserva |
| 422 | INVALID_PARAM | Validação semântica falhou |
| 429 | RATE_LIMITED | Limite de requisições atingido |
| 500 | INTERNAL_ERROR | Erro interno — tentativa com back-off exponencial |
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/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."
}Endpoints de listagem usam paginação por cursor para resultados consistentes e performáticos. Envie cursor e limit (máx. 100) como query params.
// GET /v1/appointments?limit=50&cursor=eyJpZCI6...
{
"ok": true,
"data": [ /* ... 50 agendamentos ... */ ],
"meta": {
"total": 1240,
"has_more": true,
"next_cursor": "eyJpZCI6Ijg5MDEyMzQ1LTY3ODktYWJjZCJ9",
"prev_cursor": null
}
}npm install @agendaki/sdkimport { 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",
});pip install agendakifrom 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",
)Crie sua conta grátis, gere uma chave de API e faça sua primeira chamada em menos de 5 minutos.