---
title: "A workspace’s domains: its free names and the domains it bought through Orgo"
method: GET
path: "/api/projects/{id}/domains"
tags: ["domains"]
---

# A workspace’s domains: its free names and the domains it bought through Orgo

`GET /api/projects/{id}/domains`

## Request

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

Answers { enabled: false, ... } where domains are not enabled for the account. free_names are the workspace’s public URLs (names under Orgo’s domain), with the workspace owner’s cap across all their computers (limit, negative for none; used). domains are the domains the workspace bought, each with pointed: the names on it that serve a computer, and its renewal. can_buy is whether this caller may buy here (write access, with a session or an account-wide key). renewals_enabled is whether renewals run here at all (Renew now, POST .../domains/{domainId}/renew, included). last_contact is the registrant this caller bought with last, to fill in the next purchase (null for a workspace-scoped key). A purchase the registry has not confirmed yet (pending) is checked again here, up to 3 a request. Any member may read it, with a session, an account-wide key or a key for this workspace.

## Path parameters

- `id` string, uuid, required

## Response `200`

The domains.

- WorkspaceDomains
  - `enabled` boolean, required: False where domains are not enabled for the account; everything else is then empty.
  - `free_names` object, nullable, required
    - `enabled` boolean
    - `base_domain` string
    - `limit` integer: The workspace owner’s cap across all their computers; negative means no cap.
    - `used` integer
    - `names` object[]
      - `id` string, uuid, required
      - `url` string, uri, required
      - `hostname` string, required
      - `label` string, required
      - `port` integer, required
      - `created_at` string, date-time, required
      - `disabled` boolean: Present, true, only on a URL Orgo support turned off: it is not served and can’t be changed or removed.
      - `protected` boolean, required: True when visitors give a password first (PATCH password). The password itself is only in GET .../password.
      - `domain` string
      - `computer_id` string, uuid
      - `computer_name` string, nullable
      - `computer_status` string, nullable
  - `registrar` boolean, required: Domains can be searched and bought here.
  - `can_buy` boolean, required: This caller may buy for this workspace (write access, a session or an account-wide key).
  - `renewals_enabled` boolean, required: Renewals run in this environment, Renew now (POST /api/projects/{id}/domains/{domainId}/renew) included. Where they don’t, a domain expires at expires_at whatever auto_renew says.
  - `domains` RegisteredDomain[], required
    - `id` string, uuid, required
    - `domain` string, required
    - `status` 'pending' | 'active', required: pending: the registry has not confirmed it yet; its price is held from the credits until it does.
    - `expires_at` string, date-time, nullable, required: When the term ends, as the registry has it. With auto_renew on it renews before then.
    - `created_at` string, date-time, required
    - `auto_renew` boolean, required: Orgo renews it in its last 14 days from the payer’s Orgo credits. On when bought, off when adopted.
    - `renewal_cents` integer, nullable, required: What the next renewal costs, for renewal_years years. null while there is no price.
    - `renewal_years` integer, required: The years one renewal adds: 1 for most extensions, 2 for a few (like .ai).
    - `renewal_paid_by` 'you' | 'member' | 'null', nullable, required: Whose Orgo credits pay the renewal: yours, or another member’s (whoever turned auto-renew on last, else the buyer). null with auto-renew off.
    - `renewal_state` 'off' | 'scheduled' | 'renewing' | 'retrying' | 'expired', required: off: auto-renew is off and it expires at expires_at. scheduled: the price is taken 14 days before expires_at, and it renews then (only where renewals_enabled). renewing: the renewal is with the registry (it can take up to a day to confirm). retrying: the last try failed (renewal_error) and Orgo tries again every day until expiry. expired: expires_at has passed.
    - `renewal_error` 'insufficient_credits' | 'no_payer' | 'registry_refused' | 'null', nullable, required: Why the last try failed, while retrying: the payer’s credits fall short, the payer can no longer pay (turn auto-renew on, PATCH true, to pay yourself), or the registry refused it.
    - `pointed` object[], required: Names on the domain connected to a computer.
      - `domain` string
      - `computer_id` string, uuid
      - `computer_name` string, nullable
      - `status` string: The custom domain’s status (pending, verifying, active, ...).
  - `last_contact` Registrant, required: Who the domain is registered to: its legal owner. The registry emails this address to confirm within 15 days, or suspends the domain. WHOIS privacy keeps it out of public lookups.
    - `first_name` string, required
    - `last_name` string, required
    - `org_name` string: Left out: the person’s own name.
    - `email` string, email, required
    - `phone` string, required: +<country code>.<number>; "+1 415 555 0123" and a 10 digit US number are accepted too.
    - `address1` string, required
    - `address2` string
    - `city` string, required
    - `state` string, required: State, province or region.
    - `postal_code` string, required
    - `country` string, required: Two letter country code.

## Other responses

- `401`: Unauthenticated.
- `403`: No access to this workspace (no code), a key for another workspace (workspace_scope_mismatch), or a share-link guest.
- `404`: Workspace not found.
- `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`: Domains are unavailable right now (DOMAINS_UNAVAILABLE).

## Changes

- **2026-11-01** `60e768a2bb9d`: 3 info
  - added the optional property `docs_url` to the response with the `503` status
  - added the optional property `next` to the response with the `503` status
  - added the optional property `retryable` to the response with the `503` status
- **2026-10-30** `8a1b0f4a5fd8`: 1 info
  - added the required property `free_names/names/items/allOf[#/components/schemas/PublicUrl]/protected` to the response with the `200` status
- **2026-10-30** `afb6f0ee1aac`: 1 info
  - added the non-success response with the status `429`
- **2026-10-26** `3cc83acab9fd`: 7 info
  - added the required property `domains/items/auto_renew` to the response with the `200` status
  - added the required property `domains/items/renewal_cents` to the response with the `200` status
  - added the required property `domains/items/renewal_error` to the response with the `200` status
  - added the required property `domains/items/renewal_paid_by` to the response with the `200` status
  - …3 more
- **2026-10-22** `a506f6169bb5`: 1 info
  - endpoint added

[Operation history](https://skmtc.dev/orgo/apis/orgo-api/changes/api/projects/:id/domains/get.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)
