# Place bids on auction listings (https://developer.godaddy.com/en/docs/api-users/buy-a-domain/bidding)

---
title: Place bids on auction listings
description: >-
  End-to-end workflow—check listing availability and full pricing, including
  renewal and transfer costs, then place bids on GoDaddy expiring auctions.
keywords: >-
  GODADDY_API_KEY, aftermarket/listings/available, aftermarket/listings/bids,
  tosAccepted, isHighestBidder, BID_MIN_NOT_MET, BIDDER_BLOCKED,
  LISTING_NOT_FOUND, listingMin enrichment includes, 207 bid status,
  priceRenewal, priceTransfer, renewal price, transfer price, includes=listing
agentNotes:
  permissions:
    - Aftermarket
  scopes: []
  rateLimit: >-
    Rate-limited per credential per window. Go to /docs/api-users/rate-limits
    for current values.
  idempotent: false
  destructive: false
  failureRecovery: >-
    Check per-bid status in 207 responses. Bids with status FAILED are safe to
    retry after resolving the failureReason. Do not resubmit bids that already
    returned status SUCCESS. A winning bid is binding and can't be undone, so
    call the availability endpoint with includes=listing and review priceRenewal
    and priceTransfer before you place a bid.
related:
  apis:
    - title: Auctions reference
      href: /docs/references/rest/auctions/place-bids
    - title: Listings availability reference
      href: /docs/references/rest/auctions/check-listing-availability
  guides:
    - title: About the Auctions API
      href: /docs/api-users/auctions
    - title: Buy a closeout auction via instant purchase
      href: /docs/api-users/buy-a-domain/instant-purchase
pageId: 7bb48a33-4414-4f49-b6d6-d5787ea3c87a
---

## Overview

Bidding lets you compete for domain names on [GoDaddy's auctions marketplace](https://auctions.godaddy.com). You check which domains have active listings, review the full cost and optional domain signals, and submit bids. The auction closes on a set date. If you hold the highest bid at close, the domain fulfills to your account. A winning bid is binding, and the full cost includes the renewal or transfer price that only the availability response returns. Check those prices before you bid. The following diagram shows the workflow for bidding on domains in the GoDaddy auctions marketplace:

Verify your GoDaddy account to increase your bid limits. Go to the [bidder verification page](https://www.godaddy.com/help/godaddy-auctions-bidder-verification-process-12416) for details.

GoDaddy Auctions Inventory Files are downloadable datasets (ZIP, XML, and JSON) containing bulk information on live expired auctions and closeout listings. Use them to identify domains worth bidding on before calling the API. Go to the [Auctions Inventory page](https://inventory.auctions.godaddy.com/) to download Inventory Files.

The following article provides a workflow for bidding on domains in the GoDaddy auctions marketplace.

## Prerequisites

The following prerequisites are required before you can bid on domains:

* a [Classic Developer Key](https://classic-developer.godaddy.com/keys), exported as `GODADDY_API_KEY` in your environment
* a domain name you want to bid on, exported as `DOMAIN_NAME` in your environment

All Auctions endpoints use `{customerId}` in the path. Use `MY` for your own account. Go to [Your customer identifier](https://developer.godaddy.com/docs/api-users/auctions#your-customer-identifier) if you need the UUID or are managing another account.

## Check listing availability

The following procedure confirms whether domains have active expiring auctions listings and retrieves listing details, including renewal and transfer prices. You need the `listingId` from the response to [place bids](#place-bids). You can check up to 50 domains per request.

Use the `includes` query parameter to attach additional data to `AVAILABLE` results:

| Value        | What it includes                                                                                          |
| ------------ | --------------------------------------------------------------------------------------------------------- |
| `listingMin` | Current bid price, next minimum bid, and auction close time (doesn't include renewal or transfer prices)  |
| `listing`    | Full listing details, including `priceRenewal` and `priceTransfer` (mutually exclusive with `listingMin`) |
| `enrichment` | Domain signals from GoDaddy, Estibot, SEMrush, and Majestic                                               |

A winning bid is binding. The bid price doesn't show what the domain costs after you win, and only responses with `includes=listing` return `priceRenewal` and `priceTransfer`. Call this endpoint with `includes=listing` and review both prices before you place a bid.

* Check availability with full listing details:

  ```bash tab="curl"
  curl -s -X POST "https://api.godaddy.com/v1/customers/MY/aftermarket/listings/available?includes=listing" \
    -H "Authorization: sso-key $GODADDY_API_KEY" \
    -H "Content-Type: application/json" \
    -d "{
      \"domains\": [\"$DOMAIN_NAME\"]
    }"
  ```

  ```js tab="Node"
  const res = await fetch(
    'https://api.godaddy.com/v1/customers/MY/aftermarket/listings/available?includes=listing',
    {
      method: 'POST',
      headers: {
        Authorization: `sso-key ${process.env.GODADDY_API_KEY}`,
        'Content-Type': 'application/json',
      },
      body: JSON.stringify({
        domains: [process.env.DOMAIN_NAME],
      }),
    },
  );

  if (!res.ok) {
    console.error(`Error: ${res.status}`);
    process.exit(1);
  }

  const result = await res.json();
  console.log(result.availabilities);
  ```

  ```python tab="Python"
  import os
  import requests

  resp = requests.post(
      "https://api.godaddy.com/v1/customers/MY/aftermarket/listings/available",
      params={"includes": "listing"},
      headers={"Authorization": f"sso-key {os.environ['GODADDY_API_KEY']}"},
      json={"domains": [os.environ["DOMAIN_NAME"]]},
  )
  resp.raise_for_status()

  print(resp.json()["availabilities"])
  ```

  ```go tab="Go"
  body := fmt.Sprintf(`{"domains":["%s"]}`, os.Getenv("DOMAIN_NAME"))
  req, _ := http.NewRequest("POST",
      "https://api.godaddy.com/v1/customers/MY/aftermarket/listings/available?includes=listing",
      strings.NewReader(body))
  req.Header.Set("Authorization", "sso-key "+os.Getenv("GODADDY_API_KEY"))
  req.Header.Set("Content-Type", "application/json")
  resp, _ := http.DefaultClient.Do(req)
  defer resp.Body.Close()

  if resp.StatusCode != http.StatusOK {
      fmt.Printf("Error: %d\n", resp.StatusCode)
      return
  }

  var result map[string]interface{}
  json.NewDecoder(resp.Body).Decode(&result)
  fmt.Println(result["availabilities"])
  ```

Example response:

```json
{
  "availabilities": [
    {
      "domainName": "example.com",
      "status": "AVAILABLE",
      "listing": {
        "kind": "FULL",
        "currencyId": "USD",
        "listingId": 696987004,
        "listingType": "EXPIRY_AUCTIONS",
        "auctionEndAt": "2026-09-01T18:00:00Z",
        "priceCurrent": 50000000,
        "priceNextBid": 55000000,
        "priceTransfer": 11990000,
        "priceRenewal": 21990000
      }
    }
  ]
}
```

`priceRenewal` and `priceTransfer` are in micro-units of `currencyId`. Divide by `1,000,000` for the dollar amount (for example, `21990000` = $21.99). Go to [Check aftermarket listing availability](https://developer.godaddy.com/docs/references/rest/auctions/check-listing-availability) for every field the response returns.

Note the `listing.listingId` for each `AVAILABLE` domain and export it as `LISTING_ID`. You'll use it to [place a bid](#place-bids).

## Place bids

The following procedure submits up to 20 bids in a single request. Bid amounts are in USD micro-units. Multiply dollars by `1,000,000` (for example, $100.00 = `100000000`). Confirm the renewal and transfer prices from [Check listing availability](#check-listing-availability) before you submit. Export your bid amount in micro-units as `BID_AMOUNT_USD`.

* Place bids:

  ```bash tab="curl"
  curl -s -X POST "https://api.godaddy.com/v1/customers/MY/aftermarket/listings/bids" \
    -H "Authorization: sso-key $GODADDY_API_KEY" \
    -H "Content-Type: application/json" \
    -d "[
      {
        \"listingId\": $LISTING_ID,
        \"bidAmountUsd\": $BID_AMOUNT_USD,
        \"tosAccepted\": true
      }
    ]"
  ```

  ```js tab="Node"
  const res = await fetch(
    'https://api.godaddy.com/v1/customers/MY/aftermarket/listings/bids',
    {
      method: 'POST',
      headers: {
        Authorization: `sso-key ${process.env.GODADDY_API_KEY}`,
        'Content-Type': 'application/json',
      },
      body: JSON.stringify([
        {
          listingId: Number(process.env.LISTING_ID),
          bidAmountUsd: Number(process.env.BID_AMOUNT_USD),
          tosAccepted: true,
        },
      ]),
    },
  );

  // 200 means every bid was placed. 207 means at least one failed.
  if (res.status !== 200 && res.status !== 207) {
    console.error(`Error: ${res.status}`);
    process.exit(1);
  }

  const bids = await res.json();
  console.log(bids);
  ```

  ```python tab="Python"
  import os
  import requests

  resp = requests.post(
      "https://api.godaddy.com/v1/customers/MY/aftermarket/listings/bids",
      headers={"Authorization": f"sso-key {os.environ['GODADDY_API_KEY']}"},
      json=[
          {
              "listingId": int(os.environ["LISTING_ID"]),
              "bidAmountUsd": int(os.environ["BID_AMOUNT_USD"]),
              "tosAccepted": True,
          }
      ],
  )

  # 200 means every bid was placed. 207 means at least one failed.
  if resp.status_code not in (200, 207):
      print(f"Error: {resp.status_code}")
      exit(1)

  print(resp.json())
  ```

  ```go tab="Go"
  body := fmt.Sprintf(`[{"listingId":%s,"bidAmountUsd":%s,"tosAccepted":true}]`,
      os.Getenv("LISTING_ID"), os.Getenv("BID_AMOUNT_USD"))
  req, _ := http.NewRequest("POST",
      "https://api.godaddy.com/v1/customers/MY/aftermarket/listings/bids",
      strings.NewReader(body))
  req.Header.Set("Authorization", "sso-key "+os.Getenv("GODADDY_API_KEY"))
  req.Header.Set("Content-Type", "application/json")
  resp, _ := http.DefaultClient.Do(req)
  defer resp.Body.Close()

  // 200 means every bid was placed. 207 means at least one failed.
  if resp.StatusCode != 200 && resp.StatusCode != 207 {
      fmt.Printf("Error: %d\n", resp.StatusCode)
      return
  }

  var bids []map[string]interface{}
  json.NewDecoder(resp.Body).Decode(&bids)
  fmt.Println(bids)
  ```

Example response (200—all bids placed):

```json
[
  {
    "listingId": 696987004,
    "isHighestBidder": true,
    "bidId": "e8f0a45d-53c6-49e5-a1f2-08b993960e1b",
    "bidAmountUsd": 100000000,
    "status": "SUCCESS"
  }
]
```

If the response is 207, inspect each bid's `status` and `failureReason`. Successfully placed bids have a `bidId` for tracking.

## Error reference

| HTTP status   | Error code                                        | Cause                                                  | Note |
| ------------- | ------------------------------------------------- | ------------------------------------------------------ | ---- |
| `400`         | `BAD_SYNTAX` / `MALFORMED_INPUT`                  | Request body is malformed.                             |      |
| `403`         | `BIDDER_BLOCKED`                                  | Your account is blocked from bidding.                  |      |
| `403`         | `BIDDER_BANNED`                                   | Your account is banned from bidding.                   |      |
| `403`         | `MISSING_CREDENTIALS`                             | API key not provided or invalid.                       |      |
| `422`         | `MAX_BIDS_PER_REQUEST_EXCEEDED`                   | More than 20 bids in a single request.                 |      |
| `422`         | `DUPLICATE_BIDS`                                  | Multiple bids for the same `listingId` in one request. |      |
| `207` per-bid | `BID_MIN_NOT_MET`                                 | Bid amount is below the listing's minimum.             |      |
| `207` per-bid | `BIDDER_IS_SELLER`                                | You can't bid on your own listing.                     |      |
| `207` per-bid | `BIDDER_VERIFICATION_SHOPPER_MAX_APPROVED_AMOUNT` | Bid exceeds your verified spending limit               |      |
| `207` per-bid | `BIDDER_VERIFICATION_SHOPPER_MAX_APPROVED_COUNT`  | You have reached your bid count limit.                 |      |
| `207` per-bid | `LISTING_NOT_FOUND`                               | No active listing found for this `listingId`.          |      |
| `429`         |                                                   | Rate limit exceeded.                                   |      |
