---
title: "Add Custom Plugin"
method: POST
path: "/tunnel/plugins/custom"
---

# Add Custom Plugin

`POST /tunnel/plugins/custom`

## Request

- Base URL: `https://usemeridian.us` (the document declares no server; this is the origin it was published from)
- URL: `https://usemeridian.us/tunnel/plugins/custom`
- Auth: none declared

9811d04c — persist a chosen custom plugin into the tenant's tunnel config.

Body: ``{"name": str, "command": str|list, "port"?: int, "env"?: {..}}``.
``?hostname=X`` scopes it to that machine (else the per-tenant default). The
name is validated (safe charset, no built-in slot/plugin collision) and the
command must be non-empty; a missing/blank port is auto-assigned. Merges into
the existing config (reusing the ``tunnel_plugins`` JSON blob — no new table)
so ``resolve_custom_plugins`` picks it up on the next tunnel (re)start.
Returns the updated ``custom`` list.

## Response `200`

Successful Response

- unknown

---

[API](https://skmtc.dev/usemeridian/apis/meridian.md) · [All operations](https://skmtc.dev/usemeridian/apis/meridian/llms.txt) · [OpenAPI document](https://skmtc.dev/usemeridian/apis/meridian/revisions/f37a894bd374?raw)
