---
title: "Create a tunnel for a managed domain and run it on workers."
method: POST
path: "/ingress/connectors"
tags: ["Ingress"]
---

# Create a tunnel for a managed domain and run it on workers.

`POST /ingress/connectors`

## Request

- Base URL: `/api` (relative, and the document was published on a file host, not at the API’s origin)
- URL: `/api/ingress/connectors`
- Auth: HTTP bearer

Cloudflare Tunnel takes `values.dns_provider_id` (a Cloudflare DNS
provider) and `values.domain` (a zone managed by it, or a subdomain of
one). Every worker in `node_ids` must allow ingress
(`temps agent ingress delegated`). Apps under the domain are then
published automatically: adding `app.<domain>` to an environment is
enough.

## Request body

- CreateConnectorRequest
  - `name` string, required: Lowercase letters, digits and hyphens; names the tunnel `temps-<name>`.
  - `node_ids` integer[], required: Nodes that run a connector replica.
  - `provider` string, required: The provider's `kind`, from `GET /ingress/providers`.
  - `values` object: Answers to the provider's setup fields, by field key. DNS provider fields take the provider's id; every other field takes a string.

## Response `201`

- ConnectorView
  - `auto_publish` boolean, required
  - `created_at` string, date-time, required
  - `dns_provider_id` integer, nullable
  - `dns_target` string, nullable: Where published hostnames point.
  - `domain` string, required
  - `edge_port` integer, required
  - `external_id` string, nullable
  - `id` integer, required
  - `last_error` string, nullable
  - `name` string, required
  - `nodes` ConnectorNodeView[], required
    - `driver` string, nullable
    - `last_error` string, nullable
    - `node_id` integer, required
    - `node_name` string, required
    - `ready_connections` integer, nullable
    - `reported_at` string, date-time, nullable
    - `state` string, required
  - `provider` string, required
  - `publications` PublicationView[], required
    - `hostname` string, required
    - `last_error` string, nullable
    - `published_at` string, date-time, nullable
    - `state` string, required: `published`, `error`, or `stale` (its record points at a tunnel that was replaced; it is being published again).
  - `status` string, required

## Other responses

- `400`: Invalid name, setup answers or nodes
- `409`: A worker has not delegated public ingress
- `502`: The provider refused; the detail says what to fix

## Changes

> 98 revisions in range; 1 not diffed.

- **2026-10-22** `d8a717162ef5`: 1 info
  - endpoint added
- **2026-10-22** `06005615b19e`: 1 breaking
  - api path removed without deprecation
- **2026-10-22** `7d41b820a372`: 1 info
  - endpoint added
- **2026-10-22** `add7f7b41ae2`: 1 breaking
  - api path removed without deprecation
- **2026-10-21** `842d42ed4659`: 1 info
  - endpoint added

[Operation history](https://skmtc.dev/gotempsh/apis/temps/changes/ingress/connectors/post.md)

---

[API](https://skmtc.dev/gotempsh/apis/temps.md) - [All operations](https://skmtc.dev/gotempsh/apis/temps/llms.txt) - [OpenAPI document](https://skmtc.dev/gotempsh/apis/temps/revisions/fdfa2df06ae7?raw)
