Vistaprint APIvistaprint.com ↗
Access Vistaprint's catalog of 6,400+ products via 4 endpoints. Browse categories, search by keyword, and retrieve pricing matrices, quantities, and variants.
What is the Vistaprint API?
The Vistaprint API covers 6,400+ products across 4 endpoints, giving developers structured access to the full catalog including categories, pricing, quantities, and product variants. The get_product_details endpoint returns a complete pricing matrix keyed by quantity, option groups with available choices, and both list and discounted unit prices — all addressable by product ID retrieved from search_products or get_products_by_category.
No input parameters required.
curl -X GET 'https://api.parse.bot/scraper/96c9bdb9-fcb3-4dba-9644-21ce045ddaa8/get_categories' \ -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 vistaprint-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: Vistaprint SDK — browse categories, search products, get pricing details."""
from parse_apis.vistaprint_products_api import Vistaprint, Category, CategoryLevel, ProductNotFound
client = Vistaprint()
# Discover catalog structure — single call, returns full category hierarchy.
catalog = client.categorycatalogs.get()
print(f"Catalog: {catalog.total_products} products across {len(catalog.top_level_categories)} top-level categories")
for cat in catalog.top_level_categories[:3]:
print(f" {cat.category_id}: {cat.product_count} products")
# Search products by keyword — paginated, capped at 3 items.
for item in client.productsummaries.search(query="business cards", limit=3):
print(f"Found: {item.name} (${item.pricing.min_discounted_price}) — {item.rating.average}/5" if item.rating else f"Found: {item.name}")
# Browse a specific category using constructible Category.
biz_cards = Category(category_id="businessCards")
for item in biz_cards.products.list(category_level=CategoryLevel._0, limit=2):
print(f" [{item.product_id}] {item.name}, in stock: {item.in_stock}")
# Drill into full product detail from a search result.
first = client.productsummaries.search(query="mugs", limit=1).first()
if first:
detail = first.details()
print(f"Detail: {detail.name} — {len(detail.options)} option groups, {len(detail.compatible_quantities)} quantities")
for qty_key, tier in list(detail.pricing_by_quantity.items())[:2]:
print(f" Qty {tier.quantity}: ${tier.unit_discounted_price}/unit ({tier.currency})")
# Typed error handling — catch not-found for an invalid product ID.
try:
client.products.get(product_id="PRD-INVALID999")
except ProductNotFound as exc:
print(f"Expected error: {exc}")
print("Exercised: categorycatalogs.get / productsummaries.search / category.products.list / details / products.get")
Get all product categories with product counts. Returns a 3-level category hierarchy (top-level, subcategories level 1, subcategories level 2) with the number of products in each category. Use the returned category_id values as input to get_products_by_category.
No input parameters required.
{
"type": "object",
"fields": {
"total_products": "integer - total number of products in catalog",
"top_level_categories": "array of CategoryCount objects",
"subcategories_level_1": "array of CategoryCount objects",
"subcategories_level_2": "array of CategoryCount objects",
"subcategories_level_3": "array of CategoryCount objects (may be empty)"
},
"sample": {
"data": {
"total_products": 6766,
"top_level_categories": [
{
"level": 0,
"category_id": "promotionalProducts",
"product_count": 3466
},
{
"level": 0,
"category_id": "clothingAndBags",
"product_count": 2856
}
],
"subcategories_level_1": [
{
"level": 1,
"category_id": "bags",
"product_count": 1092
}
],
"subcategories_level_2": [
{
"level": 2,
"category_id": "personalizedPens",
"product_count": 504
}
],
"subcategories_level_3": []
},
"status": "success"
}
}About the Vistaprint API
Category Navigation
The get_categories endpoint returns a 3-level hierarchy: top-level categories, two levels of subcategories, and an optional third level. Each node carries a category_id, its level, and a product_count. These IDs feed directly into get_products_by_category, which accepts the category param plus an optional category_level integer (0 = top, 1 = sub, 2 = sub-sub) to target the right tier. Results are paginated with 0-indexed page and a max limit of 100 per request; the response includes total_pages and total_products for full traversal.
Product Search and Listing
search_products accepts a free-text query and returns matching product objects alongside a category_breakdown object that maps top-level category IDs to counts — useful for understanding how a search term distributes across product lines like business cards, apparel, or signage. Each product object in both search and category responses includes product_id, name, quantities (with MOQ, default, and recommended values), pricing, rating, and categories.
Product Details and Pricing Matrix
get_product_details takes a product_id (e.g., PRD-0BKUQJYW) and returns the full option surface: an options array of named groups with available choices, a compatible_options map, and a compatible_quantities array of valid order sizes. The pricing_by_quantity object maps each quantity to total_list_price, total_discounted_price, unit_list_price, and unit_discounted_price, making it straightforward to build price-break comparisons. An optional product_version param can pin a specific version; if omitted, the current version is resolved automatically.
The Vistaprint API is a managed, monitored endpoint for vistaprint.com — not a raw scraper you maintain. Every endpoint is automatically health-checked on a schedule, and when vistaprint.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 vistaprint.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 custom Vistaprint price comparison tool that renders unit price vs. order quantity using
pricing_by_quantitydata. - Sync Vistaprint's full product catalog into an internal procurement system using paginated
get_products_by_categorycalls. - Power a print-on-demand configurator by surfacing available option groups and compatible quantities from
get_product_details. - Identify minimum order quantities across product lines using the MOQ field returned in product listing responses.
- Aggregate category-level product counts from
get_categoriesto build a catalog overview dashboard. - Use
search_productswith thecategory_breakdownresponse field to classify what product types match a given keyword. - Monitor discounted vs. list pricing across 6,400+ SKUs to detect promotional changes over time.
| Tier | Price | Credits/month | Rate limit |
|---|---|---|---|
| Free | $0/mo | 100 | 5 req/min |
| Hobby | $30/mo | 1,000 | 20 req/min |
| Developer | $100/mo | 5,000 | 100 req/min |
One credit = one API call regardless of which marketplace API you call. Exceeding the rate limit returns a 429 response. Authenticate with the X-API-Key header.
Does Vistaprint have an official developer API?+
What does `get_product_details` return beyond basic product info?+
pricing_by_quantity matrix with total and unit prices (both list and discounted) for every valid order quantity, an options array of configurable groups and their available choices, a compatible_options map, and the compatible_quantities array. The mpv_id field provides the merchandising product view identifier alongside the standard product_id.How does pagination work when browsing categories?+
get_products_by_category and search_products both use 0-indexed page numbers with a maximum limit of 100 products per request. Each response includes total_pages, current_page, and total_products (or total_results for search) so you can determine how many requests are needed to exhaust a category or query.