---
title: "Create or update an HTTP node"
method: PUT
path: "/provider/nodes"
tags: ["Provider"]
---

# Create or update an HTTP node

`PUT /provider/nodes`

Creates or updates an HTTP RPC node for one of the authenticated provider's plans. The URL must be a public http(s) endpoint (loopback, private, and link-local hosts are rejected). The node is screened before persistence; the request fails with 400 when a mandatory screening test does not pass. Returns the upserted node set to a healthy status.

## Request body

- ProviderNodeInput
  - `plan_id` integer, required — Plan ID the node belongs to (must be owned by the provider).
  - `url` string, required — Public http(s) endpoint URL of the node.
  - `vm` string, required — Virtual machine type, e.g. evm.
  - `rate_limit` number, required — Requests per interval (0 = unlimited).
  - `rate_limit_interval_sec` integer, required — Rate limit window in seconds.
  - `source` 'provider' | 'website' | 'erpc' | 'node_request' | 'new_chain_request' — Node source (default provider).

## Response `200`

Node upserted

- ProviderUpsertNodeResponse
  - `message` string
  - `node` object
  - `status` string — healthy on success.

## Other responses

- `400` — Invalid request body, non-public URL, or failed mandatory screening
- `401` — Unauthorized
- `403` — Provider not resolved
- `404` — Plan or node not found (or not owned by the caller's provider)
- `409` — Node URL already exists in a different plan
- `500` — Internal server error

## Changes

- **2026-09-01** `9afeec0a1706` — 1 info
  - endpoint added

[Change history](https://skmtc.dev/routemesh/apis/routemesh-api/changes/provider/nodes/put.md)

---

[API](https://skmtc.dev/routemesh/apis/routemesh-api.md) · [All operations](https://skmtc.dev/routemesh/apis/routemesh-api/llms.txt) · [OpenAPI document](https://skmtc.dev/routemesh/apis/routemesh-api/revisions/c3b583616868?raw)
