Poshmark APIposhmark.com ↗
Search Poshmark listings by keyword. Returns title, price, brand, size, condition, seller, sold status, and more. Filter by availability and sort order.
What is the Poshmark API?
The Poshmark API exposes 1 endpoint — search_listings — that returns up to 48 listing objects per call from Poshmark's catalog. Each listing object carries 10+ fields including title, current price, original price, brand, size, condition, seller username, sold status, and a direct listing URL. You can filter results to active listings, sold listings, or both, and sort by the same options available on the Poshmark site.
curl -X GET 'https://api.parse.bot/scraper/e9b947d0-5c07-4b4a-8d39-adba426f8fc2/search_listings?sort=just_in&query=nike+hoodie&per_page=5' \ -H 'X-API-Key: $PARSE_API_KEY'
Typed, relational, agent-ready
A generated client with real types, enums, and the links between objects — the structure a flat JSON response can't carry. Autocompletes in your editor and reads cleanly to coding agents.
- Fully typed · autocompletes
- Objects link to objects
- Typed errors & pagination
Typed Python client. Set up the SDK in your uv project, then pull this API’s typed client:
uv add parse-sdk uv run parse init uv run parse add --marketplace poshmark-com-api
uv run parse add --marketplace pulls a pinned snapshot of this canonical API — it won’t change underneath you. To customize it, subscribe and swap to your own copy.
"""Walkthrough: Poshmark listings search — browse, filter, and inspect results."""
from parse_apis.poshmark_com_api import Poshmark, SortOrder, Availability, InputFormatInvalid
client = Poshmark()
# Search for recent Nike hoodies, capped at 5 results
for listing in client.listings.search(query="nike hoodie", sort=SortOrder.JUST_IN, limit=5):
print(listing.title, f"${listing.price}", listing.size, listing.condition)
# Find the cheapest available dress and drill into its details
cheapest = client.listings.search(
query="summer dress",
sort=SortOrder.PRICE_LOW_TO_HIGH,
availability=Availability.AVAILABLE,
limit=1,
).first()
if cheapest is not None:
print(cheapest.title, f"${cheapest.price}", cheapest.brand)
print("seller:", cheapest.seller_username)
print("likes:", cheapest.like_count, "comments:", cheapest.comment_count)
if cheapest.original_price is not None:
print(f"was ${cheapest.original_price}, now ${cheapest.price}")
print(cheapest.listing_url)
# Browse sold listings to gauge market prices
for sold in client.listings.search(
query="lululemon align",
availability=Availability.SOLD,
per_page=10,
limit=10,
):
print(sold.title, f"sold at ${sold.price}", sold.first_published_at)
# Graceful handling of bad filter values
try:
client.listings.search(query="bag", sort="not_a_sort").first()
except InputFormatInvalid as e:
print("rejected:", e.message)
print("exercised: listings.search with sort / availability / pagination / error handling")
Searches Poshmark listings by keyword and returns one page of matching listings (one row per listing). One round trip per call. Pagination is page-based: `page` (default 1) and `per_page` (default 48, the site's page size; larger values are clamped to 48) select the window, and `has_more` reports whether the site offers a further page. `total_results` is the site's own match count and is capped by the site at 5000; when the keyword has no exact matches the site returns loosely related listings, so an empty `listings` array is rare. `sort` defaults to the site's relevance order (relevance ordering can vary slightly between calls; price/date sorts are stable and tile cleanly across pages). `availability` defaults to active listings only; `sold` returns only sold listings and `all` mixes both — `is_sold` and `inventory_status` on each row tell them apart. `price` and `original_price` are numeric amounts in the `currency` shown per row (USD observed); `original_price` is null when the seller did not provide one. `condition` is the site's raw code and is null when unset: observed codes are `nwt` (new with tags), `not_nwt`, `ug`, `uln`, `uf` (pre-owned grades). `listing_url` is the public listing page. Invalid `sort`/`availability` values or a non-positive `page`/`per_page` return a stale_input error.
| Param | Type | Description |
|---|---|---|
| page | integer | 1-based page number of the result set. |
| sort | string | Result ordering, mirroring the site's Sort By menu. |
| queryrequired | string | Keyword(s) to search listings for, e.g. one shape is a brand plus item type. |
| per_page | integer | Listings per page; values above 48 are clamped to 48. |
| availability | string | Which listings to include by sale state: active only, sold only, or both. |
{
"type": "object",
"fields": {
"page": "integer page number served",
"sort": "sort code applied",
"query": "the keyword searched, trimmed",
"has_more": "boolean, true when the site offers a further page",
"listings": "array of listing objects: id, title, price (number), original_price (number or null), currency, brand, size, condition (site code or null), seller_username, inventory_status, is_sold (boolean), department, category, colors (array of names), like_count, comment_count, image_url, listing_url, first_published_at (ISO datetime or null)",
"per_page": "integer page size applied after clamping",
"availability": "availability code applied",
"total_results": "site-reported match count (integer, capped at 5000 by the site)"
},
"sample": {
"data": {
"page": 1,
"sort": "relevance",
"query": "nike hoodie",
"has_more": true,
"listings": [
{
"id": "6aac267aebb1a559c86964e8",
"size": "XXL",
"brand": "Nike",
"price": 21,
"title": "Men's Nike Hoodie",
"colors": [
"Black"
],
"is_sold": true,
"category": "Shirts",
"currency": "USD",
"condition": "ug",
"image_url": "https://di2ponv0v5otw.cloudfront.net/posts/2026/09/17/6aac267aebb1a559c86964e8/m_6aac2690c9ddec15d72d7b87.jpg",
"department": "Men",
"like_count": 2,
"listing_url": "https://poshmark.com/listing/Men-s-Nike-Hoodie-6aac267aebb1a559c86964e8",
"comment_count": 0,
"original_price": null,
"seller_username": "budralston",
"inventory_status": "sold_out",
"first_published_at": "2026-09-17T10:45:36-07:00"
},
{
"id": "6a76aa3356502be0bcf0ad44",
"size": "XL",
"brand": "Nike",
"price": 44,
"title": "NWT Nike Hoodie",
"colors": [
"Blue"
],
"is_sold": true,
"category": "Shirts",
"currency": "USD",
"condition": "nwt",
"image_url": "https://di2ponv0v5otw.cloudfront.net/posts/2026/08/07/6a76aa3356502be0bcf0ad44/m_6a76aa4397098856fdb48c5b.jpg",
"department": "Men",
"like_count": 0,
"listing_url": "https://poshmark.com/listing/NWT-Nike-Hoodie-6a76aa3356502be0bcf0ad44",
"comment_count": 0,
"original_price": null,
"seller_username": "suburbgems",
"inventory_status": "sold_out",
"first_published_at": "2026-08-07T21:03:19-07:00"
}
],
"per_page": 3,
"availability": "sold",
"total_results": 5000
},
"status": "success"
}
}About the Poshmark API
What the API Returns
The search_listings endpoint accepts a query string and returns a paginated array of matching listings. Each object in the listings array includes: id, title, price (as a number), original_price (number or null when not set), currency, brand, size, condition (the site's own condition code), seller username, a sold boolean, and the full listing_url. The response envelope also echoes back query, page, per_page, sort, availability, has_more, and total_results.
Filtering and Pagination
The availability parameter controls which sale states are returned: active-only, sold-only, or both. The sort parameter mirrors the Sort By menu on the Poshmark site. Pagination uses page (1-based) and per_page; values of per_page above 48 are clamped to 48, matching the site's own page size. The has_more boolean tells you whether a subsequent page exists, and total_results gives the site-reported match count, capped at 5,000 by Poshmark regardless of actual inventory depth.
Practical Query Shapes
A typical query combines brand and item type — for example, query=lululemon leggings — to target a specific product segment. Because original_price is returned alongside price, you can compute discount depth per listing. Sold listings can be isolated with the availability parameter, making the endpoint suitable for historical pricing analysis within the 5,000-result cap.
The Poshmark API is a managed, monitored endpoint for poshmark.com — not a raw scraper you maintain. Every endpoint is automatically health-checked on a schedule, and when poshmark.com changes and a check fails, the API is automatically queued for repair and re-verified. It is built to keep working as the site underneath it changes.
This isn't an official poshmark.com API — it's an independent, maintained REST wrapper over public data. Where the source has no official API (or only a limited one), Parse gives you a stable contract over a source that never promised one, and keeps it current. Need a new endpoint or field? You can revise it yourself in plain English and the agent rebuilds it against the live site in minutes — contributing the change back to the shared API is free.
Will this API break when the source site changes?+
Is this an official API from the source site?+
Can I fix or extend this API myself if I need a new endpoint or field?+
What happens if I call an endpoint that has an issue?+
- Track resale price trends for a specific brand by querying sold listings and comparing
priceagainstoriginal_price. - Monitor active inventory levels for a keyword segment using
availability=activeandtotal_results. - Build a price-alert tool that polls a search query and flags new listings below a target
price. - Aggregate condition distribution (new, like-new, good, etc.) across listings for a product category.
- Identify discount depth by computing the spread between
original_priceandpriceacross sold comps. - Feed a deal-finding bot that surfaces active listings by seller
usernamefor specific search terms. - Benchmark resale velocity by comparing active versus sold listing counts for a given keyword.
| Tier | Price | Credits/month | Rate limit |
|---|---|---|---|
| Free | $0/mo | 200 | 5 req/min |
| Hobby | $30/mo | 1,000 | 20 req/min |
| Developer | $100/mo | 5,000 | 100 req/min |
| Team | $300/mo | 20,000 | 300 req/min |
| Company | $1,000/mo | 100,000 | 500 req/min |
Each endpoint has a fixed posted price per successful call — most fall between 1 and 10 credits — shown on this API's page before you run it. Exceeding the rate limit returns a 429 response. Authenticate with the X-API-Key header.
Does Poshmark have an official developer API?+
What does the `availability` parameter actually filter, and what values does it accept?+
availability parameter selects which listings appear in results based on sale state. You can request active-only listings (items still for sale), sold-only listings (completed sales), or both combined. Sold listings are useful for pulling historical transaction prices, while active filters focus on current inventory.Why is `total_results` capped at 5,000 even for broad queries?+
total_results of 5,000 even when actual inventory is larger. Narrowing your query or using the availability filter will produce more accurate counts for targeted segments.Can I retrieve a single listing's full details — photos, description, comments, or seller profile — through this API?+
How deep can I paginate into results for a given query?+
page and per_page (max 48 per page). That means at most approximately 104 pages per query. The has_more boolean in each response tells you whether a subsequent page exists so you can stop without making an extra empty call.