BrickPickerBrickPicker
Public API v1Reseller plan

BrickPicker Public API v1

Script your inventory, audit your sales ledger, or build a dashboard against your own collection — programmatic access to set + minifig metadata and your own brickfolio + sales data. REST + JSON, USD, bearer-token auth, 1,000 requests per key per UTC day.

What you get
10 read-only endpoints · 1,000 req/day
  • Set metadata + our computed value
  • Minifig metadata + value
  • Your brickfolio (holdings + history)
  • Your sales ledger
  • Bearer-token auth, JSON, USD
  • Per-key rate-limit envelope + headers

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

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.

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.

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

Endpoints

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

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

NameInTypeRequiredDescription
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

NameInTypeRequiredDescription
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

NameInTypeRequiredDescription
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": { ... }
}
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

NameInTypeRequiredDescription
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

NameInTypeRequiredDescription
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 only

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

NameInTypeRequiredDescription
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": { ... }
}

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 integrate?

Upgrade to the Reseller plan, generate your key in the app, and you can be making your first call inside five minutes.