curl "https://api.alura.io/v1/workspace/changes?source=ai_optimize" \
-H "Authorization: Bearer $ALURA_API_KEY"const res = await fetch('https://api.alura.io/v1/workspace/changes?source=ai_optimize', {
headers: {
Authorization: `Bearer ${process.env.ALURA_API_KEY}`,
},
});
console.log(await res.json());import json
import os
import urllib.request
request = urllib.request.Request(
"https://api.alura.io/v1/workspace/changes?source=ai_optimize",
headers={
"Authorization": f"Bearer {os.environ['ALURA_API_KEY']}",
},
)
with urllib.request.urlopen(request) as response:
print(json.load(response)){
"object": "list",
"data": [
{
"object": "workspace.change",
"id": "chn_1003",
"shop_id": "22841907",
"target": {
"type": "listing",
"id": "1834720561"
},
"source": "ai_optimize",
"actor": {
"type": "user",
"id": "4100"
},
"write_id": null,
"outcome": "succeeded",
"fields": [
{
"field": "description",
"before": "An 11oz ceramic mug.",
"after": "A personalized 11oz ceramic mug with the name of your choice.",
"unrecorded": [],
"omitted": []
},
{
"field": "tags",
"before": [
"mug"
],
"after": [
"mug",
"name mug",
"custom mug",
"gift for her"
],
"unrecorded": [],
"omitted": []
},
{
"field": "attributes[513]",
"before": null,
"after": {
"property_id": 513,
"value_ids": [
1024
],
"values": [
"Ceramic"
],
"scale_id": null
},
"unrecorded": [],
"omitted": []
}
],
"before_source": null,
"before_as_of": null,
"revertable": false,
"not_revertable_reason": "legacy_app_write",
"created_at": "2026-10-15T14:05:00.000Z",
"as_of": "2026-10-17T12:00:00.000Z"
}
],
"has_more": false,
"next_cursor": null,
"total": {
"value": 1,
"relation": "eq"
}
}{
"type": "https://docs.alura.io/errors/invalid_request",
"title": "Invalid request",
"status": 400,
"code": "invalid_request",
"detail": "Invalid request",
"suggestion": "Fix the request as the detail says, then send it again.",
"retryable": false,
"request_id": "req_01JQ5W3H8M2N4P6R8T0V2X4Z6B"
}{
"type": "https://docs.alura.io/errors/unauthorized",
"title": "Unauthorized",
"status": 401,
"code": "unauthorized",
"detail": "Unauthorized",
"suggestion": "Send a valid API key as `Authorization: Bearer alura_sk_...`.",
"retryable": false,
"request_id": "req_01JQ5W3H8M2N4P6R8T0V2X4Z6B"
}{
"type": "https://docs.alura.io/errors/credits_exhausted",
"title": "API credits exhausted",
"status": 402,
"code": "credits_exhausted",
"detail": "API credits exhausted",
"suggestion": "Upgrade the plan or wait for the monthly reset.",
"retryable": false,
"request_id": "req_01JQ5W3H8M2N4P6R8T0V2X4Z6B"
}{
"type": "https://docs.alura.io/errors/plan_required",
"title": "Plan required",
"status": 403,
"code": "plan_required",
"detail": "Plan required",
"suggestion": "Upgrade the workspace plan to use this operation.",
"retryable": false,
"request_id": "req_01JQ5W3H8M2N4P6R8T0V2X4Z6B"
}{
"type": "https://docs.alura.io/errors/not_found",
"title": "Not found",
"status": 404,
"code": "not_found",
"detail": "Not found",
"suggestion": "Check the ID, or search for it first.",
"retryable": false,
"request_id": "req_01JQ5W3H8M2N4P6R8T0V2X4Z6B"
}{
"type": "https://docs.alura.io/errors/method_not_allowed",
"title": "Method not allowed",
"status": 405,
"code": "method_not_allowed",
"detail": "Method not allowed",
"suggestion": "Use one of the methods in the Allow header.",
"retryable": false,
"request_id": "req_01JQ5W3H8M2N4P6R8T0V2X4Z6B"
}{
"type": "https://docs.alura.io/errors/rate_limited",
"title": "Rate limited",
"status": 429,
"code": "rate_limited",
"detail": "Rate limited",
"suggestion": "Wait for Retry-After, then retry.",
"retryable": true,
"request_id": "req_01JQ5W3H8M2N4P6R8T0V2X4Z6B"
}{
"type": "https://docs.alura.io/errors/internal_error",
"title": "Internal error",
"status": 500,
"code": "internal_error",
"detail": "Internal error",
"suggestion": "Retry; if it keeps failing, report the request_id.",
"retryable": true,
"request_id": "req_01JQ5W3H8M2N4P6R8T0V2X4Z6B"
}{
"type": "https://docs.alura.io/errors/credits_unavailable",
"title": "API credits unavailable",
"status": 503,
"code": "credits_unavailable",
"detail": "API credits unavailable",
"suggestion": "Retry shortly.",
"retryable": true,
"request_id": "req_01JQ5W3H8M2N4P6R8T0V2X4Z6B"
}List changes
The changes Alura made to the listings of your connected Etsy shops, newest first: which fields changed, from what to what, who made the change and where it came from. Filter by shop_id, listing_id, source and from/to (when it was made; to is exclusive). In this version every change is one made in Alura (by someone in the app, an automation, or an AI optimization or creation applied there): history only, never revertable (not_revertable_reason: legacy_app_write). Not every Alura write is in it: Alura’s A/B tests (their listing, inventory, photo and video changes) and the legacy app at app.alura.io (its edits, photos, videos, auto-renew and publishing) write to Etsy around the change log, so their changes can be missing. Edits made directly on Etsy, and by tools outside Alura, are not in it either. A change is shown under the shop its listing belongs to. A shop or listing outside the workspace is 404. total is exact up to 1,000 changes, then {"value": 1000, "relation": "gte"} (below the usual 10,000: each change’s shop is checked one row at a time). Costs 1 API credit per page with results; an empty page is free.
Cost: 1 API credit per page.
curl "https://api.alura.io/v1/workspace/changes?source=ai_optimize" \
-H "Authorization: Bearer $ALURA_API_KEY"const res = await fetch('https://api.alura.io/v1/workspace/changes?source=ai_optimize', {
headers: {
Authorization: `Bearer ${process.env.ALURA_API_KEY}`,
},
});
console.log(await res.json());import json
import os
import urllib.request
request = urllib.request.Request(
"https://api.alura.io/v1/workspace/changes?source=ai_optimize",
headers={
"Authorization": f"Bearer {os.environ['ALURA_API_KEY']}",
},
)
with urllib.request.urlopen(request) as response:
print(json.load(response)){
"object": "list",
"data": [
{
"object": "workspace.change",
"id": "chn_1003",
"shop_id": "22841907",
"target": {
"type": "listing",
"id": "1834720561"
},
"source": "ai_optimize",
"actor": {
"type": "user",
"id": "4100"
},
"write_id": null,
"outcome": "succeeded",
"fields": [
{
"field": "description",
"before": "An 11oz ceramic mug.",
"after": "A personalized 11oz ceramic mug with the name of your choice.",
"unrecorded": [],
"omitted": []
},
{
"field": "tags",
"before": [
"mug"
],
"after": [
"mug",
"name mug",
"custom mug",
"gift for her"
],
"unrecorded": [],
"omitted": []
},
{
"field": "attributes[513]",
"before": null,
"after": {
"property_id": 513,
"value_ids": [
1024
],
"values": [
"Ceramic"
],
"scale_id": null
},
"unrecorded": [],
"omitted": []
}
],
"before_source": null,
"before_as_of": null,
"revertable": false,
"not_revertable_reason": "legacy_app_write",
"created_at": "2026-10-15T14:05:00.000Z",
"as_of": "2026-10-17T12:00:00.000Z"
}
],
"has_more": false,
"next_cursor": null,
"total": {
"value": 1,
"relation": "eq"
}
}{
"type": "https://docs.alura.io/errors/invalid_request",
"title": "Invalid request",
"status": 400,
"code": "invalid_request",
"detail": "Invalid request",
"suggestion": "Fix the request as the detail says, then send it again.",
"retryable": false,
"request_id": "req_01JQ5W3H8M2N4P6R8T0V2X4Z6B"
}{
"type": "https://docs.alura.io/errors/unauthorized",
"title": "Unauthorized",
"status": 401,
"code": "unauthorized",
"detail": "Unauthorized",
"suggestion": "Send a valid API key as `Authorization: Bearer alura_sk_...`.",
"retryable": false,
"request_id": "req_01JQ5W3H8M2N4P6R8T0V2X4Z6B"
}{
"type": "https://docs.alura.io/errors/credits_exhausted",
"title": "API credits exhausted",
"status": 402,
"code": "credits_exhausted",
"detail": "API credits exhausted",
"suggestion": "Upgrade the plan or wait for the monthly reset.",
"retryable": false,
"request_id": "req_01JQ5W3H8M2N4P6R8T0V2X4Z6B"
}{
"type": "https://docs.alura.io/errors/plan_required",
"title": "Plan required",
"status": 403,
"code": "plan_required",
"detail": "Plan required",
"suggestion": "Upgrade the workspace plan to use this operation.",
"retryable": false,
"request_id": "req_01JQ5W3H8M2N4P6R8T0V2X4Z6B"
}{
"type": "https://docs.alura.io/errors/not_found",
"title": "Not found",
"status": 404,
"code": "not_found",
"detail": "Not found",
"suggestion": "Check the ID, or search for it first.",
"retryable": false,
"request_id": "req_01JQ5W3H8M2N4P6R8T0V2X4Z6B"
}{
"type": "https://docs.alura.io/errors/method_not_allowed",
"title": "Method not allowed",
"status": 405,
"code": "method_not_allowed",
"detail": "Method not allowed",
"suggestion": "Use one of the methods in the Allow header.",
"retryable": false,
"request_id": "req_01JQ5W3H8M2N4P6R8T0V2X4Z6B"
}{
"type": "https://docs.alura.io/errors/rate_limited",
"title": "Rate limited",
"status": 429,
"code": "rate_limited",
"detail": "Rate limited",
"suggestion": "Wait for Retry-After, then retry.",
"retryable": true,
"request_id": "req_01JQ5W3H8M2N4P6R8T0V2X4Z6B"
}{
"type": "https://docs.alura.io/errors/internal_error",
"title": "Internal error",
"status": 500,
"code": "internal_error",
"detail": "Internal error",
"suggestion": "Retry; if it keeps failing, report the request_id.",
"retryable": true,
"request_id": "req_01JQ5W3H8M2N4P6R8T0V2X4Z6B"
}{
"type": "https://docs.alura.io/errors/credits_unavailable",
"title": "API credits unavailable",
"status": 503,
"code": "credits_unavailable",
"detail": "API credits unavailable",
"suggestion": "Retry shortly.",
"retryable": true,
"request_id": "req_01JQ5W3H8M2N4P6R8T0V2X4Z6B"
}Authorizations
An API key: Authorization: Bearer alura_sk_....
Query Parameters
Only these connected shops, comma-separated; default every connected shop of the workspace. A shop outside the workspace is 404.
Only changes to this listing. A listing outside the workspace is 404.
^[0-9]{1,20}$Only changes from this source: app, api, automation, ai_optimize, ai_create, revert.
app, api, automation, ai_optimize, ai_create, revert "ai_optimize"
Only changes made at or after this time: a date (YYYY-MM-DD, midnight UTC) or an ISO 8601 date-time.
^\d{4}-\d{2}-\d{2}(T\d{2}:\d{2}(:\d{2}(\.\d{1,3})?)?(Z|[+-]\d{2}:\d{2}))?$Only changes made before this time: a date (YYYY-MM-DD, midnight UTC) or an ISO 8601 date-time.
^\d{4}-\d{2}-\d{2}(T\d{2}:\d{2}(:\d{2}(\.\d{1,3})?)?(Z|[+-]\d{2}:\d{2}))?$Page size: default 25, at most 100.
1 <= x <= 100The next_cursor of the previous page. Bound to the query, the workspace and the key.
Comma-separated dotted paths to return; id, object and as_of always come back.