Skip to content

LiveArt API · v1

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.

Base URLhttps://api.liveart.ai
Versionv1
AuthBearer token
FormatJSON / OpenAPI 3.1

Evaluating LiveArt as a data source? Talk to our team about coverage, licensing, and access.

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"

Response (truncated)

200 OK · application/json
{
  "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:

HTTP
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-facing deployments

Embedding the API in a public website, mobile app, or downstream API constitutes data redistribution and requires an Enterprise license. Internal-use Starter/Growth plans cannot be used to power public products. Contact api@liveart.ai to upgrade.

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 list
  • GET /v1/lots/shared/{token} — view a shared lot list

See Sharing & collaboration.

Authenticated vs. public response shapes

The list endpoints (/v1/artists, /v1/artworks, /v1/lots, /v1/sales) return two different object shapes depending on the caller. An authenticated request gets the full schema; an unauthenticated (or insufficiently-entitled) request gets a reduced *Public schema with the financial and proprietary fields removed. Build your clients to tolerate both — the OpenAPI spec models each 200 as an anyOf of the full and public schema.

Stripped from the public schemas

On ArtistPublicSchema the following are omitted vs. the full ArtistSchema: total_sales, market_cap, max_price, min_price, price_momentum_percentage_12mo, artworks_count, recent_lots_count, total_sales_lots_1yr, total_sales_price_median_1yr, artist_index_chart, artist_index_vector, bio, long_bio, and is_followed. The artwork, lot, and sale public schemas strip their financials analogously. Only an authenticated key with the right plan returns these fields.

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.

URL
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.

ParameterTypeDefaultDescription
limitinteger20–100Number of items per page. Max varies by endpoint (typically 100; up to 1000 for /v1/artists).
offsetinteger0Number 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.

Example
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.

SuffixMeaningExample
(none)Exact matchartist_id=142
__inMatch any of (repeat the param or comma-separate)artist_id__in=142&artist_id__in=87
__gteGreater than or equallast_hammer_price_usd__gte=100000
__lteLess than or equalcreation_year__lte=1970
__eqExplicit equality (used for enum-style fields like size)size__eq=big
__ilikeCase-insensitive substring matchname__ilike=evening sale

Worked example: blue-chip post-war works coming up at Sotheby's NY

cURL
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_sales or sort_by_market_cap with values asc / 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 familyMeaning
hammer / hammer_estimate_min / hammer_estimate_max / premiumNative sale currency (see currency)
*_usdNormalized to USD (always populated)
*_preferredConverted to the currency you passed in preferred_currency

List supported currencies

GET/v1/currencies

Returns every currency supported by the LiveArt platform. The code field (e.g. USD, EUR, GBP) is the value to pass as preferred_currency on artwork, lot, and sale endpoints.

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.

StatusMeaning
200 OKSuccessful request
204 No ContentSuccessful follow / unfollow with no body
401 UnauthorizedMissing or invalid bearer token
403 ForbiddenToken valid but plan does not grant access to this resource
404 Not FoundResource does not exist (or is not accessible to you)
422 Unprocessable EntityValidation error — see detail[] for offending fields
5xxServer error — safe to retry with exponential backoff

Validation error example

422 · application/json
{
  "detail": [
    {
      "loc": ["query", "limit"],
      "msg": "Input should be less than or equal to 100",
      "type": "less_than_equal",
      "input": "500",
      "ctx": { "le": 100 }
    }
  ]
}

Data Units

The LiveArt API uses an internal metering currency called Data Units (DU)to track consumption against your plan's allowance. Every successful authenticated request consumes DUs. Your remaining balance is returned in the response headers on every call.

How DU cost is calculated

Formula
DU = base_cost + (per_record_cost × records_returned)
  • base_cost is a fixed per-call cost that covers authentication, query planning, and serialization overhead.
  • per_record_cost is the incremental cost per record in the response body.
  • records_returned is the number of records actually returned.

Core rules

  • Requests that return a 4xx or 5xx response consume no DUs. You are never metered for failed calls.
  • Requests that return zero results still consume base_cost — the query was executed.
  • Write operations (POST, DELETE) are charged base_cost only.
  • Follow, unfollow, and share operations are not metered. DU cost is 0.
  • Unauthenticated endpoints (shared tokens, healthcheck) are not metered.

DU cost per endpoint

Single-record lookups and computed endpoints

EndpointBasePer record
GET /v1/artists/{artist_id}1
GET /v1/artists/{artist_id}/chart10
GET /v1/artworks/{artwork_id}/chart10
GET /v1/artworks/{artwork_id}/editions21.5
GET /v1/artworks/{artwork_id}/similar101.5
GET /v1/artists/{artist_id}/related101

List and search endpoints

EndpointBasePer record
GET /v1/artists21
GET /v1/artists/followed21
GET /v1/artworks21.5
GET /v1/lots21
GET /v1/lots/followed21
GET /v1/sales21
GET /v1/sales/followed21

Reference data

EndpointBasePer record
GET /v1/categories1
GET /v1/auction-houses1

Not metered (0 DU)

  • All follow and unfollow operations (POST and DELETE on /follow endpoints)
  • All share operations (POST /v1/artworks/share, POST /v1/lots/share)
  • Shared-token retrieval (GET /v1/artworks/shared/{token}, GET /v1/lots/shared/{token})
  • GET /v1/usage
  • GET /healthcheck

DU values are periodically reviewed against actual infrastructure cost. Material changes are announced via the changelog with at least 30 days notice.

Worked examples

RequestRecordsCalculationDU
GET /v1/artists/123111
GET /v1/artists202 + (1 × 20)22
GET /v1/lots?artist_id=123502 + (1 × 50)52
GET /v1/artworks?artist_id=123202 + (1.5 × 20)32
GET /v1/artworks?artist_id=1235002 + (1.5 × 500)752
GET /v1/artworks/456/similar3010 + (1.5 × 30)55
GET /v1/artists/123/related1510 + (1 × 15)25
POST /v1/artists/123/follow0

Response headers

Every successful authenticated response includes the following headers:

HeaderExampleMeaning
X-LiveArt-DataUnits25DU cost of this specific call
X-LiveArt-DataUnits-Remaining4975000Remaining DU balance in the current entitlement period
X-LiveArt-DataUnits-Period-End2026-12-31End date of the current entitlement period

These headers are exposed to browser clients via CORS. Response bodies are never modified to include DU information — consumption data lives in headers only.

The /v1/usage endpoint

For aggregated consumption queries, call:

cURL
curl https://api.liveart.ai/v1/usage \
  -H "Authorization: Bearer <your-api-token>"

Query parameters

ParameterDescription
fromStart date (ISO 8601). Defaults to the start of your current entitlement period.
toEnd date (ISO 8601). Defaults to today.
group_byOne of day, week, month, or endpoint. Optional — omitting returns the period total.

Response fields

  • Total DUs consumed in the requested window
  • Current entitlement and remaining balance
  • Period start and end dates
  • Projected end-of-period consumption based on run rate
  • Breakdown series when group_by is supplied

Approaching your allowance

  • At 80%of your period allowance, we'll contact you with your current consumption, projected end-of-period usage, and an invitation to discuss upgrade options.
  • At 100%of your period allowance, we'll contact you and Customer Success will reach out to align on a tier that matches your usage pattern.

LiveArt reserves the right to take appropriate action on accounts that materially exceed their plan's DU allowance or that demonstrate usage patterns inconsistent with good-faith use. In practice, we work with customers collaboratively — notifications come first, conversations come second, and other actions are a last resort reserved for cases involving abuse, scraping, or sustained non-response. Customers operating in good faith have nothing to worry about.

If you have questions about your allowance or want to discuss a tier change, email api@liveart.ai.

Resource overview

The API exposes the following core resources. Every endpoint is documented below with its parameters, a real request, and a representative response.

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.

GET/v1/artists
GET/v1/artists/{artist_id}
GET/v1/artists/{artist_id}/chart
GET/v1/artists/{artist_id}/related
GET/v1/artists/{artist_id}/events
GET/v1/artists/{artist_id}/sales-volume
GET/v1/artists/{artist_id}/sharpe-ratio
GET/v1/artists/{artist_id}/career-path-count
GET/v1/artists/{artist_id}/career-path-lae
GET/v1/artists/{artist_id}/returns-vs-period
GET/v1/artists/{artist_id}/compound-annual-returns
GET/v1/artists/followed
POST/v1/artists/{artist_id}/follow
DELETE/v1/artists/{artist_id}/follow

List artists

GET/v1/artists

Search and rank artists. Supports text search, top-artist filter, and ranking by total sales or market cap.

ParameterTypeDescription
limitinteger · ≤1000Page size. Default 100.
offsetinteger · ≥0Skip count.
qstringFree-text search across name and known synonyms.
sort_by_total_salesasc · descRank by lifetime auction sales (USD).
sort_by_market_capasc · descRank by LiveArt market cap estimate.
uid__instring[]Filter by canonical artist UID slugs (e.g. pablo-picasso).
id__ininteger[]Filter by numeric artist IDs.
is_topbooleanLimit to LiveArt's curated "top artist" set.

Get a single artist

GET/v1/artists/{artist_id}

Returns the full ArtistSchema, including long biography, nationality, life dates, market metrics, and the 64-dimensional artist_index_vector used by our recommendation engine.

200 OK · application/json
{
  "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

GET/v1/artists/{artist_id}/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.

200 OK · application/json
{
  "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

GET/v1/artists/{artist_id}/related

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

POST/v1/artists/{artist_id}/follow

Adds the artist to the authenticated user's follow list. Returns 204 No Content.

DELETE/v1/artists/{artist_id}/follow

Removes the artist from the follow list. Idempotent.

GET/v1/artists/followed

Paginated list of all artists the authenticated user follows.

Analytics

A suite of artist-level analytics endpoints powering the LiveArt terminal — sell-through over time, risk-adjusted returns, repeat-sale performance, and career-path distributions. Each endpoint is keyed by artist_id and returns time-series or grouped data ready to feed a chart.

Artist events

GET/v1/artists/{artist_id}/events

Notable events in the artist's life and career, ordered by date ascending. Use the type filter to narrow to Life Events, Major Exhibitions, Major Publications, or Major Sales. Only visible events are returned.

Sales volume

GET/v1/artists/{artist_id}/sales-volume

Auction sales volume over time, broken down by outcome bucket. Each item represents a medium/category (e.g. Paintings, Prints) or the overall total (category_id = null). The dates array and the four count arrays — lots_above_estimate, lots_within_estimate, lots_below_estimate, and lots_not_sold — are aligned by index.

Sharpe ratio

GET/v1/artists/{artist_id}/sharpe-ratio

Risk-adjusted performance for the artist over 1, 2, 3, 5, 7, and 10-year horizons. A ratio above 1.0 is generally considered good; above 2.0 is excellent. Values may be null for periods with insufficient sales history.

Career path — by artwork count

GET/v1/artists/{artist_id}/career-path-count

Number of artworks per medium and creation year — a timeline of an artist's creative output. The year range is constrained by birth and death years where known. Useful for stacked bar/area charts of output volume across the career.

Career path — by LiveArt estimate

GET/v1/artists/{artist_id}/career-path-lae

Same shape as career-path-count but weighted by current LiveArt estimated value (USD) rather than artwork count — useful for visualizing the financial weight of each period in an artist's career.

Returns vs. holding period

GET/v1/artists/{artist_id}/returns-vs-period

Compound annual return (CAR) for every repeat-sale pair of the artist's artworks. Each data point is one resale event: car is the percentage annualized return (e.g. 12.5 = 12.5%/yr) and period_months is the months between the two auctions. Pairs with a holding period under 12 months are excluded.

Compound annual returns by year

GET/v1/artists/{artist_id}/compound-annual-returns

Median compound annual return across all of the artist's repeat sales, grouped by calendar year. car is expressed as a percentage (e.g. 8.7 = 8.7%/yr). Years with no repeat sales are omitted.

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.

GET/v1/artworks
GET/v1/artworks/recommended
GET/v1/artworks/{artwork_id}/chart
GET/v1/artworks/{artwork_id}/cagr
GET/v1/artworks/{artwork_id}/similar
GET/v1/artworks/{artwork_id}/editions
GET/v1/artworks/followed
POST/v1/artworks/{artwork_id}/follow
DELETE/v1/artworks/{artwork_id}/follow
POST/v1/artworks/share
GET/v1/artworks/shared/{token}

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

ParameterTypeDescription
artist_id · artist_id__ininteger · integer[]Restrict to one or more artists.
category_id · category_id__ininteger · integer[]Painting, sculpture, photography, etc. (see categories).
creation_year__gte / __lteintegerBound the year of creation.
size__insmall · medium · big · otherLiveArt's normalized size buckets.
measurements_*_cm__gte / __ltenumberNumeric bounds for height, width, depth (cm).
materials · materials__instring · string[]Filter by medium (oil on canvas, bronze, etc.).
last_lot_statusunknown · upcoming · withdrawn · sold · passedMost recent lot outcome for this artwork.
date_last_sold__gte / __ltedateBound by date of last completed sale.
date_last_upcoming__gte / __ltedateBound by upcoming sale date.
current_estimated_price__gte / __ltenumberBound by LiveArt Estimate™ value.
price_momentum_12mo__gte / __ltenumber12-month momentum percentile (-1.0 to 1.0).
last_hammer_price_usd__gte / __lteintegerMost recent hammer price in USD.
last_premium_price_usd__gte / __lteintegerMost recent premium-inclusive price (USD).
without_editionsbooleanExclude editioned multiples — show only unique works.
with_imagesbooleanRestrict to artworks with at least one image. Default false.
sale_auction_house_id__ininteger[]Restrict to upcoming sales at specific houses.
sale_start_datetime__gte / __ltedatetimeBound the upcoming sale window.
market_cap__gtenumberMinimum artist market cap (filter out micro-cap artists).
preferred_currencyenumConvert prices to one of 16 supported currencies.
sortArtworkSortEnumSee Sorting.
sort_by_priceasc · descConvenience 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"

Response shape

200 OK · application/json
{
  "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
}
Working with images

Artwork and lot image URLs (image.large_url, image.medium_url, image.thumbnail_url) are served through Cloudflare Image Resizing, with the transform baked into the path after /cdn-cgi/image/. The default fit=cover crops the work to fill the requested box — fine for square thumbnails, but it clips tall or wide pieces.

To render the complete, uncropped work, rewrite fit=cover to fit=contain; Cloudflare then returns the image at its true aspect ratio (letterboxed within the box). The width, height, quality, and format params can be adjusted the same way.

Image URL
# Default — fills a square box, crops the work:
https://images.liveart.io/cdn-cgi/image/width=240,height=240,fit=cover,quality=85,format=auto/images/230552980/a13ac2b0...

# Rewrite fit=cover -> fit=contain for the full, uncropped work:
https://images.liveart.io/cdn-cgi/image/width=240,height=240,fit=contain,quality=85,format=auto/images/230552980/a13ac2b0...

Artwork price chart

GET/v1/artworks/{artwork_id}/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

GET/v1/artworks/{artwork_id}/similar

Vector-similarity search across the catalog: returns artworks comparable in artist, period, medium, scale, and market segment. Optional preferred_currency for price normalization.

Editions

GET/v1/artworks/{artwork_id}/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.

CAGR

GET/v1/artworks/{artwork_id}/cagr

Compound Annual Growth Rate implied by the LiveArt Estimate™ price prediction — the smoothed yearly growth needed to reach the predicted price from the current baseline. A value of 0.12 means 12% per year. Returns 404 if the artwork has no price prediction data available.

Recommended artworks

GET/v1/artworks/recommended

Personalized artwork recommendations for the authenticated user. Sourced from two signals: artworks similar to ones the user already follows (via pre-computed similarity scores), plus recent works by artists the user follows. Already-followed artworks are excluded from the result set.

Follow / unfollow

POST/v1/artworks/{artwork_id}/follow

Adds the artwork to the authenticated user's follow list. Returns 204 No Content.

DELETE/v1/artworks/{artwork_id}/follow

Removes the artwork from the follow list. Idempotent.

GET/v1/artworks/followed

Paginated list of artworks the authenticated user follows, ordered by most recently added.

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.

GET/v1/lots
GET/v1/lots/followed
POST/v1/lots/{lot_id}/follow
DELETE/v1/lots/{lot_id}/follow
POST/v1/lots/share
GET/v1/lots/shared/{token}

List lots

ParameterTypeDescription
status · status__inunknown · upcoming · withdrawn · sold · passedLot lifecycle state.
sale_status · sale_status__inclosed · upcoming · live · session_offState of the parent sale.
auction_house_id · sale_auction_house_idintegerFilter by auction house at the lot or sale level.
sale_id · sale_id__ininteger · integer[]Restrict to specific sales.
sale_location · sale_location__instring · string[]Filter by sale location string (e.g. "New York", "London").
sale_datetime__gte / __ltedatetimeBound by sale time.
hammer_price_usd__gte / __lteintegerBound by realized hammer price (USD).
hammer_price_estimate_max_usd__gte / __lteintegerBound by high estimate (USD).
premium_price_usd__gte / __lteintegerBound by premium-inclusive price (USD).
artist_id · artist_uid · artwork_id · artwork_uidinteger · stringFilter by artist or artwork relations.
is_topbooleanCurated "headline" lots only.
searchstringFree-text across artist name, artwork title, and lot notes.
sortLotSortEnumSee Sorting.
preferred_currencyenumConvert all monetary fields.

Single lot response (excerpt)

200 OK · application/json
{
  "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

POST/v1/lots/{lot_id}/follow

Track an upcoming lot. Combine with /v1/lots/followed to power a personalized watchlist.

DELETE/v1/lots/{lot_id}/follow

Remove a lot from the watchlist. Idempotent.

GET/v1/lots/followed

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.

GET/v1/sales
GET/v1/sales/followed
POST/v1/sales/{sale_id}/follow
DELETE/v1/sales/{sale_id}/follow

List sales

ParameterTypeDescription
auction_house_id · auction_house_id__ininteger · integer[]Filter by auction house.
name__ilikestringSubstring search on sale name.
status · status__inclosed · upcoming · live · session_offLifecycle state.
is_onlinebooleanFilter online-only or in-room sales.
is_bids_streamingbooleanSales whose live bid stream is wired into LiveArt's feed.
location · location__in · location_id · location_id__instring / integerFilter by city/region.
start_datetime__gte / __ltedatetimeBound the sale start.
end_datetime__gte / __ltedatetimeBound the sale end.
sortSaleSortEnumSee Sorting.
preferred_currencystringCurrency 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_zeroied and _preferred variants)
  • hammer_low_estimate, hammer_high_estimate — pre-sale estimate envelope
  • lots_count, lots_count_not_sold, lots_count_sold_above_estimations, _within_, _below_ — sell-through breakdown
  • is_bids_streaming — whether LiveArt has a live feed of incoming bids

Collectables

A collectableis a work in a user's own collection — the building block of the LiveArt portfolio/inventory tools. Unlike the read-only market resources above, collectables are fully read-write: create a record, attach an image, and maintain its acquisition details, appraisals, provenance chain, and private sale history. Every collectable is scoped to the authenticated user; there is no public variant.

Authentication

All collectable endpoints require a bearer token and operate only on the calling user's own records. Reads are metered like other list/detail calls; writes (POST, PATCH, DELETE) follow the standard Data Units write rules.

GET/v1/collectables
POST/v1/collectables
GET/v1/collectables/{collectable_id}
PATCH/v1/collectables/{collectable_id}
DELETE/v1/collectables/{collectable_id}
POST/v1/collectables/{collectable_id}/image
GET/v1/collectables/{collectable_id}/acquired
PATCH/v1/collectables/{collectable_id}/acquired
GET/v1/collectables/{collectable_id}/appraisals
POST/v1/collectables/{collectable_id}/appraisals
PATCH/v1/collectables/{collectable_id}/appraisals/{appraisal_id}
DELETE/v1/collectables/{collectable_id}/appraisals/{appraisal_id}
GET/v1/collectables/{collectable_id}/provenance
POST/v1/collectables/{collectable_id}/provenance
PATCH/v1/collectables/{collectable_id}/provenance/{provenance_id}
DELETE/v1/collectables/{collectable_id}/provenance/{provenance_id}
GET/v1/collectables/{collectable_id}/sales
POST/v1/collectables/{collectable_id}/sales
PATCH/v1/collectables/{collectable_id}/sales/{sale_id}
DELETE/v1/collectables/{collectable_id}/sales/{sale_id}

List & create collectables

GET/v1/collectables

Returns the authenticated user's collection as a paginated CollectablesListResponse (items, total_count, limit, offset). Each item is a CollectableSchema with the LiveArt machine estimate, optional manual valuation, momentum, and physical attributes.

POST/v1/collectables

Create a collectable. Body is multipart/form-data (so an image can be attached at creation): artist_id, category_id, edition_unique_type, optional suggested_artwork_id (to seed from a known LiveArt artwork), and an optional image file. Returns the created CollectableSchema. Refine the remaining fields afterward with PATCH.

cURL
# multipart/form-data — image optional
curl -X POST https://api.liveart.ai/v1/collectables \
  -H "Authorization: Bearer $LIVEART_API_KEY" \
  -F "artist_id=142" \
  -F "category_id=1" \
  -F "edition_unique_type=unique" \
  -F "image=@/path/to/work.jpg"
200 OK · application/json
{
  "id": 4821,
  "uid": "c_8f3a2b1d",
  "title": "Untitled (Skull)",
  "artist_id": 142,
  "artist_name": "Jean-Michel Basquiat",
  "category_id": 1,
  "category_name": "Painting",
  "creation_year": 1982,
  "current_estimated_price": 3850000,
  "machine_estimated_price": 3720000,
  "manual_price_value": null,
  "selected_price_type": "machine",
  "price_momentum_12mo": 0.124,
  "condition": "good",
  "signature": "signed verso",
  "measurements_unit": "cm",
  "measurements_height": 183,
  "measurements_width": 173,
  "material_ids": [4, 11],
  "substrate_ids": [2],
  "current_location": "New York, NY",
  "image_thumbnail_url": "https://cdn.liveart.ai/..."
}

Get, update & delete

GET/v1/collectables/{collectable_id}

Full CollectableSchema for a single record.

PATCH/v1/collectables/{collectable_id}

Partial update via CollectableUpdateInput. Every field is optional — send only what changed (title, valuation choice via selected_price_type / manual_price_value, condition, measurements, edition data, and the material_ids / substrate_ids / surface_ids / damage_ids arrays, which reference the reference-data tables).

DELETE/v1/collectables/{collectable_id}

Permanently removes the collectable and its child records (appraisals, provenance, sales).

Image

POST/v1/collectables/{collectable_id}/image

Upload or replace the collectable's image. multipart/form-data with a single image file part. Returns the updated record with fresh image_url / image_thumbnail_url.

Acquisition details

GET/v1/collectables/{collectable_id}/acquired

How and when the work was acquired — an AcquiredSchema (date, price + currency, location, source type and seller/dealer/auction-house name). When use_instead_of_estimatesis set, the acquisition price anchors the collectable's value instead of the machine estimate.

PATCH/v1/collectables/{collectable_id}/acquired

Update acquisition details via AcquiredUpdateInput (partial).

Appraisals

A time-stamped valuation history (insurance, market, etc.). Each record is an AppraisalSchema with value + value_usd, type, date, and company_name.

GET/v1/collectables/{collectable_id}/appraisals

List all appraisals for the collectable.

POST/v1/collectables/{collectable_id}/appraisals

Add an appraisal (AppraisalCreateInput).

POST body
POST /v1/collectables/4821/appraisals
{
  "type": "insurance",
  "value": 4200000,
  "currency": "USD",
  "date": "2026-03-01",
  "company_name": "AXA Art",
  "is_best_guess": false
}
PATCH/v1/collectables/{collectable_id}/appraisals/{appraisal_id}

Update an appraisal (partial).

DELETE/v1/collectables/{collectable_id}/appraisals/{appraisal_id}

Remove an appraisal.

Provenance

The ownership chain — an ordered list of ProvenanceSchema records (owner, location, year_from / year_to, and is_up_to_present for the current holder).

GET/v1/collectables/{collectable_id}/provenance

List provenance records.

POST/v1/collectables/{collectable_id}/provenance

Add a provenance record (ProvenanceCreateInput).

PATCH/v1/collectables/{collectable_id}/provenance/{provenance_id}

Update a provenance record (partial).

DELETE/v1/collectables/{collectable_id}/provenance/{provenance_id}

Remove a provenance record.

Sale records

Private sale events for the work — a CollectableSaleSchema (value + value_usd, date, location, type, optional auction_house_id and seller_name). Distinct from the public /v1/sales auction sessions.

GET/v1/collectables/{collectable_id}/sales

List the collectable's sale records.

POST/v1/collectables/{collectable_id}/sales

Record a sale (CollectableSaleCreateInput).

PATCH/v1/collectables/{collectable_id}/sales/{sale_id}

Update a sale record (partial).

DELETE/v1/collectables/{collectable_id}/sales/{sale_id}

Remove a sale record.

Auction Houses

GET/v1/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.

200 OK · application/json
[
  { "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 }
]

Auction Locations

GET/v1/auction-locations

Returns every known auction sale location (city/venue). Pass an optional name query parameter for substring/autocomplete search. The name value can be passed to the sale_location (or sale_location__in) filter on /v1/lots and /v1/sales.

Categories

GET/v1/categories

The canonical taxonomy used to classify every artwork. Use category id values with category_id__in on artwork and lot endpoints.

Reference data

Controlled vocabularies for the physical attributes of a work. These back the condition/medium selectors in the collection tools and the structured *_ids fields on CollectableSchema. Each returns a flat array of { id, name, label } and accepts an optional name query parameter for substring/autocomplete search.

GET/v1/materials
GET/v1/substrates
GET/v1/surfaces
GET/v1/damages
GET/v1/plans
GET/v1/materials

Media an artwork can be made of (oil, acrylic, bronze, …). Use the id values in material_ids when creating/updating a collectable.

200 OK · application/json
[
  { "id": 4,  "name": "oil",    "label": "Oil" },
  { "id": 11, "name": "canvas", "label": "Canvas" },
  { "id": 27, "name": "bronze", "label": "Bronze" }
]
GET/v1/substrates

Support surfaces a work is executed on (canvas, paper, panel, …) — feeds substrate_ids.

GET/v1/surfaces

Surface treatments/finishes — feeds surface_ids.

GET/v1/damages

Condition/damage descriptors used in appraisals and condition reports — feeds damage_ids. (Same { id, name, label } shape as the others.)

Plans

GET/v1/plans

The catalog of API plan tiers as PlanSchema objects: slug, display_name, du_limit (Data Units per period_days), rps_limit / rpm_limit, throttle_multiplier, price_usd, and a features blob. Drives plan-comparison UI without hard-coding limits client-side.

Market

GET/v1/market/index-chart

The global LiveArt Art Index as a time series, optionally overlaid with one or more traditional financial benchmarks for comparison. Returns a GlobalArtIndexChartResponse with art_data (the art index points) and finance_data (one labeled series per requested benchmark).

Query parameters

ParameterTypeDescription
financeFinanceQuote[]Benchmarks to overlay (repeat the param). One or more of SNP500, GOLD, DOW_JONES, MSCI_WORLD_REAL_ESTATE, BITCOIN_USD. Omit for the art index alone.
200 OK · application/json
{
  "art_data": [
    { "time": "2020-01-01", "value": 100.0 },
    { "time": "2021-01-01", "value": 118.6 },
    { "time": "2022-01-01", "value": 131.2 }
  ],
  "finance_data": [
    {
      "id": "SNP500",
      "label": "S&P 500",
      "data": [
        { "time": "2020-01-01", "value": 100.0 },
        { "time": "2021-01-01", "value": 116.3 }
      ]
    }
  ]
}

Sharing & collaboration

Two POST endpoints turn a private list of artworks or lots into a tokenized URL that can be viewed without authentication — ideal for sending an advisor's pre-sale recommendations to a collector.

POST/v1/artworks/share

Body: { "artwork_ids": [int], "currency": "USD" }. Returns { "token": "abc123…" }.

GET/v1/artworks/shared/{token}

Public — no auth required. Returns the same ArtworksResponse as /v1/artworks.

POST/v1/lots/share

Body: { "lot_ids": [int], "currency": "USD" }. Returns a token.

GET/v1/lots/shared/{token}

Public — no auth required.

Health check

GET/healthcheck

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:

SchemaReturned byDescription
ArtistSchemaartist endpointsBiographical and market-level data on an artist.
ArtworkSchema/v1/artworks, /v1/artworks/{id}/similarUnique artwork with current estimate, momentum, and embedded DescriptionSchema + PriceSchema.
LotSchema/v1/lots, /v1/lots/followedA single auction-house offering with embedded artwork, sale, image, and price.
SaleSchema/v1/sales, /v1/sales/followedAn auction session with aggregate totals and sell-through breakdown.
PriceSchemaartworks, lotsNative + USD + preferred-currency price triples.
ChartResponseartist + artwork chart endpointsTradingView-compatible time-series with one or more ChartSeries.
CategorySchema · AuctionHouseSchemareference endpointsLookup tables.
EditionsResponse · EditionSchema/v1/artworks/{id}/editionsEdition ladder for multiples.
CollectableSchema/v1/collectablesA work in a user's collection, with embedded acquisition, appraisal, provenance, and sale children.
AppraisalSchema · ProvenanceSchema · CollectableSaleSchema · AcquiredSchemacollectable sub-resourcesValuation history, ownership chain, private sales, and acquisition details.
MaterialSchema · PlanSchemareference-data endpoints{ id, name, label } vocabularies (materials/substrates/surfaces/damages) and the API plan catalog.
ArtistPublicSchema · ArtworksPublicResponse · LotsPublicResponse · SalesPublicResponseunauthenticated list callsReduced variants returned to anonymous/lower-tier callers — financial and proprietary fields removed (see Authentication).

Field-level definitions for every schema are in the OpenAPI spec.

OpenAPI specification

The full machine-readable specification is published at:

URL
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

shell
pipx install openapi-python-client
openapi-python-client generate \
  --url https://api.liveart.ai/openapi.json \
  --meta poetry

Generate TypeScript types

shell
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.

DateChange
2026-05-28Added the Collectables API — read-write personal-collection records (/v1/collectables) with image upload, acquisition details, appraisals, provenance, and private sale history.
2026-05-14Added reference-data vocabularies (/v1/materials, /v1/substrates, /v1/surfaces, /v1/damages), /v1/plans, and the global art-vs- finance index endpoint /v1/market/index-chart.
2026-05-02List endpoints now return reduced *Public schemas to unauthenticated and lower-tier callers (financial/proprietary fields removed); each 200 is modeled as an anyOf of the full and public schema.
2026-04-30Added artist analytics suite (/v1/artists/{id}/sales-volume, /sharpe-ratio, /career-path-count, /career-path-lae, /returns-vs-period, /compound-annual-returns, /events), artwork CAGR (/v1/artworks/{id}/cagr), artwork follow + recommendations (/v1/artworks/{id}/follow, /v1/artworks/followed, /v1/artworks/recommended), and reference endpoints /v1/auction-locations and /v1/currencies.
2026-04-22Introduced Data Units (DU) metering. Added /v1/usage endpoint and X-LiveArt-DataUnits* response headers.
2026-04-01Added preferred_currency to sale list endpoints.
2026-02-12Added price_momentum_24mo and price_change_24mo on ArtworkSchema.
2025-12-04Added /v1/artworks/{id}/editions.
2025-10-22Added bulk id__in / uid__in filters on artists, artworks, lots, and sales.
2025-09-01Initial public release of /v1.

Need help?

Email api@liveart.ai for support, enterprise pricing, or questions about embedding LiveArt data in production systems.