---
search:
  tags:
    - Merchant Registry
    - POST
seo:
  description: >-
    Publish a merchant offer. Reference for the POST /v1/merchants/{id}/offers
    endpoint in the agentsub Gateway API.
sidebar:
  label: Publish a merchant offer
  badge: POST
title: Publish a merchant offer
type: openapi-operation
---
`POST /v1/merchants/{id}/offers`

**Request body** (`application/json`, required)

- `sku` (string, required)
- `title` (string, required)
- `description` (string)
- `unit` (string, required)
- `priceUsd` (string, required)
- `category` (string, required)

Request body example:

```json
{
  "sku": "string",
  "title": "string",
  "description": "",
  "unit": "string",
  "priceUsd": "string",
  "category": "string"
}
```

**Responses**

- `201` — Offer published
- `400` — \`invalid\_input\` problem
- `401` — \`unauthorized\` problem; live 401s advertise \`WWW-Authenticate: Bearer resource\_metadata=...\`
- `403` — Identity, ownership, scope or policy denied (\`human\_required\`, \`owner\_claim\_required\`, \`scope\_required\`, \`FROZEN\`, \`CAP\_EXCEEDED\`, \`SCOPE\_FORBIDDEN\`)
- `503` — Runtime or provider configuration unavailable (\`runtime\_configuration\_required\`, \`signing\_configuration\_required\`, \`runtime\_unavailable\`, \`workspace\_unavailable\`, \`provider\_configuration\_required\`)

Response example, 201:

```json
{
  "offer": {
    "id": "string",
    "acceptorId": "string",
    "title": "string",
    "description": "string",
    "unit": "string",
    "priceUc": "string",
    "priceUsd": "string",
    "category": "string",
    "acceptedPaymentMethods": [
      "string"
    ]
  }
}
```
