Pular para o conteúdo principal

API para usuários: visão geral

A API permite que os sistemas da sua equipe criem ou importem estudos, configurem rodadas, executem os modelos e baixem os resultados sem passar pelo navegador. Esta página reúne o que vale para todas as chamadas: autenticação, identificadores, acompanhamento de pedidos, idempotência, paginação, erros e limites. Cada grupo de rotas tem uma página própria, listada na tabela de endpoints.

A URL base é /api/v1. As respostas usam JSON, exceto os downloads. Os exemplos usam MYRIA_API para o endereço do seu ambiente e MYRIA_TOKEN para a chave de acesso. Substitua o endereço abaixo pelo fornecido à sua organização e mantenha a chave fora de arquivos compartilhados:

export MYRIA_API="https://seu-ambiente-myria.example"
export MYRIA_TOKEN="myria_live_..."

Para consultar os campos de cada rota e testar chamadas no navegador, use a referência interativa Scalar, gerada a partir da especificação OpenAPI. As páginas desta seção explicam os fluxos; a referência interativa descreve cada campo.

cuidado

A referência interativa envia requisições reais ao ambiente aberto no navegador. Criar, alterar, executar ou excluir recursos tem efeito nesse ambiente. Informe a chave em bearerAuth; ela é esquecida ao recarregar a página.

Criar uma chave de acesso​

No Portal, abra Perfil e, em Chaves de API, clique em Minhas chaves. Em Nova chave, dê um nome, escolha as permissões e clique em Criar chave. O segredo aparece uma única vez, em Segredo criado: copie-o nesse momento. Sem uma data de expiração, a chave vale por 90 dias. Uma chave que não será mais usada pode ser encerrada em Revogar. Administradores da organização veem todas as chaves em Chaves da organização. O passo a passo está em Perfil.

Envie a chave em todas as requisições:

Authorization: Bearer myria_live_<public_id>.<secret>

Permissões​

Cada chave tem um conjunto de permissões (scopes):

PermissãoAutoriza
studies:readConsultar estudos, versões, entradas, topologia, configuração e regras; gerar prévias.
studies:writeCriar, importar, alterar e excluir estudos, rodadas, regras e entradas.
executions:readConsultar execuções e baixar seus resultados.
executions:writeIniciar e parar execuções.
webhooks:readConsultar a configuração e as entregas de webhook.
webhooks:writeConfigurar ou desligar o webhook, trocar o segredo e refazer entregas.

As rotas de /operations aceitam a permissão de leitura (ou de escrita, para cancelar) do domínio do pedido: uma chave só com studies:read não enxerga pedidos de execução, por exemplo.

Um recurso inexistente e um recurso de outra organização respondem com o mesmo 404.

Identidade de estudos e rodadas​

A API identifica estudos por study_key e rodadas por round_key. As duas chaves têm o formato <slug-da-organização>-<número>, por exemplo minha-org-42. Elas não mudam quando o estudo ou a rodada é renomeado. Nomes exibidos não servem como identificadores.

As rotas de rodada ficam sob o estudo: /studies/{study_key}/rodadas/{round_key}/.... A API confere que a rodada pertence ao estudo informado e à organização da chave; caso contrário, responde 404.

Os demais identificadores públicos têm prefixos estáveis, como op_<32 hex> (pedidos), exec_... (execuções), leg_... (etapas), attempt_... (tentativas), inp_... (entradas), manifest_... e art_... (resultados), rules_... (regras enviadas), catalog_... (Cards do catálogo) e source-... (fontes externas). delivery_id e event_id de webhooks são UUIDs. Trate todos como texto opaco.

Vocabulário​

Alguns nomes aparecem em inglês porque fazem parte das URLs e do JSON:

Nome na APIO que significa
Study (estudo)Configuração, arquivos de entrada e histórico de execuções de um cenário.
Version (versão)Uma versão imutável da configuração do estudo, identificada pelo campo sha. O estudo expõe a versão atual em deck_version.
Input (arquivo de entrada)Um arquivo usado por uma rodada, como um PREVS, ou um ZIP parcial com várias entradas.
Operation (acompanhamento)O protocolo de um trabalho que continua depois da resposta HTTP.
Execution (execução)Um pedido para rodar o estudo inteiro ou parte das rodadas.
Leg (etapa da execução)A execução de uma rodada dentro de uma execução.
Attempt (tentativa)Uma tentativa de processar uma etapa.
Artifact (arquivo de resultado)Um arquivo produzido pela execução, como log, relatório ou deckoutput.json.
Manifest (conjunto de resultados)A lista fechada dos arquivos coletados em uma tentativa.
Baseline (versão de referência)A versão escolhida como ponto de partida para comparações.

Acompanhar pedidos (Operation)​

Importações, criações, alterações de deck, execuções e exclusões continuam depois da resposta HTTP. Essas rotas respondem 202 Accepted com os dados para acompanhar o pedido:

{
"operation_id": "op_0123456789abcdef0123456789abcdef",
"status": "queued",
"status_url": "/api/v1/operations/op_0123456789abcdef0123456789abcdef"
}

Consulte status_url até terminal ser true:

statusSignificado
queuedO pedido foi aceito e aguarda processamento.
runningO Myria está processando o pedido.
attention_requiredO pedido precisa de análise. Leia reason_code e action_required. Esse estado não confirma que um processamento remoto foi interrompido.
succeededTerminou com sucesso. Os identificadores criados estão em result.
failedFalhou. Leia error e reason_code.
cancelledFoi cancelado antes de terminar.

A resposta também traz kind e domain (o tipo de pedido), progress, revision, created_at, started_at e finished_at. GET /operations lista os pedidos visíveis para a chave, com paginação por cursor.

cancellable informa se o pedido ainda aceita cancelamento. Para cancelar, use POST /operations/{operation_id}/cancel com Idempotency-Key; a resposta é 200 com a Operation atualizada. Um pedido que já passou do ponto sem volta responde 409 com operation_not_cancellable.

Quando um pedido concluído se refere a um estudo que foi excluído depois, GET /operations/{operation_id} responde 410 com operation_resource_gone. Na listagem, esse pedido aparece com resource_gone: true e result vazio.

Evitar pedidos duplicados (Idempotency-Key)​

Toda chamada que cria, altera, executa, cancela ou exclui algo exige o cabeçalho Idempotency-Key, inclusive POST /operations/{operation_id}/cancel:

Idempotency-Key: importar-estudo-agosto-001

A chave tem de 1 a 255 caracteres, sem caracteres de controle; espaços nas pontas são descartados. Gere um valor único para cada pedido do seu sistema e guarde-o com o pedido. Se houver timeout ou perda de conexão, repita a mesma requisição com a mesma chave: o Myria devolve o resultado original sem fazer o trabalho de novo.

Reutilizar a chave com outro corpo, rota ou recurso retorna 409 com idempotency_key_reused. Para tentar de novo um pedido que falhou, envie uma chave nova.

Não usam Idempotency-Key as chamadas que apenas calculam e não gravam nada: POST /deck-rules/validate, POST .../incremental-operations/preview, POST .../configuration/preview e POST .../earm-preview. A prévia do deck montado (POST .../deck-rules/preview) exige a chave, porque cria um pedido acompanhado por Operation.

Paginação​

As listagens aceitam limit de 1 a 100 (padrão 50). Quando houver outra página, copie next_cursor para o parâmetro cursor da chamada seguinte:

{"data": [], "page": {"limit": 50, "next_cursor": null, "has_more": false}}
curl -sS "$MYRIA_API/api/v1/studies?limit=50&cursor=$NEXT_CURSOR" \
-H "Authorization: Bearer $MYRIA_TOKEN"

Envie o cursor exatamente como recebeu. A API usa cursor, nunca offset; o parâmetro offset é recusado com offset_not_supported.

A exceção é GET /studies/{study_key}/rodadas/{round_key}/files: essa rota aceita só limit e devolve page.limit e page.has_more, sem cursor.

Erros​

Todo erro usa a mesma estrutura:

{
"error": {
"code": "idempotency_key_reused",
"message": "Idempotency-Key ja foi usada com outra requisicao.",
"details": {}
},
"request_id": "req_4f0c2b9e8d7a4c1b9e3f5a6d7c8b9a0e"
}

request_id tem o formato req_<32 hex> e também vem no cabeçalho X-Request-ID. Informe esse valor ao abrir um chamado. Use error.code na sua integração; message é um texto para pessoas e pode mudar.

HTTPQuando aconteceCódigos frequentes
400Campo ausente, valor inválido, campo desconhecido ou combinação não permitida.invalid_payload, invalid_json, missing_idempotency_key, invalid_idempotency_key, invalid_limit, offset_not_supported
401Chave ausente, malformada, desconhecida, revogada ou expirada. A resposta traz WWW-Authenticate: Bearer.missing_api_key, invalid_api_key, revoked_api_key, expired_api_key
403A chave não tem a permissão exigida, ou a fonte Git escolhida está fora das pastas autorizadas.insufficient_scope, forbidden_prevs_source
404Recurso inexistente ou de outra organização.not_found
405Método HTTP não aceito pela rota. O cabeçalho Allow lista os métodos válidos.method_not_allowed
409Versão ou número de revisão desatualizado, chave de idempotência reutilizada, estudo ocupado por outro pedido, pedido que não pode mais ser cancelado.idempotency_key_reused, operation_not_cancellable, study_execution_active
410O prazo de retenção do arquivo terminou, ou o estudo de um pedido concluído foi excluído.artifact_expired, operation_resource_gone
413Arquivo acima do limite.file_too_large, deck_rules_source_too_large
415Content-Type diferente do esperado (JSON ou multipart/form-data).unsupported_media_type
422O conteúdo é bem formado, mas não pode ser aplicado: regras, perfil ou configuração inválidos.varia por rota
429Limite de requisições atingido.rate_limited
500Erro interno. Guarde o request_id.internal_error
502O serviço de cálculo de EARM não respondeu à prévia.earm_upstream_unavailable
503Armazenamento ou fonte Git temporariamente indisponível. Tente de novo mais tarde.artifact_storage_unavailable, prevs_source_head_unavailable

Os códigos específicos de cada rota aparecem nas páginas de cada grupo.

Limites de requisições​

As chamadas que criam ou alteram algo consomem uma cota por hora. A cota vale para cada chave e, com valor dez vezes maior, para a organização inteira. A contagem recomeça a cada hora cheia do relógio. Os limites padrão são:

GrupoRotasPor chavePor organização
EstudosPOST /studies, POST /studies/fast-track30/hora300/hora
EnviosPOST /studies/imports, POST e DELETE em /inputs30/hora300/hora
ExecuçõesPOST /studies/{study_key}/executions60/hora600/hora
ExpansõesPOST .../incremental-operations e .../incremental-operations/preview60/hora600/hora
Configuraçõesopções, configuração da rodada (alteração, prévia e aplicação), sensibilidades, diffs, validações, prévia do deck e resolução de Cards60/hora600/hora
Prévias de EARMPOST .../earm-preview30/hora300/hora
ParadasPOST /executions/{execution_id}/stop60/hora600/hora
ExclusõesDELETE /studies/{study_key}30/hora300/hora
WebhookPUT e DELETE /webhook, POST /webhook/rotate-secret, cada um30/hora300/hora
Reenvios de webhookPOST .../redeliver60/hora600/hora

Repetir a mesma Idempotency-Key de um pedido já aceito não consome cota. Prévias que não usam Idempotency-Key consomem cota a cada chamada. Leituras não consomem essas cotas.

Falhas de autenticação também são limitadas: 60 por minuto por endereço IP e 10 por minuto por chave. Acima disso, a API responde 429 mesmo que a chave seguinte esteja correta.

Ao atingir um limite, a resposta é 429 com rate_limited, o cabeçalho Retry-After (segundos até liberar) e X-RateLimit-Limit. Em details, a API informa action, bucket (key ou org), limit, window_seconds e retry_after_seconds. Aguarde o tempo indicado antes de repetir.

Exemplo completo: criar e executar​

Este exemplo cria um estudo com as rodadas padrão da organização (Fast Track), executa e baixa um resultado.

  1. Crie o estudo:

    curl -sS -X POST "$MYRIA_API/api/v1/studies/fast-track" \
    -H "Authorization: Bearer $MYRIA_TOKEN" \
    -H "Content-Type: application/json" \
    -H "Idempotency-Key: fast-track-agosto-001" \
    -d '{"name":"Cenário hidrológico de agosto","description":"Criado pela API"}'
  2. Acompanhe o pedido até terminal: true:

    curl -sS "$MYRIA_API/api/v1/operations/$OPERATION_ID" \
    -H "Authorization: Bearer $MYRIA_TOKEN"

    Em succeeded, os decks já foram montados. Pegue result.study_key.

  3. Confirme que o estudo está pronto (readiness: "ready"):

    curl -sS "$MYRIA_API/api/v1/studies/$STUDY_KEY" \
    -H "Authorization: Bearer $MYRIA_TOKEN"
  4. Inicie a execução de todas as rodadas:

    curl -sS -X POST "$MYRIA_API/api/v1/studies/$STUDY_KEY/executions" \
    -H "Authorization: Bearer $MYRIA_TOKEN" \
    -H "Content-Type: application/json" \
    -H "Idempotency-Key: executar-agosto-001" \
    -d '{}'
  5. Acompanhe a nova Operation. Em succeeded, pegue result.execution_id e acompanhe a execução até status sair de running:

    curl -sS "$MYRIA_API/api/v1/executions/$EXECUTION_ID" \
    -H "Authorization: Bearer $MYRIA_TOKEN"
  6. Liste os resultados mais recentes e baixe um deles pelo artifact_id:

    curl -sS "$MYRIA_API/api/v1/executions/$EXECUTION_ID/artifacts" \
    -H "Authorization: Bearer $MYRIA_TOKEN"

    curl -sS -f -o resultado.bin \
    "$MYRIA_API/api/v1/executions/$EXECUTION_ID/artifacts/$ARTIFACT_ID/download" \
    -H "Authorization: Bearer $MYRIA_TOKEN"

Para receber avisos em vez de consultar a API em intervalos, configure um webhook.

Todos os endpoints​

As rotas são relativas a /api/v1. A coluna "Página" leva à explicação do fluxo; os campos estão na referência interativa.

TarefaMétodo e rotaPermissãoRespostaPágina
Listar estudosGET /studiesstudies:read200, listaEstudos
Criar só o cadastroPOST /studiesstudies:write202 OperationEstudos
Criar com Fast TrackPOST /studies/fast-trackstudies:write202 OperationEstudos
Importar ZIPPOST /studies/importsstudies:write202 OperationEstudos
Consultar estudoGET /studies/{study_key}studies:read200 StudyEstudos
Alterar nome ou descriçãoPATCH /studies/{study_key}studies:write200 StudyEstudos
Excluir estudoDELETE /studies/{study_key}studies:write202 OperationEstudos
Listar versõesGET /studies/{study_key}/versionsstudies:read200, listaEstudos
Consultar versãoGET /studies/{study_key}/versions/{sha}studies:read200 VersionEstudos
Consultar versão de referênciaGET /studies/{study_key}/baselinestudies:read200 BaselineEstudos
Definir versão de referênciaPUT /studies/{study_key}/baselinestudies:write200 BaselineEstudos
Comparar versõesPOST /studies/{study_key}/diffsstudies:write202 OperationEstudos
Validar versãoPOST /studies/{study_key}/validationsstudies:write202 OperationEstudos
Consultar topologiaGET /studies/{study_key}/topologystudies:read200Expandir
Pré-visualizar RV+, M+ ou D+POST /studies/{study_key}/incremental-operations/previewstudies:read200Expandir
Criar RV+, M+ ou D+POST /studies/{study_key}/incremental-operationsstudies:write202 OperationExpandir
Listar sensibilidadesGET /studies/{study_key}/rodadas/{round_key}/sensitivitiesstudies:read200, listaExpandir
Criar sensibilidadesPOST /studies/{study_key}/rodadas/{round_key}/sensitivitiesstudies:write202 OperationExpandir
Consultar opções da rodadaGET /studies/{study_key}/rodadas/{round_key}/optionsstudies:read200Configurar
Alterar opções da rodadaPATCH /studies/{study_key}/rodadas/{round_key}/optionsstudies:write202 OperationConfigurar
Listar executáveisGET /binariesstudies:read200Configurar
Consultar configuraçãoGET /studies/{study_key}/rodadas/{round_key}/configurationstudies:read200Configurar
Salvar configuraçãoPATCH /studies/{study_key}/rodadas/{round_key}/configurationstudies:write200Configurar
Pré-visualizar configuraçãoPOST /studies/{study_key}/rodadas/{round_key}/configuration/previewstudies:read200Configurar
Aplicar configuraçãoPOST /studies/{study_key}/rodadas/{round_key}/configuration/applystudies:write202 OperationConfigurar
Simular ajuste de EARMPOST /studies/{study_key}/rodadas/{round_key}/earm-previewstudies:read200Configurar
Listar entradasGET /studies/{study_key}/inputsstudies:read200, listaConfigurar
Enviar entradaPOST /studies/{study_key}/inputsstudies:write202 OperationConfigurar
Excluir entradaDELETE /studies/{study_key}/inputs/{input_id}studies:write202 OperationConfigurar
Listar arquivos da rodadaGET /studies/{study_key}/rodadas/{round_key}/filesstudies:read200Configurar
Baixar arquivo da rodadaGET /studies/{study_key}/rodadas/{round_key}/files/{filename}studies:read200 (bytes)Configurar
Validar regrasPOST /deck-rules/validatestudies:write200Regras de deck
Enviar regrasPOST /deck-rules/uploadsstudies:write201Regras de deck
Listar Cards do catálogoGET /deck-rules/catalogstudies:read200, listaRegras de deck
Resolver CardPOST /deck-rules/catalog/{catalog_id}/resolvestudies:write202 OperationRegras de deck
Perfil da organizaçãoGET/PATCH /deck-rules/profileleitura/escrita200Regras de deck
Perfil do estudoGET/PATCH /studies/{study_key}/deck-rules-profileleitura/escrita200Regras de deck
Cards da rodadaGET/PUT /studies/{study_key}/rodadas/{round_key}/deck-rulesleitura/escrita200Regras de deck
Prévia do deck montadoPOST /studies/{study_key}/rodadas/{round_key}/deck-rules/previewstudies:read202 OperationRegras de deck
Listar execuçõesGET /studies/{study_key}/executionsexecutions:read200, listaExecutar
Iniciar execuçãoPOST /studies/{study_key}/executionsexecutions:write202 OperationExecutar
Consultar execuçãoGET /executions/{execution_id}executions:read200 ExecutionExecutar
Parar execuçãoPOST /executions/{execution_id}/stopexecutions:write202 OperationExecutar
Listar resultados mais recentesGET /executions/{execution_id}/artifactsexecutions:read200, listaResultados
Listar coletasGET /executions/{execution_id}/artifact-manifestsexecutions:read200, listaResultados
Listar resultados de uma coletaGET /executions/{execution_id}/artifact-manifests/{manifest_id}/artifactsexecutions:read200, listaResultados
Consultar um resultadoGET /executions/{execution_id}/artifacts/{artifact_id}executions:read200 ArtifactResultados
Baixar um resultadoGET /executions/{execution_id}/artifacts/{artifact_id}/downloadexecutions:read200 (bytes), 409, 410 ou 503Resultados
Listar pedidosGET /operationsleitura do domínio200, listaAcompanhar pedidos
Acompanhar pedidoGET /operations/{operation_id}leitura do domínio200 OperationAcompanhar pedidos
Cancelar pedidoPOST /operations/{operation_id}/cancelescrita do domínio200 OperationAcompanhar pedidos
Consultar webhookGET /webhookwebhooks:read200 ou 404Webhooks
Configurar webhookPUT /webhookwebhooks:write200Webhooks
Desligar webhookDELETE /webhookwebhooks:write200Webhooks
Trocar segredoPOST /webhook/rotate-secretwebhooks:write200 ou 404Webhooks
Listar entregasGET /webhook/deliverieswebhooks:read200, listaWebhooks
Refazer entregaPOST /webhook/deliveries/{delivery_id}/redeliverwebhooks:write202 OperationWebhooks