curl -G "https://www.merchkit.com/api/v1/images" \ -H "Authorization: Bearer $MERCHKIT_API_KEY" \ --data-urlencode "filter[file_name]=aria-hero.jpg"# -G with --data-urlencode is the reliable shape: curl encodes the# brackets and any spaces in the value, so the query arrives intact.
Returns a paginated page of images in the one-map resource shape (system fields top-level, every customer key under attributes). Reference attributes embed COMPLETE as labeled stubs — no expansion calls; inverse-reference keys never appear (query the other side via filters, or page /products/{id}/references). Filter with filter[<key>]=<value> / filter[<key>][<op>]=<value> (see the filter parameter for the grammar), sort with sort, page with limit/offset, and narrow the returned keys with fields=<key>,<key>.
Scope: read:images.
GET
/
images
curl -G "https://www.merchkit.com/api/v1/images" \ -H "Authorization: Bearer $MERCHKIT_API_KEY" \ --data-urlencode "filter[file_name]=aria-hero.jpg"# -G with --data-urlencode is the reliable shape: curl encodes the# brackets and any spaces in the value, so the query arrives intact.
Workspace-scoped API key (mk_live_...). Each operation lists the scope it requires in x-required-scopes. See the Authentication guide for the full scope table and key management.
Query Parameters
limit
integer
default:50
Rows per page, 1 to 200. Defaults to 50.
Larger pages mean fewer round-trips. 200 is also the cap on in
operator value lists, so refetching a full page of IDs with
filter[id][in]=... always fits in one call.
Required range: 1 <= x <= 200
offset
integer
default:0
Rows to skip. Zero-based. Echoed back in pagination.offset.
Page forward by adding limit each time. Stop when
pagination.has_more is false rather than comparing counts.
Default order is created_at ascending, which keeps long sweeps
stable: new rows land at the end instead of shifting pages you
have not read yet.
Required range: x >= 0
sort
string
Comma-separated keys. Prefix with - for descending:
sort=-updated_at,sku. Defaults to created_at ascending.
Sortable: text, number, and date attributes, plus id,
parent_id, created_at, and updated_at. Reference and
list-reference keys have no scalar order. Sorting on one returns
400 (not_sortable).
filter
object
Narrow results by attribute value. Filtering runs in the database,
so pagination.total reflects matches, not the whole catalog.
Two forms: filter[sku]=ARIA-DT-72 is shorthand for equals.
filter[price][gte]=100 uses the bracket-operator form
filter[<key>][<op>]=<value>.
Keys: any attribute key from GET /attributes, plus id,
parent_id, created_at, and updated_at. Reference keys like
vendor match on UUID, not name.
Number, date, timestamp: gt, gte, lt, lte. A bare date means UTC midnight.
Any type: exists (=true has a value, =false is blank)
Text, id, and reference keys: in (comma-separated OR-of-equals, up to 200 values)
Examples:
filter[sku]=ARIA-DT-72 one product by your own identifier
filter[description][exists]=false everything missing a description
filter[price][gte]=100&filter[material]=Oak both must match (see filter_join)
filter[id][in]=<uuid1>,<uuid2> refetch a known set in one call
filter[vendor]=<uuid>&sort=-updated_at one vendor's catalog, newest first
A bad filter never silently matches everything. Unknown keys, unknown operators,
or type mismatches return 400 with field_errors naming the exact clause.
Brackets and spaces need URL-encoding. With curl, use
-G --data-urlencode "filter[vendor_name]=Nordic Timber Co.".
In JavaScript, let URLSearchParams handle it.
Show child attributes
filter_join
enum<string>
default:and
How multiple filter clauses combine. and means every clause
must match (the default). or means any clause can match.
Case-insensitive. Any other value returns 400.
Only matters with two or more clauses. One join applies to all of
them. There is no grouping or nesting, so mixed AND/OR logic
belongs on your side.
For OR across values of the same key, prefer
filter[<key>][in]=a,b,c. One clause, up to 200 values, and it
reads better in a log.
Available options:
and,
or
fields
string
Return only the attribute keys you name instead of every populated
one. Useful when a workspace has hundreds of attributes and your
integration reads a handful.
fields=sku,price (comma-separated) or fields=sku&fields=price
(repeated param, same result). Omit it entirely to get every
populated key.
Only the attributes map narrows. System fields (id, type,
label, parent_id, created_at, updated_at) always come back,
so naming one returns 400. label still resolves from the primary
attribute whether or not you select it. pagination.total is
unchanged. filter and sort are independent: filter on keys you
did not select.
Sparse still means sparse. A selected key with no value stays
absent. Keep reading attributes[key] ?? null.
Reference keys return {id, type, label} stubs as usual, but
fields does not reach through them.
fields=gallery_images.image_url is not supported. Select the
reference key, then batch-fetch:
GET /images?filter[id][in]=<ids>&fields=image_url.
Unknown keys return 400 with field_errors. Inverse-reference
keys are rejected the same way. They are queries, not stored values.
Read them via /{resource}/{id}/references?attribute=.
Selecting only non-reference keys skips the reference join entirely,
which avoids loading every referenced entity just to attach its label.
{"docsConfig":{"theme":"mint","$schema":"https://mintlify.com/docs.json","name":"Merchkit","description":"Merchkit is an AI-native PIM: import your catalog, enrich it with AI, and publish channel-ready content. Product guides plus the developer reference for the Merchkit API and MCP server.","colors":{"primary":"#3E703F","light":"#6EA570","dark":"#2E5530"},"logo":{"light":"https://mintcdn.com/merchkit/5CX85y_hfwgKe2-R/logo/light.svg?fit=max\u0026auto=format\u0026n=5CX85y_hfwgKe2-R\u0026q=85\u0026s=44793f2cb04c37defc7d3810d29cca0e","dark":"https://mintcdn.com/merchkit/5CX85y_hfwgKe2-R/logo/dark.svg?fit=max\u0026auto=format\u0026n=5CX85y_hfwgKe2-R\u0026q=85\u0026s=bac43fbcffb653a7a2c577fd38a8de4e"},"favicon":"https://mintcdn.com/merchkit/kbLpgBCpSYwwHFZe/favicon.png?fit=max\u0026auto=format\u0026n=kbLpgBCpSYwwHFZe\u0026q=85\u0026s=ae9b1c0fcf22f192729dc47aa4377419","api":{"examples":{"defaults":"required"}},"navbar":{"links":[{"href":"mailto:support@merchkit.com","label":"Support"}],"primary":{"type":"button","label":"Go to App","href":"https://www.merchkit.com/home"}},"footer":{"socials":{"x":"https://x.com/merchkit_","linkedin":"https://www.linkedin.com/company/merchkithq"}},"contextual":{"options":["copy","view","chatgpt","claude","mcp","cursor","vscode"],"display":"header"},"styling":{"latex":true},"navigation":{"global":{"anchors":[{"anchor":"merchkit.com","icon":"house","href":"https://www.merchkit.com"}]},"pages":[]}},"deployment":{"deploymentMetadataValue":{"subdomain":"merchkit","hasAudioNarration":false,"actualSubdomain":"merchkit","customDomains":["docs.merchkit.com"],"gitSource":{"type":"github","owner":"merchkit","repo":"docs","deployBranch":"main","contentDirectory":"","isPrivate":false,"mountPath":"","label":""},"feedback":{"agentFeedback":true,"thumbs":true},"entitlements":{"AI_CHAT":{"status":"DISABLED"}},"buildId":"6af77686fcbcc7142a349e17","clientVersion":"0.0.4131","searchFilterCounts":[{"language":"default","tag":"Product","count":67},{"language":"default","tag":"API \u0026 MCP","count":46},{"language":"default","tag":"API Reference","count":41},{"language":"default","tag":"Catalog","count":30},{"language":"default","tag":"Attributes \u0026 Enrichment","count":17},{"language":"default","tag":"Channels \u0026 Content Generation","count":12},{"language":"default","tag":"Sources \u0026 Importing","count":11},{"language":"default","tag":"Integrations \u0026 Field Mapping","count":10},{"language":"default","tag":"Products","count":8},{"language":"default","tag":"Getting Started","count":7}]},"assistantConfig":{"enableAskAiButton":false,"enableStarterQuestions":true,"enableContextualStarterQuestions":true,"enableAskAiSearchBar":true,"deflection":{"enabled":true,"email":"support@merchkit.com","showHelpButton":true}},"basePath":"","hasChatPermissions":false,"hasWebMcpPermissions":false,"toggles":[{"name":"kill-isr","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"custom-rbac-roles","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-mintlify-slack","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-integrations-settings","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"rbac-expansion","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-pr-grouping","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"custom-prefix","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"analytics-v7","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"user-flows-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"no-publish-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-onboarding","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving-live","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"stripTemperatureMiddleware","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"support-platform-pylon-zendesk","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"instant-rollback","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications-server","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-fable","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fixed-ai-action-pricing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automation-resolve-merge-conflict","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"scoped-publishing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"mintql","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"page-level-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-version-history-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-page-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"full-page-search","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workspace-projects","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"assistant-v5","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fork-pr-previews","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"revalidation-jwt","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-sso-scim","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"hobby-abuse-scan","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"dashboard-inbox","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-signup","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"turbopuffer-dual-write","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-enabled","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"approve-review-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-metadata","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"sso-setup-deadline-banner","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"turbopuffer-serve","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"live-agents","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"llms-txt-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false}],"googleFontsInlined":false},"customCss":[],"page":{"pagePath":"api-reference/list-images","slug":"/api-reference/list-images","pageMetadata":{"title":"List images","description":"Returns a paginated page of images in the one-map resource shape (system fields top-level, every customer key under `attributes`). Reference attributes embed COMPLETE as labeled stubs — no expansion calls; inverse-reference keys never appear (query the other side via filters, or page `/products/{id}/references`). Filter with `filter[\u003ckey>]=\u003cvalue>` / `filter[\u003ckey>][\u003cop>]=\u003cvalue>` (see the `filter` parameter for the grammar), sort with `sort`, page with `limit`/`offset`, and narrow the returned keys with `fields=\u003ckey>,\u003ckey>`.\n\nScope: `read:images`.","deprecated":null,"version":null,"openapi":"https://www.merchkit.com/api/v1/openapi get /images","href":"/api-reference/list-images","autogeneratedByOpenApi":true},"description":{"compiledSource":"\"use strict\";\nconst {Fragment: _Fragment, jsx: _jsx, jsxs: _jsxs} = arguments[0];\nconst {useMDXComponents: _provideComponents} = arguments[0];\nfunction _createMdxContent(props) {\n const _components = {\n code: \"code\",\n p: \"p\",\n ..._provideComponents(),\n ...props.components\n };\n return _jsxs(_Fragment, {\n children: [_jsxs(_components.p, {\n children: [\"Returns a paginated page of images in the one-map resource shape (system fields top-level, every customer key under \", _jsx(_components.code, {\n children: \"attributes\"\n }), \"). Reference attributes embed COMPLETE as labeled stubs — no expansion calls; inverse-reference keys never appear (query the other side via filters, or page \", _jsx(_components.code, {\n children: \"/products/{id}/references\"\n }), \"). Filter with \", _jsx(_components.code, {\n children: \"filter[\u003ckey>]=\u003cvalue>\"\n }), \" / \", _jsx(_components.code, {\n children: \"filter[\u003ckey>][\u003cop>]=\u003cvalue>\"\n }), \" (see the \", _jsx(_components.code, {\n children: \"filter\"\n }), \" parameter for the grammar), sort with \", _jsx(_components.code, {\n children: \"sort\"\n }), \", page with \", _jsx(_components.code, {\n children: \"limit\"\n }), \"/\", _jsx(_components.code, {\n children: \"offset\"\n }), \", and narrow the returned keys with \", _jsx(_components.code, {\n children: \"fields=\u003ckey>,\u003ckey>\"\n }), \".\"]\n }), \"\\n\", _jsxs(_components.p, {\n children: [\"Scope: \", _jsx(_components.code, {\n children: \"read:images\"\n }), \".\"]\n })]\n });\n}\nfunction MDXContent(props = {}) {\n const {wrapper: MDXLayout} = {\n ..._provideComponents(),\n ...props.components\n };\n return MDXLayout ? _jsx(MDXLayout, {\n ...props,\n children: _jsx(_createMdxContent, {\n ...props\n })\n }) : _createMdxContent(props);\n}\nreturn {\n default: MDXContent\n};\n","frontmatter":{},"scope":{}},"pageType":"default","mdx":{"mdxSource":{"compiledSource":"\"use strict\";const{Fragment:_Fragment,jsx:_jsx}=arguments[0];const{useMDXComponents:_provideComponents}=arguments[0];function _createMdxContent(props){return _jsx(_Fragment,{})}function MDXContent(props={}){const{wrapper:MDXLayout}={..._provideComponents(),...props.components};return MDXLayout?_jsx(MDXLayout,{...props,children:_jsx(_createMdxContent,{...props})}):_createMdxContent(props)}return{default:MDXContent}","frontmatter":{},"scope":{"config":{},"pageMetadata":{"title":"List images","description":"Returns a paginated page of images in the one-map resource shape (system fields top-level, every customer key under `attributes`). Reference attributes embed COMPLETE as labeled stubs — no expansion calls; inverse-reference keys never appear (query the other side via filters, or page `/products/{id}/references`). Filter with `filter[\u003ckey>]=\u003cvalue>` / `filter[\u003ckey>][\u003cop>]=\u003cvalue>` (see the `filter` parameter for the grammar), sort with `sort`, page with `limit`/`offset`, and narrow the returned keys with `fields=\u003ckey>,\u003ckey>`.\n\nScope: `read:images`.","deprecated":null,"version":null,"openapi":"https://www.merchkit.com/api/v1/openapi get /images","href":"/api-reference/list-images","autogeneratedByOpenApi":true}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[],"codeExamples":{}},"jsLinks":[],"openApiReferenceData":{"operation":{"operationId":"listImages","summary":"List images","description":"Returns a paginated page of images in the one-map resource shape (system fields top-level, every customer key under `attributes`). Reference attributes embed COMPLETE as labeled stubs — no expansion calls; inverse-reference keys never appear (query the other side via filters, or page `/products/{id}/references`). Filter with `filter[\u003ckey>]=\u003cvalue>` / `filter[\u003ckey>][\u003cop>]=\u003cvalue>` (see the `filter` parameter for the grammar), sort with `sort`, page with `limit`/`offset`, and narrow the returned keys with `fields=\u003ckey>,\u003ckey>`.\n\nScope: `read:images`.","security":["34ff0044-9bc2-4264-b7d2-6581c1f40520"],"x-required-scopes":["read:images"],"parameters":["cffd59b6-1934-4d7b-a789-3b9a60196616","34218902-b188-4124-be58-74f252b84c2c","69dc2de8-d99a-47ff-9559-933457864069","6b08e113-2186-4a7d-b9e6-3fe64ab69d5d","8165b0f0-07ad-431c-a266-399151e52406","d8405264-1a03-402f-9ded-3bad1377f65e"],"x-codeSamples":[{"lang":"bash","label":"Find one image by file_name","source":"curl -G \"https://www.merchkit.com/api/v1/images\" \\\n -H \"Authorization: Bearer $MERCHKIT_API_KEY\" \\\n --data-urlencode \"filter[file_name]=aria-hero.jpg\"\n\n# -G with --data-urlencode is the reliable shape: curl encodes the\n# brackets and any spaces in the value, so the query arrives intact."},{"lang":"bash","label":"Read a full page, only the keys you need","source":"curl -G \"https://www.merchkit.com/api/v1/images\" \\\n -H \"Authorization: Bearer $MERCHKIT_API_KEY\" \\\n --data-urlencode \"fields=file_name,image_url\" \\\n --data-urlencode \"limit=200\"\n\n# `fields` trims the attributes map; 200 is the maximum page size."},{"lang":"javascript","label":"Page through everything changed since a date","source":"// URLSearchParams handles the bracket encoding for you.\nconst params = new URLSearchParams({\n \"filter[updated_at][gte]\": \"2026-08-01\",\n fields: \"file_name,image_url\",\n limit: \"200\",\n});\n\nconst images = [];\nlet offset = 0;\n\nwhile (true) {\n params.set(\"offset\", String(offset));\n\n const res = await fetch(`https://www.merchkit.com/api/v1/images?${params}`, {\n headers: { Authorization: `Bearer ${process.env.MERCHKIT_API_KEY}` },\n });\n\n const body = await res.json();\n if (!res.ok) throw new Error(body.error.message);\n\n images.push(...body.data);\n\n // Trust has_more rather than comparing counts yourself.\n if (!body.pagination.has_more) break;\n offset += body.pagination.limit;\n}"}],"responses":{"200":"73a536fb-7380-4129-a31f-ac0de4e1f2d0","400":"ac238368-b200-4ff1-9894-42e6b04d7443"},"method":"get","type":"path","servers":["ae4f6803-6cfa-4dad-ab41-8bd0d862f7b7"],"path":"/images","baseUrlOptions":["https://www.merchkit.com/api/v1"],"title":"List images","codeSamples":[{"label":"Find one image by file_name","lang":"bash","source":"curl -G \"https://www.merchkit.com/api/v1/images\" \\\n -H \"Authorization: Bearer $MERCHKIT_API_KEY\" \\\n --data-urlencode \"filter[file_name]=aria-hero.jpg\"\n\n# -G with --data-urlencode is the reliable shape: curl encodes the\n# brackets and any spaces in the value, so the query arrives intact."},{"label":"Read a full page, only the keys you need","lang":"bash","source":"curl -G \"https://www.merchkit.com/api/v1/images\" \\\n -H \"Authorization: Bearer $MERCHKIT_API_KEY\" \\\n --data-urlencode \"fields=file_name,image_url\" \\\n --data-urlencode \"limit=200\"\n\n# `fields` trims the attributes map; 200 is the maximum page size."},{"label":"Page through everything changed since a date","lang":"javascript","source":"// URLSearchParams handles the bracket encoding for you.\nconst params = new URLSearchParams({\n \"filter[updated_at][gte]\": \"2026-08-01\",\n fields: \"file_name,image_url\",\n limit: \"200\",\n});\n\nconst images = [];\nlet offset = 0;\n\nwhile (true) {\n params.set(\"offset\", String(offset));\n\n const res = await fetch(`https://www.merchkit.com/api/v1/images?${params}`, {\n headers: { Authorization: `Bearer ${process.env.MERCHKIT_API_KEY}` },\n });\n\n const body = await res.json();\n if (!res.ok) throw new Error(body.error.message);\n\n images.push(...body.data);\n\n // Trust has_more rather than comparing counts yourself.\n if (!body.pagination.has_more) break;\n offset += body.pagination.limit;\n}"}],"requiredOnlyExamples":true,"requestExampleType":"codeSamples","responseExampleType":"generated"},"dependencies":{"parameters":{"cffd59b6-1934-4d7b-a789-3b9a60196616":{"name":"limit","in":"query","schema":{"type":"integer","minimum":1,"maximum":200,"default":50,"description":"Rows per page, 1 to 200. Defaults to 50.\n\nLarger pages mean fewer round-trips. 200 is also the cap on `in`\noperator value lists, so refetching a full page of IDs with\n`filter[id][in]=...` always fits in one call.","uniqueKey":"","typeLabel":"integer"},"description":"Rows per page, 1 to 200. Defaults to 50.\n\nLarger pages mean fewer round-trips. 200 is also the cap on `in`\noperator value lists, so refetching a full page of IDs with\n`filter[id][in]=...` always fits in one call."},"34218902-b188-4124-be58-74f252b84c2c":{"name":"offset","in":"query","schema":{"type":"integer","minimum":0,"default":0,"description":"Rows to skip. Zero-based. Echoed back in `pagination.offset`.\n\nPage forward by adding `limit` each time. Stop when\n`pagination.has_more` is `false` rather than comparing counts.\nDefault order is `created_at` ascending, which keeps long sweeps\nstable: new rows land at the end instead of shifting pages you\nhave not read yet.","uniqueKey":"","typeLabel":"integer"},"description":"Rows to skip. Zero-based. Echoed back in `pagination.offset`.\n\nPage forward by adding `limit` each time. Stop when\n`pagination.has_more` is `false` rather than comparing counts.\nDefault order is `created_at` ascending, which keeps long sweeps\nstable: new rows land at the end instead of shifting pages you\nhave not read yet."},"69dc2de8-d99a-47ff-9559-933457864069":{"name":"sort","in":"query","schema":{"type":"string","description":"Comma-separated keys. Prefix with `-` for descending:\n`sort=-updated_at,sku`. Defaults to `created_at` ascending.\n\nSortable: text, number, and date attributes, plus `id`,\n`parent_id`, `created_at`, and `updated_at`. Reference and\nlist-reference keys have no scalar order. Sorting on one returns\n`400` (`not_sortable`).","uniqueKey":"","typeLabel":"string"},"description":"Comma-separated keys. Prefix with `-` for descending:\n`sort=-updated_at,sku`. Defaults to `created_at` ascending.\n\nSortable: text, number, and date attributes, plus `id`,\n`parent_id`, `created_at`, and `updated_at`. Reference and\nlist-reference keys have no scalar order. Sorting on one returns\n`400` (`not_sortable`)."},"6b08e113-2186-4a7d-b9e6-3fe64ab69d5d":{"name":"filter","in":"query","style":"deepObject","explode":true,"schema":{"type":"object","additionalProperties":{"type":"string","uniqueKey":"additionalProperties","typeLabel":"string"},"description":"Narrow results by attribute value. Filtering runs in the database,\nso `pagination.total` reflects matches, not the whole catalog.\n\nTwo forms: `filter[sku]=ARIA-DT-72` is shorthand for equals.\n`filter[price][gte]=100` uses the bracket-operator form\n`filter[\u003ckey>][\u003cop>]=\u003cvalue>`.\n\nKeys: any attribute key from `GET /attributes`, plus `id`,\n`parent_id`, `created_at`, and `updated_at`. Reference keys like\n`vendor` match on UUID, not name.\n\nOperators:\n\n- Text: `eq`, `ne`, `contains`, `not_contains`, `starts_with`, `ends_with`\n- Number, date, timestamp: `gt`, `gte`, `lt`, `lte`. A bare date means UTC midnight.\n- Any type: `exists` (`=true` has a value, `=false` is blank)\n- Text, `id`, and reference keys: `in` (comma-separated OR-of-equals, up to 200 values)\n\nExamples:\n\n- `filter[sku]=ARIA-DT-72` one product by your own identifier\n- `filter[description][exists]=false` everything missing a description\n- `filter[price][gte]=100\u0026filter[material]=Oak` both must match (see `filter_join`)\n- `filter[id][in]=\u003cuuid1>,\u003cuuid2>` refetch a known set in one call\n- `filter[vendor]=\u003cuuid>\u0026sort=-updated_at` one vendor's catalog, newest first\n\nA bad filter never silently matches everything. Unknown keys, unknown operators,\nor type mismatches return `400` with `field_errors` naming the exact clause.\n\nBrackets and spaces need URL-encoding. With `curl`, use\n`-G --data-urlencode \"filter[vendor_name]=Nordic Timber Co.\"`.\nIn JavaScript, let `URLSearchParams` handle it.","uniqueKey":"","typeLabel":"object"},"description":"Narrow results by attribute value. Filtering runs in the database,\nso `pagination.total` reflects matches, not the whole catalog.\n\nTwo forms: `filter[sku]=ARIA-DT-72` is shorthand for equals.\n`filter[price][gte]=100` uses the bracket-operator form\n`filter[\u003ckey>][\u003cop>]=\u003cvalue>`.\n\nKeys: any attribute key from `GET /attributes`, plus `id`,\n`parent_id`, `created_at`, and `updated_at`. Reference keys like\n`vendor` match on UUID, not name.\n\nOperators:\n\n- Text: `eq`, `ne`, `contains`, `not_contains`, `starts_with`, `ends_with`\n- Number, date, timestamp: `gt`, `gte`, `lt`, `lte`. A bare date means UTC midnight.\n- Any type: `exists` (`=true` has a value, `=false` is blank)\n- Text, `id`, and reference keys: `in` (comma-separated OR-of-equals, up to 200 values)\n\nExamples:\n\n- `filter[sku]=ARIA-DT-72` one product by your own identifier\n- `filter[description][exists]=false` everything missing a description\n- `filter[price][gte]=100\u0026filter[material]=Oak` both must match (see `filter_join`)\n- `filter[id][in]=\u003cuuid1>,\u003cuuid2>` refetch a known set in one call\n- `filter[vendor]=\u003cuuid>\u0026sort=-updated_at` one vendor's catalog, newest first\n\nA bad filter never silently matches everything. Unknown keys, unknown operators,\nor type mismatches return `400` with `field_errors` naming the exact clause.\n\nBrackets and spaces need URL-encoding. With `curl`, use\n`-G --data-urlencode \"filter[vendor_name]=Nordic Timber Co.\"`.\nIn JavaScript, let `URLSearchParams` handle it."},"8165b0f0-07ad-431c-a266-399151e52406":{"name":"filter_join","in":"query","schema":{"type":"string","enum":["and","or"],"default":"and","description":"How multiple `filter` clauses combine. `and` means every clause\nmust match (the default). `or` means any clause can match.\nCase-insensitive. Any other value returns `400`.\n\nOnly matters with two or more clauses. One join applies to all of\nthem. There is no grouping or nesting, so mixed AND/OR logic\nbelongs on your side.\n\nFor OR across values of the same key, prefer\n`filter[\u003ckey>][in]=a,b,c`. One clause, up to 200 values, and it\nreads better in a log.","uniqueKey":"","typeLabel":"enum\u003cstring>"},"description":"How multiple `filter` clauses combine. `and` means every clause\nmust match (the default). `or` means any clause can match.\nCase-insensitive. Any other value returns `400`.\n\nOnly matters with two or more clauses. One join applies to all of\nthem. There is no grouping or nesting, so mixed AND/OR logic\nbelongs on your side.\n\nFor OR across values of the same key, prefer\n`filter[\u003ckey>][in]=a,b,c`. One clause, up to 200 values, and it\nreads better in a log."},"d8405264-1a03-402f-9ded-3bad1377f65e":{"name":"fields","in":"query","schema":{"type":"string","description":"Return only the attribute keys you name instead of every populated\none. Useful when a workspace has hundreds of attributes and your\nintegration reads a handful.\n\n`fields=sku,price` (comma-separated) or `fields=sku\u0026fields=price`\n(repeated param, same result). Omit it entirely to get every\npopulated key.\n\nOnly the `attributes` map narrows. System fields (`id`, `type`,\n`label`, `parent_id`, `created_at`, `updated_at`) always come back,\nso naming one returns `400`. `label` still resolves from the primary\nattribute whether or not you select it. `pagination.total` is\nunchanged. `filter` and `sort` are independent: filter on keys you\ndid not select.\n\nSparse still means sparse. A selected key with no value stays\nabsent. Keep reading `attributes[key] ?? null`.\n\nReference keys return `{id, type, label}` stubs as usual, but\n`fields` does not reach through them.\n`fields=gallery_images.image_url` is not supported. Select the\nreference key, then batch-fetch:\n`GET /images?filter[id][in]=\u003cids>\u0026fields=image_url`.\n\nUnknown keys return `400` with `field_errors`. Inverse-reference\nkeys are rejected the same way. They are queries, not stored values.\nRead them via `/{resource}/{id}/references?attribute=`.\n\nSelecting only non-reference keys skips the reference join entirely,\nwhich avoids loading every referenced entity just to attach its label.","uniqueKey":"","typeLabel":"string"},"description":"Return only the attribute keys you name instead of every populated\none. Useful when a workspace has hundreds of attributes and your\nintegration reads a handful.\n\n`fields=sku,price` (comma-separated) or `fields=sku\u0026fields=price`\n(repeated param, same result). Omit it entirely to get every\npopulated key.\n\nOnly the `attributes` map narrows. System fields (`id`, `type`,\n`label`, `parent_id`, `created_at`, `updated_at`) always come back,\nso naming one returns `400`. `label` still resolves from the primary\nattribute whether or not you select it. `pagination.total` is\nunchanged. `filter` and `sort` are independent: filter on keys you\ndid not select.\n\nSparse still means sparse. A selected key with no value stays\nabsent. Keep reading `attributes[key] ?? null`.\n\nReference keys return `{id, type, label}` stubs as usual, but\n`fields` does not reach through them.\n`fields=gallery_images.image_url` is not supported. Select the\nreference key, then batch-fetch:\n`GET /images?filter[id][in]=\u003cids>\u0026fields=image_url`.\n\nUnknown keys return `400` with `field_errors`. Inverse-reference\nkeys are rejected the same way. They are queries, not stored values.\nRead them via `/{resource}/{id}/references?attribute=`.\n\nSelecting only non-reference keys skips the reference join entirely,\nwhich avoids loading every referenced entity just to attach its label."}},"responses":{"73a536fb-7380-4129-a31f-ac0de4e1f2d0":{"description":"A page of images.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"type":"object","description":"The one shape for every entity read and mutation response. System fields live at the top level; every customer-defined key lives in `attributes`, so customer keys can never collide with system ones.","required":["id","type","label","parent_id","created_at","updated_at","attributes"],"properties":{"id":{"type":"string","format":"uuid","isRequired":true,"uniqueKey":"data.items.[INDEX].id","typeLabel":"string\u003cuuid>"},"type":{"type":"string","enum":["product","image","vendor","category","source"],"description":"The entity type discriminator.","isRequired":true,"uniqueKey":"data.items.[INDEX].type","typeLabel":"enum\u003cstring>"},"label":{"oneOf":[{"type":"string","description":"The workspace's primary-attribute value for this entity; null when no primary attribute is configured or it is unset (never a UUID posing as a name). Render `label ?? id`.","isRequired":true,"uniqueKey":"data.items.[INDEX].label.oneOf.0","typeLabel":"string"},{"type":"null","description":"The workspace's primary-attribute value for this entity; null when no primary attribute is configured or it is unset (never a UUID posing as a name). Render `label ?? id`.","isRequired":true,"uniqueKey":"data.items.[INDEX].label.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"data.items.[INDEX].label","typeLabel":"string | null"},"parent_id":{"oneOf":[{"type":"string","format":"uuid","description":"Parent entity id (products: the variant parent).","isRequired":true,"uniqueKey":"data.items.[INDEX].parent_id.oneOf.0","typeLabel":"string\u003cuuid>"},{"type":"null","format":"uuid","description":"Parent entity id (products: the variant parent).","isRequired":true,"uniqueKey":"data.items.[INDEX].parent_id.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"data.items.[INDEX].parent_id","typeLabel":"string\u003cuuid> | null"},"created_at":{"oneOf":[{"type":"string","format":"date-time","isRequired":true,"uniqueKey":"data.items.[INDEX].created_at.oneOf.0","typeLabel":"string\u003cdate-time>"},{"type":"null","format":"date-time","isRequired":true,"uniqueKey":"data.items.[INDEX].created_at.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"data.items.[INDEX].created_at","typeLabel":"string\u003cdate-time> | null"},"updated_at":{"oneOf":[{"type":"string","format":"date-time","isRequired":true,"uniqueKey":"data.items.[INDEX].updated_at.oneOf.0","typeLabel":"string\u003cdate-time>"},{"type":"null","format":"date-time","isRequired":true,"uniqueKey":"data.items.[INDEX].updated_at.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"data.items.[INDEX].updated_at","typeLabel":"string\u003cdate-time> | null"},"attributes":{"type":"object","description":"SPARSE map of customer-defined keys — only keys with values appear; a missing key means unset or not-applicable (read `attributes[key] ?? null`; never contains null or \"\"). Scalars are bare values; a single reference is a labeled stub; a list reference is a COMPLETE ordered stub array (no cap, array order = position order). Inverse-reference keys never appear — traverse them via filters or `/products/{id}/references`. The full key list comes from `GET /attributes`.","additionalProperties":{"oneOf":[{"type":"string","description":"A read value: a bare scalar (string/number/boolean), a single reference stub, or a complete ordered array of reference stubs.","uniqueKey":"data.items.[INDEX].attributes.additionalProperties.oneOf.0","typeLabel":"string"},{"type":"number","description":"A read value: a bare scalar (string/number/boolean), a single reference stub, or a complete ordered array of reference stubs.","uniqueKey":"data.items.[INDEX].attributes.additionalProperties.oneOf.1","typeLabel":"number"},{"type":"boolean","description":"A read value: a bare scalar (string/number/boolean), a single reference stub, or a complete ordered array of reference stubs.","uniqueKey":"data.items.[INDEX].attributes.additionalProperties.oneOf.2","typeLabel":"boolean"},{"type":"object","description":"A read value: a bare scalar (string/number/boolean), a single reference stub, or a complete ordered array of reference stubs.","required":["id","type","label"],"example":{"id":"77e1b2aa-6b3d-4f19-9d10-8c2a5e7f4b21","type":"vendor","label":"Nordic Timber Co."},"properties":{"id":{"type":"string","format":"uuid","isRequired":true,"uniqueKey":"data.items.[INDEX].attributes.additionalProperties.oneOf.3.id","typeLabel":"string\u003cuuid>"},"type":{"type":"string","enum":["product","image","vendor","category","source"],"isRequired":true,"uniqueKey":"data.items.[INDEX].attributes.additionalProperties.oneOf.3.type","typeLabel":"enum\u003cstring>"},"label":{"oneOf":[{"type":"string","description":"The referenced entity's label (same null rule).","isRequired":true,"uniqueKey":"data.items.[INDEX].attributes.additionalProperties.oneOf.3.label.oneOf.0","typeLabel":"string"},{"type":"null","description":"The referenced entity's label (same null rule).","isRequired":true,"uniqueKey":"data.items.[INDEX].attributes.additionalProperties.oneOf.3.label.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"data.items.[INDEX].attributes.additionalProperties.oneOf.3.label","typeLabel":"string | null"}},"uniqueKey":"data.items.[INDEX].attributes.additionalProperties.oneOf.3","typeLabel":"object"},{"type":"array","items":{"type":"object","description":"A labeled pointer to another entity. Fetch the full record via `GET /{type plural}/{id}` when needed — the label is inline so list rendering needs no extra lookups.","required":["id","type","label"],"properties":{"id":{"type":"string","format":"uuid","isRequired":true,"uniqueKey":"data.items.[INDEX].attributes.additionalProperties.oneOf.4.items.[INDEX].id","typeLabel":"string\u003cuuid>"},"type":{"type":"string","enum":["product","image","vendor","category","source"],"isRequired":true,"uniqueKey":"data.items.[INDEX].attributes.additionalProperties.oneOf.4.items.[INDEX].type","typeLabel":"enum\u003cstring>"},"label":{"oneOf":[{"type":"string","description":"The referenced entity's label (same null rule).","isRequired":true,"uniqueKey":"data.items.[INDEX].attributes.additionalProperties.oneOf.4.items.[INDEX].label.oneOf.0","typeLabel":"string"},{"type":"null","description":"The referenced entity's label (same null rule).","isRequired":true,"uniqueKey":"data.items.[INDEX].attributes.additionalProperties.oneOf.4.items.[INDEX].label.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"data.items.[INDEX].attributes.additionalProperties.oneOf.4.items.[INDEX].label","typeLabel":"string | null"}},"example":{"id":"77e1b2aa-6b3d-4f19-9d10-8c2a5e7f4b21","type":"vendor","label":"Nordic Timber Co."},"uniqueKey":"data.items.[INDEX].attributes.additionalProperties.oneOf.4.items.[INDEX]","typeLabel":"object"},"description":"A read value: a bare scalar (string/number/boolean), a single reference stub, or a complete ordered array of reference stubs.","uniqueKey":"data.items.[INDEX].attributes.additionalProperties.oneOf.4","typeLabel":"object[]"}],"uniqueKey":"data.items.[INDEX].attributes.additionalProperties","typeLabel":"string | number | boolean | object | object[]"},"isRequired":true,"uniqueKey":"data.items.[INDEX].attributes","typeLabel":"object"}},"example":{"id":"9b2f6c1e-8a04-4c6e-b0d3-5f2f6f7a9e21","type":"product","label":"Aria Oak Dining Table","parent_id":null,"created_at":"2026-06-02T14:11:09Z","updated_at":"2026-07-18T09:30:22Z","attributes":{"sku":"ARIA-DT-72","product_name":"Aria Oak Dining Table","price":1299,"material":"White Oak","vendor":{"id":"77e1b2aa-6b3d-4f19-9d10-8c2a5e7f4b21","type":"vendor","label":"Nordic Timber Co."},"category":{"id":"c41d09f3-2e85-47a6-b93c-d5f8e1a20c67","type":"category","label":"Dining Tables"},"gallery_images":[{"id":"f0a1b2c3-d4e5-4f60-8a7b-9c0d1e2f3a4b","type":"image","label":"aria-hero.jpg"},{"id":"f0a2c3d4-e5f6-4a70-9b8c-0d1e2f3a4b5c","type":"image","label":"aria-detail.jpg"},{"id":"f0a3d4e5-f6a7-4b80-8c9d-1e2f3a4b5c6d","type":"image","label":"aria-side.jpg"},{"id":"f0a4e5f6-a7b8-4c90-9dae-2f3a4b5c6d7e","type":"image","label":"aria-lifestyle.jpg"},{"id":"f0a5f6a7-b8c9-4da0-8ebf-3a4b5c6d7e8f","type":"image","label":"aria-packshot.jpg"}]}},"uniqueKey":"data.items.[INDEX]","typeLabel":"object"},"uniqueKey":"data","typeLabel":"object[]"},"pagination":{"type":"object","properties":{"total":{"type":"integer","uniqueKey":"pagination.total","typeLabel":"integer"},"limit":{"type":"integer","uniqueKey":"pagination.limit","typeLabel":"integer"},"offset":{"type":"integer","description":"The exact requested offset, echoed back.","uniqueKey":"pagination.offset","typeLabel":"integer"},"has_more":{"type":"boolean","uniqueKey":"pagination.has_more","typeLabel":"boolean"}},"example":{"total":128,"limit":50,"offset":0,"has_more":true},"uniqueKey":"pagination","typeLabel":"object"}},"uniqueKey":"","typeLabel":"object"},"example":{"data":[{"id":"f0a1b2c3-d4e5-4f60-8a7b-9c0d1e2f3a4b","type":"image","label":"aria-hero.jpg","parent_id":null,"created_at":"2026-06-02T14:11:09Z","updated_at":"2026-07-18T09:30:22Z","attributes":{"file_name":"aria-hero.jpg","image_url":"https://cdn.merchkit.example/aria/aria-hero.jpg"}}],"pagination":{"total":128,"limit":50,"offset":0,"has_more":true}},"examples":{"Example":{"title":"Example","value":{"data":[{"id":"f0a1b2c3-d4e5-4f60-8a7b-9c0d1e2f3a4b","type":"image","label":"aria-hero.jpg","parent_id":null,"created_at":"2026-06-02T14:11:09Z","updated_at":"2026-07-18T09:30:22Z","attributes":{"file_name":"aria-hero.jpg","image_url":"https://cdn.merchkit.example/aria/aria-hero.jpg"}}],"pagination":{"total":128,"limit":50,"offset":0,"has_more":true}}}},"exampleType":"examples"}},"exampleType":"examples"},"ac238368-b200-4ff1-9894-42e6b04d7443":{"description":"Invalid filter, sort, or paging parameter.","content":{"application/json":{"schema":{"type":"object","description":"The one error envelope every non-2xx response uses. `documentation_url` links to the code's section of the error docs.","required":["error"],"properties":{"error":{"type":"object","required":["code","message","is_retriable"],"properties":{"code":{"type":"string","enum":["unauthorized","insufficient_scope","forbidden","not_found","validation_failed","rate_limited","conflict","internal_error"],"isRequired":true,"uniqueKey":"error.code","typeLabel":"enum\u003cstring>"},"message":{"type":"string","isRequired":true,"uniqueKey":"error.message","typeLabel":"string"},"is_retriable":{"type":"boolean","description":"Only `rate_limited` and `internal_error` are retriable. Deterministic client errors (validation, not-found, conflict) return a 4xx and are never retriable.","isRequired":true,"uniqueKey":"error.is_retriable","typeLabel":"boolean"},"documentation_url":{"type":"string","format":"uri","description":"https://docs.merchkit.com/developers/errors#\u003ccode>","uniqueKey":"error.documentation_url","typeLabel":"string\u003curi>"},"retry_after_seconds":{"oneOf":[{"type":"integer","uniqueKey":"error.retry_after_seconds.oneOf.0","typeLabel":"integer"},{"type":"null","uniqueKey":"error.retry_after_seconds.oneOf.1","typeLabel":"null"}],"uniqueKey":"error.retry_after_seconds","typeLabel":"integer | null"},"alternative_action":{"type":"string","description":"What to do instead, when there is a better call.","uniqueKey":"error.alternative_action","typeLabel":"string"},"request_id":{"type":"string","uniqueKey":"error.request_id","typeLabel":"string"},"field_errors":{"type":"array","items":{"type":"object","required":["field","issue"],"properties":{"field":{"type":"string","isRequired":true,"uniqueKey":"error.field_errors.items.[INDEX].field","typeLabel":"string"},"issue":{"type":"string","description":"Machine-readable issue code, e.g. `not_a_defined_attribute`.","isRequired":true,"uniqueKey":"error.field_errors.items.[INDEX].issue","typeLabel":"string"},"acceptable_values":{"type":"array","items":{"type":"string","uniqueKey":"error.field_errors.items.[INDEX].acceptable_values.items.[INDEX]","typeLabel":"string"},"description":"For select-value violations: the allowed values.","uniqueKey":"error.field_errors.items.[INDEX].acceptable_values","typeLabel":"string[]"}},"uniqueKey":"error.field_errors.items.[INDEX]","typeLabel":"object"},"uniqueKey":"error.field_errors","typeLabel":"object[]"}},"isRequired":true,"uniqueKey":"error","typeLabel":"object"}},"example":{"error":{"code":"validation_failed","message":"Unknown attribute key(s): colour.","documentation_url":"https://docs.merchkit.com/developers/errors#validation_failed","is_retriable":false,"retry_after_seconds":null,"alternative_action":"List valid attribute keys via GET /v1/attributes?type=product.","request_id":"req_01j9x2k8","field_errors":[{"field":"colour","issue":"not_a_defined_attribute"}]}},"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"error":{"code":"validation_failed","message":"Unknown attribute key(s): colour.","documentation_url":"https://docs.merchkit.com/developers/errors#validation_failed","is_retriable":false,"retry_after_seconds":null,"alternative_action":"List valid attribute keys via GET /v1/attributes?type=product.","request_id":"req_01j9x2k8","field_errors":[{"field":"colour","issue":"not_a_defined_attribute"}]}}}},"exampleType":"generated"}},"exampleType":"generated"}},"security":{"34ff0044-9bc2-4264-b7d2-6581c1f40520":{"ApiKeyAuth":{"type":"http","scheme":"bearer","description":"Workspace-scoped API key (`mk_live_...`). Each operation lists the scope it requires in `x-required-scopes`. See the Authentication guide for the full scope table and key management.","scopes":[],"schemeName":"ApiKeyAuth"}}},"servers":{"ae4f6803-6cfa-4dad-ab41-8bd0d862f7b7":{"url":"https://www.merchkit.com/api/v1","description":"Merchkit API v1"}},"processedSecurityOptions":[{"schemes":[{"scheme":{"type":"http","scheme":"bearer","description":"Workspace-scoped API key (`mk_live_...`). Each operation lists the scope it requires in `x-required-scopes`. See the Authentication guide for the full scope table and key management.","scopes":[],"schemeName":"ApiKeyAuth"},"schema":{"title":"Bearer Auth","type":"string","isRequired":true,"description":"Workspace-scoped API key (`mk_live_...`). Each operation lists the scope it requires in `x-required-scopes`. See the Authentication guide for the full scope table and key management.","format":"bearer","typeLabel":"string\u003cbearer>","deprecated":false},"schemeName":"ApiKeyAuth","name":"Authorization"}],"title":"ApiKeyAuth"}]},"originalFileLocation":"https://www.merchkit.com/api/v1/openapi"},"subdomain":"merchkit","siteName":"Merchkit","title":"List images - Merchkit","contextualStarterQuestions":[],"navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{}},"lastModified":"2026-11-13T20:43:26.691Z","originalFileLocation":"api-reference/list-images.mdx"},"headHtml":"\u003cscript data-mint-head>(function(){var d=document.documentElement,p=null;if(!p){try{p=localStorage.getItem(\"isDarkMode\")}catch(e){}if(p==='true')p='dark';else if(p==='false')p='light';if(p!=='light'\u0026\u0026p!=='dark'\u0026\u0026p!=='system')p=\"system\"}var r=p==='system'?(matchMedia(\"(prefers-color-scheme: dark)\").matches?'dark':'light'):p;d.classList.remove(r==='dark'?'light':'dark');d.classList.add(r);d.setAttribute(\"data-theme-preference\",p)})();\u003c/script>\u003cmeta data-mint-head name=\"description\" content=\"Returns a paginated page of images in the one-map resource shape (system fields top-level, every customer key under attributes). Reference attributes embed COMPLETE as labeled stubs — no expansion calls; inverse-reference keys never appear (query the other side via filters, or page /products/{id}/references). Filter with filter[]= / filter= (see the filter parameter for the grammar), sort with sort, page with limit/offset, and narrow the returned keys with fields=,. Scope: read:images.\">\u003cmeta data-mint-head name=\"application-name\" content=\"Merchkit\">\u003cmeta data-mint-head name=\"generator\" content=\"Mintlify\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/merchkit/u9Xu7zNeRpkrmNZE/_generated/favicon/android-chrome-192x192.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"apple-touch-icon\" type=\"image/png\" sizes=\"180x180\" href=\"/mintlify-assets/_mintlify/favicons/merchkit/u9Xu7zNeRpkrmNZE/_generated/favicon/apple-touch-icon.png\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/merchkit/u9Xu7zNeRpkrmNZE/_generated/favicon/favicon-16x16.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/merchkit/u9Xu7zNeRpkrmNZE/_generated/favicon/favicon-32x32.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/merchkit/u9Xu7zNeRpkrmNZE/_generated/favicon/favicon.ico\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/merchkit/u9Xu7zNeRpkrmNZE/_generated/favicon-dark/android-chrome-192x192.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/merchkit/u9Xu7zNeRpkrmNZE/_generated/favicon-dark/favicon-16x16.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/merchkit/u9Xu7zNeRpkrmNZE/_generated/favicon-dark/favicon-32x32.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/merchkit/u9Xu7zNeRpkrmNZE/_generated/favicon-dark/favicon.ico\" media=\"(prefers-color-scheme: dark)\">\u003cmeta data-mint-head property=\"og:title\" content=\"List images - Merchkit\">\u003cmeta data-mint-head property=\"og:description\" content=\"Returns a paginated page of images in the one-map resource shape (system fields top-level, every customer key under attributes). Reference attributes embed COMPLETE as labeled stubs — no expansion calls; inverse-reference keys never appear (query the other side via filters, or page /products/{id}/references). Filter with filter[]= / filter= (see the filter parameter for the grammar), sort with sort, page with limit/offset, and narrow the returned keys with fields=,. Scope: read:images.\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"Merchkit\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://docs.merchkit.com/api-reference/list-images\">\u003cmeta data-mint-head property=\"og:type\" content=\"website\">\u003cmeta data-mint-head property=\"og:image\" content=\"https://merchkit.mintlify.site/_mintlify/api/og/v2?division=Images\u0026amp;title=List+images\u0026amp;description=Returns+a+paginated+page+of+images+in+the+one-map+resource+shape+%28system+fields+top-level%2C+every+customer+key+under+%60attributes%60%29.+Reference+attributes+embed+CO\u0026amp;theme=06fd1fad2bb810fd43730d53\u0026amp;signature=e09c5ac60b76f740f7d767e42c8e0b4dd10fa2c2efd7d8e20e2ae6a98b9b8d3a\">\u003cmeta data-mint-head property=\"og:image:width\" content=\"1200\">\u003cmeta data-mint-head property=\"og:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"twitter:card\" content=\"summary_large_image\">\u003cmeta data-mint-head name=\"twitter:title\" content=\"List images - Merchkit\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"Returns a paginated page of images in the one-map resource shape (system fields top-level, every customer key under attributes). Reference attributes embed COMPLETE as labeled stubs — no expansion calls; inverse-reference keys never appear (query the other side via filters, or page /products/{id}/references). Filter with filter[]= / filter= (see the filter parameter for the grammar), sort with sort, page with limit/offset, and narrow the returned keys with fields=,. Scope: read:images.\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://merchkit.mintlify.site/_mintlify/api/og/v2?division=Images\u0026amp;title=List+images\u0026amp;description=Returns+a+paginated+page+of+images+in+the+one-map+resource+shape+%28system+fields+top-level%2C+every+customer+key+under+%60attributes%60%29.+Reference+attributes+embed+CO\u0026amp;theme=06fd1fad2bb810fd43730d53\u0026amp;signature=e09c5ac60b76f740f7d767e42c8e0b4dd10fa2c2efd7d8e20e2ae6a98b9b8d3a\">\u003cmeta data-mint-head name=\"twitter:image:width\" content=\"1200\">\u003cmeta data-mint-head name=\"twitter:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"msapplication-config\" content=\"/mintlify-assets/_mintlify/favicons/merchkit/u9Xu7zNeRpkrmNZE/_generated/favicon/browserconfig.xml\">\u003cmeta data-mint-head name=\"apple-mobile-web-app-title\" content=\"Merchkit\">\u003cmeta data-mint-head name=\"msapplication-TileColor\" content=\"#3E703F\">\u003clink data-mint-head rel=\"canonical\" href=\"https://docs.merchkit.com/api-reference/list-images\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/api-reference/list-images.md\">\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"Organization\",\"@id\":\"https://docs.merchkit.com/#organization\",\"name\":\"Merchkit\",\"url\":\"https://docs.merchkit.com\",\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https://mintcdn.com/merchkit/5CX85y_hfwgKe2-R/logo/light.svg?fit=max\u0026auto=format\u0026n=5CX85y_hfwgKe2-R\u0026q=85\u0026s=44793f2cb04c37defc7d3810d29cca0e\"}},{\"@type\":\"WebSite\",\"@id\":\"https://docs.merchkit.com#website\",\"name\":\"Merchkit\",\"url\":\"https://docs.merchkit.com\",\"publisher\":{\"@id\":\"https://docs.merchkit.com/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https://docs.merchkit.com/api-reference/list-images#webpage\",\"url\":\"https://docs.merchkit.com/api-reference/list-images\",\"name\":\"List images\",\"description\":\"Returns a paginated page of images in the one-map resource shape (system fields top-level, every customer key under attributes). Reference attributes embed COMPLETE as labeled stubs — no expansion calls; inverse-reference keys never appear (query the other side via filters, or page /products/{id}/references). Filter with filter[]= / filter= (see the filter parameter for the grammar), sort with sort, page with limit/offset, and narrow the returned keys with fields=,. Scope: read:images.\",\"dateModified\":\"2026-11-13T20:43:26.691Z\",\"isPartOf\":{\"@id\":\"https://docs.merchkit.com#website\"},\"breadcrumb\":{\"@id\":\"https://docs.merchkit.com/api-reference/list-images#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://docs.merchkit.com/api-reference/list-images#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"API Reference\",\"item\":\"https://docs.merchkit.com/api-reference/list-products\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Catalog\",\"item\":\"https://docs.merchkit.com/api-reference/list-products\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"List images\",\"item\":\"https://docs.merchkit.com/api-reference/list-images\"}]},{\"@type\":[\"TechArticle\",\"APIReference\"],\"@id\":\"https://docs.merchkit.com/api-reference/list-images#apireference\",\"headline\":\"List images\",\"name\":\"List images\",\"description\":\"Returns a paginated page of images in the one-map resource shape (system fields top-level, every customer key under attributes). Reference attributes embed COMPLETE as labeled stubs — no expansion calls; inverse-reference keys never appear (query the other side via filters, or page /products/{id}/references). Filter with filter[]= / filter= (see the filter parameter for the grammar), sort with sort, page with limit/offset, and narrow the returned keys with fields=,. Scope: read:images.\",\"url\":\"https://docs.merchkit.com/api-reference/list-images\",\"mainEntityOfPage\":{\"@id\":\"https://docs.merchkit.com/api-reference/list-images#webpage\"},\"dateModified\":\"2026-11-13T20:43:26.691Z\",\"publisher\":{\"@id\":\"https://docs.merchkit.com/#organization\"},\"isPartOf\":{\"@id\":\"https://docs.merchkit.com#website\"}}]}\u003c/script>\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@type\":\"WebSite\",\"name\":\"Merchkit\",\"publisher\":{\"@type\":\"Organization\",\"name\":\"Merchkit\"},\"provider\":{\"@type\":\"Organization\",\"name\":\"Mintlify\",\"url\":\"https://mintlify.com\"}}\u003c/script>","agentPointerHref":"/api-reference/list-images.md","siteName":"Merchkit","nav":{"global":{"anchors":[{"anchor":"merchkit.com","icon":"house","href":"https://www.merchkit.com"}]},"tabs":[{"tab":"Product","pages":[{"title":"Product","href":""}]},{"tab":"API \u0026 MCP","groups":[{"group":"Guides","pages":[{"title":"API Overview","href":"/developers/overview"},{"title":"Authentication","href":"/developers/authentication"},{"title":"Conventions","href":"/developers/conventions"},{"title":"Errors","href":"/developers/errors"},{"title":"MCP Server","href":"/developers/mcp"}]},{"group":"API Reference","pages":[{"group":"Catalog","pages":[{"group":"Products","pages":[{"title":"List products","deprecated":null,"version":null,"openapi":"https://www.merchkit.com/api/v1/openapi get /products","href":"/api-reference/list-products"},{"title":"Create a product","deprecated":null,"version":null,"openapi":"https://www.merchkit.com/api/v1/openapi post /products","href":"/api-reference/create-a-product"},{"title":"Get a product","deprecated":null,"version":null,"openapi":"https://www.merchkit.com/api/v1/openapi get /products/{id}","href":"/api-reference/get-a-product"},{"title":"Update a product","deprecated":null,"version":null,"openapi":"https://www.merchkit.com/api/v1/openapi patch /products/{id}","href":"/api-reference/update-a-product"},{"title":"Upsert a product by your own key","deprecated":null,"version":null,"openapi":"https://www.merchkit.com/api/v1/openapi post /products/upsert","href":"/api-reference/upsert-a-product-by-your-own-key"},{"title":"Batch create/upsert products","deprecated":null,"version":null,"openapi":"https://www.merchkit.com/api/v1/openapi post /products/batch","href":"/api-reference/batch-createupsert-products"},{"title":"List a product's variants","deprecated":null,"version":null,"openapi":"https://www.merchkit.com/api/v1/openapi get /products/{id}/variants","href":"/api-reference/list-a-products-variants"},{"title":"List a product's references, with positions","description":"The key-scoped reference view: `{ \u003cattribute-key>: { total, has_more, items: [{id, type, label, position}] } }`. Forward list references return the same complete membership that embeds in `attributes`, plus explicit `position`. INVERSE references — which never embed in `attributes` because they are unbounded — are readable ONLY here: pass `?attribute=\u003ckey>` and page with `limit`/`offset` (or traverse from the other side with `filter[\u003cforward-key>]=\u003cid>`).\n\nScope: `read:products`.","deprecated":null,"version":null,"openapi":"https://www.merchkit.com/api/v1/openapi get /products/{id}/references","href":"/api-reference/list-a-products-references-with-positions"}]},{"group":"Images","pages":[{"title":"List images","deprecated":null,"version":null,"openapi":"https://www.merchkit.com/api/v1/openapi get /images","href":"/api-reference/list-images"},{"title":"Create an image","description":"Creates an image and returns the full resource — no follow-up GET needed. `attributes` uses the same one-map write shape as PATCH (references inline as UUIDs or `{id}` stubs). Unknown attribute keys are rejected with 400.\n\nScope: `write:images`.","deprecated":null,"version":null,"openapi":"https://www.merchkit.com/api/v1/openapi post /images","href":"/api-reference/create-an-image"},{"title":"Get an image","deprecated":null,"version":null,"openapi":"https://www.merchkit.com/api/v1/openapi get /images/{id}","href":"/api-reference/get-an-image"},{"title":"Update an image","deprecated":null,"version":null,"openapi":"https://www.merchkit.com/api/v1/openapi patch /images/{id}","href":"/api-reference/update-an-image"},{"title":"Upsert an image by your own key","deprecated":null,"version":null,"openapi":"https://www.merchkit.com/api/v1/openapi post /images/upsert","href":"/api-reference/upsert-an-image-by-your-own-key"},{"title":"Batch create/upsert images","deprecated":null,"version":null,"openapi":"https://www.merchkit.com/api/v1/openapi post /images/batch","href":"/api-reference/batch-createupsert-images"}]},{"group":"Vendors","pages":[{"title":"List vendors","deprecated":null,"version":null,"openapi":"https://www.merchkit.com/api/v1/openapi get /vendors","href":"/api-reference/list-vendors"},{"title":"Create a vendor","deprecated":null,"version":null,"openapi":"https://www.merchkit.com/api/v1/openapi post /vendors","href":"/api-reference/create-a-vendor"},{"title":"Get a vendor","deprecated":null,"version":null,"openapi":"https://www.merchkit.com/api/v1/openapi get /vendors/{id}","href":"/api-reference/get-a-vendor"},{"title":"Update a vendor","deprecated":null,"version":null,"openapi":"https://www.merchkit.com/api/v1/openapi patch /vendors/{id}","href":"/api-reference/update-a-vendor"},{"title":"Upsert a vendor by your own key","deprecated":null,"version":null,"openapi":"https://www.merchkit.com/api/v1/openapi post /vendors/upsert","href":"/api-reference/upsert-a-vendor-by-your-own-key"},{"title":"Batch create/upsert vendors","deprecated":null,"version":null,"openapi":"https://www.merchkit.com/api/v1/openapi post /vendors/batch","href":"/api-reference/batch-createupsert-vendors"}]},{"group":"Categories","pages":[{"title":"List categories","deprecated":null,"version":null,"openapi":"https://www.merchkit.com/api/v1/openapi get /categories","href":"/api-reference/list-categories"},{"title":"Create a category","deprecated":null,"version":null,"openapi":"https://www.merchkit.com/api/v1/openapi post /categories","href":"/api-reference/create-a-category"},{"title":"Get a category","deprecated":null,"version":null,"openapi":"https://www.merchkit.com/api/v1/openapi get /categories/{id}","href":"/api-reference/get-a-category"},{"title":"Update a category","deprecated":null,"version":null,"openapi":"https://www.merchkit.com/api/v1/openapi patch /categories/{id}","href":"/api-reference/update-a-category"},{"title":"Upsert a category by your own key","deprecated":null,"version":null,"openapi":"https://www.merchkit.com/api/v1/openapi post /categories/upsert","href":"/api-reference/upsert-a-category-by-your-own-key"},{"title":"Batch create/upsert categories","deprecated":null,"version":null,"openapi":"https://www.merchkit.com/api/v1/openapi post /categories/batch","href":"/api-reference/batch-createupsert-categories"}]},{"group":"Sources","pages":[{"title":"List sources","deprecated":null,"version":null,"openapi":"https://www.merchkit.com/api/v1/openapi get /sources","href":"/api-reference/list-sources"},{"title":"Create a source (async)","deprecated":null,"version":null,"openapi":"https://www.merchkit.com/api/v1/openapi post /sources","href":"/api-reference/create-a-source-async"},{"title":"Get a source","deprecated":null,"version":null,"openapi":"https://www.merchkit.com/api/v1/openapi get /sources/{id}","href":"/api-reference/get-a-source"},{"title":"Update a source","deprecated":null,"version":null,"openapi":"https://www.merchkit.com/api/v1/openapi patch /sources/{id}","href":"/api-reference/update-a-source"}]}]},{"group":"Schema \u0026 configuration","pages":[{"title":"List attribute definitions (schema discovery)","deprecated":null,"version":null,"openapi":"https://www.merchkit.com/api/v1/openapi get /attributes","href":"/api-reference/list-attribute-definitions-schema-discovery"},{"title":"Create an attribute definition","deprecated":null,"version":null,"openapi":"https://www.merchkit.com/api/v1/openapi post /attributes","href":"/api-reference/create-an-attribute-definition"},{"title":"Get one attribute definition","deprecated":null,"version":null,"openapi":"https://www.merchkit.com/api/v1/openapi get /attributes/{key}","href":"/api-reference/get-one-attribute-definition"},{"title":"Update an attribute definition","deprecated":null,"version":null,"openapi":"https://www.merchkit.com/api/v1/openapi patch /attributes/{key}","href":"/api-reference/update-an-attribute-definition"},{"title":"List enabled channels","deprecated":null,"version":null,"openapi":"https://www.merchkit.com/api/v1/openapi get /channels","href":"/api-reference/list-enabled-channels"}]},{"group":"Channel readiness","pages":[{"title":"Check completeness for a channel","deprecated":null,"version":null,"openapi":"https://www.merchkit.com/api/v1/openapi get /products/{id}/completeness","href":"/api-reference/check-completeness-for-a-channel"}]},{"group":"Sync \u0026 monitoring","pages":[{"title":"Workspace change feed","deprecated":null,"version":null,"openapi":"https://www.merchkit.com/api/v1/openapi get /events","href":"/api-reference/workspace-change-feed"},{"title":"List a product's change events","deprecated":null,"version":null,"openapi":"https://www.merchkit.com/api/v1/openapi get /products/{id}/events","href":"/api-reference/list-a-products-change-events"},{"title":"List recent jobs","deprecated":null,"version":null,"openapi":"https://www.merchkit.com/api/v1/openapi get /jobs","href":"/api-reference/list-recent-jobs"},{"title":"Poll an async job","deprecated":null,"version":null,"openapi":"https://www.merchkit.com/api/v1/openapi get /jobs/{id}","href":"/api-reference/poll-an-async-job"}]},{"group":"Spec","pages":[{"title":"This OpenAPI document","deprecated":null,"version":null,"openapi":"https://www.merchkit.com/api/v1/openapi get /openapi","href":"/api-reference/this-openapi-document"}]}]}]},{"tab":"Changelog","pages":[{"title":"Changelog","href":"/changelog"}]}]},"basePath":"","title":"List images - Merchkit","buildId":"dpl_5joLUXmnJgwqjrHAS4dxZrQTdxgh","deploymentId":"dpl_5joLUXmnJgwqjrHAS4dxZrQTdxgh","dynamics":["c2aa737661","2b790eda92","b0f84f53ff","a9bb46feb3"],"chunks":["OpenApiReferenceProvider-DPDWPCdE.js","utils-DyjUHyLo.js","cloneDeep-izs3Hzxb.js","_Uint8Array-BVIqJ90l.js","isObjectLike-C8vmzPEN.js","isArray-Dcu1dQ5t.js","utils-BWYE1cdS.js","toString-BX-iyh8G.js","isSymbol-CSH9U2Gm.js","addUniqueKeysToSchema-COAzxpEw.js","snippetPresets-DNiD_S52.js","style-to-object-BY3JEAdk.js","v4-DIgz8zy6.js","conditional-requirements-CFM0id0Q.js","ApiExamples-CjwVt80x.js","isEqual-BfaiBbcl.js","usePlaygroundInputsStore-ByHQMk7z.js","shallow-CaZuw1AO.js","getApiPlaygroundDisplay-DPVPOknm.js","CodeSnippet-B31CH-Mp.js","CodeSnippets-BxTYZWz6.js","Page-DDHbuAIY.js","getPastedJson-DhoAwiNO.js","icon-Dhq8z75J.js","MethodPill-DLXmKOwr.js","DuplicateIcon-jzdVwyRU.js","createIcon-eD0b3klN.js","DynamicMarkdown-BfddVCX7.js","SectionHeading-2pSCIo17.js","axios-vUo_bRtp.js","Markdown-DsWjhwJ4.js","clsx-B2t_mZQG.js","lib-DuNMoZ05.js","lib-B8HbPgcC.js","html-void-elements-mCSPHezU.js","dist-CUljsAY7.js","katex-YMM-FMeD.js","marked.esm-CZWythHk.js","AssistantPageLink-Cf70306N.js"]}