Harpersbazaar APIharpersbazaar.com ↗
Search and retrieve Harper's Bazaar editorial articles with full body text, author bios, tags, and shoppable product data via a simple 2-endpoint API.
What is the Harpersbazaar API?
The Harper's Bazaar API exposes 2 endpoints that give developers structured access to the site's editorial content across beauty, fragrance, fashion, and more. Use search_articles to query articles by keyword and retrieve article IDs, titles, deks, and publication metadata, then pass any article_id to get_article to retrieve the full article text, author bios, tags, section labels, and an array of shoppable product records including brand, retailer, and price.
curl -X GET 'https://api.parse.bot/scraper/0c5acbc1-ddd4-4eee-87f2-5dab21ff608f/search_articles?sort=relevance&query=perfume+longevity' \ -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 harpersbazaar-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: Harper's Bazaar Articles SDK — search, drill down, read full text."""
from parse_apis.harpersbazaar_com_api import HarpersBazaar, SearchSort, ArticleNotFound
client = HarpersBazaar()
# Search for articles about fragrance, sorted by relevance.
for summary in client.article_summaries.search(query="perfume longevity", sort=SearchSort.RELEVANCE, limit=5):
print(summary.title, "|", summary.section, "|", summary.published_at)
# Drill into the first search hit for full article detail.
hit = client.article_summaries.search(query="fragrance tips", limit=1).first()
if hit is not None:
article = hit.details()
print(article.title)
print(article.dek)
print(f"{article.word_count} words, {len(article.authors)} author(s)")
# Walk authors with bios.
for author in article.authors:
print(f" {author.name}: {author.bio or 'no bio'}")
# Show embedded product recommendations if present.
if article.products:
for product in article.products[:3]:
print(f" {product.brand} — {product.name} (${product.price})" if product.price else f" {product.brand} — {product.name}")
# Point-lookup by the discovered article_id.
try:
refreshed = client.articles.get(article_id=article.article_id)
print(f"Refreshed: {refreshed.title}")
except ArticleNotFound:
print("Article no longer available")
print("exercised: article_summaries.search / details / articles.get")
Searches Harper's Bazaar articles by keyword (for example fragrance longevity tips, perfume primer techniques, or an ingredient name) and returns one page of article summaries. Each row is one article with its numeric article_id (feed it to get_article), title, dek, authors, publish date, section, lead image, and canonical URL. Results are paginated: page selects the 1-based page (default 1) and page_size the rows per page (default 20, clamped to a maximum of 40); total_results is the site's total match count and has_more is true while page * page_size is below it. sort chooses relevance ranking (default) or newest-first. One upstream search round trip per call (plus a one-off site bootstrap on the first call). A query the site has no matches for returns total_results 0 and an empty results array as a valid success.
| Param | Type | Description |
|---|---|---|
| page | integer | 1-based results page. |
| sort | string | Result ordering: relevance ranking or newest publish date first. |
| queryrequired | string | Free-text search keywords, e.g. 'perfume longevity'. |
| page_size | integer | Articles per page; values above 40 are clamped to 40. |
{
"type": "object",
"fields": {
"page": "1-based page returned",
"sort": "ordering applied (relevance | most_recent)",
"query": "echo of the search keywords used",
"results": "array of article summaries: article_id (string, input for get_article), title, short_title, dek, description, authors (array of names), published_at / edited_at (ISO 8601 UTC), section, section_slug, subsection, subsection_slug (null when the article has no subsection), content_type, image_url, url",
"has_more": "true when further pages exist",
"page_size": "rows per page after clamping",
"total_results": "site-reported total number of matching articles"
},
"sample": {
"data": {
"page": 1,
"sort": "relevance",
"query": "perfume longevity",
"results": [
{
"dek": "Can a makeup primer be the secret to long-lasting fragrance? I put this viral trend to the test.",
"url": "https://www.harpersbazaar.com/beauty/a64163009/makeup-primer-for-perfume-hack/",
"title": "This Genius TikTok Hack Helps Perfume Last All Day",
"authors": [
"Jenna Rosenstein"
],
"section": "Beauty",
"edited_at": "2025-03-13T17:14:32.569774Z",
"image_url": "https://hips.hearstapps.com/hmg-prod/images/0313-fragranceprimer-00b-67d30b318cda2.jpg",
"article_id": "64163009",
"subsection": null,
"description": "Can a makeup primer be the secret to long-lasting and long-wearing perfume? I put this viral trend to the test.",
"short_title": "This Genius TikTok Hack Helps Perfume Last All Day",
"content_type": "Standard Article",
"published_at": "2025-03-13T17:14:00Z",
"section_slug": "beauty",
"subsection_slug": null
}
],
"has_more": true,
"page_size": 5,
"total_results": 18
},
"status": "success"
}
}About the Harpersbazaar API
Searching Articles
The search_articles endpoint accepts a free-text query parameter (e.g., 'fragrance longevity' or 'SPF moisturizer') and returns a paginated list of article summaries. Each result includes a numeric article_id for use with get_article, plus title, short_title, dek, description, and an authors array. The sort parameter accepts relevance or most_recent, and page_size controls results per page up to a maximum of 40. The has_more boolean and total_results count make cursor-style pagination straightforward.
Full Article Data
get_article takes a single article_id string and returns the complete article record in one call. The response includes body_text as plain text with paragraphs separated by blank lines, a template field that distinguishes standard-article from listicle layouts, section and collections for topical grouping, and a tags array. The authors field is an array of objects containing name, slug, and bio, giving you contributor context alongside the content.
Shoppable Products
Many Harper's Bazaar articles embed product recommendations directly in the editorial copy. The products array returned by get_article surfaces these as structured records: each product has a product_id, label, brand, name, retailer, price (numeric or null), currency, description, and image_url. This lets you extract shoppable items from beauty roundups, fragrance guides, or fashion edits without parsing raw HTML yourself.
Coverage and Format
The API covers articles accessible on harpersbazaar.com, including beauty, fragrance, fashion, and lifestyle editorial. The url field in get_article returns the canonical article URL, and publish/update timestamps let you track content freshness. Both endpoints return JSON.
The Harpersbazaar API is a managed, monitored endpoint for harpersbazaar.com — not a raw scraper you maintain. Every endpoint is automatically health-checked on a schedule, and when harpersbazaar.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 harpersbazaar.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?+
- Build a beauty trend tracker by querying
search_articleswith ingredient keywords like 'niacinamide' and monitoring new editorial coverage over time. - Extract shoppable product records from fragrance roundups to populate a recommendation engine with brand, retailer, and price data.
- Aggregate author bios and article counts from
get_articleto profile Harper's Bazaar contributors for a media research tool. - Classify editorial content by
sectionandtagsto train a fashion/beauty topic model on real editorial text. - Pipe
body_textfrom listicle-format articles into an NLP pipeline to identify frequently recommended products or brands. - Surface the most recent beauty articles via
sort=most_recentto populate a content feed with fresh Harper's Bazaar editorial. - Cross-reference
products[*].retailerandproducts[*].pricefields across multiple articles to compare which retailers appear most in editorial coverage.
| 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 Harper's Bazaar have an official developer API?+
What does `get_article` return beyond the article body?+
get_article returns the full body_text in plain text, plus title, dek, url, section, tags, collections, template (standard-article or listicle), authors with bios, publish and update timestamps, a lead_image, and a products array with structured brand, retailer, and price fields for any shoppable items embedded in the article.Is there a way to filter `search_articles` by section or date range?+
search_articles endpoint filters by query keyword and supports sort (relevance or most_recent) and pagination via page and page_size. Section-based or date-range filtering is not currently a parameter. The API covers keyword search and ordering. You can fork it on Parse and revise it to add section or date filtering as an additional endpoint.Are comments, user ratings, or social engagement counts available?+
How large can a single `get_article` products array be, and are prices always populated?+
products array size depends entirely on how many shoppable items the article embeds — a fragrance roundup may have many entries while an opinion piece may have none. The price field is typed as number or null, so some product records may return null if pricing information is not available in the article.