Stores one file for the account and returns its public address. This is how a user’s own images,
video and PDFs reach a widget’s content.
Send a multipart/form-data request with the file in the field named file. The file counts
against the storage of the workspace it is uploaded in, and a full workspace is refused with 413 and
QUOTA_STORAGE_EXCEEDED. For a person signed in on widgetic.com that is the workspace they are currently
working in: inside a team, the team’s shared storage; inside their own workspace, their own allowance. An
organization API key, and a Shopify store’s session, always work in that team’s shared storage. A personal
API key or an SDK token always uses the account’s own allowance. The two never add up and one never lends
room to the other. A file over the size limit is refused with 413 and UPLOAD_TOO_LARGE, and a
type that is not accepted with 415 and UPLOAD_UNSUPPORTED_TYPE; getUploadLimits lists the size
limit and the accepted types.
A file is judged by what is in it, not by the type it is sent as. A file that is not the type it claims (a
web page sent as image/png) is refused with 415 and UPLOAD_UNSUPPORTED_TYPE, and a picture sent under
the wrong picture type is stored under the type it really is, which mime_type in the answer says. An SVG
is rewritten as it is stored: script, foreignObject, animation and references to other addresses are
taken out, it must be UTF-8 and at most 2 MB, and the stored file can be larger or smaller than the one
sent. Anything that is not an image, audio or video (a PDF, for example) is served as a download rather
than shown in a page.
When the full storage is a Shopify store’s team’s, extra storage cannot be added through Shopify yet, so the
message ends by saying so and what to do instead: delete files, or contact support. On a Solo plan it names
the Teams plan (which holds more) and error.details.planPageUrl is the address of the plan page on Shopify.
error.suggestedAction says the same in a few words, instead of the usual “upgrade your storage plan”. Any
other team, and a person’s own workspace, get the shorter message.
To upload the file for one of your managed users, send managedUserId (Widgetic’s id for the user) or
managedUserExternalId (your own identifier for the user), not both. The file stays in your account and
counts against its allowance; the tag lets you list one user’s files with listUploads. The managed user
must be yours and active: one that is not yours, or does not exist, is refused with 404 and
MANAGED_USER_NOT_FOUND, and one that is switched off with 409 and MANAGED_USER_INACTIVE, before the
file is stored. The tag is set here and does not change afterwards.
Called with an editor session (createManagedUserEditorSession), the file is always filed for the
session’s own managed user and is always media for widget content: naming another managed user is
refused with 403 and MANAGED_USER_SESSION_MISMATCH, and contextType, source, widgetId and
conversationId are ignored. A full storage allowance is refused with the same 413 and
QUOTA_STORAGE_EXCEEDED, but the message only says that it is not available right now (not how much is
stored: that is the partner’s business) and error.details.limit is storage.
An account that administers a partner with a storage destination (setPartnerStorageDestination) has
its files stored in the partner’s own bucket instead. Such a file takes none of the allowance, its url
is served from the partner’s public address, and its storage_key is the key in the partner’s bucket.
The file is never stored with Widgetic instead: when the destination cannot be used the upload is refused
with 503 and STORAGE_DESTINATION_UNAVAILABLE, and when the partner’s storage rejects the file with
502 and STORAGE_DESTINATION_WRITE_FAILED.
Partner storage is not optional, and it does not depend on how the file arrives. A partner’s own uploads (with
its API key, an SDK token, or from the Widgetic website, the resumable route and the media library alike)
and the uploads of its customers’ editor sessions are kept in the partner’s own storage or not at all, so a
partner with no destination (or one that removed it after the session was made) has them refused with 409
and PARTNER_STORAGE_REQUIRED; they are never stored with Widgetic. An editor session’s browser is only
told that the feature is not available right now.
What the file is for. Send content-property for media that becomes widget content (images, video and PDF); the other values are used by Widgetic's own editor.
Where in your product you use the file. It is kept with the file, so that a customer's storage can be counted by purpose (getManagedUserStorageUsage). Optional; any other value is refused with 400 and UPLOAD_INVALID_PURPOSE.
Extra information about the answer: where a page sits in a list, the cursor of the next page, or warnings about a call that succeeded with a caveat.
Show child attributes
{"docsConfig":{"theme":"mint","$schema":"https://mintlify.com/docs.json","name":"Widgetic","colors":{"primary":"#324E30","light":"#75A568","dark":"#0F210F"},"logo":{"light":"https://mintcdn.com/widgetic/Od-pD6ChvIzhY_fR/brand/logo-light.svg?fit=max\u0026auto=format\u0026n=Od-pD6ChvIzhY_fR\u0026q=85\u0026s=c80ce649cc12d9f206a4ea5d3d2d9d31","dark":"https://mintcdn.com/widgetic/Od-pD6ChvIzhY_fR/brand/logo-dark.svg?fit=max\u0026auto=format\u0026n=Od-pD6ChvIzhY_fR\u0026q=85\u0026s=46708e0c7194a1fa0844613fc8492364"},"favicon":"https://mintcdn.com/widgetic/Od-pD6ChvIzhY_fR/brand/favicon.svg?fit=max\u0026auto=format\u0026n=Od-pD6ChvIzhY_fR\u0026q=85\u0026s=94d26e3e8e9ecd316386c38057803c62","api":{},"footer":{"socials":{"x":"https://x.com/widgetic","github":"https://github.com/widgetic"}},"errors":{"404":{"redirect":false,"title":"Page not found","description":"We couldn't find the page you were looking for.\n\n\u003cCardGroup cols={2}>\n \u003cCard title=\"Documentation\" icon=\"book\" href=\"/docs/introduction\">\n Return to the home page\n \u003c/Card>\n \u003cCard title=\"Quickstart\" icon=\"rocket\" href=\"/docs/quickstart\">\n Get started in minutes\n \u003c/Card>\n \u003cCard title=\"API Reference\" icon=\"code\" href=\"/api-reference/introduction\">\n Explore API endpoints\n \u003c/Card>\n \u003cCard title=\"SDKs\" icon=\"cube\" href=\"/resources/sdks\">\n Explore our SDKs\n \u003c/Card>\n\u003c/CardGroup>\n\n\u003cInfo>\n Think this is a broken link? Email us at [support@widgetic.com](mailto:support@widgetic.com).\n\u003c/Info>"}},"styling":{"latex":false},"navigation":{"pages":[]}},"deployment":{"deploymentMetadataValue":{"subdomain":"widgetic","hasAudioNarration":false,"actualSubdomain":"widgetic","customDomains":["widgetic.com"],"gitSource":{"type":"github","owner":"widgetic","repo":"docs","deployBranch":"main","contentDirectory":"","isPrivate":true,"mountPath":"","label":""},"entitlements":{},"buildId":"6af081e42ab4a0cc3d7f236c","clientVersion":"0.0.4111","searchFilterCounts":[{"language":"default","tag":"API Reference","count":177},{"language":"default","tag":"Documentation","count":42},{"language":"default","tag":"Partners","count":41},{"language":"default","tag":"Compositions","count":39},{"language":"default","tag":"Workflows","count":19},{"language":"default","tag":"Managed Users","count":18},{"language":"default","tag":"CLI","count":16},{"language":"default","tag":"Partner Integration","count":13},{"language":"default","tag":"Users","count":13},{"language":"default","tag":"Resources","count":10}]},"assistantConfig":{},"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":"llms-txt-v2","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}],"googleFontsInlined":false},"customCss":[],"page":{"pagePath":"api-reference/uploads/upload-a-file","slug":"/api-reference/uploads/upload-a-file","pageMetadata":{"title":"Upload a file","description":"Stores one file for the account and returns its public address. This is how a user's own images,\nvideo and PDFs reach a widget's content.\n\nSend a `multipart/form-data` request with the file in the field named `file`. The file counts\nagainst the storage of the workspace it is uploaded in, and a full workspace is refused with 413 and\n`QUOTA_STORAGE_EXCEEDED`. For a person signed in on widgetic.com that is the workspace they are currently\nworking in: inside a team, the team's shared storage; inside their own workspace, their own allowance. An\norganization API key, and a Shopify store's session, always work in that team's shared storage. A personal\nAPI key or an SDK token always uses the account's own allowance. The two never add up and one never lends\nroom to the other. A file over the size limit is refused with 413 and `UPLOAD_TOO_LARGE`, and a\ntype that is not accepted with 415 and `UPLOAD_UNSUPPORTED_TYPE`; `getUploadLimits` lists the size\nlimit and the accepted types.\n\nA file is judged by what is in it, not by the type it is sent as. A file that is not the type it claims (a\nweb page sent as `image/png`) is refused with 415 and `UPLOAD_UNSUPPORTED_TYPE`, and a picture sent under\nthe wrong picture type is stored under the type it really is, which `mime_type` in the answer says. An SVG\nis rewritten as it is stored: script, `foreignObject`, animation and references to other addresses are\ntaken out, it must be UTF-8 and at most 2 MB, and the stored file can be larger or smaller than the one\nsent. Anything that is not an image, audio or video (a PDF, for example) is served as a download rather\nthan shown in a page.\n\nWhen the full storage is a Shopify store's team's, extra storage cannot be added through Shopify yet, so the\nmessage ends by saying so and what to do instead: delete files, or contact support. On a Solo plan it names\nthe Teams plan (which holds more) and `error.details.planPageUrl` is the address of the plan page on Shopify.\n`error.suggestedAction` says the same in a few words, instead of the usual \"upgrade your storage plan\". Any\nother team, and a person's own workspace, get the shorter message.\n\nTo upload the file for one of your managed users, send `managedUserId` (Widgetic's id for the user) or\n`managedUserExternalId` (your own identifier for the user), not both. The file stays in your account and\ncounts against its allowance; the tag lets you list one user's files with `listUploads`. The managed user\nmust be yours and active: one that is not yours, or does not exist, is refused with 404 and\n`MANAGED_USER_NOT_FOUND`, and one that is switched off with 409 and `MANAGED_USER_INACTIVE`, before the\nfile is stored. The tag is set here and does not change afterwards.\n\nCalled with an editor session (`createManagedUserEditorSession`), the file is always filed for the\nsession's own managed user and is always media for widget content: naming another managed user is\nrefused with 403 and `MANAGED_USER_SESSION_MISMATCH`, and `contextType`, `source`, `widgetId` and\n`conversationId` are ignored. A full storage allowance is refused with the same 413 and\n`QUOTA_STORAGE_EXCEEDED`, but the message only says that it is not available right now (not how much is\nstored: that is the partner's business) and `error.details.limit` is `storage`.\n\nAn account that administers a partner with a storage destination (`setPartnerStorageDestination`) has\nits files stored in the partner's own bucket instead. Such a file takes none of the allowance, its `url`\nis served from the partner's public address, and its `storage_key` is the key in the partner's bucket.\nThe file is never stored with Widgetic instead: when the destination cannot be used the upload is refused\nwith 503 and `STORAGE_DESTINATION_UNAVAILABLE`, and when the partner's storage rejects the file with\n502 and `STORAGE_DESTINATION_WRITE_FAILED`.\n\nPartner storage is not optional, and it does not depend on how the file arrives. A partner's own uploads (with\nits API key, an SDK token, or from the Widgetic website, the resumable route and the media library alike)\nand the uploads of its customers' editor sessions are kept in the partner's own storage or not at all, so a\npartner with no destination (or one that removed it after the session was made) has them refused with 409\nand `PARTNER_STORAGE_REQUIRED`; they are never stored with Widgetic. An editor session's browser is only\ntold that the feature is not available right now.\n","deprecated":null,"version":null,"openapi":"/openapi/widgetic-api-public.json post /uploads","href":"/api-reference/uploads/upload-a-file","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: [_jsx(_components.p, {\n children: \"Stores one file for the account and returns its public address. This is how a user’s own images,\\nvideo and PDFs reach a widget’s content.\"\n }), \"\\n\", _jsxs(_components.p, {\n children: [\"Send a \", _jsx(_components.code, {\n children: \"multipart/form-data\"\n }), \" request with the file in the field named \", _jsx(_components.code, {\n children: \"file\"\n }), \". The file counts\\nagainst the storage of the workspace it is uploaded in, and a full workspace is refused with 413 and\\n\", _jsx(_components.code, {\n children: \"QUOTA_STORAGE_EXCEEDED\"\n }), \". For a person signed in on widgetic.com that is the workspace they are currently\\nworking in: inside a team, the team’s shared storage; inside their own workspace, their own allowance. An\\norganization API key, and a Shopify store’s session, always work in that team’s shared storage. A personal\\nAPI key or an SDK token always uses the account’s own allowance. The two never add up and one never lends\\nroom to the other. A file over the size limit is refused with 413 and \", _jsx(_components.code, {\n children: \"UPLOAD_TOO_LARGE\"\n }), \", and a\\ntype that is not accepted with 415 and \", _jsx(_components.code, {\n children: \"UPLOAD_UNSUPPORTED_TYPE\"\n }), \"; \", _jsx(_components.code, {\n children: \"getUploadLimits\"\n }), \" lists the size\\nlimit and the accepted types.\"]\n }), \"\\n\", _jsxs(_components.p, {\n children: [\"A file is judged by what is in it, not by the type it is sent as. A file that is not the type it claims (a\\nweb page sent as \", _jsx(_components.code, {\n children: \"image/png\"\n }), \") is refused with 415 and \", _jsx(_components.code, {\n children: \"UPLOAD_UNSUPPORTED_TYPE\"\n }), \", and a picture sent under\\nthe wrong picture type is stored under the type it really is, which \", _jsx(_components.code, {\n children: \"mime_type\"\n }), \" in the answer says. An SVG\\nis rewritten as it is stored: script, \", _jsx(_components.code, {\n children: \"foreignObject\"\n }), \", animation and references to other addresses are\\ntaken out, it must be UTF-8 and at most 2 MB, and the stored file can be larger or smaller than the one\\nsent. Anything that is not an image, audio or video (a PDF, for example) is served as a download rather\\nthan shown in a page.\"]\n }), \"\\n\", _jsxs(_components.p, {\n children: [\"When the full storage is a Shopify store’s team’s, extra storage cannot be added through Shopify yet, so the\\nmessage ends by saying so and what to do instead: delete files, or contact support. On a Solo plan it names\\nthe Teams plan (which holds more) and \", _jsx(_components.code, {\n children: \"error.details.planPageUrl\"\n }), \" is the address of the plan page on Shopify.\\n\", _jsx(_components.code, {\n children: \"error.suggestedAction\"\n }), \" says the same in a few words, instead of the usual “upgrade your storage plan”. Any\\nother team, and a person’s own workspace, get the shorter message.\"]\n }), \"\\n\", _jsxs(_components.p, {\n children: [\"To upload the file for one of your managed users, send \", _jsx(_components.code, {\n children: \"managedUserId\"\n }), \" (Widgetic’s id for the user) or\\n\", _jsx(_components.code, {\n children: \"managedUserExternalId\"\n }), \" (your own identifier for the user), not both. The file stays in your account and\\ncounts against its allowance; the tag lets you list one user’s files with \", _jsx(_components.code, {\n children: \"listUploads\"\n }), \". The managed user\\nmust be yours and active: one that is not yours, or does not exist, is refused with 404 and\\n\", _jsx(_components.code, {\n children: \"MANAGED_USER_NOT_FOUND\"\n }), \", and one that is switched off with 409 and \", _jsx(_components.code, {\n children: \"MANAGED_USER_INACTIVE\"\n }), \", before the\\nfile is stored. The tag is set here and does not change afterwards.\"]\n }), \"\\n\", _jsxs(_components.p, {\n children: [\"Called with an editor session (\", _jsx(_components.code, {\n children: \"createManagedUserEditorSession\"\n }), \"), the file is always filed for the\\nsession’s own managed user and is always media for widget content: naming another managed user is\\nrefused with 403 and \", _jsx(_components.code, {\n children: \"MANAGED_USER_SESSION_MISMATCH\"\n }), \", and \", _jsx(_components.code, {\n children: \"contextType\"\n }), \", \", _jsx(_components.code, {\n children: \"source\"\n }), \", \", _jsx(_components.code, {\n children: \"widgetId\"\n }), \" and\\n\", _jsx(_components.code, {\n children: \"conversationId\"\n }), \" are ignored. A full storage allowance is refused with the same 413 and\\n\", _jsx(_components.code, {\n children: \"QUOTA_STORAGE_EXCEEDED\"\n }), \", but the message only says that it is not available right now (not how much is\\nstored: that is the partner’s business) and \", _jsx(_components.code, {\n children: \"error.details.limit\"\n }), \" is \", _jsx(_components.code, {\n children: \"storage\"\n }), \".\"]\n }), \"\\n\", _jsxs(_components.p, {\n children: [\"An account that administers a partner with a storage destination (\", _jsx(_components.code, {\n children: \"setPartnerStorageDestination\"\n }), \") has\\nits files stored in the partner’s own bucket instead. Such a file takes none of the allowance, its \", _jsx(_components.code, {\n children: \"url\"\n }), \"\\nis served from the partner’s public address, and its \", _jsx(_components.code, {\n children: \"storage_key\"\n }), \" is the key in the partner’s bucket.\\nThe file is never stored with Widgetic instead: when the destination cannot be used the upload is refused\\nwith 503 and \", _jsx(_components.code, {\n children: \"STORAGE_DESTINATION_UNAVAILABLE\"\n }), \", and when the partner’s storage rejects the file with\\n502 and \", _jsx(_components.code, {\n children: \"STORAGE_DESTINATION_WRITE_FAILED\"\n }), \".\"]\n }), \"\\n\", _jsxs(_components.p, {\n children: [\"Partner storage is not optional, and it does not depend on how the file arrives. A partner’s own uploads (with\\nits API key, an SDK token, or from the Widgetic website, the resumable route and the media library alike)\\nand the uploads of its customers’ editor sessions are kept in the partner’s own storage or not at all, so a\\npartner with no destination (or one that removed it after the session was made) has them refused with 409\\nand \", _jsx(_components.code, {\n children: \"PARTNER_STORAGE_REQUIRED\"\n }), \"; they are never stored with Widgetic. An editor session’s browser is only\\ntold that the feature is not available right now.\"]\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":"Upload a file","description":"Stores one file for the account and returns its public address. This is how a user's own images,\nvideo and PDFs reach a widget's content.\n\nSend a `multipart/form-data` request with the file in the field named `file`. The file counts\nagainst the storage of the workspace it is uploaded in, and a full workspace is refused with 413 and\n`QUOTA_STORAGE_EXCEEDED`. For a person signed in on widgetic.com that is the workspace they are currently\nworking in: inside a team, the team's shared storage; inside their own workspace, their own allowance. An\norganization API key, and a Shopify store's session, always work in that team's shared storage. A personal\nAPI key or an SDK token always uses the account's own allowance. The two never add up and one never lends\nroom to the other. A file over the size limit is refused with 413 and `UPLOAD_TOO_LARGE`, and a\ntype that is not accepted with 415 and `UPLOAD_UNSUPPORTED_TYPE`; `getUploadLimits` lists the size\nlimit and the accepted types.\n\nA file is judged by what is in it, not by the type it is sent as. A file that is not the type it claims (a\nweb page sent as `image/png`) is refused with 415 and `UPLOAD_UNSUPPORTED_TYPE`, and a picture sent under\nthe wrong picture type is stored under the type it really is, which `mime_type` in the answer says. An SVG\nis rewritten as it is stored: script, `foreignObject`, animation and references to other addresses are\ntaken out, it must be UTF-8 and at most 2 MB, and the stored file can be larger or smaller than the one\nsent. Anything that is not an image, audio or video (a PDF, for example) is served as a download rather\nthan shown in a page.\n\nWhen the full storage is a Shopify store's team's, extra storage cannot be added through Shopify yet, so the\nmessage ends by saying so and what to do instead: delete files, or contact support. On a Solo plan it names\nthe Teams plan (which holds more) and `error.details.planPageUrl` is the address of the plan page on Shopify.\n`error.suggestedAction` says the same in a few words, instead of the usual \"upgrade your storage plan\". Any\nother team, and a person's own workspace, get the shorter message.\n\nTo upload the file for one of your managed users, send `managedUserId` (Widgetic's id for the user) or\n`managedUserExternalId` (your own identifier for the user), not both. The file stays in your account and\ncounts against its allowance; the tag lets you list one user's files with `listUploads`. The managed user\nmust be yours and active: one that is not yours, or does not exist, is refused with 404 and\n`MANAGED_USER_NOT_FOUND`, and one that is switched off with 409 and `MANAGED_USER_INACTIVE`, before the\nfile is stored. The tag is set here and does not change afterwards.\n\nCalled with an editor session (`createManagedUserEditorSession`), the file is always filed for the\nsession's own managed user and is always media for widget content: naming another managed user is\nrefused with 403 and `MANAGED_USER_SESSION_MISMATCH`, and `contextType`, `source`, `widgetId` and\n`conversationId` are ignored. A full storage allowance is refused with the same 413 and\n`QUOTA_STORAGE_EXCEEDED`, but the message only says that it is not available right now (not how much is\nstored: that is the partner's business) and `error.details.limit` is `storage`.\n\nAn account that administers a partner with a storage destination (`setPartnerStorageDestination`) has\nits files stored in the partner's own bucket instead. Such a file takes none of the allowance, its `url`\nis served from the partner's public address, and its `storage_key` is the key in the partner's bucket.\nThe file is never stored with Widgetic instead: when the destination cannot be used the upload is refused\nwith 503 and `STORAGE_DESTINATION_UNAVAILABLE`, and when the partner's storage rejects the file with\n502 and `STORAGE_DESTINATION_WRITE_FAILED`.\n\nPartner storage is not optional, and it does not depend on how the file arrives. A partner's own uploads (with\nits API key, an SDK token, or from the Widgetic website, the resumable route and the media library alike)\nand the uploads of its customers' editor sessions are kept in the partner's own storage or not at all, so a\npartner with no destination (or one that removed it after the session was made) has them refused with 409\nand `PARTNER_STORAGE_REQUIRED`; they are never stored with Widgetic. An editor session's browser is only\ntold that the feature is not available right now.\n","deprecated":null,"version":null,"openapi":"/openapi/widgetic-api-public.json post /uploads","href":"/api-reference/uploads/upload-a-file","autogeneratedByOpenApi":true}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[],"codeExamples":{}},"jsLinks":["/_mintlify/custom/widgetic/a06e02caee24c9e4/scripts/check-openapi-drift.js","/_mintlify/custom/widgetic/cfc959b865109f94/scripts/generate-code-samples.js","/_mintlify/custom/widgetic/4108e10153588825/scripts/sync-openapi.js","/_mintlify/custom/widgetic/0b8b2a5de38f31ba/scripts/validate-links.js","/_mintlify/custom/widgetic/f948d1cc9e974f48/scripts/__tests__/agentDocsDrift.test.js","/_mintlify/custom/widgetic/5e269cd2108b7191/scripts/check-agent-docs-drift.js","/_mintlify/custom/widgetic/5905b4748e7acd3e/scripts/lib/agentDocsDrift.js","/_mintlify/custom/widgetic/d772e7a3506ca340/scripts/__tests__/openApiServerAddress.test.js","/_mintlify/custom/widgetic/6a746d19cf42793e/scripts/lib/openApiServerAddress.js"],"openApiReferenceData":{"operation":{"operationId":"uploadFile","tags":["Uploads"],"summary":"Upload a file","description":"Stores one file for the account and returns its public address. This is how a user's own images,\nvideo and PDFs reach a widget's content.\n\nSend a `multipart/form-data` request with the file in the field named `file`. The file counts\nagainst the storage of the workspace it is uploaded in, and a full workspace is refused with 413 and\n`QUOTA_STORAGE_EXCEEDED`. For a person signed in on widgetic.com that is the workspace they are currently\nworking in: inside a team, the team's shared storage; inside their own workspace, their own allowance. An\norganization API key, and a Shopify store's session, always work in that team's shared storage. A personal\nAPI key or an SDK token always uses the account's own allowance. The two never add up and one never lends\nroom to the other. A file over the size limit is refused with 413 and `UPLOAD_TOO_LARGE`, and a\ntype that is not accepted with 415 and `UPLOAD_UNSUPPORTED_TYPE`; `getUploadLimits` lists the size\nlimit and the accepted types.\n\nA file is judged by what is in it, not by the type it is sent as. A file that is not the type it claims (a\nweb page sent as `image/png`) is refused with 415 and `UPLOAD_UNSUPPORTED_TYPE`, and a picture sent under\nthe wrong picture type is stored under the type it really is, which `mime_type` in the answer says. An SVG\nis rewritten as it is stored: script, `foreignObject`, animation and references to other addresses are\ntaken out, it must be UTF-8 and at most 2 MB, and the stored file can be larger or smaller than the one\nsent. Anything that is not an image, audio or video (a PDF, for example) is served as a download rather\nthan shown in a page.\n\nWhen the full storage is a Shopify store's team's, extra storage cannot be added through Shopify yet, so the\nmessage ends by saying so and what to do instead: delete files, or contact support. On a Solo plan it names\nthe Teams plan (which holds more) and `error.details.planPageUrl` is the address of the plan page on Shopify.\n`error.suggestedAction` says the same in a few words, instead of the usual \"upgrade your storage plan\". Any\nother team, and a person's own workspace, get the shorter message.\n\nTo upload the file for one of your managed users, send `managedUserId` (Widgetic's id for the user) or\n`managedUserExternalId` (your own identifier for the user), not both. The file stays in your account and\ncounts against its allowance; the tag lets you list one user's files with `listUploads`. The managed user\nmust be yours and active: one that is not yours, or does not exist, is refused with 404 and\n`MANAGED_USER_NOT_FOUND`, and one that is switched off with 409 and `MANAGED_USER_INACTIVE`, before the\nfile is stored. The tag is set here and does not change afterwards.\n\nCalled with an editor session (`createManagedUserEditorSession`), the file is always filed for the\nsession's own managed user and is always media for widget content: naming another managed user is\nrefused with 403 and `MANAGED_USER_SESSION_MISMATCH`, and `contextType`, `source`, `widgetId` and\n`conversationId` are ignored. A full storage allowance is refused with the same 413 and\n`QUOTA_STORAGE_EXCEEDED`, but the message only says that it is not available right now (not how much is\nstored: that is the partner's business) and `error.details.limit` is `storage`.\n\nAn account that administers a partner with a storage destination (`setPartnerStorageDestination`) has\nits files stored in the partner's own bucket instead. Such a file takes none of the allowance, its `url`\nis served from the partner's public address, and its `storage_key` is the key in the partner's bucket.\nThe file is never stored with Widgetic instead: when the destination cannot be used the upload is refused\nwith 503 and `STORAGE_DESTINATION_UNAVAILABLE`, and when the partner's storage rejects the file with\n502 and `STORAGE_DESTINATION_WRITE_FAILED`.\n\nPartner storage is not optional, and it does not depend on how the file arrives. A partner's own uploads (with\nits API key, an SDK token, or from the Widgetic website, the resumable route and the media library alike)\nand the uploads of its customers' editor sessions are kept in the partner's own storage or not at all, so a\npartner with no destination (or one that removed it after the session was made) has them refused with 409\nand `PARTNER_STORAGE_REQUIRED`; they are never stored with Widgetic. An editor session's browser is only\ntold that the feature is not available right now.\n","security":["5e37d935-bf13-492b-8cc4-757c4b9b590a"],"x-access-level":"user","x-visibility":"public","requestBody":"23a9d900-bab9-4b51-879e-41d175e944c5","responses":{"200":"e76bda93-1d3e-494f-ae3c-172dd410e18a","400":"bc25614b-3a27-4f74-8410-2b3758803074","401":"5b4b6abf-b7f2-45e5-a39c-9abf6f5a3280","403":"54053c9f-c493-4648-9f3f-c8ee3f1bad7f","404":"7a0fd1b5-35dc-4c7d-8388-5a7f9c2cd705","409":"ab727fcd-aa1e-4389-a332-db839e14df3a","413":"8e3fac0b-b2e9-4b96-b205-29ebe735a6ef","415":"53a47c1e-f307-44ec-a34b-8ed1e74479c5","502":"dba3bfff-d00d-4d13-9e83-473fa2acd14e","503":"feeb89b2-1bdb-4a50-9e8e-1b0c8cca9ebf"},"method":"post","type":"path","servers":["8cdad7e2-72d7-448d-a767-c0ce9882d766"],"path":"/uploads","baseUrlOptions":["https://api.widgetic.com/v1"],"title":"Upload a file","codeSamples":[],"requiredOnlyExamples":false,"requestExampleType":"generated","responseExampleType":"generated"},"dependencies":{"parameters":{},"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"type":"object","required":["file"],"properties":{"file":{"type":"string","format":"binary","description":"The file to store","isRequired":true,"uniqueKey":"file","typeLabel":"file"},"contextType":{"type":"string","enum":["widget-codegen","browser-ic","content-property"],"default":"content-property","description":"What the file is for. Send `content-property` for media that becomes widget content (images, video and PDF); the other values are used by Widgetic's own editor.\n","uniqueKey":"contextType","typeLabel":"enum\u003cstring>"},"source":{"type":"string","enum":["chat-upload","chat-screenshot","browser-ic-screenshot","preview-screenshot","file-browser-upload"],"default":"file-browser-upload","description":"Which part of the product, or which client, the file comes from","uniqueKey":"source","typeLabel":"enum\u003cstring>"},"managedUserId":{"type":"string","format":"uuid","description":"Upload the file for one of your managed users, by Widgetic's id for the user. Send this or `managedUserExternalId`, not both.","uniqueKey":"managedUserId","typeLabel":"string\u003cuuid>"},"managedUserExternalId":{"type":"string","maxLength":255,"description":"The same, by your own identifier for the user, the `externalId` you gave when you created the managed user. Send this or `managedUserId`, not both.","uniqueKey":"managedUserExternalId","typeLabel":"string"},"purpose":{"type":"string","enum":["canvas","chat","field"],"description":"Where in your product you use the file. It is kept with the file, so that a customer's storage can be counted by purpose (`getManagedUserStorageUsage`). Optional; any other value is refused with 400 and `UPLOAD_INVALID_PURPOSE`.","uniqueKey":"purpose","typeLabel":"enum\u003cstring>"}},"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"file":"\u003cstring>","contextType":"content-property","source":"file-browser-upload","managedUserId":"3c90c3cc-0d44-4b50-8888-8dd25736052a","managedUserExternalId":"\u003cstring>"}}},"exampleType":"generated"}},"exampleType":"generated"},"responses":{"e76bda93-1d3e-494f-ae3c-172dd410e18a":{"description":"The stored file","content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"type":"boolean","description":"Always `true` on a success.","example":true,"isRequired":true,"uniqueKey":"success","typeLabel":"boolean"},"data":{"type":"object","description":"A file stored for the account that uploaded it.","required":["id","url","mime_type","file_name","file_size","storage_key","context_type","source"],"properties":{"id":{"type":"string","format":"uuid","isRequired":true,"uniqueKey":"data.id","typeLabel":"string\u003cuuid>"},"url":{"type":"string","format":"uri","description":"The public address of the stored file","isRequired":true,"uniqueKey":"data.url","typeLabel":"string\u003curi>"},"mime_type":{"type":"string","description":"The type of the stored file. A HEIC or HEIF photo is stored as `image/jpeg`.","example":"image/png","isRequired":true,"uniqueKey":"data.mime_type","typeLabel":"string"},"file_name":{"type":"string","isRequired":true,"uniqueKey":"data.file_name","typeLabel":"string"},"file_size":{"type":"integer","description":"Size of the stored file, in bytes","isRequired":true,"uniqueKey":"data.file_size","typeLabel":"integer"},"storage_key":{"type":"string","description":"Where the file sits in its storage bucket","isRequired":true,"uniqueKey":"data.storage_key","typeLabel":"string"},"context_type":{"type":"string","enum":["widget-codegen","browser-ic","content-property"],"description":"What the file was uploaded for. Media for widget content is `content-property`.","isRequired":true,"uniqueKey":"data.context_type","typeLabel":"enum\u003cstring>"},"source":{"type":"string","enum":["chat-upload","chat-screenshot","browser-ic-screenshot","preview-screenshot","file-browser-upload","widget-visitor-upload"],"description":"Which part of the product, or which client, uploaded the file. `widget-visitor-upload` is a file a visitor sent through a widget's upload adapter; it cannot be asked for when uploading.","isRequired":true,"uniqueKey":"data.source","typeLabel":"enum\u003cstring>"},"width":{"oneOf":[{"type":"integer","description":"Width in pixels, for images","uniqueKey":"data.width.oneOf.0","typeLabel":"integer"},{"type":"null","description":"Width in pixels, for images","uniqueKey":"data.width.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.width","typeLabel":"integer | null"},"height":{"oneOf":[{"type":"integer","description":"Height in pixels, for images","uniqueKey":"data.height.oneOf.0","typeLabel":"integer"},{"type":"null","description":"Height in pixels, for images","uniqueKey":"data.height.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.height","typeLabel":"integer | null"},"widget_id":{"oneOf":[{"type":"string","format":"uuid","uniqueKey":"data.widget_id.oneOf.0","typeLabel":"string\u003cuuid>"},{"type":"null","format":"uuid","uniqueKey":"data.widget_id.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.widget_id","typeLabel":"string\u003cuuid> | null"},"conversation_id":{"oneOf":[{"type":"string","format":"uuid","uniqueKey":"data.conversation_id.oneOf.0","typeLabel":"string\u003cuuid>"},{"type":"null","format":"uuid","uniqueKey":"data.conversation_id.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.conversation_id","typeLabel":"string\u003cuuid> | null"},"managed_user_id":{"oneOf":[{"type":"string","format":"uuid","description":"The managed user the file was uploaded for, or null when it is the account's own. List one managed user's files with the `managed_user_id` or `managed_user_external_id` query parameter of `listUploads`.","uniqueKey":"data.managed_user_id.oneOf.0","typeLabel":"string\u003cuuid>"},{"type":"null","format":"uuid","description":"The managed user the file was uploaded for, or null when it is the account's own. List one managed user's files with the `managed_user_id` or `managed_user_external_id` query parameter of `listUploads`.","uniqueKey":"data.managed_user_id.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.managed_user_id","typeLabel":"string\u003cuuid> | null"},"purpose":{"oneOf":[{"type":"string","enum":["canvas","chat","field"],"description":"Where in the product the partner uses the file, or null when unknown","uniqueKey":"data.purpose.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","enum":["canvas","chat","field"],"description":"Where in the product the partner uses the file, or null when unknown","uniqueKey":"data.purpose.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.purpose","typeLabel":"enum\u003cstring> | null"}},"example":{"id":"3fa85f64-5717-4562-b3fc-2c963f66afa6","url":"Example url","mime_type":"image/png","file_name":"Example file_name","file_size":42,"width":42,"height":42,"storage_key":"Example storage_key","context_type":"Example context_type","source":"Example source","widget_id":"3fa85f64-5717-4562-b3fc-2c963f66afa6","conversation_id":"3fa85f64-5717-4562-b3fc-2c963f66afa6","managed_user_id":"3fa85f64-5717-4562-b3fc-2c963f66afa6","purpose":"Example purpose"},"isRequired":true,"uniqueKey":"data","typeLabel":"object"},"meta":{"type":"object","description":"Extra information about the answer: where a page sits in a list, the cursor of the next page, or warnings about a call that succeeded with a caveat.","additionalProperties":true,"properties":{"page":{"type":"integer","description":"The page that was read, counting from 1.","example":1,"uniqueKey":"meta.page","typeLabel":"integer"},"size":{"type":"integer","description":"How many items one page holds.","example":20,"uniqueKey":"meta.size","typeLabel":"integer"},"total":{"type":"integer","description":"How many items the whole list has.","example":135,"uniqueKey":"meta.total","typeLabel":"integer"},"limit":{"type":"integer","description":"The same as `size`.","example":20,"uniqueKey":"meta.limit","typeLabel":"integer"},"offset":{"type":"integer","description":"How many items come before this page.","example":0,"uniqueKey":"meta.offset","typeLabel":"integer"},"hasNextPage":{"type":"boolean","example":true,"uniqueKey":"meta.hasNextPage","typeLabel":"boolean"},"hasPreviousPage":{"type":"boolean","example":false,"uniqueKey":"meta.hasPreviousPage","typeLabel":"boolean"},"nextCursor":{"oneOf":[{"type":"string","description":"Pass this as `cursor` to read the next page of a list that is read by cursor. `null` on the last page.","uniqueKey":"meta.nextCursor.oneOf.0","typeLabel":"string"},{"type":"null","description":"Pass this as `cursor` to read the next page of a list that is read by cursor. `null` on the last page.","uniqueKey":"meta.nextCursor.oneOf.1","typeLabel":"null"}],"uniqueKey":"meta.nextCursor","typeLabel":"string | null"},"warnings":{"type":"array","items":{"type":"string","uniqueKey":"meta.warnings.items.[INDEX]","typeLabel":"string"},"description":"Things the call did not do, though it succeeded (for example a table that could not be created just now).","uniqueKey":"meta.warnings","typeLabel":"string[]"}},"uniqueKey":"meta","typeLabel":"object"}},"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"success":true,"data":{"id":"3fa85f64-5717-4562-b3fc-2c963f66afa6","url":"Example url","mime_type":"image/png","file_name":"Example file_name","file_size":42,"width":42,"height":42,"storage_key":"Example storage_key","context_type":"Example context_type","source":"Example source","widget_id":"3fa85f64-5717-4562-b3fc-2c963f66afa6","conversation_id":"3fa85f64-5717-4562-b3fc-2c963f66afa6","managed_user_id":"3fa85f64-5717-4562-b3fc-2c963f66afa6","purpose":"Example purpose"},"meta":{"page":1,"size":20,"total":135,"limit":20,"offset":0,"hasNextPage":true,"hasPreviousPage":false,"nextCursor":"\u003cstring>","warnings":["\u003cstring>"]}}}},"exampleType":"generated"}},"exampleType":"generated"},"bc25614b-3a27-4f74-8410-2b3758803074":{"description":"No file was sent, more than one was, or it was not in the field named `file`; or a managed user field is not valid (`MANAGED_USER_REFERENCE_INVALID`, or `MANAGED_USER_REFERENCE_AMBIGUOUS` when both are sent); or `purpose` is not one of the three (`UPLOAD_INVALID_PURPOSE`)","content":{"application/json":{"schema":{"type":"object","required":["success","message","error"],"additionalProperties":true,"properties":{"success":{"type":"boolean","description":"Always `false` on a failure.","example":false,"isRequired":true,"uniqueKey":"success","typeLabel":"boolean"},"message":{"type":"string","description":"The same text as `error.message`, for a caller that reads one line.","isRequired":true,"uniqueKey":"message","typeLabel":"string"},"error":{"type":"object","required":["code","message","timestamp"],"properties":{"code":{"type":"string","description":"Machine-readable error code.","example":"RESOURCE_NOT_FOUND","isRequired":true,"uniqueKey":"error.code","typeLabel":"string"},"message":{"type":"string","description":"Human-readable explanation.","example":"Composition not found","isRequired":true,"uniqueKey":"error.message","typeLabel":"string"},"timestamp":{"type":"string","format":"date-time","example":"2026-10-15T10:00:00.000Z","isRequired":true,"uniqueKey":"error.timestamp","typeLabel":"string\u003cdate-time>"},"param":{"type":"string","description":"The field that caused the error, when one did.","example":"name","uniqueKey":"error.param","typeLabel":"string"},"docUrl":{"type":"string","description":"Where this error is explained.","uniqueKey":"error.docUrl","typeLabel":"string"},"suggestedAction":{"type":"string","description":"What to do about it.","uniqueKey":"error.suggestedAction","typeLabel":"string"},"retryAfter":{"type":"integer","description":"Seconds to wait before trying again (rate limits). The same number is in the `Retry-After` header.","example":60,"uniqueKey":"error.retryAfter","typeLabel":"integer"},"details":{"type":"object","additionalProperties":true,"description":"More about the error: the fields that failed, a limit that was reached.","uniqueKey":"error.details","typeLabel":"object"},"correlationId":{"type":"string","description":"Quote this when you ask support about the call.","example":"req_123e4567-e89b-12d3-a456-426614174000","uniqueKey":"error.correlationId","typeLabel":"string"}},"isRequired":true,"uniqueKey":"error","typeLabel":"object"}},"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"success":false,"message":"\u003cstring>","error":{"code":"RESOURCE_NOT_FOUND","message":"Composition not found","timestamp":"2026-10-15T10:00:00.000Z","param":"name","docUrl":"\u003cstring>","suggestedAction":"\u003cstring>","retryAfter":60,"details":{},"correlationId":"req_123e4567-e89b-12d3-a456-426614174000"}}}},"exampleType":"generated"}},"exampleType":"generated"},"5b4b6abf-b7f2-45e5-a39c-9abf6f5a3280":{"description":"The API key is missing or invalid","content":{"application/json":{"schema":{"type":"object","required":["success","message","error"],"additionalProperties":true,"properties":{"success":{"type":"boolean","description":"Always `false` on a failure.","example":false,"isRequired":true,"uniqueKey":"success","typeLabel":"boolean"},"message":{"type":"string","description":"The same text as `error.message`, for a caller that reads one line.","isRequired":true,"uniqueKey":"message","typeLabel":"string"},"error":{"type":"object","required":["code","message","timestamp"],"properties":{"code":{"type":"string","description":"Machine-readable error code.","example":"RESOURCE_NOT_FOUND","isRequired":true,"uniqueKey":"error.code","typeLabel":"string"},"message":{"type":"string","description":"Human-readable explanation.","example":"Composition not found","isRequired":true,"uniqueKey":"error.message","typeLabel":"string"},"timestamp":{"type":"string","format":"date-time","example":"2026-10-15T10:00:00.000Z","isRequired":true,"uniqueKey":"error.timestamp","typeLabel":"string\u003cdate-time>"},"param":{"type":"string","description":"The field that caused the error, when one did.","example":"name","uniqueKey":"error.param","typeLabel":"string"},"docUrl":{"type":"string","description":"Where this error is explained.","uniqueKey":"error.docUrl","typeLabel":"string"},"suggestedAction":{"type":"string","description":"What to do about it.","uniqueKey":"error.suggestedAction","typeLabel":"string"},"retryAfter":{"type":"integer","description":"Seconds to wait before trying again (rate limits). The same number is in the `Retry-After` header.","example":60,"uniqueKey":"error.retryAfter","typeLabel":"integer"},"details":{"type":"object","additionalProperties":true,"description":"More about the error: the fields that failed, a limit that was reached.","uniqueKey":"error.details","typeLabel":"object"},"correlationId":{"type":"string","description":"Quote this when you ask support about the call.","example":"req_123e4567-e89b-12d3-a456-426614174000","uniqueKey":"error.correlationId","typeLabel":"string"}},"isRequired":true,"uniqueKey":"error","typeLabel":"object"}},"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"success":false,"message":"\u003cstring>","error":{"code":"RESOURCE_NOT_FOUND","message":"Composition not found","timestamp":"2026-10-15T10:00:00.000Z","param":"name","docUrl":"\u003cstring>","suggestedAction":"\u003cstring>","retryAfter":60,"details":{},"correlationId":"req_123e4567-e89b-12d3-a456-426614174000"}}}},"exampleType":"generated"}},"exampleType":"generated"},"54053c9f-c493-4648-9f3f-c8ee3f1bad7f":{"description":"An editor session named a managed user other than its own (`MANAGED_USER_SESSION_MISMATCH`)","content":{"application/json":{"schema":{"type":"object","required":["success","message","error"],"additionalProperties":true,"properties":{"success":{"type":"boolean","description":"Always `false` on a failure.","example":false,"isRequired":true,"uniqueKey":"success","typeLabel":"boolean"},"message":{"type":"string","description":"The same text as `error.message`, for a caller that reads one line.","isRequired":true,"uniqueKey":"message","typeLabel":"string"},"error":{"type":"object","required":["code","message","timestamp"],"properties":{"code":{"type":"string","description":"Machine-readable error code.","example":"RESOURCE_NOT_FOUND","isRequired":true,"uniqueKey":"error.code","typeLabel":"string"},"message":{"type":"string","description":"Human-readable explanation.","example":"Composition not found","isRequired":true,"uniqueKey":"error.message","typeLabel":"string"},"timestamp":{"type":"string","format":"date-time","example":"2026-10-15T10:00:00.000Z","isRequired":true,"uniqueKey":"error.timestamp","typeLabel":"string\u003cdate-time>"},"param":{"type":"string","description":"The field that caused the error, when one did.","example":"name","uniqueKey":"error.param","typeLabel":"string"},"docUrl":{"type":"string","description":"Where this error is explained.","uniqueKey":"error.docUrl","typeLabel":"string"},"suggestedAction":{"type":"string","description":"What to do about it.","uniqueKey":"error.suggestedAction","typeLabel":"string"},"retryAfter":{"type":"integer","description":"Seconds to wait before trying again (rate limits). The same number is in the `Retry-After` header.","example":60,"uniqueKey":"error.retryAfter","typeLabel":"integer"},"details":{"type":"object","additionalProperties":true,"description":"More about the error: the fields that failed, a limit that was reached.","uniqueKey":"error.details","typeLabel":"object"},"correlationId":{"type":"string","description":"Quote this when you ask support about the call.","example":"req_123e4567-e89b-12d3-a456-426614174000","uniqueKey":"error.correlationId","typeLabel":"string"}},"isRequired":true,"uniqueKey":"error","typeLabel":"object"}},"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"success":false,"message":"\u003cstring>","error":{"code":"RESOURCE_NOT_FOUND","message":"Composition not found","timestamp":"2026-10-15T10:00:00.000Z","param":"name","docUrl":"\u003cstring>","suggestedAction":"\u003cstring>","retryAfter":60,"details":{},"correlationId":"req_123e4567-e89b-12d3-a456-426614174000"}}}},"exampleType":"generated"}},"exampleType":"generated"},"7a0fd1b5-35dc-4c7d-8388-5a7f9c2cd705":{"description":"The managed user is not one of yours (`MANAGED_USER_NOT_FOUND`)","content":{"application/json":{"schema":{"type":"object","required":["success","message","error"],"additionalProperties":true,"properties":{"success":{"type":"boolean","description":"Always `false` on a failure.","example":false,"isRequired":true,"uniqueKey":"success","typeLabel":"boolean"},"message":{"type":"string","description":"The same text as `error.message`, for a caller that reads one line.","isRequired":true,"uniqueKey":"message","typeLabel":"string"},"error":{"type":"object","required":["code","message","timestamp"],"properties":{"code":{"type":"string","description":"Machine-readable error code.","example":"RESOURCE_NOT_FOUND","isRequired":true,"uniqueKey":"error.code","typeLabel":"string"},"message":{"type":"string","description":"Human-readable explanation.","example":"Composition not found","isRequired":true,"uniqueKey":"error.message","typeLabel":"string"},"timestamp":{"type":"string","format":"date-time","example":"2026-10-15T10:00:00.000Z","isRequired":true,"uniqueKey":"error.timestamp","typeLabel":"string\u003cdate-time>"},"param":{"type":"string","description":"The field that caused the error, when one did.","example":"name","uniqueKey":"error.param","typeLabel":"string"},"docUrl":{"type":"string","description":"Where this error is explained.","uniqueKey":"error.docUrl","typeLabel":"string"},"suggestedAction":{"type":"string","description":"What to do about it.","uniqueKey":"error.suggestedAction","typeLabel":"string"},"retryAfter":{"type":"integer","description":"Seconds to wait before trying again (rate limits). The same number is in the `Retry-After` header.","example":60,"uniqueKey":"error.retryAfter","typeLabel":"integer"},"details":{"type":"object","additionalProperties":true,"description":"More about the error: the fields that failed, a limit that was reached.","uniqueKey":"error.details","typeLabel":"object"},"correlationId":{"type":"string","description":"Quote this when you ask support about the call.","example":"req_123e4567-e89b-12d3-a456-426614174000","uniqueKey":"error.correlationId","typeLabel":"string"}},"isRequired":true,"uniqueKey":"error","typeLabel":"object"}},"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"success":false,"message":"\u003cstring>","error":{"code":"RESOURCE_NOT_FOUND","message":"Composition not found","timestamp":"2026-10-15T10:00:00.000Z","param":"name","docUrl":"\u003cstring>","suggestedAction":"\u003cstring>","retryAfter":60,"details":{},"correlationId":"req_123e4567-e89b-12d3-a456-426614174000"}}}},"exampleType":"generated"}},"exampleType":"generated"},"ab727fcd-aa1e-4389-a332-db839e14df3a":{"description":"The managed user is switched off, so nothing new can be uploaded for it (`MANAGED_USER_INACTIVE`); or an editor session uploaded and the partner has no storage destination (`PARTNER_STORAGE_REQUIRED`)","content":{"application/json":{"schema":{"type":"object","required":["success","message","error"],"additionalProperties":true,"properties":{"success":{"type":"boolean","description":"Always `false` on a failure.","example":false,"isRequired":true,"uniqueKey":"success","typeLabel":"boolean"},"message":{"type":"string","description":"The same text as `error.message`, for a caller that reads one line.","isRequired":true,"uniqueKey":"message","typeLabel":"string"},"error":{"type":"object","required":["code","message","timestamp"],"properties":{"code":{"type":"string","description":"Machine-readable error code.","example":"RESOURCE_NOT_FOUND","isRequired":true,"uniqueKey":"error.code","typeLabel":"string"},"message":{"type":"string","description":"Human-readable explanation.","example":"Composition not found","isRequired":true,"uniqueKey":"error.message","typeLabel":"string"},"timestamp":{"type":"string","format":"date-time","example":"2026-10-15T10:00:00.000Z","isRequired":true,"uniqueKey":"error.timestamp","typeLabel":"string\u003cdate-time>"},"param":{"type":"string","description":"The field that caused the error, when one did.","example":"name","uniqueKey":"error.param","typeLabel":"string"},"docUrl":{"type":"string","description":"Where this error is explained.","uniqueKey":"error.docUrl","typeLabel":"string"},"suggestedAction":{"type":"string","description":"What to do about it.","uniqueKey":"error.suggestedAction","typeLabel":"string"},"retryAfter":{"type":"integer","description":"Seconds to wait before trying again (rate limits). The same number is in the `Retry-After` header.","example":60,"uniqueKey":"error.retryAfter","typeLabel":"integer"},"details":{"type":"object","additionalProperties":true,"description":"More about the error: the fields that failed, a limit that was reached.","uniqueKey":"error.details","typeLabel":"object"},"correlationId":{"type":"string","description":"Quote this when you ask support about the call.","example":"req_123e4567-e89b-12d3-a456-426614174000","uniqueKey":"error.correlationId","typeLabel":"string"}},"isRequired":true,"uniqueKey":"error","typeLabel":"object"}},"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"success":false,"message":"\u003cstring>","error":{"code":"RESOURCE_NOT_FOUND","message":"Composition not found","timestamp":"2026-10-15T10:00:00.000Z","param":"name","docUrl":"\u003cstring>","suggestedAction":"\u003cstring>","retryAfter":60,"details":{},"correlationId":"req_123e4567-e89b-12d3-a456-426614174000"}}}},"exampleType":"generated"}},"exampleType":"generated"},"8e3fac0b-b2e9-4b96-b205-29ebe735a6ef":{"description":"The file is over the size limit (`UPLOAD_TOO_LARGE`), or the storage of the workspace the file is for is full (`QUOTA_STORAGE_EXCEEDED`; for a Shopify store's team the message also says what to do, and on a Solo plan `error.details.planPageUrl` is the plan page)","content":{"application/json":{"schema":{"type":"object","required":["success","message","error"],"additionalProperties":true,"properties":{"success":{"type":"boolean","description":"Always `false` on a failure.","example":false,"isRequired":true,"uniqueKey":"success","typeLabel":"boolean"},"message":{"type":"string","description":"The same text as `error.message`, for a caller that reads one line.","isRequired":true,"uniqueKey":"message","typeLabel":"string"},"error":{"type":"object","required":["code","message","timestamp"],"properties":{"code":{"type":"string","description":"Machine-readable error code.","example":"RESOURCE_NOT_FOUND","isRequired":true,"uniqueKey":"error.code","typeLabel":"string"},"message":{"type":"string","description":"Human-readable explanation.","example":"Composition not found","isRequired":true,"uniqueKey":"error.message","typeLabel":"string"},"timestamp":{"type":"string","format":"date-time","example":"2026-10-15T10:00:00.000Z","isRequired":true,"uniqueKey":"error.timestamp","typeLabel":"string\u003cdate-time>"},"param":{"type":"string","description":"The field that caused the error, when one did.","example":"name","uniqueKey":"error.param","typeLabel":"string"},"docUrl":{"type":"string","description":"Where this error is explained.","uniqueKey":"error.docUrl","typeLabel":"string"},"suggestedAction":{"type":"string","description":"What to do about it.","uniqueKey":"error.suggestedAction","typeLabel":"string"},"retryAfter":{"type":"integer","description":"Seconds to wait before trying again (rate limits). The same number is in the `Retry-After` header.","example":60,"uniqueKey":"error.retryAfter","typeLabel":"integer"},"details":{"type":"object","additionalProperties":true,"description":"More about the error: the fields that failed, a limit that was reached.","uniqueKey":"error.details","typeLabel":"object"},"correlationId":{"type":"string","description":"Quote this when you ask support about the call.","example":"req_123e4567-e89b-12d3-a456-426614174000","uniqueKey":"error.correlationId","typeLabel":"string"}},"isRequired":true,"uniqueKey":"error","typeLabel":"object"}},"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"success":false,"message":"\u003cstring>","error":{"code":"RESOURCE_NOT_FOUND","message":"Composition not found","timestamp":"2026-10-15T10:00:00.000Z","param":"name","docUrl":"\u003cstring>","suggestedAction":"\u003cstring>","retryAfter":60,"details":{},"correlationId":"req_123e4567-e89b-12d3-a456-426614174000"}}}},"exampleType":"generated"}},"exampleType":"generated"},"53a47c1e-f307-44ec-a34b-8ed1e74479c5":{"description":"The file type is not accepted, or the contents are not the type the file was sent as (`UPLOAD_UNSUPPORTED_TYPE`)","content":{"application/json":{"schema":{"type":"object","required":["success","message","error"],"additionalProperties":true,"properties":{"success":{"type":"boolean","description":"Always `false` on a failure.","example":false,"isRequired":true,"uniqueKey":"success","typeLabel":"boolean"},"message":{"type":"string","description":"The same text as `error.message`, for a caller that reads one line.","isRequired":true,"uniqueKey":"message","typeLabel":"string"},"error":{"type":"object","required":["code","message","timestamp"],"properties":{"code":{"type":"string","description":"Machine-readable error code.","example":"RESOURCE_NOT_FOUND","isRequired":true,"uniqueKey":"error.code","typeLabel":"string"},"message":{"type":"string","description":"Human-readable explanation.","example":"Composition not found","isRequired":true,"uniqueKey":"error.message","typeLabel":"string"},"timestamp":{"type":"string","format":"date-time","example":"2026-10-15T10:00:00.000Z","isRequired":true,"uniqueKey":"error.timestamp","typeLabel":"string\u003cdate-time>"},"param":{"type":"string","description":"The field that caused the error, when one did.","example":"name","uniqueKey":"error.param","typeLabel":"string"},"docUrl":{"type":"string","description":"Where this error is explained.","uniqueKey":"error.docUrl","typeLabel":"string"},"suggestedAction":{"type":"string","description":"What to do about it.","uniqueKey":"error.suggestedAction","typeLabel":"string"},"retryAfter":{"type":"integer","description":"Seconds to wait before trying again (rate limits). The same number is in the `Retry-After` header.","example":60,"uniqueKey":"error.retryAfter","typeLabel":"integer"},"details":{"type":"object","additionalProperties":true,"description":"More about the error: the fields that failed, a limit that was reached.","uniqueKey":"error.details","typeLabel":"object"},"correlationId":{"type":"string","description":"Quote this when you ask support about the call.","example":"req_123e4567-e89b-12d3-a456-426614174000","uniqueKey":"error.correlationId","typeLabel":"string"}},"isRequired":true,"uniqueKey":"error","typeLabel":"object"}},"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"success":false,"message":"\u003cstring>","error":{"code":"RESOURCE_NOT_FOUND","message":"Composition not found","timestamp":"2026-10-15T10:00:00.000Z","param":"name","docUrl":"\u003cstring>","suggestedAction":"\u003cstring>","retryAfter":60,"details":{},"correlationId":"req_123e4567-e89b-12d3-a456-426614174000"}}}},"exampleType":"generated"}},"exampleType":"generated"},"dba3bfff-d00d-4d13-9e83-473fa2acd14e":{"description":"The partner's own storage did not accept the file (`STORAGE_DESTINATION_WRITE_FAILED`)","content":{"application/json":{"schema":{"type":"object","required":["success","message","error"],"additionalProperties":true,"properties":{"success":{"type":"boolean","description":"Always `false` on a failure.","example":false,"isRequired":true,"uniqueKey":"success","typeLabel":"boolean"},"message":{"type":"string","description":"The same text as `error.message`, for a caller that reads one line.","isRequired":true,"uniqueKey":"message","typeLabel":"string"},"error":{"type":"object","required":["code","message","timestamp"],"properties":{"code":{"type":"string","description":"Machine-readable error code.","example":"RESOURCE_NOT_FOUND","isRequired":true,"uniqueKey":"error.code","typeLabel":"string"},"message":{"type":"string","description":"Human-readable explanation.","example":"Composition not found","isRequired":true,"uniqueKey":"error.message","typeLabel":"string"},"timestamp":{"type":"string","format":"date-time","example":"2026-10-15T10:00:00.000Z","isRequired":true,"uniqueKey":"error.timestamp","typeLabel":"string\u003cdate-time>"},"param":{"type":"string","description":"The field that caused the error, when one did.","example":"name","uniqueKey":"error.param","typeLabel":"string"},"docUrl":{"type":"string","description":"Where this error is explained.","uniqueKey":"error.docUrl","typeLabel":"string"},"suggestedAction":{"type":"string","description":"What to do about it.","uniqueKey":"error.suggestedAction","typeLabel":"string"},"retryAfter":{"type":"integer","description":"Seconds to wait before trying again (rate limits). The same number is in the `Retry-After` header.","example":60,"uniqueKey":"error.retryAfter","typeLabel":"integer"},"details":{"type":"object","additionalProperties":true,"description":"More about the error: the fields that failed, a limit that was reached.","uniqueKey":"error.details","typeLabel":"object"},"correlationId":{"type":"string","description":"Quote this when you ask support about the call.","example":"req_123e4567-e89b-12d3-a456-426614174000","uniqueKey":"error.correlationId","typeLabel":"string"}},"isRequired":true,"uniqueKey":"error","typeLabel":"object"}},"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"success":false,"message":"\u003cstring>","error":{"code":"RESOURCE_NOT_FOUND","message":"Composition not found","timestamp":"2026-10-15T10:00:00.000Z","param":"name","docUrl":"\u003cstring>","suggestedAction":"\u003cstring>","retryAfter":60,"details":{},"correlationId":"req_123e4567-e89b-12d3-a456-426614174000"}}}},"exampleType":"generated"}},"exampleType":"generated"},"feeb89b2-1bdb-4a50-9e8e-1b0c8cca9ebf":{"description":"The account's storage destination cannot be used right now (`STORAGE_DESTINATION_UNAVAILABLE`)","content":{"application/json":{"schema":{"type":"object","required":["success","message","error"],"additionalProperties":true,"properties":{"success":{"type":"boolean","description":"Always `false` on a failure.","example":false,"isRequired":true,"uniqueKey":"success","typeLabel":"boolean"},"message":{"type":"string","description":"The same text as `error.message`, for a caller that reads one line.","isRequired":true,"uniqueKey":"message","typeLabel":"string"},"error":{"type":"object","required":["code","message","timestamp"],"properties":{"code":{"type":"string","description":"Machine-readable error code.","example":"RESOURCE_NOT_FOUND","isRequired":true,"uniqueKey":"error.code","typeLabel":"string"},"message":{"type":"string","description":"Human-readable explanation.","example":"Composition not found","isRequired":true,"uniqueKey":"error.message","typeLabel":"string"},"timestamp":{"type":"string","format":"date-time","example":"2026-10-15T10:00:00.000Z","isRequired":true,"uniqueKey":"error.timestamp","typeLabel":"string\u003cdate-time>"},"param":{"type":"string","description":"The field that caused the error, when one did.","example":"name","uniqueKey":"error.param","typeLabel":"string"},"docUrl":{"type":"string","description":"Where this error is explained.","uniqueKey":"error.docUrl","typeLabel":"string"},"suggestedAction":{"type":"string","description":"What to do about it.","uniqueKey":"error.suggestedAction","typeLabel":"string"},"retryAfter":{"type":"integer","description":"Seconds to wait before trying again (rate limits). The same number is in the `Retry-After` header.","example":60,"uniqueKey":"error.retryAfter","typeLabel":"integer"},"details":{"type":"object","additionalProperties":true,"description":"More about the error: the fields that failed, a limit that was reached.","uniqueKey":"error.details","typeLabel":"object"},"correlationId":{"type":"string","description":"Quote this when you ask support about the call.","example":"req_123e4567-e89b-12d3-a456-426614174000","uniqueKey":"error.correlationId","typeLabel":"string"}},"isRequired":true,"uniqueKey":"error","typeLabel":"object"}},"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"success":false,"message":"\u003cstring>","error":{"code":"RESOURCE_NOT_FOUND","message":"Composition not found","timestamp":"2026-10-15T10:00:00.000Z","param":"name","docUrl":"\u003cstring>","suggestedAction":"\u003cstring>","retryAfter":60,"details":{},"correlationId":"req_123e4567-e89b-12d3-a456-426614174000"}}}},"exampleType":"generated"}},"exampleType":"generated"}},"security":{"5e37d935-bf13-492b-8cc4-757c4b9b590a":{"apiKeyAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT","scopes":[],"schemeName":"apiKeyAuth"}}},"servers":{"8cdad7e2-72d7-448d-a767-c0ce9882d766":{"url":"https://api.widgetic.com/v1","description":"Production server","variables":{"env":{"default":"production","description":"Environment"},"apiUrl":{"default":"https://api.widgetic.com","description":"API URL"},"apiVersion":{"default":"/v1","description":"API Version path prefix"}}}},"processedSecurityOptions":[{"schemes":[{"scheme":{"type":"http","scheme":"bearer","bearerFormat":"JWT","scopes":[],"schemeName":"apiKeyAuth"},"schema":{"title":"Bearer Auth","type":"string","isRequired":true,"description":"Bearer authentication header of the form `Bearer \u003ctoken>`, where `\u003ctoken>` is your auth token.","format":"bearer","typeLabel":"string\u003cbearer>","deprecated":false},"schemeName":"apiKeyAuth","name":"Authorization"}],"title":"apiKeyAuth"}]},"originalFileLocation":"openapi/widgetic-api-public.json"},"subdomain":"widgetic","siteName":"Widgetic","title":"Upload a file - Widgetic","navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{}},"lastModified":"2026-11-08T14:06:36.360Z","originalFileLocation":"api-reference/uploads/upload-a-file.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=\"Stores one file for the account and returns its public address. This is how a user\u0026#x27;s own images, video and PDFs reach a widget\u0026#x27;s content. Send a multipart/form-data request with the file in the field named file. The file counts against the storage of the workspace it is uploaded in, and a full workspace is refused with 413 and QUOTA_STORAGE_EXCEEDED. For a person signed in on widgetic.com that is the workspace they are currently working in: inside a team, the team\u0026#x27;s shared storage; inside their own workspace, their own allowance. An organization API key, and a Shopify store\u0026#x27;s session, always work in that team\u0026#x27;s shared storage. A personal API key or an SDK token always uses the account\u0026#x27;s own allowance. The two never add up and one never lends room to the other. A file over the size limit is refused with 413 and UPLOAD_TOO_LARGE, and a type that is not accepted with 415 and UPLOAD_UNSUPPORTED_TYPE; getUploadLimits lists the size limit and the accepted types. A file is judged by what is in it, not by the type it is sent as. A file that is not the type it claims (a web page sent as image/png) is refused with 415 and UPLOAD_UNSUPPORTED_TYPE, and a picture sent under the wrong picture type is stored under the type it really is, which mime_type in the answer says. An SVG is rewritten as it is stored: script, foreignObject, animation and references to other addresses are taken out, it must be UTF-8 and at most 2 MB, and the stored file can be larger or smaller than the one sent. Anything that is not an image, audio or video (a PDF, for example) is served as a download rather than shown in a page. When the full storage is a Shopify store\u0026#x27;s team\u0026#x27;s, extra storage cannot be added through Shopify yet, so the message ends by saying so and what to do instead: delete files, or contact support. On a Solo plan it names the Teams plan (which holds more) and error.details.planPageUrl is the address of the plan page on Shopify. error.suggestedAction says the same in a few words, instead of the usual \u0026quot;upgrade your storage plan\u0026quot;. Any other team, and a person\u0026#x27;s own workspace, get the shorter message. To upload the file for one of your managed users, send managedUserId (Widgetic\u0026#x27;s id for the user) or managedUserExternalId (your own identifier for the user), not both. The file stays in your account and counts against its allowance; the tag lets you list one user\u0026#x27;s files with listUploads. The managed user must be yours and active: one that is not yours, or does not exist, is refused with 404 and MANAGED_USER_NOT_FOUND, and one that is switched off with 409 and MANAGED_USER_INACTIVE, before the file is stored. The tag is set here and does not change afterwards. Called with an editor session (createManagedUserEditorSession), the file is always filed for the session\u0026#x27;s own managed user and is always media for widget content: naming another managed user is refused with 403 and MANAGED_USER_SESSION_MISMATCH, and contextType, source, widgetId and conversationId are ignored. A full storage allowance is refused with the same 413 and QUOTA_STORAGE_EXCEEDED, but the message only says that it is not available right now (not how much is stored: that is the partner\u0026#x27;s business) and error.details.limit is storage. An account that administers a partner with a storage destination (setPartnerStorageDestination) has its files stored in the partner\u0026#x27;s own bucket instead. Such a file takes none of the allowance, its url is served from the partner\u0026#x27;s public address, and its storage_key is the key in the partner\u0026#x27;s bucket. The file is never stored with Widgetic instead: when the destination cannot be used the upload is refused with 503 and STORAGE_DESTINATION_UNAVAILABLE, and when the partner\u0026#x27;s storage rejects the file with 502 and STORAGE_DESTINATION_WRITE_FAILED. Partner storage is not optional, and it does not depend on how the file arrives. A partner\u0026#x27;s own uploads (with its API key, an SDK token, or from the Widgetic website, the resumable route and the media library alike) and the uploads of its customers\u0026#x27; editor sessions are kept in the partner\u0026#x27;s own storage or not at all, so a partner with no destination (or one that removed it after the session was made) has them refused with 409 and PARTNER_STORAGE_REQUIRED; they are never stored with Widgetic. An editor session\u0026#x27;s browser is only told that the feature is not available right now.\">\u003cmeta data-mint-head name=\"application-name\" content=\"Widgetic\">\u003cmeta data-mint-head name=\"generator\" content=\"Mintlify\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/widgetic/U_OgbihBw7xJOURr/_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/widgetic/U_OgbihBw7xJOURr/_generated/favicon/apple-touch-icon.png\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/widgetic/U_OgbihBw7xJOURr/_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/widgetic/U_OgbihBw7xJOURr/_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/widgetic/U_OgbihBw7xJOURr/_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/widgetic/U_OgbihBw7xJOURr/_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/widgetic/U_OgbihBw7xJOURr/_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/widgetic/U_OgbihBw7xJOURr/_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/widgetic/U_OgbihBw7xJOURr/_generated/favicon-dark/favicon.ico\" media=\"(prefers-color-scheme: dark)\">\u003cmeta data-mint-head property=\"og:title\" content=\"Upload a file - Widgetic\">\u003cmeta data-mint-head property=\"og:description\" content=\"Stores one file for the account and returns its public address. This is how a user\u0026#x27;s own images, video and PDFs reach a widget\u0026#x27;s content. Send a multipart/form-data request with the file in the field named file. The file counts against the storage of the workspace it is uploaded in, and a full workspace is refused with 413 and QUOTA_STORAGE_EXCEEDED. For a person signed in on widgetic.com that is the workspace they are currently working in: inside a team, the team\u0026#x27;s shared storage; inside their own workspace, their own allowance. An organization API key, and a Shopify store\u0026#x27;s session, always work in that team\u0026#x27;s shared storage. A personal API key or an SDK token always uses the account\u0026#x27;s own allowance. The two never add up and one never lends room to the other. A file over the size limit is refused with 413 and UPLOAD_TOO_LARGE, and a type that is not accepted with 415 and UPLOAD_UNSUPPORTED_TYPE; getUploadLimits lists the size limit and the accepted types. A file is judged by what is in it, not by the type it is sent as. A file that is not the type it claims (a web page sent as image/png) is refused with 415 and UPLOAD_UNSUPPORTED_TYPE, and a picture sent under the wrong picture type is stored under the type it really is, which mime_type in the answer says. An SVG is rewritten as it is stored: script, foreignObject, animation and references to other addresses are taken out, it must be UTF-8 and at most 2 MB, and the stored file can be larger or smaller than the one sent. Anything that is not an image, audio or video (a PDF, for example) is served as a download rather than shown in a page. When the full storage is a Shopify store\u0026#x27;s team\u0026#x27;s, extra storage cannot be added through Shopify yet, so the message ends by saying so and what to do instead: delete files, or contact support. On a Solo plan it names the Teams plan (which holds more) and error.details.planPageUrl is the address of the plan page on Shopify. error.suggestedAction says the same in a few words, instead of the usual \u0026quot;upgrade your storage plan\u0026quot;. Any other team, and a person\u0026#x27;s own workspace, get the shorter message. To upload the file for one of your managed users, send managedUserId (Widgetic\u0026#x27;s id for the user) or managedUserExternalId (your own identifier for the user), not both. The file stays in your account and counts against its allowance; the tag lets you list one user\u0026#x27;s files with listUploads. The managed user must be yours and active: one that is not yours, or does not exist, is refused with 404 and MANAGED_USER_NOT_FOUND, and one that is switched off with 409 and MANAGED_USER_INACTIVE, before the file is stored. The tag is set here and does not change afterwards. Called with an editor session (createManagedUserEditorSession), the file is always filed for the session\u0026#x27;s own managed user and is always media for widget content: naming another managed user is refused with 403 and MANAGED_USER_SESSION_MISMATCH, and contextType, source, widgetId and conversationId are ignored. A full storage allowance is refused with the same 413 and QUOTA_STORAGE_EXCEEDED, but the message only says that it is not available right now (not how much is stored: that is the partner\u0026#x27;s business) and error.details.limit is storage. An account that administers a partner with a storage destination (setPartnerStorageDestination) has its files stored in the partner\u0026#x27;s own bucket instead. Such a file takes none of the allowance, its url is served from the partner\u0026#x27;s public address, and its storage_key is the key in the partner\u0026#x27;s bucket. The file is never stored with Widgetic instead: when the destination cannot be used the upload is refused with 503 and STORAGE_DESTINATION_UNAVAILABLE, and when the partner\u0026#x27;s storage rejects the file with 502 and STORAGE_DESTINATION_WRITE_FAILED. Partner storage is not optional, and it does not depend on how the file arrives. A partner\u0026#x27;s own uploads (with its API key, an SDK token, or from the Widgetic website, the resumable route and the media library alike) and the uploads of its customers\u0026#x27; editor sessions are kept in the partner\u0026#x27;s own storage or not at all, so a partner with no destination (or one that removed it after the session was made) has them refused with 409 and PARTNER_STORAGE_REQUIRED; they are never stored with Widgetic. An editor session\u0026#x27;s browser is only told that the feature is not available right now.\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"Widgetic\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://widgetic.com/api-reference/uploads/upload-a-file\">\u003cmeta data-mint-head property=\"og:type\" content=\"website\">\u003cmeta data-mint-head property=\"og:image\" content=\"https://widgetic.mintlify.site/_mintlify/api/og/v2?division=Uploads\u0026amp;title=Upload+a+file\u0026amp;description=Stores+one+file+for+the+account+and+returns+its+public+address.+This+is+how+a+user%27s+own+images%2C%0Avideo+and+PDFs+reach+a+widget%27s+content.%0A%0ASend+a+%60multipart%2Ffor\u0026amp;theme=7fb55fb4aca22bb80111c88a\u0026amp;signature=d2b62e9e33ba8baba019bdd5fac0c11324206e5372946ecd5b08faa04b86b8f9\">\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=\"Upload a file - Widgetic\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"Stores one file for the account and returns its public address. This is how a user\u0026#x27;s own images, video and PDFs reach a widget\u0026#x27;s content. Send a multipart/form-data request with the file in the field named file. The file counts against the storage of the workspace it is uploaded in, and a full workspace is refused with 413 and QUOTA_STORAGE_EXCEEDED. For a person signed in on widgetic.com that is the workspace they are currently working in: inside a team, the team\u0026#x27;s shared storage; inside their own workspace, their own allowance. An organization API key, and a Shopify store\u0026#x27;s session, always work in that team\u0026#x27;s shared storage. A personal API key or an SDK token always uses the account\u0026#x27;s own allowance. The two never add up and one never lends room to the other. A file over the size limit is refused with 413 and UPLOAD_TOO_LARGE, and a type that is not accepted with 415 and UPLOAD_UNSUPPORTED_TYPE; getUploadLimits lists the size limit and the accepted types. A file is judged by what is in it, not by the type it is sent as. A file that is not the type it claims (a web page sent as image/png) is refused with 415 and UPLOAD_UNSUPPORTED_TYPE, and a picture sent under the wrong picture type is stored under the type it really is, which mime_type in the answer says. An SVG is rewritten as it is stored: script, foreignObject, animation and references to other addresses are taken out, it must be UTF-8 and at most 2 MB, and the stored file can be larger or smaller than the one sent. Anything that is not an image, audio or video (a PDF, for example) is served as a download rather than shown in a page. When the full storage is a Shopify store\u0026#x27;s team\u0026#x27;s, extra storage cannot be added through Shopify yet, so the message ends by saying so and what to do instead: delete files, or contact support. On a Solo plan it names the Teams plan (which holds more) and error.details.planPageUrl is the address of the plan page on Shopify. error.suggestedAction says the same in a few words, instead of the usual \u0026quot;upgrade your storage plan\u0026quot;. Any other team, and a person\u0026#x27;s own workspace, get the shorter message. To upload the file for one of your managed users, send managedUserId (Widgetic\u0026#x27;s id for the user) or managedUserExternalId (your own identifier for the user), not both. The file stays in your account and counts against its allowance; the tag lets you list one user\u0026#x27;s files with listUploads. The managed user must be yours and active: one that is not yours, or does not exist, is refused with 404 and MANAGED_USER_NOT_FOUND, and one that is switched off with 409 and MANAGED_USER_INACTIVE, before the file is stored. The tag is set here and does not change afterwards. Called with an editor session (createManagedUserEditorSession), the file is always filed for the session\u0026#x27;s own managed user and is always media for widget content: naming another managed user is refused with 403 and MANAGED_USER_SESSION_MISMATCH, and contextType, source, widgetId and conversationId are ignored. A full storage allowance is refused with the same 413 and QUOTA_STORAGE_EXCEEDED, but the message only says that it is not available right now (not how much is stored: that is the partner\u0026#x27;s business) and error.details.limit is storage. An account that administers a partner with a storage destination (setPartnerStorageDestination) has its files stored in the partner\u0026#x27;s own bucket instead. Such a file takes none of the allowance, its url is served from the partner\u0026#x27;s public address, and its storage_key is the key in the partner\u0026#x27;s bucket. The file is never stored with Widgetic instead: when the destination cannot be used the upload is refused with 503 and STORAGE_DESTINATION_UNAVAILABLE, and when the partner\u0026#x27;s storage rejects the file with 502 and STORAGE_DESTINATION_WRITE_FAILED. Partner storage is not optional, and it does not depend on how the file arrives. A partner\u0026#x27;s own uploads (with its API key, an SDK token, or from the Widgetic website, the resumable route and the media library alike) and the uploads of its customers\u0026#x27; editor sessions are kept in the partner\u0026#x27;s own storage or not at all, so a partner with no destination (or one that removed it after the session was made) has them refused with 409 and PARTNER_STORAGE_REQUIRED; they are never stored with Widgetic. An editor session\u0026#x27;s browser is only told that the feature is not available right now.\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://widgetic.mintlify.site/_mintlify/api/og/v2?division=Uploads\u0026amp;title=Upload+a+file\u0026amp;description=Stores+one+file+for+the+account+and+returns+its+public+address.+This+is+how+a+user%27s+own+images%2C%0Avideo+and+PDFs+reach+a+widget%27s+content.%0A%0ASend+a+%60multipart%2Ffor\u0026amp;theme=7fb55fb4aca22bb80111c88a\u0026amp;signature=d2b62e9e33ba8baba019bdd5fac0c11324206e5372946ecd5b08faa04b86b8f9\">\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/widgetic/U_OgbihBw7xJOURr/_generated/favicon/browserconfig.xml\">\u003cmeta data-mint-head name=\"apple-mobile-web-app-title\" content=\"Widgetic\">\u003cmeta data-mint-head name=\"msapplication-TileColor\" content=\"#324E30\">\u003clink data-mint-head rel=\"canonical\" href=\"https://widgetic.com/api-reference/uploads/upload-a-file\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/api-reference/uploads/upload-a-file.md\">\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"Organization\",\"@id\":\"https://widgetic.com/#organization\",\"name\":\"Widgetic\",\"url\":\"https://widgetic.com\",\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https://mintcdn.com/widgetic/Od-pD6ChvIzhY_fR/brand/logo-light.svg?fit=max\u0026auto=format\u0026n=Od-pD6ChvIzhY_fR\u0026q=85\u0026s=c80ce649cc12d9f206a4ea5d3d2d9d31\"}},{\"@type\":\"WebSite\",\"@id\":\"https://widgetic.com#website\",\"name\":\"Widgetic\",\"url\":\"https://widgetic.com\",\"publisher\":{\"@id\":\"https://widgetic.com/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https://widgetic.com/api-reference/uploads/upload-a-file#webpage\",\"url\":\"https://widgetic.com/api-reference/uploads/upload-a-file\",\"name\":\"Upload a file\",\"description\":\"Stores one file for the account and returns its public address. This is how a user's own images, video and PDFs reach a widget's content. Send a multipart/form-data request with the file in the field named file. The file counts against the storage of the workspace it is uploaded in, and a full workspace is refused with 413 and QUOTA_STORAGE_EXCEEDED. For a person signed in on widgetic.com that is the workspace they are currently working in: inside a team, the team's shared storage; inside their own workspace, their own allowance. An organization API key, and a Shopify store's session, always work in that team's shared storage. A personal API key or an SDK token always uses the account's own allowance. The two never add up and one never lends room to the other. A file over the size limit is refused with 413 and UPLOAD_TOO_LARGE, and a type that is not accepted with 415 and UPLOAD_UNSUPPORTED_TYPE; getUploadLimits lists the size limit and the accepted types. A file is judged by what is in it, not by the type it is sent as. A file that is not the type it claims (a web page sent as image/png) is refused with 415 and UPLOAD_UNSUPPORTED_TYPE, and a picture sent under the wrong picture type is stored under the type it really is, which mime_type in the answer says. An SVG is rewritten as it is stored: script, foreignObject, animation and references to other addresses are taken out, it must be UTF-8 and at most 2 MB, and the stored file can be larger or smaller than the one sent. Anything that is not an image, audio or video (a PDF, for example) is served as a download rather than shown in a page. When the full storage is a Shopify store's team's, extra storage cannot be added through Shopify yet, so the message ends by saying so and what to do instead: delete files, or contact support. On a Solo plan it names the Teams plan (which holds more) and error.details.planPageUrl is the address of the plan page on Shopify. error.suggestedAction says the same in a few words, instead of the usual \\\"upgrade your storage plan\\\". Any other team, and a person's own workspace, get the shorter message. To upload the file for one of your managed users, send managedUserId (Widgetic's id for the user) or managedUserExternalId (your own identifier for the user), not both. The file stays in your account and counts against its allowance; the tag lets you list one user's files with listUploads. The managed user must be yours and active: one that is not yours, or does not exist, is refused with 404 and MANAGED_USER_NOT_FOUND, and one that is switched off with 409 and MANAGED_USER_INACTIVE, before the file is stored. The tag is set here and does not change afterwards. Called with an editor session (createManagedUserEditorSession), the file is always filed for the session's own managed user and is always media for widget content: naming another managed user is refused with 403 and MANAGED_USER_SESSION_MISMATCH, and contextType, source, widgetId and conversationId are ignored. A full storage allowance is refused with the same 413 and QUOTA_STORAGE_EXCEEDED, but the message only says that it is not available right now (not how much is stored: that is the partner's business) and error.details.limit is storage. An account that administers a partner with a storage destination (setPartnerStorageDestination) has its files stored in the partner's own bucket instead. Such a file takes none of the allowance, its url is served from the partner's public address, and its storage_key is the key in the partner's bucket. The file is never stored with Widgetic instead: when the destination cannot be used the upload is refused with 503 and STORAGE_DESTINATION_UNAVAILABLE, and when the partner's storage rejects the file with 502 and STORAGE_DESTINATION_WRITE_FAILED. Partner storage is not optional, and it does not depend on how the file arrives. A partner's own uploads (with its API key, an SDK token, or from the Widgetic website, the resumable route and the media library alike) and the uploads of its customers' editor sessions are kept in the partner's own storage or not at all, so a partner with no destination (or one that removed it after the session was made) has them refused with 409 and PARTNER_STORAGE_REQUIRED; they are never stored with Widgetic. An editor session's browser is only told that the feature is not available right now.\",\"dateModified\":\"2026-11-08T14:06:36.360Z\",\"isPartOf\":{\"@id\":\"https://widgetic.com#website\"},\"breadcrumb\":{\"@id\":\"https://widgetic.com/api-reference/uploads/upload-a-file#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://widgetic.com/api-reference/uploads/upload-a-file#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Uploads\",\"item\":\"https://widgetic.com/api-reference/uploads/list-the-accounts-uploads\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Upload a file\",\"item\":\"https://widgetic.com/api-reference/uploads/upload-a-file\"}]},{\"@type\":[\"TechArticle\",\"APIReference\"],\"@id\":\"https://widgetic.com/api-reference/uploads/upload-a-file#apireference\",\"headline\":\"Upload a file\",\"name\":\"Upload a file\",\"description\":\"Stores one file for the account and returns its public address. This is how a user's own images, video and PDFs reach a widget's content. Send a multipart/form-data request with the file in the field named file. The file counts against the storage of the workspace it is uploaded in, and a full workspace is refused with 413 and QUOTA_STORAGE_EXCEEDED. For a person signed in on widgetic.com that is the workspace they are currently working in: inside a team, the team's shared storage; inside their own workspace, their own allowance. An organization API key, and a Shopify store's session, always work in that team's shared storage. A personal API key or an SDK token always uses the account's own allowance. The two never add up and one never lends room to the other. A file over the size limit is refused with 413 and UPLOAD_TOO_LARGE, and a type that is not accepted with 415 and UPLOAD_UNSUPPORTED_TYPE; getUploadLimits lists the size limit and the accepted types. A file is judged by what is in it, not by the type it is sent as. A file that is not the type it claims (a web page sent as image/png) is refused with 415 and UPLOAD_UNSUPPORTED_TYPE, and a picture sent under the wrong picture type is stored under the type it really is, which mime_type in the answer says. An SVG is rewritten as it is stored: script, foreignObject, animation and references to other addresses are taken out, it must be UTF-8 and at most 2 MB, and the stored file can be larger or smaller than the one sent. Anything that is not an image, audio or video (a PDF, for example) is served as a download rather than shown in a page. When the full storage is a Shopify store's team's, extra storage cannot be added through Shopify yet, so the message ends by saying so and what to do instead: delete files, or contact support. On a Solo plan it names the Teams plan (which holds more) and error.details.planPageUrl is the address of the plan page on Shopify. error.suggestedAction says the same in a few words, instead of the usual \\\"upgrade your storage plan\\\". Any other team, and a person's own workspace, get the shorter message. To upload the file for one of your managed users, send managedUserId (Widgetic's id for the user) or managedUserExternalId (your own identifier for the user), not both. The file stays in your account and counts against its allowance; the tag lets you list one user's files with listUploads. The managed user must be yours and active: one that is not yours, or does not exist, is refused with 404 and MANAGED_USER_NOT_FOUND, and one that is switched off with 409 and MANAGED_USER_INACTIVE, before the file is stored. The tag is set here and does not change afterwards. Called with an editor session (createManagedUserEditorSession), the file is always filed for the session's own managed user and is always media for widget content: naming another managed user is refused with 403 and MANAGED_USER_SESSION_MISMATCH, and contextType, source, widgetId and conversationId are ignored. A full storage allowance is refused with the same 413 and QUOTA_STORAGE_EXCEEDED, but the message only says that it is not available right now (not how much is stored: that is the partner's business) and error.details.limit is storage. An account that administers a partner with a storage destination (setPartnerStorageDestination) has its files stored in the partner's own bucket instead. Such a file takes none of the allowance, its url is served from the partner's public address, and its storage_key is the key in the partner's bucket. The file is never stored with Widgetic instead: when the destination cannot be used the upload is refused with 503 and STORAGE_DESTINATION_UNAVAILABLE, and when the partner's storage rejects the file with 502 and STORAGE_DESTINATION_WRITE_FAILED. Partner storage is not optional, and it does not depend on how the file arrives. A partner's own uploads (with its API key, an SDK token, or from the Widgetic website, the resumable route and the media library alike) and the uploads of its customers' editor sessions are kept in the partner's own storage or not at all, so a partner with no destination (or one that removed it after the session was made) has them refused with 409 and PARTNER_STORAGE_REQUIRED; they are never stored with Widgetic. An editor session's browser is only told that the feature is not available right now.\",\"url\":\"https://widgetic.com/api-reference/uploads/upload-a-file\",\"mainEntityOfPage\":{\"@id\":\"https://widgetic.com/api-reference/uploads/upload-a-file#webpage\"},\"dateModified\":\"2026-11-08T14:06:36.360Z\",\"publisher\":{\"@id\":\"https://widgetic.com/#organization\"},\"isPartOf\":{\"@id\":\"https://widgetic.com#website\"}}]}\u003c/script>\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@type\":\"WebSite\",\"name\":\"Widgetic\",\"publisher\":{\"@type\":\"Organization\",\"name\":\"Widgetic\"},\"provider\":{\"@type\":\"Organization\",\"name\":\"Mintlify\",\"url\":\"https://mintlify.com\"}}\u003c/script>","agentPointerHref":"/api-reference/uploads/upload-a-file.md","siteName":"Widgetic","nav":{"global":null,"tabs":[{"tab":"Documentation","pages":[{"title":"Documentation","href":"/docs/introduction"}]},{"tab":"API Reference","groups":[{"group":"API Reference","pages":[{"title":"API Reference Introduction","href":"/api-reference/introduction"},{"title":"Pagination","href":"/api-reference/pagination"},{"title":"Usage Limits","href":"/api-reference/usage-limits"},{"title":"Errors","href":"/api-reference/errors"}]},{"group":"Public Embed","pages":[{"title":"Append a visitor entry through the gateway","deprecated":null,"version":null,"openapi":"/openapi/widgetic-api-public.json post /embed/compositions/{compositionId}/entries/{table}","href":"/api-reference/public-embed/append-a-visitor-entry-through-the-gateway"},{"title":"Read the published Workflow of an embed","deprecated":null,"version":null,"openapi":"/openapi/widgetic-api-public.json get /embed/workflows/{workflowId}","href":"/api-reference/public-embed/read-the-published-workflow-of-an-embed"},{"title":"Read one published version of a Workflow","deprecated":null,"version":null,"openapi":"/openapi/widgetic-api-public.json get /embed/workflows/{workflowId}/versions/{versionId}","href":"/api-reference/public-embed/read-one-published-version-of-a-workflow"},{"title":"Report what visitors did in a Workflow, as counts","deprecated":null,"version":null,"openapi":"/openapi/widgetic-api-public.json post /embed/workflows/{workflowId}/events","href":"/api-reference/public-embed/report-what-visitors-did-in-a-workflow-as-counts"},{"title":"Show a published Workflow in a page of its own","deprecated":null,"version":null,"openapi":"/openapi/widgetic-api-public.json get /embed/workflows/{workflowId}/frame","href":"/api-reference/public-embed/show-a-published-workflow-in-a-page-of-its-own"},{"title":"Resolve a composition UUID to a published widget URL","deprecated":null,"version":null,"openapi":"/openapi/widgetic-api-public.json get /embed/compositions/{compositionId}","href":"/api-reference/public-embed/resolve-a-composition-uuid-to-a-published-widget-url"},{"title":"Embed a published composition with its saved values","deprecated":null,"version":null,"openapi":"/openapi/widgetic-api-public.json get /embed/compositions/{compositionId}/frame","href":"/api-reference/public-embed/embed-a-published-composition-with-its-saved-values"},{"title":"Batch-check whether compositions are currently served for embed","deprecated":null,"version":null,"openapi":"/openapi/widgetic-api-public.json post /embed/compositions/status","href":"/api-reference/public-embed/batch-check-whether-compositions-are-currently-served-for-embed"},{"title":"Call a gateway operation of an adapter a published widget uses","deprecated":null,"version":null,"openapi":"/openapi/widgetic-api-public.json post /embed/compositions/{compositionId}/adapters/{adapterId}/{operation}","href":"/api-reference/public-embed/call-a-gateway-operation-of-an-adapter-a-published-widget-uses"},{"title":"Send the file a visitor chose through the upload adapter of a published widget","deprecated":null,"version":null,"openapi":"/openapi/widgetic-api-public.json put /embed/compositions/{compositionId}/adapters/upload/files/{ticket}","href":"/api-reference/public-embed/send-the-file-a-visitor-chose-through-the-upload-adapter-of-a-published-widget"}]},{"group":"Workflows","pages":[{"title":"List the compositions a workflow can show, and what each can do","deprecated":null,"version":null,"openapi":"/openapi/widgetic-api-public.json get /workspaces/{workspaceId}/workflows/composition-options","href":"/api-reference/workflows/list-the-compositions-a-workflow-can-show-and-what-each-can-do"},{"title":"List the starting points for a new Workflow","deprecated":null,"version":null,"openapi":"/openapi/widgetic-api-public.json get /workspaces/{workspaceId}/workflows/presets","href":"/api-reference/workflows/list-the-starting-points-for-a-new-workflow"},{"title":"Start a Workflow from a starting point","deprecated":null,"version":null,"openapi":"/openapi/widgetic-api-public.json post /workspaces/{workspaceId}/workflows/from-preset","href":"/api-reference/workflows/start-a-workflow-from-a-starting-point"},{"title":"List the Workflows of a Workspace","deprecated":null,"version":null,"openapi":"/openapi/widgetic-api-public.json get /workspaces/{workspaceId}/workflows","href":"/api-reference/workflows/list-the-workflows-of-a-workspace"},{"title":"Create a Workflow","deprecated":null,"version":null,"openapi":"/openapi/widgetic-api-public.json post /workspaces/{workspaceId}/workflows","href":"/api-reference/workflows/create-a-workflow"},{"title":"Get a Workflow","deprecated":null,"version":null,"openapi":"/openapi/widgetic-api-public.json get /workspaces/{workspaceId}/workflows/{workflowId}","href":"/api-reference/workflows/get-a-workflow"},{"title":"Save the Draft of a Workflow","deprecated":null,"version":null,"openapi":"/openapi/widgetic-api-public.json put /workspaces/{workspaceId}/workflows/{workflowId}","href":"/api-reference/workflows/save-the-draft-of-a-workflow"},{"title":"Delete a Workflow","deprecated":null,"version":null,"openapi":"/openapi/widgetic-api-public.json delete /workspaces/{workspaceId}/workflows/{workflowId}","href":"/api-reference/workflows/delete-a-workflow"},{"title":"Duplicate a Workflow","deprecated":null,"version":null,"openapi":"/openapi/widgetic-api-public.json post /workspaces/{workspaceId}/workflows/{workflowId}/duplicate","href":"/api-reference/workflows/duplicate-a-workflow"},{"title":"Publish the Draft of a Workflow","deprecated":null,"version":null,"openapi":"/openapi/widgetic-api-public.json post /workspaces/{workspaceId}/workflows/{workflowId}/publish","href":"/api-reference/workflows/publish-the-draft-of-a-workflow"},{"title":"Discard the Unpublished Changes of a Workflow","deprecated":null,"version":null,"openapi":"/openapi/widgetic-api-public.json post /workspaces/{workspaceId}/workflows/{workflowId}/discard","href":"/api-reference/workflows/discard-the-unpublished-changes-of-a-workflow"},{"title":"List the Published Versions of a Workflow","deprecated":null,"version":null,"openapi":"/openapi/widgetic-api-public.json get /workspaces/{workspaceId}/workflows/{workflowId}/versions","href":"/api-reference/workflows/list-the-published-versions-of-a-workflow"},{"title":"Get a Published Version of a Workflow","deprecated":null,"version":null,"openapi":"/openapi/widgetic-api-public.json get /workspaces/{workspaceId}/workflows/{workflowId}/versions/{versionId}","href":"/api-reference/workflows/get-a-published-version-of-a-workflow"},{"title":"Restore a Version of a Workflow into the Draft","deprecated":null,"version":null,"openapi":"/openapi/widgetic-api-public.json post /workspaces/{workspaceId}/workflows/{workflowId}/versions/{versionId}/restore","href":"/api-reference/workflows/restore-a-version-of-a-workflow-into-the-draft"},{"title":"Pause a Workflow","deprecated":null,"version":null,"openapi":"/openapi/widgetic-api-public.json post /workspaces/{workspaceId}/workflows/{workflowId}/pause","href":"/api-reference/workflows/pause-a-workflow"},{"title":"Resume a Paused Workflow","deprecated":null,"version":null,"openapi":"/openapi/widgetic-api-public.json post /workspaces/{workspaceId}/workflows/{workflowId}/resume","href":"/api-reference/workflows/resume-a-paused-workflow"},{"title":"Archive a Workflow","deprecated":null,"version":null,"openapi":"/openapi/widgetic-api-public.json post /workspaces/{workspaceId}/workflows/{workflowId}/archive","href":"/api-reference/workflows/archive-a-workflow"},{"title":"Unarchive a Workflow","deprecated":null,"version":null,"openapi":"/openapi/widgetic-api-public.json post /workspaces/{workspaceId}/workflows/{workflowId}/unarchive","href":"/api-reference/workflows/unarchive-a-workflow"},{"title":"Get what Visitors Did in a Workflow","deprecated":null,"version":null,"openapi":"/openapi/widgetic-api-public.json get /workspaces/{workspaceId}/workflows/{workflowId}/stats","href":"/api-reference/workflows/get-what-visitors-did-in-a-workflow"}]},{"group":"Partners","pages":[{"title":"List the workflows a partner offers as places to start","deprecated":null,"version":null,"openapi":"/openapi/widgetic-api-public.json get /partners/{partnerId}/workflow-presets","href":"/api-reference/partners/list-the-workflows-a-partner-offers-as-places-to-start"},{"title":"Offer a workflow as a place to start, or replace what a key offers","deprecated":null,"version":null,"openapi":"/openapi/widgetic-api-public.json put /partners/{partnerId}/workflow-presets/{key}","href":"/api-reference/partners/offer-a-workflow-as-a-place-to-start-or-replace-what-a-key-offers"},{"title":"Stop offering a workflow as a place to start","deprecated":null,"version":null,"openapi":"/openapi/widgetic-api-public.json delete /partners/{partnerId}/workflow-presets/{key}","href":"/api-reference/partners/stop-offering-a-workflow-as-a-place-to-start"},{"title":"Find the partner you administer","deprecated":null,"version":null,"openapi":"/openapi/widgetic-api-public.json get /partners/mine","href":"/api-reference/partners/find-the-partner-you-administer"},{"title":"Get partner credit balance","deprecated":null,"version":null,"openapi":"/openapi/widgetic-api-public.json get /partners/{partnerId}/credits/balance","href":"/api-reference/partners/get-partner-credit-balance"},{"title":"Get partner credit transaction history","deprecated":null,"version":null,"openapi":"/openapi/widgetic-api-public.json get /partners/{partnerId}/credits/transactions","href":"/api-reference/partners/get-partner-credit-transaction-history"},{"title":"Buy extra credits for a partner","deprecated":null,"version":null,"openapi":"/openapi/widgetic-api-public.json post /partners/{partnerId}/credits/extra-invoice","href":"/api-reference/partners/buy-extra-credits-for-a-partner"},{"title":"Get comprehensive partner billing overview","deprecated":null,"version":null,"openapi":"/openapi/widgetic-api-public.json get /partners/{partnerId}/billing-overview","href":"/api-reference/partners/get-comprehensive-partner-billing-overview"},{"title":"Get a partner's contract","deprecated":null,"version":null,"openapi":"/openapi/widgetic-api-public.json get /partners/{partnerId}/contract","href":"/api-reference/partners/get-a-partners-contract"},{"title":"Get where a partner's uploaded files are stored","deprecated":null,"version":null,"openapi":"/openapi/widgetic-api-public.json get /partners/{partnerId}/storage","href":"/api-reference/partners/get-where-a-partners-uploaded-files-are-stored"},{"title":"Set where a partner's uploaded files are stored","deprecated":null,"version":null,"openapi":"/openapi/widgetic-api-public.json put /partners/{partnerId}/storage","href":"/api-reference/partners/set-where-a-partners-uploaded-files-are-stored"},{"title":"Stop storing a partner's uploaded files in its own bucket","deprecated":null,"version":null,"openapi":"/openapi/widgetic-api-public.json delete /partners/{partnerId}/storage","href":"/api-reference/partners/stop-storing-a-partners-uploaded-files-in-its-own-bucket"},{"title":"Check that a partner's storage destination still works","deprecated":null,"version":null,"openapi":"/openapi/widgetic-api-public.json post /partners/{partnerId}/storage/verify","href":"/api-reference/partners/check-that-a-partners-storage-destination-still-works"},{"title":"List the widgets a partner offers as presets","deprecated":null,"version":null,"openapi":"/openapi/widgetic-api-public.json get /partners/{partnerId}/presets","href":"/api-reference/partners/list-the-widgets-a-partner-offers-as-presets"},{"title":"Make a widget a preset, or replace a preset","deprecated":null,"version":null,"openapi":"/openapi/widgetic-api-public.json put /partners/{partnerId}/presets/{key}","href":"/api-reference/partners/make-a-widget-a-preset-or-replace-a-preset"},{"title":"Take a widget off the partner's presets","deprecated":null,"version":null,"openapi":"/openapi/widgetic-api-public.json delete /partners/{partnerId}/presets/{key}","href":"/api-reference/partners/take-a-widget-off-the-partners-presets"},{"title":"Read partner-wide design defaults","deprecated":null,"version":null,"openapi":"/openapi/widgetic-api-public.json get /partners/{partnerId}/design-defaults","href":"/api-reference/partners/read-partner-wide-design-defaults"},{"title":"Set or clear partner-wide design defaults","deprecated":null,"version":null,"openapi":"/openapi/widgetic-api-public.json put /partners/{partnerId}/design-defaults","href":"/api-reference/partners/set-or-clear-partner-wide-design-defaults"},{"title":"What a partner's customers store","deprecated":null,"version":null,"openapi":"/openapi/widgetic-api-public.json get /partners/{partnerId}/storage/usage","href":"/api-reference/partners/what-a-partners-customers-store"},{"title":"What was done with a partner's published widgets","deprecated":null,"version":null,"openapi":"/openapi/widgetic-api-public.json get /partners/{partnerId}/analytics/summary","href":"/api-reference/partners/what-was-done-with-a-partners-published-widgets"},{"title":"What each managed user's widgets did","deprecated":null,"version":null,"openapi":"/openapi/widgetic-api-public.json get /partners/{partnerId}/analytics/managed-users","href":"/api-reference/partners/what-each-managed-users-widgets-did"},{"title":"Which widgets were viewed the most","deprecated":null,"version":null,"openapi":"/openapi/widgetic-api-public.json get /partners/{partnerId}/analytics/top-widgets","href":"/api-reference/partners/which-widgets-were-viewed-the-most"},{"title":"What was done with a partner's widgets, day by day","deprecated":null,"version":null,"openapi":"/openapi/widgetic-api-public.json get /partners/{partnerId}/analytics/timeline","href":"/api-reference/partners/what-was-done-with-a-partners-widgets-day-by-day"},{"title":"What your partner account was told","deprecated":null,"version":null,"openapi":"/openapi/widgetic-api-public.json get /partners/{partnerId}/notifications","href":"/api-reference/partners/what-your-partner-account-was-told"},{"title":"How your notifications reached you","deprecated":null,"version":null,"openapi":"/openapi/widgetic-api-public.json get /partners/{partnerId}/notifications/deliveries","href":"/api-reference/partners/how-your-notifications-reached-you"},{"title":"Where your notifications go","deprecated":null,"version":null,"openapi":"/openapi/widgetic-api-public.json get /partners/{partnerId}/notifications/settings","href":"/api-reference/partners/where-your-notifications-go"},{"title":"Choose where your notifications go","deprecated":null,"version":null,"openapi":"/openapi/widgetic-api-public.json put /partners/{partnerId}/notifications/settings","href":"/api-reference/partners/choose-where-your-notifications-go"},{"title":"Make a new secret for your webhook","deprecated":null,"version":null,"openapi":"/openapi/widgetic-api-public.json post /partners/{partnerId}/notifications/webhook-secret","href":"/api-reference/partners/make-a-new-secret-for-your-webhook"},{"title":"Send a webhook delivery again","deprecated":null,"version":null,"openapi":"/openapi/widgetic-api-public.json post /partners/{partnerId}/notifications/deliveries/{deliveryId}/replay","href":"/api-reference/partners/send-a-webhook-delivery-again"},{"title":"Send a test event to your webhook","deprecated":null,"version":null,"openapi":"/openapi/widgetic-api-public.json post /partners/{partnerId}/notifications/test-event","href":"/api-reference/partners/send-a-test-event-to-your-webhook"},{"title":"See how the context of your embeds is signed","deprecated":null,"version":null,"openapi":"/openapi/widgetic-api-public.json get /partners/{partnerId}/entry-context-signing","href":"/api-reference/partners/see-how-the-context-of-your-embeds-is-signed"},{"title":"Require a signed context, or stop requiring it","deprecated":null,"version":null,"openapi":"/openapi/widgetic-api-public.json put /partners/{partnerId}/entry-context-signing","href":"/api-reference/partners/require-a-signed-context-or-stop-requiring-it"},{"title":"Make a secret to sign the context of your embeds","deprecated":null,"version":null,"openapi":"/openapi/widgetic-api-public.json post /partners/{partnerId}/entry-context-signing/secret","href":"/api-reference/partners/make-a-secret-to-sign-the-context-of-your-embeds"},{"title":"See the Neon database a partner keeps the data of its compositions in","deprecated":null,"version":null,"openapi":"/openapi/widgetic-api-public.json get /partners/{partnerId}/data-database","href":"/api-reference/partners/see-the-neon-database-a-partner-keeps-the-data-of-its-compositions-in"},{"title":"Keep the data of a partner's compositions in a Neon database of its own","deprecated":null,"version":null,"openapi":"/openapi/widgetic-api-public.json put /partners/{partnerId}/data-database","href":"/api-reference/partners/keep-the-data-of-a-partners-compositions-in-a-neon-database-of-its-own"},{"title":"Stop keeping the data of a partner's compositions in its own database","deprecated":null,"version":null,"openapi":"/openapi/widgetic-api-public.json delete /partners/{partnerId}/data-database","href":"/api-reference/partners/stop-keeping-the-data-of-a-partners-compositions-in-its-own-database"},{"title":"Check that a partner's own database still works","deprecated":null,"version":null,"openapi":"/openapi/widgetic-api-public.json post /partners/{partnerId}/data-database/verify","href":"/api-reference/partners/check-that-a-partners-own-database-still-works"},{"title":"See which adapter keys a partner has connected","deprecated":null,"version":null,"openapi":"/openapi/widgetic-api-public.json get /partners/{partnerId}/adapter-connections","href":"/api-reference/partners/see-which-adapter-keys-a-partner-has-connected"},{"title":"Connect an adapter key to a partner","deprecated":null,"version":null,"openapi":"/openapi/widgetic-api-public.json put /partners/{partnerId}/adapter-connections/{adapterId}/{credentialKey}","href":"/api-reference/partners/connect-an-adapter-key-to-a-partner"},{"title":"Remove an adapter key from a partner","deprecated":null,"version":null,"openapi":"/openapi/widgetic-api-public.json delete /partners/{partnerId}/adapter-connections/{adapterId}/{credentialKey}","href":"/api-reference/partners/remove-an-adapter-key-from-a-partner"},{"title":"Confirm a partner's adapter address with the code that was emailed to it","deprecated":null,"version":null,"openapi":"/openapi/widgetic-api-public.json post /partners/{partnerId}/adapter-connections/{adapterId}/{credentialKey}/confirm","href":"/api-reference/partners/confirm-a-partners-adapter-address-with-the-code-that-was-emailed-to-it"}]},{"group":"Widgets","pages":[{"title":"List Widgets","deprecated":null,"version":null,"openapi":"/openapi/widgetic-api-public.json get /widgets","href":"/api-reference/widgets/list-widgets"},{"title":"Create Widget","deprecated":null,"version":null,"openapi":"/openapi/widgetic-api-public.json post /widgets","href":"/api-reference/widgets/create-widget"},{"title":"Create a composition for a widget in one call","deprecated":null,"version":null,"openapi":"/openapi/widgetic-api-public.json post /widgets/{id}/composition","href":"/api-reference/widgets/create-a-composition-for-a-widget-in-one-call"},{"title":"Get Widgets Batch","deprecated":null,"version":null,"openapi":"/openapi/widgetic-api-public.json post /widgets/batch","href":"/api-reference/widgets/get-widgets-batch"}]},{"group":"Users","pages":[{"title":"List the websites allowed to show your widgets","deprecated":null,"version":null,"openapi":"/openapi/widgetic-api-public.json get /users/{id}/workspace/domains","href":"/api-reference/users/list-the-websites-allowed-to-show-your-widgets"},{"title":"Allow a website to show your widgets","deprecated":null,"version":null,"openapi":"/openapi/widgetic-api-public.json post /users/{id}/workspace/domains","href":"/api-reference/users/allow-a-website-to-show-your-widgets"},{"title":"Change a website on your list","deprecated":null,"version":null,"openapi":"/openapi/widgetic-api-public.json put /users/{id}/workspace/domains/{domainId}","href":"/api-reference/users/change-a-website-on-your-list"},{"title":"Stop allowing a website to show your widgets","deprecated":null,"version":null,"openapi":"/openapi/widgetic-api-public.json delete /users/{id}/workspace/domains/{domainId}","href":"/api-reference/users/stop-allowing-a-website-to-show-your-widgets"},{"title":"List the API keys of an account","deprecated":null,"version":null,"openapi":"/openapi/widgetic-api-public.json get /users/{id}/keys","href":"/api-reference/users/list-the-api-keys-of-an-account"},{"title":"Create an API key","deprecated":null,"version":null,"openapi":"/openapi/widgetic-api-public.json post /users/{id}/keys","href":"/api-reference/users/create-an-api-key"},{"title":"Rename an API key, or switch it off or on","deprecated":null,"version":null,"openapi":"/openapi/widgetic-api-public.json put /users/{id}/keys/{keyId}","href":"/api-reference/users/rename-an-api-key-or-switch-it-off-or-on"},{"title":"Delete an API key","deprecated":null,"version":null,"openapi":"/openapi/widgetic-api-public.json delete /users/{id}/keys/{keyId}","href":"/api-reference/users/delete-an-api-key"},{"title":"Read what an API key was used for","deprecated":null,"version":null,"openapi":"/openapi/widgetic-api-public.json get /users/{id}/api-keys/{keyId}/logs","href":"/api-reference/users/read-what-an-api-key-was-used-for"},{"title":"See which adapter keys an account has connected","deprecated":null,"version":null,"openapi":"/openapi/widgetic-api-public.json get /users/{userId}/adapter-connections","href":"/api-reference/users/see-which-adapter-keys-an-account-has-connected"},{"title":"Connect an adapter key to an account","deprecated":null,"version":null,"openapi":"/openapi/widgetic-api-public.json put /users/{userId}/adapter-connections/{adapterId}/{credentialKey}","href":"/api-reference/users/connect-an-adapter-key-to-an-account"},{"title":"Remove an adapter key from an account","deprecated":null,"version":null,"openapi":"/openapi/widgetic-api-public.json delete /users/{userId}/adapter-connections/{adapterId}/{credentialKey}","href":"/api-reference/users/remove-an-adapter-key-from-an-account"},{"title":"Confirm an adapter address with the code that was emailed to it","deprecated":null,"version":null,"openapi":"/openapi/widgetic-api-public.json post /users/{userId}/adapter-connections/{adapterId}/{credentialKey}/confirm","href":"/api-reference/users/confirm-an-adapter-address-with-the-code-that-was-emailed-to-it"}]},{"group":"Uploads","pages":[{"title":"List the account's uploads","description":"The files the account has uploaded, newest first. Deleted files are not listed. Returns at most `limit` files and has no further pages: a client that needs more narrows the list instead, for example to one managed user's files with `managedUserId` or `managedUserExternalId`. The files that visitors sent through a widget's upload adapter (`source` is `widget-visitor-upload`) are not part of this list, so that a popular widget does not push the account's own files out of it; naming one widget with `widgetId` lists what visitors sent to that widget as well.\n","deprecated":null,"version":null,"openapi":"/openapi/widgetic-api-public.json get /uploads","href":"/api-reference/uploads/list-the-accounts-uploads"},{"title":"Upload a file","deprecated":null,"version":null,"openapi":"/openapi/widgetic-api-public.json post /uploads","href":"/api-reference/uploads/upload-a-file"},{"title":"Upload size limits and accepted file types","description":"The size limit and the accepted file types of the upload endpoints. Read them from here rather than hard-coding thresholds: they are configuration and can change. The limits are the same for every account, whatever its plan: `multipart_max_bytes` for a file sent in one request (10 MB) and `tus_max_bytes` for a resumable upload (250 MB).\n","deprecated":null,"version":null,"openapi":"/openapi/widgetic-api-public.json get /uploads/limits","href":"/api-reference/uploads/upload-size-limits-and-accepted-file-types"},{"title":"Get an upload by id","deprecated":null,"version":null,"openapi":"/openapi/widgetic-api-public.json get /uploads/{id}","href":"/api-reference/uploads/get-an-upload-by-id"},{"title":"Delete an upload","deprecated":null,"version":null,"openapi":"/openapi/widgetic-api-public.json delete /uploads/{id}","href":"/api-reference/uploads/delete-an-upload"}]},{"group":"Tokens","pages":[{"title":"Validate current authentication token","deprecated":null,"version":null,"openapi":"/openapi/widgetic-api-public.json get /tokens/validate","href":"/api-reference/tokens/validate-current-authentication-token"}]},{"group":"Operations","pages":[{"title":"Get operation status","deprecated":null,"version":null,"openapi":"/openapi/widgetic-api-public.json get /operations/{id}","href":"/api-reference/operations/get-operation-status"}]},{"group":"Managed Users","pages":[{"title":"Get Managed Users","deprecated":null,"version":null,"openapi":"/openapi/widgetic-api-public.json get /managed-users","href":"/api-reference/managed-users/get-managed-users"},{"title":"Create Managed User","deprecated":null,"version":null,"openapi":"/openapi/widgetic-api-public.json post /managed-users","href":"/api-reference/managed-users/create-managed-user"},{"title":"Get Managed Users By Manager","deprecated":null,"version":null,"openapi":"/openapi/widgetic-api-public.json get /users/{managerId}/managed-users","href":"/api-reference/managed-users/get-managed-users-by-manager"},{"title":"Get Managed User By ID","deprecated":null,"version":null,"openapi":"/openapi/widgetic-api-public.json get /managed-users/{id}","href":"/api-reference/managed-users/get-managed-user-by-id"},{"title":"Update Managed User","deprecated":null,"version":null,"openapi":"/openapi/widgetic-api-public.json put /managed-users/{id}","href":"/api-reference/managed-users/update-managed-user"},{"title":"Delete Managed User","deprecated":null,"version":null,"openapi":"/openapi/widgetic-api-public.json delete /managed-users/{id}","href":"/api-reference/managed-users/delete-managed-user"},{"title":"Create an editor session for a managed user","deprecated":null,"version":null,"openapi":"/openapi/widgetic-api-public.json post /managed-users/{id}/editor-sessions","href":"/api-reference/managed-users/create-an-editor-session-for-a-managed-user"},{"title":"End every editor session of a managed user","deprecated":null,"version":null,"openapi":"/openapi/widgetic-api-public.json delete /managed-users/{id}/editor-sessions","href":"/api-reference/managed-users/end-every-editor-session-of-a-managed-user"},{"title":"End one editor session of a managed user","deprecated":null,"version":null,"openapi":"/openapi/widgetic-api-public.json delete /managed-users/{id}/editor-sessions/{sessionId}","href":"/api-reference/managed-users/end-one-editor-session-of-a-managed-user"},{"title":"What a managed user's editor sessions spent","deprecated":null,"version":null,"openapi":"/openapi/widgetic-api-public.json get /managed-users/{id}/usage","href":"/api-reference/managed-users/what-a-managed-users-editor-sessions-spent"},{"title":"Give a managed user a copy of one of your presets","deprecated":null,"version":null,"openapi":"/openapi/widgetic-api-public.json post /managed-users/{id}/presets/{key}/copy","href":"/api-reference/managed-users/give-a-managed-user-a-copy-of-one-of-your-presets"},{"title":"Create a composition from one of your presets in one call","deprecated":null,"version":null,"openapi":"/openapi/widgetic-api-public.json post /managed-users/{id}/presets/{key}/composition","href":"/api-reference/managed-users/create-a-composition-from-one-of-your-presets-in-one-call"},{"title":"Read monthly credit cap and usage for one managed user","deprecated":null,"version":null,"openapi":"/openapi/widgetic-api-public.json get /managed-users/{id}/limits","href":"/api-reference/managed-users/read-monthly-credit-cap-and-usage-for-one-managed-user"},{"title":"Set or clear the monthly credit cap for one managed user","deprecated":null,"version":null,"openapi":"/openapi/widgetic-api-public.json put /managed-users/{id}/limits","href":"/api-reference/managed-users/set-or-clear-the-monthly-credit-cap-for-one-managed-user"},{"title":"Storage used by one managed user's uploads","deprecated":null,"version":null,"openapi":"/openapi/widgetic-api-public.json get /managed-users/{id}/storage-usage","href":"/api-reference/managed-users/storage-used-by-one-managed-users-uploads"},{"title":"List entries across a managed user's compositions","deprecated":null,"version":null,"openapi":"/openapi/widgetic-api-public.json get /managed-users/{id}/entries","href":"/api-reference/managed-users/list-entries-across-a-managed-users-compositions"},{"title":"Read design defaults for one managed user","deprecated":null,"version":null,"openapi":"/openapi/widgetic-api-public.json get /managed-users/{id}/design-defaults","href":"/api-reference/managed-users/read-design-defaults-for-one-managed-user"},{"title":"Set or clear design defaults for one managed user","deprecated":null,"version":null,"openapi":"/openapi/widgetic-api-public.json put /managed-users/{id}/design-defaults","href":"/api-reference/managed-users/set-or-clear-design-defaults-for-one-managed-user"}]},{"group":"Invoices","pages":[{"title":"List a partner's invoices","deprecated":null,"version":null,"openapi":"/openapi/widgetic-api-public.json get /invoices/partner/{partnerId}","href":"/api-reference/invoices/list-a-partners-invoices"}]},{"group":"Entitlements","pages":[{"title":"Get partner entitlements","deprecated":null,"version":null,"openapi":"/openapi/widgetic-api-public.json get /entitlements/partners/{partnerId}","href":"/api-reference/entitlements/get-partner-entitlements"},{"title":"Get managed user entitlements","deprecated":null,"version":null,"openapi":"/openapi/widgetic-api-public.json get /entitlements/managed-users/{managedUserId}","href":"/api-reference/entitlements/get-managed-user-entitlements"}]},{"group":"Credits","pages":[{"title":"Get an account's credit balance","deprecated":null,"version":null,"openapi":"/openapi/widgetic-api-public.json get /credits/user/{userId}/balance","href":"/api-reference/credits/get-an-accounts-credit-balance"},{"title":"List an account's credit ledger","deprecated":null,"version":null,"openapi":"/openapi/widgetic-api-public.json get /credits/user/{userId}/transactions","href":"/api-reference/credits/list-an-accounts-credit-ledger"}]},{"group":"Compositions","pages":[{"title":"Get All Compositions","deprecated":null,"version":null,"openapi":"/openapi/widgetic-api-public.json get /compositions","href":"/api-reference/compositions/get-all-compositions"},{"title":"Create Composition","deprecated":null,"version":null,"openapi":"/openapi/widgetic-api-public.json post /compositions","href":"/api-reference/compositions/create-composition"},{"title":"Duplicate Composition","deprecated":null,"version":null,"openapi":"/openapi/widgetic-api-public.json post /compositions/{id}/duplicate","href":"/api-reference/compositions/duplicate-composition"},{"title":"Get Composition Versions","deprecated":null,"version":null,"openapi":"/openapi/widgetic-api-public.json get /compositions/{id}/versions","href":"/api-reference/compositions/get-composition-versions"},{"title":"Update Composition Status","deprecated":null,"version":null,"openapi":"/openapi/widgetic-api-public.json put /compositions/{id}/status","href":"/api-reference/compositions/update-composition-status"},{"title":"Get Composition","deprecated":null,"version":null,"openapi":"/openapi/widgetic-api-public.json get /compositions/{id}","href":"/api-reference/compositions/get-composition"},{"title":"Update Composition","deprecated":null,"version":null,"openapi":"/openapi/widgetic-api-public.json put /compositions/{id}","href":"/api-reference/compositions/update-composition"},{"title":"Delete Composition","deprecated":null,"version":null,"openapi":"/openapi/widgetic-api-public.json delete /compositions/{id}","href":"/api-reference/compositions/delete-composition"},{"title":"Get Composition Design","deprecated":null,"version":null,"openapi":"/openapi/widgetic-api-public.json get /compositions/{id}/design","href":"/api-reference/compositions/get-composition-design"},{"title":"Get Current Content","deprecated":null,"version":null,"openapi":"/openapi/widgetic-api-public.json get /compositions/{id}/content","href":"/api-reference/compositions/get-current-content"},{"title":"Set Dynamic Content","deprecated":null,"version":null,"openapi":"/openapi/widgetic-api-public.json put /compositions/{id}/content","href":"/api-reference/compositions/set-dynamic-content"},{"title":"Get Composition Embed Settings","deprecated":null,"version":null,"openapi":"/openapi/widgetic-api-public.json get /compositions/{id}/embed-settings","href":"/api-reference/compositions/get-composition-embed-settings"},{"title":"Get Composition Preview","deprecated":null,"version":null,"openapi":"/openapi/widgetic-api-public.json get /compositions/{id}/preview","href":"/api-reference/compositions/get-composition-preview"},{"title":"Get All Records From Composition Database Table","deprecated":null,"version":null,"openapi":"/openapi/widgetic-api-public.json get /compositions/{id}/database/{table}","href":"/api-reference/compositions/get-all-records-from-composition-database-table"},{"title":"Create Record In Composition Database","deprecated":null,"version":null,"openapi":"/openapi/widgetic-api-public.json post /compositions/{id}/database/{table}","href":"/api-reference/compositions/create-record-in-composition-database"},{"title":"Get Record From Composition Database","deprecated":null,"version":null,"openapi":"/openapi/widgetic-api-public.json get /compositions/{id}/database/{table}/{recordId}","href":"/api-reference/compositions/get-record-from-composition-database"},{"title":"Update Record In Composition Database","deprecated":null,"version":null,"openapi":"/openapi/widgetic-api-public.json put /compositions/{id}/database/{table}/{recordId}","href":"/api-reference/compositions/update-record-in-composition-database"},{"title":"Delete Record From Composition Database","deprecated":null,"version":null,"openapi":"/openapi/widgetic-api-public.json delete /compositions/{id}/database/{table}/{recordId}","href":"/api-reference/compositions/delete-record-from-composition-database"},{"title":"Describe What a Composition Keeps","deprecated":null,"version":null,"openapi":"/openapi/widgetic-api-public.json get /compositions/{id}/entries","href":"/api-reference/compositions/describe-what-a-composition-keeps"},{"title":"Read the Entries of a Composition's Table","deprecated":null,"version":null,"openapi":"/openapi/widgetic-api-public.json get /compositions/{id}/entries/{table}","href":"/api-reference/compositions/read-the-entries-of-a-compositions-table"},{"title":"Add a content list item","deprecated":null,"version":null,"openapi":"/openapi/widgetic-api-public.json post /compositions/{id}/content/{list}/items","href":"/api-reference/compositions/add-a-content-list-item"},{"title":"Delete a content list item","deprecated":null,"version":null,"openapi":"/openapi/widgetic-api-public.json delete /compositions/{id}/content/{list}/items/{itemId}","href":"/api-reference/compositions/delete-a-content-list-item"},{"title":"Update a content list item","deprecated":null,"version":null,"openapi":"/openapi/widgetic-api-public.json patch /compositions/{id}/content/{list}/items/{itemId}","href":"/api-reference/compositions/update-a-content-list-item"},{"title":"Read the composition data source binding","deprecated":null,"version":null,"openapi":"/openapi/widgetic-api-public.json get /compositions/{id}/data-source","href":"/api-reference/compositions/read-the-composition-data-source-binding"},{"title":"Bind a public JSON data source for embed refresh","deprecated":null,"version":null,"openapi":"/openapi/widgetic-api-public.json put /compositions/{id}/data-source","href":"/api-reference/compositions/bind-a-public-json-data-source-for-embed-refresh"},{"title":"Remove the composition data source binding","deprecated":null,"version":null,"openapi":"/openapi/widgetic-api-public.json delete /compositions/{id}/data-source","href":"/api-reference/compositions/remove-the-composition-data-source-binding"},{"title":"Validate Content","deprecated":null,"version":null,"openapi":"/openapi/widgetic-api-public.json post /compositions/{id}/content/validate","href":"/api-reference/compositions/validate-content"},{"title":"Get Content Schema","deprecated":null,"version":null,"openapi":"/openapi/widgetic-api-public.json get /compositions/{id}/schema/content","href":"/api-reference/compositions/get-content-schema"},{"title":"Get Design Schema","deprecated":null,"version":null,"openapi":"/openapi/widgetic-api-public.json get /compositions/{id}/schema/design","href":"/api-reference/compositions/get-design-schema"},{"title":"Get Embed Schema","deprecated":null,"version":null,"openapi":"/openapi/widgetic-api-public.json get /compositions/{id}/schema/embed","href":"/api-reference/compositions/get-embed-schema"},{"title":"Check Composition Access","deprecated":null,"version":null,"openapi":"/openapi/widgetic-api-public.json get /compositions/{id}/access","href":"/api-reference/compositions/check-composition-access"},{"title":"Get Compositions Batch","deprecated":null,"version":null,"openapi":"/openapi/widgetic-api-public.json post /compositions/batch","href":"/api-reference/compositions/get-compositions-batch"},{"title":"List composition entry items with paging and filters","deprecated":null,"version":null,"openapi":"/openapi/widgetic-api-public.json get /compositions/{id}/entries/{table}/items","href":"/api-reference/compositions/list-composition-entry-items-with-paging-and-filters"},{"title":"Delete composition entry items by id or host context","deprecated":null,"version":null,"openapi":"/openapi/widgetic-api-public.json delete /compositions/{id}/entries/{table}/items","href":"/api-reference/compositions/delete-composition-entry-items-by-id-or-host-context"},{"title":"Export composition entry items","deprecated":null,"version":null,"openapi":"/openapi/widgetic-api-public.json get /compositions/{id}/entries/{table}/export","href":"/api-reference/compositions/export-composition-entry-items"},{"title":"See the documents a widget's AI answers from","deprecated":null,"version":null,"openapi":"/openapi/widgetic-api-public.json get /compositions/{id}/adapters/ai-answers/knowledge","href":"/api-reference/compositions/see-the-documents-a-widgets-ai-answers-from"},{"title":"Add a document for a widget's AI to answer from","deprecated":null,"version":null,"openapi":"/openapi/widgetic-api-public.json post /compositions/{id}/adapters/ai-answers/knowledge/documents","href":"/api-reference/compositions/add-a-document-for-a-widgets-ai-to-answer-from"},{"title":"Add a text file or a picture of a document (a PDF once PDFs are read) for a widget's AI to answer from","deprecated":null,"version":null,"openapi":"/openapi/widgetic-api-public.json post /compositions/{id}/adapters/ai-answers/knowledge/documents/file","href":"/api-reference/compositions/add-a-text-file-or-a-picture-of-a-document-a-pdf-once-pdfs-are-read-for-a-widgets-ai-to-answer-from"},{"title":"Remove a document from a widget's knowledge base","deprecated":null,"version":null,"openapi":"/openapi/widgetic-api-public.json delete /compositions/{id}/adapters/ai-answers/knowledge/documents/{documentId}","href":"/api-reference/compositions/remove-a-document-from-a-widgets-knowledge-base"}]},{"group":"Canvases","pages":[{"title":"Get All Canvases","deprecated":null,"version":null,"openapi":"/openapi/widgetic-api-public.json get /canvases","href":"/api-reference/canvases/get-all-canvases"},{"title":"Create Canvas","deprecated":null,"version":null,"openapi":"/openapi/widgetic-api-public.json post /canvases","href":"/api-reference/canvases/create-canvas"},{"title":"Get Canvas","deprecated":null,"version":null,"openapi":"/openapi/widgetic-api-public.json get /canvases/{id}","href":"/api-reference/canvases/get-canvas"},{"title":"Update Canvas","deprecated":null,"version":null,"openapi":"/openapi/widgetic-api-public.json put /canvases/{id}","href":"/api-reference/canvases/update-canvas"},{"title":"Delete Canvas","deprecated":null,"version":null,"openapi":"/openapi/widgetic-api-public.json delete /canvases/{id}","href":"/api-reference/canvases/delete-canvas"}]},{"group":"Brand Kit","pages":[{"title":"The Brand Kit of the current workspace","deprecated":null,"version":null,"openapi":"/openapi/widgetic-api-public.json get /brand-kit","href":"/api-reference/brand-kit/the-brand-kit-of-the-current-workspace"},{"title":"Save Brand Kit tokens","deprecated":null,"version":null,"openapi":"/openapi/widgetic-api-public.json put /brand-kit","href":"/api-reference/brand-kit/save-brand-kit-tokens"},{"title":"Reset the Brand Kit to the default","deprecated":null,"version":null,"openapi":"/openapi/widgetic-api-public.json delete /brand-kit","href":"/api-reference/brand-kit/reset-the-brand-kit-to-the-default"},{"title":"Change part of the Brand Kit","deprecated":null,"version":null,"openapi":"/openapi/widgetic-api-public.json patch /brand-kit","href":"/api-reference/brand-kit/change-part-of-the-brand-kit"},{"title":"Upload a font file to the Brand Kit","deprecated":null,"version":null,"openapi":"/openapi/widgetic-api-public.json post /brand-kit/fonts","href":"/api-reference/brand-kit/upload-a-font-file-to-the-brand-kit"},{"title":"Add a named SVG icon to the Brand Kit","deprecated":null,"version":null,"openapi":"/openapi/widgetic-api-public.json post /brand-kit/icons","href":"/api-reference/brand-kit/add-a-named-svg-icon-to-the-brand-kit"},{"title":"Remove a font or icon from the Brand Kit","deprecated":null,"version":null,"openapi":"/openapi/widgetic-api-public.json delete /brand-kit/assets/{assetId}","href":"/api-reference/brand-kit/remove-a-font-or-icon-from-the-brand-kit"},{"title":"Rename an icon or relabel a font variant","deprecated":null,"version":null,"openapi":"/openapi/widgetic-api-public.json patch /brand-kit/assets/{assetId}","href":"/api-reference/brand-kit/rename-an-icon-or-relabel-a-font-variant"}]}]},{"tab":"Resources","pages":[{"title":"Resources","href":"/resources/examples"}]}]},"basePath":"","title":"Upload a file - Widgetic","buildId":"dpl_DqYu5MPb49gWBBbUGgpHQUmCHY3P","deploymentId":"dpl_DqYu5MPb49gWBBbUGgpHQUmCHY3P","dynamics":["c2aa737661","2b790eda92","b0f84f53ff","a9bb46feb3"],"chunks":["OpenApiReferenceProvider-CybtLBIt.js","utils-BMLj2fvV.js","cloneDeep-izs3Hzxb.js","_Uint8Array-BVIqJ90l.js","isObjectLike-C8vmzPEN.js","isArray-Dcu1dQ5t.js","utils-B6In562Y.js","toString-BX-iyh8G.js","isSymbol-CSH9U2Gm.js","addUniqueKeysToSchema-Dr8Mfhp9.js","snippetPresets-2rmQvMVl.js","style-to-object-BY3JEAdk.js","v4-DIgz8zy6.js","conditional-requirements-CFM0id0Q.js","ApiExamples-WMqJYdZj.js","isEqual-BfaiBbcl.js","usePlaygroundInputsStore-CJ-MlPHu.js","shallow-dY3TMRCk.js","getApiPlaygroundDisplay-v-1B2bKm.js","CodeSnippet-BDhiTB7U.js","CodeSnippets-D9hnzQcS.js","Page-C4GwDT3_.js","getPastedJson-Th2V45jI.js","icon-BQXch1W9.js","MethodPill-BCqUneP3.js","DuplicateIcon-Q_-bhurZ.js","createIcon-DUjLHRqp.js","DynamicMarkdown-B-f2cqXQ.js","SectionHeading-Da5NsV4v.js","axios-vUo_bRtp.js","Markdown-D13FWkIM.js","clsx-D3Isdib3.js","lib-DuNMoZ05.js","lib-B8HbPgcC.js","html-void-elements-mCSPHezU.js","dist-C-XZBk9h.js","katex-YMM-FMeD.js","marked.esm-CZWythHk.js","AssistantPageLink--qIqmmVG.js"]}