Products
Revenue and conversions broken down by product or plan. REST endpoints, parameters, and response schemas for the SourceLoop attribution API.
| Endpoint | Method | Path | Permission |
|---|---|---|---|
| Get products Per-product sales for a connected store | GET | /v1/products | metrics:read |
Base URL https://app.sourceloop.ai/api/v1
Get products
Per-product sales for a connected store
GET /v1/products
Requires metrics:read
Revenue, units, orders and margin per product, NET of refunds.
Margin covers only the share of revenue whose cost the merchant has set, and `meta.cost_coverage_pct` reports that share. Below 100 the margin describes part of the catalogue rather than all of it.
An empty list with `meta.no_data_reason` means no store is connected or no orders were placed, which is not the same as selling nothing.
curl -s -X GET "https://app.sourceloop.ai/api/v1/products?website=acme.com&period=last%2030%20days&platform=shopify" \
-H "Authorization: Bearer $SOURCELOOP_API_KEY" const res = await fetch(
"https://app.sourceloop.ai/api/v1/products?website=acme.com&period=last%2030%20days&platform=shopify",
{
method: "GET",
headers: {
Authorization: `Bearer ${process.env.SOURCELOOP_API_KEY}`,
},
},
);
const data = await res.json(); import os, requests
res = requests.get(
"https://app.sourceloop.ai/api/v1/products?website=acme.com&period=last%2030%20days&platform=shopify",
headers={"Authorization": f"Bearer {os.environ['SOURCELOOP_API_KEY']}"},
)
data = res.json() Query parameters
websitestringWebsite domain, e.g. acme.com. Required only when the key covers more than one.
periodstringPlain-language period: "last 30 days", "yesterday", "July 2026", or "2026-07-01..2026-07-31". Ignored when from/to are given.
Example
last 30 daysplatformstringDefault
shopifylimitintegerDefault
100
Responses
-
200One row per product -
429Too many requests for this workspace in the current minute. Wait Retry-After seconds and repeat the request unchanged.