Secondhand-fashion pricing and resale research
Use Poshmark endpoints to turn secondhand-fashion pricing and resale research into repeatable API requests with documented inputs and JSON responses.
Turn public Poshmark pages into structured resale-fashion data — keyword listing search, full listing detail, a seller's closet catalog, browse by brand or category, the full brand and category directories, and curated trend/showroom collections, all as normalized JSON. Credential-free.
Search Poshmark listings and get listing detail, seller closets, brand and category directories, and trend collections as structured JSON.
Endpoint families
6
Documented params
20
Examples
8
Live catalog snapshot
Active endpoints
8
Methods
GET
Required params
14
Schema refs
8
{
"platform": "Poshmark",
"endpoint": "poshmark-search",
"method": "GET",
"path": "/poshmark/search",
"auth": "apiKey"
}Use cases
Search Poshmark listings and get listing detail, seller closets, brand and category directories, and trend collections as structured JSON.
Use Poshmark endpoints to turn secondhand-fashion pricing and resale research into repeatable API requests with documented inputs and JSON responses.
Use Poshmark endpoints to turn seller and closet monitoring into repeatable API requests with documented inputs and JSON responses.
Use Poshmark endpoints to turn brand and trend tracking into repeatable API requests with documented inputs and JSON responses.
Managed execution
Every figure below is read from the live Poshmark endpoint catalog — 8 endpoints, 20 documented request parameters, and 8 published response schemas — the same catalog Docs and Playground run against.
8 documented Poshmark endpoints, grouped into 8 request families — Brand, Brands and Categories, plus 5 more.
20 request parameters are documented across those Poshmark endpoints, 14 of them required — the full input contract is public before you write any integration code.
8 of the 8 Poshmark endpoints ship a recorded example response, and 8 carry a documented response schema — you can code against the real JSON before the first request.
Poshmark endpoints document their error responses (400, 404, 500 and 503) alongside the success schema, so a block, a rate limit, or a missing record comes back as a typed error rather than silently empty data.
8 hosted MCP tools back the Poshmark endpoints, so an agent can call the same routes with the same parameters and the same JSON contract, with no custom glue.
Coverage map
These cards are generated from the active endpoint catalog, so the landing page reflects the same API surface used by Docs and Playground.
/poshmark/brand/{name}
/poshmark/brands
/poshmark/categories
/poshmark/category/{path}
/poshmark/closet/{username}
/poshmark/listing/{id}
Endpoint catalog
/poshmark/searchSearches Poshmark for clothing, shoes, and accessory listings, returning normalized listing summaries (title, price, brand, size, condition, seller, images) plus the total matching count and an opaque pagination cursor. Pass a previous response's next_max_id back as max_id to fetch the next page. Credential-free public data sourced from Poshmark's own server-rendered search page and, for pages past the first, Poshmark's own JSON pagination API.
Response notes
- `total` reflects Poshmark's full matching-result count for the applied filters, not just `len(listings)`. - `next_max_id` is an opaque, server-issued pagination cursor. Pass it back as `max_id` on a subsequent request (with the same `query`/`department`) to fetch the next page. `has_more` is `false` once there is nothing further to page through. - A search with no matching listings returns `200` with `"listings": []`. - A missing `query` returns `400` before any upstream request is made. Example response: ```json { "code": 200, "msg": "OK", "data": { "total": 5000, "has_more": true, "next_max_id": "ENC_eyJtYXhfaWRzIjpbNDksMSwxXSwicGFnZV9udW0iOjIsInBhZ2VfZ3JvdXBfaWQiOiI2YTcyZTE3OTI1MzYyMTUzMDNhMmVmMWEifQ", "listings": [ { "id": "6a6353cb88849a5f185280ea", "title": "Nike Jacket", "price": 19, "original_price": 98, "condition": "gu", "brand": "Nike", "category": "Jackets", "department": "Men", "size": "M", "colors": ["Black"], "status": "published", "cover_shot": "https://di2ponv0v5otw.cloudfront.net/posts/2026/07/24/x/m_x.jpg", "like_count": 12, "comment_count": 2, "seller_username": "maltimar", "url": "https://poshmark.com/listing/6a6353cb88849a5f185280ea" } ], "source_url": "https://poshmark.com/search?query=nike+jacket" } } ```
MCP tool poshmark_search
/poshmark/listing/{id}Returns a normalized Poshmark item-detail page: the full listing (description, all photos, size/brand/condition, inventory), its seller's profile, public comments, and similar listings Poshmark itself surfaces on the same page. Credential-free public data sourced from Poshmark's own server-rendered listing page.
Response notes
- `seller` is the listing's seller profile, keeping only display-facing identity and reputation fields (username, name, avatar, follower/rating counts). Poshmark's own page state carries a much larger internal user object alongside it (financial totals, fraud/moderation review flags, KYC verification state, tax and email-engagement tracking, and an `email` field) — none of that is ever included in this response. - `comments` keeps only the public comment text and author identity. Poshmark's raw comment records also carry spam/fraud-review metadata, which is never included. - `similar_listings` is omitted (absent, not an empty array) when Poshmark's own page does not carry a similar-listings shelf for that item. - An unknown listing id returns `404`. Example response: ```json { "code": 200, "msg": "OK", "data": { "id": "6a3fed1de9c77df92e2c0cc6", "title": "NWT Farm Rio Shorts", "description": "New with tags.", "price": 55, "original_price": 95, "condition": "nwt", "brand": "FARM Rio", "category": "Shorts", "department": "Women", "size": "S", "colors": ["Red", "Yellow"], "status": "published", "cover_shot": "https://di2ponv0v5otw.cloudfront.net/posts/x/m_x.jpg", "pictures": ["https://di2ponv0v5otw.cloudfront.net/posts/x/m_x.jpg"], "like_count": 111, "comment_count": 4, "seller": { "id": "5a4f84cb7d70fb0f0f05a37f", "username": "maltimar", "full_name": "Mary Altimar", "followers": 9096, "following": 89, "posts_count": 698, "items_sold_display": "500+", "rating_average": 4.93, "rating_count": 368, "rating_breakdown": {"five_star": 355, "four_star": 7, "three_star": 2, "two_star": 3, "one_star": 1}, "orders_shipped": 522, "url": "https://poshmark.com/closet/maltimar" }, "comments": [ {"id": "6a4a86191fea02ce69f41484", "comment": "Hi can you tell me the width of the waist?", "creator_username": "muvlax20"} ], "source_url": "https://poshmark.com/listing/6a3fed1de9c77df92e2c0cc6" } } ```
MCP tool poshmark_listing
/poshmark/closet/{username}Returns a normalized Poshmark closet (seller storefront) page: the seller's public profile and reputation stats (followers, ratings, items sold) plus a first page of their currently available listings and total listing count. Pass a previous response's next_max_id back as max_id to fetch the next page of listings; paginated responses omit the seller profile to avoid a second upstream fetch, so fetch without max_id first to get seller fields. Credential-free public data sourced from Poshmark's own server-rendered closet page and, for pages past the first, Poshmark's own JSON pagination API.
Response notes
- `seller` keeps only display-facing identity and reputation fields. Poshmark's own page state carries a much larger internal user-aggregates object alongside it (financial totals, fraud/moderation review counters, KYC verification state, tax and email-engagement tracking, and an `email` field) — none of that is ever included in this response. - `listings` is the first page Poshmark's own closet page renders (48 items per page), not the seller's complete inventory — `total_count` reports the seller's true current listing count. - `next_max_id` is an opaque, server-issued pagination cursor. Pass it back as `max_id` on a subsequent request (with the same `username`) to fetch the next page. **A paginated request (one with `max_id` set) omits `seller` (returned as empty)** — Poshmark's own pagination endpoint for a closet only returns listings, not the seller profile, so fetch without `max_id` first if you need seller fields. - An unknown username returns `404`. Example response: ```json { "code": 200, "msg": "OK", "data": { "seller": { "id": "5a4f84cb7d70fb0f0f05a37f", "username": "maltimar", "full_name": "Mary Altimar", "followers": 9096, "following": 89, "posts_count": 698, "items_sold_display": "500+", "rating_average": 4.93, "rating_count": 368, "rating_breakdown": {"five_star": 355, "four_star": 7, "three_star": 2, "two_star": 3, "one_star": 1}, "orders_shipped": 522, "url": "https://poshmark.com/closet/maltimar" }, "listings": [ {"id": "6a3fed1de9c77df92e2c0cc6", "title": "NWT Farm Rio Shorts", "price": 55, "brand": "FARM Rio", "seller_username": "maltimar"} ], "total_count": 107, "has_more": true, "source_url": "https://poshmark.com/closet/maltimar" } } ```
MCP tool poshmark_closet
/poshmark/brand/{name}Returns a page of normalized Poshmark listings for a given brand name (e.g. Nike), the same browsing view as Poshmark's own brand pages. Pass a previous response's next_max_id back as max_id to fetch the next page. Credential-free public data sourced from Poshmark's own server-rendered brand page and, for pages past the first, Poshmark's own JSON pagination API.
Response notes
- `total` reflects Poshmark's full matching-result count for the brand, not just `len(listings)`. - `next_max_id` is an opaque, server-issued pagination cursor. Pass it back as `max_id` on a subsequent request (with the same `name`) to fetch the next page. - An unrecognized brand name returns `404`. Example response: ```json { "code": 200, "msg": "OK", "data": { "total": 210000, "has_more": true, "listings": [ {"id": "6a3333333333333333333333", "title": "Nike Hoodie", "price": 30, "brand": "Nike", "department": "Men"} ], "source_url": "https://poshmark.com/brand/Nike" } } ```
MCP tool poshmark_brand
/poshmark/brandsReturns Poshmark's full brand directory: every brand Poshmark recognizes (name, slug, logo, known aliases), not just brands with active listings for a given search or category filter. Useful for resolving a brand name to the exact value the brand/search filters expect. Credential-free public data sourced from Poshmark's own server-rendered brand directory page.
Response notes
- The directory is large (tens of thousands of brands) and is returned in a single response, matching Poshmark's own page — there is no pagination. - `logo_url` is omitted when a brand has no dedicated logo image on file. - `aliases` lists alternate names/spellings Poshmark associates with the brand, when any are on file. Example response: ```json { "code": 200, "msg": "OK", "data": { "total": 29887, "brands": [ { "id": "5b453b64ab981d4b61252136", "name": "!it jeans", "slug": "!it_jeans", "logo_url": "https://di2ponv0v5otw.cloudfront.net/brands/2026/06/21/5b453b64ab981d4b61252136/m_6a38da95e2c7c23674171a92.jpg", "aliases": ["it", "!it", "it jeans"] } ], "source_url": "https://poshmark.com/brands" } } ```
MCP tool poshmark_brands
/poshmark/category/{path}Returns a page of normalized Poshmark listings for a given category path (e.g. Women-Shoes, Men-Shirts), the same browsing view as Poshmark's own category pages. Pass a previous response's next_max_id back as max_id to fetch the next page. Credential-free public data sourced from Poshmark's own server-rendered category page and, for pages past the first, Poshmark's own JSON pagination API.
Response notes
- `total` reflects Poshmark's full matching-result count for the category, not just `len(listings)`. - `next_max_id` is an opaque, server-issued pagination cursor. Pass it back as `max_id` on a subsequent request (with the same `path`) to fetch the next page. - An unrecognized category path returns `404`. Example response: ```json { "code": 200, "msg": "OK", "data": { "total": 84000, "has_more": true, "listings": [ {"id": "6a2222222222222222222222", "title": "Nike Air Max", "price": 60, "brand": "Nike", "department": "Women"} ], "source_url": "https://poshmark.com/category/Women-Shoes" } } ```
MCP tool poshmark_category
/poshmark/categoriesReturns Poshmark's full department/category browse taxonomy (e.g. Women > Shoes, Men > Jackets & Coats). Each entry's path resolves directly against the category endpoint. This is reference data that changes rarely, so responses are cached. Credential-free public data sourced from Poshmark's own server-rendered category pages.
Response notes
- This is reference data that changes rarely, so responses are cached for 24 hours — repeated calls within that window return the cached result rather than re-fetching from Poshmark. - The taxonomy has 2 levels: department, then category. Poshmark's own site navigation shows a further leaf sub-category level for whichever single category is currently being browsed (e.g. `Shoes` → `Sneakers`, `Heels`...), but that level isn't included here — browse into a category via the category endpoint to discover its own sub-categories. - Building the full response requires one fetch per department (6 total). If a department's fetch fails, it's simply omitted from the response rather than failing the whole request — the endpoint only returns an error if every department fails. Example response: ```json { "code": 200, "msg": "OK", "data": { "departments": [ { "id": "000e8975d97b4e80ef00a955", "name": "Women", "path": "Women", "categories": [ {"id": "002a8975d97b4e80ef00a955", "name": "Accessories", "path": "Women-Accessories"}, {"id": "00268975d97b4e80ef00a955", "name": "Shoes", "path": "Women-Shoes"} ] } ] } } ```
MCP tool poshmark_categories
/poshmark/trend/{id}Returns a page of normalized Poshmark listings for a curated trend/showroom collection (e.g. "Vintage Celine Handbags"), the same browsing view as Poshmark's own trend pages. Pass a previous response's next_max_id back as max_id to fetch the next page. Credential-free public data sourced from Poshmark's own server-rendered trend page and, for pages past the first, Poshmark's own JSON pagination API.
Response notes
- `total` reflects Poshmark's full matching-result count for the collection, not just `len(listings)`. - `name`/`description`/`cover_shot` describe the collection itself. On a paginated response (`max_id` set) these are omitted (empty) to avoid a second upstream fetch — fetch without `max_id` first for those fields. - `next_max_id` is an opaque, server-issued pagination cursor. Pass it back as `max_id` on a subsequent request (with the same `id`) to fetch the next page. Use it promptly — Poshmark's own result ranking can shift over time, so a cursor reused after a long delay may show some overlap with a previous page. - An unrecognized trend/showroom id returns `404`. Example response: ```json { "code": 200, "msg": "OK", "data": { "name": "Vintage Celine Handbags", "total": 5000, "has_more": true, "listings": [ {"id": "6a1111111111111111111111", "title": "Vintage Celine Bag", "price": 800, "brand": "Celine"} ], "source_url": "https://poshmark.com/trend/964e80193927e69b518f631b" } } ```
MCP tool poshmark_trend
Related APIs
Marketplaces & Retail
Collect marketplace product signals from Amazon without building brittle storefront scrapers.
Marketplaces & Retail
Build resale, pricing, and marketplace workflows from structured eBay data.
Marketplaces & Retail
Turn public Shop.app product and merchant pages into structured JSON for e-commerce product intelligence, price research, shop monitoring, and marketplace discovery workflows.
How to scrape Poshmark
Crawlora's Poshmark endpoints return listing search, detail, seller closets, and brand/category/trend directories as normalized JSON with one API key — no login or account required.
Send a keyword to /poshmark/search, optionally scoped by department, or browse without a keyword via /poshmark/brand/{name} and /poshmark/category/{path}. A search returns around 48 listings per page alongside a total and a has_more flag.
All four listing endpoints paginate by cursor: the response carries next_max_id, and you pass that value back as max_id to fetch the following page. There is no page parameter, so keep following next_max_id until has_more goes false.
Pass a listing id from a search result to /poshmark/listing/{id} for full detail and photos.
Pass a username to /poshmark/closet/{username} for that seller's closet catalog, cursor-paginated the same way.
/poshmark/brands returns the full brand directory — close to 30,000 brands, so fetch it once and cache it rather than per query — and /poshmark/categories returns the department/category browse taxonomy. /poshmark/trend/{id} returns a curated trend or showroom collection.
FAQ
Send a keyword to Crawlora's /poshmark/search endpoint and get normalized listing cards — title, price, brand, size, photos — as structured JSON.
No Poshmark account or login is required from the caller — only your Crawlora API key.
Yes — /poshmark/closet/{username} returns a seller's closet (storefront) listing catalog as structured JSON, cursor-paginated via next_max_id like the other listing endpoints.
By cursor rather than page number. Search, brand, category and closet responses each carry a next_max_id along with total and has_more; pass that value back as the max_id parameter to get the next page, and stop when has_more is false. There is no page parameter to increment.
Poshmark blocks some automated requests at the edge, and Crawlora surfaces that as a 503 rather than returning an empty result that would look like a genuine answer. It is intermittent — a brand-directory call that 503s often succeeds on an immediate retry — and because Crawlora bills only successful 2xx responses, a blocked request costs no credits.