Principais API’s de plataforma
Na sessão abaixo, serão documentadas as principais requisições das API’s mais utilizadas disponibilizadas pelo time de plataforma: OAuth, autorizações, licenciamento, login, usuários e notificações.
OAuth
As API's do oauth oferecem diversos serviços para geração, consulta e configurações de tokens de acesso.
Host OAuth: https:/plataforma-oauth.betha.cloud/auth
Fluxo de Client Credentials
Fluxo a ser utilizado pela credencial de serviço

Troca Application Credentials pelo token
curl --location 'https://plataforma-oauth.betha.cloud/auth/oauth2/token' \
--header 'content-type: application/x-www-form-urlencoded' \
--data-urlencode 'scopes=escopo1,escopo2' \
--data-urlencode 'grant_type=client_credentials' \
--data-urlencode 'client_id=SEU_CLIENT_ID' \
--data-urlencode 'client_secret=SEU_CLIENT_SECRET'OAuth valida os Application Credentials
Caso válido, é retornado um access token para as credenciais informadas
Exemplo de resposta
{
"expires": 0,
"scope": "sistema_interno",
"user": "ba1ae9e0-1da8-496d-8455-7ab17806cdc8",
"expired": false,
"access_token": "86635cc9-be50-4076-afd9-57e23809e689",
"token_type": "bearer",
"expires_in": 0
}Aplicação utiliza o accessToken
Recebe resposta
Fluxo de Authorization Code
Fluxo a ser utilizado pela credencial de servidor

Usuário inicia processo de login
Redirect para o OAuth no endpoint /authorize (opcionalmente também é pode ser passado um parâmetro state que caso enviado será repassado quando o usuário for redirecionado, recomendado para previnir ataques de CSRF)
curl --location 'https://plataforma-oauth.betha.cloud/auth/oauth2/authorize?response_type=code&client_id=SEU_CLIENT_ID&redirect_uri=SUA_REDIRECT_URI_CONFIGURADA_NO_STUDIO'
Usuário é redirecionado para o login
Usuário insere credenciais e loga
OAuth redireciona usuário para a aplicação com o authorization code (Utilizando o redirect_uri)
Client-side APP inicia troca client_credentials (client_id e client_secret) e o authorization code pelo token no endpoint /oauth2/token
curl --location 'https://plataforma-oauth.betha.cloud/auth/oauth2/token' \
--header 'content-type: application/x-www-form-urlencoded' \
--data-urlencode 'grant_type=authorization_code' \
--data-urlencode 'client_id=SEU_CLIENT_ID' \
--data-urlencode 'client_secret=SEU_CLIENT_SECRET' \
--data-urlencode 'code=SEU_AUTHORIZATION_CODE' \
--data-urlencode 'redirect_uri=SEU_REDIRECT_URI'OAuth verifica o authorization code e as credenciais.
OAuth responde com o AccessToken (E refresh token caso habilitado)
Aplicação utiliza o accessToken
Recebe resposta
Fluxo Implicit
Fluxo originalmente utilizado pela credencial de browser e anônima, atualmente recomendado o fluxo de Authorization Code com PKCE.
No caso da credencial anônima não passa pela etapa de autenticação, dado a não existir um usuário nesse caso.

O usuário inicia processo de login
/authorize é chamado conforme o exemplo abaixo (opcionalmente também é pode ser passado um parâmetro state que caso enviado será repassado quando o usuário for redirecionado, recomendado para previnir ataques de CSRF)
curl --request GET \
--url "https://plataforma-oauth.betha.cloud/auth/oauth2/authorize?client_id=SEU_CLIENT_ID&response_type=token&redirect_uri=SEU_REDIRECT_URI&scopes=escopo1,escopo2"Usuário é redirecionado para a página de login
O usuário se autentica
A API OAuth redireciona o usuário para o APP com o access_token
Fluxo de Authorization Code com PKCE (Recomendado)
Utilize para aplicações client-side que não podem salvar um client secret de forma segura, recomendado principalmente para a credencial de browser e anônima.
No caso da credencial anônima não passa pela etapa de autenticação, dado a não existir um usuário nesse caso.

O usuário inicia processo de login
Deve criar um: code_verifier (exemplo um UUID v4 sustenido para 32 caracteres e encodado em base64) e utiliza-lo para gerar um code challenge (Um hash do code_verifier utilizando SHA256 e encodando novamente em base64)
Exemplos de geração de code verifier
java
import java.util.Base64;
import java.util.UUID;
String codeVerifier = Base64.getUrlEncoder().withoutPadding().encodeToString(UUID.randomUUID().toString().substring(0, 32).getBytes());javascript no nodejs
Buffer.from(crypto.randomUUID().substring(0, 32)).toString("base64url")Exemplos de geração de code challenge
java
import java.nio.charset.StandardCharsets;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Base64;
try {
String codeVerifier = "ZGRlYmExYzMtZGU2YS00ZjBhLTgyNzgtZTFkN2NlOGM";
byte[] hash = MessageDigest.getInstance("SHA-256")
.digest(codeVerifier.getBytes(StandardCharsets.UTF_8));
String codeChallenge = Base64.getUrlEncoder().encodeToString(hash);
System.out.println(codeChallenge);
} catch (NoSuchAlgorithmException e) {
throw new RuntimeException(e);
}javascript no nodejs
import crypto from 'crypto';
const codeVerifier = 'ZGRlYmExYzMtZGU2YS00ZjBhLTgyNzgtZTFkN2NlOGM';
const hash = crypto.createHash('sha256')
.update(codeVerifier)
.digest();
const codeChallenge = Buffer.from(hash)
.toString('base64url');
console.log(codeChallenge);Client-side App chama OAuth passando o code_challenge (opcionalmente também é pode ser passado um parâmetro state que caso enviado será repassado quando o usuário for redirecionado, recomendado para previnir ataques de CSRF)
curl --location 'https://plataforma-oauth.betha.cloud/auth/oauth2/authorize?audience=SEU_AUDIENCE&scope=ESCOPO_DO_TOKEN&response_type=code&client_id=SEU_CLIENT_ID&redirect_id=SEU_REDIRECT_URI&code_challenge_method=S256&code_challenge=SEU_CODE_CHALLENGE'OAuth redireciona para o login
Usuário insere as credenciais e loga
OAuth redireciona para a aplicação (redirect_uri) propagando o authorization code
Client-side App chama OAuth passando o code_verifier para o /oauth2/token
curl --location --globoff 'https://plataforma-oauth.betha.cloud/auth/oauth2/token' \
--header 'content-type: application/x-www-form-urlencoded' \
--data-urlencode 'grant_type=authorization_code' \
--data-urlencode 'client_id=SEU_CLIENT_ID' \
--data-urlencode 'code_verifier=SEU_CODE_VERIFIER' \
--data-urlencode 'code=SEU_AUTHORIZATION_CODE' \
--data-urlencode 'redirect_uri=SEU_REDIRECT_URI'OAuth verifica o code_verifier e code_challenge
OAuth responde com o AccessToken (E refresh token caso habilitado)
Aplicação utiliza o accessToken
Recebe resposta
Fluxo de Resource Owner Password (Reservado para uso interno da Betha Sistemas)
Fluxo utilizado pela credencial de Usuário e Senha

O usuário inicia o processo de login
Usuário e senha enviados para o /oauth2/token
curl --location 'https://plataforma-oauth.betha.cloud/auth/oauth2/token' \
--header 'content-type: application/x-www-form-urlencoded' \
--data-urlencode 'grant_type=password' \
--data-urlencode 'username=SEU_USERNAME' \
--data-urlencode 'password=SEU_PASSWORD' \
--data-urlencode 'scope=escopo1,escopo2' \
--data-urlencode 'client_id=SEU_CLIENT_ID'
OAuth valida usuário e senha e retorna Access Token
Aplicação utiliza o accessToken
Recebe resposta
Token Info
O endpoint de Tokeninfo retorna as informações relacionadas a criação e configuração de um token, tais como escopos, cliente, usuário e validade. O token desejado deve ser informado através do parâmetro "access_token".
Endpoint: auth2/tokeninfo
curl --request GET \
--url 'https://oauth.cloud.betha.com.br/auth/oauth2/tokeninfo?access_token={TOKEN}' \
Autorizações
As API's do autorizações fornecem meios para conceder e remover acessos e permissões para usuários em um contexto específico, e consultar os acessos vinculados a usuários dos sistemas.
Host Autorizações: https://plataforma-autorizacoes.betha.cloud/
Verifica acessos do usuário atual
Informa todos os acessos vinculados ao usuário atual, independente do contexto.
Endpoint: user-accounts/v0.1/api/suite/users/@me/access Escopo: user-accounts.suite
curl --request GET \
--url https://plataforma-autorizacoes.betha.cloud/user-accounts/v0.1/api/suite/users/@me/access \
--header 'authorization: bearer 2bfee386-23b5-4a92-b624-6e2bd9e75ef1'
Lista acessos de um contexto
Realiza a listagem de todos os acessos cadastrados para o contexto atual, informando últimas atividades, usuário que concedeu o acesso, entre outras informações. Apenas usuários administradores ou técnicos possuem permissão para acessar o recurso.
Endpoint: user-accounts/v0.1/api/management/access Escopo: user-accounts.suite
curl --request GET \
--url 'https://plataforma-autorizacoes.betha.cloud/user-accounts/v0.1/api/management/access?limit=20&offset=0' \
--header 'Authorization: Bearer {TOKEN}' \
--header 'User-Access: {USER_ACCESS}'
Conceder acesso para um usuário
A requisição abaixo faz a liberação de acesso para um usuário em um determinado sistema informando se o mesmo terá ou não privilégios de administrador, permissões, se o usuário é técnico e também a data de expiração do acesso. Apenas usuários administradores ou técnicos possuem permissão para acessar o recurso.
Endpoint: user-accounts/v0.1/api/management/access Escopo: user-accounts.suite
curl --request POST \
--url https://plataforma-autorizacoes.betha.cloud/user-accounts/v0.1/api/management/access \
--header 'Content-Type: application/json' \
--header 'Authorization: Bearer {TOKEN}' \
--header 'user-access: {USER_ACCESS}' \
--data '{
"user": {ID_USUARIO}
"admin": true,
"permissions": {PERMISSIOES},
"technical": false,
"expiresIn": {DATA_EXPIRACAO_ACESSO}
}'
Remover acesso para um usuário
Essa requisição faz a exclusão de um acesso existente no contexto. Como parâmetro, é necessário informar o id do acesso, que pode ser obtido tanto no ato da criação, como consultado através da api de listagem descrita no tópico. Apenas usuários administradores ou técnicos possuem permissão para acessar o recurso.
Endpoint: user-accounts/v0.1/api/management/access/{ID_ACESSO} Escopo: user-accounts.suite
curl --request DELETE \
--url https://plataforma-autorizacoes.betha.cloud/user-accounts/v0.1/api/management/access/{ID_ACESSO} \
--header 'Content-Type: application/json' \
--header 'Authorization: Bearer {TOKEN}' \
--header 'user-access: {USER_ACCESS}'
Lista solicitações de acesso
Essa requisição busca as solicitações de acesso existentes no contexto informado. Apenas usuários administradores ou técnicos possuem permissão para acessar o recurso.
Endpoint: user-accounts/v0.1/api/management/request Escopo: user-accounts.suite
curl --request GET \
--url 'https://plataforma-autorizacoes.betha.cloud/user-accounts/v0.1/api/management/request?limit=20&offset=0&order=name%20asc' \
--header 'authorization: Bearer {TOKEN}' \
--header 'user-access: {USER_ACCESS}'
Aprova solicitação de acesso
Essa requisição faz a aprovação de uma solicitação existente no contexto. Como parâmetro, é necessário informar o id da solicitação, que pode ser obtido através da api de listagem. Apenas usuários administradores possuem permissão para acessar o recurso.
Endpoint: user-accounts/v0.1/api/management/request Escopo: user-accounts.suite
curl --request POST \
--url 'https://plataforma-autorizacoes.betha.cloud/user-accounts/v0.1/api/management/request/{id}/allow' \
--header 'authorization: Bearer {TOKEN}' \
--header 'user-access: {USER_ACCESS}'
Rejeita solicitação de acesso
Essa requisição rejeita a solicitação existente no contexto. Como parâmetro, é necessário informar o id da solicitação, que pode ser obtido através da api de listagem. Apenas usuários administradores possuem permissão para acessar o recurso.
Endpoint: user-accounts/v0.1/api/management/request Escopo: user-accounts.suite
curl --request POST \
--url 'https://plataforma-autorizacoes.betha.cloud/user-accounts/v0.1/api/management/request/{id}/deny' \
--header 'authorization: Bearer {TOKEN}' \
--header 'user-access: {USER_ACCESS}'
Filtro por subcontexto
Este filtro permite que desenvolvedores de Scripts e Relatórios criem buscas de acessos de usuários de forma muito mais granular, filtrando por unidades organizacionais específicas de cada sistema (ex: unidades de saúde, estabelecimentos contábeis, etc.). Como a alteração foi feita na fonte de dados, o novo filtro está disponível e funciona da mesma forma tanto no editor de Scripts quanto no de Relatórios.
Foi adicionado o campo de filtro Subcontexto diretamente na fonte de dados Autorizações. A principal característica deste filtro é sua natureza genérica. Ele se adapta automaticamente à terminologia de subcontexto utilizada pelo sistema em questão.
- No sistema Saúde: o filtro permitirá buscar por Unidade de Saúde.
- No sistema Contábil: o filtro permitirá buscar por Estabelecimento Contábil.
- Em outros sistemas: o filtro se adapta à entidade correspondente (filial, departamento, etc.).
Esta implementação centralizada garante que qualquer ambiente que consome esta fonte de dados (Scripts, Relatórios, etc.) receba automaticamente a nova capacidade de filtragem.
|
|---|
Como configurar
- Ao criar ou editar um Script ou Relatório, adicione a fonte de dados de busca de acessos (Autorizações).
- Na área de configuração dos parâmetros da fonte de dados, o novo campo Subcontexto estará disponível.
- Informe neste campo o identificador (código ou nome) da unidade, estabelecimento ou subcontexto desejado para refinar a busca.
- Execute o script/relatório. O resultado conterá apenas os acessos de usuários que pertencem ao subcontexto especificado.
Exemplos de uso do filtro
Filtrar por uma única unidade: Para buscar acessos relacionados especificamente à unidade de saúde com o ID 3327, o valor a ser preenchido no campo Subcontexto é:
subcontext = "unidade:3327"Filtrar por um único estabelecimento: Para buscar acessos relacionados ao estabelecimento contábil com o ID 5343, utilize:
subcontext = "estabelecimento:5343"Combinando filtros: É possível combinar múltiplos subcontextos para refinar ainda mais a busca. Para encontrar acessos que pertençam simultaneamente à unidade 3327 e ao estabelecimento 5343, utilize o operador and para unir as condições:
subcontext = "unidade:3327" and subcontext = "estabelecimento:5343"
:::Info NOTA A chave do filtro (unidade, estabelecimento, etc.) deve corresponder à nomenclatura do subcontexto no sistema alvo da consulta. :::
Licenciamento (dados de uma entidade)
Os serviços de licenciamento fornecem meios de interagir com o cadastro de licenças dos clientes finais. Através deles conseguimos realizar a consulta de dados de entidades, databases, revendas e licenças. Para fazer uso das API's de licenciamento, é necessário utilizar um token válido, observando os escopos exigidos por cada endpoint.
Nesta seção foram mantidos apenas endpoints que, no código da API de Licenças, não dependem exclusivamente do escopo interno suite.services.
Host Licenças: https://plataforma-licencas.betha.cloud/
Consulta dados da entidade atual
Esse endpoint é a principal fonte de consulta para retornar os dados relacionados com a entidade vinculada ao token/user-access utilizados na requisição. Ele retorna todos os dados disponíveis para a entidade em questão.
Endpoint: licenses/v0.1/api/entidades/atual/
Escopos aceitos na API Licenças: licenses.suite ou suite.services.
curl --request GET \
--url 'https://plataforma-licencas.betha.cloud/licenses/v0.1/api/entidades/atual/' \
--header 'Content-Type: application/json' \
--header 'Authorization: Bearer {TOKEN}' \
--header 'User-Access: {USER_ACCESS}'
Consulta dados das entidades do escopo
Endpoint: licenses/v0.1/api/entidades/atual/entidades
Escopos aceitos na API Licenças: licenses.suite ou suite.services.
curl --request GET \
--url 'https://plataforma-licencas.betha.cloud/licenses/v0.1/api/entidades/atual/entidades?limit=20&offset=0&sort=nome%20asc&=' \
--header 'Content-Type: application/json' \
--header 'Authorization: Bearer {TOKEN}' \
--header 'User-Access: {USER_ACCESS}'
Para essa requisição, é possível adicionar o parâmetro opcional 'filter', que realiza uma busca aplicando um filtro nos campos disponíveis no retorno da requisição.
Verifica o database vinculado a uma determinada entidade
Essa consulta retorna qual o database vinculado à entidade na liberação da licença para o sistema do contexto.
Endpoint: licenses/v0.1/api/databases
Escopos aceitos na API Licenças: licenses.suite ou suite.services.
curl --request GET \
--url 'https://plataforma-licencas.betha.cloud/licenses/v0.1/api/databases?entity={ID_ENTIDADE}' \
--header 'Content-Type: application/json' \
--header 'Authorization: Bearer {TOKEN}' \
--header 'User-Access: {USER_ACCESS}'
Verifica o nome de uma entidade a partir do ID
Endpoint: licenses/v0.1/api/entidades/by-id
Escopos aceitos na API Licenças: licenses.suite ou suite.services.
curl --request GET \
--url 'https://plataforma-licencas.betha.cloud/licenses/v0.1/api/entidades/by-id?id={ID_ENTIDADE}' \
--header 'Content-Type: application/json' \
--header 'Authorization: Bearer {TOKEN}' \
--header 'User-Access: {USER_ACCESS}'
Verifica se a licença está ativa a partir da entidade, database e sistema
Essa consulta retorna o código de status 200 caso a licença esteja ativa para o contexto informado. Caso contrário, o código de status 403 é retornado.
Endpoint: api/v1/licensing/validate
Escopos aceitos na API Licenças: licencas.suite.betha.cloud/auth/dados/licencas.leitura ou suite.services.
curl --request GET \
--url 'https://licencas.suite.betha.cloud/api/v1/licensing/validate?database={ID_DATABASE}&entity={ID_ENTIDADE}&system={ID_SISTEMA}' \
--header 'Content-Type: application/json' \
--header 'Authorization: Bearer {TOKEN}'
Para consumo externo via gateway, utilize o escopo licencas.suite.betha.cloud/auth/dados/licencas.leitura.
Login
A API de login disponibiliza recursos para a realização se sessões de login/logout a partir de credenciais de usuário previamente cadastradas aqui.
Host Login: https://login.betha.cloud/
Logout
Esse endpoint faz o encerramento de uma sessão previamente iniciada para um determinado usuário, recebendo uma URI de callback informando para qual página o usuário deverá ser redirecionado.
Endpoint: /servicelogin/logout
curl --request GET \
--url 'https://login.test.betha.cloud/servicelogin/logout?continue=https://plataforma-oauth.test.betha.cloud/auth/oauth2/authorize?client_id=app_default%26response_type=token%26redirect_uri=https://suite.test.bethacloud.com.br/auth/callback.html%26scope=sistema_interno,notifications.suite,user-accounts.suite%26bth_ignore_origin=true'
Usuários
A API de usuário disponibiliza recursos para realizar consultas referente a usuários cadastrados na central de usuários Betha, como informações do cadastro, imagem de perfil, entre outras.
Host Usuários: https://plataforma-usuarios.betha.cloud/
Consultar usuários
Esse recurso retorna a lista de usuários cadastrados no sistema, com a possibilidade de inserir o parâmetro opcional 'filter', que permite adicionar critérios no retorno dos dados desejados.
Endpoint: usuarios/v0.1/api/usuarios
curl --request GET \
--url 'https://plataforma-usuarios.betha.cloud/usuarios/v0.1/api/usuarios/?filter=id%3D'\''kaio.stricker'\''' \
--header 'authorization: Bearer {TOKEN}' \
Consultar usuários por id
De forma semelhante a requisição anterior, esse endpoint permite a consulta dos dados de um usuário específico, especificando qual o id do usuário diretamente no path da requisição
Endpoint: usuarios/v0.1/api/usuarios/{ID_USUARIO}
curl --request GET \
--url https://plataforma-usuarios.betha.cloud/usuarios/v0.1/api/usuarios/{ID_USUARIO} \
--header 'authorization: Bearer {TOKEN}'
Consultar imagem vinculada ao usuário
Esse recurso retorna um content type em formato de imagem, contendo qual a foto cadastrada para o usuário na central de usuários Betha.
Endpoint: usuarios/v0.1/api/usuarios/{ID_USUARIO}/photo
curl --request GET \
--url https://plataforma-usuarios.betha.cloud/usuarios/v0.1/api/usuarios/{ID_USUARIO}/photo \
--header 'authorization: Bearer {TOKEN}'
Notificações
A API de notificações permite realizar o envio e a leitura de notificações para usuários do logados no sistema, e que podem ser consultadas através da sessão de notificações no menu principal dos sistemas Betha Cloud.
Host Notificações: https://plataforma-notificacoes.betha.cloud/notifications
Consultar notificações
Esse endpoint retornará as notificações vinculadas com o contexto do token, apresentando informações sobre o tipo da mensagem, texto, horário, entre outras.
Endpoint: api/messages
curl --request GET \
--url https://plataforma-notificacoes.betha.cloud/notifications/api/messages \
--header 'authorization: bearer {TOKEN}' \
Consultar notificações não lidas
Semelhante a requisição do item "Consultar notificações", porém irá retornar apenas a listagem de mensagens ainda não lidas pelo usuário.
Endpoint: api/messages/unreads
curl --request GET \
--url https://plataforma-notificacoes.betha.cloud/notifications/api/messages/unreads \
--header 'authorization: bearer {TOKEN}'
Consultar notificações lidas
Semelhante a requisição do item "Consultar notificações", porém irá retornar apenas a listagem de mensagens ainda já lidas pelo usuário.
Endpoint: api/messages/reads
curl --request GET \
--url https://plataforma-notificacoes.betha.cloud/notifications/api/messages/reads \
--header 'authorization: bearer {TOKEN}'
Gerar nova mensagem
Essa requisição consiste na criação/envio de uma nova mensagem, podendo ou não ser destinada para um usuário específico.
Endpoint: api/messages
curl --request POST \
--url https://plataforma-notificacoes.betha.cloud/notifications/api/messages \
--header 'Authorization: bearer {TOKEN}' \
--header 'Content-Type: application/json' \
--header 'User-Access: {USER_ACCESS}' \
--data '{
"systemId":{ID_SISTEMA},
"text": "Sua mensagem",
"link": null,
"source": "system@script",
"user": "{ID_USUARIO}",
"priority": 3,
"read": false,
"process": false,
"progress": false,
"cancellationLink": null,
"trackingLink": null,
"status": "CLOSED",
"percentage": null,
"destination": "USER",
"aggregationMessageId": null,
"context": null,
"type": "SCRIPT_EXECUTADO",
"icon": null,
"closed": true,
"contextDestined": false,
"userDestined": true
}'
