Ligações
GET/v1/calls/quote
Cotar um destino e conferir a finalidade da ligação naquele país
Parâmetros
| Nome | Tipo | Descrição |
|---|---|---|
to obrigatório | query · string | |
purpose | query · "transactional" | "scheduling" | "support" | "marketing" | |
consent | query · "existing_customer" | "prior_express" | "written" | |
from | query · string |
Resposta 200
| Nome | Tipo | Descrição |
|---|---|---|
to obrigatório | string | Masked number |
country obrigatório | string | |
kind obrigatório | string | |
allowed obrigatório | boolean | |
minute_factor obrigatório | number | |
reason obrigatório | string | |
purpose obrigatório | object | null | |
purpose.purpose obrigatório | "transactional" | "scheduling" | "support" | "marketing" | |
purpose.allowed obrigatório | boolean | |
purpose.code obrigatório | string | |
purpose.message obrigatório | string | null | |
purpose.requires obrigatório | string[] | |
purpose.legal_reviewed obrigatório | boolean | |
simulator obrigatório | string | null |
Exemplo
curl "https://api.kanutus.com/v1/calls/quote?to=string" \
-H "Authorization: Bearer $KANUTUS_API_KEY"const res = await fetch("https://api.kanutus.com/v1/calls/quote", {
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/calls/quote",
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/calls/quoteRespostas por status
200 Destination, minute factor and whether this purpose is allowed there
{
"to": "string",
"country": "string",
"kind": "string",
"allowed": true,
"minute_factor": 0,
"reason": "string",
"purpose": {
"purpose": "transactional",
"allowed": true,
"code": "string",
"message": "string",
"requires": [
"string"
],
"legal_reviewed": true
},
"simulator": "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_…"
}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/calls
Fazer uma ligação traduzida como agente de IA (sempre se anuncia como IA) Em breve
Em produção responde 501 (em breve). Já dá para testar com uma chave kt_test_ (simulador).
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 |
|---|---|---|
to obrigatório | string | length 4–32 |
from | string | Caller ID (one of the organization's numbers) · length 0–32 |
purpose obrigatório | "transactional" | "scheduling" | "support" | "marketing" | |
consent | object | |
consent.kind obrigatório | "existing_customer" | "prior_express" | "written" | |
consent.ref | string | Your reference to the consent record · length 0–200 |
agent_lang | string | default "en" |
remote_lang | string | |
voice_id | string | length 0–100 |
Resposta 201
| Nome | Tipo | Descrição |
|---|---|---|
id obrigatório | string | |
to obrigatório | string | |
country obrigatório | string | |
purpose obrigatório | "transactional" | "scheduling" | "support" | "marketing" | |
status obrigatório | "queued" | "ringing" | "answered" | "completed" | "busy" | "voicemail" | "no_answer" | "failed" | "blocked" | |
ai_disclosure obrigatório | true | |
billed_seconds obrigatório | integer | |
created_at obrigatório | string | |
answered_at | string | null | |
ended_at | string | null | |
end_reason | string | null | agent_hangup, remote_hangup, max_duration, busy, voicemail, no_answer… |
livemode obrigatório | boolean |
Exemplo
curl -X POST "https://api.kanutus.com/v1/calls" \
-H "Authorization: Bearer $KANUTUS_API_KEY" \
-H "Idempotency-Key: $(uuidgen)" \
-H "Content-Type: application/json" \
-d '{"to":"+1 555 0100","from":"string","purpose":"transactional","consent":{"kind":"existing_customer","ref":"string"},"agent_lang":"en","remote_lang":"string","voice_id":"string"}'const res = await fetch("https://api.kanutus.com/v1/calls", {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.KANUTUS_API_KEY}`,
"Idempotency-Key": crypto.randomUUID(),
"Content-Type": "application/json",
},
body: JSON.stringify({"to":"+1 555 0100","from":"string","purpose":"transactional","consent":{"kind":"existing_customer","ref":"string"},"agent_lang":"en","remote_lang":"string","voice_id":"string"}),
});
console.log(res.status, await res.json());import os, uuid, requests
r = requests.request(
"POST",
"https://api.kanutus.com/v1/calls",
headers={"Authorization": f"Bearer {os.environ['KANUTUS_API_KEY']}", "Idempotency-Key": str(uuid.uuid4())},
json={"to":"+1 555 0100","from":"string","purpose":"transactional","consent":{"kind":"existing_customer","ref":"string"},"agent_lang":"en","remote_lang":"string","voice_id":"string"},
)
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/callsRespostas por status
201 Call created
{
"id": "string",
"to": "string",
"country": "string",
"purpose": "transactional",
"status": "queued",
"ai_disclosure": true,
"billed_seconds": 0,
"created_at": "string",
"answered_at": "string",
"ended_at": "string",
"end_reason": "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_…"
}402 Spend limit of this credential reached
{
"type": "https://docs.kanutus.com/errors",
"title": "<code>",
"status": 402,
"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_…"
}501 Not available yet in live mode (use a kt_test_ key)
{
"type": "https://docs.kanutus.com/errors",
"title": "<code>",
"status": 501,
"code": "<code>",
"message": "…",
"request_id": "req_…"
}GET/v1/calls
Ligações feitas por esta credencial
Resposta 200
| Nome | Tipo | Descrição |
|---|---|---|
data obrigatório | object[] | |
data[].id obrigatório | string | |
data[].to obrigatório | string | |
data[].country obrigatório | string | |
data[].purpose obrigatório | "transactional" | "scheduling" | "support" | "marketing" | |
data[].status obrigatório | "queued" | "ringing" | "answered" | "completed" | "busy" | "voicemail" | "no_answer" | "failed" | "blocked" | |
data[].ai_disclosure obrigatório | true | |
data[].billed_seconds obrigatório | integer | |
data[].created_at obrigatório | string | |
data[].answered_at | string | null | |
data[].ended_at | string | null | |
data[].end_reason | string | null | agent_hangup, remote_hangup, max_duration, busy, voicemail, no_answer… |
data[].livemode obrigatório | boolean |
Exemplo
curl "https://api.kanutus.com/v1/calls" \
-H "Authorization: Bearer $KANUTUS_API_KEY"const res = await fetch("https://api.kanutus.com/v1/calls", {
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/calls",
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/callsRespostas por status
200 Calls, newest first
{
"data": [
{
"id": "string",
"to": "string",
"country": "string",
"purpose": "transactional",
"status": "queued",
"ai_disclosure": true,
"billed_seconds": 0,
"created_at": "string",
"answered_at": "string",
"ended_at": "string",
"end_reason": "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_…"
}GET/v1/calls/{id}
Ler uma ligação
Parâmetros
| Nome | Tipo | Descrição |
|---|---|---|
id obrigatório | path · string |
Resposta 200
| Nome | Tipo | Descrição |
|---|---|---|
id obrigatório | string | |
to obrigatório | string | |
country obrigatório | string | |
purpose obrigatório | "transactional" | "scheduling" | "support" | "marketing" | |
status obrigatório | "queued" | "ringing" | "answered" | "completed" | "busy" | "voicemail" | "no_answer" | "failed" | "blocked" | |
ai_disclosure obrigatório | true | |
billed_seconds obrigatório | integer | |
created_at obrigatório | string | |
answered_at | string | null | |
ended_at | string | null | |
end_reason | string | null | agent_hangup, remote_hangup, max_duration, busy, voicemail, no_answer… |
livemode obrigatório | boolean |
Exemplo
curl "https://api.kanutus.com/v1/calls/call_7Hn2Qd9Wk4Lp6Rt1Xb8Mc3Zf" \
-H "Authorization: Bearer $KANUTUS_API_KEY"const res = await fetch("https://api.kanutus.com/v1/calls/call_7Hn2Qd9Wk4Lp6Rt1Xb8Mc3Zf", {
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/calls/call_7Hn2Qd9Wk4Lp6Rt1Xb8Mc3Zf",
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/calls/{id}Respostas por status
200 Call
{
"id": "string",
"to": "string",
"country": "string",
"purpose": "transactional",
"status": "queued",
"ai_disclosure": true,
"billed_seconds": 0,
"created_at": "string",
"answered_at": "string",
"ended_at": "string",
"end_reason": "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_…"
}POST/v1/calls/{id}/hangup
Desligar (idempotente: uma ligação encerrada volta como está) Em breve
Em produção responde 501 (em breve). Já dá para testar com uma chave kt_test_ (simulador).
Parâmetros
| Nome | Tipo | Descrição |
|---|---|---|
id obrigatório | path · string |
Resposta 200
| Nome | Tipo | Descrição |
|---|---|---|
id obrigatório | string | |
to obrigatório | string | |
country obrigatório | string | |
purpose obrigatório | "transactional" | "scheduling" | "support" | "marketing" | |
status obrigatório | "queued" | "ringing" | "answered" | "completed" | "busy" | "voicemail" | "no_answer" | "failed" | "blocked" | |
ai_disclosure obrigatório | true | |
billed_seconds obrigatório | integer | |
created_at obrigatório | string | |
answered_at | string | null | |
ended_at | string | null | |
end_reason | string | null | agent_hangup, remote_hangup, max_duration, busy, voicemail, no_answer… |
livemode obrigatório | boolean |
Exemplo
curl -X POST "https://api.kanutus.com/v1/calls/call_7Hn2Qd9Wk4Lp6Rt1Xb8Mc3Zf/hangup" \
-H "Authorization: Bearer $KANUTUS_API_KEY"const res = await fetch("https://api.kanutus.com/v1/calls/call_7Hn2Qd9Wk4Lp6Rt1Xb8Mc3Zf/hangup", {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.KANUTUS_API_KEY}`,
},
});
console.log(res.status, await res.json());import os, uuid, requests
r = requests.request(
"POST",
"https://api.kanutus.com/v1/calls/call_7Hn2Qd9Wk4Lp6Rt1Xb8Mc3Zf/hangup",
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.
POST /v1/calls/{id}/hangupRespostas por status
200 The call, ended
{
"id": "string",
"to": "string",
"country": "string",
"purpose": "transactional",
"status": "queued",
"ai_disclosure": true,
"billed_seconds": 0,
"created_at": "string",
"answered_at": "string",
"ended_at": "string",
"end_reason": "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_…"
}POST/v1/calls/{id}/dtmf
Apertar teclas do telefone (DTMF) em menus como "tecle 2 para vendas": 0-9, * e #, até 32 Em breve
Em produção responde 501 (em breve). Já dá para testar com uma chave kt_test_ (simulador).
Parâmetros
| Nome | Tipo | Descrição |
|---|---|---|
id obrigatório | path · string |
Corpo da requisição
| Nome | Tipo | Descrição |
|---|---|---|
digits obrigatório | string | 0-9, * and #; spaces and dashes are ignored · length 1–64 |
Resposta 200
| Nome | Tipo | Descrição |
|---|---|---|
id obrigatório | string | |
sent obrigatório | string | |
status obrigatório | "queued" | "ringing" | "answered" | "completed" | "busy" | "voicemail" | "no_answer" | "failed" | "blocked" | |
livemode obrigatório | boolean |
Exemplo
curl -X POST "https://api.kanutus.com/v1/calls/call_7Hn2Qd9Wk4Lp6Rt1Xb8Mc3Zf/dtmf" \
-H "Authorization: Bearer $KANUTUS_API_KEY" \
-H "Content-Type: application/json" \
-d '{"digits":"2#"}'const res = await fetch("https://api.kanutus.com/v1/calls/call_7Hn2Qd9Wk4Lp6Rt1Xb8Mc3Zf/dtmf", {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.KANUTUS_API_KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify({"digits":"2#"}),
});
console.log(res.status, await res.json());import os, uuid, requests
r = requests.request(
"POST",
"https://api.kanutus.com/v1/calls/call_7Hn2Qd9Wk4Lp6Rt1Xb8Mc3Zf/dtmf",
headers={"Authorization": f"Bearer {os.environ['KANUTUS_API_KEY']}"},
json={"digits":"2#"},
)
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/calls/{id}/dtmfRespostas por status
200 Keys sent
{
"id": "string",
"sent": "string",
"status": "queued",
"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_…"
}