Sessões e configuração do Customer Portal
Como um cliente entra no portal — o fluxo de magic-link, a sessão atual, os dados de bootstrap e a configuração do portal.
O Customer Portal permite que um cliente gerencie suas próprias assinaturas e métodos de pagamento sem precisar entrar em contato com o suporte. Uma sessão começa com um magic link: o cliente solicita um link por e-mail e, então, a etapa de verificação troca o token enviado por e-mail por um cookie de sessão. Estes endpoints cobrem esse handshake, a sessão atual, o payload de bootstrap que a interface carrega primeiro, e a configuração do portal.
Todo o restante do portal — assinaturas, métodos de pagamento, conta — funciona sobre o cookie estabelecido aqui. O portal é white-label, portanto seu branding e as ações permitidas vêm da configuração do portal do Merchant.
Estes endpoints alimentam o Customer Portal — a superfície self-service que os seus clientes finais usam, sob a sua marca. Eles são autenticados por um cookie de sessão do portal, estabelecido por meio do fluxo de magic-link (solicitar um link e depois verificar o token), e não por uma chave de API. Consulte Sessões e configuração.
A sessão do portal
Retornado pelos endpoints de listagem e consulta desta página.
| Field | Type | Description |
|---|---|---|
id | string | Id da conta do portal. |
organization_id | string | — |
merchant_id | string | Merchant ao qual a sessão está vinculada. |
email | string | — |
expires_in | number | Tempo de vida da sessão em segundos. |
Endpoints
GET/api/v1/merchants/:merchant_id/portal-config
Auth: Customer Portal session (cookie definido pelo fluxo de magic-link).
Branding e comportamento do portal self-service que os seus clientes usam para gerenciar as assinaturas deles. Retorna os padrões quando ainda não houver nada configurado.
Parâmetros de caminho
| Field | Type | Required | Description |
|---|---|---|---|
merchant_id | string | Sim | — |
Exemplo de requisição
curl https://api.tokeflow.com/api/v1/merchants/mrc_8a3f12d9/portal-config \
-H "Cookie: tf_portal_session=…"Exemplo de resposta — 200
{
"merchant_id": "mrc_123",
"allow_cancellation": true,
"allow_plan_change": true,
"allow_payment_method_change": true,
"cancellation_survey": true,
"custom_cancellation_message": "Operation completed successfully"
}PUT/api/v1/merchants/:merchant_id/portal-config
Auth: Customer Portal session (cookie definido pelo fluxo de magic-link).
Faz upsert da configuração — a primeira chamada a cria, chamadas posteriores substituem os campos enviados.
Parâmetros de caminho
| Field | Type | Required | Description |
|---|---|---|---|
merchant_id | string | Sim | — |
Campos da requisição
| Field | Type | Required | Description |
|---|---|---|---|
allow_cancellation | boolean | Não | Permite que os clientes cancelem pelo portal. |
allow_plan_change | boolean | Não | Permite que os clientes alterem o plano pelo portal. |
allow_payment_method_change | boolean | Não | Permite que os clientes adicionem um cartão durante o dunning. |
cancellation_survey | boolean | Não | Exibe uma pesquisa de cancelamento. |
custom_cancellation_message | string | Não | Markdown exibido na tela de cancelamento. |
Exemplo de requisição
curl -X PUT https://api.tokeflow.com/api/v1/merchants/mrc_8a3f12d9/portal-config \
-H "Cookie: tf_portal_session=…" \
-H "Content-Type: application/json" \
-d '{
"allow_cancellation": true,
"allow_plan_change": true,
"allow_payment_method_change": true,
"cancellation_survey": true,
"custom_cancellation_message": "Operation completed successfully"
}'Exemplo de resposta — 200
{
"merchant_id": "mrc_123",
"allow_cancellation": true,
"allow_plan_change": true,
"allow_payment_method_change": true,
"cancellation_survey": true,
"custom_cancellation_message": "Operation completed successfully"
}POST/api/v1/portal/auth/email-change/confirm
Auth: Customer Portal session (cookie definido pelo fluxo de magic-link).
Confirma uma alteração de e-mail por meio do token enviado por e-mail.
Campos da requisição
| Field | Type | Required | Description |
|---|---|---|---|
token | string | Sim | Token do e-mail de confirmação. |
Exemplo de requisição
curl -X POST https://api.tokeflow.com/api/v1/portal/auth/email-change/confirm \
-H "Cookie: tf_portal_session=…" \
-H "Content-Type: application/json" \
-d '{
"token": "string"
}'POST/api/v1/portal/auth/logout
Auth: Customer Portal session (cookie definido pelo fluxo de magic-link).
Limpa o cookie de sessão do portal.
Exemplo de requisição
curl -X POST https://api.tokeflow.com/api/v1/portal/auth/logout \
-H "Cookie: tf_portal_session=…"GET/api/v1/portal/auth/me
Auth: Customer Portal session (cookie definido pelo fluxo de magic-link).
Obtém a conta da sessão atual do portal.
Exemplo de requisição
curl https://api.tokeflow.com/api/v1/portal/auth/me \
-H "Cookie: tf_portal_session=…"Exemplo de resposta — 200
{
"id": "cpa_123",
"organization_id": "org_123",
"merchant_id": "mrc_123",
"email": "customer@example.com",
"expires_in": 1800
}POST/api/v1/portal/auth/request-link
Auth: Customer Portal session (cookie definido pelo fluxo de magic-link).
Solicita um e-mail de magic link do portal.
Campos da requisição
| Field | Type | Required | Description |
|---|---|---|---|
organization_id | string | Sim | Organization à qual o portal pertence. |
merchant_id | string | Sim | Merchant ao qual a sessão do portal está vinculada (a partir da resposta de bootstrap). Obrigatório — o portal é de Merchant único, e uma sessão sem Merchant não pode ficar vinculada a nada. |
email | string | Sim | E-mail do cliente. |
Exemplo de requisição
curl -X POST https://api.tokeflow.com/api/v1/portal/auth/request-link \
-H "Cookie: tf_portal_session=…" \
-H "Content-Type: application/json" \
-d '{
"organization_id": "org_123",
"merchant_id": "mrc_123",
"email": "customer@example.com"
}'POST/api/v1/portal/auth/verify
Auth: Customer Portal session (cookie definido pelo fluxo de magic-link).
Verifica um token de magic link; define o cookie de sessão.
Campos da requisição
| Field | Type | Required | Description |
|---|---|---|---|
token | string | Sim | Token bruto do magic link enviado por e-mail. |
Exemplo de requisição
curl -X POST https://api.tokeflow.com/api/v1/portal/auth/verify \
-H "Cookie: tf_portal_session=…" \
-H "Content-Type: application/json" \
-d '{
"token": "string"
}'Exemplo de resposta — 200
{
"id": "cpa_123",
"organization_id": "org_123",
"merchant_id": "mrc_123",
"email": "customer@example.com",
"expires_in": 1800
}GET/api/v1/portal/bootstrap
Auth: Customer Portal session (cookie definido pelo fluxo de magic-link).
Resolve o branding e as flags do Merchant para o portal.
Parâmetros de consulta
| Field | Type | Required | Description |
|---|---|---|---|
merchant_id | string | Não | — |
organization_id | string | Não | — |
merchant | string | Não | — |
Exemplo de requisição
curl -G https://api.tokeflow.com/api/v1/portal/bootstrap \
-H "Cookie: tf_portal_session=…" \
--data-urlencode "merchant_id=mrc_123" \
--data-urlencode "organization_id=org_123" \
--data-urlencode "merchant=acme-store"Exemplo de resposta — 200
{
"organization_id": "org_123",
"merchant_id": "mrc_123",
"merchant_slug": "acme-store",
"merchant_name": "Acme Store",
"branding": {
"site_title": "Acme Store",
"favicon": "string",
"logo_light_mode": "string",
"logo_dark_mode": "string",
"theme_primary_color": "#1A73E8",
"theme_secondary_color": "#0B5394",
"custom_url": "https://acme.example.com",
"show_name_with_logo": false
},
"config": {
"allow_cancellation": true,
"allow_plan_change": true,
"allow_payment_method_change": true,
"cancellation_survey": false,
"custom_cancellation_message": "Operation completed successfully"
}
}Erros
Os erros usam o envelope padrão. Os casos mais comuns aqui:
| HTTP | Meaning |
|---|---|
400 | Parâmetros inválidos ou um estado que não permite esta operação. |
401 | Token de sessão do Dashboard ausente, expirado ou inválido. |
403 | Autenticado, mas o usuário logado não tem acesso a esta entidade. |
404 | O registro não existe ou não é visível para esta entidade. |