Custom Ink APIcustomink.com ↗
Search Custom Ink's decorated-apparel catalog, retrieve product details with colors and sizes, and price full orders including volume discounts and shipping options.
What is the Custom Ink API?
The Custom Ink API exposes 4 endpoints covering the full pre-purchase workflow on customink.com: catalog search, product detail, volume pricing tables, and itemized order quotes. Use search_products to find styles by name, brand, or category, then pull per-color stock status, imprint dimensions, and quantity-tier pricing. The get_quote endpoint returns a complete breakdown — list price, total price, shipping options with delivery dates, and a nearby-quantity price grid — before any cart or checkout step.
curl -X GET 'https://api.parse.bot/scraper/1e1f91bd-94d8-4346-9d5c-99cab7d98b7c/search_products?query=Bella+Canvas+Jersey+T-Shirt' \ -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 customink-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: Custom Ink catalog search, product detail, and pricing."""
from parse_apis.customink_com_api import CustomInk, InputNotFound
client = CustomInk()
# Search the catalog for t-shirts; cap total items fetched.
for summary in client.product_summaries.search(query="Bella Canvas Jersey T-Shirt", limit=3):
print(summary.name, summary.brand, f"${summary.price_floor}–${summary.price_ceiling}")
# Drill into the first search hit for full product detail.
summary = client.product_summaries.search(query="cotton polo", limit=1).first()
if summary is not None:
product = summary.details()
print(product.name, product.description[:80])
print("Sizes:", product.sizes)
print("Turn times:", product.turn_time_days.standard, "standard /", product.turn_time_days.rush, "rush days")
# Pick the first color to price a volume comparison.
color = product.colors[0]
pricing = client.volume_pricing.get(
color_id=color.color_id,
quantities="12,24,48",
postal_code="22031",
)
for tier in pricing.tiers:
print(f" Qty {tier.quantity}: ${tier.unit_price}/ea (save {tier.savings_percent}%)")
# Get a full quote for 12 medium shirts in that color.
try:
quote = client.quotes.get(
color_id=color.color_id,
sizes="M:12",
postal_code="22031",
)
print(f"Quote total: ${quote.total_price} ({quote.quantity} items)")
print(f"Shipping (standard): {quote.shipping.standard.charge}, delivers {quote.shipping.standard.delivery_date}")
except InputNotFound:
print("Color/size combination not available for quoting.")
print("exercised: product_summaries.search / details / products.get (via details) / volume_pricing.get / quotes.get")
Searches the Custom Ink catalog by free text (product name, brand, or category words) and returns one row per product style with summary fields: brand, product type, decoration method, print areas, minimum quantity, sizes, available colors (with per-size stock status), price floor/ceiling and the default volume price table (unit price by quantity tier, with regular/list unit price where the site publishes one). Paginated: page (1-based) and hits_per_page (max 50) are the caller's paging controls; total_results/total_pages/has_more describe the full result set. Optional brand restricts results to an exact brand facet value as it appears in results (e.g. the brand field of a previous result). Very generic or misspelled queries may still return loosely matched products because the site's search relaxes unmatched words; an empty products array is a valid result. product_id is the key for get_product; colors[*].color_id is the key for the pricing endpoints.
| Param | Type | Description |
|---|---|---|
| page | integer | 1-based results page. |
| brand | string | Exact brand name to restrict results to, as returned in products[*].brand (e.g. Gildan). Omitted = all brands. |
| queryrequired | string | Free-text search: product name, brand, or category words. |
| hits_per_page | integer | Results per page; values above 50 are clamped to 50. |
{
"type": "object",
"fields": {
"page": "1-based page returned",
"query": "echo of the search text",
"has_more": "true when a later page exists",
"products": "array of product summaries: product_id (string style id), name, brand, product_type, category, categories, decoration_method, decoration_labels, print_areas, minimum_quantity, no_minimum, sizes, color_count, colors[] (color_id, name, rgb {r,g,b}, min_qty, sizes[] with stock_status in|low|out), price_floor, price_ceiling, volume_prices[] (quantity, unit_price, regular_unit_price or null), standard_turn_days, rush_turn_days, rating, rating_count, material, status, url, image_url",
"total_pages": "number of pages at this page size",
"hits_per_page": "page size applied",
"total_results": "total matching products across all pages (site count)"
},
"sample": {
"data": {
"page": 1,
"query": "Bella Canvas Jersey T-Shirt",
"has_more": true,
"products": [
{
"url": "https://www.customink.com/products/t-shirts/short-sleeve-t-shirts/bella-+-canvas-jersey-t-shirt/124200",
"name": "Bella + Canvas Jersey T-shirt",
"brand": "Bella + Canvas",
"sizes": [
"YS",
"YM",
"YL",
"YXL",
"XS",
"S",
"M",
"L",
"XL",
"XXL",
"XXXL",
"XXXXL"
],
"colors": [
{
"rgb": {
"b": 255,
"g": 255,
"r": 255
},
"name": "White",
"sizes": [
{
"name": "YS",
"stock_status": "in"
},
{
"name": "XXXXL",
"stock_status": "low"
}
],
"min_qty": 1,
"color_id": "124200"
}
],
"rating": 4.54,
"status": "active",
"category": "Short Sleeve T-shirts",
"material": "* 4.2 oz. 100% pre-shrunk combed ringspun cotton jersey; Heather colors are poly/cotton blends",
"image_url": "https://mms-images.out.customink.com/mms/images/catalog/5c410d83cdf5db186769b89c339dbbd5/styles/124200/catalog_detail_image_medium.jpg",
"categories": [
"Base Price Under $25",
"10+ People",
"Short Sleeve T-shirts"
],
"no_minimum": true,
"product_id": "124200",
"color_count": 151,
"price_floor": 11.35,
"print_areas": [
"Front",
"Back",
"Left Sleeve",
"Right Sleeve"
],
"product_type": "Unisex",
"rating_count": 14969,
"price_ceiling": 36.45,
"volume_prices": [
{
"quantity": 1,
"unit_price": 36.25,
"regular_unit_price": 36.25
},
{
"quantity": 12,
"unit_price": 16.28,
"regular_unit_price": 19.15
},
{
"quantity": 500,
"unit_price": 11.95,
"regular_unit_price": 11.95
}
],
"rush_turn_days": 7,
"minimum_quantity": 6,
"decoration_labels": [
"Printed"
],
"decoration_method": "screen",
"standard_turn_days": 14
}
],
"total_pages": 6,
"hits_per_page": 5,
"total_results": 30
},
"status": "success"
}
}About the Custom Ink API
Catalog Search and Product Detail
search_products accepts a free-text query plus an optional brand filter and returns up to 50 results per page (capped at 50 regardless of hits_per_page). Each row in products[] includes product_id, brand, product_type, decoration_method, available colors with per-size stock status, and a price floor. Use page and total_pages to paginate. Once you have a product_id, pass it to get_product to receive the full style record: material, fit, features, all active colors (each with rgb, color_family, and sizes[] carrying status and stock_status), maximum imprint dimensions per print location (front, back, sleeves) in inches, placement guidelines, color_limit (max ink colors; 0 = unlimited), and the default volume_prices table by quantity tier.
Pricing Endpoints
get_volume_pricing takes a color_id, up to 12 comma-separated quantities, front_colors, back_colors, and a postal_code (US ZIP or Canadian postal code). It returns one tiers[] entry per requested quantity: unit_price, total_price, savings_percent versus single-item price, and the site-resolved ship_to_state. The best_volume_unit_price field tells you the lowest unit price the site reports for the configuration across all tiers.
get_quote prices a specific order at the size/quantity level. Pass sizes as SIZE:QTY pairs (e.g. M:12,L:12,XL:6) alongside color_id, ink-color counts per location (front_colors, back_colors, sleeve_colors), optional personalization counts (name_count, number_count), and postal_code. The response contains list_price (pre-discount), total_price (standard delivery included, taxes excluded), a shipping object with standard/rush/super_rush objects each carrying turn_time_days, delivery_date (ISO date), charge, and order_by_deadline, plus a price_grid showing totals at nearby larger quantities and caveats strings the site surfaces.
Coverage Notes
All four endpoints are read-only. The API covers the decorated-apparel catalog including T-shirts, sweatshirts, hats, and related styles available on customink.com. It does not include cart creation, order placement, or account operations.
The Custom Ink API is a managed, monitored endpoint for customink.com — not a raw scraper you maintain. Every endpoint is automatically health-checked on a schedule, and when customink.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 customink.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?+
- Compare unit prices across Gildan, Next Level, and Bella+Canvas at a fixed quantity by filtering
search_productsby brand and callingget_volume_pricingfor each result. - Build a bulk-order cost estimator that resolves shipping delivery dates and surcharges for US and Canadian ZIP codes via
get_quote. - Display per-color stock availability at each size from
get_product.colors[*].sizes[*].stock_statusbefore letting users choose a color. - Surface imprint area constraints (max dimensions per print location from
get_product) in a custom design tool to enforce safe artwork sizing. - Generate a price comparison table across order quantities using
get_volume_pricingwith up to 12 quantity tiers in a single call. - Populate a product configurator with color swatches using
rgbvalues andcolor_familyfromget_product.colors. - Estimate personalization upcharges for team uniforms by setting
name_countandnumber_countinget_quoteand comparing the returnedtotal_price.
| 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 Custom Ink have an official public developer API?+
What does `get_quote` return that `get_volume_pricing` does not?+
get_volume_pricing returns unit and total prices at multiple quantities for a single color without size breakdown. get_quote accepts per-size quantities via sizes (e.g. M:12,L:12,XL:6), ink colors per location including sleeve, optional personalization counts, and returns a full itemized breakdown: list_price, total_price, a shipping object with delivery dates and rush options, price_grid at nearby quantities, setup_fee, and site caveats.Are there limits on the quantities I can request in `get_volume_pricing`?+
quantities parameter accepts a comma-separated list of up to 12 positive integer values per call. Requests with more than 12 values will be clamped or rejected. There is no stated minimum quantity, but Custom Ink's catalog enforces its own minimum order quantities which are reflected in the min_quantity field on product records.