Documentação da API
Autorização
O HotLearn usa OAuth 2.1 com código de autorização e PKCE (S256). A pessoa autoriza na tela do HotLearn, o seu aplicativo recebe um código e troca o código pela chave. Nenhuma senha passa pelo seu aplicativo.
O PKCE com
S256é obrigatório para todo aplicativo, com ou sem segredo. Pedido semcode_challengeou com outro método mostra uma página de erro e não volta ao aplicativo.
Só o dono da conta autoriza, e a conta precisa estar com a assinatura ativa ou no período de teste. Membros veem a tela, mas não conseguem aprovar.
1. Gere o PKCE e o state
Antes de cada autorização, gere três valores e guarde-os no servidor, ligados à pessoa que está conectando (por exemplo, no cache). Com signup=1, a pessoa pode voltar até 2 horas depois com o mesmo state: guarde-os por pelo menos 2 horas (recomendamos 2 h 15 min).
code_verifier: texto aleatório de 43 a 128 caracteres;code_challenge:BASE64URL(SHA256(code_verifier)), sem=no fim;state: outro texto aleatório, para conferir na volta.
$verifier = rtrim(strtr(base64_encode(random_bytes(48)), '+/', '-_'), '=');
$challenge = rtrim(strtr(base64_encode(hash('sha256', $verifier, true)), '+/', '-_'), '=');
$state = bin2hex(random_bytes(16));
2. Mande a pessoa para a tela de autorização
Abra no navegador (redirecionamento ou janela):
https://hotlearn.com.br/oauth/authorize
?response_type=code
&client_id=SEU_CLIENT_ID
&redirect_uri=https://escola.exemplo.com/hotlearn/retorno
&scope=account:read catalog:read
&state=VALOR_DO_STATE
&code_challenge=VALOR_DO_CHALLENGE
&code_challenge_method=S256
(Tudo numa linha só, com os valores codificados para URL.)
Parâmetros para aplicativos que atendem vários clientes (como as escolas de um LMS):
external_id: o identificador do cliente do seu lado. Recomendamos o id da escola (ou do tenant); um UUID cabe. De 1 a 64 caracteres entreA-Z a-z 0-9 . _ : -; fora disso (inclusive com mais de 64), o pedido é recusado com o códigoinvalid_external_id. Ele nunca é cortado. Cada (conta, aplicativo,external_id) vira uma conexão separada na conta do HotLearn. É opcional para aplicativo de uma conta só (como um assistente de IA), mas obrigatório para aplicativo cadastrado como de várias escolas: sem ele, o pedido é recusado com o códigoexternal_id_required;display_nameeurl: o nome e o endereço desse cliente. A tela mostra "Em nome de {display_name}" só quando o host deurlé o mesmo doredirect_uri, para ninguém se apresentar com o nome de outra instituição.
Se a pessoa não estiver logada, o HotLearn pede o login antes, com o aviso "Entre para autorizar {seu aplicativo}".
Quem ainda não tem conta: acrescente signup=1. A pessoa vai direto para o cadastro do HotLearn, com o aviso "Você está assinando por {display_name}". Depois do cadastro e da escolha do plano (ou do teste grátis), ela volta uma vez para esta tela de autorização e segue o fluxo normal. O pedido fica guardado por 2 horas; depois disso, comece de novo. Antes de mandar ao cadastro, o HotLearn confere o PKCE e o external_id: pedido com erro mostra a página de erro já aqui, e não depois do cadastro.
3. Receba a volta
- Autorizou:
https://…/retorno?code=…&state=…. Confira se ostateé o mesmo que você guardou. - Negou:
https://…/retorno?error=access_denied&state=…. - Pedido inválido (aplicativo desconhecido,
redirect_urifora do cadastro, PKCE faltando ouexternal_idfaltando ou fora do formato): a pessoa não volta ao seu aplicativo. O HotLearn mostra uma página de erro (status400) com o código:invalid_request,external_id_requiredouinvalid_external_id. É proteção contra desvio para endereços falsos.
4. Troque o código pela chave
O código vale 10 minutos e só pode ser usado uma vez.
curl -X POST https://hotlearn.com.br/oauth/token \
-d grant_type=authorization_code \
-d client_id=SEU_CLIENT_ID \
-d client_secret=SEU_SEGREDO \
-d redirect_uri=https://escola.exemplo.com/hotlearn/retorno \
-d code_verifier=VALOR_DO_VERIFIER \
-d code=CODIGO_RECEBIDO
Aplicativo sem segredo (no aparelho da pessoa) não manda client_secret. Resposta:
{
"token_type": "Bearer",
"expires_in": 3600,
"access_token": "eyJ0eXAiOiJKV1Qi…",
"refresh_token": "def50200a1b2c3…"
}
Guarde as duas chaves criptografadas. Depois confira a conexão com GET /connection.
5. Renove antes de vencer
A chave de acesso vale 1 hora. Renove um pouco antes de vencer, ou quando receber 401 com code = unauthenticated (uma vez só; se continuar, peça para autorizar de novo):
curl -X POST https://hotlearn.com.br/oauth/token \
-d grant_type=refresh_token \
-d client_id=SEU_CLIENT_ID \
-d client_secret=SEU_SEGREDO \
-d refresh_token=CHAVE_DE_RENOVACAO
- A chave de renovação muda a cada uso. Guarde a nova que vem na resposta; a antiga deixa de valer.
- Nunca use uma chave de renovação antiga de novo. O HotLearn entende isso como chave copiada e desfaz a conexão inteira: a pessoa precisa autorizar de novo. Renove uma vez por vez para cada conexão (uma trava por conexão evita duas renovações ao mesmo tempo).
- A chave de renovação vence depois de 30 dias sem uso.
- Com
401ecode=connection_revoked, não renove: a conexão foi desfeita e a pessoa precisa conectar de novo. Renovar depois disso responde no formato do OAuth ({"error": "invalid_grant", …}), e não emproblem+json. - Não repita chamadas com chave inválida: mais de 300 respostas
401por minuto do mesmo endereço de rede bloqueiam esse endereço com429.
6. Desconectar
Pelo aplicativo: mande a chave de renovação para a revogação. Isso desfaz a conexão inteira:
curl -X POST https://hotlearn.com.br/oauth/revoke \
-d token=CHAVE_DE_RENOVACAO \
-d client_id=SEU_CLIENT_ID \
-d client_secret=SEU_SEGREDO
Pelo HotLearn: o dono clica em Desconectar, em Integrações. As chaves param na hora; a próxima chamada recebe 401 com code = connection_revoked.
Nos dois casos, o que o aplicativo já tirou do HotLearn continua do lado dele.
Conectar de novo
- Se a conta já tem uma conexão ativa com o mesmo aplicativo, o mesmo
external_ide o mesmoredirect_uriexato, o HotLearn aprova sem mostrar a tela e só emite uma chave nova. As chaves antigas continuam valendo, edisplay_nameeurlnão mudam. - Quando o dono aprova na tela (sempre numa conexão nova, ou quando o aplicativo manda
prompt=consent), a conexão é substituída: as chaves antigas param e o nome e o endereço são atualizados. - Quer trocar ou atualizar a conexão? Mande
prompt=consent.
Endereço de volta por padrão
Quando cada cliente do seu aplicativo tem o próprio subdomínio, o cadastro pode usar um padrão: https://*.seudominio.com/hotlearn/retorno. Valem estas regras:
*vale um nome antes do domínio (escola.seudominio.com, nuncaa.b.seudominio.com);- sempre
httpsem produção (httpsó fora de produção, para testes), sem porta, e com o caminho exatamente igual; - se o cliente usa um domínio próprio, faça a volta pelo subdomínio, que continua ativo, e depois leve a pessoa para o domínio dela.
Aplicativo sem conta (vitrine)
Para mostrar a vitrine pública do acervo sem conta conectada, um aplicativo de servidor pode pedir uma chave só dele:
curl -X POST https://hotlearn.com.br/oauth/token \
-d grant_type=client_credentials \
-d client_id=SEU_CLIENT_ID \
-d client_secret=SEU_SEGREDO \
-d scope=catalog:public
Essa chave só vale para catalog:public: a lista do acervo (GET /products), as capas e as categorias, só com os campos públicos. A prévia em PDF (GET /products/{id}/preview) precisa de uma chave de conta com catalog:read.
Descoberta automática
Clientes que configuram o OAuth sozinhos (como os clientes MCP) leem os endereços em https://hotlearn.com.br/.well-known/oauth-authorization-server e https://hotlearn.com.br/.well-known/oauth-protected-resource.
