---
title: "Save something running on the computer as an app"
method: POST
path: "/api/computers/{id}/apps"
tags: ["apps"]
---

# Save something running on the computer as an app

`POST /api/computers/{id}/apps`

## Request

- Base URL: `https://www.orgo.ai`
- URL: `https://www.orgo.ai/api/computers/{id}/apps`
- Auth: HTTP bearer

Body: { "port": number, "title": string, "description"?: string, "name"?: string, "agent"?: string, "thread_id"?: uuid, "command"?: string, "cwd"?: string }. Uses the public URL already on the port, else makes one with every rule of POST /api/computers/{id}/public-urls (name and its tail, caps, paid plan). `command` (with `cwd`) is what starts the app: the computer keeps it running through reboots and wakes, unless something already runs on that port (`kept_running: true` when it was added). A new app opens only for people in the workspace (access team) until someone shares it from Apps in Orgo; saving the same port again updates its title and description and never changes who can open it. A computer’s own key (ORGO_API_KEY) may call it: this is how an agent saves what it built.

## Path parameters

- `id` string, required

## Request body

- object
  - `port` integer, required
  - `title` string, required
  - `description` string
  - `name` string: The link’s name, as for a public URL: 4 characters are added. Generated when left out.
  - `label` string: Read as name, as for a public URL (exact only for Orgo staff, or a name released by this workspace in the last 30 days).
  - `agent` string: Which agent built it: hermes, openclaw, claude-code.
  - `thread_id` string, uuid
  - `command` string: What starts the app; kept running by the computer.
  - `cwd` string: Where the command runs (an absolute path).

## Response `201`

The app, as GET lists it (and `kept_running: true` when the command was added).

## Other responses

- `400`: Bad input (INVALID_PORT, invalid_title, invalid_agent, INVALID_SERVICE), or the computer cannot keep a command running (SERVICES_UNSUPPORTED).
- `401`: Unauthenticated.
- `403`: The public URL rules refused (UPGRADE_REQUIRED, HOSTING_BLOCKED), or the link on this port was turned off by Orgo.
- `404`: Computer not found, or apps are off for the account (apps_disabled).
- `409`: A public URL limit or a name rule (PUBLIC_URL_LIMIT, PUBLIC_URL_ACCOUNT_LIMIT, LABEL_TAKEN, NAME_HELD).
- `429`: Over one of the account's rate limits (rate_limited): `limit` names it, `retry_after` and Retry-After say how many seconds to wait. Limits are per account (the workspace owner when the request acts on a computer or a workspace) and set by its plan (x-rate-limits).
- `503`: Apps are not ready yet (apps_unavailable).

## Changes

- **2026-11-04** `e4c1e7379fa5`: 1 info
  - added the new optional request property `name`
- **2026-11-04** `b9e430665e74`: 1 info
  - endpoint added

[Operation history](https://skmtc.dev/orgo/apis/orgo-api/changes/api/computers/:id/apps/post.md)

---

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