---
title: "Find a domain to buy, with prices"
method: GET
path: "/api/domains/search"
tags: ["domains"]
---

# Find a domain to buy, with prices

`GET /api/domains/search`

## Request

- Base URL: `https://www.orgo.ai`
- URL: `https://www.orgo.ai/api/domains/search`
- Auth: HTTP bearer

q is a name ("orgo") or a full domain ("orgo.agency"; a pasted URL works too). Page 0 is the extension typed, then the popular ones; each later page is the next 60 extensions (next_page is null on the last, total is how many there are). status: available, taken, premium (the registry’s own high price; not sold here) or unknown (the registry did not answer; search again). Only available names carry a price: price_cents is what buying takes from your Orgo credits for min_years, renewal_cents_per_year what a year costs after that. Pass price_cents as expected_price_cents when you buy.

free (page 0 only; null where free names are off) is the name under Orgo’s own domain as it would be made (<label>-xxxx.orgo.dev, the xxxx picked when it is), claimed as a public URL on a computer: POST /api/computers/{id}/public-urls { port, name }, whose answer is the address it got. registrar_error: true when the registry did not answer (results empty, free still shown).

A session or an account-wide key: a workspace-scoped key gets 403. 30 searches a minute per account and 60 per address. 404 DOMAINS_NOT_ENABLED where domains are not enabled for the account.

## Query parameters

- `q` string, required
- `page` integer

## Response `200`

The page of results.

- DomainSearchResult
  - `query` string, required: q as sent.
  - `label` string, required: The name searched, without the extension.
  - `free` object, nullable, required: The free name under Orgo’s domain as it would be made (page 0; null where free names are off): never taken, since a name somebody has only gets another tail.
    - `domain` string
    - `label` string: The name.
    - `status` 'available' | 'invalid'
    - `reason` string: Why it is invalid, in the create’s words (That name is not available. Pick another name.).
  - `results` object[], required
    - `domain` string, required
    - `tld` string, required
    - `status` 'available' | 'taken' | 'premium' | 'unknown', required
    - `price_cents` integer, nullable, required: What buying it takes from your Orgo credits, for min_years. Only when available.
    - `renewal_cents_per_year` integer, nullable, required
    - `min_years` integer, nullable, required: The term it is registered for.
  - `page` integer, required
  - `next_page` integer, nullable, required
  - `total` integer, required: How many extensions there are to search.
  - `registrar_error` boolean: Present, true, when the registry did not answer.

## Other responses

- `400`: q is not a name (INVALID_QUERY).
- `401`: Unauthenticated.
- `403`: A workspace-scoped key, or a share-link guest.
- `404`: Domains are not enabled for this account (DOMAINS_NOT_ENABLED).
- `429`: Too many searches (rate_limited). retry_after and Retry-After say when to search again.
- `502`: The registry did not answer and there is nothing else to show (SEARCH_UNAVAILABLE). Try again shortly.

## Changes

- **2026-11-04** `e4c1e7379fa5`: 1 info
  - removed the `taken` enum value from the `free/status` response property for the response status `200`
- **2026-11-01** `60e768a2bb9d`: 12 info
  - added the optional property `docs_url` to the response with the `400` status
  - added the optional property `docs_url` to the response with the `404` status
  - added the optional property `docs_url` to the response with the `429` status
  - added the optional property `docs_url` to the response with the `502` status
  - …8 more
- **2026-10-22** `a506f6169bb5`: 1 info
  - endpoint added

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