Pular para conteúdo

Autenticação OTIMUS

O OTIMUS usa autenticação por token fixo em header, com um segundo header sistema que identifica o cliente integrador (no caso, AGENTPRO).

Headers obrigatórios

POST /api/v1/... HTTP/1.1
Host: <clinica>.otimusclinic.com
sistema: AGENTPRO
token: <token-da-clinica>
Content-Type: application/json
Accept: */*

Base URL por clínica

Cada clínica possui um subdomínio (e às vezes porta) próprio:

Clínica Base URL
MEDCENTER https://medcenteracai-node.otimusclinic.com/api/v1
CLINFETO https://clinfeto.otimusclinic.com:9100/api/v1

A porta :9100 do Clinfeto

Algumas instâncias OTIMUS expõem a API em porta alternativa. Configure via env OTIMUS_API_URL incluindo a porta. Não presuma 443.

Implementação recomendada (config.py + wts_client.py / scheduling.py)

# config.py
import os

OTIMUS_API_URL = os.getenv("OTIMUS_API_URL", "")
OTIMUS_TOKEN   = os.getenv("OTIMUS_TOKEN", "")
# scheduling.py (ou cliente equivalente)
from config import OTIMUS_API_URL, OTIMUS_TOKEN

def _otimus_headers() -> dict:
    return {
        "sistema": "AGENTPRO",
        "token": OTIMUS_TOKEN,
        "Content-Type": "application/json",
        "Accept": "*/*",
    }

Anti-padrão encontrado no MEDCENTER

No projeto MEDCENTER a base URL e o token estão hardcoded no código:

# scheduling.py:26-32 (MEDCENTER)
OTIMUS_BASE_URL = "https://medcenteracai-node.otimusclinic.com/api/v1"
OTIMUS_HEADERS = {
    "sistema": "AGENTPRO",
    "token": "aWqBPKOwKwMZW8iyuiHb7A5SDtccTDwESrDEJ697774a4b1e96",
    "Content-Type": "application/json",
    "Accept": "*/*",
}

Nunca replicar

Isto não é o padrão. Foi um atalho histórico do MEDCENTER. Em projetos novos sempre carregue de env vars. Ver Hardcoding crítico.

Rotação de token

Para revogar/rotacionar:

  1. Pedir à clínica novo token no OTIMUS.
  2. Atualizar secret store (GitHub Secrets / ambiente Docker).
  3. docker compose up -d --force-recreate <container> para recarregar.
  4. Testar com curl:

    curl -X POST "$OTIMUS_API_URL/api/v1/agendamento/horarios" \
      -H "sistema: AGENTPRO" \
      -H "token: $OTIMUS_TOKEN" \
      -H "Content-Type: application/json" \
      -d '{"filter":{"agendas":[],"data":"2026-04-14","endDate":"2026-04-14","limit":1}}'
    

TLS / verificação

Tanto MEDCENTER quanto CLINFETO chamam o OTIMUS com requests sem desabilitar verificação TLS. Mantenha assim. Se aparecer erro de certificado em uma instância nova, exija à clínica um certificado válido — não use verify=False em produção.

Tempo limite (timeout)

Padrão do projeto: 30 segundos para todas as chamadas OTIMUS.

resp = requests.post(url, headers=_otimus_headers(), json=payload, timeout=30)

Se OTIMUS estiver lento e causar timeout, a estratégia é retry duas vezes antes de retornar FALHA_CONSULTA. Ver Cliente OTIMUS.