---
title: "Make an offer on a listing"
method: POST
path: "/api/negotiations"
tags: ["Marketplace"]
---

# Make an offer on a listing

`POST /api/negotiations`

## Request

- Base URL: `https://domani.run`
- URL: `https://domani.run/api/negotiations`
- Auth: HTTP bearer

Opens an anonymous price negotiation on an actively-listed domain with an initial offer. The seller can counter, accept, or decline. On acceptance the buyer finalizes payment and a deal is created at the agreed price. Requires `deals:write` scope.

## Request body

- object
  - `domain` string, required: The listed domain to negotiate on
  - `offer` number, required: Initial offer in USD
  - `message` string: Optional message to the seller

## Response `201`

Negotiation opened

- object
  - `negotiation` Negotiation: An anonymous, threaded price negotiation over a listed domain
    - `id` string
    - `domain` string
    - `status` 'open' | 'agreed' | 'completed' | 'declined' | 'expired' | 'cancelled'
    - `your_role` 'buyer' | 'seller'
    - `your_turn` boolean: True when it's your move to respond
    - `current_offer` number: Latest amount on the table (USD)
    - `agreed_price` number, nullable: Set once the price is agreed
    - `list_price` number: The listing's asking price (USD)
    - `expires_at` string, date-time
    - `deal_id` string, nullable: Set once finalized into a deal
    - `created_at` string, date-time
    - `offers` object[]: The negotiation thread, oldest first
      - `from` 'you' | 'counterparty'
      - `kind` 'offer' | 'counter' | 'accept' | 'decline'
      - `amount` number, nullable
      - `message` string, nullable
      - `at` string, date-time

## Other responses

- `401`: Missing or invalid API key
- `404`: No active listing for the domain
- `429`: Rate limit exceeded - wait and retry

---

[API](https://skmtc.dev/domani/apis/domani-run-api.md) · [All operations](https://skmtc.dev/domani/apis/domani-run-api/llms.txt) · [OpenAPI document](https://skmtc.dev/domani/apis/domani-run-api/revisions/7679f8159533?raw)
