Rotas para listar, criar, editar e desvincular as ofertas dos grupos da plataforma. Os campos completos de cada rota, com exemplos, estão nas páginas de referência desta seção.
Headers obrigatórios
Authorization: Bearer {token}X-Requested-With: XMLHttpRequest
(Os mesmos do “Getting Started”.)
As quatro rotas exigem as ofertas habilitadas na plataforma e, cada uma, o seu recurso de plano.
| Rota | Recurso de plano |
|---|---|
GET /groups/{groupId}/offers | Public API – List Group Offers |
POST /groups/{groupId}/offers | Public API – Create Offer |
PATCH /offers/{offerId} | Public API – Update Offer |
DELETE /groups/{groupId}/offers/{offerId} | Public API – Detach Group Offer |
Como uma oferta é organizada
- O tipo de pagamento (
payment_type) éunique(pagamento único),recurrent(assinatura) oucarne(carnê). - Pagamento único e carnê têm uma cobrança, sem frequência.
- A recorrente tem uma cobrança por frequência:
monthly,quarterly,semiannualouannual. Cada frequência tem o seu valor. - Cada cobrança vinculada a um grupo tem o seu link de checkout. Uma assinatura mensal e anual no mesmo grupo tem dois links.
Os campos da resposta têm o mesmo nome dos campos da criação e da edição. O que a listagem devolve pode ser reenviado na edição.
📋 Listar as ofertas de um grupo
GET https://sua-plataforma.ensinio.cloud/public/api/v1/groups/{groupId}/offers
Retorna todas as ofertas vinculadas ao grupo, sem paginação. Cada oferta traz os links de checkout que tem neste grupo. Order bumps não aparecem.
Exemplo de resposta
{
"data": [
{
"id": 346,
"title": "Clube do Livro",
"description": "Um livro por mês",
"payment_type": "recurrent",
"price": 49.9,
"carne_delinquency_condition": null,
"payment_methods": ["credit_card", "pix"],
"visibility": "public",
"enable_expiration": false,
"expiration_type": null,
"expiration_date": null,
"expiration_count": null,
"expiration_interval": null,
"redirect_type": "custom",
"redirect_url": "https://minhaescola.com/obrigado",
"checkout_format": "onepage",
"checkout_links": [
{
"group_id": 12,
"frequency": "monthly",
"price": 49.9,
"max_installments": 1,
"free_installments": 1,
"url": "https://sua-plataforma.ensinio.com/payment/g/aK29dLq0ZpX7m"
},
{
"group_id": 12,
"frequency": "annual",
"price": 499,
"max_installments": 12,
"free_installments": 3,
"url": "https://sua-plataforma.ensinio.com/payment/g/Rt5nWc8yHe1Vo"
}
]
}
]
}price é o valor da oferta. Na recorrente com mais de uma frequência, é o da primeira, na ordem mensal, trimestral, semestral e anual. O valor de cada frequência está no link dela.
➕ Criar uma oferta no grupo
POST https://sua-plataforma.ensinio.cloud/public/api/v1/groups/{groupId}/offers
Cria a oferta ativa e já vinculada ao grupo. Responde 201 com a oferta criada, no mesmo formato da listagem, incluindo o id e o link de checkout.
Campos
| Campo | Tipo | Obrigatório | Padrão | Descrição |
|---|---|---|---|---|
title | string | ✅ | — | Título da oferta (até 255 caracteres). |
price | number | ✅ | — | Valor, maior que zero e até 100.000. |
payment_type | string | ✅ | — | unique, recurrent ou carne. |
frequency | string | na recorrente | — | monthly, quarterly, semiannual ou annual. |
max_installments | integer | no carnê | 1 | No cartão, o máximo de parcelas, de 1 a 12. No carnê, o número de parcelas, de 1 a 24, sem nenhuma abaixo de R$ 1. |
free_installments | integer | ❌ | 1 | Parcelas sem juros no cartão, de 1 a 12. Ignorado no carnê, onde toda parcela é sem juros. |
carne_delinquency_condition | string | no carnê | — | all_overdue ou single_overdue: a regra de bloqueio e de volta do acesso por inadimplência. |
description | string | ❌ | — | Descrição. |
payment_methods | string[] | ❌ | os três | credit_card, pix e boleto. |
enable_expiration | boolean | ❌ | false | Liga a expiração do acesso. Sem true, o acesso é vitalício, mesmo que o tipo e o valor venham. |
expiration_type | string | se a expiração estiver ligada | deduzido | fixed_date ou relative_to_start (a partir da compra). |
expiration_date | date | na data fixa | — | Data em que o acesso expira (AAAA-MM-DD). |
expiration_count | integer | a partir da compra | — | Quantidade de expiration_interval depois da compra. |
expiration_interval | string | a partir da compra | — | day, week, month ou year. |
visibility | string | ❌ | public | public ou restricted. |
redirect_type | string | ❌ | default | Página de obrigado: default (da plataforma) ou custom (externa). |
redirect_url | url | se custom | — | Endereço da página de obrigado externa. |
checkout_format | string | ❌ | steps | steps (em etapas) ou onepage (uma página). Só os formatos habilitados na plataforma. |
Expiração do acesso
A expiração é a validade do acesso que o aluno compra, e não o período de venda da oferta. Toda oferta criada pela API fica disponível para compra sem prazo.
- A expiração só vale com
enable_expiration: true. Tipo e valor enviados sem ele ficam gravados, mas a expiração continua desligada e o acesso é vitalício. - Na data fixa, o acesso termina em
expiration_date. A partir da compra, terminaexpiration_countvezesexpiration_intervaldepois da compra. - Quando
expiration_typenão vem, ele é deduzido:expiration_dateindica data fixa, eexpiration_countcomexpiration_intervalindicam a partir da compra. - A expiração se aplica ao pagamento único e ao carnê. Na recorrente, o acesso dura enquanto a assinatura estiver paga.
Carnê exige o recurso Carnê Digital no plano da plataforma.
Exemplos
Pagamento único, só o obrigatório
{ "title": "Mentoria Individual", "price": 497, "payment_type": "unique" }Assinatura mensal com página de obrigado externa
{
"title": "Clube do Livro",
"price": 49.9,
"payment_type": "recurrent",
"frequency": "monthly",
"payment_methods": ["credit_card", "pix"],
"redirect_type": "custom",
"redirect_url": "https://minhaescola.com/obrigado"
}Pagamento único com acesso por 12 meses
{
"title": "Curso de Fotografia",
"price": 600,
"payment_type": "unique",
"enable_expiration": true,
"expiration_count": 12,
"expiration_interval": "month"
}Carnê em 12 parcelas
{
"title": "Formação Completa",
"price": 1800,
"payment_type": "carne",
"max_installments": 12,
"carne_delinquency_condition": "all_overdue"
}✏️ Editar uma oferta
PATCH https://sua-plataforma.ensinio.cloud/public/api/v1/offers/{offerId}
Altera só os campos enviados. Os campos são os mesmos da criação, todos opcionais, e as regras valem para o estado final da oferta. Enviar só enable_expiration: true, por exemplo, funciona quando a oferta já tem o tipo de expiração gravado. Ligar ou desligar a expiração vale para as próximas vendas, e os acessos já vendidos não mudam. A resposta traz a oferta atualizada, com os links de todos os grupos dela.
Valor, parcelas e frequência
- Numa oferta com uma cobrança só,
price,max_installmentsefree_installmentsalteram essa cobrança. - Numa recorrente com mais de uma frequência, informe em
frequencyqual delas alterar. Sem isso, ou com uma frequência que a oferta não tem, a resposta é 422. - Numa recorrente com uma frequência só, enviar outra
frequencytroca a frequência. - Mudar
payment_typepararecurrentexigefrequency. Mudar parauniqueoucarnedeixa a oferta com uma cobrança só. - Entrar no carnê exige
max_installments, que passa a ser o número de parcelas. Sair do carnê volta as parcelas para 1, a menos que elas venham na requisição.
{ "frequency": "annual", "price": 899 }Links de checkout na edição
Mudar só o valor ou as parcelas mantém o link de checkout. Mudar a frequência, ou trocar entre recorrente e outro tipo, cria uma cobrança nova e, com ela, um link novo em cada grupo da oferta. O link antigo deixa de funcionar. Quem já comprou mantém o acesso.
🔗 Desvincular uma oferta do grupo
DELETE https://sua-plataforma.ensinio.cloud/public/api/v1/groups/{groupId}/offers/{offerId}
Remove os links de checkout da oferta neste grupo, de todas as frequências. A oferta não é excluída. Ela continua na plataforma e nos outros grupos a que está vinculada, e quem já comprou mantém o acesso.
{
"message": "Oferta desvinculada do grupo com sucesso.",
"group_id": 12,
"offer_id": 345
}Possíveis respostas
- 200 OK — listagem, edição ou desvínculo concluídos.
- 201 Created — oferta criada.
- 401 Unauthorized — token ausente ou inválido.
- 403 Forbidden — recurso não habilitado no plano.
- 404 Not Found — grupo ou oferta não encontrado. Grupo arquivado também responde 404.
- 405 Method Not Allowed — as ofertas não estão habilitadas na plataforma.
- 422 Unprocessable Entity — erro de validação, com o nome do campo enviado em
errors. No desvínculo, a oferta não está vinculada ao grupo. - 429 Too Many Requests — limite de requisições excedido.
