Getting started

Poshmark API documentation

A REST API for your own Poshmark sales data. Register with your Poshmark credentials, sync your full order and listing history once, then query revenue and orders from anywhere. Every authenticated request carries a bearer token and is billed $0.01 against your balance.

i

New accounts start with $10 of credit — 1,000 calls. All data (orders, listings, users) is scoped to your account; you only ever see your own.

The flow, end to end

  1. POST /register — create an account, get a UUID API key and $10 credit.
  2. POST /sync — import your full history (runs 5–15 min).
  3. GET /status — poll until it returns "ready".
  4. GET /revenue / GET /order — query your data.

Authentication

Every endpoint except /register, /status, and /health requires your API key as a bearer token. Your key is a UUID v4 returned by /register. Send it on every authenticated request:

Authorization header
Authorization: Bearer 3f9a1c2e-…-a1b2c3d4e5f6

A missing or malformed header returns 401; a well-formed key that doesn't exist also returns 401. Keep your key secret — anyone holding it can spend your balance. /status is the one exception: it takes the key as a query parameter (?apiKey=…) so you can check sync progress without auth.

Syncing your data

Before you can query anything, PoshmarkAPI signs in as you and imports your order and listing history. This runs synchronously inside POST /sync and takes 5–15 minutes depending on how many orders you have. Kick it off once; re-run it later to pull in new sales. While a sync is running, a second /sync returns 409.

Your account moves through four sync states:

not_synced
Fresh account — call /sync
syncing
Import in progress
ready
Query away
error
Sync failed — see scrapeError

Query endpoints return 202 while your status is not_synced or syncing, so poll GET /status until it flips to ready.

Errors & status codes

Errors are returned as JSON: { "error": "message" }. The codes you'll see:

CODEMEANING
200Success.
201Account created (/register).
202Data not synced yet — call /sync and retry.
400Bad request — a required parameter is missing or malformed.
401Missing, malformed, or unknown API key.
402Insufficient balance — top up to keep calling.
404Not found — e.g. no order with that id in your account.
409Conflict — username already registered, or a sync is already running.
500Server error, or a sync that ended in the error state.

Billing & credit

Pay-as-you-go: $0.01 per successful billed call, drawn from your balance. New accounts get $10 (1,000 calls). Only 200 responses on billed endpoints are charged — a request that errors (400, 401, 402, 404, 202…) costs nothing.

ENDPOINTAUTHCOST
POST /registernonefree
POST /syncbearer$0.01
GET /statusapiKey paramfree
GET /revenuebearer$0.01
GET /orderbearer$0.01
GET /healthnonefree

When your balance drops below one cent, billed endpoints return 402 until you add credit. Your key stays valid and nothing is deleted.

Endpoint reference
POST/registerfree

Create an account. Returns a UUID API key and applies $10 of starting credit. No authentication.

FIELDTYPEDESCRIPTION
poshmarkUsernamestringYour Poshmark username. Required.
poshmarkPasswordstringYour Poshmark password. Encrypted with AES-256-GCM at rest. Required.
Request
curl -X POST http://localhost:4590/register \
-H "Content-Type: application/json" \
-d '{"poshmarkUsername":"@you","poshmarkPassword":"…"}'
201 Created
{
"apiKey": "3f9a1c2e-…-a1b2c3d4e5f6",
"balance": "10.00",
"status": "not_synced",
"message": "Account created successfully…"
}

Errors: 400 missing/invalid fields · 409 username already registered.

POST/sync$0.01

Import your full Poshmark history — orders first, then the listing behind each order. Runs synchronously and returns when the import finishes (5–15 min). Requires bearer auth. No body.

Request
curl -X POST http://localhost:4590/sync \
-H "Authorization: Bearer <your-key>"
200 OK
{
"status": "ready",
"message": "Sync completed successfully",
"ordersScraped": 2418,
"listingsScraped": 2418
}

Errors: 409 a sync is already running · 401 / 402 auth · 500 sync failed (details in scrapeError via /status).

Because /sync holds the connection open for minutes, make sure your client and any reverse proxy allow a long request timeout.

GET/statusfree

Check sync progress. Takes your key as a query parameter (no bearer header, not billed) so you can poll it freely.

PARAMTYPEDESCRIPTION
apiKeystringYour API key. Required.
Request
curl "http://localhost:4590/status?apiKey=<your-key>"
200 OK
{
"status": "ready",
"lastSynced": "2026-08-01T22:14:03.000Z",
"scrapeError": null
}

Errors: 400 missing apiKey · 401 unknown key. lastSynced is null until the first successful sync.

GET/revenue$0.01

Total net earnings and order count for a date range. revenue is the sum of each order's net earnings (after Poshmark's commission), returned as a string; orders with no recorded earnings are excluded. Requires bearer auth and a synced account.

PARAMTYPEDESCRIPTION
startstringRange start, ISO 8601 (e.g. 2026-07-01T00:00:00Z). Required.
endstringRange end, ISO 8601. Required.
Request
curl "…/revenue?start=2026-07-01T00:00:00Z&end=2026-07-31T23:59:59Z" \
-H "Authorization: Bearer <your-key>"
200 OK
{
"revenue": "8420.55",
"orderCount": 128,
"start": "2026-07-01T00:00:00Z",
"end": "2026-07-31T23:59:59Z"
}

Errors: 400 missing/invalid dates · 202 not synced yet · 401 / 402 auth.

GET/order$0.01

Full detail for a single order in your account, including buyer and seller. Returns every stored field on the order (status, amounts, fees, net earnings, size, dates, tracking, and more) plus nested buyer and seller objects.

PARAMTYPEDESCRIPTION
orderIdstringThe Poshmark order id. Required.
Request
curl "http://localhost:4590/order?orderId=8842" \
-H "Authorization: Bearer <your-key>"
200 OK
{
"orderId": "8842",
"title": "Vintage Levi's 501",
"orderStatus": "sold",
"totalAmount": "68.00",
"poshmarkFee": "13.60",
"netEarnings": "54.40",
"orderDate": "2026-07-18T14:02:00.000Z",
"buyer": { "username": "…" },
"seller": { "username": "…" }
… plus every other order field
}

Errors: 400 missing orderId · 404 no such order in your account · 202 not synced · 401 / 402 auth.

GET/healthfree

Liveness check. No auth, not billed — useful for uptime monitors.

200 OK
{ "status": "ok" }

Ready to build?

Create a key and start with $10 of credit — no card required.