Reuniões e agendamento
GET/v1/meetings
Listar reuniões agendadas
Parâmetros
| Nome | Tipo | Descrição |
|---|---|---|
from | query · string | |
to | query · string | |
limit | query · integer |
Resposta 200
| Nome | Tipo | Descrição |
|---|---|---|
data obrigatório | object[] | |
data[].id obrigatório | string | |
data[].url obrigatório | string | |
data[].title obrigatório | string | |
data[].visibility obrigatório | "private" | "public" | |
data[].status obrigatório | "scheduled" | "live" | "ended" | |
data[].created_at obrigatório | string | |
data[].expires_at obrigatório | string | |
data[].starts_at obrigatório | string | null | |
data[].duration_min obrigatório | integer | null | |
data[].invitees obrigatório | string[] | |
data[].langs obrigatório | string[] | |
data[].livemode obrigatório | boolean | false for objects created with a kt_test_ key (simulator). |
Exemplo
curl "https://api.kanutus.com/v1/meetings" \
-H "Authorization: Bearer $KANUTUS_API_KEY"const res = await fetch("https://api.kanutus.com/v1/meetings", {
method: "GET",
headers: {
Authorization: `Bearer ${process.env.KANUTUS_API_KEY}`,
},
});
console.log(res.status, await res.json());import os, uuid, requests
r = requests.request(
"GET",
"https://api.kanutus.com/v1/meetings",
headers={"Authorization": f"Bearer {os.environ['KANUTUS_API_KEY']}"},
)
print(r.status_code, r.json())Testar agora
Roda no seu navegador contra a API de verdade. Use uma chave kt_test_: nada é cobrado. A chave fica só nesta aba.
GET /v1/meetingsRespostas por status
200 Meetings by start time
{
"data": [
{
"id": "kqz-mbdt-wpa",
"url": "https://example.com",
"title": "string",
"visibility": "private",
"status": "scheduled",
"created_at": "string",
"expires_at": "string",
"starts_at": "string",
"duration_min": 0,
"invitees": [
"string"
],
"langs": [
"string"
],
"livemode": true
}
]
}400 Invalid request
{
"type": "https://docs.kanutus.com/errors",
"title": "<code>",
"status": 400,
"code": "<code>",
"message": "…",
"request_id": "req_…"
}401 Missing, invalid, expired or revoked credential
{
"type": "https://docs.kanutus.com/errors",
"title": "<code>",
"status": 401,
"code": "<code>",
"message": "…",
"request_id": "req_…"
}403 Missing permission, blocked or not allowed
{
"type": "https://docs.kanutus.com/errors",
"title": "<code>",
"status": 403,
"code": "<code>",
"message": "…",
"request_id": "req_…"
}429 Rate limit exceeded (see RateLimit-* and Retry-After headers)
{
"type": "https://docs.kanutus.com/errors",
"title": "<code>",
"status": 429,
"code": "<code>",
"message": "…",
"request_id": "req_…"
}POST/v1/meetings
Agendar uma reunião (sala com data, convidados e línguas)
Parâmetros
| Nome | Tipo | Descrição |
|---|---|---|
idempotency-key obrigatório | header · string | Unique key per create request; retries with the same key return the same result. |
Corpo da requisição
| Nome | Tipo | Descrição |
|---|---|---|
title obrigatório | string | length 1–120 |
starts_at obrigatório | string | |
duration_min | integer | 5…720 · default 30 |
invitees | string[] | |
langs | string[] | Languages of the participants, e.g. ["pt", "ja"]. |
visibility | "private" | "public" | default "private" |
Resposta 201
| Nome | Tipo | Descrição |
|---|---|---|
id obrigatório | string | |
url obrigatório | string | |
title obrigatório | string | |
visibility obrigatório | "private" | "public" | |
status obrigatório | "scheduled" | "live" | "ended" | |
created_at obrigatório | string | |
expires_at obrigatório | string | |
starts_at obrigatório | string | null | |
duration_min obrigatório | integer | null | |
invitees obrigatório | string[] | |
langs obrigatório | string[] | |
livemode obrigatório | boolean | false for objects created with a kt_test_ key (simulator). |
Exemplo
curl -X POST "https://api.kanutus.com/v1/meetings" \
-H "Authorization: Bearer $KANUTUS_API_KEY" \
-H "Idempotency-Key: $(uuidgen)" \
-H "Content-Type: application/json" \
-d '{"title":"Revisão com Kenji","starts_at":"2026-10-12T13:00:00-03:00","duration_min":30,"invitees":[],"langs":[],"visibility":"private"}'const res = await fetch("https://api.kanutus.com/v1/meetings", {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.KANUTUS_API_KEY}`,
"Idempotency-Key": crypto.randomUUID(),
"Content-Type": "application/json",
},
body: JSON.stringify({"title":"Revisão com Kenji","starts_at":"2026-10-12T13:00:00-03:00","duration_min":30,"invitees":[],"langs":[],"visibility":"private"}),
});
console.log(res.status, await res.json());import os, uuid, requests
r = requests.request(
"POST",
"https://api.kanutus.com/v1/meetings",
headers={"Authorization": f"Bearer {os.environ['KANUTUS_API_KEY']}", "Idempotency-Key": str(uuid.uuid4())},
json={"title":"Revisão com Kenji","starts_at":"2026-10-12T13:00:00-03:00","duration_min":30,"invitees":[],"langs":[],"visibility":"private"},
)
print(r.status_code, r.json())Testar agora
Roda no seu navegador contra a API de verdade. Use uma chave kt_test_: nada é cobrado. A chave fica só nesta aba.
POST /v1/meetingsRespostas por status
201 Meeting scheduled; share url with invitees
{
"id": "kqz-mbdt-wpa",
"url": "https://example.com",
"title": "string",
"visibility": "private",
"status": "scheduled",
"created_at": "string",
"expires_at": "string",
"starts_at": "string",
"duration_min": 0,
"invitees": [
"string"
],
"langs": [
"string"
],
"livemode": true
}400 Invalid request
{
"type": "https://docs.kanutus.com/errors",
"title": "<code>",
"status": 400,
"code": "<code>",
"message": "…",
"request_id": "req_…"
}401 Missing, invalid, expired or revoked credential
{
"type": "https://docs.kanutus.com/errors",
"title": "<code>",
"status": 401,
"code": "<code>",
"message": "…",
"request_id": "req_…"
}403 Missing permission, blocked or not allowed
{
"type": "https://docs.kanutus.com/errors",
"title": "<code>",
"status": 403,
"code": "<code>",
"message": "…",
"request_id": "req_…"
}409 Conflict (idempotency or state)
{
"type": "https://docs.kanutus.com/errors",
"title": "<code>",
"status": 409,
"code": "<code>",
"message": "…",
"request_id": "req_…"
}429 Rate limit exceeded (see RateLimit-* and Retry-After headers)
{
"type": "https://docs.kanutus.com/errors",
"title": "<code>",
"status": 429,
"code": "<code>",
"message": "…",
"request_id": "req_…"
}DELETE/v1/meetings/{id}
Cancelar uma reunião agendada
Parâmetros
| Nome | Tipo | Descrição |
|---|---|---|
id obrigatório | path · string |
Resposta 200
| Nome | Tipo | Descrição |
|---|---|---|
id obrigatório | string | |
url obrigatório | string | |
title obrigatório | string | |
visibility obrigatório | "private" | "public" | |
status obrigatório | "scheduled" | "live" | "ended" | |
created_at obrigatório | string | |
expires_at obrigatório | string | |
starts_at obrigatório | string | null | |
duration_min obrigatório | integer | null | |
invitees obrigatório | string[] | |
langs obrigatório | string[] | |
livemode obrigatório | boolean | false for objects created with a kt_test_ key (simulator). |
Exemplo
curl -X DELETE "https://api.kanutus.com/v1/meetings/kqz-mbdt-wpa" \
-H "Authorization: Bearer $KANUTUS_API_KEY"const res = await fetch("https://api.kanutus.com/v1/meetings/kqz-mbdt-wpa", {
method: "DELETE",
headers: {
Authorization: `Bearer ${process.env.KANUTUS_API_KEY}`,
},
});
console.log(res.status, await res.json());import os, uuid, requests
r = requests.request(
"DELETE",
"https://api.kanutus.com/v1/meetings/kqz-mbdt-wpa",
headers={"Authorization": f"Bearer {os.environ['KANUTUS_API_KEY']}"},
)
print(r.status_code, r.json())Testar agora
Roda no seu navegador contra a API de verdade. Use uma chave kt_test_: nada é cobrado. A chave fica só nesta aba.
DELETE /v1/meetings/{id}Respostas por status
200 Canceled
{
"id": "kqz-mbdt-wpa",
"url": "https://example.com",
"title": "string",
"visibility": "private",
"status": "scheduled",
"created_at": "string",
"expires_at": "string",
"starts_at": "string",
"duration_min": 0,
"invitees": [
"string"
],
"langs": [
"string"
],
"livemode": true
}400 Invalid request
{
"type": "https://docs.kanutus.com/errors",
"title": "<code>",
"status": 400,
"code": "<code>",
"message": "…",
"request_id": "req_…"
}401 Missing, invalid, expired or revoked credential
{
"type": "https://docs.kanutus.com/errors",
"title": "<code>",
"status": 401,
"code": "<code>",
"message": "…",
"request_id": "req_…"
}403 Missing permission, blocked or not allowed
{
"type": "https://docs.kanutus.com/errors",
"title": "<code>",
"status": 403,
"code": "<code>",
"message": "…",
"request_id": "req_…"
}404 Not found
{
"type": "https://docs.kanutus.com/errors",
"title": "<code>",
"status": 404,
"code": "<code>",
"message": "…",
"request_id": "req_…"
}429 Rate limit exceeded (see RateLimit-* and Retry-After headers)
{
"type": "https://docs.kanutus.com/errors",
"title": "<code>",
"status": 429,
"code": "<code>",
"message": "…",
"request_id": "req_…"
}GET/v1/event-types
Listar seus links de agendamento (tipos de evento)
Resposta 200
| Nome | Tipo | Descrição |
|---|---|---|
data obrigatório | object[] | |
data[].id obrigatório | string | |
data[].title obrigatório | string | |
data[].duration_min obrigatório | integer | |
data[].page obrigatório | string | Booking page slug (person or team) |
data[].slug obrigatório | string | |
data[].url obrigatório | string | |
data[].active obrigatório | boolean |
Exemplo
curl "https://api.kanutus.com/v1/event-types" \
-H "Authorization: Bearer $KANUTUS_API_KEY"const res = await fetch("https://api.kanutus.com/v1/event-types", {
method: "GET",
headers: {
Authorization: `Bearer ${process.env.KANUTUS_API_KEY}`,
},
});
console.log(res.status, await res.json());import os, uuid, requests
r = requests.request(
"GET",
"https://api.kanutus.com/v1/event-types",
headers={"Authorization": f"Bearer {os.environ['KANUTUS_API_KEY']}"},
)
print(r.status_code, r.json())Testar agora
Roda no seu navegador contra a API de verdade. Use uma chave kt_test_: nada é cobrado. A chave fica só nesta aba.
GET /v1/event-typesRespostas por status
200 Event types
{
"data": [
{
"id": "string",
"title": "string",
"duration_min": 0,
"page": "paulo",
"slug": "30min",
"url": "https://example.com",
"active": true
}
]
}400 Invalid request
{
"type": "https://docs.kanutus.com/errors",
"title": "<code>",
"status": 400,
"code": "<code>",
"message": "…",
"request_id": "req_…"
}401 Missing, invalid, expired or revoked credential
{
"type": "https://docs.kanutus.com/errors",
"title": "<code>",
"status": 401,
"code": "<code>",
"message": "…",
"request_id": "req_…"
}403 Missing permission, blocked or not allowed
{
"type": "https://docs.kanutus.com/errors",
"title": "<code>",
"status": 403,
"code": "<code>",
"message": "…",
"request_id": "req_…"
}429 Rate limit exceeded (see RateLimit-* and Retry-After headers)
{
"type": "https://docs.kanutus.com/errors",
"title": "<code>",
"status": 429,
"code": "<code>",
"message": "…",
"request_id": "req_…"
}GET/v1/event-types/{id}/slots
Horários livres de um link de agendamento
Parâmetros
| Nome | Tipo | Descrição |
|---|---|---|
id obrigatório | path · string | |
from | query · string | |
to | query · string |
Resposta 200
| Nome | Tipo | Descrição |
|---|---|---|
tz obrigatório | string | Host time zone |
duration_min obrigatório | integer | |
slots obrigatório | string[] | Free start times (ISO 8601, UTC) |
full_days obrigatório | string[] |
Exemplo
curl "https://api.kanutus.com/v1/event-types/8f14e45f-ceea-4c8e-9b3a-2f1d5a7c3b10/slots" \
-H "Authorization: Bearer $KANUTUS_API_KEY"const res = await fetch("https://api.kanutus.com/v1/event-types/8f14e45f-ceea-4c8e-9b3a-2f1d5a7c3b10/slots", {
method: "GET",
headers: {
Authorization: `Bearer ${process.env.KANUTUS_API_KEY}`,
},
});
console.log(res.status, await res.json());import os, uuid, requests
r = requests.request(
"GET",
"https://api.kanutus.com/v1/event-types/8f14e45f-ceea-4c8e-9b3a-2f1d5a7c3b10/slots",
headers={"Authorization": f"Bearer {os.environ['KANUTUS_API_KEY']}"},
)
print(r.status_code, r.json())Testar agora
Roda no seu navegador contra a API de verdade. Use uma chave kt_test_: nada é cobrado. A chave fica só nesta aba.
GET /v1/event-types/{id}/slotsRespostas por status
200 Free start times
{
"tz": "string",
"duration_min": 0,
"slots": [
"string"
],
"full_days": [
"string"
]
}400 Invalid request
{
"type": "https://docs.kanutus.com/errors",
"title": "<code>",
"status": 400,
"code": "<code>",
"message": "…",
"request_id": "req_…"
}401 Missing, invalid, expired or revoked credential
{
"type": "https://docs.kanutus.com/errors",
"title": "<code>",
"status": 401,
"code": "<code>",
"message": "…",
"request_id": "req_…"
}403 Missing permission, blocked or not allowed
{
"type": "https://docs.kanutus.com/errors",
"title": "<code>",
"status": 403,
"code": "<code>",
"message": "…",
"request_id": "req_…"
}404 Not found
{
"type": "https://docs.kanutus.com/errors",
"title": "<code>",
"status": 404,
"code": "<code>",
"message": "…",
"request_id": "req_…"
}429 Rate limit exceeded (see RateLimit-* and Retry-After headers)
{
"type": "https://docs.kanutus.com/errors",
"title": "<code>",
"status": 429,
"code": "<code>",
"message": "…",
"request_id": "req_…"
}POST/v1/bookings
Agendar um horário num link (seu ou de outra pessoa)
Parâmetros
| Nome | Tipo | Descrição |
|---|---|---|
idempotency-key obrigatório | header · string | Unique key per create request; retries with the same key return the same result. |
Corpo da requisição
| Nome | Tipo | Descrição |
|---|---|---|
event_type_id | string | |
page | string | Booking page slug, when booking someone else's link |
event | string | Event slug on that page |
start obrigatório | string | |
guest obrigatório | object | |
guest.name obrigatório | string | length 1–80 |
guest.email obrigatório | string | length 0–254 |
guest.speak obrigatório | string | |
guest.hear | string | |
guest.tz | string | length 0–64 · default "UTC" |
guest.locale | string | length 0–8 · default "en" |
answers | object |
Resposta 201
| Nome | Tipo | Descrição |
|---|---|---|
id obrigatório | string | |
room_url obrigatório | string | null | |
manage_url obrigatório | string | null | |
start obrigatório | string | |
livemode obrigatório | boolean |
Exemplo
curl -X POST "https://api.kanutus.com/v1/bookings" \
-H "Authorization: Bearer $KANUTUS_API_KEY" \
-H "Idempotency-Key: $(uuidgen)" \
-H "Content-Type: application/json" \
-d '{"event_type_id":"string","page":"string","event":"string","start":"2026-10-14T13:00:00Z","guest":{"name":"string","email":"ana@example.com","speak":"ja","hear":"string","tz":"UTC","locale":"en"},"answers":{}}'const res = await fetch("https://api.kanutus.com/v1/bookings", {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.KANUTUS_API_KEY}`,
"Idempotency-Key": crypto.randomUUID(),
"Content-Type": "application/json",
},
body: JSON.stringify({"event_type_id":"string","page":"string","event":"string","start":"2026-10-14T13:00:00Z","guest":{"name":"string","email":"ana@example.com","speak":"ja","hear":"string","tz":"UTC","locale":"en"},"answers":{}}),
});
console.log(res.status, await res.json());import os, uuid, requests
r = requests.request(
"POST",
"https://api.kanutus.com/v1/bookings",
headers={"Authorization": f"Bearer {os.environ['KANUTUS_API_KEY']}", "Idempotency-Key": str(uuid.uuid4())},
json={"event_type_id":"string","page":"string","event":"string","start":"2026-10-14T13:00:00Z","guest":{"name":"string","email":"ana@example.com","speak":"ja","hear":"string","tz":"UTC","locale":"en"},"answers":{}},
)
print(r.status_code, r.json())Testar agora
Roda no seu navegador contra a API de verdade. Use uma chave kt_test_: nada é cobrado. A chave fica só nesta aba.
POST /v1/bookingsRespostas por status
201 Booked; the room is created with the guest's language and invitations are emailed
{
"id": "string",
"room_url": "https://example.com",
"manage_url": "https://example.com",
"start": "string",
"livemode": true
}400 Invalid request
{
"type": "https://docs.kanutus.com/errors",
"title": "<code>",
"status": 400,
"code": "<code>",
"message": "…",
"request_id": "req_…"
}401 Missing, invalid, expired or revoked credential
{
"type": "https://docs.kanutus.com/errors",
"title": "<code>",
"status": 401,
"code": "<code>",
"message": "…",
"request_id": "req_…"
}403 Missing permission, blocked or not allowed
{
"type": "https://docs.kanutus.com/errors",
"title": "<code>",
"status": 403,
"code": "<code>",
"message": "…",
"request_id": "req_…"
}404 Not found
{
"type": "https://docs.kanutus.com/errors",
"title": "<code>",
"status": 404,
"code": "<code>",
"message": "…",
"request_id": "req_…"
}409 Conflict (idempotency or state)
{
"type": "https://docs.kanutus.com/errors",
"title": "<code>",
"status": 409,
"code": "<code>",
"message": "…",
"request_id": "req_…"
}429 Rate limit exceeded (see RateLimit-* and Retry-After headers)
{
"type": "https://docs.kanutus.com/errors",
"title": "<code>",
"status": 429,
"code": "<code>",
"message": "…",
"request_id": "req_…"
}