astoria-activewear.com scraper API for AI agents and code
datawebot returns astoria-activewear.com search results, product pages and catalogue pages as structured JSON, with the same fields for every shop: title, price, original price, availability, rating, image and link, plus details such as brand, variants and identifiers when a product page shows them. It runs from your AI agent over MCP or from code over REST on astoria-activewear.com, at 5 credits per search page, 1 per product page and 5 per catalogue page, and failed requests are free.
Checked when added to the catalogue.
Fields you get
Every astoria-activewear.com product comes back in these fields; a field is null when the page doesn't show it. Each endpoint below also lists its raw record schema.
| Field | Type | Description |
|---|---|---|
product_id | string or null | Opaque id. Pass it to get_product (or capability "product") to read the product again. |
title | string | Product title as the shop shows it. |
url | string or null | The product page on the shop. |
shop | string or null | The shop’s hostname, without www. |
price | object or null | amount (number), currency (ISO 4217, or null when the shop doesn’t say) and text (the shop’s own wording when it is the same amount, else null). |
original_price | object or null | The price before a discount, in the same shape as price. |
rating | number or null | Average rating, on the shop’s own scale. |
review_count | integer or null | Number of reviews or ratings. |
image_url | string or null | Main product image. |
availability | string or null | in_stock, out_of_stock, or the shop’s own stock wording. |
sponsored | boolean or null | true for an ad the shop marks as sponsored; null when the page doesn’t say. |
How to run it
From your agent, after connecting it once with the setup prompt (agent setup), ask in plain words:
Use datawebot to extract https://astoria-activewear.com/search?q=shoe&type=product and give me each product's title, price and link as JSON.From code, send one request with your API key. The answer has the same shape for every shop; if it says "status": "working", read it again with GET /v1/requests/{id}.
curl https://api.datawebot.com/v1/requests \
-H "Authorization: Bearer $DATAWEBOT_API_KEY" \
-H "Content-Type: application/json" \
-d '{"capability":"endpoint","endpoint":"s_astoria_activewear_com.search_items","url":"https://astoria-activewear.com/search?q=shoe&type=product","format":"structured"}'Predictive search
Predictive product suggestions only, at most 10. Not exhaustive keyword search; no HTML or PDP enrichment.
- ID
s_astoria_activewear_com.search_items- Version
1- Price
- 5 credits / page
- State
- Available
- Typical time
- About 30 s (estimate)
What it does
Reads one search results page (or up to the page limit) and returns one record per product card, in page order. Works on astoria-activewear.com; other hosts are rejected before anything runs.
Input
One page URL per request, shaped like https://astoria-activewear.com/search?q=shoe&type=product, plus these bounded parameters.
| Parameter | Type | Allowed | Default | Set in /v1/requests |
|---|---|---|---|---|
max_products | integer | 1–10 | 10 | POST /v1/jobs only |
Price
5 credits / page. Failed requests are free; a page that loaded but had nothing on it still costs credits. Set max_credits to refuse anything dearer before it runs.
Output
The default, "format": "structured". Every shop answers in the same fields, mapped from the page to the product_summary@1 schema. Fields are null when the page doesn't show them, and a record that can't be mapped is read best-effort from its raw fields. Products are in products, up to 50 a page; follow next_cursor with GET /v1/requests/{id} (MCP: get_results).
| Field | Type | Description |
|---|---|---|
product_id | string or null | Opaque id. Pass it to get_product (or capability "product") to read the product again. |
title | string | Product title as the shop shows it. |
url | string or null | The product page on the shop. |
shop | string or null | The shop’s hostname, without www. |
price | object or null | amount (number), currency (ISO 4217, or null when the shop doesn’t say) and text (the shop’s own wording when it is the same amount, else null). |
original_price | object or null | The price before a discount, in the same shape as price. |
rating | number or null | Average rating, on the shop’s own scale. |
review_count | integer or null | Number of reviews or ratings. |
image_url | string or null | Main product image. |
availability | string or null | in_stock, out_of_stock, or the shop’s own stock wording. |
sponsored | boolean or null | true for an ad the shop marks as sponsored; null when the page doesn’t say. |
{
"request_id": "string",
"status": "done",
"products": [
{
"product_id": "string or null",
"title": "string",
"url": "string or null",
"shop": "string or null",
"price": {
"amount": "number",
"currency": "string or null",
"text": "string or null"
},
"original_price": {
"amount": "number",
"currency": "string or null",
"text": "string or null"
},
"rating": "number or null",
"review_count": "integer or null",
"image_url": "string or null",
"availability": "string or null",
"sponsored": "boolean or null"
}
],
"next_cursor": "string or null",
"meta": {
"as_of": "date-time",
"country": "string",
"credits_used": "integer",
"credits_left": "integer"
}
}Over the Jobs API, GET /v1/jobs/{id}/results?format=structured returns the full product_summary@1 records.
With "format": "raw", the answer keeps the structured fields and adds raw: this endpoint's own records, unchanged, one per item, in the schema below. It is the data the endpoint extracted from the page, not the page's HTML. Same price as structured.
| Field | Type | Description |
|---|---|---|
id | string required | — |
handle | string required | Pattern ^[a-zA-Z0-9_-]+$ |
title | string required | — |
url | string (uri) required | — |
source | "search_suggest" required | — |
data | object required | Source product/suggestion without inferred money or currency. PDP variant prices retain integer source units; catalogue prices retain decimal strings. Market/currency context is unverified. |
{
"id": "string",
"handle": "string",
"title": "string",
"url": "string (uri)",
"source": "search_suggest",
"data": "object"
}Raw needs this endpoint: a search with format: "raw" doesn't fall back to shopping search, and answers raw_unavailable where no endpoint can run. Over the Jobs API, results are raw by default; format=both gives each raw record with its structured form.
Request
Run exactly this endpoint with capability: "endpoint"; there is no fallback, and a failed run is free. Set format to "raw" for the raw records too. For a keyword instead of a URL, search_products with this shop as site builds the search URL, tries the shop's endpoint first and then shopping search.
curl https://api.datawebot.com/v1/requests \
-H "Authorization: Bearer $DATAWEBOT_API_KEY" \
-H "Content-Type: application/json" \
-d '{"capability":"endpoint","endpoint":"s_astoria_activewear_com.search_items","url":"https://astoria-activewear.com/search?q=shoe&type=product","format":"structured"}'submit_job {
"endpoint": "s_astoria_activewear_com.search_items",
"url": "https://astoria-activewear.com/search?q=shoe&type=product",
"format": "structured"
}If the answer says "status": "working", read it again with GET /v1/requests/{id} (MCP: get_results) after check_after_seconds.
Product details
One /products/handle via standard JSON, no HTML fallback.
- ID
s_astoria_activewear_com.product_details- Version
1- Price
- 1 credit / page
- State
- Available
- Typical time
- About 30 s (estimate)
What it does
Reads one product page and returns that product. Works on astoria-activewear.com; other hosts are rejected before anything runs.
Input
One page URL per request, shaped like https://astoria-activewear.com/products/example-product.
Price
1 credit / page. Failed requests are free; a page that loaded but had nothing on it still costs credits. Set max_credits to refuse anything dearer before it runs.
Output
The default, "format": "structured". Every shop answers in the same fields, mapped from the page to the product@1 schema. Fields are null when the page doesn't show them, and a record that can't be mapped is read best-effort from its raw fields. The product is in product.
| Field | Type | Description |
|---|---|---|
product_id | string or null | Opaque id. Pass it to get_product (or capability "product") to read the product again. |
title | string | Product title as the shop shows it. |
url | string or null | The product page on the shop. |
shop | string or null | The shop’s hostname, without www. |
price | object or null | amount (number), currency (ISO 4217, or null when the shop doesn’t say) and text (the shop’s own wording when it is the same amount, else null). |
original_price | object or null | The price before a discount, in the same shape as price. |
rating | number or null | Average rating, on the shop’s own scale. |
review_count | integer or null | Number of reviews or ratings. |
image_url | string or null | Main product image. |
availability | string or null | in_stock, out_of_stock, or the shop’s own stock wording. |
sponsored | boolean or null | true for an ad the shop marks as sponsored; null when the page doesn’t say. |
product.details, when the shop's page maps to product@1:
| Field | Type | Description |
|---|---|---|
brand | string or null | Brand as the page names it. |
category_path | array of strings | Breadcrumb categories, top first. |
description | string or null | Plain-text description. |
feature_bullets | array of strings | Listed features. |
price_min, price_max | number or null | Lowest and highest variant price. |
discount_label | string or null | Discount wording, such as "-20%". |
stock | integer or null | Units in stock, when the page shows a number. |
sold_count, sold_count_basis | integer or null; "total", "monthly" or null | Units sold, and whether that is a total or per month. |
identifiers | array of {type, value} | asin, parent_asin, walmart_item_id, gtin, mpn, isbn or source_sku. |
specs_raw | array of {name, value} | The specification table as shown. |
images, image_count | array of {url, alt}; integer | Every product image. |
option_names | array of strings | Option names such as Size or Colour. |
variants, variant_count | array (up to 100); integer or null | Each variant: id, name, options, sku, final_price, price_before_discount, discount_label, available, stock, image_url. |
seller | object or null | id, name, url and type (official or marketplace). |
rating_scale | number or null | The top of the rating scale, such as 5. |
warnings | array of strings | Fields the page didn’t give, such as currency_missing. |
{
"request_id": "string",
"status": "done",
"product": {
"product_id": "string or null",
"title": "string",
"url": "string or null",
"shop": "string or null",
"price": {
"amount": "number",
"currency": "string or null",
"text": "string or null"
},
"original_price": {
"amount": "number",
"currency": "string or null",
"text": "string or null"
},
"rating": "number or null",
"review_count": "integer or null",
"image_url": "string or null",
"availability": "string or null",
"sponsored": "boolean or null",
"details": {
"brand": "string or null",
"variants": [
"…"
],
"…": "…"
}
},
"meta": {
"as_of": "date-time",
"country": "string",
"credits_used": "integer",
"credits_left": "integer"
}
}Over the Jobs API, GET /v1/jobs/{id}/results?format=structured returns the full product@1 records.
With "format": "raw", the answer keeps the structured fields and adds raw: this endpoint's own records, unchanged, one per item, in the schema below. It is the data the endpoint extracted from the page, not the page's HTML. Same price as structured.
| Field | Type | Description |
|---|---|---|
id | string required | — |
handle | string required | Pattern ^[a-zA-Z0-9_-]+$ |
title | string required | — |
url | string (uri) required | — |
source | "product_js" required | — |
data | object required | Source product/suggestion without inferred money or currency. PDP variant prices retain integer source units; catalogue prices retain decimal strings. Market/currency context is unverified. |
{
"id": "string",
"handle": "string",
"title": "string",
"url": "string (uri)",
"source": "product_js",
"data": "object"
}Over the Jobs API, results are raw by default; format=both gives each raw record with its structured form.
Request
Read a product page with capability: "product"; it runs this endpoint for the page's shop. Set format to "raw" for the raw records too.
curl https://api.datawebot.com/v1/requests \
-H "Authorization: Bearer $DATAWEBOT_API_KEY" \
-H "Content-Type: application/json" \
-d '{"capability":"product","url":"https://astoria-activewear.com/products/example-product","format":"structured"}'get_product {
"url": "https://astoria-activewear.com/products/example-product",
"format": "structured"
}If the answer says "status": "working", read it again with GET /v1/requests/{id} (MCP: get_results) after check_after_seconds.
Catalogue
Bounded /products.json catalogue starting at page one. No collections, filters or full-inventory guarantee.
- ID
s_astoria_activewear_com.catalog_items- Version
1- Price
- 5 credits / page
- State
- Available
- Typical time
- About 30 s (estimate)
What it does
Reads the store’s product catalogue, one page of products at a time. Works on astoria-activewear.com; other hosts are rejected before anything runs.
Input
One page URL per request, shaped like https://astoria-activewear.com/, plus these bounded parameters.
| Parameter | Type | Allowed | Default | Set in /v1/requests |
|---|---|---|---|---|
max_pages | integer | 1–10 | 1 | max_pages |
max_products | integer | 1–250 | 50 | POST /v1/jobs only |
Price
5 credits / page. With max_pages up to 10, a request costs at most 50 credits. Failed requests are free; a page that loaded but had nothing on it still costs credits. Set max_credits to refuse anything dearer before it runs.
Output
The default, "format": "structured". Every shop answers in the same fields, mapped from the page to the product@1 schema. Fields are null when the page doesn't show them, and a record that can't be mapped is read best-effort from its raw fields. Products are in products, up to 50 a page; follow next_cursor with GET /v1/requests/{id} (MCP: get_results).
| Field | Type | Description |
|---|---|---|
product_id | string or null | Opaque id. Pass it to get_product (or capability "product") to read the product again. |
title | string | Product title as the shop shows it. |
url | string or null | The product page on the shop. |
shop | string or null | The shop’s hostname, without www. |
price | object or null | amount (number), currency (ISO 4217, or null when the shop doesn’t say) and text (the shop’s own wording when it is the same amount, else null). |
original_price | object or null | The price before a discount, in the same shape as price. |
rating | number or null | Average rating, on the shop’s own scale. |
review_count | integer or null | Number of reviews or ratings. |
image_url | string or null | Main product image. |
availability | string or null | in_stock, out_of_stock, or the shop’s own stock wording. |
sponsored | boolean or null | true for an ad the shop marks as sponsored; null when the page doesn’t say. |
{
"request_id": "string",
"status": "done",
"products": [
{
"product_id": "string or null",
"title": "string",
"url": "string or null",
"shop": "string or null",
"price": {
"amount": "number",
"currency": "string or null",
"text": "string or null"
},
"original_price": {
"amount": "number",
"currency": "string or null",
"text": "string or null"
},
"rating": "number or null",
"review_count": "integer or null",
"image_url": "string or null",
"availability": "string or null",
"sponsored": "boolean or null"
}
],
"next_cursor": "string or null",
"meta": {
"as_of": "date-time",
"country": "string",
"credits_used": "integer",
"credits_left": "integer"
}
}Over the Jobs API, GET /v1/jobs/{id}/results?format=structured returns the full product@1 records.
With "format": "raw", the answer keeps the structured fields and adds raw: this endpoint's own records, unchanged, one per item, in the schema below. It is the data the endpoint extracted from the page, not the page's HTML. Same price as structured.
| Field | Type | Description |
|---|---|---|
id | string required | — |
handle | string required | Pattern ^[a-zA-Z0-9_-]+$ |
title | string required | — |
url | string (uri) required | — |
source | "products_json" required | — |
data | object required | Source product/suggestion without inferred money or currency. PDP variant prices retain integer source units; catalogue prices retain decimal strings. Market/currency context is unverified. |
{
"id": "string",
"handle": "string",
"title": "string",
"url": "string (uri)",
"source": "products_json",
"data": "object"
}Over the Jobs API, results are raw by default; format=both gives each raw record with its structured form.
Request
Run exactly this endpoint with capability: "endpoint"; there is no fallback, and a failed run is free. Set format to "raw" for the raw records too.
curl https://api.datawebot.com/v1/requests \
-H "Authorization: Bearer $DATAWEBOT_API_KEY" \
-H "Content-Type: application/json" \
-d '{"capability":"endpoint","endpoint":"s_astoria_activewear_com.catalog_items","url":"https://astoria-activewear.com/","max_pages":1,"format":"structured"}'submit_job {
"endpoint": "s_astoria_activewear_com.catalog_items",
"url": "https://astoria-activewear.com/",
"max_pages": 1,
"format": "structured"
}If the answer says "status": "working", read it again with GET /v1/requests/{id} (MCP: get_results) after check_after_seconds.
Limits
- One page URL per request, on astoria-activewear.com only; other hosts are rejected before anything runs.
- A search or catalogue request reads at most 10 pages (
max_pages). - Prices and stock are read when the request runs (
meta.as_of); datawebot keeps no price history, so schedule and store repeat reads yourself. - Fields the page doesn't show come back null; nothing is filled in or guessed.
- Up to 30 requests a minute per account.
Questions about the astoria-activewear.com scraper API
Does astoria-activewear.com have an official API?
datawebot does not use one. It reads astoria-activewear.com's pages and returns them as structured JSON, so you need no astoria-activewear.com developer account or partner key. Whether astoria-activewear.com offers its own API, and on what terms, is for astoria-activewear.com to say.
Can I scrape astoria-activewear.com with Python?
Yes. Send the POST /v1/requests call shown on this page from Python with any HTTP client, such as requests or httpx: the same JSON body, with your API key in the Authorization header. The products come back in the answer's products field (product for a product page).
Is it legal to scrape astoria-activewear.com?
It depends on where you are, astoria-activewear.com's terms and what you do with the data. You stay responsible for how you use what datawebot returns. This is not legal advice; read our guide to robots.txt and legal considerations, and ask a lawyer about your case.
What does a astoria-activewear.com scraper API call cost?
5 credits per search page, 1 per product page and 5 per catalogue page. Failed requests are free; a page that loaded but had nothing on it still costs credits. Every account starts with 200 free credits, and credit packs start at 10,000 credits for $10, with no subscription.
Start with 200 free credits
Connect your agent with one setup prompt, or create an API key, and run astoria-activewear.com requests right away. No card and no subscription.
Connect your agent See pricing