# GOAT API for agents

> API for Agents · https://apiforagents.dev/platforms/goat · HTML twin: https://apiforagents.dev/platforms/goat

Resale products, listings and asks from GOAT.

Endpoint: `POST https://apiforagents.dev/v1/goat`. One op per call. Quote first with `"estimateOnly": true`.

## Prices (USD per record, pay as you go)

| Record | Per record |
|---|---|
| products | $0.0009 |

## Operations

### products

Full detail for up to ten GOAT products by URL or slug. Every size with its asking price and availability, max offer, retail price.

| Field | Required | Type | Meaning |
|---|---|---|---|
| subjects | yes | list of string (1-10 items) |  |
| country | no | string (ISO alpha-2) |  |

Response fields (each row of data; every field present, null when the source had nothing):

| Field | Type |
|---|---|
| slug | string |
| productId | string |
| productName | string |
| sku | string |
| productUrl | string |
| brand | string |
| colorway | string |
| color | string |
| category | string |
| subcategory | string |
| categoryLevel3 | string |
| categoryLevel4 | string |
| activities | list of string |
| gender | string |
| releaseDate | string |
| season | string |
| story | string |
| styleTags | list of string |
| detailTags | list of string |
| merchandisingTags | list of string |
| specialType | string |
| isResellable | boolean |
| directShipping | boolean |
| maxOffer | number |
| sizeType | string |
| sizeUnit | string |
| retailPrice | number |
| images | list of string |
| attributes | any |
| listings | any |
| lowestAsk | number |
| details | object |

`details` is always the last field: everything else the source sent for that row, under our own field names. Its keys depend on the source that answered, so read them defensively; it is `{}` when there is nothing more.

Example request:

```bash
curl -X POST https://apiforagents.dev/v1/goat \
  -H "Authorization: Bearer $AFA_KEY" \
  -H "Content-Type: application/json" \
  -d '{"op":"products","subjects":["https://www.goat.com/sneakers/<product-slug>"],"country":"US"}'
```

Example response rows (made-up names, real field names; a live row carries every field above):

```json
[
  {
    "productName": "Runner 90 'Sea Salt'",
    "brand": "Stride",
    "sku": "ST90-102",
    "colorway": "Sea Salt/White",
    "category": "sneakers",
    "gender": "men",
    "releaseDate": "2026-03-14",
    "retailPrice": 130,
    "lowestAsk": 182,
    "slug": "runner-90-sea-salt",
    "productId": "3890853960",
    "productUrl": "https://www.goat.com/runner-90-sea-salt-1000",
    "isResellable": false,
    "images": [
      "https://img.goat.com/runner-90-sea-salt.jpg"
    ],
    "details": {}
  },
  {
    "productName": "Court Classic Low 'Black'",
    "brand": "Corvo",
    "sku": "CC-LOW-001",
    "colorway": "Black/Black",
    "category": "sneakers",
    "gender": "unisex",
    "releaseDate": "2025-11-02",
    "retailPrice": 110,
    "lowestAsk": 96,
    "slug": "court-classic-low-black",
    "productId": "1913871840",
    "productUrl": "https://www.goat.com/court-classic-low-black-1001",
    "isResellable": false,
    "images": [
      "https://img.goat.com/court-classic-low-black.jpg"
    ],
    "details": {}
  }
]
```

Try it in the playground: https://apiforagents.dev/dashboard/run?platform=goat&op=products (sign in first).

### search

Keyword search on GOAT. Every hit a full product card.

| Field | Required | Type | Meaning |
|---|---|---|---|
| query | yes | string (≤300 chars) |  |
| country | no | string (ISO alpha-2) |  |
| limit | no | integer (1-100) |  |

Response fields (each row of data; every field present, null when the source had nothing):

| Field | Type |
|---|---|
| slug | string |
| productId | string |
| productName | string |
| sku | string |
| productUrl | string |
| brand | string |
| colorway | string |
| color | string |
| category | string |
| subcategory | string |
| categoryLevel3 | string |
| categoryLevel4 | string |
| activities | list of string |
| gender | string |
| releaseDate | string |
| season | string |
| story | string |
| styleTags | list of string |
| detailTags | list of string |
| merchandisingTags | list of string |
| specialType | string |
| isResellable | boolean |
| directShipping | boolean |
| maxOffer | number |
| sizeType | string |
| sizeUnit | string |
| retailPrice | number |
| images | list of string |
| attributes | any |
| listings | any |
| lowestAsk | number |
| details | object |

`details` is always the last field: everything else the source sent for that row, under our own field names. Its keys depend on the source that answered, so read them defensively; it is `{}` when there is nothing more.

Example request:

```bash
curl -X POST https://apiforagents.dev/v1/goat \
  -H "Authorization: Bearer $AFA_KEY" \
  -H "Content-Type: application/json" \
  -d '{"op":"search","query":"Nike Dunk Low","country":"US","limit":20}'
```

Example response rows (made-up names, real field names; a live row carries every field above):

```json
[
  {
    "productName": "Runner 90 'Sea Salt'",
    "brand": "Stride",
    "sku": "ST90-102",
    "colorway": "Sea Salt/White",
    "category": "sneakers",
    "gender": "men",
    "releaseDate": "2026-03-14",
    "retailPrice": 130,
    "lowestAsk": 182,
    "slug": "runner-90-sea-salt",
    "productId": "3696258439",
    "productUrl": "https://www.goat.com/runner-90-sea-salt-1000",
    "isResellable": false,
    "images": [
      "https://img.goat.com/runner-90-sea-salt.jpg"
    ],
    "details": {}
  },
  {
    "productName": "Runner 90 'Night'",
    "brand": "Stride",
    "sku": "ST90-001",
    "colorway": "Black/Gum",
    "category": "sneakers",
    "gender": "men",
    "releaseDate": "2026-01-20",
    "retailPrice": 130,
    "lowestAsk": 158,
    "slug": "runner-90-night",
    "productId": "228523151",
    "productUrl": "https://www.goat.com/runner-90-night-1001",
    "isResellable": false,
    "images": [
      "https://img.goat.com/runner-90-night.jpg"
    ],
    "details": {}
  }
]
```

Try it in the playground: https://apiforagents.dev/dashboard/run?platform=goat&op=search (sign in first).

### listing

A brand or collection page URL. Its products in page order.

| Field | Required | Type | Meaning |
|---|---|---|---|
| subject | yes | string (≤400 chars) | The listing page URL. |
| country | no | string (ISO alpha-2) |  |
| limit | no | integer (1-100) |  |

Response fields (each row of data; every field present, null when the source had nothing):

| Field | Type |
|---|---|
| slug | string |
| productId | string |
| productName | string |
| sku | string |
| productUrl | string |
| brand | string |
| colorway | string |
| color | string |
| category | string |
| subcategory | string |
| categoryLevel3 | string |
| categoryLevel4 | string |
| activities | list of string |
| gender | string |
| releaseDate | string |
| season | string |
| story | string |
| styleTags | list of string |
| detailTags | list of string |
| merchandisingTags | list of string |
| specialType | string |
| isResellable | boolean |
| directShipping | boolean |
| maxOffer | number |
| sizeType | string |
| sizeUnit | string |
| retailPrice | number |
| images | list of string |
| attributes | any |
| listings | any |
| lowestAsk | number |
| details | object |

`details` is always the last field: everything else the source sent for that row, under our own field names. Its keys depend on the source that answered, so read them defensively; it is `{}` when there is nothing more.

Example request:

```bash
curl -X POST https://apiforagents.dev/v1/goat \
  -H "Authorization: Bearer $AFA_KEY" \
  -H "Content-Type: application/json" \
  -d '{"op":"listing","subject":"https://www.goat.com/brand/nike","country":"US","limit":20}'
```

Example response rows (made-up names, real field names; a live row carries every field above):

```json
[
  {
    "productName": "Court Classic High 'White'",
    "brand": "Corvo",
    "sku": "CC-HI-100",
    "colorway": "White/White",
    "category": "sneakers",
    "gender": "unisex",
    "releaseDate": "2026-02-01",
    "retailPrice": 125,
    "lowestAsk": 118,
    "slug": "court-classic-high-white",
    "productId": "4001860239",
    "productUrl": "https://www.goat.com/court-classic-high-white-1000",
    "isResellable": false,
    "images": [
      "https://img.goat.com/court-classic-high-white.jpg"
    ],
    "details": {}
  },
  {
    "productName": "Court Classic Low 'Sail'",
    "brand": "Corvo",
    "sku": "CC-LOW-210",
    "colorway": "Sail/Gum",
    "category": "sneakers",
    "gender": "unisex",
    "releaseDate": "2026-06-12",
    "retailPrice": 110,
    "lowestAsk": 124,
    "slug": "court-classic-low-sail",
    "productId": "4294050896",
    "productUrl": "https://www.goat.com/court-classic-low-sail-1001",
    "isResellable": false,
    "images": [
      "https://img.goat.com/court-classic-low-sail.jpg"
    ],
    "details": {}
  }
]
```

Try it in the playground: https://apiforagents.dev/dashboard/run?platform=goat&op=listing (sign in first).

### history (free)

Stored ask/offer series of products already held. Free.

| Field | Required | Type | Meaning |
|---|---|---|---|
| subjects | yes | list of string (1-10 items) |  |
| metric | no | enum |  Values: lowest_ask, max_offer, retail_price. |
| days | no | integer (1-730) |  |

Request shape:

```json
{
  "op": "history",
  "subjects": [
    "example"
  ]
}
```

Try it in the playground: https://apiforagents.dev/dashboard/run?platform=goat&op=history (sign in first).

## Notes for the agent

Measured GOAT resale data, one operation per call. Products are named by product URL or its slug. Every fetch adds the lowest ask, max offer and retail price to the product's history. ops: products (full detail for up to ten products. Every size with its asking price, condition and availability, max offer, retail price, release date, colorway, tags), search (keyword search, full cards), listing (a brand or collection page URL, its products in order), history (stored ask/offer series for products already held, free). `country` (ISO-2, upper) prices in that region. Ops are independent. Issue several as PARALLEL tool calls. Fresh fetches are charged per record; your own answer is free while fresh.
