{"openapi":"3.1.0","info":{"title":"Goldsky API","description":"REST API for managing Goldsky resources — pipelines, subgraphs, Edge endpoints, and Feeds keys and usage. Create, deploy, monitor, and manage them programmatically.\n\nFor guides and reference, see the [Goldsky documentation](https://docs.goldsky.com) — including [Subgraphs](https://docs.goldsky.com/subgraphs/introduction) and [Pipelines](https://docs.goldsky.com/mirror/introduction).\n\n## Authentication\n\nEvery request carries an API token as a bearer token:\n\n```\nAuthorization: Bearer <token>\n```\n\nCreate one on the [API Keys page](https://app.goldsky.com/dashboard/settings/api-keys) of the Goldsky dashboard. A token is scoped to the project it was created in, so the project is never part of a request path.\n\nRead operations need the Viewer role; writes need Editor.\n\nThe Feeds data itself — wallet transfers and balances — is served from `https://edge.goldsky.com/data` with a Data API key, and documented in its own reference: [edge.goldsky.com/data/openapi.json](https://edge.goldsky.com/data/openapi.json).\n\n## Errors\n\nErrors are [RFC 9457 problem details](https://www.rfc-editor.org/rfc/rfc9457) served as `application/problem+json`:\n\n```json\n{\n  \"type\": \"https://api.goldsky.com/api/errors/subgraph-not-found\",\n  \"title\": \"Subgraph not found\",\n  \"status\": 404,\n  \"detail\": \"No subgraph named 'my-subgraph' exists in this project.\",\n  \"instance\": \"/api/v1/subgraphs/my-subgraph\"\n}\n```\n\nBranch on `type`, not on `title` or `detail` — the URI is stable, the prose is not. Every `type` dereferences to a human-readable page describing the cause and the fix; the full list lives at [api.goldsky.com/api/errors](https://api.goldsky.com/api/errors). Validation failures (400) add an `errors` array naming each offending field.\n\n## Pagination\n\nList endpoints that can return unbounded results — pipelines and subgraphs — page with `page_size` and `page_token`:\n\n```\nGET /api/v1/subgraphs?page_size=50\nGET /api/v1/subgraphs?page_size=50&page_token=<pagination.next_page_token>\n```\n\nKeep following `pagination.next_page_token` until it comes back `null`. A page can hold fewer than `page_size` items and still have a next page, so treat a short page as \"keep going\", not as the end.","version":"1.6.0","contact":{"name":"Goldsky Support","email":"support@goldsky.com","url":"https://docs.goldsky.com"}},"components":{"securitySchemes":{"BearerAuth":{"type":"http","scheme":"bearer","description":"API token generated from the [Goldsky Dashboard](https://app.goldsky.com/dashboard/settings/api-keys). Pass as: Authorization: Bearer <token>"},"DataApiKey":{"type":"apiKey","in":"query","name":"key","description":"A Data API key, passed as `?key=<key>`. Create one from the Data APIs page in the dashboard. Routes that accept it declare it in their `security`; the rest of the API uses BearerAuth."},"DataApiKeyHeader":{"type":"apiKey","in":"header","name":"X-API-Key","description":"The same Data API key as `DataApiKey`, sent as an `X-API-Key` header (or `Authorization: Bearer <key>`) to keep it out of URLs. `?key=` wins when both are sent."}},"schemas":{}},"paths":{"/pipelines":{"get":{"operationId":"listPipelines","summary":"List pipelines","tags":["Pipelines"],"description":"List all pipelines in the current project, ordered by name. Optionally filter by type. When `pagination.next_page_token` is non-null there are more results: pass it back as `page_token` to fetch the next page.","parameters":[{"schema":{"type":"string"},"in":"query","name":"type","required":false},{"schema":{"minimum":1,"maximum":200,"type":"integer"},"in":"query","name":"page_size","required":false,"description":"Maximum rows to return. Defaults to 50."},{"schema":{"type":"string"},"in":"query","name":"page_token","required":false,"description":"The `pagination.next_page_token` from a previous response. Omit for the first page."},{"schema":{"minimum":1,"maximum":200,"type":"integer"},"in":"query","name":"pageSize","required":false},{"schema":{"type":"string"},"in":"query","name":"pageToken","required":false}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"additionalProperties":true,"type":"object","properties":{"name":{"type":"string"},"type":{"type":"string"},"status":{"description":"Current pipeline status. `SUCCEEDED` is terminal and only reached by job-mode pipelines (`definition.job: true`), which run to completion instead of staying resident — poll for it to detect that a backfill finished. `UNKNOWN` means the upstream status could not be mapped.","anyOf":[{"type":"string","enum":["RUNNING"]},{"type":"string","enum":["PAUSED"]},{"type":"string","enum":["RESTARTING"]},{"type":"string","enum":["DEPLOYING"]},{"type":"string","enum":["STOPPED"]},{"type":"string","enum":["FAILED"]},{"type":"string","enum":["SUCCEEDED"]},{"type":"string","enum":["UNKNOWN"]}]},"definition":{"type":"object","properties":{"sources":{"type":"object","additionalProperties":{}},"transforms":{"type":"object","additionalProperties":{}},"sinks":{"type":"object","additionalProperties":{}},"description":{"type":"string"},"resource_size":{"type":"string"},"use_dedicated_ip":{"type":"boolean"},"job":{"type":"boolean"}},"required":["sources","transforms","sinks"]},"resource_size":{"type":"string"},"created_at":{"format":"date-time","type":"string"},"updated_at":{"format":"date-time","type":"string"},"project_id":{"type":"string"}},"required":["name","type","status","definition","created_at","updated_at"]}},"pagination":{"type":"object","properties":{"next_page_token":{"anyOf":[{"type":"string"},{"type":"null"}]},"page_size":{"type":"number"}},"required":["next_page_token","page_size"]}},"required":["data","pagination"]}}}}}},"post":{"operationId":"createPipeline","summary":"Create a pipeline","tags":["Pipelines"],"description":"Create and deploy a new turbo pipeline. The pipeline name must be unique within the project. `name` may be provided at the top level or inside `definition.name` (top-level wins if both are present); at least one is required.","requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"minLength":1,"maxLength":50,"pattern":"^[a-z0-9-]{1,50}$","description":"Pipeline name. Only lowercase letters, numbers, and hyphens are allowed. May be provided here or inside `definition.name`.","type":"string"},"resource_size":{"type":"string"},"description":{"type":"string"},"use_dedicated_ip":{"type":"boolean"},"definition":{"type":"object","properties":{"sources":{"type":"object","additionalProperties":{}},"transforms":{"type":"object","additionalProperties":{}},"sinks":{"type":"object","additionalProperties":{}}},"required":["sources","transforms","sinks"]}},"required":["definition"]},"example":{"name":"ethereum-blocks","resource_size":"s","use_dedicated_ip":false,"job":false,"description":"Streams Ethereum blocks","definition":{"sources":{"my_source":{"dataset_name":"ethereum.raw_blocks","start_at":"latest","type":"dataset","version":"1.0.0"}},"transforms":{"my_transform":{"from":"my_source","primary_key":"id","type":"handler","url":"https://handler.com"}},"sinks":{"my_sink":{"from":"my_transform","type":"blackhole"}}}}}},"required":true},"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","properties":{"name":{"type":"string"},"type":{"type":"string"},"status":{"description":"Current pipeline status. `SUCCEEDED` is terminal and only reached by job-mode pipelines (`definition.job: true`), which run to completion instead of staying resident — poll for it to detect that a backfill finished. `UNKNOWN` means the upstream status could not be mapped.","anyOf":[{"type":"string","enum":["RUNNING"]},{"type":"string","enum":["PAUSED"]},{"type":"string","enum":["RESTARTING"]},{"type":"string","enum":["DEPLOYING"]},{"type":"string","enum":["STOPPED"]},{"type":"string","enum":["FAILED"]},{"type":"string","enum":["SUCCEEDED"]},{"type":"string","enum":["UNKNOWN"]}]},"definition":{"type":"object","properties":{"sources":{"type":"object","additionalProperties":{}},"transforms":{"type":"object","additionalProperties":{}},"sinks":{"type":"object","additionalProperties":{}},"description":{"type":"string"},"resource_size":{"type":"string"},"use_dedicated_ip":{"type":"boolean"},"job":{"type":"boolean"}},"required":["sources","transforms","sinks"]},"resource_size":{"type":"string"},"created_at":{"format":"date-time","type":"string"},"updated_at":{"format":"date-time","type":"string"},"project_id":{"type":"string"}},"required":["name","type","status","definition","created_at","updated_at"]}}}}}}},"/pipelines/{name}":{"get":{"operationId":"getPipeline","summary":"Get a pipeline","tags":["Pipelines"],"description":"Get the details of a specific pipeline by name.","parameters":[{"schema":{"type":"string"},"in":"path","name":"name","required":true}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","properties":{"name":{"type":"string"},"type":{"type":"string"},"status":{"description":"Current pipeline status. `SUCCEEDED` is terminal and only reached by job-mode pipelines (`definition.job: true`), which run to completion instead of staying resident — poll for it to detect that a backfill finished. `UNKNOWN` means the upstream status could not be mapped.","anyOf":[{"type":"string","enum":["RUNNING"]},{"type":"string","enum":["PAUSED"]},{"type":"string","enum":["RESTARTING"]},{"type":"string","enum":["DEPLOYING"]},{"type":"string","enum":["STOPPED"]},{"type":"string","enum":["FAILED"]},{"type":"string","enum":["SUCCEEDED"]},{"type":"string","enum":["UNKNOWN"]}]},"definition":{"type":"object","properties":{"sources":{"type":"object","additionalProperties":{}},"transforms":{"type":"object","additionalProperties":{}},"sinks":{"type":"object","additionalProperties":{}},"description":{"type":"string"},"resource_size":{"type":"string"},"use_dedicated_ip":{"type":"boolean"},"job":{"type":"boolean"}},"required":["sources","transforms","sinks"]},"resource_size":{"type":"string"},"created_at":{"format":"date-time","type":"string"},"updated_at":{"format":"date-time","type":"string"},"project_id":{"type":"string"}},"required":["name","type","status","definition","created_at","updated_at"]}}}}}},"delete":{"operationId":"deletePipeline","summary":"Delete a pipeline","tags":["Pipelines"],"description":"Delete a pipeline by name. This action cannot be undone.","parameters":[{"schema":{"type":"string"},"in":"path","name":"name","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/pipelines/validate":{"post":{"operationId":"validatePipeline","summary":"Validate a pipeline definition","tags":["Pipeline Authoring"],"description":"Validate a pipeline definition without deploying it. Accepts the same body shape as `POST /pipelines`, so a request that passes validation here can be submitted to `POST /pipelines` unchanged. `name` may be provided at the top level or inside `definition.name` (top-level wins if both are present); a missing, malformed, or reserved name is reported as a `{ field: \"name\" }` entry in `errors` rather than rejected as a bad request.","requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"description":"Pipeline name. Only lowercase letters, numbers, and hyphens are allowed. May be provided here or inside `definition.name`.","type":"string"},"resource_size":{"type":"string"},"description":{"type":"string"},"use_dedicated_ip":{"type":"boolean"},"definition":{"type":"object","properties":{"sources":{"type":"object","additionalProperties":{}},"transforms":{"type":"object","additionalProperties":{}},"sinks":{"type":"object","additionalProperties":{}}},"required":["sources","transforms","sinks"]}},"required":["definition"]},"examples":{"example1":{"value":{"name":"ethereum-blocks","resource_size":"s","use_dedicated_ip":false,"description":"Streams Ethereum blocks","definition":{"sources":{"my_source":{"dataset_name":"ethereum.raw_blocks","start_at":"latest","type":"dataset","version":"1.0.0"}},"transforms":{"my_transform":{"from":"my_source","primary_key":"id","type":"handler","url":"https://handler.com"}},"sinks":{"my_sink":{"from":"my_transform","type":"blackhole"}}}}},"example2":{"value":{"resource_size":"s","definition":{"sources":{"my_source":{"dataset_name":"ethereum.raw_blocks","start_at":"latest","type":"dataset","version":"1.0.0"}},"transforms":{"my_transform":{"from":"my_source","primary_key":"id","type":"handler","url":"https://handler.com"}},"sinks":{"my_sink":{"from":"my_transform","type":"blackhole"}},"name":"ethereum-blocks"}}}}}},"required":true},"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"valid":{"type":"boolean"},"errors":{"type":"array","items":{"type":"object","properties":{"field":{"type":"string"},"message":{"type":"string"}},"required":["message"]}},"warnings":{"type":"array","items":{"type":"object","properties":{"field":{"type":"string"},"message":{"type":"string"}},"required":["message"]}}},"required":["valid","errors","warnings"]},"examples":{"example1":{"value":{"valid":true,"errors":[],"warnings":[]}},"example2":{"value":{"valid":false,"errors":[{"field":"name","message":"A pipeline name is required."}],"warnings":[]}}}}}}}}},"/pipelines/preview":{"post":{"operationId":"previewPipeline","summary":"Preview a pipeline","tags":["Pipeline Authoring"],"description":"Deploy an ephemeral preview of a pipeline with all sinks replaced by a blackhole. The preview is automatically deleted after the TTL expires.","requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"definition":{"type":"object","properties":{"sources":{"type":"object","additionalProperties":{}},"transforms":{"type":"object","additionalProperties":{}},"sinks":{"type":"object","additionalProperties":{}}},"required":["sources","transforms","sinks"]},"ttl_seconds":{"minimum":1,"maximum":600,"type":"number"}},"required":["definition"]}}},"required":true},"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"pipeline_name":{"type":"string"},"ttl_seconds":{"type":"number"},"expires_at":{"format":"date-time","type":"string"}},"required":["pipeline_name","ttl_seconds","expires_at"]}}}}}}},"/pipelines/{name}/pause":{"put":{"operationId":"pausePipeline","summary":"Pause a pipeline","tags":["Pipeline Lifecycle"],"description":"Pause a running pipeline. Can be resumed later.","parameters":[{"schema":{"type":"string"},"in":"path","name":"name","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/pipelines/{name}/resume":{"put":{"operationId":"resumePipeline","summary":"Resume a pipeline","tags":["Pipeline Lifecycle"],"description":"Resume a paused pipeline.","parameters":[{"schema":{"type":"string"},"in":"path","name":"name","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/pipelines/{name}/restart":{"put":{"operationId":"restartPipeline","summary":"Restart a pipeline","tags":["Pipeline Lifecycle"],"description":"Restart a pipeline. Optionally clear state to start fresh.","requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"clearState":{"default":false,"type":"boolean"}}}}}},"parameters":[{"schema":{"type":"string"},"in":"path","name":"name","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/pipelines/{name}/logs":{"get":{"operationId":"getPipelineLogs","summary":"Get pipeline logs","tags":["Pipeline Logs"],"description":"Retrieve execution logs for a pipeline. Supports cursor-based pagination and filtering.","parameters":[{"schema":{"type":"string"},"in":"query","name":"logLevels","required":false},{"schema":{"type":"number"},"in":"query","name":"cursor","required":false},{"schema":{"type":"number"},"in":"query","name":"after","required":false},{"schema":{"type":"string"},"in":"query","name":"search","required":false},{"schema":{"anyOf":[{"type":"string","enum":["asc"]},{"type":"string","enum":["desc"]}]},"in":"query","name":"direction","required":false},{"schema":{"type":"string"},"in":"path","name":"name","required":true}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"results":{"type":"array","items":{"type":"object","properties":{"text":{"type":"string"},"timestamp":{"type":"number"},"level":{"type":"string"}},"required":["text","timestamp","level"]}},"cursor":{"type":"number"}},"required":["results"]}},"required":["data"]}}}}}}},"/pipelines/{name}/logs/error-count":{"get":{"operationId":"getPipelineErrorCount","summary":"Get pipeline error count","tags":["Pipeline Logs"],"description":"Get the number of error-level log entries for a pipeline within a configurable time window (default: 6 hours, max: 7 days).","parameters":[{"schema":{"minimum":1,"maximum":168,"default":6,"type":"integer"},"in":"query","name":"since_hours","required":false},{"schema":{"type":"string"},"in":"path","name":"name","required":true}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"error_count":{"type":"number"}},"required":["error_count"]}},"required":["data"]}}}}}}},"/pipelines/{name}/status":{"get":{"operationId":"getPipelineStatus","summary":"Get pipeline status","tags":["Pipeline Status"],"description":"Get the current runtime status of a pipeline.","parameters":[{"schema":{"type":"string"},"in":"path","name":"name","required":true}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string"},"status":{"description":"Current pipeline status. `SUCCEEDED` is terminal and only reached by job-mode pipelines (`definition.job: true`), which run to completion instead of staying resident — poll for it to detect that a backfill finished. `UNKNOWN` means the upstream status could not be mapped.","anyOf":[{"type":"string","enum":["RUNNING"]},{"type":"string","enum":["PAUSED"]},{"type":"string","enum":["RESTARTING"]},{"type":"string","enum":["DEPLOYING"]},{"type":"string","enum":["STOPPED"]},{"type":"string","enum":["FAILED"]},{"type":"string","enum":["SUCCEEDED"]},{"type":"string","enum":["UNKNOWN"]}]},"errors":{"type":"array","items":{"type":"object","properties":{"message":{"type":"string"}},"required":["message"]}}},"required":["name","status","errors"]}}}}}}},"/pipelines/{name}/state":{"get":{"operationId":"getPipelineState","summary":"Get pipeline state","tags":["Pipeline Status"],"description":"Get the internal state information of a pipeline. This endpoint proxies to the upstream Streamling API.","parameters":[{"schema":{"type":"string"},"in":"path","name":"name","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/subgraphs":{"get":{"operationId":"listSubgraphs","summary":"List subgraphs","tags":["Subgraphs"],"description":"List all subgraphs in the current project, ordered by name then version. When `pagination.next_page_token` is non-null there are more results: pass it back as `page_token` to fetch the next page. A page can contain fewer than `page_size` items and still have a next page.","parameters":[{"schema":{"minimum":1,"maximum":200,"type":"integer"},"in":"query","name":"page_size","required":false,"description":"Maximum rows to return. Defaults to 50."},{"schema":{"type":"string"},"in":"query","name":"page_token","required":false,"description":"The `pagination.next_page_token` from a previous response. Omit for the first page."}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string"},"version":{"type":"string"},"tag":{"type":"object","properties":{"target_version":{"type":"string"}}},"status":{"anyOf":[{"type":"string","enum":["ACTIVE"]},{"type":"string","enum":["PAUSED"]}]},"network":{"type":"string"},"health":{"anyOf":[{"type":"string","enum":["HEALTHY"]},{"type":"string","enum":["UNHEALTHY"]},{"type":"string","enum":["FAILED"]},{"type":"string","enum":["UNKNOWN"]}]},"synced":{"type":"boolean"},"graphql_endpoint":{"type":"string"},"private_graphql_endpoint":{"type":"string"},"public_endpoint_enabled":{"type":"boolean"},"private_endpoint_enabled":{"type":"boolean"},"description":{"anyOf":[{"type":"string"},{"type":"null"}]},"deployments":{"type":"array","items":{"type":"object","properties":{"deployment_id":{"type":"string"},"created_at":{"format":"date-time","type":"string"},"health":{"anyOf":[{"type":"string","enum":["HEALTHY"]},{"type":"string","enum":["UNHEALTHY"]},{"type":"string","enum":["FAILED"]},{"type":"string","enum":["UNKNOWN"]}]},"synced":{"type":"boolean"},"fatal_error":{"anyOf":[{"type":"string"},{"type":"null"}]},"non_fatal_errors":{"type":"array","items":{"type":"string"}},"indexing_progress":{"type":"object","properties":{"network":{"type":"string"},"progress_percent":{"type":"number"},"chain_head_block":{"type":"number"},"deployment_head_block":{"type":"number"},"deployment_start_block":{"type":"number"},"synced":{"type":"boolean"}},"required":["network","progress_percent","chain_head_block","deployment_head_block","deployment_start_block","synced"]}},"required":["deployment_id","created_at","health","synced","fatal_error","non_fatal_errors"]}}},"required":["name","version","status","network","health","synced","graphql_endpoint","private_graphql_endpoint","public_endpoint_enabled","private_endpoint_enabled","description","deployments"]}},"pagination":{"type":"object","properties":{"next_page_token":{"anyOf":[{"type":"string"},{"type":"null"}]},"page_size":{"type":"number"}},"required":["next_page_token","page_size"]}},"required":["data","pagination"]}}}}}}},"/subgraphs/{name}":{"get":{"operationId":"getSubgraph","summary":"Get a subgraph","tags":["Subgraphs"],"description":"Get all tags and versions of a subgraph by name.","parameters":[{"schema":{"pattern":"^[a-zA-Z][\\w-]*$","type":"string"},"in":"path","name":"name","required":true}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string"},"version":{"type":"string"},"tag":{"type":"object","properties":{"target_version":{"type":"string"}}},"status":{"anyOf":[{"type":"string","enum":["ACTIVE"]},{"type":"string","enum":["PAUSED"]}]},"network":{"type":"string"},"health":{"anyOf":[{"type":"string","enum":["HEALTHY"]},{"type":"string","enum":["UNHEALTHY"]},{"type":"string","enum":["FAILED"]},{"type":"string","enum":["UNKNOWN"]}]},"synced":{"type":"boolean"},"graphql_endpoint":{"type":"string"},"private_graphql_endpoint":{"type":"string"},"public_endpoint_enabled":{"type":"boolean"},"private_endpoint_enabled":{"type":"boolean"},"description":{"anyOf":[{"type":"string"},{"type":"null"}]},"deployments":{"type":"array","items":{"type":"object","properties":{"deployment_id":{"type":"string"},"created_at":{"format":"date-time","type":"string"},"health":{"anyOf":[{"type":"string","enum":["HEALTHY"]},{"type":"string","enum":["UNHEALTHY"]},{"type":"string","enum":["FAILED"]},{"type":"string","enum":["UNKNOWN"]}]},"synced":{"type":"boolean"},"fatal_error":{"anyOf":[{"type":"string"},{"type":"null"}]},"non_fatal_errors":{"type":"array","items":{"type":"string"}},"indexing_progress":{"type":"object","properties":{"network":{"type":"string"},"progress_percent":{"type":"number"},"chain_head_block":{"type":"number"},"deployment_head_block":{"type":"number"},"deployment_start_block":{"type":"number"},"synced":{"type":"boolean"}},"required":["network","progress_percent","chain_head_block","deployment_head_block","deployment_start_block","synced"]}},"required":["deployment_id","created_at","health","synced","fatal_error","non_fatal_errors"]}}},"required":["name","version","status","network","health","synced","graphql_endpoint","private_graphql_endpoint","public_endpoint_enabled","private_endpoint_enabled","description","deployments"]}},"pagination":{"type":"object","properties":{"next_page_token":{"anyOf":[{"type":"string"},{"type":"null"}]},"page_size":{"type":"number"}},"required":["next_page_token","page_size"]}},"required":["data","pagination"]}}}}}}},"/subgraphs/supported-chains":{"get":{"operationId":"listSubgraphChains","summary":"List supported chains","tags":["Catalogs"],"description":"List the chains available for subgraph deployment.","responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"supported_chains":{"type":"array","items":{"type":"string"}}},"required":["supported_chains"]}},"required":["data"]}}}}}}},"/subgraphs/{name}/{version}":{"get":{"operationId":"getSubgraphVersion","summary":"Get a subgraph version","tags":["Subgraphs"],"description":"Get a single subgraph tag or deployed version.","parameters":[{"schema":{"pattern":"^[a-zA-Z][\\w-]*$","type":"string"},"in":"path","name":"name","required":true},{"schema":{"pattern":"^[a-zA-Z0-9][\\w+.-]*$","type":"string"},"in":"path","name":"version","required":true}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string"},"version":{"type":"string"},"tag":{"type":"object","properties":{"target_version":{"type":"string"}}},"status":{"anyOf":[{"type":"string","enum":["ACTIVE"]},{"type":"string","enum":["PAUSED"]}]},"network":{"type":"string"},"health":{"anyOf":[{"type":"string","enum":["HEALTHY"]},{"type":"string","enum":["UNHEALTHY"]},{"type":"string","enum":["FAILED"]},{"type":"string","enum":["UNKNOWN"]}]},"synced":{"type":"boolean"},"graphql_endpoint":{"type":"string"},"private_graphql_endpoint":{"type":"string"},"public_endpoint_enabled":{"type":"boolean"},"private_endpoint_enabled":{"type":"boolean"},"description":{"anyOf":[{"type":"string"},{"type":"null"}]},"deployments":{"type":"array","items":{"type":"object","properties":{"deployment_id":{"type":"string"},"created_at":{"format":"date-time","type":"string"},"health":{"anyOf":[{"type":"string","enum":["HEALTHY"]},{"type":"string","enum":["UNHEALTHY"]},{"type":"string","enum":["FAILED"]},{"type":"string","enum":["UNKNOWN"]}]},"synced":{"type":"boolean"},"fatal_error":{"anyOf":[{"type":"string"},{"type":"null"}]},"non_fatal_errors":{"type":"array","items":{"type":"string"}},"indexing_progress":{"type":"object","properties":{"network":{"type":"string"},"progress_percent":{"type":"number"},"chain_head_block":{"type":"number"},"deployment_head_block":{"type":"number"},"deployment_start_block":{"type":"number"},"synced":{"type":"boolean"}},"required":["network","progress_percent","chain_head_block","deployment_head_block","deployment_start_block","synced"]}},"required":["deployment_id","created_at","health","synced","fatal_error","non_fatal_errors"]}}},"required":["name","version","status","network","health","synced","graphql_endpoint","private_graphql_endpoint","public_endpoint_enabled","private_endpoint_enabled","description","deployments"]}},"pagination":{"type":"object","properties":{"next_page_token":{"anyOf":[{"type":"string"},{"type":"null"}]},"page_size":{"type":"number"}},"required":["next_page_token","page_size"]}},"required":["data","pagination"]}}}}}},"patch":{"operationId":"updateSubgraphVersion","summary":"Update a subgraph version","tags":["Subgraph Lifecycle"],"description":"Enable or disable the public/private GraphQL endpoints and set the description of a subgraph tag or deployed version. Only the fields you send are changed.","requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"public_endpoint_enabled":{"type":"boolean"},"private_endpoint_enabled":{"type":"boolean"},"description":{"maxLength":500,"type":"string"}}}}}},"parameters":[{"schema":{"pattern":"^[a-zA-Z][\\w-]*$","type":"string"},"in":"path","name":"name","required":true},{"schema":{"pattern":"^[a-zA-Z0-9][\\w+.-]*$","type":"string"},"in":"path","name":"version","required":true}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"name":{"type":"string"},"version":{"type":"string"},"tag":{"type":"object","properties":{"target_version":{"type":"string"}}},"status":{"anyOf":[{"type":"string","enum":["ACTIVE"]},{"type":"string","enum":["PAUSED"]}]},"network":{"type":"string"},"health":{"anyOf":[{"type":"string","enum":["HEALTHY"]},{"type":"string","enum":["UNHEALTHY"]},{"type":"string","enum":["FAILED"]},{"type":"string","enum":["UNKNOWN"]}]},"synced":{"type":"boolean"},"graphql_endpoint":{"type":"string"},"private_graphql_endpoint":{"type":"string"},"public_endpoint_enabled":{"type":"boolean"},"private_endpoint_enabled":{"type":"boolean"},"description":{"anyOf":[{"type":"string"},{"type":"null"}]},"deployments":{"type":"array","items":{"type":"object","properties":{"deployment_id":{"type":"string"},"created_at":{"format":"date-time","type":"string"},"health":{"anyOf":[{"type":"string","enum":["HEALTHY"]},{"type":"string","enum":["UNHEALTHY"]},{"type":"string","enum":["FAILED"]},{"type":"string","enum":["UNKNOWN"]}]},"synced":{"type":"boolean"},"fatal_error":{"anyOf":[{"type":"string"},{"type":"null"}]},"non_fatal_errors":{"type":"array","items":{"type":"string"}},"indexing_progress":{"type":"object","properties":{"network":{"type":"string"},"progress_percent":{"type":"number"},"chain_head_block":{"type":"number"},"deployment_head_block":{"type":"number"},"deployment_start_block":{"type":"number"},"synced":{"type":"boolean"}},"required":["network","progress_percent","chain_head_block","deployment_head_block","deployment_start_block","synced"]}},"required":["deployment_id","created_at","health","synced","fatal_error","non_fatal_errors"]}}},"required":["name","version","status","network","health","synced","graphql_endpoint","private_graphql_endpoint","public_endpoint_enabled","private_endpoint_enabled","description","deployments"]}},"required":["data"]}}}}}}},"/subgraphs/{name}/{version}/logs":{"get":{"operationId":"getSubgraphLogs","summary":"Get subgraph logs","tags":["Subgraph Logs"],"description":"Retrieve indexing logs for a subgraph version (cursor-paginated).","parameters":[{"schema":{"type":"number"},"in":"query","name":"cursor","required":false},{"schema":{"type":"number"},"in":"query","name":"after","required":false},{"schema":{"anyOf":[{"type":"string","enum":["asc"]},{"type":"string","enum":["desc"]}]},"in":"query","name":"direction","required":false},{"schema":{"type":"string"},"in":"query","name":"search","required":false},{"schema":{"type":"string"},"in":"query","name":"log_level","required":false},{"schema":{"type":"string"},"in":"query","name":"log_levels","required":false},{"schema":{"pattern":"^[a-zA-Z][\\w-]*$","type":"string"},"in":"path","name":"name","required":true},{"schema":{"pattern":"^[a-zA-Z0-9][\\w+.-]*$","type":"string"},"in":"path","name":"version","required":true}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"results":{"type":"array","items":{"type":"object","properties":{"text":{"type":"string"},"timestamp":{"type":"number"},"level":{"type":"string"}},"required":["text","timestamp","level"]}},"cursor":{"type":"number"}},"required":["results"]}},"required":["data"]}}}}}}},"/subgraphs/{name}/{version}/pause":{"put":{"operationId":"pauseSubgraph","summary":"Pause a subgraph","tags":["Subgraph Lifecycle"],"description":"Pause indexing for a deployed subgraph version. Can be resumed later. `version` must be a deployed version label, not a tag name — a tag is a moving pointer, so pause it by the version it targets.","parameters":[{"schema":{"pattern":"^[a-zA-Z][\\w-]*$","type":"string"},"in":"path","name":"name","required":true},{"schema":{"pattern":"^[a-zA-Z0-9][\\w+.-]*$","type":"string"},"in":"path","name":"version","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/subgraphs/{name}/{version}/resume":{"put":{"operationId":"resumeSubgraph","summary":"Resume a subgraph","tags":["Subgraph Lifecycle"],"description":"Resume indexing for a paused subgraph version. `version` must be a deployed version label, not a tag name.","parameters":[{"schema":{"pattern":"^[a-zA-Z][\\w-]*$","type":"string"},"in":"path","name":"name","required":true},{"schema":{"pattern":"^[a-zA-Z0-9][\\w+.-]*$","type":"string"},"in":"path","name":"version","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/subgraphs/{name}/tags/{version}":{"put":{"operationId":"setSubgraphTag","summary":"Create or move a subgraph tag","tags":["Subgraph Tags"],"description":"Point a tag at a deployed subgraph version, creating the tag if it does not exist yet.","requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"target_version":{"pattern":"^[a-zA-Z0-9][\\w+.-]*$","description":"The deployed version the tag should point at.","type":"string","example":"1.0.0"}},"required":["target_version"]}}},"required":true},"parameters":[{"schema":{"pattern":"^[a-zA-Z][\\w-]*$","type":"string"},"in":"path","name":"name","required":true},{"schema":{"pattern":"^[a-zA-Z0-9][\\w+.-]*$","type":"string"},"in":"path","name":"version","required":true}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"name":{"type":"string"},"version":{"type":"string"},"tag":{"type":"object","properties":{"target_version":{"type":"string"}}},"status":{"anyOf":[{"type":"string","enum":["ACTIVE"]},{"type":"string","enum":["PAUSED"]}]},"network":{"type":"string"},"health":{"anyOf":[{"type":"string","enum":["HEALTHY"]},{"type":"string","enum":["UNHEALTHY"]},{"type":"string","enum":["FAILED"]},{"type":"string","enum":["UNKNOWN"]}]},"synced":{"type":"boolean"},"graphql_endpoint":{"type":"string"},"private_graphql_endpoint":{"type":"string"},"public_endpoint_enabled":{"type":"boolean"},"private_endpoint_enabled":{"type":"boolean"},"description":{"anyOf":[{"type":"string"},{"type":"null"}]},"deployments":{"type":"array","items":{"type":"object","properties":{"deployment_id":{"type":"string"},"created_at":{"format":"date-time","type":"string"},"health":{"anyOf":[{"type":"string","enum":["HEALTHY"]},{"type":"string","enum":["UNHEALTHY"]},{"type":"string","enum":["FAILED"]},{"type":"string","enum":["UNKNOWN"]}]},"synced":{"type":"boolean"},"fatal_error":{"anyOf":[{"type":"string"},{"type":"null"}]},"non_fatal_errors":{"type":"array","items":{"type":"string"}},"indexing_progress":{"type":"object","properties":{"network":{"type":"string"},"progress_percent":{"type":"number"},"chain_head_block":{"type":"number"},"deployment_head_block":{"type":"number"},"deployment_start_block":{"type":"number"},"synced":{"type":"boolean"}},"required":["network","progress_percent","chain_head_block","deployment_head_block","deployment_start_block","synced"]}},"required":["deployment_id","created_at","health","synced","fatal_error","non_fatal_errors"]}}},"required":["name","version","status","network","health","synced","graphql_endpoint","private_graphql_endpoint","public_endpoint_enabled","private_endpoint_enabled","description","deployments"]}},"required":["data"]}}}}}},"delete":{"operationId":"deleteSubgraphTag","summary":"Delete a subgraph tag","tags":["Subgraph Tags"],"description":"Delete a tag. The deployed version the tag pointed at is left untouched.","parameters":[{"schema":{"pattern":"^[a-zA-Z][\\w-]*$","type":"string"},"in":"path","name":"name","required":true},{"schema":{"pattern":"^[a-zA-Z0-9][\\w+.-]*$","type":"string"},"in":"path","name":"version","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/subgraphs/{name}/deployments/{version}":{"delete":{"operationId":"deleteSubgraphDeployment","summary":"Delete a subgraph deployment","tags":["Subgraph Deployments"],"description":"Delete a deployed subgraph version. Fails with 422 while the deployment is still referenced by a tag, pipeline or webhook.","parameters":[{"schema":{"pattern":"^[a-zA-Z][\\w-]*$","type":"string"},"in":"path","name":"name","required":true},{"schema":{"pattern":"^[a-zA-Z0-9][\\w+.-]*$","type":"string"},"in":"path","name":"version","required":true}],"responses":{"200":{"description":"Default Response"}}},"put":{"operationId":"deploySubgraph","summary":"Deploy a subgraph","tags":["Subgraph Deployments"],"description":"Deploy a compiled subgraph bundle as `name`/`version`.\n\nSend `multipart/form-data` with a `bundle` file part — a zip of your `graph build` output. Bundles are limited to 50 MB compressed and 100 MB extracted.\n\n\nExample: `curl -X PUT -H \"authorization: Bearer $GOLDSKY_API_KEY\" -F bundle=@build.zip -F description=\"My subgraph\" https://api.goldsky.com/api/v1/subgraphs/my-subgraph/deployments/1.0.0`","requestBody":{"content":{"multipart/form-data":{"schema":{"description":"Send each option as an ordinary `multipart/form-data` field, e.g. `-F overwrite=0`. Fields appear below as `{ value }` because that is how a form field looks once parsed.","type":"object","properties":{"bundle":{"description":"Zip of the compiled subgraph build directory (`graph build` output), sent as a file part.","type":"object","properties":{"encoding":{"type":"string"},"filename":{"type":"string"},"mimetype":{"type":"string"}},"required":["encoding","filename","mimetype"]},"overwrite":{"description":"Deprecated. Send \"0\" or omit it — \"1\" is rejected. To replace a version, delete it and deploy again, or move a tag to it.","type":"object","properties":{"value":{"pattern":"^[01]$","type":"string"}},"required":["value"]},"remove_graft":{"description":"Set to \"1\" to strip the graft from the manifest before deploying.","type":"object","properties":{"value":{"pattern":"^[01]$","type":"string"}},"required":["value"]},"skip_graft_validation":{"description":"Set to \"1\" to skip validation of the graft base subgraph.","type":"object","properties":{"value":{"pattern":"^[01]$","type":"string"}},"required":["value"]},"start_block":{"description":"Block number to start indexing from.","type":"object","properties":{"value":{"pattern":"^[0-9]+$","type":"string"}},"required":["value"]},"graft_from":{"description":"`name/version` of an existing subgraph in this project to graft from.","type":"object","properties":{"value":{"type":"string"}},"required":["value"]},"description":{"description":"Human-readable description (max 500 characters).","type":"object","properties":{"value":{"maxLength":500,"type":"string"}},"required":["value"]},"graph_node_shard":{"description":"Advanced: pin the deployment to a specific indexing shard. Leave this unset unless Goldsky support asked you to set it.","type":"object","properties":{"value":{"type":"string"}},"required":["value"]}}},"example":{"bundle":{"encoding":"7bit","filename":"bundle.zip","mimetype":"application/zip"},"overwrite":{"value":"0"},"description":{"value":"My subgraph"}}}},"description":"Send each option as an ordinary `multipart/form-data` field, e.g. `-F overwrite=0`. Fields appear below as `{ value }` because that is how a form field looks once parsed."},"parameters":[{"schema":{"pattern":"^[a-zA-Z][\\w-]*$","type":"string"},"in":"path","name":"name","required":true},{"schema":{"pattern":"^[a-zA-Z0-9][\\w+.-]*$","type":"string"},"in":"path","name":"version","required":true}],"responses":{"201":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string"},"version":{"type":"string"},"tag":{"type":"object","properties":{"target_version":{"type":"string"}}},"status":{"anyOf":[{"type":"string","enum":["ACTIVE"]},{"type":"string","enum":["PAUSED"]}]},"network":{"type":"string"},"health":{"anyOf":[{"type":"string","enum":["HEALTHY"]},{"type":"string","enum":["UNHEALTHY"]},{"type":"string","enum":["FAILED"]},{"type":"string","enum":["UNKNOWN"]}]},"synced":{"type":"boolean"},"graphql_endpoint":{"type":"string"},"private_graphql_endpoint":{"type":"string"},"public_endpoint_enabled":{"type":"boolean"},"private_endpoint_enabled":{"type":"boolean"},"description":{"anyOf":[{"type":"string"},{"type":"null"}]},"deployments":{"type":"array","items":{"type":"object","properties":{"deployment_id":{"type":"string"},"created_at":{"format":"date-time","type":"string"},"health":{"anyOf":[{"type":"string","enum":["HEALTHY"]},{"type":"string","enum":["UNHEALTHY"]},{"type":"string","enum":["FAILED"]},{"type":"string","enum":["UNKNOWN"]}]},"synced":{"type":"boolean"},"fatal_error":{"anyOf":[{"type":"string"},{"type":"null"}]},"non_fatal_errors":{"type":"array","items":{"type":"string"}},"indexing_progress":{"type":"object","properties":{"network":{"type":"string"},"progress_percent":{"type":"number"},"chain_head_block":{"type":"number"},"deployment_head_block":{"type":"number"},"deployment_start_block":{"type":"number"},"synced":{"type":"boolean"}},"required":["network","progress_percent","chain_head_block","deployment_head_block","deployment_start_block","synced"]}},"required":["deployment_id","created_at","health","synced","fatal_error","non_fatal_errors"]}}},"required":["name","version","status","network","health","synced","graphql_endpoint","private_graphql_endpoint","public_endpoint_enabled","private_endpoint_enabled","description","deployments"]}}}}}}},"/subgraphs/webhooks":{"get":{"operationId":"listWebhooks","summary":"List webhooks","tags":["Subgraph Webhooks"],"description":"List all webhooks in the current project.","responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"webhook_url":{"type":"string"},"entity":{"type":"string"},"subgraph_name":{"type":"string"},"subgraph_version":{"type":"string"},"created_at":{"format":"date-time","type":"string"}},"required":["id","name","webhook_url","entity","subgraph_name","subgraph_version","created_at"]}}},"required":["data"]}}}}}},"post":{"operationId":"createWebhook","summary":"Create a webhook","tags":["Subgraph Webhooks"],"description":"Stream row-level changes for a subgraph entity to a URL. Every delivery carries a `goldsky-webhook-secret` header; the secret is returned once in this response and is not retrievable afterwards.","requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"maxLength":42,"description":"A project-unique name for the webhook.","type":"string"},"subgraph_name":{"pattern":"^[a-zA-Z][\\w-]*$","type":"string"},"subgraph_version":{"pattern":"^[a-zA-Z0-9][\\w+.-]*$","type":"string"},"entity":{"description":"The subgraph entity (table) to stream row changes from. Use the entities endpoint to list valid values.","type":"string"},"webhook_url":{"description":"The URL row changes are POSTed to.","type":"string"},"secret":{"description":"Sent as the `goldsky-webhook-secret` header on every delivery. Generated if omitted, and returned once in the create response.","type":"string"},"num_retries":{"minimum":0,"maximum":10,"type":"integer"},"retry_interval_seconds":{"minimum":1,"type":"integer"},"retry_timeout_seconds":{"minimum":1,"type":"integer"}},"required":["name","subgraph_name","subgraph_version","entity","webhook_url"]}}},"required":true},"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"webhook_secret":{"type":"string"}},"required":["id","name","webhook_secret"]}},"required":["data"]}}}}}}},"/subgraphs/webhooks/{name}":{"delete":{"operationId":"deleteWebhook","summary":"Delete a webhook","tags":["Subgraph Webhooks"],"description":"Delete a webhook by its project-unique name.","parameters":[{"schema":{"type":"string"},"in":"path","name":"name","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/subgraphs/{name}/{version}/entities":{"get":{"operationId":"listWebhookEntities","summary":"List webhook-able entities","tags":["Subgraph Webhooks"],"description":"List the entities (tables) of a deployed subgraph version that a webhook can be attached to, with row counts and columns.","parameters":[{"schema":{"pattern":"^[a-zA-Z][\\w-]*$","type":"string"},"in":"path","name":"name","required":true},{"schema":{"pattern":"^[a-zA-Z0-9][\\w+.-]*$","type":"string"},"in":"path","name":"version","required":true}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"entities":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string"},"rows":{"type":"string"},"columns":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string"},"data_type":{"type":"string"}},"required":["name","data_type"]}}},"required":["name","rows","columns"]}}},"required":["entities"]}},"required":["data"]}}}}}}},"/edge/networks":{"get":{"operationId":"listEdgeNetworks","summary":"List supported networks","tags":["Catalogs"],"description":"List the chains/networks available for Edge RPC endpoints.","responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"type":"object","properties":{"chain_id":{"anyOf":[{"type":"number"},{"type":"null"}]},"rpc_network_id":{"description":"eRPC network id; the RPC URL is /standard/{architecture}/{id}.","type":"string","example":"evm:1"},"name":{"type":"string","example":"Ethereum Mainnet"},"network_name":{"type":"string","example":"mainnet"},"chain_name":{"type":"string","example":"Ethereum"},"logo_url":{"type":"string"}},"required":["chain_id","rpc_network_id","name","network_name","chain_name","logo_url"]}}},"required":["data"]}}}}}}},"/edge/sources":{"get":{"operationId":"listEdgeSources","summary":"List Edge Data sources","tags":["Catalogs"],"description":"List the datasets available through Edge Data endpoints.","responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","example":"polymarket/balances"},"name":{"type":"string"},"description":{"type":"string"},"provider_id":{"type":"string"},"provider_name":{"type":"string"},"logo_url":{"type":"string"},"endpoint":{"type":"string"}},"required":["id","name","description","provider_id","provider_name","logo_url","endpoint"]}}},"required":["data"]}}}}}}},"/edge":{"get":{"operationId":"listEdgeEndpoints","summary":"List Edge endpoints","tags":["Edge Endpoints"],"description":"List all Edge endpoints in the current project.","parameters":[{"schema":{"anyOf":[{"type":"string","enum":["rpc"]},{"type":"string","enum":["data"]},{"type":"string","enum":["boost"]}]},"in":"query","name":"product","required":false}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string","example":"my-endpoint"},"product":{"anyOf":[{"type":"string","enum":["rpc"]},{"type":"string","enum":["data"]},{"type":"string","enum":["boost"]}]},"status":{"anyOf":[{"type":"string","enum":["ACTIVE"]},{"type":"string","enum":["PAUSED"]}]},"rate_limit_budget":{"description":"Named rate-limit budget, or null for the default.","anyOf":[{"type":"string"},{"type":"null"}]},"allowed_domains":{"description":"Web origins allowed to call this endpoint from a browser (empty = unrestricted).","type":"array","items":{"type":"string"},"example":["https://app.example.com"]},"created_at":{"format":"date-time","type":"string"},"updated_at":{"format":"date-time","type":"string"},"paused_at":{"anyOf":[{"format":"date-time","type":"string"},{"type":"null"}]}},"required":["name","product","status","rate_limit_budget","allowed_domains","created_at","updated_at","paused_at"]}},"pagination":{"type":"object","properties":{"next_page_token":{"anyOf":[{"type":"string"},{"type":"null"}]},"page_size":{"type":"number"}},"required":["next_page_token","page_size"]}},"required":["data","pagination"]}}}}}},"post":{"operationId":"createEdgeEndpoint","summary":"Create an Edge endpoint","tags":["Edge Endpoints"],"description":"Create an Edge endpoint. Optionally restrict browser access with allowed_domains. The response includes the endpoint API key — the only other place it appears is GET /edge/{name}/api-key.","requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"minLength":1,"type":"string","example":"my-endpoint"},"product":{"anyOf":[{"type":"string","enum":["rpc"]},{"type":"string","enum":["data"]},{"type":"string","enum":["boost"]}]},"rate_limit_budget":{"type":"string","enum":["edge-tier-6krpm-total-unlimited-per-ip","edge-tier-60krpm-total-unlimited-per-ip","edge-tier-180krpm-total-unlimited-per-ip","edge-tier-360krpm-total-unlimited-per-ip","edge-tier-600krpm-total-unlimited-per-ip","edge-tier-6krpm-total-500rpm-per-ip","edge-tier-60krpm-total-500rpm-per-ip","edge-tier-180krpm-total-500rpm-per-ip","edge-tier-360krpm-total-500rpm-per-ip","edge-tier-600krpm-total-500rpm-per-ip","edge-tier-unlimited-total-100rpm-per-ip","edge-tier-unlimited-total-500rpm-per-ip"],"description":"Named rate-limit budget, applied per API key across all networks. Free-tier endpoints are always assigned edge-tier-6krpm-total-500rpm-per-ip regardless of this value. Edge Data endpoints ignore it: they are assigned their plan's request rate, raised through support."},"allowed_domains":{"description":"Web origins allowed to call this endpoint from a browser (empty/omitted = unrestricted).","type":"array","items":{"type":"string"},"example":["https://app.example.com"]},"boost_chains":{"description":"Boost only: chains to configure immediately, one provider each. Failures are reported per chain in the response; the endpoint is created regardless.","type":"array","items":{"type":"object","properties":{"chain":{"minLength":1,"type":"string","example":"ethereum"},"url":{"minLength":1,"description":"Provider RPC URL. Stored as a credential; never returned by any read.","type":"string"},"headers":{"type":"object","additionalProperties":{"type":"string"}}},"required":["chain","url"]}}},"required":["name"]}}},"required":true},"responses":{"201":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","allOf":[{"type":"object","properties":{"name":{"examples":["my-endpoint"],"type":"string"},"product":{"anyOf":[{"type":"string","enum":["rpc"]},{"type":"string","enum":["data"]},{"type":"string","enum":["boost"]}]},"status":{"anyOf":[{"type":"string","enum":["ACTIVE"]},{"type":"string","enum":["PAUSED"]}]},"rate_limit_budget":{"description":"Named rate-limit budget, or null for the default.","anyOf":[{"type":"string"},{"type":"null"}]},"allowed_domains":{"description":"Web origins allowed to call this endpoint from a browser (empty = unrestricted).","examples":[["https://app.example.com"]],"type":"array","items":{"type":"string"}},"created_at":{"format":"date-time","type":"string"},"updated_at":{"format":"date-time","type":"string"},"paused_at":{"anyOf":[{"format":"date-time","type":"string"},{"type":"null"}]}},"required":["name","product","status","rate_limit_budget","allowed_domains","created_at","updated_at","paused_at"]},{"type":"object","properties":{"api_key":{"description":"Shown here and via GET /:name/api-key only.","type":"string"}},"required":["api_key"]}]},"warnings":{"description":"Non-fatal issues encountered while applying optional settings.","type":"array","items":{"type":"string"}},"boost_chains":{"description":"Per-chain outcome of boost_chains configuration.","type":"array","items":{"type":"object","properties":{"chain":{"type":"string"},"ok":{"type":"boolean"},"error":{"type":"string"}},"required":["chain","ok"]}}},"required":["data"]}}}}}}},"/edge/{name}":{"get":{"operationId":"getEdgeEndpoint","summary":"Get an Edge endpoint","tags":["Edge Endpoints"],"parameters":[{"schema":{"minLength":1,"type":"string"},"in":"path","name":"name","required":true}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"name":{"type":"string","example":"my-endpoint"},"product":{"anyOf":[{"type":"string","enum":["rpc"]},{"type":"string","enum":["data"]},{"type":"string","enum":["boost"]}]},"status":{"anyOf":[{"type":"string","enum":["ACTIVE"]},{"type":"string","enum":["PAUSED"]}]},"rate_limit_budget":{"description":"Named rate-limit budget, or null for the default.","anyOf":[{"type":"string"},{"type":"null"}]},"allowed_domains":{"description":"Web origins allowed to call this endpoint from a browser (empty = unrestricted).","type":"array","items":{"type":"string"},"example":["https://app.example.com"]},"created_at":{"format":"date-time","type":"string"},"updated_at":{"format":"date-time","type":"string"},"paused_at":{"anyOf":[{"format":"date-time","type":"string"},{"type":"null"}]}},"required":["name","product","status","rate_limit_budget","allowed_domains","created_at","updated_at","paused_at"]}},"required":["data"]}}}}}},"patch":{"operationId":"updateEdgeEndpoint","summary":"Update an Edge endpoint","tags":["Edge Endpoints"],"description":"Update the rate-limit budget and/or the allowed web domains. At least one field is required. Updates are applied domains-first and are not transactional — if the rate-limit update fails after a domains update succeeded, the domains change remains applied.","requestBody":{"content":{"application/json":{"schema":{"minProperties":1,"type":"object","properties":{"rate_limit_budget":{"anyOf":[{"type":"string","enum":["edge-tier-6krpm-total-unlimited-per-ip","edge-tier-60krpm-total-unlimited-per-ip","edge-tier-180krpm-total-unlimited-per-ip","edge-tier-360krpm-total-unlimited-per-ip","edge-tier-600krpm-total-unlimited-per-ip","edge-tier-6krpm-total-500rpm-per-ip","edge-tier-60krpm-total-500rpm-per-ip","edge-tier-180krpm-total-500rpm-per-ip","edge-tier-360krpm-total-500rpm-per-ip","edge-tier-600krpm-total-500rpm-per-ip","edge-tier-unlimited-total-100rpm-per-ip","edge-tier-unlimited-total-500rpm-per-ip"],"description":"Named rate-limit budget, applied per API key across all networks. Free-tier endpoints are always assigned edge-tier-6krpm-total-500rpm-per-ip regardless of this value. Edge Data endpoints ignore it: they are assigned their plan's request rate, raised through support."},{"type":"null"}]},"allowed_domains":{"type":"array","items":{"type":"string"}}}}}}},"parameters":[{"schema":{"minLength":1,"type":"string"},"in":"path","name":"name","required":true}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"name":{"type":"string","example":"my-endpoint"},"product":{"anyOf":[{"type":"string","enum":["rpc"]},{"type":"string","enum":["data"]},{"type":"string","enum":["boost"]}]},"status":{"anyOf":[{"type":"string","enum":["ACTIVE"]},{"type":"string","enum":["PAUSED"]}]},"rate_limit_budget":{"description":"Named rate-limit budget, or null for the default.","anyOf":[{"type":"string"},{"type":"null"}]},"allowed_domains":{"description":"Web origins allowed to call this endpoint from a browser (empty = unrestricted).","type":"array","items":{"type":"string"},"example":["https://app.example.com"]},"created_at":{"format":"date-time","type":"string"},"updated_at":{"format":"date-time","type":"string"},"paused_at":{"anyOf":[{"format":"date-time","type":"string"},{"type":"null"}]}},"required":["name","product","status","rate_limit_budget","allowed_domains","created_at","updated_at","paused_at"]}},"required":["data"]}}}}}},"delete":{"operationId":"deleteEdgeEndpoint","summary":"Delete an Edge endpoint","tags":["Edge Endpoints"],"description":"Delete an Edge endpoint. Its API key is revoked before the endpoint is removed.","parameters":[{"schema":{"minLength":1,"type":"string"},"in":"path","name":"name","required":true}],"responses":{"204":{"description":"Edge endpoint deleted."}}}},"/edge/{name}/pause":{"put":{"operationId":"pauseEdgeEndpoint","summary":"Pause an Edge endpoint","tags":["Edge Lifecycle"],"parameters":[{"schema":{"minLength":1,"type":"string"},"in":"path","name":"name","required":true}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"name":{"type":"string","example":"my-endpoint"},"product":{"anyOf":[{"type":"string","enum":["rpc"]},{"type":"string","enum":["data"]},{"type":"string","enum":["boost"]}]},"status":{"anyOf":[{"type":"string","enum":["ACTIVE"]},{"type":"string","enum":["PAUSED"]}]},"rate_limit_budget":{"description":"Named rate-limit budget, or null for the default.","anyOf":[{"type":"string"},{"type":"null"}]},"allowed_domains":{"description":"Web origins allowed to call this endpoint from a browser (empty = unrestricted).","type":"array","items":{"type":"string"},"example":["https://app.example.com"]},"created_at":{"format":"date-time","type":"string"},"updated_at":{"format":"date-time","type":"string"},"paused_at":{"anyOf":[{"format":"date-time","type":"string"},{"type":"null"}]}},"required":["name","product","status","rate_limit_budget","allowed_domains","created_at","updated_at","paused_at"]}},"required":["data"]}}}}}}},"/edge/{name}/resume":{"put":{"operationId":"resumeEdgeEndpoint","summary":"Resume an Edge endpoint","tags":["Edge Lifecycle"],"parameters":[{"schema":{"minLength":1,"type":"string"},"in":"path","name":"name","required":true}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"name":{"type":"string","example":"my-endpoint"},"product":{"anyOf":[{"type":"string","enum":["rpc"]},{"type":"string","enum":["data"]},{"type":"string","enum":["boost"]}]},"status":{"anyOf":[{"type":"string","enum":["ACTIVE"]},{"type":"string","enum":["PAUSED"]}]},"rate_limit_budget":{"description":"Named rate-limit budget, or null for the default.","anyOf":[{"type":"string"},{"type":"null"}]},"allowed_domains":{"description":"Web origins allowed to call this endpoint from a browser (empty = unrestricted).","type":"array","items":{"type":"string"},"example":["https://app.example.com"]},"created_at":{"format":"date-time","type":"string"},"updated_at":{"format":"date-time","type":"string"},"paused_at":{"anyOf":[{"format":"date-time","type":"string"},{"type":"null"}]}},"required":["name","product","status","rate_limit_budget","allowed_domains","created_at","updated_at","paused_at"]}},"required":["data"]}}}}}}},"/edge/{name}/api-key":{"get":{"operationId":"revealEdgeEndpointKey","summary":"Reveal the endpoint API key","tags":["Edge API Keys"],"parameters":[{"schema":{"minLength":1,"type":"string"},"in":"path","name":"name","required":true}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"api_key":{"type":"string"}},"required":["api_key"]}},"required":["data"]}}}}}}},"/edge/{name}/metrics":{"get":{"operationId":"getEdgeEndpointMetrics","summary":"Get endpoint metrics","tags":["Edge Metrics"],"description":"Request and error counts over a time window, as JSON time series.","parameters":[{"schema":{"type":"string"},"example":"2026-09-08T00:00:00Z","in":"query","name":"from","required":false,"description":"ISO-8601 start of the window (default: 24 hours ago). Empty means omitted."},{"schema":{"type":"string"},"example":"2026-09-09T00:00:00Z","in":"query","name":"to","required":false,"description":"ISO-8601 end of the window (default: now). Empty means omitted."},{"schema":{"anyOf":[{"type":"string","enum":["1m"]},{"type":"string","enum":["5m"]},{"type":"string","enum":["1h"]},{"type":"string","enum":["6h"]},{"type":"string","enum":["1d"]}]},"in":"query","name":"bucket_size","required":false},{"schema":{"minLength":1,"type":"string"},"in":"path","name":"name","required":true}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"requests":{"type":"array","items":{"type":"object","properties":{"time":{"format":"date-time","type":"string"},"value":{"type":"number"}},"required":["time","value"]}},"errors":{"type":"array","items":{"type":"object","properties":{"time":{"format":"date-time","type":"string"},"value":{"type":"number"}},"required":["time","value"]}}},"required":["requests","errors"]}},"required":["data"]}}}}}}},"/boost/chains":{"get":{"summary":"List Boost-supported chains","tags":["Boost Chains"],"description":"List the chains available for Boost caching, project-scoped (no endpoint required).","responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"available":{"description":"false when this deployment has no Boost service; an empty chains list with available: true means Boost supports no chains, which is a different statement.","type":"boolean"},"chains":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string","example":"ethereum"},"chain_id":{"type":"integer","example":1},"cached":{"type":"boolean"},"earliest_block":{"anyOf":[{"type":"integer"},{"type":"null"}]},"latest_block":{"anyOf":[{"type":"integer"},{"type":"null"}]},"stale":{"type":"boolean"}},"required":["name","chain_id"]}}},"required":["available","chains"]}},"required":["data"]}}}}}},"post":{"summary":"Update a Boost chain's settings","tags":["Boost Chains"],"description":"Switch this chain on or off, and/or set its forward and cache timeout overrides. At least one field is required; a null timeout clears it (back to inheriting). A chain switched off keeps its upstreams and refuses requests at its Boost URL.","requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"chain":{"minLength":1,"type":"string"},"enabled":{"description":"Switch the chain on or off. Off refuses requests at its Boost URL; upstreams and settings are kept.","type":"boolean"},"forward_timeout_ms":{"anyOf":[{"type":"null"},{"minimum":500,"maximum":120000,"type":"integer"}]},"cache_timeout_ms":{"anyOf":[{"type":"null"},{"minimum":1,"maximum":5000,"type":"integer"}]}},"required":["chain"]}}},"required":true},"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"ok":{"type":"boolean"}},"required":["ok"]}},"required":["data"]}}}}}}},"/boost/validate-upstream":{"post":{"summary":"Validate a Boost provider URL","tags":["Boost Upstreams"],"description":"Probe a provider URL through Boost and report which chain it is and whether it currently works.","requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"url":{"minLength":1,"type":"string","example":"https://base-mainnet.g.alchemy.com/v2/YOUR_PROVIDER_KEY"},"headers":{"type":"object","additionalProperties":{"type":"string"}},"chain":{"description":"Intended chain to check the URL against. Omit (or send empty) to detect the chain from the URL.","type":"string","example":"base"}},"required":["url"]}}},"required":true},"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"ok":{"type":"boolean"},"checks":{"type":"object","properties":{"chain_id":{"type":"object","properties":{"ok":{"type":"boolean"},"error":{"type":"object","properties":{"code":{"description":"Stable key to branch on: unreachable, timeout, rpc_error, blocked_address, ...","type":"string"},"message":{"type":"string"},"http_status":{"type":"integer"},"rpc_code":{"type":"integer"}},"required":["code","message"]},"latency_ms":{"type":"integer"},"chain_id":{"type":"integer"},"block_number":{"type":"integer"}},"required":["ok"]},"latest_block":{"type":"object","properties":{"ok":{"type":"boolean"},"error":{"type":"object","properties":{"code":{"description":"Stable key to branch on: unreachable, timeout, rpc_error, blocked_address, ...","type":"string"},"message":{"type":"string"},"http_status":{"type":"integer"},"rpc_code":{"type":"integer"}},"required":["code","message"]},"latency_ms":{"type":"integer"},"chain_id":{"type":"integer"},"block_number":{"type":"integer"}},"required":["ok"]}},"required":["chain_id","latest_block"]},"chain":{"type":"object","properties":{"detected_chain_id":{"anyOf":[{"type":"integer"},{"type":"null"}]},"name":{"anyOf":[{"type":"string"},{"type":"null"}]},"supported":{"type":"boolean"},"requested":{"type":"string"},"matches":{"description":"true they agree, false they clash, null nothing was detected.","anyOf":[{"type":"boolean"},{"type":"null"}]}},"required":["detected_chain_id","name","supported"]}},"required":["ok","checks","chain"]}},"required":["data"]}}}}}}},"/boost/providers/connect":{"post":{"operationId":"connectBoostProvider","summary":"Connect a provider account","tags":["Boost Providers"],"description":"Store a QuickNode admin API key or an Alchemy access key for this project, having checked it works against the provider's management API. Works before the project's Boost exists. Connecting again rotates the credential and keeps what the previous one created. The reply carries a masked hint and which Boost chains the account can serve; the credential itself is never returned by any read.","requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"vendor":{"anyOf":[{"type":"string","enum":["quicknode"]},{"type":"string","enum":["alchemy"]},{"type":"string","enum":["chainstack"]},{"type":"string","enum":["drpc"]},{"type":"string","enum":["ankr"]}],"example":"quicknode"},"credential":{"minLength":8,"maxLength":512,"description":"QuickNode: an admin API key. Alchemy: an access key (Settings -> Security), not an app API key. Stored encrypted; never returned by any read.","type":"string"}},"required":["vendor","credential"]}}},"required":true},"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"vendor":{"anyOf":[{"type":"string","enum":["quicknode"]},{"type":"string","enum":["alchemy"]},{"type":"string","enum":["chainstack"]},{"type":"string","enum":["drpc"]},{"type":"string","enum":["ankr"]}],"example":"quicknode"},"credential_hint":{"type":"string"},"chains":{"description":"Every Boost-supported chain, with whether this account offers it.","type":"array","items":{"type":"object","properties":{"chain":{"type":"string"},"chain_id":{"type":"integer"},"supported":{"description":"Whether this account can serve the chain. Unsupported chains cannot be provisioned from it.","type":"boolean"}},"required":["chain","chain_id","supported"]}}},"required":["vendor","credential_hint","chains"]}},"required":["data"]}}}}}}},"/boost/providers/{vendor}/chains":{"get":{"operationId":"getBoostProviderChains","summary":"Which chains a connected provider serves","tags":["Boost Providers"],"description":"Per-chain support for the connected provider account, read from what the vendor publishes. Asked before a customer chooses chains, so a chain the vendor does not serve is never offered. A vendor that publishes no chain ids denies nothing here; provisioning proves each endpoint with `eth_chainId` either way.","parameters":[{"schema":{"anyOf":[{"type":"string","enum":["quicknode"]},{"type":"string","enum":["alchemy"]},{"type":"string","enum":["chainstack"]},{"type":"string","enum":["drpc"]},{"type":"string","enum":["ankr"]}]},"example":"quicknode","in":"path","name":"vendor","required":true}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"chains":{"description":"Per-chain support for the connected provider account, read from what the vendor publishes. `supported: false` is a definitive no — creating that endpoint would be refused.","type":"array","items":{"type":"object","properties":{"chain":{"type":"string"},"chain_id":{"type":"integer"},"supported":{"type":"boolean"}},"required":["chain","chain_id","supported"]}}},"required":["chains"]}},"required":["data"]}}}}}}},"/boost/providers/provision":{"post":{"operationId":"provisionBoostProvider","summary":"Provision chains from a provider account","tags":["Boost Providers"],"description":"Create an endpoint in the connected account for each chain and register it as that chain's upstream on this project's Boost (id `<chain>-<vendor>`, pricing vendor pinned). Requires the project's Boost to exist. Outcomes are per chain: one the provider or Boost refuses does not roll back the others, and a retry reuses what was already created.","requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"vendor":{"anyOf":[{"type":"string","enum":["quicknode"]},{"type":"string","enum":["alchemy"]},{"type":"string","enum":["chainstack"]},{"type":"string","enum":["drpc"]},{"type":"string","enum":["ankr"]}],"example":"quicknode"},"chains":{"minItems":1,"maxItems":64,"type":"array","items":{"minLength":1,"type":"string"},"example":["ethereum","base"]}},"required":["vendor","chains"]}}},"required":true},"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"results":{"description":"One row per requested chain. A chain the provider refused, or that Boost refused, reports ok: false with the reason; the others are created regardless.","type":"array","items":{"type":"object","properties":{"chain":{"type":"string"},"ok":{"type":"boolean"},"error":{"type":"string"},"unsupported":{"description":"True on an ok: false row when the account does not cover the chain (the provider does not serve it, the plan leaves it out, or the key may not call it). Retrying will not change it.","type":"boolean"}},"required":["chain","ok"]}}},"required":["results"]}},"required":["data"]}}}}}}},"/boost/providers/disconnect":{"post":{"operationId":"disconnectBoostProvider","summary":"Disconnect a provider account","tags":["Boost Providers"],"description":"Forget a connected account: its upstreams are removed from every chain they served (a standby is promoted where one exists), the endpoints it created are deleted from the provider, best-effort, and the stored credential is destroyed.","requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"vendor":{"anyOf":[{"type":"string","enum":["quicknode"]},{"type":"string","enum":["alchemy"]},{"type":"string","enum":["chainstack"]},{"type":"string","enum":["drpc"]},{"type":"string","enum":["ankr"]}],"example":"quicknode"}},"required":["vendor"]}}},"required":true},"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"ok":{"type":"boolean"}},"required":["ok"]}},"required":["data"]}}}}}}},"/boost":{"get":{"operationId":"getBoostEndpoint","summary":"Get the project's Boost","tags":["Boost"],"description":"The endpoint record plus Boost serving state: availability, every supported chain with its switch and the upstream serving it, connected provider accounts, the masked configuration, the vendor list, and the dashboard-side settings.","responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","allOf":[{"type":"object","properties":{"name":{"examples":["my-endpoint"],"type":"string"},"status":{"anyOf":[{"type":"string","enum":["ACTIVE"]},{"type":"string","enum":["PAUSED"]}]},"rate_limit_budget":{"description":"Named rate-limit budget, or null for the default.","anyOf":[{"type":"string"},{"type":"null"}]},"allowed_domains":{"description":"Web origins allowed to call this endpoint from a browser (empty = unrestricted).","examples":[["https://app.example.com"]],"type":"array","items":{"type":"string"}},"created_at":{"format":"date-time","type":"string"},"updated_at":{"format":"date-time","type":"string"},"paused_at":{"anyOf":[{"format":"date-time","type":"string"},{"type":"null"}]}},"required":["name","status","rate_limit_budget","allowed_domains","created_at","updated_at","paused_at"]},{"type":"object","properties":{"boost":{"description":"Boost serving state; null when the Boost control plane is unreachable right now (the endpoint record is still served).","anyOf":[{"type":"object","properties":{"available":{"type":"boolean"},"chains":{"description":"Every Boost-supported chain with its state on this endpoint: switched on or off, which upstream serves it, which stand by. Chains with no configuration are present with enabled: false and no upstreams.","type":"array","items":{"type":"object","allOf":[{"type":"object","properties":{"name":{"examples":["ethereum"],"type":"string"},"chain_id":{"examples":[1],"type":"integer"},"cached":{"type":"boolean"},"earliest_block":{"anyOf":[{"type":"integer"},{"type":"null"}]},"latest_block":{"anyOf":[{"type":"integer"},{"type":"null"}]},"stale":{"type":"boolean"}},"required":["name","chain_id"]},{"type":"object","properties":{"enabled":{"type":"boolean"},"active_upstream":{"description":"The upstream serving this chain, or null when none is.","anyOf":[{"type":"object","properties":{"id":{"examples":["ethereum-quicknode"],"type":"string"},"endpoint_host":{"examples":["eth.quiknode.pro"],"type":"string"},"source":{"description":"Where the upstream came from: a connected provider account, or a URL pasted by hand.","anyOf":[{"examples":["quicknode"],"anyOf":[{"type":"string","enum":["quicknode"]},{"type":"string","enum":["alchemy"]},{"type":"string","enum":["chainstack"]},{"type":"string","enum":["drpc"]},{"type":"string","enum":["ankr"]}]},{"type":"string","enum":["custom"]}]}},"required":["id","endpoint_host","source"]},{"type":"null"}]},"standbys":{"description":"Configured upstreams not currently serving.","type":"array","items":{"type":"object","properties":{"id":{"examples":["ethereum-quicknode"],"type":"string"},"endpoint_host":{"examples":["eth.quiknode.pro"],"type":"string"},"source":{"description":"Where the upstream came from: a connected provider account, or a URL pasted by hand.","anyOf":[{"examples":["quicknode"],"anyOf":[{"type":"string","enum":["quicknode"]},{"type":"string","enum":["alchemy"]},{"type":"string","enum":["chainstack"]},{"type":"string","enum":["drpc"]},{"type":"string","enum":["ankr"]}]},{"type":"string","enum":["custom"]}]}},"required":["id","endpoint_host","source"]}}},"required":["enabled","active_upstream","standbys"]}]}},"providers":{"description":"Provider accounts connected to this project (QuickNode, Alchemy) and the chains each one provisioned.","type":"array","items":{"type":"object","properties":{"vendor":{"examples":["quicknode"],"anyOf":[{"type":"string","enum":["quicknode"]},{"type":"string","enum":["alchemy"]},{"type":"string","enum":["chainstack"]},{"type":"string","enum":["drpc"]},{"type":"string","enum":["ankr"]}]},"credential_hint":{"description":"The stored credential, masked. Never the credential itself.","examples":["QN_d…7bc"],"type":"string"},"connected_at":{"format":"date-time","type":"string"},"chains":{"description":"Chains whose upstream this account created.","type":"array","items":{"type":"string"}},"account_resource":{"description":"What to look for in the provider's own dashboard to find what this connection created there. Null when the vendor names its resources per chain, in which case the chain rows' endpoint hosts are the answer.","examples":["banana-mouse-cube"],"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["vendor","credential_hint","connected_at","chains","account_resource"]}},"config":{"description":"null means Boost is available and this endpoint simply has no configuration yet.","anyOf":[{"type":"object","properties":{"chains":{"type":"array","items":{"type":"object","properties":{"chain_id":{"type":"integer"},"forward_timeout_ms":{"anyOf":[{"type":"integer"},{"type":"null"}]},"cache_timeout_ms":{"anyOf":[{"type":"integer"},{"type":"null"}]}},"required":["chain_id","forward_timeout_ms","cache_timeout_ms"]}},"upstreams":{"type":"array","items":{"type":"object","properties":{"id":{"examples":["ethereum-primary"],"type":"string"},"chain_id":{"type":"integer"},"endpoint_host":{"description":"Provider host only. The stored URL is a credential and is never returned.","examples":["eth-mainnet.g.alchemy.com"],"type":"string"},"header_names":{"description":"Names of configured provider headers; values are never returned.","type":"array","items":{"type":"string"}},"active":{"description":"Whether this upstream currently serves the chain (standbys are false).","type":"boolean"},"forward_timeout_ms":{"anyOf":[{"type":"integer"},{"type":"null"}]},"vendor_name":{"description":"Pinned pricing vendor, or null for auto-detection.","anyOf":[{"type":"string"},{"type":"null"}]}},"required":["id","chain_id","endpoint_host","active","forward_timeout_ms","vendor_name"]}}},"required":["chains","upstreams"]},{"type":"null"}]},"vendors":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string"},"label":{"type":"string"},"unit":{"type":"string"}},"required":["name","label","unit"]}},"settings":{"type":"object","properties":{"provider_rate_per_million_usd":{"description":"What you say your provider charges per million requests, in USD. Prices the estimated saving when no vendor rate card applies.","examples":[5],"type":"number"}},"required":["provider_rate_per_million_usd"]}},"required":["available","chains","providers","config","vendors","settings"]},{"type":"null"}]}},"required":["boost"]}]}},"required":["data"]}}}}}},"patch":{"operationId":"updateBoostEndpoint","summary":"Update the project's Boost","tags":["Boost"],"description":"Update the allowed web domains and/or what your provider charges per million requests (prices the estimated saving where no vendor rate card applies). Rate limits on Boost endpoints are Goldsky-managed and cannot be changed here.","requestBody":{"content":{"application/json":{"schema":{"minProperties":1,"type":"object","properties":{"allowed_domains":{"type":"array","items":{"type":"string"}},"provider_rate_per_million_usd":{"minimum":0,"maximum":100000,"description":"What your provider charges per million requests, in USD; prices the estimated saving where no vendor rate card applies.","type":"number"}}}}}},"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"name":{"type":"string","example":"my-endpoint"},"status":{"anyOf":[{"type":"string","enum":["ACTIVE"]},{"type":"string","enum":["PAUSED"]}]},"rate_limit_budget":{"description":"Named rate-limit budget, or null for the default.","anyOf":[{"type":"string"},{"type":"null"}]},"allowed_domains":{"description":"Web origins allowed to call this endpoint from a browser (empty = unrestricted).","type":"array","items":{"type":"string"},"example":["https://app.example.com"]},"created_at":{"format":"date-time","type":"string"},"updated_at":{"format":"date-time","type":"string"},"paused_at":{"anyOf":[{"format":"date-time","type":"string"},{"type":"null"}]}},"required":["name","status","rate_limit_budget","allowed_domains","created_at","updated_at","paused_at"]}},"required":["data"]}}}}}}},"/boost/disable":{"put":{"operationId":"disableBoostEndpoint","summary":"Disable the project's Boost","tags":["Boost Lifecycle"],"description":"Disable the project's Boost: traffic is rejected, configuration and the API key are kept.","responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"name":{"type":"string","example":"my-endpoint"},"status":{"anyOf":[{"type":"string","enum":["ACTIVE"]},{"type":"string","enum":["PAUSED"]}]},"rate_limit_budget":{"description":"Named rate-limit budget, or null for the default.","anyOf":[{"type":"string"},{"type":"null"}]},"allowed_domains":{"description":"Web origins allowed to call this endpoint from a browser (empty = unrestricted).","type":"array","items":{"type":"string"},"example":["https://app.example.com"]},"created_at":{"format":"date-time","type":"string"},"updated_at":{"format":"date-time","type":"string"},"paused_at":{"anyOf":[{"format":"date-time","type":"string"},{"type":"null"}]}},"required":["name","status","rate_limit_budget","allowed_domains","created_at","updated_at","paused_at"]}},"required":["data"]}}}}}}},"/boost/enable":{"put":{"operationId":"enableBoostEndpoint","summary":"Enable Boost for this project","tags":["Boost Lifecycle"],"description":"Enable the project's Boost — created on first use (the response then includes the endpoint API key), switched back on afterwards. One per project, always named 'boost'. Optionally configure chains in the same call via boost_chains — one provider each, failures reported per chain.","requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"allowed_domains":{"description":"Web origins allowed to call this endpoint from a browser (empty/omitted = unrestricted).","type":"array","items":{"type":"string"},"example":["https://app.example.com"]},"boost_chains":{"description":"Boost only: chains to configure immediately, one provider each. Failures are reported per chain in the response; the endpoint is created regardless.","type":"array","items":{"type":"object","properties":{"chain":{"minLength":1,"type":"string","example":"ethereum"},"url":{"minLength":1,"description":"Provider RPC URL. Stored as a credential; never returned by any read.","type":"string"},"headers":{"type":"object","additionalProperties":{"type":"string"}}},"required":["chain","url"]}}}}}}},"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"name":{"type":"string","example":"my-endpoint"},"status":{"anyOf":[{"type":"string","enum":["ACTIVE"]},{"type":"string","enum":["PAUSED"]}]},"rate_limit_budget":{"description":"Named rate-limit budget, or null for the default.","anyOf":[{"type":"string"},{"type":"null"}]},"allowed_domains":{"description":"Web origins allowed to call this endpoint from a browser (empty = unrestricted).","type":"array","items":{"type":"string"},"example":["https://app.example.com"]},"created_at":{"format":"date-time","type":"string"},"updated_at":{"format":"date-time","type":"string"},"paused_at":{"anyOf":[{"format":"date-time","type":"string"},{"type":"null"}]}},"required":["name","status","rate_limit_budget","allowed_domains","created_at","updated_at","paused_at"]},"boost_chains":{"description":"Per-chain outcome of boost_chains configuration.","type":"array","items":{"type":"object","properties":{"chain":{"type":"string"},"ok":{"type":"boolean"},"error":{"type":"string"}},"required":["chain","ok"]}}},"required":["data"]}}}},"201":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","allOf":[{"type":"object","properties":{"name":{"examples":["my-endpoint"],"type":"string"},"status":{"anyOf":[{"type":"string","enum":["ACTIVE"]},{"type":"string","enum":["PAUSED"]}]},"rate_limit_budget":{"description":"Named rate-limit budget, or null for the default.","anyOf":[{"type":"string"},{"type":"null"}]},"allowed_domains":{"description":"Web origins allowed to call this endpoint from a browser (empty = unrestricted).","examples":[["https://app.example.com"]],"type":"array","items":{"type":"string"}},"created_at":{"format":"date-time","type":"string"},"updated_at":{"format":"date-time","type":"string"},"paused_at":{"anyOf":[{"format":"date-time","type":"string"},{"type":"null"}]}},"required":["name","status","rate_limit_budget","allowed_domains","created_at","updated_at","paused_at"]},{"type":"object","properties":{"api_key":{"description":"Shown here and via GET /boost/api-key only.","type":"string"}},"required":["api_key"]}]},"warnings":{"type":"array","items":{"type":"string"}},"boost_chains":{"description":"Per-chain outcome of boost_chains configuration.","type":"array","items":{"type":"object","properties":{"chain":{"type":"string"},"ok":{"type":"boolean"},"error":{"type":"string"}},"required":["chain","ok"]}}},"required":["data"]}}}}}}},"/boost/api-key":{"get":{"operationId":"getBoostEndpointApiKey","summary":"Reveal the Boost API key","tags":["Boost API Keys"],"description":"The API key the project's Boost serves traffic under. Any project member can read it: the key is how you use Boost, not how you edit it.","responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"api_key":{"type":"string"}},"required":["api_key"]}},"required":["data"]}}}}}}},"/boost/upstreams":{"post":{"summary":"Add a Boost upstream","tags":["Boost Upstreams"],"description":"Add a provider for a chain on this endpoint.","requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"chain":{"minLength":1,"type":"string","example":"base"},"id":{"minLength":1,"maxLength":100,"description":"Your name for this provider, unique per chain.","type":"string","example":"base-primary"},"url":{"minLength":1,"description":"Your own provider's RPC URL (shared public RPCs are refused). Stored as a credential; never returned by any read.","type":"string","example":"https://base-mainnet.g.alchemy.com/v2/YOUR_PROVIDER_KEY"},"headers":{"description":"Provider request headers, when your provider authenticates that way. Values are credentials; only the names are ever returned.","type":"object","additionalProperties":{"type":"string"}}},"required":["chain","id","url"]}}},"required":true},"responses":{"201":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"id":{"type":"string"},"chain":{"type":"string"}},"required":["id","chain"]}},"required":["data"]}}}}}}},"/boost/upstreams/url":{"post":{"summary":"Replace a Boost upstream's URL","tags":["Boost Upstreams"],"description":"Replace a provider's URL, and optionally its headers. headers is three-state: absent keeps the stored headers, an object replaces them wholesale, null clears them.","requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"chain":{"minLength":1,"type":"string","example":"base"},"id":{"minLength":1,"maxLength":100,"type":"string","example":"base-primary"},"url":{"minLength":1,"type":"string","example":"https://base-mainnet.g.alchemy.com/v2/YOUR_NEW_KEY"},"headers":{"description":"Absent keeps the stored headers, an object replaces them wholesale, null clears them.","anyOf":[{"type":"object","additionalProperties":{"type":"string"}},{"type":"null"}]}},"required":["chain","id","url"]}}},"required":true},"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"ok":{"type":"boolean"}},"required":["ok"]}},"required":["data"]}}}}}}},"/boost/upstreams/activate":{"post":{"summary":"Activate a Boost upstream","tags":["Boost Upstreams"],"description":"Make this upstream the active one serving its chain.","requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"chain":{"minLength":1,"type":"string","example":"base"},"id":{"minLength":1,"maxLength":100,"type":"string","example":"base-primary"}},"required":["chain","id"]}}},"required":true},"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"ok":{"type":"boolean"}},"required":["ok"]}},"required":["data"]}}}}}}},"/boost/upstreams/remove":{"post":{"summary":"Remove a Boost upstream","tags":["Boost Upstreams"],"description":"Remove a provider. If this leaves the chain with none serving, a fallback is promoted automatically, best-effort.","requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"chain":{"minLength":1,"type":"string","example":"base"},"id":{"minLength":1,"maxLength":100,"type":"string","example":"base-primary"}},"required":["chain","id"]}}},"required":true},"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"ok":{"type":"boolean"}},"required":["ok"]}},"required":["data"]}}}}}}},"/boost/upstreams/settings":{"post":{"summary":"Update a Boost upstream's settings","tags":["Boost Upstreams"],"description":"Set this provider's own forward timeout and/or pinned pricing vendor. At least one field is required; null clears it.","requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"chain":{"minLength":1,"type":"string"},"id":{"minLength":1,"maxLength":100,"type":"string"},"forward_timeout_ms":{"anyOf":[{"type":"null"},{"minimum":500,"maximum":120000,"type":"integer"}]},"vendor_name":{"anyOf":[{"type":"null"},{"type":"string"}]}},"required":["chain","id"]}}},"required":true},"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"ok":{"type":"boolean"}},"required":["ok"]}},"required":["data"]}}}}}}},"/boost/requests":{"get":{"operationId":"getBoostRequests","summary":"Get Boost's per-request history","tags":["Boost Metrics"],"description":"One row per request Boost served: the method, the chain, whether it came from the cache or was forwarded, which provider served it, how long it took, and the error when there was one. Newest first, 50 to a page — pass the returned `cursor` for the next. The same history the dashboard's Requests tab reads; `text` carries each row's fields as JSON.","parameters":[{"schema":{"type":"number"},"in":"query","name":"cursor","required":false},{"schema":{"type":"string"},"in":"query","name":"log_levels","required":false},{"schema":{"type":"string"},"in":"query","name":"search","required":false},{"schema":{"anyOf":[{"type":"string","enum":["asc"]},{"type":"string","enum":["desc"]}]},"in":"query","name":"direction","required":false},{"schema":{"type":"string"},"in":"query","name":"statuses","required":false},{"schema":{"type":"string"},"in":"query","name":"chains","required":false},{"schema":{"type":"string"},"in":"query","name":"methods","required":false}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"results":{"type":"array","items":{"type":"object","properties":{"text":{"type":"string"},"timestamp":{"type":"number"},"level":{"type":"string"}},"required":["text","timestamp","level"]}},"cursor":{"type":"number"}},"required":["results"]}},"required":["data"]}}}}}}},"/boost/metrics":{"get":{"summary":"Get Boost metrics for an endpoint","tags":["Boost Metrics"],"description":"Cache hits and their latency, upstream (provider) calls and theirs, miss reasons, per-upstream breakdown, vendor credit savings, request outcomes per chain, cache hits per method, and the cache hit rate over a time window.","parameters":[{"schema":{"type":"string"},"example":"2026-09-08T00:00:00Z","in":"query","name":"from","required":false,"description":"ISO-8601 start of the window (default: 24 hours ago). Empty means omitted."},{"schema":{"type":"string"},"example":"2026-09-09T00:00:00Z","in":"query","name":"to","required":false,"description":"ISO-8601 end of the window (default: now). Empty means omitted."},{"schema":{"anyOf":[{"type":"string","enum":["1m"]},{"type":"string","enum":["5m"]},{"type":"string","enum":["1h"]},{"type":"string","enum":["6h"]},{"type":"string","enum":["1d"]}]},"in":"query","name":"bucket_size","required":false}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"hits":{"description":"Cache hits — the billable series.","type":"array","items":{"type":"object","properties":{"time":{"format":"date-time","type":"string"},"value":{"type":"number"}},"required":["time","value"]}},"upstream_calls":{"description":"Forwarded (free) calls that reached the provider.","type":"array","items":{"type":"object","properties":{"time":{"format":"date-time","type":"string"},"value":{"type":"number"}},"required":["time","value"]}},"hit_latency_ms":{"type":"array","items":{"type":"object","properties":{"time":{"format":"date-time","type":"string"},"value":{"type":"number"}},"required":["time","value"]}},"upstream_latency_ms":{"type":"array","items":{"type":"object","properties":{"time":{"format":"date-time","type":"string"},"value":{"type":"number"}},"required":["time","value"]}},"miss_reasons":{"type":"array","items":{"type":"object","properties":{"reason":{"type":"string"},"count":{"type":"integer"}},"required":["reason","count"]}},"upstreams":{"type":"array","items":{"type":"object","properties":{"upstream_id":{"type":"string"},"chain":{"type":"string"},"calls":{"type":"integer"},"errors":{"type":"integer"},"avg_latency_ms":{"type":"integer"}},"required":["upstream_id","chain","calls","errors","avg_latency_ms"]}},"credits":{"description":"Per-vendor, per-chain credit savings. Never totaled across vendors: Alchemy compute units and Infura credits are different currencies. The `_usd` fields ARE comparable across vendors, priced from Boost's own rate card — a vendor without a published rate reports null dollars, not zero.","type":"array","items":{"type":"object","properties":{"vendor":{"type":"string"},"unit":{"type":"string"},"chain":{"type":"string"},"saved":{"type":"number"},"spent":{"type":"number"},"saved_usd":{"anyOf":[{"type":"number"},{"type":"null"}]},"spent_usd":{"anyOf":[{"type":"number"},{"type":"null"}]},"usd_per_million_units":{"anyOf":[{"type":"number"},{"type":"null"}]},"rate_source":{"anyOf":[{"type":"string"},{"type":"null"}]},"rate_as_of":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["vendor","unit","chain","saved","spent","saved_usd","spent_usd","usd_per_million_units","rate_source","rate_as_of"]}},"savings":{"description":"Saved vs spent per bucket, per vendor and chain — what `credits` reports for the whole window, resolved in time. The `_usd` series are EMPTY, never zero-filled, for a vendor with no published rate: unknown dollars are not $0.","type":"array","items":{"type":"object","properties":{"vendor":{"type":"string"},"unit":{"type":"string"},"chain":{"type":"string"},"usd_per_million_units":{"anyOf":[{"type":"number"},{"type":"null"}]},"saved":{"type":"array","items":{"type":"object","properties":{"time":{"format":"date-time","type":"string"},"value":{"type":"number"}},"required":["time","value"]}},"spent":{"type":"array","items":{"type":"object","properties":{"time":{"format":"date-time","type":"string"},"value":{"type":"number"}},"required":["time","value"]}},"saved_usd":{"type":"array","items":{"type":"object","properties":{"time":{"format":"date-time","type":"string"},"value":{"type":"number"}},"required":["time","value"]}},"spent_usd":{"type":"array","items":{"type":"object","properties":{"time":{"format":"date-time","type":"string"},"value":{"type":"number"}},"required":["time","value"]}}},"required":["vendor","unit","chain","usd_per_million_units","saved","spent","saved_usd","spent_usd"]}},"by_chain":{"description":"Request outcomes per chain, per bucket.","type":"array","items":{"type":"object","properties":{"chain":{"type":"string"},"cached":{"type":"array","items":{"type":"object","properties":{"time":{"format":"date-time","type":"string"},"value":{"type":"number"}},"required":["time","value"]}},"forwarded":{"type":"array","items":{"type":"object","properties":{"time":{"format":"date-time","type":"string"},"value":{"type":"number"}},"required":["time","value"]}},"errored":{"type":"array","items":{"type":"object","properties":{"time":{"format":"date-time","type":"string"},"value":{"type":"number"}},"required":["time","value"]}}},"required":["chain","cached","forwarded","errored"]}},"by_method":{"description":"Cache hits and forwards per JSON-RPC method and chain, whole window. Bounded to each chain's top methods.","type":"array","items":{"type":"object","properties":{"chain":{"type":"string"},"method":{"type":"string"},"hits":{"type":"integer"},"forwarded":{"type":"integer"}},"required":["chain","method","hits","forwarded"]}},"by_method_series":{"description":"Requests per JSON-RPC method, per bucket. Cache hits, forwards and forward errors counted together: the chart this feeds compares methods by volume, not by outcome. Sums the same three outcomes as `by_chain`, so both add up to the same window total. Bounded to the busiest methods, so it is not a complete partition of the window.","type":"array","items":{"type":"object","properties":{"chain":{"type":"string"},"method":{"type":"string"},"requests":{"type":"array","items":{"type":"object","properties":{"time":{"format":"date-time","type":"string"},"value":{"type":"number"}},"required":["time","value"]}}},"required":["chain","method","requests"]}},"cache_hit_rate":{"description":"Share of requests served from cache per bucket, 0-100.","type":"array","items":{"type":"object","properties":{"time":{"format":"date-time","type":"string"},"value":{"type":"number"}},"required":["time","value"]}}},"required":["hits","upstream_calls","hit_latency_ms","upstream_latency_ms","miss_reasons","upstreams","credits","savings","by_chain","by_method","by_method_series","cache_hit_rate"]}},"required":["data"]}}}}}}},"/feeds":{"get":{"operationId":"listFeeds","summary":"List feeds","tags":["Feed Catalog"],"description":"Every feed Goldsky offers, with when this project first sent it a request. Every feed answers for every project; all a project needs is its Feeds key (see `POST /api/v1/feeds/api-key`).","responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"type":"object","properties":{"theme":{"type":"string"},"dataset":{"type":"string"},"title":{"type":"string"},"description":{"type":"string"},"first_request_at":{"anyOf":[{"format":"date-time","description":"When this project first sent a request to the feed. Null until then.","type":"string"},{"type":"null"}]},"has_stream":{"description":"Whether this project has a stream delivering this feed into its own database or webhook. Independent of `first_request_at`: a stream is set up without ever calling the API, and calling the API does not create one.","type":"boolean"}},"required":["theme","dataset","title","description","first_request_at","has_stream"]}},"api_key_name":{"anyOf":[{"description":"Name of the project's Feeds key (`feeds`) when it exists, else null. Reveal it from the Edge Data page or the Edge API; rotate it with `POST /api/v1/feeds/key/rotate`.","type":"string"},{"type":"null"}]}},"required":["data","api_key_name"]}}}}}}},"/feeds/api-key":{"post":{"operationId":"ensureFeedsApiKey","summary":"Get or create the project's Feeds key","tags":["Feed Catalog"],"description":"Returns the project's Feeds key (an Edge Data endpoint named `feeds`), creating it if the project has none. The plaintext key is returned once, as `data.api_key`, by the call that creates it; when the key already exists it is null and only `data.name` is returned. Rotate it with `POST /api/v1/feeds/key/rotate`. Idempotent.","responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"name":{"description":"Name of the project's Feeds key: always `feeds`.","type":"string"},"api_key":{"anyOf":[{"description":"The plaintext key, returned once, by the call that created it. Null when the project already had a key. Not retrievable again from this API; reveal it from the Edge Data page or rotate it with `POST /api/v1/feeds/key/rotate`.","type":"string"},{"type":"null"}]}},"required":["name","api_key"]}},"required":["data"]}}}}}}},"/feeds/key/rotate":{"post":{"operationId":"rotateFeedsKey","summary":"Rotate the project's Feeds key","tags":["Feed Catalog"],"description":"Revoke the project's Feeds key and issue a new one under the same name. The old key stops working immediately on the edge plane; the new key is returned once as `data.api_key` and is not retrievable again from this API. 404 when the project has no Feeds key yet: `POST /api/v1/feeds/api-key` creates it.","responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"api_key":{"description":"The new Feeds key. Returned once; not retrievable again from this API. The previous key stopped working when this response was produced.","type":"string"},"api_key_name":{"description":"Name of the Edge Data endpoint that carries the key.","type":"string"},"rotated_at":{"format":"date-time","type":"string"}},"required":["api_key","api_key_name","rotated_at"]}},"required":["data"]}}}}}}},"/feeds/{theme}/{dataset}/logs":{"get":{"operationId":"listFeedLogs","summary":"List a feed's requests","tags":["Feed Logs"],"description":"The requests this project sent the feed, from any of its Data API keys, newest first: when each was served, its path, whether it succeeded, and how long it took. Defaults to the last 24 hours; requests are kept for 30 days. Every failed request is recorded; successful ones may be sampled at high volume.","parameters":[{"schema":{"anyOf":[{"type":"string","enum":["success"]},{"type":"string","enum":["error"]}]},"in":"query","name":"outcome","required":false,"description":"Only requests that succeeded (`success`) or failed (`error`). Defaults to both."},{"schema":{"format":"date-time","type":"string"},"in":"query","name":"from","required":false,"description":"Inclusive lower bound on the request time (ISO 8601). Defaults to 24 hours before `to`. Requests are kept for 30 days."},{"schema":{"format":"date-time","type":"string"},"in":"query","name":"to","required":false,"description":"Inclusive upper bound on the request time (ISO 8601). Defaults to now."},{"schema":{"minimum":1,"maximum":200,"type":"integer"},"in":"query","name":"page_size","required":false,"description":"Maximum rows to return. Defaults to 50."},{"schema":{"type":"string"},"in":"query","name":"page_token","required":false,"description":"The `pagination.next_page_token` from a previous response. Omit for the first page. Only valid with the same `outcome`, `from` and `to` it was returned with."},{"schema":{"type":"string"},"in":"path","name":"theme","required":true,"description":"Feed theme, e.g. `wallets`."},{"schema":{"type":"string"},"in":"path","name":"dataset","required":true,"description":"Dataset within the theme, e.g. `transfers`."}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"type":"object","properties":{"timestamp":{"format":"date-time","description":"When the request was served.","type":"string"},"path":{"description":"The request path. Never the query string, which carries the API key.","type":"string"},"outcome":{"description":"`success` (a 2xx) or `error`. Open set: more outcomes may be added.","type":"string"},"api_key_name":{"description":"Name of the Data API key the request authenticated with.","type":"string"},"chain":{"anyOf":[{"description":"The chain, when the request named one.","type":"string"},{"type":"null"}]},"duration_ms":{"description":"Time to serve, in milliseconds.","type":"integer"},"response_bytes":{"description":"Bytes returned to the caller.","type":"integer"},"billable":{"description":"Whether the request counted toward usage.","type":"boolean"},"region":{"anyOf":[{"description":"The region that served the request.","type":"string"},{"type":"null"}]}},"required":["timestamp","path","outcome","api_key_name","chain","duration_ms","response_bytes","billable","region"]}},"pagination":{"type":"object","properties":{"next_page_token":{"anyOf":[{"type":"string"},{"type":"null"}]},"page_size":{"type":"integer"}},"required":["next_page_token","page_size"]}},"required":["data","pagination"]}}}}}}},"/feeds/{theme}/{dataset}/usage":{"get":{"operationId":"getFeedUsage","summary":"Count a feed's requests over time","tags":["Feed Logs"],"description":"The requests this project sent the feed, from any of its Data API keys, counted per time bucket: how many succeeded, failed, and counted toward usage. Every bucket in the window is returned, empty ones as zeros. Defaults to the last 24 hours in hourly buckets; requests are kept for 30 days.","parameters":[{"schema":{"format":"date-time","type":"string"},"in":"query","name":"from","required":false,"description":"Inclusive lower bound on the request time (ISO 8601). Defaults to 24 hours before `to`. Requests are kept for 30 days."},{"schema":{"format":"date-time","type":"string"},"in":"query","name":"to","required":false,"description":"Inclusive upper bound on the request time (ISO 8601). Defaults to now."},{"schema":{"anyOf":[{"type":"string","enum":["1h"]},{"type":"string","enum":["6h"]},{"type":"string","enum":["1d"]}]},"in":"query","name":"bucket","required":false,"description":"Width of each bucket. Defaults to `1h` for a window of a day or less, `6h` up to a week, `1d` beyond."},{"schema":{"type":"string"},"in":"query","name":"timeZone","required":false,"description":"IANA time zone the buckets start on, like `America/New_York`: a `1d` bucket runs from that zone's midnight. Defaults to `UTC`."},{"schema":{"type":"string"},"in":"path","name":"theme","required":true,"description":"Feed theme, e.g. `wallets`."},{"schema":{"type":"string"},"in":"path","name":"dataset","required":true,"description":"Dataset within the theme, e.g. `transfers`."}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"from":{"format":"date-time","type":"string"},"to":{"format":"date-time","type":"string"},"bucket":{"anyOf":[{"type":"string","enum":["1h"]},{"type":"string","enum":["6h"]},{"type":"string","enum":["1d"]}]},"data":{"description":"Every bucket in the window, oldest first, including empty ones.","type":"array","items":{"type":"object","properties":{"time":{"format":"date-time","description":"Start of the bucket, on the `timeZone` clock.","type":"string"},"succeeded":{"description":"Requests that succeeded.","type":"integer"},"failed":{"description":"Requests that failed.","type":"integer"},"billable":{"description":"Requests that counted toward usage.","type":"integer"}},"required":["time","succeeded","failed","billable"]}},"totals":{"type":"object","properties":{"requests":{"description":"All requests in the window.","type":"integer"},"succeeded":{"description":"Requests that succeeded.","type":"integer"},"failed":{"description":"Requests that failed.","type":"integer"},"billable":{"description":"Requests that counted toward usage.","type":"integer"}},"required":["requests","succeeded","failed","billable"]}},"required":["from","to","bucket","data","totals"]}}}}}}}},"servers":[{"url":"/api/v1","description":"Current environment"}],"security":[{"BearerAuth":[]}],"tags":[{"name":"Pipelines","x-displayName":"Create & manage","description":"Create, read, and delete pipelines. A pipeline is identified by its name within the project."},{"name":"Pipeline Authoring","x-displayName":"Validate & preview","description":"Check a pipeline definition and see what it would produce, before creating anything. Neither endpoint touches an existing pipeline."},{"name":"Pipeline Lifecycle","x-displayName":"Lifecycle","description":"Pause, resume, and restart a running pipeline."},{"name":"Pipeline Status","x-displayName":"Status","description":"Query pipeline runtime status and per-source progress state."},{"name":"Pipeline Logs","x-displayName":"Logs","description":"Retrieve pipeline execution logs and error counts."},{"name":"Subgraphs","x-displayName":"Browse","description":"Read subgraphs and their versions. A subgraph is identified by `name`/`version`."},{"name":"Subgraph Deployments","x-displayName":"Deployments","description":"Deploy a compiled subgraph bundle as a new version, or remove a deployed one."},{"name":"Subgraph Tags","x-displayName":"Tags","description":"Point a stable alias — `production`, say — at a specific version, so consumers keep one URL across deploys."},{"name":"Subgraph Lifecycle","x-displayName":"Lifecycle","description":"Pause and resume indexing, and update the settings of a deployed version."},{"name":"Subgraph Logs","x-displayName":"Logs","description":"Retrieve subgraph indexing logs."},{"name":"Subgraph Webhooks","x-displayName":"Webhooks","description":"Stream row-level changes to a subgraph entity out to a URL. Webhooks are project-scoped and each one targets a single entity of a single subgraph version."},{"name":"Edge Endpoints","x-displayName":"Create & manage","description":"Create and manage Edge endpoints — RPC and Data — including rate limits and allowed domains."},{"name":"Edge Lifecycle","x-displayName":"Lifecycle","description":"Pause and resume an endpoint. A paused endpoint rejects traffic but keeps its configuration and key."},{"name":"Edge API Keys","x-displayName":"API keys","description":"Reveal the API key an Edge endpoint serves traffic under."},{"name":"Edge Metrics","x-displayName":"Metrics","description":"Request volume and error rates for an Edge endpoint."},{"name":"Boost","x-displayName":"Endpoint","description":"Read and update the project's Boost: a cache-first proxy for EVM JSON-RPC reads, backed by your own provider upstreams. One Boost per project. Free for verified organizations: a team with a member on a business email domain (not a free mailbox provider) qualifies automatically."},{"name":"Boost Lifecycle","x-displayName":"Lifecycle","description":"Enable and disable the project's Boost. A disabled Boost refuses traffic but keeps its chains, upstreams, and key."},{"name":"Boost API Keys","x-displayName":"API key","description":"Reveal the API key the Boost serves traffic under."},{"name":"Boost Chains","x-displayName":"Chains","description":"List the chains Boost can cache, and switch a chain on or off or override its timeouts on this Boost."},{"name":"Boost Providers","x-displayName":"Provider accounts","description":"Connect a provider account (Alchemy or QuickNode) and let Boost create and register its endpoints for you, instead of pasting URLs one chain at a time."},{"name":"Boost Upstreams","x-displayName":"Upstreams","description":"The provider URLs Boost forwards to, one active per chain with fallbacks. Validate a URL, add or remove an upstream, replace its URL, fail over to another, or tune its settings. Upstreams are addressed by `{chain, id}` in the request body."},{"name":"Boost Metrics","x-displayName":"Metrics","description":"Cache hit rate, latency, provider calls, credit savings, and the per-request history for a Boost."},{"name":"Feed Catalog","x-displayName":"Catalog & API key","description":"List the feeds Goldsky offers and when the project first used each, and get or create the project's Feeds key (an Edge Data endpoint named `feeds`) every feed authenticates with; rotate it with `POST /api/v1/feeds/key/rotate`."},{"name":"Feed Logs","x-displayName":"Request logs","description":"Every request the project sent a feed: when, which path, whether it succeeded, and how long it took. Kept for 30 days."},{"name":"Catalogs","x-displayName":"Catalogs","description":"What Goldsky supports: chains you can index a subgraph on, and the networks and datasets an Edge endpoint can be pointed at. Unauthenticated-safe reads that never change per project."}],"x-tagGroups":[{"name":"Pipelines","tags":["Pipelines","Pipeline Authoring","Pipeline Lifecycle","Pipeline Status","Pipeline Logs"]},{"name":"Subgraphs","tags":["Subgraphs","Subgraph Deployments","Subgraph Tags","Subgraph Lifecycle","Subgraph Logs","Subgraph Webhooks"]},{"name":"Edge","tags":["Edge Endpoints","Edge Lifecycle","Edge API Keys","Edge Metrics"]},{"name":"Boost","tags":["Boost","Boost Lifecycle","Boost API Keys","Boost Chains","Boost Providers","Boost Upstreams","Boost Metrics"]},{"name":"Feeds","tags":["Feed Catalog","Feed Logs"]},{"name":"Reference","tags":["Catalogs"]}]}