Ir para o conteúdo
NimbusNexus

Referência de Transforms

A API em https://transforms.nimbusnexus.net/v1 cria, versiona, testa e executa pipelines, apenas para o seu workspace. Requisições e respostas são JSON. Envie uma chave como Authorization: Bearer <key> ou X-API-Key: <key> (Como obter acesso). Os timestamps são ISO 8601 em UTC. A visão geral explica o produto, e Pipelines, o documento.

Rotas

RotaO que fazExige
POST /v1/pipelinesCria um pipeline e a versão 1 dele; 201 com o pipelinewrite; com uma etapa de credencial, admin
GET /v1/pipelinesOs pipelines do workspace, do mais novo para o mais antigo, cada um sem o documentoread
GET /v1/pipelines/{id}Um pipeline, com o documento atual e onde ele rodaread
PATCH /v1/pipelines/{id}Renomeia o pipeline, o liga ou desliga, ou salva uma nova versãowrite; com uma nova etapa de credencial, admin
DELETE /v1/pipelines/{id}Exclui um pipeline e as versões dele, para sempre; 204admin
GET /v1/pipelines/{id}/versionsAs versões mantidas, da mais recente para a mais antiga, cada uma sem o documentoread
GET /v1/pipelines/{id}/versions/{version}Uma versão, com o documento delaread
POST /v1/pipelines/{id}/runExecuta um pipeline salvo sobre uma requisiçãoread
POST /v1/pipelines/testTesta um documento sobre uma requisição, sem salvar nem contar nadawrite
GET /v1/pipelines/templatesOs templates para começarread
POST /v1/slotsAdiciona um slot de credencial; 201 com o slotadmin
GET /v1/slots, GET /v1/slots/{id}Os slots do workspace, do mais novo para o mais antigo, ou um sóread
PATCH /v1/slots/{id}Renomeia um slotadmin
DELETE /v1/slots/{id}Exclui um slot; 204admin
GET /v1/planO plano do workspace e os limites deleread
GET /v1/usageAs execuções deste mês e o que o workspace temread

read, write e admin são explicados em Quem pode fazer o quê.

As listas são paginadas com limit (de 1 a 200, padrão 50) e offset (de 0 a 10,000). A resposta é {"items": [...], "next_offset": <offset>}: passe next_offset de volta como offset para obter a próxima página. Ele é null na última página. GET /v1/pipelines/templates é a exceção: essa rota não recebe limit nem offset e responde com todos os templates em um único array simples.

O objeto pipeline

CampoDescrição
idpipe_ e 24 caracteres hexadecimais. Toda rota o recebe, e um produto referencia o pipeline por ele.
nameO nome que você dá a ele, com até 200 caracteres.
statusenabled ou disabled: o seu interruptor. Um pipeline desativado não roda, nem aqui nem em qualquer produto que o referencie.
current_versionA versão que roda.
pipelineO documento da versão atual; null na lista.
destinationsOs serviços que o executam por referência, cada um uma vez; null na lista (Quem executa um pipeline).
consumersO que cada um deles executa: service, version, last_seen_at, a última leitura dessa versão, e pinned, true quando uma referência fixa essa versão; null na lista.
created_at, updated_atQuando ele foi criado e quando foi alterado pela última vez.

POST /v1/pipelines recebe name e pipeline. Um documento que nunca conseguiria rodar é recusado com 422 invalid_pipeline e, acima dos pipelines do plano, a resposta é 402 quota_exceeded, com details.metric pipelines, details.limit e details.current.

Versões

PATCH /v1/pipelines/{id} recebe qualquer um de name, status e pipeline. Um pipeline novo é verificado como na criação e salvo como a próxima versão.

  • Uma versão nunca muda, então um produto pode guardar a própria cópia pelo id e pela versão.
  • Salvar o mesmo conteúdo não adiciona nenhuma versão.
  • Restaurar uma versão antiga é salvar o conteúdo dela de novo, o que faz dele a versão mais recente.
  • As versões do plano são mantidas, começando pelas mais recentes, e um salvamento remove as mais antigas além desse número. Uma versão que um produto fixa também é mantida, assim como as cinco versões anteriores que um produto foi visto executando mais recentemente nos últimos 30 dias.

Cada versão em GET /v1/pipelines/{id}/versions tem version, created_by e created_at; GET /v1/pipelines/{id}/versions/{version} acrescenta o pipeline dela. Uma versão que já não é mantida responde 404 not_found, pipeline_version.

Executar um pipeline

POST /v1/pipelines/{id}/run executa a versão atual, ou a versão mantida que version indica, sobre o que você envia:

CampoDescrição
bodyQualquer valor JSON, com até 256 KiB como JSON compacto e no máximo 32 níveis de aninhamento.
headersUm valor por nome, no máximo 256. Um nome tem até 256 caracteres e um valor até 8,192. Acima disso, a resposta é 422 validation_error.
metaContexto somente leitura para $meta: qualquer valor JSON, com no máximo 32 níveis de aninhamento.
versionA versão mantida a executar. Sem ele, a atual.

Nada da requisição é guardado, e a execução é contada. A resposta é um 200, independentemente do que o pipeline tenha feito:

CampoDescrição
statusok, envie body e headers; dropped, um filtro descartou a requisição, então não envie nada; failed, o pipeline não consegue rodar com esta requisição.
versionA versão que rodou; null em um teste.
body, body_changedO corpo a enviar, e true quando uma etapa o reescreveu. null, a menos que o resultado seja ok.
headersOs headers a enviar, com o valor de uma credencial mascarado como Bearer ••••.
queryO que uma etapa auth acrescenta à URL, mascarado da mesma forma.
stepA etapa que descartou a requisição ou a fez falhar, contada a partir de 0; caso contrário, null.
noteA nota de uma etapa que descarta.
reasonno_match para um filtro ao qual a requisição não correspondeu, matched para um filtro de descarte ao qual ela correspondeu, ou por que ela falhou, como set_conflict ou too_many_nodes. Trate-o como uma string aberta.
errorO mesmo em palavras, como step 2: set_conflict: ….
duration_msQuanto tempo a execução levou.

O mesmo pipeline com a mesma requisição falha do mesmo jeito, então não tente de novo um failed. Um pipeline desativado responde 409 conflict, pipeline_disabled, e acima da taxa do plano, ou com execuções ou testes demais do workspace em andamento ao mesmo tempo, uma execução responde 429 rate_limited, com details.retry_after.

Testar um documento

POST /v1/pipelines/test recebe pipeline, um documento que não precisa estar salvo, com body, headers e meta. Ele é verificado como em um salvamento, roda uma vez e não salva nem conta nada, embora compartilhe a taxa do plano. Um descarte ou uma falha é um 200 que diz isso.

Slots de credencial

Um slot é o que uma etapa auth indica: um id e um rótulo, sem valor. O Transforms não armazena nenhuma credencial, e nenhuma rota recebe uma. Um produto que executa o pipeline por referência associa o slot a um segredo próprio (Credenciais). POST /v1/slots recebe label, com até 200 caracteres, e responde 201:

CampoDescrição
idsec_ e letras e dígitos: o que uma etapa auth indica, e ele nunca muda.
labelPara que serve a credencial. Os produtos veem esse rótulo quando associam o slot a um segredo.
pipeline_countQuantos pipelines o indicam na versão atual.
created_at, updated_atQuando ele foi adicionado e quando foi renomeado pela última vez.

PATCH /v1/slots/{id} recebe label. DELETE /v1/slots/{id} responde 204, ou 409 conflict, com details.reason slot_in_use, details.id e details.pipelines, o número de pipelines, enquanto a versão atual de um pipeline o indicar. Acima dos slots do plano, adicionar um responde 402 quota_exceeded, com details.metric slots.

Quem executa um pipeline

Um produto referencia um pipeline pelo id e o executa no próprio processo, com os próprios segredos. O Webhooks é o primeiro: Transformações. Toda vez que um produto obtém o pipeline, o serviço e a versão são registrados, então a leitura de um pipeline mostra destinations e consumers.

Salvar uma nova versão com uma etapa auth alcança todos os produtos que executam o pipeline, e excluí-lo também. Cada uma dessas chamadas precisa indicar em confirm_destinations todos os serviços que têm uma referência ou foram vistos nos últimos 30 dias, no corpo de um PATCH e na query de um DELETE. Caso contrário, a resposta é um 409 conflict com details.reason destinations_unconfirmed e details.destinations, e nada muda. As próprias URLs de um serviço nunca aparecem aqui: esse produto faz a mesma pergunta em relação a elas.

Quem pode fazer o quê

Ler pipelines, versões, templates, slots, plano e uso; executarCriar, alterar e testar pipelinesExcluir um pipeline, salvar uma etapa de credencial ou adicionar, renomear ou excluir um slot
Proprietário ou admin do workspacesimsimsim
Membrosimsimnão
Viewer, ou qualquer outra funçãosimnãonão
Chave com Read & write (escopo admin)simsimsim
Chave com Read (escopo read)simnãonão

Uma ação recusada responde 403 forbidden com details.reason role, e details.required indica a função necessária. Um membro ainda pode renomear um pipeline com uma etapa de credencial, executá-lo, testá-lo e remover a etapa. O console da conta cria chaves Read e Read & write, e uma chave com qualquer outro escopo, como write, é tratada como Read.

O Transforms atende workspaces inteiros. Um assento de convidado, ou uma chave restrita a um projeto, é recusado com 403 project_confined. Um workspace tem o Transforms depois que um proprietário ou admin abre o console ou o adiciona em Add a product. Até lá, os outros membros são recusados com 403 product_not_enabled.

Planos e limites

GET /v1/plan informa quais limites se aplicam: plan, o plano registrado; enforced_as, o plano cujos limites se aplicam, free quando não há nenhum; ceilings, os limites pelo nome; past_due, suspended e system.

Chave em ceilingsDescriçãoFreeStarterProCustom
max_pipelinesPipelines que um workspace pode ter5251001,000
max_secret_slotsSlots de credencial que um workspace pode ter5251001,000
max_versionsVersões mantidas por pipeline102550100
run_rate_per_minExecuções e testes por minuto, por workspace606003,00012,000

Até o equivalente a dez segundos de execuções, e no mínimo 10, podem chegar em rápida sucessão. Um workspace também tem no máximo duas execuções ou testes em andamento ao mesmo tempo em cada processo do servidor, e mais um é recusado, sem ir para a fila, com 429 rate_limited e details.retry_after 1. GET /v1/usage informa quanto já foi usado: period, o mês, representado pelo primeiro dia; runs, failures e dropped deste mês, pela API de execução; pipelines em relação a max_pipelines; e slots, os slots existentes, em relação a max_secret_slots. As execuções são contadas, não cobradas, e uma execução em um produto que referencia o pipeline conta no uso desse produto.

Enquanto houver uma cobrança em aberto, as alterações são recusadas com 402 workspace_frozen, e as execuções e os testes continuam. Depois que o período de carência termina, as execuções e os testes também são recusados, com 402 workspace_suspended. As leituras e as exclusões continuam liberadas.

Erros

Os erros da API usam o formato descrito em Erros.

StatuscodeQuando
400bad_requestUm corpo JSON que não é UTF-8 válido.
401unauthorizedNenhuma credencial, uma credencial revogada ou uma sessão de login do console que terminou; details.reason diz qual.
401invalid_credentialUma chave que não passa na verificação, expirou ou foi criada para outro produto.
402quota_exceededCriar um pipeline ou adicionar um slot quando todos os do plano estão em uso; details.metric é pipelines ou slots.
402workspace_frozen, workspace_suspendedUma alteração enquanto há uma cobrança em aberto, ou qualquer coisa que não seja uma leitura ou uma exclusão depois que o serviço foi interrompido.
403forbiddendetails.reason é role, project_confined, product_not_enabled, csrf ou no_workspace.
404not_foundNão há esse pipeline, essa versão nem esse slot no seu workspace; details.reason é pipeline, pipeline_version ou slot.
405method_not_allowedO caminho existe, mas não para este método.
409conflictdetails.reason é pipeline_disabled (Executar um pipeline), destinations_unconfirmed (Quem executa um pipeline) ou slot_in_use (Slots de credencial).
413payload_too_largeUm corpo de requisição acima de 1 MiB.
422invalid_pipelineUm pipeline que nunca conseguiria rodar, ao ser salvo ou testado.
422validation_errorUm parâmetro ou campo falhou na validação. Um caractere NUL no caminho, na query ou em um corpo JSON aparece como uma entrada do tipo transforms.nul_character.
429rate_limitedAcima das execuções por minuto do plano, ou com execuções ou testes demais do workspace em andamento ao mesmo tempo (Planos e limites); details.retry_after diz quando tentar de novo.
500internal_errorAlgo quebrou do nosso lado.

Pipelines inválidos

A recusa indica o primeiro problema: details.reason, details.path (um JSON Pointer até ele) e details.step (contado a partir de 0), cada um quando se aplica.

JSON
{ "error": { "code": "invalid_pipeline", "message": "…", "details": { "reason": "credential_header", "path": "/steps/0/headers/set/Authorization", "step": 0 }, "request_id": "…" } }
reasonO que está errado
invalid_documentNão é um objeto com uma version e uma lista de steps.
unsupported_versionversion não é 1.
no_stepsNão há etapas.
too_many_stepsHá mais de 20 etapas.
invalid_stepUma etapa não é um objeto com uma única chave de etapa, sem nada ao lado além de uma note e, em um filtro, uma action.
unknown_stepUma chave de etapa não é filter, drop, set, map, headers nem auth.
invalid_valueUma configuração não é uma das que a etapa aceita, como um drop vazio ou uma nota com mais de 200 caracteres.
invalid_pathUm caminho não pode ser lido, ou tem um curinga onde a etapa não aceita nenhum.
invalid_templateUma expressão não pode ser lida, ou indica um filtro que não existe.
invalid_filterUm filtro não é válido, por exemplo porque usa um operador desconhecido.
invalid_headerUm nome de header não é válido ou pertence à conexão, ou um valor não é ASCII imprimível em uma só linha.
invalid_secretO secret de uma etapa de credencial não é o id de um slot. Um valor colado ali nunca é repetido.
auth_not_lastHá uma etapa depois de uma etapa de credencial.
too_deepAlgo está aninhado em mais de 32 níveis.
too_largeAs configurações de uma etapa passam de 16 KiB, ou o documento passa de 64 KiB.
not_jsonO documento contém um valor que não é JSON.
forbidden_headerUma etapa define Set-Cookie, um header que nenhuma requisição traz.
credential_headerUma etapa de headers define Authorization, Cookie ou X-Api-Key, o que guardaria a credencial no pipeline. Em vez disso, adicione-a com uma etapa de credencial.
unknown_slotUma etapa de credencial indica um slot que o workspace não tem.

Trate reason como uma string aberta e mantenha um caso padrão para um valor que você não conhece.

Próximos passos

  • Início rápido — teste um pipeline, salve-o e execute-o.
  • Pipelines — todas as etapas, caminhos, filtros e templates.
  • API de Transforms — todas as operações, com a requisição em curl, TypeScript, Python ou Go.
  • Erros — o formato do erro, todas as chaves de details e um padrão para tratá-los.