{"openapi":"3.0.1","info":{"title":"API V0","version":"v0","description":"API de Administração do Quicknode V0","contact":{"name":"Quicknode"}},"paths":{"/v0/account/info":{"get":{"summary":"Retrieves account info for the authenticated API key","tags":["Account"],"description":"Devolve informações de identificação não confidenciais relativas à conta à qual a chave API pertence","operationId":"accountInfo","responses":{"200":{"description":"sucesso","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"id":{"type":"integer"},"name":{"type":"string"},"created_at":{"type":"string","format":"date-time"},"billing_version":{"type":"string"},"subscription":{"type":"object","properties":{"plan_name":{"type":"string","nullable":true},"status":{"type":"string"},"interval":{"type":"string"}}}}},"error":{"type":"string","nullable":true}}}}}}}}},"/v0/api-credits/{chain}":{"get":{"summary":"Fetch API credits for a chain","tags":["Chains"],"description":"Recupera o custo em créditos da API de cada método disponível numa cadeia, calculado de acordo com a configuração de faturação da conta que efetua a chamada. Aceita os slugs das cadeias devolvidos pela API /v0/chains.","operationId":"apiCredits","parameters":[{"name":"chain","in":"path","description":"String da cadeia, tal como é devolvida por /v0/chains","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"sucesso","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/api_credit"}},"error":{"type":"string","nullable":true}},"required":["data","error"]}}}},"404":{"description":"cadeia não encontrada","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"nullable":true},"error":{"type":"string"}}}}}}}}},"/v0/billing/invoices":{"get":{"summary":"Retrieves list of invoices","tags":["Billing"],"description":"Recuperar a lista de faturas","operationId":"invoices","responses":{"200":{"description":"sucesso","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"invoices":{"type":"array","items":{"$ref":"#/components/schemas/invoice"}}}},"error":{"type":"string","nullable":true}}}}}}}}},"/v0/billing/payments":{"get":{"summary":"Retrieves list of payments","tags":["Billing"],"description":"Recuperar a lista de pagamentos","operationId":"payments","responses":{"200":{"description":"sucesso","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"payments":{"type":"array","items":{"$ref":"#/components/schemas/payment"}}}},"error":{"type":"string","nullable":true}}}}}}}}},"/v0/chains":{"get":{"summary":"Fetch list of chains","tags":["Chains"],"description":"Obter uma lista de cadeias","operationId":"chains","responses":{"200":{"description":"sucesso","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/chain"}},"error":{"type":"string","nullable":true}},"required":["data","error"]}}}}}}},"/v0/endpoints/{id}/logs":{"get":{"summary":"Gets endpoint logs","tags":["Endpoint Logs"],"description":"Recupera os registos de um ponto de extremidade específico","operationId":"getEndpointLogs","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"include_details","in":"query","required":false,"schema":{"type":"boolean"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer"}},{"name":"next_at","in":"query","required":false,"schema":{"type":"string"}},{"name":"from","in":"query","required":true,"schema":{"type":"string"}},{"name":"to","in":"query","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"os registos foram recuperados com sucesso","content":{"application/json":{"examples":{"logs_response":{"value":{"data":[{"timestamp":"2025-04-29T12:39:25.543Z","method":"eth_sendRawTransaction","network":"xdai","http_method":"POST","status":200,"error_code":null,"url":"/pt","request_id":"fbecafc8-24f6-11f0-b300-484b1a416a3f","details":{"request":"{\"jsonrpc\": \"2.0\", \"method\": \"eth_sendRawTransaction\", \"params\": [\"0x02f9051364824553843b9aca0084ee6b2800839896809469c0669f3b5df0f2e2644f01098b4465f565210180b904a46a761202000000000000000000000000a238cbeb142c10ef7ad8442c6d1f9e89e07e776100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000036000000000000000000000000000000000000000000000000000000000000001e48d80ff0a0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000019200552cea7bc33cbbeb9f1d90c1d11d2c6daeffd053000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c44954bbf142be1354a90d0ca1804fa5a595bd660dcee74cd6544b21759a1f5f0f8937efc20000000000000000000000000000000000000000000000000000000000000080000000000000000000000000998defafd094817ef329f6dc79c703f1cf18bc9000000000000000000000000000000000000000000000000000000000000003cf000000000000000000000000000000000000000000000000000000000000002034d4c8c2a0dd1cf3a4e0f93ccf8bd133a5551858eb631c2ffdb498a21b064d3c00694e62bdf7ff510a4ee66662cf4866a961a31653000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000245b34eba00e61d8e891e53169dd53017bf27e85e0e72418fa8bc0198eeb31990dc5d155ec00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001047f3797395663a7e45089db42caf92bb87fc5667dba0720559eb436fb90f946ce55632dbc31613ff37e376\"]","response":"{\"jsonrpc\":\"2.0\",\"result\":\"0x346465fe1518d3a2dc0a45fe51ca3052097397708f242c063c256c13182cf214\",\"id\":0}"}},{"timestamp":"2025-04-29T12:39:15.627Z","method":"eth_call","network":"xdai","http_method":"POST","status":200,"error_code":-32015,"url":"/pt","request_id":"f6038dca-24f6-11f0-b2d8-484b1a416a3f","details":{"request":"{\"jsonrpc\": \"2.0\", \"method\": \"eth_call\", \"params\": [{\"to\": \"0xE49CB081e8d96920C38aA7AB90cb0294ab4Bc8EA\", \"data\": \"0x02a8ca100000000000000000000000000000000000000000000000000000000000000000\"}, \"latest\"], \"id\": 1}","response":"{\"jsonrpc\":\"2.0\",\"error\":{\"code\":-32015,\"message\":\"VM execution error.\",\"data\":\"\\u000E\\u0797Y\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\"},\"id\":1}"}}],"next_at":"MTc0NTkzMDM1NTYwOTAwMDAwMHxmNjAwZDgxZS0yNGY2LTExZjAtYjJkNy03OTQwZmE2MDc2NWM="}}}}}},"400":{"description":"parâmetros inválidos"},"404":{"description":"ponto final não encontrado"}}}},"/v0/endpoints/{id}/log_details":{"get":{"summary":"Gets log details","tags":["Endpoint Logs"],"description":"Recupera informações detalhadas sobre uma entrada específica do registo","operationId":"getLogDetails","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"request_id","in":"query","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Os detalhes do registo foram recuperados com sucesso","content":{"application/json":{"examples":{"log_details_response":{"value":{"data":{"request":"{\"jsonrpc\": \"2.0\", \"method\": \"eth_call\", \"params\": [{\"to\": \"0x62cCf8eE8756a7c6022C10Cb6Ee167F420d87A25\", \"from\": \"0xcb2434A1732Ed962E0c4232953c13eEe6719fff3\", \"value\": \"0x0\", \"data\": \"0x6a761202000000000000000000000000a238cbeb142c10ef7ad8442c6d1f9e89e07e7761000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001400000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000024000000000000000000000000000000000000000000000000000000000000000c48d80ff0a0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000007900694e62bdf7ff510a4ee66662cf4866a961a31653000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000245b34eba0fcdeea0990fd076f3cca9061bfebc302e4febc1a6aeb9cc7e10b735424c8bcb50000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010426a6e1e913784ae25ea661d0dcb4ce13bbd990693c3ebadb0a8e866afb8b1dd52152d784372b9320a76fa6fdb50f6101072f1f05a788eb4ce71bc90a712552e41ce1b52eb77fb8b95efbeb2511299534e92bd891f9694dc41d669be446411294fd72d8c2056c4f71065d9d9abc0f613eae8f5c36e3df73f1a8d838fb917bd5d39d1b5b2330dd098dd48b43df57dbdb1a8cb4228274062e91e6d4efc51ed2d5d26aaf1f00872cfc79b630ec5adb943fe34491a67bc88b41baf1e7667cc8a49a0acc1d1c97394f2ac9bc249d35e093111f3906f229e57937ce21a4be147f5fe39f2964e05d6d0de3294c642d459cd9aa2cd8e54fe81ae396aaa9c4222c83d6545877c7271c00000000000000000000000000000000000000000000000000000000\"}, \"0x25f68d6\"], \"id\": 321}","response":"{\"jsonrpc\":\"2.0\",\"id\":321,\"error\":{\"code\":3,\"message\":\"execution reverted: GS026\",\"data\":\"0x08c379a0000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000054753303236000000000000000000000000000000000000000000000000000000\"}}\\n"}}}}}}},"400":{"description":"A Hermes rejeita UUIDs que não sejam baseados no tempo"},"404":{"description":"ponto final não encontrado"}}}},"/v0/endpoints/{id}/method-rate-limits":{"get":{"summary":"Gets method rate limits","tags":["Endpoint Rate Limits"],"description":"Obtém os limites de taxa do método","operationId":"getMethodRateLimits","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"pontos finais recuperados","content":{"application/json":{"examples":{"rate_limiters_list":{"value":{"data":{"rate_limiters":[{"id":"a1b2c3d4-e5f6-4a5b-9c8d-7e6f5a4b3c2d","interval":"second","methods":["example_method"],"rate":10,"status":"enabled","created":"2024-01-01T12:00:00.000000Z"}]},"error":null}}}}}},"404":{"description":"retorna um valor vazio quando o ponto de extremidade não existe"}}},"post":{"summary":"Creates a method rate limit","tags":["Endpoint Rate Limits"],"description":"Cria um limite de taxa para um método","operationId":"createMethodRateLimit","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"limite de taxa do método criado","content":{"application/json":{"examples":{"example_key":{"value":{"data":{"created":"2024-01-01T12:00:00.000000Z","id":"a1b2c3d4-e5f6-4a5b-9c8d-7e6f5a4b3c2d","interval":"second","methods":["example_method"],"rate":10,"status":"enabled"},"error":null}}}}}},"400":{"description":"parâmetros inválidos"},"404":{"description":"ponto final não encontrado"}},"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"interval":{"type":"string","enum":["second","minute","day"]},"methods":{"type":"array","items":{"type":"string"}},"rate":{"type":"integer"}},"required":["interval","methods","rate"]}}}}}},"/v0/endpoints/{id}/method-rate-limits/{method_rate_limit_id}":{"patch":{"summary":"Updates a method rate limit","tags":["Endpoint Rate Limits"],"description":"Atualiza o limite de taxa de um método","operationId":"updateMethodRateLimit","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"method_rate_limit_id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Limite de taxa do método atualizado","content":{"application/json":{"examples":{"single_rate_limiter":{"value":{"data":{"created":"2024-01-01T12:00:00.000000Z","id":"a1b2c3d4-e5f6-4a5b-9c8d-7e6f5a4b3c2d","interval":"day","methods":["example_method_1","example_method_2"],"rate":30,"status":"enabled"},"error":null}}}}}},"400":{"description":"pedido inválido"},"404":{"description":"limite de taxa não encontrado"}},"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"methods":{"type":"array","items":{"type":"string"}},"status":{"type":"string","enum":["enabled","disabled"]},"rate":{"type":"integer"}}}}}}},"delete":{"summary":"Deletes a method rate limit","tags":["Endpoint Rate Limits"],"description":"Elimina um limite de taxa de um método","operationId":"deleteMethodRateLimit","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"method_rate_limit_id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"limite de taxa do método eliminado","content":{"application/json":{"examples":{"rate_limiter_deletion":{"value":{"data":"Rate limit deleted successfully","error":null}}}}}},"404":{"description":"limite de taxa do método não encontrado"}}}},"/v0/endpoints/{id}/metrics":{"get":{"summary":"Fetch single metric","tags":["Endpoint Metrics"],"description":"Recupera uma única métrica para um ponto de extremidade","operationId":"fetchEndpointMetric","parameters":[{"name":"id","in":"path","required":true,"description":"ID do terminal","schema":{"type":"string"}},{"name":"period","in":"query","schema":{"type":"string","enum":["hour","day","week","month"]},"required":true,"description":"hora, dia, semana, mês"},{"name":"metric","in":"query","schema":{"type":"string","enum":["method_calls_over_time","metered_endpoint_data_over_time","metered_endpoint_credits_over_time","credits_over_time","response_status_over_time","response_status_breakdown","response_time_over_time","method_response_time_max","request_errors_over_time","total_request_errors_over_time"]},"required":true,"description":"chamadas_de_método_ao_longo_do_tempo, dados_de_ponto_final_medidos_ao_longo_do_tempo, créditos_de_ponto_final_medidos_ao_longo_do_tempo, créditos_ao_longo_do_tempo, estado_da_resposta_ao_longo_do_tempo, discriminação_do_estado_da_resposta, tempo_de_resposta_ao_longo_do_tempo, tempo_máximo_de_resposta_do_método, erros_de_pedido_ao_longo_do_tempo, total_de_erros_de_pedido_ao_longo_do_tempo"}],"responses":{"200":{"description":"sucesso","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/endpoint_metric"}},"error":{"type":"string","nullable":true}},"required":["data","error"]}}}}}}},"/v0/endpoints/{id}/rate-limits":{"get":{"summary":"List endpoint rate limits","tags":["Endpoint Rate Limits"],"description":"Devolve os limites de taxa atualmente aplicados ao ponto de extremidade, juntamente com a origem de cada valor.","operationId":"getRateLimits","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Limites de taxa devolvidos"},"404":{"description":"Ponto final não encontrado"}}},"patch":{"summary":"Update endpoint rate limits (partial)","tags":["Endpoint Rate Limits"],"description":"Atualização parcial das substituições dos limites de taxa ao nível do endpoint (RPS/RPM/RPD). Apenas os buckets incluídos no corpo do pedido são alterados — os buckets omitidos permanecem inalterados. Não existe um comportamento de «limpeza por omissão». O método PUT também é aceite como um alias legado desta operação.","operationId":"updateRateLimits","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Limites de taxa atualizados"},"400":{"description":"Erro na solicitação"},"404":{"description":"Ponto final não encontrado"},"500":{"description":"Erro interno do servidor"}},"requestBody":{"content":{"application/json":{"schema":{"type":"object","required":["rate_limits"],"properties":{"rate_limits":{"type":"object","properties":{"rps":{"type":"integer","minimum":1,"description":"Número máximo de pedidos por segundo. Limitado pelo nível do plano da conta."},"rpm":{"type":"integer","minimum":1,"description":"Número máximo de pedidos por minuto. Limitado pelo nível do plano da conta."},"rpd":{"type":"integer","minimum":1,"description":"Número máximo de pedidos por dia. Limitado pelo nível do plano da conta."}},"minProperties":1}}}}}}},"put":{"summary":"Update endpoint rate limits (legacy PUT alias)","tags":["Endpoint Rate Limits"],"description":"Obsoleto — mantido por motivos de compatibilidade com versões anteriores para os clientes da API existentes. Em vez disso, utilize PATCH /v0/endpoints/{id}/rate-limits.","operationId":"updateRateLimitsLegacyPut","deprecated":true,"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Limites de taxa atualizados"}},"requestBody":{"content":{"application/json":{"schema":{"type":"object","required":["rate_limits"],"properties":{"rate_limits":{"type":"object","properties":{"rps":{"type":"integer","minimum":1,"description":"Número máximo de pedidos por segundo. Limitado pelo nível do plano da conta."},"rpm":{"type":"integer","minimum":1,"description":"Número máximo de pedidos por minuto. Limitado pelo nível do plano da conta."},"rpd":{"type":"integer","minimum":1,"description":"Número máximo de pedidos por dia. Limitado pelo nível do plano da conta."}},"minProperties":1}}}}}}}},"/v0/endpoints/{id}/rate-limits/{override_id}":{"delete":{"summary":"Delete a user-set rate-limit override","tags":["Endpoint Rate Limits"],"description":"Elimina a substituição do limite de taxa definida pelo utilizador, identificada pelo seu UUID. O ID da substituição é apresentado na resposta GET dos limites de taxa, nas linhas «user_override». Devolve o código de estado 404 se o ID não corresponder a uma substituição definida pelo utilizador neste ponto de extremidade — os valores predefinidos do plano não podem ser eliminados.","operationId":"deleteRateLimitOverride","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"override_id","in":"path","description":"O UUID da substituição do limite de taxa definida pelo utilizador, tal como é devolvido pela resposta GET «rate-limits».","required":true,"schema":{"type":"string"}}],"responses":{"404":{"description":"Não foi encontrada nenhuma substituição"}}}},"/v0/endpoints/{id}/security_options":{"get":{"summary":"Gets security options","tags":["Endpoint Security"],"description":"Obtém as opções de segurança de um terminal","operationId":"getSecurityOptions","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"opções de segurança obtidas","content":{"application/json":{"examples":{"security_options_list":{"value":{"data":[{"option":"tokens","status":"enabled"},{"option":"referrers","status":"enabled"},{"option":"jwts","status":"enabled"},{"option":"ips","status":"enabled"},{"option":"domainMasks","status":"enabled"},{"option":"hsts","status":"enabled"},{"option":"cors","status":"enabled"},{"option":"requestFilters","status":"enabled"},{"option":"ipCustomHeader","status":"enabled","value":"CF-Connecting-IP"}],"error":null}}}}}},"404":{"description":"ponto final não encontrado"}}},"patch":{"summary":"Updates security options","tags":["Endpoint Security"],"description":"Atualiza as opções de segurança de um terminal","operationId":"updateSecurityOptions","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"opções de segurança atualizadas","content":{"application/json":{"examples":{"updated_security_options":{"value":{"data":[{"option":"tokens","status":"enabled"},{"option":"referrers","status":"enabled"},{"option":"jwts","status":"enabled"},{"option":"ips","status":"enabled"},{"option":"domainMasks","status":"enabled"},{"option":"hsts","status":"enabled"},{"option":"cors","status":"enabled"},{"option":"requestFilters","status":"enabled"},{"option":"ipCustomHeader","status":"enabled","value":"CF-Connecting-IP"}],"error":null}}}}}},"400":{"description":"pedido inválido"},"404":{"description":"ponto final não encontrado"}},"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"options":{"type":"object","properties":{"tokens":{"type":"string","enum":["enabled","disabled"]},"referrers":{"type":"string","enum":["enabled","disabled"]},"jwts":{"type":"string","enum":["enabled","disabled"]},"ips":{"type":"string","enum":["enabled","disabled"]},"domainMasks":{"type":"string","enum":["enabled","disabled"]},"hsts":{"type":"string","enum":["enabled","disabled"]},"cors":{"type":"string","enum":["enabled","disabled"]},"requestFilters":{"type":"string","enum":["enabled","disabled"]},"ipCustomHeader":{"type":"string","enum":["enabled","disabled"]}},"additionalProperties":false}},"required":["options"]}}}}}},"/v0/endpoints/{id}/security/referrers":{"post":{"summary":"Creates a new endpoint referrer","description":"Criar um referenciador de ponto final","operationId":"createReferrer","tags":["Endpoint Security"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"referenciador criado"},"400":{"description":"Falta o referenciador"}},"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"referrer":{"type":"string"}}}}},"required":true}}},"/v0/endpoints/{id}/security/request_filters":{"post":{"summary":"Creates a new endpoint request filter","description":"Criar um filtro de pedidos para um ponto de extremidade","operationId":"createRequestFilter","tags":["Endpoint Security"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"sucesso","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"id":{"type":"string"}}},"error":{"type":"string","nullable":true}}}}}},"400":{"description":"o método não existe","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}}}}}}},"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"method":{"type":"array","items":{"type":"string"},"description":"Conjunto de nomes de métodos para inclusão na lista de permissões"}}}}},"required":true}}},"/v0/endpoints/{id}/security/request_filters/{request_filter_id}":{"put":{"summary":"Updates an existing endpoint request filter","description":"Atualizar um filtro de pedidos de um ponto de extremidade","operationId":"updateRequestFilter","tags":["Endpoint Security"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"request_filter_id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"204":{"description":"sucesso - sem conteúdo"}},"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"method":{"type":"array","items":{"type":"string"},"description":"Conjunto de nomes de métodos para inclusão na lista de permissões"}}}}},"required":true}},"delete":{"summary":"Deletes an existing endpoint request filter","description":"Elimina um filtro de pedidos de ponto final existente","operationId":"deleteRequestFilter","tags":["Endpoint Security"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"request_filter_id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"204":{"description":"sucesso - sem conteúdo"}}}},"/v0/endpoints/{id}/security/tokens":{"post":{"summary":"Creates a new endpoint authentication token","description":"Criar um token de autenticação do ponto de extremidade","operationId":"createAuthenticationToken","tags":["Endpoint Security"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"sucesso"}}}},"/v0/endpoints/{id}/security/ips":{"post":{"summary":"Creates a new endpoint ip","description":"Criar um end-point IP","operationId":"createIp","tags":["Endpoint Security"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"sucesso"},"400":{"description":"Falta o endereço IP"}},"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"ip":{"type":"string"}}}}},"required":true}}},"/v0/endpoints/{id}/security/domain_masks":{"post":{"summary":"Creates a new endpoint domain_mask","description":"Criar um endpoint «domain_mask»","operationId":"createDomainMask","tags":["Endpoint Security"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"sucesso"}},"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"domain_mask":{"type":"string"}}}}},"required":true}}},"/v0/endpoints/{id}/security/jwts":{"post":{"summary":"Creates a new endpoint jwt","description":"Criar um endpoint JWT","operationId":"createJwt","tags":["Endpoint Security"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"sucesso"},"400":{"description":"falta o nome"}},"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"public_key":{"type":"string"},"kid":{"type":"string"},"name":{"type":"string"}}}}},"required":true}}},"/v0/endpoints/{id}/security/jwts/{jwt_id}":{"delete":{"summary":"Deletes an existing endpoint jwt","description":"Elimina um JWT de ponto de extremidade existente","operationId":"deleteJwt","tags":["Endpoint Security"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"jwt_id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"sucesso"}}}},"/v0/endpoints/{id}/security/domain_masks/{domain_mask_id}":{"delete":{"summary":"Deletes an existing endpoint domain_mask","description":"Elimina uma máscara de domínio de ponto final existente","operationId":"deleteDomainMask","tags":["Endpoint Security"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"domain_mask_id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"sucesso"}}}},"/v0/endpoints/{id}/security/referrers/{referrer_id}":{"delete":{"summary":"Deletes an existing endpoint referrer","description":"Elimina um referenciador de ponto final existente","operationId":"deleteReferrer","tags":["Endpoint Security"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"referrer_id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"sucesso","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"boolean"},"error":{"type":"string","nullable":true}}}}}}}}},"/v0/endpoints/{id}/security/ips/{ip_id}":{"delete":{"summary":"Deletes an existing endpoint ip","description":"Elimina o end-point IP existente","operationId":"deleteIp","tags":["Endpoint Security"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"ip_id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"sucesso","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"boolean"},"error":{"type":"string","nullable":true}}}}}}}}},"/v0/endpoints/{id}/security/tokens/{token_id}":{"delete":{"summary":"Deletes an existing endpoint token","description":"Elimina um token de ponto de extremidade existente","operationId":"deleteToken","tags":["Endpoint Security"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"token_id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"sucesso","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"boolean"},"error":{"type":"string","nullable":true}}}}}}}}},"/v0/endpoints/{id}/enable_multichain":{"post":{"summary":"Enable multichain for endpoint","description":"Ativa o suporte a várias cadeias","operationId":"enableMultichain","tags":["Endpoint Security"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"sucesso"}}}},"/v0/endpoints/{id}/disable_multichain":{"post":{"summary":"Disable multichain for endpoint","description":"Desativa o multichain","operationId":"disableMultichain","tags":["Endpoint Security"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"sucesso"}}}},"/v0/endpoints/{id}/ip_custom_header":{"patch":{"summary":"Updates or creates an IP custom header","description":"Criar ou atualizar um cabeçalho IP personalizado","operationId":"createOrUpdateIpCustomHeader","tags":["Endpoint Security"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"sucesso","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"header_name":{"type":"string"}}},"error":{"type":"string","nullable":true}}}}}}},"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"header_name":{"type":"string","description":"Nome do cabeçalho personalizado de IP"}},"required":["header_name"]}}},"required":true}},"delete":{"summary":"Deletes the IP custom header","description":"Eliminar o cabeçalho personalizado IP","operationId":"deleteIpCustomHeader","tags":["Endpoint Security"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"sucesso","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"boolean"},"error":{"type":"string","nullable":true}}}}}}}}},"/v0/endpoints/{id}/tags":{"post":{"summary":"Creates endpoint tag","tags":["Endpoint Tags"],"description":"Criar uma etiqueta num ponto de extremidade","operationId":"createTag","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Etiqueta criada"},"400":{"description":"Erro na solicitação"},"404":{"description":"Ponto final não encontrado"}},"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"label":{"type":"string"}}}}},"required":true}}},"/v0/endpoints/{id}/tags/{tag_id}":{"delete":{"summary":"Deletes endpoint tag","tags":["Endpoint Tags"],"description":"Eliminar uma etiqueta de um ponto final","operationId":"deleteTag","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"tag_id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Etiqueta eliminada"},"404":{"description":"Ponto final não encontrado"}}}},"/v0/endpoints":{"post":{"summary":"Creates a new endpoint","tags":["Endpoints"],"parameters":[],"description":"Criar um único ponto de extremidade","operationId":"createEndpoint","responses":{"200":{"description":"sucesso","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/single_endpoint"},"error":{"type":"string","nullable":true}},"required":["data","error"]}}}}},"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"chain":{"type":"string"},"network":{"type":"string"}}}}},"required":true}},"get":{"summary":"Retrieves endpoints list","tags":["Endpoints"],"parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer"}},{"name":"search","in":"query","required":false,"description":"Pesquisar por subdomínio ou etiqueta","schema":{"type":"string"}},{"name":"sort_by","in":"query","required":false,"description":"Campo de ordenação","schema":{"type":"string","enum":["name","status","network","label","tags","usage","created_at"]}},{"name":"sort_direction","in":"query","required":false,"schema":{"type":"string","enum":["asc","desc"]}},{"name":"networks","in":"query","required":false,"schema":{"type":"array","items":{"type":"string"}},"description":"Filtrar por nome(s) de rede"},{"name":"statuses","in":"query","required":false,"schema":{"type":"array","items":{"type":"string","enum":["active","paused"]}},"description":"Filtrar por estado"},{"name":"labels","in":"query","required":false,"schema":{"type":"array","items":{"type":"string"}},"description":"Filtrar por etiqueta(s)"},{"name":"dedicated","in":"query","required":false,"description":"Filtrar pontos finais dedicados","schema":{"type":"boolean"}},{"name":"is_flat_rate","in":"query","required":false,"description":"Filtrar pontos finais de tarifa fixa","schema":{"type":"boolean"}},{"name":"tag_ids","in":"query","required":false,"schema":{"type":"array","items":{"type":"integer"}}},{"name":"tag_labels","in":"query","required":false,"schema":{"type":"array","items":{"type":"string"}}}],"description":"Recuperar a lista de pontos finais. Os parâmetros «tag_ids» e «tag_labels» são mutuamente exclusivos.","operationId":"listEndpoints","responses":{"200":{"description":"sucesso","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/endpoint"},"nullable":true},"pagination":{"type":"object","properties":{"total":{"type":"integer"},"limit":{"type":"integer"},"offset":{"type":"integer"}},"required":["total","limit","offset"]},"error":{"type":"string","nullable":true}},"required":["data","error"]}}}}}}},"/v0/endpoints/bulk/status":{"post":{"summary":"Bulk update endpoint status","tags":["Endpoints"],"description":"Pausar ou retomar vários terminais numa única chamada. Apenas para administradores.","operationId":"bulkUpdateEndpointStatus","parameters":[],"responses":{"200":{"description":"sucesso","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"total":{"type":"integer"},"updated_count":{"type":"integer"},"failed_count":{"type":"integer"},"results":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"success":{"type":"boolean"}},"required":["id","success"]}}},"required":["total","updated_count","failed_count","results"]}},"required":["data"]}}}}},"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"ids":{"type":"array","items":{"type":"string"},"description":"Identificadores de terminais"},"status":{"type":"string","enum":["active","paused"]}},"required":["ids","status"]}}}}}},"/v0/endpoints/bulk/tags":{"post":{"summary":"Bulk add tag to endpoints","tags":["Endpoints"],"description":"Adicionar uma etiqueta a vários pontos finais numa única chamada. Apenas para administradores.","operationId":"bulkAddTag","parameters":[],"responses":{"200":{"description":"sucesso","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"total":{"type":"integer"},"updated_count":{"type":"integer"},"failed_count":{"type":"integer"},"results":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"success":{"type":"boolean"}},"required":["id","success"]}},"tag":{"type":"object","properties":{"tag_id":{"type":"integer"},"label":{"type":"string"}}}},"required":["total","updated_count","failed_count","results","tag"]}},"required":["data"]}}}}},"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"ids":{"type":"array","items":{"type":"string"},"description":"Identificadores de terminais"},"label":{"type":"string","description":"Etiqueta a adicionar"}},"required":["ids","label"]}}}}},"delete":{"summary":"Bulk remove tag from endpoints","tags":["Endpoints"],"description":"Remover uma etiqueta de vários pontos finais numa única chamada. Apenas para administradores.","operationId":"bulkRemoveTag","parameters":[],"responses":{"200":{"description":"sucesso","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"total":{"type":"integer"},"updated_count":{"type":"integer"},"failed_count":{"type":"integer"},"results":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"success":{"type":"boolean"}},"required":["id","success"]}}},"required":["total","updated_count","failed_count","results"]}},"required":["data"]}}}}},"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"ids":{"type":"array","items":{"type":"string"},"description":"Identificadores de terminais"},"tag_id":{"type":"integer","description":"ID da etiqueta a remover"}},"required":["ids","tag_id"]}}}}}},"/v0/endpoints/{id}/security":{"get":{"summary":"Get endpoint security state","tags":["Endpoints"],"description":"Devolve o estado completo de segurança (tokens, JWTs, endereços IP, referenciadores, máscaras de domínio, filtros de pedidos, opções) sem ter de recuperar o ponto final na íntegra.","operationId":"getEndpointSecurity","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"sucesso","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/endpoint_security"},"error":{"type":"string","nullable":true}}}}}},"404":{"description":"ponto final não encontrado","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"nullable":true},"error":{"type":"string"}}}}}}}}},"/v0/endpoints/{id}":{"get":{"summary":"Show single endpoint","tags":["Endpoints"],"description":"Devolve um único ponto de extremidade","operationId":"showEndpoint","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"sucesso","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/single_endpoint"},"error":{"type":"string","nullable":true}}}}}}}},"patch":{"summary":"Update endpoint","tags":["Endpoints"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"description":"Atualizar a etiqueta de um único ponto de extremidade","operationId":"UpdateEndpoint","responses":{"200":{"description":"sucesso"}},"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"label":{"type":"string"}}}}}}},"delete":{"summary":"Archive endpoint","tags":["Endpoints"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"description":"Arquivar um único ponto de extremidade","operationId":"archiveEndpoint","responses":{"200":{"description":"sucesso"}}}},"/v0/endpoints/{id}/status":{"patch":{"summary":"Update endpoint status","tags":["Endpoints"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"description":"Suspender ou ativar um terminal","operationId":"UpdateEndpointStatus","responses":{"200":{"description":"sucesso","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"string","nullable":true},"error":{"type":"string","nullable":true}},"required":["data","error"]}}}},"400":{"description":"erro de validação","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"boolean","nullable":true},"error":{"type":"string"}},"required":["data","error"]}}}}},"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"status":{"type":"string","enum":["active","paused"]}},"required":["status"]}}}}}},"/v0/endpoints/{id}/urls":{"get":{"summary":"Get endpoint URLs","tags":["Endpoints"],"description":"Devolve os URLs http/wss do ponto de extremidade, bem como os multichain_urls para pontos de extremidade multichain.","operationId":"showEndpointUrls","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"sucesso","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/endpoint_urls"},"error":{"type":"string","nullable":true}}}}}}}}},"/v0/metrics":{"get":{"summary":"Fetch account-level metrics","tags":["Account Metrics"],"description":"Recupera métricas agregadas de todos os pontos de extremidade de uma conta","operationId":"fetchAccountMetrics","parameters":[{"name":"period","in":"query","schema":{"type":"string","enum":["hour","day","week","month"]},"required":true,"description":"hora, dia, semana, mês"},{"name":"metric","in":"query","schema":{"type":"string","enum":["method_calls_over_time","metered_endpoint_data_over_time","metered_endpoint_credits_over_time","credits_over_time"]},"required":true,"description":"chamadas_de_método_ao_longo_do_tempo, dados_de_ponto_final_medidos_ao_longo_do_tempo, créditos_de_ponto_final_medidos_ao_longo_do_tempo, créditos_ao_longo_do_tempo"},{"name":"percentile","in":"query","required":false,"description":"Percentil para métricas de tempo de resposta","schema":{"type":"string"}}],"responses":{"200":{"description":"métrica «credits_over_time»","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/endpoint_metric"}},"error":{"type":"string","nullable":true}},"required":["data","error"]}}}}}}},"/v0/endpoints/tags":{"get":{"summary":"List account tags","tags":["Tags"],"description":"Devolve todas as etiquetas ao nível da conta, incluindo aquelas com zero pontos finais. Disponível a partir do plano Build/Growth+.","operationId":"listTags","responses":{"200":{"description":"sucesso","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"tags":{"type":"array","items":{"type":"object","properties":{"id":{"type":"integer"},"label":{"type":"string"},"usage_count":{"type":"integer","description":"Número de pontos finais que utilizam esta etiqueta"}},"required":["id","label","usage_count"]}}}},"error":{"type":"string","nullable":true}}}}}}}}},"/v0/endpoints/tags/{id}":{"patch":{"summary":"Rename a tag","tags":["Tags"],"description":"Altera o nome de uma etiqueta de conta. Uma vez que a etiqueta é partilhada entre os pontos de extremidade, todos os pontos de extremidade associados refletem imediatamente a nova designação. Apenas para administradores.","operationId":"renameTag","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer"}}],"responses":{"200":{"description":"sucesso","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"id":{"type":"integer"},"label":{"type":"string"},"usage_count":{"type":"integer"}}},"error":{"type":"string","nullable":true}}}}}},"404":{"description":"etiqueta não encontrada","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"nullable":true},"error":{"type":"string"}}}}}}},"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"label":{"type":"string"}},"required":["label"]}}}}},"delete":{"summary":"Delete a tag","tags":["Tags"],"description":"Elimina uma etiqueta de conta. Ocorre uma falha grave se a etiqueta ainda estiver atribuída a algum terminal — remova-a primeiro de todos os terminais. Apenas para administradores.","operationId":"deleteTag","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer"}}],"responses":{"200":{"description":"sucesso","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"success":{"type":"boolean"}}},"error":{"type":"string","nullable":true}}}}}},"400":{"description":"etiqueta ainda em uso","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"nullable":true},"error":{"type":"string"}}}}}},"404":{"description":"etiqueta não encontrada","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"nullable":true},"error":{"type":"string"}}}}}}}}},"/v0/teams/{id}/endpoints":{"parameters":[{"name":"id","in":"path","description":"ID da equipa","required":true,"schema":{"type":"integer"}}],"get":{"summary":"List endpoints accessible to this team","tags":["Teams"],"security":[{"bearerAuth":[]}],"description":"Recuperar os terminais atribuídos a esta equipa, bem como os terminais não atribuídos (acessíveis a todos)","operationId":"listTeamEndpoints","responses":{"200":{"description":"sucesso","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"type":"object","properties":{"id":{"type":"integer"},"subdomain":{"type":"string"},"chain":{"type":"string","nullable":true},"network":{"type":"string","nullable":true}}}},"error":{"type":"string","nullable":true}},"required":["data","error"]}}}},"404":{"description":"equipa não encontrada","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"string","nullable":true},"error":{"type":"string"}},"required":["data","error"]}}}}}},"patch":{"summary":"Update endpoints assigned to a team","tags":["Teams"],"security":[{"bearerAuth":[]}],"description":"Atualizar quais pontos de contacto estão atribuídos a esta equipa","operationId":"updateTeamEndpoints","parameters":[],"responses":{"200":{"description":"as tarefas foram atualizadas com sucesso","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"success":{"type":"boolean"}}},"error":{"type":"string","nullable":true}},"required":["data","error"]}}}},"404":{"description":"equipa não encontrada","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"string","nullable":true},"error":{"type":"string"}},"required":["data","error"]}}}}},"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"endpoint_ids":{"type":"array","items":{"type":"string"}}},"required":["endpoint_ids"]}}}}}},"/v0/teams/{id}/members":{"parameters":[{"name":"id","in":"path","description":"ID da equipa","required":true,"schema":{"type":"integer"}}],"post":{"summary":"Invite a user to a team","tags":["Teams"],"security":[{"bearerAuth":[]}],"description":"Convide um novo utilizador ou adicione um utilizador já existente a uma equipa. No caso de novos utilizadores, os campos «full_name» e «role» são obrigatórios. No caso de utilizadores já existentes, basta o endereço de e-mail.","operationId":"inviteTeamMember","parameters":[],"responses":{"200":{"description":"utilizador já existente adicionado à equipa","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"id":{"type":"integer"},"full_name":{"type":"string"},"email":{"type":"string"},"role":{"type":"string","nullable":true},"status":{"type":"string"}}},"error":{"type":"string","nullable":true}},"required":["data","error"]}}}},"400":{"description":"número máximo de utilizadores atingido","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"string","nullable":true},"error":{"type":"string"}},"required":["data","error"]}}}},"404":{"description":"equipa não encontrada","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"string","nullable":true},"error":{"type":"string"}},"required":["data","error"]}}}}},"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"full_name":{"type":"string"},"email":{"type":"string"},"role":{"type":"string","enum":["admin","viewer","billing"]}},"required":["email"]}}}}}},"/v0/teams/{id}/members/{user_id}":{"parameters":[{"name":"id","in":"path","description":"ID da equipa","required":true,"schema":{"type":"integer"}},{"name":"user_id","in":"path","description":"ID do utilizador","required":true,"schema":{"type":"integer"}}],"delete":{"summary":"Remove a user from a team","tags":["Teams"],"security":[{"bearerAuth":[]}],"description":"Remover um utilizador de uma equipa ou eliminar o utilizador da conta","operationId":"removeTeamMember","parameters":[],"responses":{"200":{"description":"O utilizador foi eliminado com sucesso","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"message":{"type":"string"}}},"error":{"type":"string","nullable":true}},"required":["data","error"]}}}},"400":{"description":"Não é possível remover o utilizador principal","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"string","nullable":true},"error":{"type":"string"}},"required":["data","error"]}}}},"404":{"description":"utilizador não encontrado","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"string","nullable":true},"error":{"type":"string"}},"required":["data","error"]}}}}},"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"destroy_user":{"type":"boolean","default":false}}}}}}}},"/v0/teams/{id}/members/{user_id}/resend_invite":{"parameters":[{"name":"id","in":"path","description":"ID da equipa","required":true,"schema":{"type":"integer"}},{"name":"user_id","in":"path","description":"ID do utilizador","required":true,"schema":{"type":"integer"}}],"post":{"summary":"Resend invitation to a pending user","tags":["Teams"],"security":[{"bearerAuth":[]}],"description":"Reenviar um e-mail de convite a um utilizador com o estado «pendente»","operationId":"resendTeamInvite","responses":{"200":{"description":"O convite foi reenviado com sucesso","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"message":{"type":"string"}}},"error":{"type":"string","nullable":true}},"required":["data","error"]}}}},"400":{"description":"utilizador não está em espera na equipa","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"string","nullable":true},"error":{"type":"string"}},"required":["data","error"]}}}},"404":{"description":"equipa não encontrada","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"string","nullable":true},"error":{"type":"string"}},"required":["data","error"]}}}}}}},"/v0/teams":{"get":{"summary":"List all teams","tags":["Teams"],"security":[{"bearerAuth":[]}],"description":"Obter uma lista de todas as equipas da conta","operationId":"listTeams","responses":{"200":{"description":"sucesso","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"type":"object","properties":{"id":{"type":"integer"},"name":{"type":"string"},"members_count":{"type":"integer"},"users":{"type":"array","items":{"type":"object","properties":{"id":{"type":"integer"},"full_name":{"type":"string"},"email":{"type":"string"},"role":{"type":"string","nullable":true},"created_at":{"type":"string"},"status":{"type":"string"},"photo_url":{"type":"string"}}}}}}},"error":{"type":"string","nullable":true}},"required":["data","error"]}}}}}},"post":{"summary":"Create a new team","tags":["Teams"],"security":[{"bearerAuth":[]}],"description":"Criar uma nova equipa para a conta","operationId":"createTeam","parameters":[],"responses":{"200":{"description":"A equipa foi criada com sucesso","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"id":{"type":"integer"},"name":{"type":"string"},"default_role":{"type":"string"},"members_count":{"type":"integer"}}},"error":{"type":"string","nullable":true}},"required":["data","error"]}}}},"400":{"description":"erro na solicitação - nome da equipa inválido","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"string","nullable":true},"error":{"type":"string"}},"required":["data","error"]}}}}},"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","minLength":4}},"required":["name"]}}}}}},"/v0/teams/{id}":{"parameters":[{"name":"id","in":"path","description":"ID da equipa","required":true,"schema":{"type":"integer"}}],"get":{"summary":"Show team details","tags":["Teams"],"security":[{"bearerAuth":[]}],"description":"Obter informações detalhadas sobre uma equipa específica","operationId":"getTeam","responses":{"200":{"description":"sucesso","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"id":{"type":"integer"},"name":{"type":"string"},"default_role":{"type":"string"},"members_count":{"type":"integer"},"users":{"type":"array","items":{"type":"object","properties":{"id":{"type":"integer"},"full_name":{"type":"string"},"email":{"type":"string"},"created_at":{"type":"string"},"role":{"type":"string","nullable":true},"status":{"type":"string"},"photo_url":{"type":"string"},"account_primary_user":{"type":"boolean"}}}},"pending_invites":{"type":"array","items":{"type":"object","properties":{"id":{"type":"integer"},"full_name":{"type":"string"},"email":{"type":"string"},"created_at":{"type":"string"},"role":{"type":"string","nullable":true},"status":{"type":"string"},"photo_url":{"type":"string"},"account_primary_user":{"type":"boolean"}}}}}},"error":{"type":"string","nullable":true}},"required":["data","error"]}}}},"404":{"description":"equipa não encontrada","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"string","nullable":true},"error":{"type":"string"}},"required":["data","error"]}}}}}},"delete":{"summary":"Delete an empty team","tags":["Teams"],"security":[{"bearerAuth":[]}],"description":"Eliminar uma equipa que não tenha membros","operationId":"deleteTeam","responses":{"200":{"description":"A equipa foi eliminada com sucesso","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"message":{"type":"string"}}},"error":{"type":"string","nullable":true}},"required":["data","error"]}}}},"400":{"description":"A equipa tem membros","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"string","nullable":true},"error":{"type":"string"}},"required":["data","error"]}}}},"404":{"description":"equipa não encontrada","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"string","nullable":true},"error":{"type":"string"}},"required":["data","error"]}}}}}}},"/v0/tooling-access":{"get":{"summary":"Fetch Tooling Access status","tags":["Tooling Access"],"description":"Indica se o acesso ao Tooling está ativado para a conta.","operationId":"toolingAccessShow","responses":{"200":{"description":"sucesso","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"enabled":{"type":"boolean"},"endpoint_id":{"type":"integer","nullable":true},"endpoint_url":{"type":"string","nullable":true},"enabled_at":{"type":"string","nullable":true}}},"error":{"type":"string","nullable":true}},"required":["data","error"]}}}}}},"patch":{"summary":"Enable or disable Tooling Access","tags":["Tooling Access"],"description":"Ativar (configurar/reativar) ou desativar o acesso às ferramentas para a conta.","operationId":"toolingAccessUpdate","parameters":[],"responses":{"200":{"description":"ativado","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"enabled":{"type":"boolean"},"endpoint_url":{"type":"string","nullable":true}}},"error":{"type":"string","nullable":true}},"required":["data","error"]}}}}},"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"enabled":{"type":"boolean"}},"required":["enabled"]}}}}}},"/v0/tooling-access/token":{"post":{"summary":"Mint a short-lived session JWT","tags":["Tooling Access"],"description":"Gera um JWT ES256 de curta duração para autenticar chamadas RPC no plano de dados.","operationId":"toolingAccessToken","responses":{"200":{"description":"token cunhado","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"endpoint_url":{"type":"string"},"token":{"type":"string"},"expires_at":{"type":"string"}}},"error":{"type":"string","nullable":true}},"required":["data","error"]}}}}}}},"/v0/usage/rpc":{"get":{"summary":"Retrieves usage total for specified time range","tags":["Usage"],"description":"Se nem o start_time nem o end_time forem fornecidos, é utilizado o período de faturação atual e são devolvidos os créditos restantes desse período. Se um dos limites for omitido, é respeitado o limite fornecido: se o start_time não for indicado, o valor predefinido é o início do período atual; se o end_time não for indicado, o valor predefinido é a hora atual.","operationId":"usage","parameters":[{"name":"start_time","in":"query","description":"Hora de início","required":false,"schema":{"type":"integer"}},{"name":"end_time","in":"query","description":"Hora de término","required":false,"schema":{"type":"integer"}}],"responses":{"200":{"description":"sucesso","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"credits_used":{"type":"integer"},"credits_remaining":{"type":"integer","nullable":true},"limit":{"type":"integer","nullable":true},"overages":{"type":"integer","nullable":true},"start_time":{"type":"integer","format":"timestamp"},"end_time":{"type":"integer","format":"timestamp"}},"required":["credits_used","start_time","end_time"]},"error":{"type":"string","nullable":true}}}}}},"400":{"description":"intervalo de tempo inválido"}}}},"/v0/usage/rpc/by-tag":{"get":{"summary":"Retrieves usage data grouped by tag","tags":["Usage"],"description":"Agrupa créditos e pedidos por etiqueta de conta. Inclui um grupo «sem etiqueta» para pontos finais sem etiquetas.","operationId":"usageByTag","parameters":[{"name":"start_time","in":"query","description":"Hora de início (timestamp Unix)","required":false,"schema":{"type":"integer"}},{"name":"end_time","in":"query","description":"Hora de término (timestamp Unix)","required":false,"schema":{"type":"integer"}}],"responses":{"200":{"description":"sucesso","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"tags":{"type":"array","items":{"type":"object","properties":{"tag_id":{"type":"integer","nullable":true,"description":"null para o bucket sem etiqueta"},"label":{"type":"string"},"credits_used":{"type":"integer"},"requests":{"type":"integer"}},"required":["tag_id","label","credits_used","requests"]}},"start_time":{"type":"integer","format":"timestamp"},"end_time":{"type":"integer","format":"timestamp"}},"required":["tags","start_time","end_time"]},"error":{"type":"string","nullable":true}}}}}},"400":{"description":"intervalo de tempo inválido"}}}},"/v0/usage/rpc/by-endpoint":{"get":{"summary":"Retrieves usage data by endpoint","tags":["Usage"],"description":"Recupera dados de utilização por ponto de extremidade","operationId":"usageByEndpoint","parameters":[{"name":"start_time","in":"query","description":"Hora de início","required":false,"schema":{"type":"integer"}},{"name":"end_time","in":"query","description":"Hora de término","required":false,"schema":{"type":"integer"}}],"responses":{"200":{"description":"sucesso","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"endpoints":{"type":"array","items":{"$ref":"#/components/schemas/endpoint_usage"}},"start_time":{"type":"integer","format":"timestamp"},"end_time":{"type":"integer","format":"timestamp"}}},"error":{"type":"string","nullable":true}}}}}},"400":{"description":"intervalo de tempo inválido"}}}},"/v0/usage/rpc/by-method":{"get":{"summary":"Retrieves usage data grouped by method","tags":["Usage"],"description":"Recupera dados de utilização agrupados por método","operationId":"usageByMethod","parameters":[{"name":"start_time","in":"query","description":"Hora de início","required":false,"schema":{"type":"integer"}},{"name":"end_time","in":"query","description":"Hora de término","required":false,"schema":{"type":"integer"}}],"responses":{"200":{"description":"sucesso","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"methods":{"type":"array","items":{"$ref":"#/components/schemas/method_usage"}},"start_time":{"type":"integer","format":"timestamp"},"end_time":{"type":"integer","format":"timestamp"}}},"error":{"type":"string","nullable":true}}}}}},"400":{"description":"intervalo de tempo inválido"}}}},"/v0/usage/rpc/by-chain":{"get":{"summary":"Retrieves usage data by chain","tags":["Usage"],"description":"Recupera dados de utilização por cadeia","operationId":"usageByChain","parameters":[{"name":"start_time","in":"query","description":"Hora de início","required":false,"schema":{"type":"integer"}},{"name":"end_time","in":"query","description":"Hora de término","required":false,"schema":{"type":"integer"}}],"responses":{"200":{"description":"sucesso","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"chains":{"type":"array","items":{"$ref":"#/components/schemas/chain_usage"}},"start_time":{"type":"integer","format":"timestamp"},"end_time":{"type":"integer","format":"timestamp"}}},"error":{"type":"string","nullable":true}},"required":["data","error"]}}}},"400":{"description":"intervalo de tempo inválido"}}}}},"servers":[{"url":"https://api.quicknode.com"}],"tags":[{"name":"Usage"},{"name":"Endpoints"},{"name":"Chains"},{"name":"Endpoint Security"},{"name":"Billing"},{"name":"Endpoint Rate Limits"},{"name":"Endpoint Metrics"}],"components":{"securitySchemes":{"bearer_auth":{"type":"http","scheme":"bearer","bearerFormat":"JWT"},"api_key":{"type":"apiKey","name":"x-api-key","in":"header"}},"schemas":{"chain":{"type":"object","properties":{"slug":{"type":"string"},"networks":{"type":"array","items":{"$ref":"#/components/schemas/network"}},"is_select_chain":{"type":"boolean"}}},"api_credit":{"type":"object","properties":{"method":{"type":"string"},"credits":{"type":"integer"}},"required":["method","credits"]},"network":{"type":"object","properties":{"slug":{"type":"string"},"name":{"type":"string"},"chain_id":{"type":"integer","nullable":true}}},"chain_usage":{"type":"object","properties":{"name":{"type":"string"},"credits_used":{"type":"integer"}}},"endpoint_usage":{"type":"object","properties":{"name":{"type":"string"},"chain":{"type":"string"},"network":{"type":"string"},"status":{"type":"string"},"credits_used":{"type":"integer"},"label":{"type":"string","nullable":true},"methods_breakdown":{"type":"array","items":{"$ref":"#/components/schemas/method_usage"}},"requests":{"type":"integer"}}},"method_usage":{"type":"object","properties":{"method_name":{"type":"string"},"credits_used":{"type":"integer"},"archive":{"type":"boolean","nullable":true},"network":{"type":"string"},"chain":{"type":"string"}}},"endpoint":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string","description":"subdomínio do ponto final"},"label":{"type":"string","nullable":true},"status":{"type":"string","enum":["active","paused"]},"chain":{"type":"string","example":"eth","description":"pedaço de corrente"},"network":{"type":"string","example":"mainnet","description":"identificador de rede"},"is_dedicated":{"type":"boolean"},"is_flat_rate":{"type":"boolean"},"http_url":{"type":"string"},"wss_url":{"type":"string","nullable":true},"tags":{"type":"array","items":{"type":"object","properties":{"tag_id":{"type":"integer","nullable":false},"label":{"type":"string","nullable":false}}}},"is_multichain":{"type":"boolean"}},"required":["id","name","status","chain","network","is_dedicated","is_flat_rate","http_url","is_multichain"]},"single_endpoint":{"type":"object","properties":{"id":{"type":"string"},"label":{"type":"string","nullable":true},"status":{"type":"string"},"chain":{"type":"string","example":"eth","description":"pedaço de corrente"},"network":{"type":"string","example":"mainnet","description":"identificador de rede"},"http_url":{"type":"string"},"wss_url":{"type":"string","nullable":true},"security":{"$ref":"#/components/schemas/endpoint_security"},"rate_limits":{"$ref":"#/components/schemas/endpoint_rate_limits"},"tags":{"type":"array","items":{"type":"object","properties":{"tag_id":{"type":"integer","nullable":false},"label":{"type":"string","nullable":false}}}},"is_multichain":{"type":"boolean"}},"required":["id","chain","network","http_url","security","is_multichain"]},"endpoint_urls":{"type":"object","properties":{"http_url":{"type":"string"},"wss_url":{"type":"string","nullable":true},"multichain_urls":{"type":"object","nullable":true,"description":"Map of network name → { http_url, wss_url } for multichain endpoints; null otherwise.","additionalProperties":{"type":"object","properties":{"http_url":{"type":"string"},"wss_url":{"type":"string","nullable":true}},"required":["http_url","wss_url"]}}},"required":["http_url","wss_url","multichain_urls"]},"endpoint_rate_limits":{"type":"object","properties":{"rate_limit_by_ip":{"type":"boolean","nullable":true},"account":{"type":"integer","nullable":true},"rps":{"type":"integer","nullable":true},"rpm":{"type":"integer","nullable":true},"rpd":{"type":"integer","nullable":true}}},"endpoint_security":{"type":"object","properties":{"options":{"type":"object","properties":{"tokens":{"type":"boolean","nullable":true},"jwts":{"type":"boolean","nullable":true},"domainMasks":{"type":"boolean","nullable":true},"ips":{"type":"boolean","nullable":true},"referrers":{"type":"boolean","nullable":true},"requestFilters":{"type":"boolean","nullable":true},"ipCustomHeader":{"type":"object","properties":{"value":{"type":"string","nullable":true}}}}},"tokens":{"type":"array","items":{"$ref":"#/components/schemas/endpoint_token"}},"jwts":{"type":"array","items":{"$ref":"#/components/schemas/endpoint_jwt"}},"referrers":{"type":"array","items":{"$ref":"#/components/schemas/endpoint_referrer"}},"domain_masks":{"type":"array","items":{"$ref":"#/components/schemas/endpoint_domain_mask"}},"ips":{"type":"array","items":{"$ref":"#/components/schemas/endpoint_ip"}},"request_filters":{"type":"array","items":{"$ref":"#/components/schemas/endpoint_request_filter"}}}},"endpoint_jwt":{"type":"object","properties":{"id":{"type":"string"},"public_key":{"type":"string"},"kid":{"type":"string"},"name":{"type":"string"}}},"endpoint_token":{"type":"object","properties":{"id":{"type":"string"},"token":{"type":"string"}}},"endpoint_referrer":{"type":"object","properties":{"id":{"type":"string"},"referrer":{"type":"string"}}},"endpoint_domain_mask":{"type":"object","properties":{"id":{"type":"string"},"domain":{"type":"string"}}},"endpoint_ip":{"type":"object","properties":{"id":{"type":"string"},"ip":{"type":"string"}}},"endpoint_request_filter":{"type":"object","properties":{"id":{"type":"string"},"method":{"type":"array","items":{"type":"string"}},"params":{"type":"object"}}},"invoice":{"type":"object","properties":{"id":{"type":"string"},"status":{"type":"string"},"billing_reason":{"type":"string"},"lines":{"type":"array","items":{"type":"object","properties":{"description":{"type":"string"},"amount":{"type":"integer"}}}},"amount_due":{"type":"integer"},"amount_paid":{"type":"integer"},"period_start":{"type":"integer"},"period_end":{"type":"integer"},"created":{"type":"integer"},"subtotal":{"type":"integer"}}},"payment":{"type":"object","properties":{"amount":{"type":"string"},"card_last_4":{"type":"string","nullable":true},"created_at":{"type":"string"},"currency":{"type":"string"},"status":{"type":"string"},"marketplace_amount":{"type":"integer","nullable":true}}},"endpoint_metric":{"type":"object","properties":{"data":{"type":"array","items":{"type":"array","items":{"type":"integer"}}},"tag":{"type":"string"}}}}},"security":[{"bearer_auth":[]},{"api_key":[]}],"host":"www.quicknode.com"}