curl "https://api.alura.io/v1/workspace/changes/chn_1005" \
-H "Authorization: Bearer $ALURA_API_KEY"const res = await fetch('https://api.alura.io/v1/workspace/changes/chn_1005', {
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/chn_1005",
headers={
"Authorization": f"Bearer {os.environ['ALURA_API_KEY']}",
},
)
with urllib.request.urlopen(request) as response:
print(json.load(response)){
"object": "workspace.change",
"id": "chn_1005",
"shop_id": "22841907",
"target": {
"type": "listing",
"id": "1834720562"
},
"source": "automation",
"actor": {
"type": "automation",
"id": "4100"
},
"write_id": null,
"outcome": "succeeded",
"fields": [
{
"field": "quantity",
"before": 12,
"after": 40,
"unrecorded": [],
"omitted": []
}
],
"before_source": null,
"before_as_of": null,
"revertable": false,
"not_revertable_reason": "legacy_app_write",
"created_at": "2026-10-16T18:00:00.000Z",
"as_of": "2026-10-17T12:00:00.000Z"
}{
"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"
}Get a change
One change Alura made to a listing of your connected Etsy shops, by its ID (chn_...): every field it changed, before and after. 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 change outside the workspace is 404; an ID of another type (such as a chg_ charge) is 400 id_type_mismatch. Costs 1 API credit per call.
Cost: 1 API credit per call.
curl "https://api.alura.io/v1/workspace/changes/chn_1005" \
-H "Authorization: Bearer $ALURA_API_KEY"const res = await fetch('https://api.alura.io/v1/workspace/changes/chn_1005', {
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/chn_1005",
headers={
"Authorization": f"Bearer {os.environ['ALURA_API_KEY']}",
},
)
with urllib.request.urlopen(request) as response:
print(json.load(response)){
"object": "workspace.change",
"id": "chn_1005",
"shop_id": "22841907",
"target": {
"type": "listing",
"id": "1834720562"
},
"source": "automation",
"actor": {
"type": "automation",
"id": "4100"
},
"write_id": null,
"outcome": "succeeded",
"fields": [
{
"field": "quantity",
"before": 12,
"after": 40,
"unrecorded": [],
"omitted": []
}
],
"before_source": null,
"before_as_of": null,
"revertable": false,
"not_revertable_reason": "legacy_app_write",
"created_at": "2026-10-16T18:00:00.000Z",
"as_of": "2026-10-17T12:00:00.000Z"
}{
"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_....
Path Parameters
The change ID, chn_….
1 - 64"chn_1005"
Query Parameters
Comma-separated dotted paths to return; id, object and as_of always come back.
Response
OK
"workspace.change"chn_ + the change's number (a change the app made), or chn_ + a write's 26-character ID (a change made through the API).
The connected shop the changed listing belongs to.
What the change was made to.
Show child attributes
Show child attributes
Where the change came from: app (someone in Alura), automation (an Alura automation), ai_optimize (an AI optimization applied in Alura), ai_create (a listing created with AI in Alura), revert (a revert of an earlier change), and api (a write through the API). New values may be added.
Who made the change; null when that user no longer exists.
Show child attributes
Show child attributes
The API write that made the change; null for a change made in the app.
succeeded, or partial when only some fields landed on Etsy. New values may be added.
What changed, field by field. Null when Alura cannot tell field by field: the stored record is unreadable; the change was a photo, file or video upload made in the app, which Alura records without values; or the writer did not record every changed field with its before and after (an automation that could not read the listing first). Never an empty or shortened list.
Show child attributes
Show child attributes
Where before came from: live (read from Etsy during the write) or cache (Alura's copy); null when unknown, as for every change made in the app.
When before was current; null when unknown.
Whether Alura can undo the change; false for every change in this version (history only).
Why it cannot be reverted: legacy_app_write for a change made in the app (history only). Null when it can. New values may be added.
When the change was made.
When this record was read.