Public API

Endpoints

Endpoints here are your workspace JSON-RPC URLs (UUID in the path), the same resources as in the connect cabinet — not a catalog of Public API routes and not Address Watch. All routes require signed headers (see Authentication). Base: https://api.rpcnode.dev — paths start with /v1/endpoints/… (no /api). There is no DELETE; pause via status instead. Success responses use ok: true plus the fields below.

RPC endpointsUUIDJSON-RPCendpointsHTTP

← Public API

Authentication

Every request needs X-Api-Key, X-Timestamp, and X-Signature (HMAC-SHA256), same scheme as Account and Address Watch.

Sign the path starting with /v1/… (for example /v1/endpoints or /v1/endpoints/12/status). Query string is not part of the signature. For POST/PATCH, sign the raw JSON body bytes you send.

Errors

Failures use ok: false and a string error. Typical HTTP status: 401 (auth/signature), 403 (API key IP allowlist), 400 (validation / business error, e.g. plan limit), 500 (server).

Error example

{
  "ok": false,
  "error": "Invalid signature."
}

GET /v1/endpoints

List all JSON-RPC endpoints owned by the billing workspace.

Response fields

NameTypeDescription
endpointsobject[]Array of endpoint objects.
endpoints[].idnumberEndpoint id (use in path for status / IPs / usage).
endpoints[].uuidstringUUID segment in the JSON-RPC URL.
endpoints[].namestringDisplay name.
endpoints[].statusstringactive | paused.
endpoints[].network_idnumberNetwork id.
endpoints[].network_namestringNetwork display name.
endpoints[].network_slugstringNetwork slug (e.g. ethereum).
endpoints[].network_environment_idnumberNetwork environment id used at create.
endpoints[].env_slugstringEnvironment slug (e.g. mainnet).
endpoints[].urlstringPublic JSON-RPC URL: https://{host_prefix}-{network_slug}-{env_slug}.rpcnode.dev/{uuid}.
endpoints[].rps_limitnumberPlan RPS limit applied to this endpoint.
endpoints[].plan_idnumberBilling plan id.
endpoints[].created_atstringISO-8601 created timestamp.
endpoints[].versionstring | nullUpstream node version probe (if known).
endpoints[].block_heightnumber | nullLatest probed block height (if known).
endpoints[].allowed_ipsstring[]Client IP allowlist for the gateway. Empty = no restriction.
  • Sign path /v1/endpoints with an empty body.

Response example

{
  "ok": true,
  "endpoints": [
    {
      "id": 12,
      "uuid": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
      "name": "Prod Ethereum",
      "status": "active",
      "network_id": 1,
      "network_name": "Ethereum",
      "network_slug": "ethereum",
      "network_environment_id": 2,
      "env_slug": "mainnet",
      "url": "https://ethereum-mainnet.rpcnode.dev/a1b2c3d4-e5f6-7890-abcd-ef1234567890",
      "rps_limit": 50,
      "plan_id": 2,
      "created_at": "2026-08-01T12:00:00+00:00",
      "version": "v1.14.0",
      "block_height": 21000000,
      "allowed_ips": []
    }
  ]
}

GET /v1/endpoints/available-networks

Networks and environment slugs you can use when creating an endpoint (filtered by plan).

Response fields

NameTypeDescription
networks[].idnumberNetwork id (for create with network_id).
networks[].uuidstringNetwork uuid.
networks[].namestringDisplay name.
networks[].slugstringNetwork slug.
networks[].sortnumberCatalog sort order.
networks[].environment_kindsstring[]Environment slugs available for create (e.g. mainnet, sepolia).
network_limitnumber | nullPlan network count cap; null if unlimited.
allowed_network_slugsstring[]Plan allowlist of network slugs (empty if not restricted that way).
  • Sign path /v1/endpoints/available-networks with an empty body.

Response example

{
  "ok": true,
  "networks": [
    {
      "id": 1,
      "uuid": "…",
      "name": "Ethereum",
      "slug": "ethereum",
      "sort": 10,
      "environment_kinds": ["mainnet", "sepolia"]
    }
  ],
  "network_limit": null,
  "allowed_network_slugs": []
}

POST /v1/endpoints

Create a JSON-RPC endpoint. Provide network_environment_id, or network_id + env_slug, plus name. Counts against plan.endpoints_limit.

Request body

NameTypeDescription
namestringDisplay name (required, max 255).
network_environment_idintegerPreferred when known: network environment id (min 1). (optional)
network_idintegerFrom GET …/available-networks (use with env_slug). (optional)
env_slugstringFrom networks[].environment_kinds (e.g. mainnet, max 80). (optional)

Response fields

NameTypeDescription
endpoint.idnumberEndpoint id (use in path for status / IPs / usage).
endpoint.uuidstringUUID segment in the JSON-RPC URL.
endpoint.namestringDisplay name.
endpoint.statusstringactive | paused.
endpoint.network_idnumberNetwork id.
endpoint.network_namestringNetwork display name.
endpoint.network_slugstringNetwork slug (e.g. ethereum).
endpoint.network_environment_idnumberNetwork environment id used at create.
endpoint.env_slugstringEnvironment slug (e.g. mainnet).
endpoint.urlstringPublic JSON-RPC URL: https://{host_prefix}-{network_slug}-{env_slug}.rpcnode.dev/{uuid}.
endpoint.rps_limitnumberPlan RPS limit applied to this endpoint.
endpoint.plan_idnumberBilling plan id.
endpoint.created_atstringISO-8601 created timestamp.
endpoint.versionstring | nullUpstream node version probe (if known).
endpoint.block_heightnumber | nullLatest probed block height (if known).
endpoint.allowed_ipsstring[]Client IP allowlist for the gateway. Empty = no restriction.
  • Sign path /v1/endpoints with the raw JSON body.
  • Provide either network_environment_id, or both network_id and env_slug (typical path after available-networks).
  • Example body: {"name":"Prod Ethereum","network_id":1,"env_slug":"mainnet"}
  • Alternative: {"name":"Prod Ethereum","network_environment_id":2}

Response example

{
  "ok": true,
  "endpoint": {
  "id": 12,
  "uuid": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
  "name": "Prod Ethereum",
  "status": "active",
  "network_id": 1,
  "network_name": "Ethereum",
  "network_slug": "ethereum",
  "network_environment_id": 2,
  "env_slug": "mainnet",
  "url": "https://ethereum-mainnet.rpcnode.dev/a1b2c3d4-e5f6-7890-abcd-ef1234567890",
  "rps_limit": 50,
  "plan_id": 2,
  "created_at": "2026-08-01T12:00:00+00:00",
  "version": "v1.14.0",
  "block_height": 21000000,
  "allowed_ips": []
}
}

GET /v1/endpoints/usage

Aggregate credit/request usage across all endpoints for the last N calendar days (plus top RPC methods).

Query parameters

NameTypeDescription
daysintegerWindow length: 7, 30, or 90. Default 30. (optional)

Response fields

NameTypeDescription
usage.daysnumberSelected window length.
usage.total_requestsnumberRequests in the window.
usage.total_creditsnumberCredits in the window.
usage.series[].datestringYYYY-MM-DD.
usage.series[].requestsnumberRequests that day.
usage.series[].creditsnumberCredits that day.
usage.methods[].methodstringRPC method name.
usage.methods[].requestsnumberRequests for that method.
usage.methods[].creditsnumberCredits for that method.
  • Query string is not part of the signature — sign path /v1/endpoints/usage with an empty body.
  • series is oldest → newest, one point per day (zeros when no usage).
  • methods are per-RPC-method totals for the same window (highest requests first).

Response example

{
  "ok": true,
  "usage": {
    "days": 30,
    "total_requests": 5400,
    "total_credits": 12000,
    "series": [
      { "date": "2026-07-08", "requests": 10, "credits": 20 },
      { "date": "2026-08-06", "requests": 100, "credits": 250 }
    ],
    "methods": [
      { "method": "eth_call", "requests": 2000, "credits": 4000 }
    ]
  }
}

GET /v1/endpoints/{id}/usage

Credit/request usage for one endpoint (same shape as workspace usage).

Query parameters

NameTypeDescription
daysintegerWindow length: 7, 30, or 90. Default 30. (optional)

Response fields

NameTypeDescription
usage.daysnumberSelected window length.
usage.total_requestsnumberRequests in the window.
usage.total_creditsnumberCredits in the window.
usage.series[].datestringYYYY-MM-DD.
usage.series[].requestsnumberRequests that day.
usage.series[].creditsnumberCredits that day.
usage.methods[].methodstringRPC method name.
usage.methods[].requestsnumberRequests for that method.
usage.methods[].creditsnumberCredits for that method.
  • Sign path /v1/endpoints/{id}/usage — query string is not part of the signature.
  • {id} is the numeric endpoint.id from list/create (not the UUID).

Response example

{
  "ok": true,
  "usage": {
    "days": 7,
    "total_requests": 100,
    "total_credits": 250,
    "series": [
      { "date": "2026-07-31", "requests": 0, "credits": 0 },
      { "date": "2026-08-06", "requests": 100, "credits": 250 }
    ],
    "methods": [
      { "method": "eth_getBalance", "requests": 50, "credits": 50 }
    ]
  }
}

PATCH /v1/endpoints/{id}/status

Set endpoint status to active or paused (pauses JSON-RPC traffic at the gateway).

Request body

NameTypeDescription
statusstringactive | paused.

Response fields

NameTypeDescription
endpoint.idnumberEndpoint id (use in path for status / IPs / usage).
endpoint.uuidstringUUID segment in the JSON-RPC URL.
endpoint.namestringDisplay name.
endpoint.statusstringactive | paused.
endpoint.network_idnumberNetwork id.
endpoint.network_namestringNetwork display name.
endpoint.network_slugstringNetwork slug (e.g. ethereum).
endpoint.network_environment_idnumberNetwork environment id used at create.
endpoint.env_slugstringEnvironment slug (e.g. mainnet).
endpoint.urlstringPublic JSON-RPC URL: https://{host_prefix}-{network_slug}-{env_slug}.rpcnode.dev/{uuid}.
endpoint.rps_limitnumberPlan RPS limit applied to this endpoint.
endpoint.plan_idnumberBilling plan id.
endpoint.created_atstringISO-8601 created timestamp.
endpoint.versionstring | nullUpstream node version probe (if known).
endpoint.block_heightnumber | nullLatest probed block height (if known).
endpoint.allowed_ipsstring[]Client IP allowlist for the gateway. Empty = no restriction.
  • Sign path /v1/endpoints/{id}/status with the raw JSON body.
  • Example body: {"status":"paused"}
  • There is no DELETE — use paused to stop traffic (parity with connect).

Response example

{
  "ok": true,
  "endpoint": {
  "id": 12,
  "uuid": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
  "name": "Prod Ethereum",
  "status": "paused",
  "network_id": 1,
  "network_name": "Ethereum",
  "network_slug": "ethereum",
  "network_environment_id": 2,
  "env_slug": "mainnet",
  "url": "https://ethereum-mainnet.rpcnode.dev/a1b2c3d4-e5f6-7890-abcd-ef1234567890",
  "rps_limit": 50,
  "plan_id": 2,
  "created_at": "2026-08-01T12:00:00+00:00",
  "version": "v1.14.0",
  "block_height": 21000000,
  "allowed_ips": []
}
}

PATCH /v1/endpoints/{id}/allowed-ips

Replace the client IP allowlist for the gateway. Empty array clears the restriction (allow all).

Request body

NameTypeDescription
allowed_ipsstring[]Full list of IPv4/IPv6 addresses (max 50; each max 45 chars). Key must be present; may be [].

Response fields

NameTypeDescription
endpoint.idnumberEndpoint id (use in path for status / IPs / usage).
endpoint.uuidstringUUID segment in the JSON-RPC URL.
endpoint.namestringDisplay name.
endpoint.statusstringactive | paused.
endpoint.network_idnumberNetwork id.
endpoint.network_namestringNetwork display name.
endpoint.network_slugstringNetwork slug (e.g. ethereum).
endpoint.network_environment_idnumberNetwork environment id used at create.
endpoint.env_slugstringEnvironment slug (e.g. mainnet).
endpoint.urlstringPublic JSON-RPC URL: https://{host_prefix}-{network_slug}-{env_slug}.rpcnode.dev/{uuid}.
endpoint.rps_limitnumberPlan RPS limit applied to this endpoint.
endpoint.plan_idnumberBilling plan id.
endpoint.created_atstringISO-8601 created timestamp.
endpoint.versionstring | nullUpstream node version probe (if known).
endpoint.block_heightnumber | nullLatest probed block height (if known).
endpoint.allowed_ipsstring[]Client IP allowlist for the gateway. Empty = no restriction.
  • Sign path /v1/endpoints/{id}/allowed-ips with the raw JSON body.
  • Example body: {"allowed_ips":["203.0.113.10","2001:db8::1"]}
  • Clear restriction: {"allowed_ips":[]}

Response example

{
  "ok": true,
  "endpoint": {
  "id": 12,
  "uuid": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
  "name": "Prod Ethereum",
  "status": "active",
  "network_id": 1,
  "network_name": "Ethereum",
  "network_slug": "ethereum",
  "network_environment_id": 2,
  "env_slug": "mainnet",
  "url": "https://ethereum-mainnet.rpcnode.dev/a1b2c3d4-e5f6-7890-abcd-ef1234567890",
  "rps_limit": 50,
  "plan_id": 2,
  "created_at": "2026-08-01T12:00:00+00:00",
  "version": "v1.14.0",
  "block_height": 21000000,
  "allowed_ips": ["203.0.113.10"]
}
}

Tips

  • Sign every request with X-Api-Key, X-Timestamp, and X-Signature (see Authentication).
  • JSON-RPC calls go to endpoint.url — do not send Public API HMAC headers on those URLs.
  • There is no DELETE — use PATCH …/status with paused to stop traffic.
  • Plan caps: endpoints_limit (count) and rps_limit (per endpoint); see Account.
  • Address Watch and Account routes are documented on their own pages.

Related