Endpoints
GET/api/partner/v1/me
O partner da chave, os limites e a própria chave.
Útil para verificar a ligação e saber quantos convites ainda cabem nas últimas 24 horas.
Exemplo
curl https://rioko.online/api/partner/v1/me \
-H "Authorization: Bearer rkp_live_3f9c…"
Resposta · 200
{
"partner": { "id": "exemplo", "name": "Exemplo Lda", "status": "active" },
"landing_url": "https://rioko.online/pt/p/exemplo",
"limits": {
"invites_per_request": 50,
"invites_per_24h": 200,
"invites_left_24h": 187,
"page_max": 100
},
"key": { "label": "Plataforma produção", "expires_at": "2027-09-17T10:00:00.000Z" }
}
Erros possíveis
missing_keyinvalid_keypartner_inactivemethod_not_allowed
POST/api/partner/v1/invites
Convida clientes por email.
Cada convite é um email com um link único (válido 30 dias e de uso único) para a página do partner na Rioko, onde o cliente cria conta ou entra, aceita as condições e escolhe se dá acesso ao partner.
Se o cliente aceitar a partir de um email verificado igual ao do convite, fica confirmado de imediato. Se aceitar com outro email, fica pendente e o partner confirma-o no portal.
Com send_email a false a Rioko não envia o email: a resposta traz o invite_url e é a sua plataforma que o entrega. O convite conta na mesma para os limites.
O invite_url só vem na resposta que cria o convite. Um pedido repetido com o mesmo external_ref e o mesmo email responde exists, sem link e sem novo email.
Um endereço que já é cliente de outro partner na Rioko responde sent como qualquer outro, mas não recebe email: nenhuma resposta da API revela quem já usa a Rioko.
Parâmetros
| Campo | Tipo | Obrigatório | Regras |
|---|
| invites | array | sim | 1 a 50 elementos. |
| invites[].email | string | sim | Um endereço de email. É guardado em minúsculas. |
| invites[].external_ref | string | não | O id do cliente na sua plataforma, até 128 caracteres. Único por partner entre ligações que não terminaram. |
| send_email | boolean | não | Por omissão true. |
Exemplo
curl -X POST https://rioko.online/api/partner/v1/invites \
-H "Authorization: Bearer rkp_live_3f9c…" \
-H "Content-Type: application/json" \
-d @convites.json
Pedido
{
"invites": [
{ "email": "[email protected]", "external_ref": "acad_1042" },
{ "email": "[email protected]", "external_ref": "acad_1043" }
],
"send_email": true
}
Resposta · 201 se criou pelo menos um convite, 200 se não
{
"results": [
{
"email": "[email protected]",
"external_ref": "acad_1042",
"status": "sent",
"id": "6f1c2d0e-8a4b-4f3e-9b8e-2c1d5e7a9b10",
"invite_url": "https://rioko.online/pt/p/exemplo/exemplo-3fa91c0e5b7d2a8f4c6e1b09",
"expires_at": "2026-10-17T10:00:00.000Z"
},
{
"email": "[email protected]",
"external_ref": "acad_1043",
"status": "exists",
"id": "9b2e7a4c-1d3f-4e5a-8b6c-0d9e2f1a3b4c"
}
],
"invites_left_24h": 186
}
Erros possíveis
invalid_requesttoo_many_invitesmissing_keyinvalid_keypartner_inactive
GET/api/partner/v1/invites
Os convites enviados, do mais recente para o mais antigo.
Nunca devolve tokens nem links. status é open, expired, accepted ou revoked.
Parâmetros
| Parâmetro | Tipo | Obrigatório | Regras |
|---|
| status | string | não | open, expired, accepted ou revoked. |
| limit | inteiro | não | 1 a 100, por omissão 50. |
| cursor | string | não | O next_cursor da página anterior. |
Exemplo
curl "https://rioko.online/api/partner/v1/invites?status=open&limit=50" \
-H "Authorization: Bearer rkp_live_3f9c…"
Resposta · 200
{
"data": [
{
"id": "6f1c2d0e-8a4b-4f3e-9b8e-2c1d5e7a9b10",
"external_ref": "acad_1042",
"email": "[email protected]",
"status": "open",
"sent_at": "2026-09-17T10:00:00.000Z",
"expires_at": "2026-10-17T10:00:00.000Z",
"accepted_at": null,
"resends": 0
}
],
"next_cursor": null
}
Erros possíveis
invalid_cursormissing_keyinvalid_keypartner_inactive
DELETE/api/partner/v1/invites/{id}
Revoga um convite aberto.
O link do email deixa de funcionar. Só revoga convites do próprio partner que ainda estejam abertos.
Exemplo
curl -X DELETE https://rioko.online/api/partner/v1/invites/6f1c2d0e-8a4b-4f3e-9b8e-2c1d5e7a9b10 \
-H "Authorization: Bearer rkp_live_3f9c…"
Resposta · 200
{ "id": "6f1c2d0e-8a4b-4f3e-9b8e-2c1d5e7a9b10", "status": "revoked" }
Erros possíveis
not_foundmissing_keyinvalid_keypartner_inactive
GET/api/partner/v1/clients
Os clientes do partner e o estado de cada um.
Ordenados por updated_at e depois por id, do mais antigo para o mais recente, o que torna o polling com updated_since estável.
updated_at muda com qualquer alteração à ligação: conta criada, confirmação ou rejeição, acesso dado ou retirado, entrega de uma conta gerida, fim da ligação.
O que cada cliente mostra depende do ponto em que está (ver Estados e consentimento): um cliente pendente mostra só nome da empresa, NIF, email e data; sem acesso, só nome, código e modo; com acesso, também as integrações e o último documento; uma ligação terminada, só o fim.
state, nos clientes com acesso, é live, connecting, signed_up, needs_attention ou subscription_inactive.
Em cada integração, subscription diz como está a subscrição Rioko do cliente para essa integração: active (paga), trial (em período experimental), inactive (terminou ou está suspensa: essa integração não fatura) ou none (nunca subscreveu). subscription_ending é true quando a subscrição não vai renovar.
Parâmetros
| Parâmetro | Tipo | Obrigatório | Regras |
|---|
| updated_since | data ISO 8601 | não | Só clientes com updated_at estritamente posterior. |
| status | string | não | active ou ended. |
| validation | string | não | pending ou confirmed. |
| limit | inteiro | não | 1 a 100, por omissão 50. |
| cursor | string | não | O next_cursor da página anterior, tal como veio. |
Exemplo
curl "https://rioko.online/api/partner/v1/clients?updated_since=2026-09-18T00:00:00.000Z" \
-H "Authorization: Bearer rkp_live_3f9c…"
Resposta · 200
{
"data": [
{
"id": "0a7d…",
"external_ref": "acad_1042",
"updated_at": "2026-09-18T09:12:44.000Z",
"status": "active",
"validation": "pending",
"company_name": "Academia Norte, Lda",
"nif": "516000000",
"email": "[email protected]",
"claimed_at": "2026-09-18T09:12:44.000Z"
},
{
"id": "4c1e…",
"external_ref": "acad_0981",
"updated_at": "2026-09-19T15:02:10.000Z",
"status": "active",
"validation": "confirmed",
"client_code": "RIO-7K2M9Q",
"name": "Estúdio Sul",
"mode": "referred",
"since": "2026-09-02T11:40:00.000Z",
"access": false
},
{
"id": "8e33…",
"external_ref": "acad_0770",
"updated_at": "2026-09-20T08:30:00.000Z",
"status": "active",
"validation": "confirmed",
"client_code": "RIO-3H8TQ1",
"name": "Clube Oeste",
"mode": "referred",
"since": "2026-08-21T10:00:00.000Z",
"access": true,
"state": "live",
"connections": [
{ "source": "stripe", "destination": "moloni", "status": "active", "subscription": "active", "subscription_ending": false }
],
"last_document_at": "2026-09-20T08:29:51.000Z"
},
{
"id": "b51f…",
"external_ref": "acad_0655",
"updated_at": "2026-09-21T17:45:00.000Z",
"status": "ended",
"end_reason": "client_left",
"ended_at": "2026-09-21T17:45:00.000Z"
}
],
"next_cursor": "MjAyNi0wOS0yMVQxNzo0NTowMC4wMDBafGI1MWY"
}
Erros possíveis
invalid_cursormissing_keyinvalid_keypartner_inactive
GET/api/partner/v1/clients/{client_code}
Um cliente, pelo código Rioko (RIO-…).
Só clientes confirmados têm código visível. Um código de outro partner responde 404, igual a um que não existe.
Exemplo
curl https://rioko.online/api/partner/v1/clients/RIO-3H8TQ1 \
-H "Authorization: Bearer rkp_live_3f9c…"
Resposta · 200: o mesmo objeto de /clients
{
"id": "8e33…",
"client_code": "RIO-3H8TQ1",
"access": true,
"state": "live"
}
Erros possíveis
not_foundmissing_keyinvalid_keypartner_inactive
GET/api/partner/v1/clients/{client_code}/documents
O que aconteceu aos documentos de um cliente, depois de emitidos.
Para a plataforma mostrar ao comerciante o que mudou sem ter de perguntar ao programa de facturação.
NÃO traz o número do documento nem o link: esses vivem no programa de facturação, e já foram devolvidos na resposta ao pedido que emitiu cada documento. Aqui está o que mudou DESDE então: um rascunho fechado à mão, um recibo, uma nota de crédito.
`state` é o ponto mais avançado a que o documento chegou: `issued`, `held`, `finalized`, `settled` ou `credited`.
`updated_since` devolve só o que mexeu desde essa data, que é como se sonda sem repetir tudo. O histórico de acontecimentos é limpo aos 90 dias (365 para os que são prova), por isso um documento antigo aparece com menos história.
Precisa de acesso concedido pelo cliente. Sem ele, 404, igual a um código que não existe.
Exemplo
curl "https://rioko.online/api/partner/v1/clients/RIO-3H8TQ1/documents?updated_since=2026-09-01T00:00:00Z&limit=50" -H "Authorization: Bearer rkp_live_3f9c…"
Resposta · 200: uma página de documentos, do mais antigo ao mais recente
{
"client_code": "RIO-3H8TQ1",
"external_ref": "acad_42",
"data": [
{
"external_id": "mf_acad42_1042",
"document_id": "1025042934",
"state": "settled",
"held": null,
"issued_at": "2026-09-24T09:12:00Z",
"finalized_at": "2026-09-24T09:12:03Z",
"settled_at": "2026-09-30T10:04:00Z",
"credited_at": null,
"updated_at": "2026-09-30T10:04:00Z"
}
],
"next_cursor": null
}
Erros possíveis
not_foundinvalid_cursormissing_keyinvalid_keypartner_inactive