BrickPickerBrickPicker
Public API · v1Reseller plan

LEGO market data,
one request away.

Every set and minifig with our computed values, live Amazon & Walmart retail pricing, and your own brickfolio and sales — as clean REST + JSON. Bearer-token auth, USD.

12 endpoints·1,000 req / day·JSON · USD
curl https://api.brickpicker.com/api/v1/set/75192 \
  -H "Authorization: Bearer bp_live_..."

At a glance

Base URL
https://api.brickpicker.com/api/v1
Auth
Bearer token (per-user)
Rate limit
1,000 req / key / UTC day
Format
JSON · USD only

Getting started

Authentication

Every request must include your personal API key in the Authorization header using the Bearer scheme. Keys are managed in the app at /account/api-keys and are visible exactly once at creation time. We only store the SHA-256 hash — we can't recover a lost key, you'll have to create a new one.

bash
# Every request needs this header:
Authorization: Bearer bp_live_<48-hex-chars>

# Quick test:
curl https://api.brickpicker.com/api/v1/set/75192 \
  -H "Authorization: Bearer bp_live_..."

Up to 5 active keys per account. Revoking a key takes effect immediately — any in-flight requests using it will start returning 401.

Fair use

Rate limits

Each API key gets 1,000 requests per UTC day. Counters reset at midnight UTC. Every successful response includes your current budget in both response headers and the body envelope:

http
HTTP/1.1 200 OK
X-RateLimit-Limit: 1000
X-RateLimit-Remaining: 487
X-RateLimit-Reset: 2026-05-15T00:00:00Z
X-Request-Id: 7c4a...

{
  "data": { ... },
  "meta": {
    "request_id": "7c4a...",
    "rate_limit": { "limit": 1000, "remaining": 487, "reset": "2026-05-15T00:00:00Z" }
  }
}

When you exceed the quota you'll get 429 Too Many Requests with the standard error envelope. Sleep until reset and try again.

When things go wrong

Errors

All errors return JSON in this shape:

json
{
  "error": {
    "code": "QuotaExceeded",
    "message": "Daily quota of 1000 requests exceeded. Resets at 2026-05-15T00:00:00Z."
  }
}
HTTPcodeWhen
400BadRequestInvalid query parameter (e.g. negative limit)
401MissingApiKey / InvalidApiKeyNo bearer header, or key is unknown/revoked
403TierRequiredEndpoint requires Reseller plan
404NotFoundSet or minifig number not in our catalog
429QuotaExceededDaily budget exhausted — retry after the reset
500InternalErrorSomething went wrong on our end — please retry

Reference · 13 endpoints

Endpoints

Thirteen read-only endpoints: set + minifig lookup and per-set value history (data we already publish on the site), catalog discovery (search sets, search minifigs, list themes), and your own brickfolio summary, brickfolio holdings, and sales ledger.

Note: endpoints that can return many rows — catalog search, your brickfolio holdings, and your sales ledger — are paginated for performance and predictable latency. Page through with limit and offset until pagination.has_more is false. Catalog search is identity-only (no values) — look a set up with /set/{number} for its valuation.

Versioning & conventions: every response carries meta.api_version and an X-API-Version header. All list endpoints share one pagination shape (limit/offset{ total, limit, offset, has_more },totalalways an integer); all dates are ISO-8601; unknown query params are rejected with a 400. Breaking changes are announced via the changelog below and the version field — we won't change a response shape on you silently.

Changelog

2026-06-27 (v1): standardized pagination across all list endpoints (/salesledger now uses limit/offset/has_more with integer total, replacingpage/totalPages); added meta.api_version +X-API-Version; brickfolio_id now scopes /brickfolio/entries(404 on an id that isn't yours); unknown query params now return 400; all dates normalized to ISO-8601; default page size 50 (max 250) across endpoints; rate-limit headers + Retry-After on 429s. Earlier: /set minifigs changed from an integer count to an array — the count is now minifigs_count.

Sets, minifigs & catalog

Look up any set or minifig by number, or search the catalog by name or theme.

GET/set/{number}
Parity

Set metadata, new + used value, and live retailer pricing

Returns set metadata (theme, pieces, MSRP, release/retire dates), our computed market value in USD for both conditions — current_value_usd is the new/sealed value and used_value_usd is the used value — and live retailer pricing from our internal price-status table.

Parameters

NameInTypeReqDescription
numberpathstringyesLEGO set number (e.g. 75192)
Request
curl https://api.brickpicker.com/api/v1/set/75192 \
  -H "Authorization: Bearer bp_live_..."
Response
{
  "data": {
    "set_number": "75192",
    "title": "Millennium Falcon",
    "theme": "Star Wars",
    "pieces": 7541,
    "minifigs_count": 8,
    "minifigs": ["sw0532", "sw0661", "sw0676", "sw0700"],
    "barcodes": { "upc": "673419267656", "ean": "0673419267656" },
    "msrp_usd": 849.99,
    "release_date": "2017-10-01",
    "retire_date": null,
    "image_url": "https://images.brickpicker.com/images/sets/75192.jpg",
    "new_value_usd": 1199.50,
    "used_value_usd": 949.00,
    "value_range": { "low": 1050, "high": 1399, "calculated_at": "..." },
    "retailers": [
      { "retailer": "lego", "current_price": 849.99, "in_stock": false, ... },
      { "retailer": "amazon", "current_price": 1199.99, "in_stock": true, ... }
    ]
  },
  "meta": {
    "request_id": "1a2b3c4d-...",
    "rate_limit": { "limit": 1000, "remaining": 999, "reset": "2026-05-15T00:00:00Z" }
  }
}
GET/minifig/{number}
Parity

Minifig metadata + current value

Returns a single minifigure by its BrickLink part number with its current market value (USD).

Parameters

NameInTypeReqDescription
numberpathstringyesBrickLink minifig number (e.g. sw0001a)
Request
curl https://api.brickpicker.com/api/v1/minifig/sw0001a \
  -H "Authorization: Bearer bp_live_..."
Response
{
  "data": {
    "minifig_number": "sw0001a",
    "name": "Luke Skywalker",
    "color": "Light Bluish Gray",
    "image_url": "https://...",
    "current_value_usd": 18.42,
    "set_count": 3,
    "sets": ["3343", "7121", "75428"]
  },
  "meta": { ... }
}
GET/catalog/themes
Parity

List all LEGO themes + set counts

Every theme in the catalog with its set count. Small reference list (not paginated) — handy for building search filters.

Request
curl https://api.brickpicker.com/api/v1/catalog/themes \
  -H "Authorization: Bearer bp_live_..."
Response
{
  "data": {
    "themes": [
      { "theme": "Star Wars", "set_count": 784 },
      { "theme": "City", "set_count": 777 }
    ]
  },
  "meta": { ... }
}
GET/set/{number}/history
Parity

Finalized monthly market-value history for one set

Per-set value time series, finalized months only (the unstable in-progress month is excluded). condition = sealed (default) or used.

Parameters

NameInTypeReqDescription
numberpathstringyesLEGO set number (e.g. 75192)
conditionquerystringnosealed (default) or used
Request
curl "https://api.brickpicker.com/api/v1/set/75192/history?condition=sealed" \
  -H "Authorization: Bearer bp_live_..."
Response
{
  "data": {
    "set_number": "75192",
    "condition": "sealed",
    "history": [
      { "month": "2017-09", "value_usd": 1198, "range_low": 919, "range_high": 1599, "sales_count": 62, "event": null },
      { "month": "2026-05", "value_usd": 772, "range_low": 630.05, "range_high": 690.37, "sales_count": 71, "event": null }
    ]
  },
  "meta": { ... }
}

Retail Watch

Live Amazon & Walmart price, 1P/3P Buy Box, and what changed — built for dynamic repricing.

GET/set/{number}/retail-prices
Reseller

Live Amazon & Walmart retail price + Buy Box owner (1P/3P) for a set

For dynamic pricing: the current Amazon and Walmart price, what changed and when, all-time-low, in-stock, and whether the retailer sells it directly (1P) or only third-party sellers remain (3P — often a set that has left retail and is climbing). Pass a set number here, or use /retail-prices to resolve by ASIN/UPC.

Parameters

NameInTypeReqDescription
numberpathstringyesLEGO set number (e.g. 75192)
Request
curl https://api.brickpicker.com/api/v1/set/75192/retail-prices \
  -H "Authorization: Bearer bp_live_..."
Response
{
  "data": {
    "setNumber": "75192",
    "name": "Millennium Falcon",
    "asin": "B075SDMND1",
    "upc": "673419267656",
    "ean": "0673419267656",
    "amazon": { "price": 849.84, "sellerType": "third_party", "changedAt": "2026-06-30T00:00:00Z", "lastChange": -12.15, "flip1pTo3p": false, "atLowest": false, "lowest": 799.99, "inStock": true },
    "walmart": { "price": 849.95, "sellerType": "retailer", "changedAt": "2026-06-28T00:00:00Z", "lastChange": 0, "flip1pTo3p": false, "atLowest": false, "lowest": 809.00, "inStock": true }
  },
  "meta": { "request_id": "...", "rate_limit": { "limit": 1000, "remaining": 999, "reset": "..." } }
}
GET/retail-prices
Reseller

Look up one set's live Amazon/Walmart price by set number, ASIN, or UPC

Resolve a single set by whichever identifier you have — set, asin, or upc/ean — and get its current Amazon/Walmart price, 1P/3P Buy Box, movement, and all-time-low. Built for catalogs keyed by ASIN/UPC (e.g. Shopify). Returns null if nothing matches.

Parameters

NameInTypeReqDescription
setquerystringnoLEGO set number (e.g. 75192)
asinquerystringnoAmazon ASIN (e.g. B075SDMND1)
upcquerystringnoUPC or EAN
Request
curl "https://api.brickpicker.com/api/v1/retail-prices?asin=B075SDMND1" \
  -H "Authorization: Bearer bp_live_..."
Response
{
  "data": {
    "setNumber": "75192",
    "name": "Millennium Falcon",
    "asin": "B075SDMND1",
    "upc": "673419267656",
    "amazon": { "price": 849.84, "sellerType": "third_party", "changedAt": "2026-06-30T00:00:00Z", "lastChange": -12.15, "flip1pTo3p": false, "atLowest": false, "lowest": 799.99, "inStock": true },
    "walmart": { "price": 849.95, "sellerType": "retailer", "changedAt": "2026-06-28T00:00:00Z", "lastChange": 0, "flip1pTo3p": false, "atLowest": false, "lowest": 809.00, "inStock": true }
  },
  "meta": { "request_id": "...", "rate_limit": { "limit": 1000, "remaining": 999, "reset": "..." } }
}
GET/brickfolio/retail-watch
Reseller

Amazon/Walmart price, movement + margin for your holdings — filterable

Retail Watch across your holdings: for each set, the current Amazon/Walmart price, what changed and when, 1P/3P Buy Box owner, all-time-low flag, in-stock, and your margin vs cost. Every row carries asin/upc/ean so a Shopify catalog keyed by identifier can match. Filter with changed_within (the efficient poll — pull only the movers), since, or asin/upc.

Parameters

NameInTypeReqDescription
changed_withinquerystringno30m | 3h | 24h | 7d — only sets whose price moved within this window
sincequerystringnoISO-8601 timestamp — only sets changed on/after this (alternative to changed_within)
asinquerystringnoASIN, or comma-separated ASINs — return only these sets
upcquerystringnoUPC/EAN, or comma-separated — return only these sets
Request
# only the holdings that moved in the last 3 hours
curl "https://api.brickpicker.com/api/v1/brickfolio/retail-watch?changed_within=3h" \
  -H "Authorization: Bearer bp_live_..."
Response
{
  "data": [
    {
      "setNumber": "71043",
      "name": "Hogwarts Castle",
      "asin": "B07VDCX8VN",
      "upc": "673419303323",
      "ean": "0673419303323",
      "paid": 349.99,
      "amazon": { "price": 469.99, "sellerType": "retailer", "changedAt": "2026-07-06T18:22:00Z", "lastChange": -5.00, "flip1pTo3p": false, "atLowest": false, "lowest": 419.99, "inStock": true },
      "walmart": { "price": 624.95, "sellerType": "third_party", "changedAt": "2026-07-05T00:00:00Z", "lastChange": 5.00, "flip1pTo3p": false, "atLowest": false, "lowest": 599.00, "inStock": true }
    }
  ],
  "meta": { "request_id": "...", "rate_limit": { "limit": 1000, "remaining": 998, "reset": "..." } }
}

Your brickfolio & sales

Programmatic access to your own holdings, analytics, and sales ledger.

GET/brickfolio
Parity

Your brickfolio summaries + monthly cost-basis periods

Returns each brickfolio the authenticated user owns with its rollups (set/item counts, cost basis, current value, unrealized gain) plus a monthly cost-basis history. Lightweight and fast regardless of collection size — the per-holding entries are served separately and paginated via GET /brickfolio/entries. Identity is taken from the API key.

Request
curl https://api.brickpicker.com/api/v1/brickfolio \
  -H "Authorization: Bearer bp_live_..."
Response
{
  "data": {
    "brickfolios": [
      {
        "id": 42,
        "name": "Main",
        "owned_set_count": 87,
        "owned_item_count": 112,
        "total_cost_basis_usd": 12450.00,
        "total_current_value_usd": 18920.50,
        "unrealized_gain_loss_usd": 6470.50
      }
    ],
    "monthly_periods": [
      { "month": "2025-01", "entry_count": 3, "items": 3, "cost_basis_usd": 450 }
    ]
  },
  "meta": { ... }
}
GET/brickfolio/entries
Parity

Your holdings, paginated (50 per page)

Paginated list of every holding across all your brickfolios, each value-enriched and tagged with brickfolio_id (group client-side). Pass brickfolio_id to scope to a single folio (returns 404 if that id isn't yours). Default 50 per page, max 250. Page through with offset until pagination.has_more is false.

Parameters

NameInTypeReqDescription
limitqueryintegernoItems per page (default 50, max 250)
offsetqueryintegernoPagination offset (default 0)
brickfolio_idqueryintegernoScope to one brickfolio (404 if not yours). Omit for all folios.
Request
curl "https://api.brickpicker.com/api/v1/brickfolio/entries?limit=100&offset=0" \
  -H "Authorization: Bearer bp_live_..."
Response
{
  "data": {
    "entries": [
      {
        "brickfolio_id": 42,
        "set_number": "75192",
        "title": "Millennium Falcon",
        "theme": "Star Wars",
        "quantity": 1,
        "condition": "new",
        "purchase_price_usd": 599.99,
        "purchase_date": "2024-11-20",
        "status": "owned",
        "current_value_usd": 772.00,
        "total_current_value_usd": 772.00,
        "unrealized_gain_loss_usd": 172.01,
        "unrealized_gain_loss_pct": 28.7
      }
    ],
    "pagination": { "total": 664, "limit": 100, "offset": 0, "has_more": true }
  },
  "meta": { ... }
}
GET/brickfolio/analytics
Parity

Your portfolio analytics — totals, ROI, top movers, value history

Your own collection metrics: total sets/items, cost basis, current value, unrealized gain/loss + ROI, your top gainer and loser, and value-over-time. period = 30d | 90d | 1y (default 1y).

Parameters

NameInTypeReqDescription
periodquerystringno30d | 90d | 1y (default 1y)
Request
curl "https://api.brickpicker.com/api/v1/brickfolio/analytics?period=1y" \
  -H "Authorization: Bearer bp_live_..."
Response
{
  "data": {
    "period": "1y",
    "summary": {
      "total_sets": 664,
      "total_items": 1252,
      "total_cost_basis_usd": 68055.23,
      "total_current_value_usd": 104682.46,
      "unrealized_gain_loss_usd": 36145.89,
      "unrealized_gain_loss_pct": 53.1,
      "top_gainer": { "set_number": "75192", "gain_loss_pct": 71.2 },
      "top_loser": { "set_number": "...", "loss_pct": -8.4 }
    },
    "value_history": [
      { "date": "2025-07-01", "total_value_usd": 98500, "cost_basis_usd": 67000, "gain_loss_usd": 31500, "gain_loss_pct": 47.0 }
    ]
  },
  "meta": { ... }
}
GET/salesledger
ParityReseller

Your sales ledger — gross, fees, net, ROI per sale

Paginated list of recorded sales from the BrickPicker Sales Ledger, including gross proceeds, platform fees, shipping, net proceeds, profit/loss, and ROI. Reseller plan only.

Parameters

NameInTypeReqDescription
limitqueryintegernoItems per page (default 50, max 250)
offsetqueryintegernoPagination offset
Request
curl "https://api.brickpicker.com/api/v1/salesledger?limit=10" \
  -H "Authorization: Bearer bp_live_..."
Response
{
  "data": {
    "sales": [
      {
        "id": 9001,
        "set_number": "75192",
        "title": "Millennium Falcon",
        "platform": "eBay",
        "sale_date": "2026-04-12",
        "quantity": 1,
        "gross_proceeds_usd": 1450.00,
        "platform_fees_usd": 188.50,
        "payment_fees_usd": 42.00,
        "shipping_cost_usd": 35.00,
        "net_proceeds_usd": 1184.50,
        "profit_loss_usd": 335.51,
        "roi_pct": 39.5
      }
    ],
    "pagination": { "total": 87, "limit": 10, "offset": 0, "has_more": true }
  },
  "meta": { ... }
}

Copy & paste

Code examples

Fetch a set's metadata + current value. Pick your stack.

curl https://api.brickpicker.com/api/v1/set/75192 \
  -H "Authorization: Bearer $BRICKPICKER_KEY"

Ready to build?

Upgrade to the Reseller plan, generate a key in the app, and make your first call in under five minutes.