Skip to content

IAAI API: getting Insurance Auto Auctions data into your app

IAAI API guide: stock numbers vs item IDs, branches, Run & Drive labels, timed auctions, Buy Now, real requests and one JSON schema shared with Copart.

9 min read
Illustration: an IAAI listing with stock number, branch and Run & Drive badge mapped field by field to a JSON record

An IAAI API, in the sense of a public feed of Insurance Auto Auctions inventory that any developer can query with a key, is not something IAAI offers. IAAI's systems face its buyers (the website, the app, broker accounts) and its sellers (insurers and fleets that send vehicles in). To get IAAI lots, photos, bids and final prices into your own app as JSON, you collect them or use a data provider that keeps a normalised copy.

The work that follows is mostly about translation. IAAI has its own vocabulary: stock numbers and item IDs, branches and offsite vehicles, start codes such as Run & Drive, timed auctions next to live ones. If you already handle Copart, most of it maps onto the same fields, and a few things do not.

This guide walks through those IAAI-specific concepts, shows where each one lands in a JSON record, and gives working requests for listing, lookups and branches.

Key takeaways

  • IAAI does not run an open data API for third parties; its integrations serve its own buyers and sellers.
  • IAAI has two identifiers per listing: the stock number buyers type and the item ID in the page URL. Store both.
  • Start codes, damage names and title wording differ from Copart's; normalise them into one set of values before you build filters.
  • Timed auctions and Buy Now lots need their own price display, and a seller reserve is never what a car sold for.
  • With one schema for both auctions, the source lives on each lot, so read it there rather than assuming it from your query.

Does IAAI have a public API?

Not one you can sign up for as a developer who wants the inventory. As far as public information shows, IAAI's integrations exist for the businesses it works with: insurance carriers and other sellers who assign vehicles, and registered buyers and brokers who bid through its site and apps. IAAI has been part of RB Global (the former Ritchie Bros.) since 2023, and its public site at iaai.com remains the way buyers see the inventory.

Like Copart, IAAI's terms of use limit automated collection. If you are about to write a crawler, read them first, and read our engineering breakdown in Scraping Copart yourself vs using an API: everything there applies to IAAI too, with a second set of page layouts to maintain.

What people want from an IAAI API is usually the same short list: every active listing with its photos, damage, title, odometer and start code; the current bid and Buy Now while it is for sale; the final price once it sells; and the history of a VIN across earlier sales. Importers quoting clients in Eastern Europe or the Gulf add one more: the branch, because inland transport to the port is part of the price.

IAAI terms a developer has to learn

IAAI's listing page uses its own names for things. Here is what each one means and which field carries it in the AuctionsAPI vehicle object (the same object Copart lots use).

On IAAIWhat it meansField
Stock #The listing number buyers search for and quote to brokers.lots[].lot
Item ID (in the page URL)IAAI's internal listing id; it is what you see in a copied link.lots[].external_id
BranchThe IAAI facility that sells the vehicle.lots[].selling_branch
OffsiteThe car sits somewhere else (a body shop, a lot), not at the branch.lots[].location.is_offsite, .offsite
Start code (Run & Drive, Starts, Stationary)What the yard observed at check-in. Not a warranty.lots[].condition
Primary / secondary damageWhere the damage is.lots[].damage.main, .second
Title / sale documentState and document type, such as a salvage certificate.lots[].title, .detailed_title
ACV, repair estimateValuations IAAI publishes for some lots.actual_cash_value, estimate_repair_price
SellerOften an insurance company; sometimes a rental fleet or lender.lots[].seller, seller_type
Buy NowFixed price to take the car before the auction.lots[].buy_now
Timed auctionBidding over a set window that closes at a set time.is_timed_auction, timed_start_bid, auction_type
Airbags, keysDeployed or intact airbags; key present or not.lots[].airbags, keys_available
IAAI listing terms and where they live in the record.

Stock number vs item ID

This trips up almost every IAAI integration. A buyer says "stock 41872206". A link they paste ends in a different number, the item ID. Both identify the same listing, and your lookup has to accept either. Store the stock number in your lot column and the item ID next to it; index on source plus stock number.

Branches and offsite cars

Transport quotes start at the branch, so it matters more than it looks. The /usa/branches?domain_id=1 dictionary lists IAAI branches with a name, number and link; selling_branch on each lot points to one. When location.is_offsite is true, the car is not physically at that branch, and a carrier needs the actual address before quoting.

An IAAI record, field by field

Here is a trimmed vehicle with one IAAI lot. Values are made up; field names are exactly those in the OpenAPI contract.

JSON
{  "data": {    "id": 18233410,    "vin": "5YJ3E1EA7MF912345",    "year": 2021,    "title": "2021 Tesla Model 3",    "fuel": { "name": "electric", "id": 2 },    "drive_wheel": { "name": "rear", "id": 1 },    "lots": [      {        "id": 19021577,        "lot": "41872206",        "external_id": "40093457",        "domain": { "name": "iaai_com", "id": 1 },        "odometer": {          "km": 51320, "mi": 31889,          "status": { "name": "actual", "id": 1 }        },        "damage": {          "main": { "id": 3, "name": "Front End" },          "second": { "id": 41, "name": "Left Side" }        },        "condition": { "name": "engine_starts", "id": 6 },        "airbags": { "name": "deployed", "id": 2 },        "keys_available": true,        "title": { "id": 912, "code": null, "name": "Salvage Certificate" },        "seller": {          "id": 77, "name": "Example Insurance Co",          "logo": null, "is_insurance": true,          "is_rental": false, "is_credit_company": false        },        "seller_type": { "name": "insurance", "id": 1 },        "actual_cash_value": 24800,        "estimate_repair_price": 9100,        "is_timed_auction": true,        "timed_start_bid": 1000,        "auction_type": { "name": "timed", "id": 5 },        "sale_date": "2026-10-09T17:00:00.000000Z",        "bid": 6250,        "buy_now": null,        "final_bid": null,        "seller_reserve": null,        "status": { "name": "sale", "id": 3 },        "selling_branch": {          "id": 1043, "name": "Dallas", "number": "112",          "link": null, "domain_id": 1        },        "location": {          "country": { "iso": "us", "name": "USA" },          "state": { "id": 44, "code": "tx", "name": "texas" },          "is_offsite": false        }      }    ]  }}
Example data: a 2021 Model 3 on a timed IAAI sale, front-end and left-side damage, engine starts.
IAAIExample data
2021 Tesla Model 3
Stock #
41872206
Branch
Dallas (TX)
Start code
Starts
Damage
Front End / Left Side
Title
Salvage Certificate
Odometer
31,889 mi (actual)
Auction
Timed, closes Oct 9
Current bid
$6,250
The same record as a buyer would read it on a catalog card.

Three details in that record are easy to mishandle. seller_reserve: null means no reserve in the data, not a reserve of zero and not a no-reserve sale. buy_now: null and buy_now: 0 both mean there is no Buy Now. And condition id 0 is a real value (run and drives), so never test it with a truthiness check.

IAAI API requests: listing, lookups, branches

IAAI is source 1 (iaai_com) in every request. Send the key in the x-api-key header; the base URL is https://auctionsapi.com/api.

Active IAAI lots with filters

Shell
# Run-and-drive IAAI lots with a Buy Now price, Texas onlycurl -s "https://auctionsapi.com/api/cars?domain_id=1&condition=0\&buy_now=1&country=US&state_code=TX&per_page=50" \  -H "x-api-key: YOUR_API_KEY" \  -H "accept: application/json"
Filters combine with AND. Follow links.next for the next page.

Upcoming sales are next_hours_auction=48 (sale date between now and 48 hours ahead). Damage is a text filter: damage=Front End matches primary or secondary damage, but only if the text exists in /usa/damages; otherwise the filter is silently skipped and you get everything. Validate it first.

Look up by stock number, item ID or VIN

Python
import osimport reimport requests BASE = "https://auctionsapi.com/api"HEADERS = {    "x-api-key": os.environ["AUCTIONS_API_KEY"],  # YOUR_API_KEY    "accept": "application/json",} def get(path: str, **params) -> dict | None:    r = requests.get(BASE + path, headers=HEADERS,                     params=params, timeout=30)    if r.status_code in (404, 423):        return None    r.raise_for_status()    return r.json().get("data") def iaai_lookup(text: str) -> dict | None:    text = text.strip()    # A pasted IAAI link: take the item ID from the URL.    m = re.search(r"VehicleDetail/(\d+)", text, re.I)    if m:        return get(f"/search-lot/{m.group(1)}/iaai_com",                   search_by_id=1)    q = text.upper()    if re.fullmatch(r"[A-HJ-NPR-Z0-9]{17}", q):        return get(f"/search-vin/{q}", prices_history=1)    if re.fullmatch(r"\d+[A-Z]?", q):        return get(f"/search-lot/{q}/iaai_com", prices_history=1)    return None
A link goes to search_by_id=1, a VIN to /search-vin, a stock number to /search-lot. Adjust the URL pattern if IAAI changes its links.

With search_by_id=1, numeric item IDs match by prefix and others match exactly, so pass the full number. /search-vin returns every lot of the car on the sources your key covers, archived ones included, which makes it the right call for a vehicle history page.

Branch dictionary

Shell
curl -s "https://auctionsapi.com/api/usa/branches?domain_id=1" \  -H "x-api-key: YOUR_API_KEY"
Plain paginator, 200 per page: follow next_page_url until it is null.

Load the dictionaries (/usa/branches, /usa/damages, /usa/titles, /usa/states) once and refresh them daily. Your filter dropdowns should come from them, not from values you happened to see in records.

Timed auctions, Buy Now and IAAI prices

IAAI runs live online auctions and timed auctions. On a timed sale, bidding is open over a window and closes at the sale date; the record says so with is_timed_auction: true, auction_type id 5, and a timed_start_bid where IAAI publishes one. Do not infer a timed auction from a sale date in the future: every upcoming lot has one.

Sale dates arrive in UTC with their own sale_date_updated_at. IAAI's pages show times in a local zone, so a buyer in Warsaw or Almaty needs the time converted to their zone, and your sync must not let an older value overwrite a newer one. The same goes for bid_updated_at, buy_now_updated_at and final_bid_updated_at: compare timestamps before writing.

Price display follows the same order as for Copart, and the JavaScript below is all a card needs:

JavaScript
function priceBlock(lot) {  const money = n => '$' + Number(n).toLocaleString('en-US')  if (lot?.final_bid != null) {    return { label: 'Sold for', value: money(lot.final_bid) }  }  if (Number(lot?.buy_now) > 0) {    return { label: 'Buy Now', value: money(lot.buy_now),             sub: Number(lot.bid) > 0 ? 'Bid ' + money(lot.bid) : null }  }  if (Number(lot?.bid) > 0) {    const label = lot.is_timed_auction ? 'Current bid (timed)'                                       : 'Current bid'    return { label, value: money(lot.bid) }  }  return { label: 'No bids yet', value: null }}// Show lot.seller_reserve on its own line, never as a sale price.
Currency follows the lot's country (USD in the US, CAD in Canada); amounts include no fees.

Remember that bid returns the final bid once one is recorded, so it cannot tell you a car sold. Only final_bid can. The prices page has the edge cases, including archived lots that ended without a final bid (show "Ended", not "Sold").

IAAI photos, video and 360 views

For a buyer who will never see the car before it is shipped, photos are the inspection. IAAI listings usually carry a full set of exterior and interior shots, and many add an engine video or a 360-degree view. In the record they sit in lots[].images: small[] for thumbnails, normal[] and big[] for the gallery, video for a clip, and external_panorama_url when a 360 view exists.

Three rules keep a gallery working. Use normal[0] as the card photo and fall back to small[0] only if nothing larger exists; blurry thumbnails on a catalog page cost clicks. Load images lazily, because a results page of 50 cars with 10 photos each is a lot of bytes. And handle missing images: the files are hosted by the source, URLs can change size or expire after the sale, and an archived lot from last year may no longer have every photo it had on sale day. Show a placeholder on a 404 instead of a broken frame, and never send your API key to an image host.

If photos of past sales matter to your product (rebuilt-car history pages, for example), store your own copies at the time of the sale. That is a storage decision with a real cost, and it is easier to make on day one than to regret later.

One schema for IAAI and Copart

The point of normalising IAAI is that your code stops caring which auction a lot came from, except where it should. In one schema, the vehicle is shared and each lot carries its own source:

  • Same fields, same enums. A run-and-drive filter is condition=0 on both auctions, a deployed airbag is airbags id 2, an insurance seller is seller_type id 1.
  • Source on the lot. lots[].domain.id is 1 for IAAI and 3 for Copart. When you query with domain_id=1, a vehicle that also has an active Copart lot comes back with both lots. Filter by domain.id before showing an IAAI badge.
  • Separate identifiers. Lot and stock numbers can collide across the two auctions; the unique key is source plus number.
  • Source extras stay optional. Fields such as grade_iaai, note, tags and line exist only where a source provides them. Do not build required UI around them.
  • One VIN, many lots. A car can sell on IAAI, get rebuilt and reappear on Copart. /search-vin returns both lots as one history.

Label vocabularies are where the two auctions differ most: start codes, damage names, title wording, sale formats. We go through them side by side, with a normalisation table, in Copart vs IAAI.

IAAI integration mistakes we see

Most of these show up in the first week of a new catalog, usually reported by a buyer rather than caught by a test.

  • Searching only by stock number. Users paste links, links carry the item ID, and the lookup returns nothing. Accept both, and route a pasted URL to search_by_id=1.
  • Showing the branch as the car's address. For offsite vehicles the branch is only the seller of record. Check location.is_offsite before you quote transport.
  • Treating Starts as Run & Drive. An engine that starts is not a car that moves. Keep the two conditions apart in filters and on the card.
  • Labelling the high bid as the price. An archived lot without final_bid ended without a recorded sale price; show "Ended", not "Sold".
  • Hiding Canadian lots in USD. Amounts follow the lot's country, so a lot in Ontario is in Canadian dollars. Read location.country.iso and label the currency.
  • Keying lots on the stock number alone. It can collide with a Copart lot number. Use source plus number, and keep the internal lot id as the primary key.
  • Sending empty parameters. domain_id= with no value can be rejected, and every rejected request still counts toward your allowance. Omit what you do not use.

Keeping IAAI data current

Treat IAAI exactly like Copart in your sync: one initial import of /cars?domain_id=1, then an hourly job that reads /cars?minutes=75 for changed lots and /archived-lots?minutes=75 for lots that left the auction, archiving the lot rather than the vehicle. If your key covers both sources, run one job without domain_id and route by lots[].domain.id. The steps, overlaps and failure handling are in the sync guide; the Copart API guide shows the same loop in code.

Next step

Open the Playground, switch the lot lookup to IAAI and paste a stock number, or run the three requests above with a free demo key. When you are ready to plan a catalog with both auctions, the Copart and IAAI API page lists what the feed includes.

Questions people ask

Does IAAI have an API for developers?

IAAI does not offer an open inventory API with self-service keys. Its integrations serve its sellers, such as insurers assigning vehicles, and its registered buyers and brokers. To use IAAI lots in your own product, you either collect them yourself after checking IAAI's terms of use or use a data provider that delivers them as JSON.

What is the difference between an IAAI stock number and item ID?

The stock number is what buyers search for and quote, shown on the listing as Stock #. The item ID is IAAI's internal listing id that appears in the page URL. Both point to the same listing. In our API the stock number is lots[].lot and the item ID is lots[].external_id; look up the latter with search_by_id=1.

What does Run & Drive mean on IAAI?

It means that at check-in the yard saw the vehicle start, go into gear and move under its own power. It is an observation on that day, not an inspection or a guarantee: batteries die, damage worsens and problems appear later. Starts means only the engine started. In normalised data both become values of the condition field.

Can I get IAAI final sale prices?

Yes, from a provider that records them when the auction closes. In our records the price a lot sold for is lots[].final_bid, which stays null until it is known and remains on the archived lot afterwards. The current bid, Buy Now price and seller reserve are different numbers and none of them is a sale price.

Are IAAI and Copart in the same API format?

In AuctionsAPI, yes. Both auctions use one vehicle object with the same fields and enum ids; each lot carries its source in domain (iaai_com is 1, copart_com is 3). That lets one sync job and one catalog cover both, as long as you read the source from each lot.

© 2025. AuctionsAPI operates independently and is not affiliated with Copart, IAAI or Encar.