Skip to main content
cURL
Cost: 1 API credit per call.
Covers every connected shop in the workspace unless shop_id narrows it, and every listing that sold unless listing_id names up to 50 (comma-separated). Listings you name are picked before the ranking and the limits, so they are never left out. A shop or listing outside the workspace answers 404. Needs the Customer analytics workspace permission, as orders do. Until 2026-11-10 this endpoint’s path was /v1/workspace/variation-sales, which now answers 410 endpoint_removed.

Choose the range

An order counts on the day it was placed. from and to go together, and never with period: any other mix answers 400. Days are UTC, not Etsy’s US Eastern days, so a single day can differ from Etsy Shop Manager.

What the answer holds

listings holds each listing sold in the range, most orders first. Each listing has: The top-level coverage counts the same over every included shop. freshness and as_of say when each shop’s orders were synced. An order with two items of one listing in different options counts once in the listing’s orders and once in each combination’s. So a listing’s orders can be less than the sum of its combinations’.

Unknown options

A line whose options Alura hasn’t stored yet, or can’t read, is unknown: it never counts as “no options”. It is counted in coverage.unknown and in its listing’s unknown, never in a combination. Compare coverage.known with coverage.lines before you rank combinations.
A null unit count means one of its order lines has no quantity in Alura. It is never counted as 0. Personalization answers are never part of a combination or of this answer. To read them, use Get an order.
At most 100 listings, each with at most 100 combinations. listings_omitted and each listing’s variations_omitted count the rest. Ask for fewer shops, a shorter range, or name the listings with listing_id to see them. A range whose shops sold more than 20,000 listing and option combinations answers 400.
This endpoint counts items and orders, not money. For revenue, costs and profit, use Get shop stats.

Authorizations

Authorization
string
header
required

An API key: Authorization: Bearer alura_sk_....

Query Parameters

shop_id
string[]

Only these connected shops, comma-separated; default every connected shop of the workspace. A shop outside the workspace is 404.

listing_id
string[]

Only these listings, comma-separated (at most 50); default every listing that sold. They are chosen before the ranking and the limits, so a listing named is never left out. A listing outside the workspace is 404.

period
enum<string>

7d, 30d, 90d or 365d: the last 7, 30, 90 or 365 days, ending on the newest day every included shop's orders are complete for (as shop stats end theirs). Default 30d. Not with from/to.

Available options:
7d,
30d,
90d,
365d
Example:

"90d"

from
string

First day of the range (UTC), inclusive. Needs to.

Pattern: ^[0-9]{4}-[0-9]{2}-[0-9]{2}$
to
string

Last day of the range (UTC), inclusive. Needs from; at most 366 days after it.

Pattern: ^[0-9]{4}-[0-9]{2}-[0-9]{2}$
fields
string

Comma-separated dotted paths to return; id, object and as_of always come back.

Response

OK

object
string
required
Allowed value: "workspace.variation_stats"
shop_ids
string[]
required

The connected shops included.

from
string
required

The range's first day (UTC).

to
string
required

The range's last day (UTC).

listings
object[]
required

Each listing sold in the range, most orders first.

listings_omitted
integer
required

Listings left out of listings past the limit.

coverage
object
required

How many order lines in the range, over every included shop, the combinations account for.

as_of
string<date-time> | null
required

The oldest included shop's orders sync time.

Pattern: ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d:[0-5]\d(?:\.\d+)?(?:Z))$
freshness
object[]
required

Each included shop's orders sync time.

notices
object[]
required

What is stale; empty when nothing is.