The institutional data layer for the global art market.
Programmatic access to the world's largest structured auction dataset — 10M+ sale records across 1,400+ auction houses, with AI-powered price estimates, artist analytics, and live sale data. Built for collectors, advisors, financial institutions, and developers building the next generation of art-market tooling.
Quickstart
Make your first authenticated request in under a minute. The example below fetches the top 10 artists ranked by total auction sales.
# List the top 10 artists by total sales curl "https://api.liveart.ai/v1/artists?limit=10&sort_by_total_sales=desc&is_top=true" \ -H "Authorization: Bearer $LIVEART_API_KEY" \ -H "Accept: application/json"
import os, requests resp = requests.get( "https://api.liveart.ai/v1/artists", headers={"Authorization": f"Bearer {os.environ['LIVEART_API_KEY']}"}, params={ "limit": 10, "sort_by_total_sales": "desc", "is_top": True, }, ) resp.raise_for_status() for artist in resp.json()["artists"]: print(f"{artist['name']:30s} ${artist['total_sales']:>15,}")
const res = await fetch( "https://api.liveart.ai/v1/artists?limit=10&sort_by_total_sales=desc&is_top=true", { headers: { "Authorization": `Bearer ${process.env.LIVEART_API_KEY}` } } ); const { artists } = await res.json(); artists.forEach(a => console.log(a.name, a.total_sales));
Response (truncated)
{
"artists": [
{
"id": 142,
"uid": "pablo-picasso",
"name": "Pablo Picasso",
"nationality": "Spanish",
"birth": 1881,
"death": 1973,
"total_sales": 8214039715,
"market_cap": 12480000000,
"price_momentum_percentage_12mo": 7.4,
"artworks_count": 36214
}
],
"total": 1287,
"limit": 10,
"offset": 0
}
Authentication
The LiveArt API uses HTTP bearer tokens. Pass your API key in the Authorization header on every request:
Authorization: Bearer la_live_xxxxxxxxxxxxxxxxxxxxxxxx
Keys are issued per organization and scoped to a plan tier (Starter / Growth / Enterprise). Treat your key like a password — never embed it in client-side code, mobile bundles, or public repositories.
Public (unauthenticated) endpoints
Two endpoints are intentionally public so you can share data without exposing your key:
GET /v1/artworks/shared/{token}— view a shared artwork listGET /v1/lots/shared/{token}— view a shared lot list
Base URL & versioning
All endpoints are served from a single base host. Versioning is in the URL path; we will introduce /v2 only for breaking changes and run both versions in parallel for at least 12 months.
https://api.liveart.ai/v1/<resource>
Additive, backwards-compatible changes (new optional query parameters, new fields in responses, new enum values) may be introduced at any time. Build your clients to ignore unknown fields.
Pagination
List endpoints are paginated using a classic limit / offset pattern.
| Parameter | Type | Default | Description |
|---|---|---|---|
| limit | integer | 20–100 | Number of items per page. Max varies by endpoint (typically 100; up to 1000 for /v1/artists). |
| offset | integer | 0 | Number of items to skip from the start of the result set. |
Responses include either a total (for resources where total count is known and cheap to compute) or has_more (for high-cardinality resources like /v1/lots). Use whichever the endpoint returns to drive your UI pager.
GET /v1/artworks?limit=50&offset=100 # page 3 of 50
Filtering operators
List endpoints support a rich, consistent filter grammar built from suffixes appended to field names. Combine as many as you need — they're AND'ed together.
| Suffix | Meaning | Example |
|---|---|---|
| (none) | Exact match | artist_id=142 |
| __in | Match any of (repeat the param or comma-separate) | artist_id__in=142&artist_id__in=87 |
| __gte | Greater than or equal | last_hammer_price_usd__gte=100000 |
| __lte | Less than or equal | creation_year__lte=1970 |
| __eq | Explicit equality (used for enum-style fields like size) | size__eq=big |
| __ilike | Case-insensitive substring match | name__ilike=evening sale |
Worked example: blue-chip post-war works coming up at Sotheby's NY
curl "https://api.liveart.ai/v1/lots?\ status=upcoming&\ sale_auction_house_id=1&\ sale_location__in=New%20York&\ hammer_price_estimate_max_usd__gte=1000000&\ creation_year__gte=1945&creation_year__lte=1980&\ sort=HAMMER_PRICE_ESTIMATE_MAX_DESC&\ limit=50" \ -H "Authorization: Bearer $LIVEART_API_KEY"
Sorting
Each list endpoint accepts a sort query parameter that takes one of an enumerated set of values. The convention is FIELD_DIRECTION:
- Artworks —
NAME_ASC,NAME_DESC,CREATION_YEAR_ASC,CREATION_YEAR_DESC,SALE_DATE_ASC,SALE_DATE_DESC,SIZE_ASC,SIZE_DESC - Lots —
NUMBER_ASC,NUMBER_DESC,SALE_DATE_ASC,SALE_DATE_DESC,CREATION_YEAR_ASC/DESC,HAMMER_PRICE_ESTIMATE_MIN_ASC/DESC,HAMMER_PRICE_ESTIMATE_MAX_ASC/DESC - Sales —
ID_ASC/DESC,START_DATETIME_ASC/DESC,END_DATETIME_ASC/DESC,DATE_ASC/DESC - Artists — use
sort_by_total_salesorsort_by_market_capwith valuesasc/desc
Currencies
All monetary fields are returned natively in the sale's source currency and normalized to USD. Pass preferred_currency on most list/detail endpoints to additionally receive values converted to a third currency of your choice using daily reference rates.
Supported values for preferred_currency:
USD · GBP · EUR · CHF · JPY · CNY · HKD · SGD · TWD · KRW · INR · AUD · CAD · NZD · NOK · RUB
The PriceSchema object on every priced resource contains parallel sets of fields:
| Field family | Meaning |
|---|---|
| hammer / hammer_estimate_min / hammer_estimate_max / premium | Native sale currency (see currency) |
| *_usd | Normalized to USD (always populated) |
| *_preferred | Converted to the currency you passed in preferred_currency |
Errors
The API uses standard HTTP status codes. Validation errors are returned with full FastAPI-style detail arrays so you can pinpoint the offending field.
| Status | Meaning |
|---|---|
| 200 OK | Successful request |
| 204 No Content | Successful follow / unfollow with no body |
| 401 Unauthorized | Missing or invalid bearer token |
| 403 Forbidden | Token valid but plan does not grant access to this resource |
| 404 Not Found | Resource does not exist (or is not accessible to you) |
| 422 Unprocessable Entity | Validation error — see detail[] for offending fields |
| 5xx | Server error — safe to retry with exponential backoff |
Validation error example
{
"detail": [
{
"loc": ["query", "limit"],
"msg": "ensure this value is less than or equal to 100",
"type": "value_error.number.not_le"
}
]
}
Resource overview
The API exposes seven core resources. Every endpoint is documented below with its parameters, a real request, and a representative response.
Artists
Artworks
Lots
Sales
Auction Houses
Categories
Artists
Biographical and market data on the artists tracked by LiveArt — including total sales, market cap, 12-month price momentum, and a follow mechanism so you can build personalized feeds.
List artists
Search and rank artists. Supports text search, top-artist filter, and ranking by total sales or market cap.
| Parameter | Type | Description |
|---|---|---|
| limit | integer · ≤1000 | Page size. Default 100. |
| offset | integer · ≥0 | Skip count. |
| q | string | Free-text search across name and known synonyms. |
| sort_by_total_sales | asc · desc | Rank by lifetime auction sales (USD). |
| sort_by_market_cap | asc · desc | Rank by LiveArt market cap estimate. |
| uid__in | string[] | Filter by canonical artist UID slugs (e.g. pablo-picasso). |
| id__in | integer[] | Filter by numeric artist IDs. |
| is_top | boolean | Limit to LiveArt's curated "top artist" set. |
Get a single artist
Returns the full ArtistSchema, including long biography, nationality, life dates, market metrics, and the 64-dimensional artist_index_vector used by our recommendation engine.
{
"id": 142,
"uid": "jean-michel-basquiat",
"name": "Jean-Michel Basquiat",
"nationality": "American",
"birth": 1960,
"death": 1988,
"bio": "American Neo-expressionist artist...",
"total_sales": 3214000000,
"market_cap": 5840000000,
"max_price": 110487500,
"price_momentum_percentage_12mo": 12.4,
"artworks_count": 1842,
"recent_lots_count": 37,
"is_followed": true,
"photo_thumbnail_url": "https://cdn.liveart.ai/..."
}
Artist price chart
Time series for an artist's market: a TradingView-compatible ChartResponse with one or more series (typically the LiveArt Index plus optional confidence bands). Resolutions: daily, monthly, yearly.
{
"resolution": "monthly",
"unit": "index",
"currency": "USD",
"series": [
{
"id": "liveart_index",
"label": "LiveArt Index",
"data": [
{ "time": "2020-01-01", "value": 100.0 },
{ "time": "2020-02-01", "value": 102.4 },
{ "time": "2020-03-01", "value": 98.7 }
]
}
]
}
Related artists
Returns artists whose market behavior, period, and stylistic fingerprint are most similar — derived from the proprietary artist_index_vector. Useful for "investors who tracked X also followed…" components.
Follow / unfollow
Adds the artist to the authenticated user's follow list. Returns 204 No Content.
Removes the artist from the follow list. Idempotent.
Paginated list of all artists the authenticated user follows.
Artworks
Each artwork is a unique, deduplicated work — distinct from the lots in which copies of it appear. The artwork object carries the LiveArt Estimate™ AI price prediction, 12- and 24-month momentum, and the full canonical description.
List artworks
The most powerful endpoint in the API. Filter on more than 50 dimensions across artist, physical attributes, market state, sale context, and price.
Selected query parameters
| Parameter | Type | Description |
|---|---|---|
| artist_id · artist_id__in | integer · integer[] | Restrict to one or more artists. |
| category_id · category_id__in | integer · integer[] | Painting, sculpture, photography, etc. (see categories). |
| creation_year__gte / __lte | integer | Bound the year of creation. |
| size__in | small · medium · big · other | LiveArt's normalized size buckets. |
| measurements_*_cm__gte / __lte | number | Numeric bounds for height, width, depth (cm). |
| materials · materials__in | string · string[] | Filter by medium (oil on canvas, bronze, etc.). |
| last_lot_status | unknown · upcoming · withdrawn · sold · passed | Most recent lot outcome for this artwork. |
| date_last_sold__gte / __lte | date | Bound by date of last completed sale. |
| date_last_upcoming__gte / __lte | date | Bound by upcoming sale date. |
| current_estimated_price__gte / __lte | number | Bound by LiveArt Estimate™ value. |
| price_momentum_12mo__gte / __lte | number | 12-month momentum percentile (-1.0 to 1.0). |
| last_hammer_price_usd__gte / __lte | integer | Most recent hammer price in USD. |
| last_premium_price_usd__gte / __lte | integer | Most recent premium-inclusive price (USD). |
| without_editions | boolean | Exclude editioned multiples — show only unique works. |
| with_images | boolean | Restrict to artworks with at least one image. Default false. |
| sale_auction_house_id__in | integer[] | Restrict to upcoming sales at specific houses. |
| sale_start_datetime__gte / __lte | datetime | Bound the upcoming sale window. |
| market_cap__gte | number | Minimum artist market cap (filter out micro-cap artists). |
| preferred_currency | enum | Convert prices to one of 16 supported currencies. |
| sort | ArtworkSortEnum | See Sorting. |
| sort_by_price | asc · desc | Convenience sort by current estimated price. |
Example: Basquiat works estimated $1M–$5M coming up in the next 90 days
curl "https://api.liveart.ai/v1/artworks?\ artist_id=142&\ last_lot_status=upcoming&\ current_estimated_price__gte=1000000&\ current_estimated_price__lte=5000000&\ date_last_upcoming__gte=2026-04-15&\ date_last_upcoming__lte=2026-07-15&\ sort=SALE_DATE_ASC&\ with_images=true" \ -H "Authorization: Bearer $LIVEART_API_KEY"
from datetime import date, timedelta import os, requests today = date.today() params = { "artist_id": 142, "last_lot_status": "upcoming", "current_estimated_price__gte": 1_000_000, "current_estimated_price__lte": 5_000_000, "date_last_upcoming__gte": today.isoformat(), "date_last_upcoming__lte": (today + timedelta(days=90)).isoformat(), "sort": "SALE_DATE_ASC", "with_images": True, } r = requests.get( "https://api.liveart.ai/v1/artworks", headers={"Authorization": f"Bearer {os.environ['LIVEART_API_KEY']}"}, params=params, ) print(f"{r.json()['total_count']} matching artworks")
Response shape
{
"items": [
{
"id": 9012345,
"uid": "jmb-untitled-1982-skull",
"slug": "untitled-1982",
"last_lot_status": "upcoming",
"date_last_upcoming": "2026-05-14",
"currency": "USD",
"current_estimated_price": 3850000,
"current_estimated_price_min": 3200000,
"current_estimated_price_max": 4500000,
"price_momentum_12mo": 0.124,
"price_change_12mo": 421000,
"description": { "name": "Untitled", "materials": "acrylic and oilstick on canvas", "creation_year": 1982 },
"price": { "hammer_estimate_min_usd": 3200000, "hammer_estimate_max_usd": 4500000 }
}
],
"total_count": 7,
"limit": 20,
"offset": 0
}
Artwork price chart
Returns a ChartResponse for the individual artwork — historical hammer prices for every prior sale of the work, plus a forward-looking confidence band derived from the LiveArt Estimate™ model. Confidence-band points include value_low and value_high.
Similar artworks
Vector-similarity search across the catalog: returns artworks comparable in artist, period, medium, scale, and market segment. Optional preferred_currency for price normalization.
Editions
For editioned works (prints, photographs, multiples), returns every edition LiveArt has tracked, with the full lot history of each. Useful for building edition-level price ladders.
Lots
A lot is a single offering at a single sale. Many lots can point at the same underlying artwork (re-sales, multiple editions). Lot endpoints share most filters with /v1/artworks but add lot-specific fields like hammer price, premium, lot number, and sale context.
List lots
| Parameter | Type | Description |
|---|---|---|
| status · status__in | unknown · upcoming · withdrawn · sold · passed | Lot lifecycle state. |
| sale_status · sale_status__in | closed · upcoming · live · session_off | State of the parent sale. |
| auction_house_id · sale_auction_house_id | integer | Filter by auction house at the lot or sale level. |
| sale_id · sale_id__in | integer · integer[] | Restrict to specific sales. |
| sale_location · sale_location__in | string · string[] | Filter by sale location string (e.g. "New York", "London"). |
| sale_datetime__gte / __lte | datetime | Bound by sale time. |
| hammer_price_usd__gte / __lte | integer | Bound by realized hammer price (USD). |
| hammer_price_estimate_max_usd__gte / __lte | integer | Bound by high estimate (USD). |
| premium_price_usd__gte / __lte | integer | Bound by premium-inclusive price (USD). |
| artist_id · artist_uid · artwork_id · artwork_uid | integer · string | Filter by artist or artwork relations. |
| is_top | boolean | Curated "headline" lots only. |
| search | string | Free-text across artist name, artwork title, and lot notes. |
| sort | LotSortEnum | See Sorting. |
| preferred_currency | enum | Convert all monetary fields. |
Single lot response (excerpt)
{
"id": 81472019,
"lot_num": "24A",
"status": "sold",
"auction_house_id": 1,
"auction_house_name": "Sotheby's",
"sale_id": 90217,
"is_top": true,
"reserve_mark": true,
"third_party_mark": false,
"price": {
"currency": "USD",
"hammer": 3200000,
"hammer_estimate_min": 2500000,
"hammer_estimate_max": 3500000,
"premium": 3920000,
"hammer_usd": 3200000,
"premium_usd": 3920000
},
"artwork": { "id": 9012345, "name": "Untitled", "creation_year": 1982 },
"sale": { "id": 90217, "name": "Contemporary Evening Auction", "location": "New York" }
}
Follow lots
Track an upcoming lot. Combine with /v1/lots/followed to power a personalized watchlist.
Remove a lot from the watchlist. Idempotent.
Same query grammar as /v1/lots, scoped to the user's followed lots.
Sales
A sale is an auction session — typically multiple lots offered together over a single day or evening. Sale objects carry aggregate totals (hammer total, premium total, sell-through ratios) once concluded.
List sales
| Parameter | Type | Description |
|---|---|---|
| auction_house_id · auction_house_id__in | integer · integer[] | Filter by auction house. |
| name__ilike | string | Substring search on sale name. |
| status · status__in | closed · upcoming · live · session_off | Lifecycle state. |
| is_online | boolean | Filter online-only or in-room sales. |
| is_bids_streaming | boolean | Sales whose live bid stream is wired into LiveArt's feed. |
| location · location__in · location_id · location_id__in | string / integer | Filter by city/region. |
| start_datetime__gte / __lte | datetime | Bound the sale start. |
| end_datetime__gte / __lte | datetime | Bound the sale end. |
| sort | SaleSortEnum | See Sorting. |
| preferred_currency | string | Currency for the *_preferred aggregate fields. |
Sale aggregate fields
Concluded sales include rich aggregate metrics — perfect for sale-recap dashboards and benchmarking:
cumulative_total,hammer_total,premium_sold_total— top-line totals (also_usd_zeroiedand_preferredvariants)hammer_low_estimate,hammer_high_estimate— pre-sale estimate envelopelots_count,lots_count_not_sold,lots_count_sold_above_estimations,_within_,_below_— sell-through breakdownis_bids_streaming— whether LiveArt has a live feed of incoming bids
Auction Houses
Returns the canonical list of auction houses LiveArt indexes. Use the integer id for filtering anywhere in the API. Optional name query parameter for substring search.
[
{ "id": 1, "name": "Sotheby's", "slug": "sothebys", "priority_order": 1, "is_live": true },
{ "id": 2, "name": "Christie's", "slug": "christies", "priority_order": 2, "is_live": true },
{ "id": 3, "name": "Phillips", "slug": "phillips", "priority_order": 3, "is_live": true }
]
Categories
The canonical taxonomy used to classify every artwork. Use category id values with category_id__in on artwork and lot endpoints.
Health check
Public, unauthenticated endpoint that returns 200 OK when the API is reachable. Suitable for uptime monitors and deployment smoke tests.
Schemas
The API returns a small number of well-defined object types. The most important ones:
| Schema | Returned by | Description |
|---|---|---|
| ArtistSchema | artist endpoints | Biographical and market-level data on an artist. |
| ArtworkSchema | /v1/artworks, /v1/artworks/{id}/similar | Unique artwork with current estimate, momentum, and embedded DescriptionSchema + PriceSchema. |
| LotSchema | /v1/lots, /v1/lots/followed | A single auction-house offering with embedded artwork, sale, image, and price. |
| SaleSchema | /v1/sales, /v1/sales/followed | An auction session with aggregate totals and sell-through breakdown. |
| PriceSchema | artworks, lots | Native + USD + preferred-currency price triples. |
| ChartResponse | artist + artwork chart endpoints | TradingView-compatible time-series with one or more ChartSeries. |
| CategorySchema · AuctionHouseSchema | reference endpoints | Lookup tables. |
| EditionsResponse · EditionSchema | /v1/artworks/{id}/editions | Edition ladder for multiples. |
Field-level definitions for every schema are in the OpenAPI spec.
OpenAPI specification
The full machine-readable specification is published at:
https://api.liveart.ai/openapi.json
The spec is OpenAPI 3.1.0 and works out-of-the-box with code generators — Swagger Codegen, OpenAPI Generator, openapi-typescript, openapi-python-client, etc. We recommend regenerating clients on each release of your application.
Generate a typed Python client
pipx install openapi-python-client openapi-python-client generate \ --url https://api.liveart.ai/openapi.json \ --meta poetry
Generate TypeScript types
npx openapi-typescript https://api.liveart.ai/openapi.json -o ./liveart.d.ts
Changelog
The API follows additive, backwards-compatible evolution within /v1. We publish a changelog with every release.
| Date | Change |
|---|---|
| 2026-04-01 | Added preferred_currency to sale list endpoints. |
| 2026-02-12 | Added price_momentum_24mo and price_change_24mo on ArtworkSchema. |
| 2025-12-04 | Added /v1/artworks/{id}/editions. |
| 2025-10-22 | Added bulk id__in / uid__in filters on artists, artworks, lots, and sales. |
| 2025-09-01 | Initial public release of /v1. |
Need help?
Email api@liveart.ai for support, enterprise pricing, or questions about embedding LiveArt data in production systems.