API

List, read, create, update and delete the listings on your account.

Domains

A domain is one listing on your account. Everything here needs domains:read, and the three writing endpoints need domains:write; see Authentication for keys and abilities.

Method Path Ability
GET /domains domains:read
GET /domains/{domain} domains:read
POST /domains domains:write
PATCH /domains/{domain} domains:write
DELETE /domains/{domain} domains:write

{domain} is either the UUID or the full domain name, so /domains/example.net and /domains/01920f1a-… address the same listing.

The domain object

{
  "id": "01920f1a-6c4e-7a51-9d0b-4c8f2b7e1a33",
  "name": "example",
  "extension": "net",
  "domain": "example.net",
  "description": "Short and easy to say out loud.",
  "status": "active",
  "featured": false,
  "pricing": {
    "price": 1950,
    "sale_price": null,
    "sale_ends_at": null,
    "effective_price": 1950,
    "offer_from": 950,
    "currency": "EUR",
    "accepts_offers": true
  },
  "metrics": {
    "seo_score": 29,
    "moz_da": 31,
    "moz_links": 623,
    "moz_spam": 11,
    "majestic_tf": 28,
    "majestic_cf": 23,
    "traffic_per_month": 120,
    "updated_at": "2026-09-01T03:14:00+00:00"
  },
  "valuation": {
    "marketplace": 2400,
    "auction": 1400,
    "brokerage": 3100,
    "source": "estivai",
    "updated_at": "2026-09-01T03:14:00+00:00"
  },
  "categories": ["tech", "short"],
  "stats": {
    "views": 412,
    "leads": 3
  },
  "url": "https://ydomain.com/domains/example.net",
  "created_at": "2026-01-08T10:22:41+00:00",
  "updated_at": "2026-09-12T19:03:55+00:00"
}

categories is present when the listing was loaded with them, which is the case on every endpoint here.

Status

Value Meaning
draft Not published; only you can see it
active Published on the marketplace
parked Published, but says nothing about a sale
contact Published, no amount shown, offers welcome
pending Under offer
sold Sold
expired Registration lapsed
hidden Taken off the marketplace, kept on your account

A parked listing, and any listing without a price, sale price or minimum offer, shows no price, no offer invitation and no for-sale wording anywhere: not on its page, not in a card, not in structured data. An offer_amount sent to such a listing is dropped. This is a legal requirement, not a display preference, so it is enforced on the server and cannot be switched off.

sold cannot be set through POST /domains; it is set by PATCH and stamps sold_at for you.

Pricing

List your domains

curl "https://ydomain.com/api/v1/domains?status=active&per_page=2" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Accept: application/json"
Parameter Default Notes
status — One of the status values above
per_page 25 Capped at 100
page 1
{
  "data": [
    {
      "id": "01920f1a-6c4e-7a51-9d0b-4c8f2b7e1a33",
      "domain": "example.net",
      "status": "active",
      "pricing": { "effective_price": 1950, "currency": "EUR" },
      "stats": { "views": 412, "leads": 3 }
    },
    {
      "id": "01920f1a-8d13-7b02-8a71-2f5c9e4d7b10",
      "domain": "example.org",
      "status": "parked",
      "pricing": { "effective_price": null, "currency": "EUR" },
      "stats": { "views": 88, "leads": 0 }
    }
  ],
  "links": { "next": "https://ydomain.com/api/v1/domains?page=2" },
  "meta": { "current_page": 1, "last_page": 74, "per_page": 2, "total": 148 }
}

The objects above are abbreviated; the full shape is the one at the top of this page. Newest listings come first.

Read one domain

curl https://ydomain.com/api/v1/domains/example.net \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Accept: application/json"
{
  "data": {
    "id": "01920f1a-6c4e-7a51-9d0b-4c8f2b7e1a33",
    "domain": "example.net",
    "status": "active",
    "pricing": { "price": 1950, "currency": "EUR", "accepts_offers": true }
  }
}

A domain that is not yours gives 404.

Create a domain

name and extension are separate, and the pair must be unique across the marketplace. Everything else is optional; currency falls back to your account currency and status to active.

curl -X POST https://ydomain.com/api/v1/domains \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Accept: application/json" \
  -d '{
    "name": "example",
    "extension": "org",
    "description": "A calm, brandable name for a lighting or wellness brand.",
    "price": 7250,
    "offer_from": 3500,
    "currency": "EUR",
    "status": "active",
    "categories": ["tech", "short"]
  }'
Field Rules
name Required, max 63, letters, digits and hyphens
extension Required, max 31; co.uk is fine
description Optional, max 5000
status Optional, any status except sold
price, sale_price, offer_from Optional numbers, 0–99,999,999
sale_price Must be lower than price
sale_ends_at Optional date in the future
currency Optional, three letters, a supported currency
has_website Optional boolean
redirect Optional https URL
categories Optional, up to 5 category slugs

201 Created:

{
  "data": {
    "id": "01920f2b-51aa-7c14-9e02-6b3d8f1c4e77",
    "name": "example",
    "extension": "org",
    "domain": "example.org",
    "status": "active",
    "pricing": {
      "price": 7250,
      "effective_price": 7250,
      "offer_from": 3500,
      "currency": "EUR",
      "accepts_offers": true
    },
    "categories": ["short", "tech"],
    "url": "https://ydomain.com/domains/example.org",
    "created_at": "2026-09-17T08:12:03+00:00"
  }
}

A name that is already listed gives 422:

{
  "message": "That domain is already listed.",
  "errors": { "name": ["That domain is already listed."] }
}

This also fires the domain.created webhook.

Update a domain

Send only what changes. Leaving categories out keeps the current ones; sending [] clears them.

curl -X PATCH https://ydomain.com/api/v1/domains/example.org \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Accept: application/json" \
  -d '{"price": 6500, "sale_price": 5900, "sale_ends_at": "2026-12-31T23:59:59+00:00"}'
{
  "data": {
    "domain": "example.org",
    "pricing": {
      "price": 6500,
      "sale_price": 5900,
      "sale_ends_at": "2026-12-31T23:59:59+00:00",
      "effective_price": 5900,
      "currency": "EUR"
    },
    "updated_at": "2026-09-17T08:20:44+00:00"
  }
}

Setting "status": "sold" stamps the sale date and fires domain.sold. Every other change fires domain.updated.

Delete a domain

curl -X DELETE https://ydomain.com/api/v1/domains/example.org \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Accept: application/json"
HTTP/1.1 204 No Content

The listing is soft deleted: it disappears from the marketplace and from the API, and its leads are kept. Fires domain.deleted.