# Añade un puerto público a un Workload
Continúa desde [Despliega un Workload desde una imagen pública](/es/guides/containers-deploy). Usa el ayudante `api` de esa guía, además de `PROJECT_ID` y `SERVICE_ID`. Lee [Puertos públicos y endpoints HTTPS](/es/units/endpoints) para elegir entre los dos tipos.

```bash
export EP="$ZAROZ_API/projects/$PROJECT_ID/service-instances/$SERVICE_ID/endpoints"
```

:::note{title="Estado de la API"}
Las rutas de endpoints las usa la consola y están marcadas como solo consola en la referencia de la API. Aceptan tu token de sesión o un token de acceso personal.
:::

## Un puerto TCP o UDP raw

Indica en qué puerto escucha tu app **dentro** del contenedor (`internal_port`) y con qué protocolo. Zaroz asigna la dirección y el número públicos.

```bash
curl -s -X POST "$EP" \
  -H "Authorization: Bearer $ZAROZ_TOKEN" -H "Content-Type: application/json" \
  -d '{"kind":"port","internal_port":25565,"protocol":"tcp"}'
```

```ts
const base = `/projects/${projectId}/service-instances/${serviceId}/endpoints`;
const port = await api("POST", base, { kind: "port", internal_port: 25565, protocol: "tcp" });
console.log(`${port.public_ip}:${port.public_port}`, port.state);
```

```python
base = f"/projects/{project_id}/service-instances/{service_id}/endpoints"
port = api("POST", base, {"kind": "port", "internal_port": 25565, "protocol": "tcp"})
print(f"{port['public_ip']}:{port['public_port']}", port["state"])
```

La respuesta trae `id`, `public_ip`, `public_port` y `state` (`active` cuando está abierto). Usa `"protocol": "tcp_udp"` para un solo número público con ambos protocolos. Los puertos raw se facturan por las horas que se mantienen; el plan de un Workload no incluye ninguno gratis (mira [Facturación](/es/units/billing)).

Si el servicio aún no está en marcha, la petición se rechaza con `not_ready`. Espera al despliegue y reintenta.

## Un endpoint HTTPS gratuito para una web o una API

Tu app sirve HTTP plano en `internal_port`; Zaroz gestiona el TLS.

```bash
curl -s -X POST "$EP" \
  -H "Authorization: Bearer $ZAROZ_TOKEN" -H "Content-Type: application/json" \
  -d '{"kind":"https","internal_port":80,"label":"my-web"}'
```

```ts
const site = await api("POST", base, { kind: "https", internal_port: 80, label: "my-web" });
console.log(site.https);   // el host y los dominios, si los hay
```

```python
site = api("POST", base, {"kind": "https", "internal_port": 80, "label": "my-web"})
print(site["https"])
```

`label` es opcional y elige la primera parte del host gratuito, `<label>.zone.<zone>.zaroz.cloud`. Para servir también tus propios dominios, envía `"domains": ["www.example.com"]`; cada uno debe ser un dominio que tu organización haya verificado, o un subdominio de uno. Si se rechaza uno, no se abre nada.

## Listar y cerrar

```bash
curl -s "$EP" -H "Authorization: Bearer $ZAROZ_TOKEN" | jq '.data[] | {id, kind, state, public_ip, public_port}'
curl -s -X DELETE "$EP/$ENDPOINT_ID" -H "Authorization: Bearer $ZAROZ_TOKEN" -w "%{http_code}\n"
```

```ts
const list = await api("GET", base);
for (const e of list.data) console.log(e.id, e.kind, e.state, e.public_ip, e.public_port);
await api("DELETE", `${base}/${port.id}`);   // 204; cerrar un puerto ya cerrado también funciona
```

```python
for e in api("GET", base)["data"]:
    print(e["id"], e["kind"], e["state"], e.get("public_ip"), e.get("public_port"))
api("DELETE", f"{base}/{port['id']}")   # 204; cerrar un puerto ya cerrado también funciona
```

La lista muestra primero los puertos pendientes y después todos los que el servicio ha tenido, los más nuevos antes. Un puerto cerrado sigue apareciendo con su última dirección, para poder contrastar la factura de un mes. Cerrarlo detiene la facturación desde ese momento.

## Cuando se rechaza

Los `details` de un rechazo empiezan con un código antes de los dos puntos: `port_limit`, `port_in_use`, `no_address_available`, `no_port_available`, `internal_port_out_of_range`, `protocol_required`, y en HTTPS `host_taken`, `domain_not_verified` y otros. La lista completa está en [Puertos públicos y endpoints HTTPS](/es/units/endpoints).

Un puerto va a una unidad. Si ejecutas varias unidades y necesitas una dirección pública para cada una, mira [Puertos públicos](/es/units/endpoints) y [Nombres privados](/es/units/private-names).
