Working with Captures
A Capture is one structured product record produced by a successful product-page extraction or valid Import row. It retains the source URL or import lineage and the time the source was observed.
Browsing captures
• Dashboard
Navigate to Extract > Captures to view your extracted data.
The list covers the last 90 days. To see older Captures, open their Run from Extract > Runs, or choose the Run or Import as the source: one source's Captures are always listed in full.
The search field finds Captures matching your query. Beside it, open Filters to narrow the results, then select Apply:
- Source: choose a Run or Import to inspect its Captures.
- Robot: compare Captures across Runs from the same Robot.
- Host and Country: narrow the site or market.
Choose the source first when you want to inspect the output of one Run. Select Apply to update the table.
Below the filters, a chart counts Captures per day. Drag its handles to narrow the observation period. The line under the chart gives the number of matching Captures and the days they cover.
The table shows each product's image, Title, Brand, SKUs, Store (its host and country), Source (the Run or Import), and Captured time. Scroll horizontally when additional columns are outside the viewport.
Click a row to open its detail panel:
- Details — inspect the images, options, price, availability, and other product data.
- Raw data — inspect or copy the complete Capture as JSON.
• API
List captures from a specific run:
export EXTRALT_API_KEY="your-api-key"
curl -s "https://api.extralt.com/v1/extract/captures?run_id=$RUN_ID" \
-H "Authorization: Bearer $EXTRALT_API_KEY" | jqThe response is { data, next_cursor }. The default page size is 100 and the
maximum is 1,000. See Common Patterns
for paginating through large result sets with next_cursor.
Extraction data schema
Every Capture follows the same base product-data contract across sources.
{
"source_kind": "run",
"sku_coverage": "partial",
"source_id": "example-run",
"observed_at_basis": "acquired",
"id": "019d3ec3-cf96-7520-bc31-1474206e06ed",
"url": "https://www.nike.com/t/dna-mens-dri-fit-basketball-shorts-hVGm16/HV1878-350",
"extracted_at": 1774874512106,
"product_id": "HV1878-350",
"handle": "dna-mens-dri-fit-basketball-shorts-hVGm16",
"group_id": "hVGm16",
"title": "Nike DNA",
"subtitle": "Men's Dri-FIT Basketball Shorts",
"brand": "Nike",
"breadcrumbs": "Men > Basketball > Shorts",
"description": "Built for the court, ready for anywhere. These lightweight-yet-durable basketball shorts help keep you cool with our sweat-wicking Dri-FIT technology.",
"publication_date": "2025-10-02T07:00:00.000Z",
"gender": "MEN",
"age_group": "Adult",
"ratings_average": null,
"ratings_count": 0,
"ratings_scale": 5,
"sku_count": 7,
"image_url": "https://static.nike.com/a/images/t_default/326dc2d4-a16d-4433-93d7-8d6f8313d4d0/M+NK+DF+DNA+8IN+SHORT+AOP.png",
"categories": [
"Men",
"Basketball",
"Shorts"
],
"tags": [
"Basketball",
"Dri-FIT",
"Shorts",
"Men"
],
"images": [
{
"url": "https://static.nike.com/a/images/t_default/326dc2d4-a16d-4433-93d7-8d6f8313d4d0/M+NK+DF+DNA+8IN+SHORT+AOP.png",
"position": 1,
"sku_ids": [
"HV1878-350"
]
},
{
"url": "https://static.nike.com/a/images/t_default/e2c6c1aa-6d12-46b9-9385-d76bd4fa30e0/M+NK+DF+DNA+8IN+SHORT+AOP.png",
"position": 3,
"sku_ids": [
"HV1878-350"
]
},
{
"url": "https://static.nike.com/a/images/t_default/38d8c21c-c8dd-466b-949c-92fdfcd0320b/M+NK+DF+DNA+8IN+SHORT+AOP.png",
"position": 4,
"sku_ids": [
"HV1878-350"
]
},
{
"url": "https://static.nike.com/a/images/t_default/79d907aa-1763-4af7-a1bf-99f5fc30acc4/M+NK+DF+DNA+8IN+SHORT+AOP.png",
"position": 5,
"sku_ids": [
"HV1878-350"
]
},
{
"url": "https://static.nike.com/a/images/t_default/1cd3d1a3-fea9-4295-bf8a-f3d6d59f2d47/M+NK+DF+DNA+8IN+SHORT+AOP.png",
"position": 6,
"sku_ids": [
"HV1878-350"
]
},
{
"url": "https://static.nike.com/a/images/t_default/3cf19355-4f26-4faf-b658-581297b87e9c/M+NK+DF+DNA+8IN+SHORT+AOP.png",
"position": 7,
"sku_ids": [
"HV1878-350"
]
}
],
"videos": null,
"physical_measurements": null,
"properties_dict": {
"Style": "HV1878-350",
"Shown": "Chlorophyll/Black"
},
"properties_list": [
"Recycled Materials",
"Designed for Basketball",
"Unlined",
"Lightweight, sweat-wicking fabric with mesh and smooth interior",
"Side pockets and zippered utility pocket large enough for a phone",
"Elastic waistband with drawcord",
"Body: 100% polyester. Pocket bags: 100% polyester.",
"Machine wash",
"Imported",
"Shown: Chlorophyll/Black",
"Style: HV1878-350"
],
"options": {
"opt1": {
"name": "Color",
"values": [
"Chlorophyll/Black"
]
},
"opt2": {
"name": "Size",
"values": [
"S",
"M",
"L",
"XL",
"2XL",
"3XL",
"4XL"
]
},
"opt3": null
},
"skus": [
{
"id": "90c9f2c2-d984-5cc2-a2a0-89deac668eb3",
"title": null,
"offer_coverage": "partial",
"identifiers": {
"gtin": "00198482162061",
"mpn": "HV1878-350"
},
"opt1": "Chlorophyll/Black",
"opt2": "S",
"opt3": null,
"offers": [
{
"price": {
"amount": "41.97",
"compare_at_price": "60",
"currency": "USD",
"unit": "major"
},
"availability": {
"in_stock": true,
"quantity": "In stock"
},
"condition": "new",
"seller": "Nike",
"seller_type": "1p"
}
]
},
{
"id": "032621f4-8f17-5716-932d-a93b0d1dfc4a",
"title": null,
"offer_coverage": "partial",
"identifiers": {
"gtin": "00198481839179",
"mpn": "HV1878-350"
},
"opt1": "Chlorophyll/Black",
"opt2": "M",
"opt3": null,
"offers": [
{
"price": {
"amount": "41.97",
"compare_at_price": "60",
"currency": "USD",
"unit": "major"
},
"availability": {
"in_stock": true,
"quantity": "In stock"
},
"condition": "new",
"seller": "Nike",
"seller_type": "1p"
}
]
},
{
"id": "a73069dc-17b2-5dc7-b5cc-e78c9674d8cd",
"title": null,
"offer_coverage": "partial",
"identifiers": {
"gtin": "00198481982455",
"mpn": "HV1878-350"
},
"opt1": "Chlorophyll/Black",
"opt2": "L",
"opt3": null,
"offers": [
{
"price": {
"amount": "41.97",
"compare_at_price": "60",
"currency": "USD",
"unit": "major"
},
"availability": {
"in_stock": true,
"quantity": "In stock"
},
"condition": "new",
"seller": "Nike",
"seller_type": "1p"
}
]
},
{
"id": "417e97e7-c31c-5ac0-999c-5b6779ba831d",
"title": null,
"offer_coverage": "partial",
"identifiers": {
"gtin": "00198482264932",
"mpn": "HV1878-350"
},
"opt1": "Chlorophyll/Black",
"opt2": "XL",
"opt3": null,
"offers": [
{
"price": {
"amount": "41.97",
"compare_at_price": "60",
"currency": "USD",
"unit": "major"
},
"availability": {
"in_stock": true,
"quantity": "In stock"
},
"condition": "new",
"seller": "Nike",
"seller_type": "1p"
}
]
},
{
"id": "42484108-e343-520f-9ed1-1ca72a301174",
"title": null,
"offer_coverage": "partial",
"identifiers": {
"gtin": "00198481731473",
"mpn": "HV1878-350"
},
"opt1": "Chlorophyll/Black",
"opt2": "2XL",
"opt3": null,
"offers": [
{
"price": {
"amount": "41.97",
"compare_at_price": "60",
"currency": "USD",
"unit": "major"
},
"availability": {
"in_stock": true,
"quantity": "Limited stock available"
},
"condition": "new",
"seller": "Nike",
"seller_type": "1p"
}
]
},
{
"id": "179d2b07-b59e-5a7d-912f-cebf81b1d13f",
"title": null,
"offer_coverage": "partial",
"identifiers": {
"mpn": "HV1878-350",
"gtin": "00198482258597"
},
"opt1": "Chlorophyll/Black",
"opt2": "3XL",
"opt3": null,
"offers": [
{
"price": {
"amount": "41.97",
"compare_at_price": "60",
"currency": "USD",
"unit": "major"
},
"availability": {
"in_stock": false,
"quantity": "Out of stock"
},
"condition": "new",
"seller": "Nike",
"seller_type": "1p"
}
]
},
{
"id": "fad73aae-e6b1-58ac-83a3-f17125c0b3b2",
"title": null,
"offer_coverage": "partial",
"identifiers": {
"gtin": "00198482211318",
"mpn": "HV1878-350"
},
"opt1": "Chlorophyll/Black",
"opt2": "4XL",
"opt3": null,
"offers": [
{
"price": {
"amount": "41.97",
"compare_at_price": "60",
"currency": "USD",
"unit": "major"
},
"availability": {
"in_stock": false,
"quantity": "Out of stock"
},
"condition": "new",
"seller": "Nike",
"seller_type": "1p"
}
]
}
]
}Key fields:
| Field | Description |
|---|---|
product_id | Primary product identifier on the site (product handle, ASIN, etc.) |
group_id | Groups related captures for the same source product family (e.g., different color pages) |
title, brand, description | Core product identity |
image_url | Primary product image URL |
images | Product images with position and optional SKU association |
skus[].offers[].price | Required source selling price, optional comparison price, source currency, and unit (major or unscaled minor) |
sku_count | Total number of purchasable SKUs |
properties_dict | Structured attributes as key-value pairs (material, closure, etc.) |
properties_list | Unstructured features and claims (bullet points from the product page) |
ratings_average, ratings_count, ratings_scale | Rating metrics |
options | Up to 3 option axes (e.g., Color, Size) with all available values |
skus | One entry per purchasable option combination, each with identifiers and offers |
skus[].identifiers | GTIN, SKU, MPN, and other identifiers for this purchasable SKU |
skus[].offers | Price, availability, condition, and seller for each offer |
skus[].offers[].seller_type | 1p (marketplace selling directly), 3p (third-party seller), or null |
Prices in minor units are decoded only when the source supplies their scale. Otherwise, Capture preserves the amount with unit: minor; Enrich excludes that unresolved price from analytics. Product-level price and availability summaries are computed after enrichment.
The Capture contract is stable across sources, but field population depends on what the page exposes and what the Robot can validate. Use the OpenAPI Capture schema for requiredness and types; do not treat an absent source fact as a measured zero.
Exporting captures
• Dashboard
Choose Export above the table to download all matching Captures as JSONL, including results beyond the current page. Apply your filters first to control what is included. Each line contains one Capture with its original product data and source information.
For Parquet, use the API export endpoint below. Parquet preserves column types and works well with DuckDB, pandas, and data pipelines.
• API
For bulk download, use the export endpoint. It streams all captures from the run as a single file with Content-Disposition: attachment. The format query parameter accepts parquet (default) or jsonl.
# Parquet (default)
curl -sL "https://api.extralt.com/v1/extract/captures/export" \
--url-query "run_id=$RUN_ID" --url-query format=parquet \
-H "Authorization: Bearer $EXTRALT_API_KEY" \
-o captures.parquet
# JSONL
curl -sL "https://api.extralt.com/v1/extract/captures/export" \
--url-query "run_id=$RUN_ID" --url-query format=jsonl \
-H "Authorization: Bearer $EXTRALT_API_KEY" \
-o captures.jsonl