To make the composition for one of your managed users, send managedUserId or managedUserExternalId.
The composition stays in your account and is yours to edit; the tag lets you list one user’s compositions
with getAllCompositions. The managed user must be yours and active: one that is not yours, or does not
exist, is answered with 404 and MANAGED_USER_NOT_FOUND, and one that is switched off with 409 and
MANAGED_USER_INACTIVE. The tag is set here and does not change afterwards. A copy made with
duplicateComposition keeps the tag of the original.
An editor session with the creator surface may call this to start a composition of a widget it built:
it sends only name, widgetId (a widget made for the session’s managed user) and content, and the
composition is always made for that managed user.
Send databaseSchema to give the composition tables of its own for what visitors send it (the shape, the
allowed types and the limits are described on the field). A databaseSchema that cannot be used is refused
before anything is created, with 400 and INVALID_DATABASE_SCHEMA. If the composition is created but its
tables cannot be made just now, the answer is still 201 and meta.warnings says so.
Leave databaseSchema out and the composition gets the tables its widget declares in its own source
(src/lib/meta/database.json), if it declares any: they are made the same way, in a schema of the
composition’s own. A widget that keeps nothing leaves the composition without tables. If the widget’s file
cannot be used, or its tables cannot be made just now, the answer is still 201 and meta.warnings says so.
The widget is read as it was when it was last published (as it is now, when it never was).
The Idempotency-Key header is required (400 without it). Send the same key when you retry, so one
composition is created, not two.
POST
/
compositions
TypeScript SDK
import { randomUUID } from 'node:crypto';
import { Configuration, CompositionsApi, ResponseError } from '@widgetic/api-sdk-ts';
const config = new Configuration({
apiKey: 'YOUR_API_KEY'
});
const compositionsApi = new CompositionsApi(config);
try {
const composition = await compositionsApi.createComposition({
// The call needs an idempotency key: reuse the same key if you retry this call.
idempotencyKey: randomUUID(),
newComposition: {
name: 'My New Composition',
widgetId: '123e4567-e89b-12d3-a456-426614174002',
content: {}
}
});
console.log('Created composition:', composition);
} catch (error) {
if (error instanceof ResponseError && error.response.status === 400) {
// The body of the answer says what was wrong
console.error('Invalid input:', await error.response.json());
} else {
console.error('Failed to create composition:', error);
}
}
Required: a call without it is refused with 400. A key of your own that names this one request; a UUID is ideal. It is 8 to 50 characters of letters, digits, - and _. Send the same key again when you retry (after a timeout, a dropped connection or a 5xx) and the call is carried out once: the retry gets the first answer back, marked X-Idempotency-Cached: true. The same key with a different body is refused with 422, and a retry that arrives while the first call is still running with 409 (see Retry-After).
The id Widgetic gave the managed user (POST /managed-users). Makes this call for one of your managed users, so that a mistake in your own code cannot reach another customer's work. Send this header, or the other one, never both. Left out, the call works on your whole account, as it always has. With it, the call reaches only that user's compositions and workflows: a list shows only theirs, a composition or a workflow the call makes is filed under them, and one of another user, or one that does not exist, answers 404 (the same answer, so the call cannot be used to find out what another customer has). A managed user that is not yours answers 404 with MANAGED_USER_NOT_FOUND. An empty, repeated or malformed header is 400 with MANAGED_USER_SCOPE_INVALID; an empty header is never read as no header. A call that is about the whole account, such as the list of your managed users, is refused with 403 and MANAGED_USER_SCOPE_ROUTE_NOT_AVAILABLE: send it without the header. Only your API key can send it. The header is a limit the call asks for: whoever holds the key can leave it out, so for a credential that a customer's browser holds, use an editor session. An Idempotency-Key is kept apart for each managed user.
Your own id for the managed user (its externalId), when you do not keep Widgetic's. Makes this call for one of your managed users, so that a mistake in your own code cannot reach another customer's work. Send this header, or the other one, never both. Left out, the call works on your whole account, as it always has. With it, the call reaches only that user's compositions and workflows: a list shows only theirs, a composition or a workflow the call makes is filed under them, and one of another user, or one that does not exist, answers 404 (the same answer, so the call cannot be used to find out what another customer has). A managed user that is not yours answers 404 with MANAGED_USER_NOT_FOUND. An empty, repeated or malformed header is 400 with MANAGED_USER_SCOPE_INVALID; an empty header is never read as no header. A call that is about the whole account, such as the list of your managed users, is refused with 403 and MANAGED_USER_SCOPE_ROUTE_NOT_AVAILABLE: send it without the header. Only your API key can send it. The header is a limit the call asks for: whoever holds the key can leave it out, so for a credential that a customer's browser holds, use an editor session. An Idempotency-Key is kept apart for each managed user.
The tables this composition keeps what visitors send it in (votes, ratings, answers). They are made when
the composition is created, in a schema of their own that no other composition can reach: in Widgetic's
database, or in your own Neon database when you have set one with setPartnerDataDatabase. They are
deleted with the composition.
The shape is { "tables": [ ... ] }. A table has a name, a list of columns and, optionally, a list of
indexes, and optionally countable. A column has a name and a type, and optionally primaryKey,
notNull, unique, default and readable. An index has a name and the columns it covers (1 to 8),
and optionally unique. Any other key is refused, except source (see below).
countable and readable are the read policy of the composition's own page: nothing the visitors sent
can be read back by the page until you say so. countable: true on a table lets the widget show how many
rows it has; readable: true on a column lets it show or total that column's values (a tally of votes,
an average rating). Mark only what is safe to show to anyone who opens the page. A column whose name
holds email, phone, address, token, password, secret, ip or the like, and a json, jsonb
or uuid column, cannot be readable.
Names (tables, columns, indexes) use lower-case letters, digits and underscores, start with a letter and
are at most 63 characters long. A name that starts with _ or pg_ is reserved.
type is one of text, smallint, integer (or int), bigint, numeric, real,
double precision, boolean (or bool), date, timestamp, timestamptz (or
timestamp with time zone), uuid, json, jsonb, serial, bigserial.
default is a number, true or false, a text of at most 500 characters (no backslash), a JSON value
for a json or jsonb column, or one of now(), current_timestamp and current_date (date and
timestamp columns) and gen_random_uuid() (a uuid column). A serial column numbers itself and has
no default.
A composition declares at most 20 tables, with at most 64 columns and 10 indexes each.
A declaration that cannot be used is refused with 400 and INVALID_DATABASE_SCHEMA;
error.details.problems lists what to change. Tables that already exist are never changed or dropped:
sending more tables later, when you update the composition, adds the ones that are missing. When the
composition is saved but its tables cannot be made just now, the answer says so in meta.warnings: send
the same databaseSchema again to retry.
Leave it out and the composition gets the tables its widget declares in its own source
(src/lib/meta/database.json), if any. Send { "tables": [] } to give the composition no tables and
keep it from getting its widget's.
A composition whose tables were made from its widget's own file reads back with "source": "widget" next
to tables. When the widget is published again, a table, a field or an index its file gained is added to
them; nothing that exists is changed or dropped, and what a page may read does not change. Send source
back as it was and it stays. Leave it out and the tables are yours: no widget's file adds anything to
them. It is the only value source can have.
Make the composition for one of your managed users, by Widgetic's id for the user. Send this or managedUserExternalId, not both. The managed user must be yours and active. The composition stays in your account; the tag lets you list one user's compositions and keeps it out of the others' lists. It is set here and does not change afterwards.
The same, by your own identifier for the user, the externalId you gave when you created the managed user (answers show it as externalId). Send this or managedUserId, not both.
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/compositions/create-composition","slug":"/api-reference/compositions/create-composition","pageMetadata":{"title":"Create Composition","description":"Creates a new composition.\n\nTo make the composition for one of your managed users, send `managedUserId` or `managedUserExternalId`.\nThe composition stays in your account and is yours to edit; the tag lets you list one user's compositions\nwith `getAllCompositions`. The managed user must be yours and active: one that is not yours, or does not\nexist, is answered with 404 and `MANAGED_USER_NOT_FOUND`, and one that is switched off with 409 and\n`MANAGED_USER_INACTIVE`. The tag is set here and does not change afterwards. A copy made with\n`duplicateComposition` keeps the tag of the original.\n\nAn editor session with the `creator` surface may call this to start a composition of a widget it built:\nit sends only `name`, `widgetId` (a widget made for the session's managed user) and `content`, and the\ncomposition is always made for that managed user.\n\nSend `databaseSchema` to give the composition tables of its own for what visitors send it (the shape, the\nallowed types and the limits are described on the field). A `databaseSchema` that cannot be used is refused\nbefore anything is created, with `400` and `INVALID_DATABASE_SCHEMA`. If the composition is created but its\ntables cannot be made just now, the answer is still `201` and `meta.warnings` says so.\n\nLeave `databaseSchema` out and the composition gets the tables its widget declares in its own source\n(`src/lib/meta/database.json`), if it declares any: they are made the same way, in a schema of the\ncomposition's own. A widget that keeps nothing leaves the composition without tables. If the widget's file\ncannot be used, or its tables cannot be made just now, the answer is still `201` and `meta.warnings` says so.\nThe widget is read as it was when it was last published (as it is now, when it never was).\n\nThe `Idempotency-Key` header is required (`400` without it). Send the same key when you retry, so one\ncomposition is created, not two.\n","deprecated":null,"version":null,"openapi":"/openapi/widgetic-api-public.json post /compositions","href":"/api-reference/compositions/create-composition","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: \"Creates a new composition.\"\n }), \"\\n\", _jsxs(_components.p, {\n children: [\"To make the composition for one of your managed users, send \", _jsx(_components.code, {\n children: \"managedUserId\"\n }), \" or \", _jsx(_components.code, {\n children: \"managedUserExternalId\"\n }), \".\\nThe composition stays in your account and is yours to edit; the tag lets you list one user’s compositions\\nwith \", _jsx(_components.code, {\n children: \"getAllCompositions\"\n }), \". The managed user must be yours and active: one that is not yours, or does not\\nexist, is answered with 404 and \", _jsx(_components.code, {\n children: \"MANAGED_USER_NOT_FOUND\"\n }), \", and one that is switched off with 409 and\\n\", _jsx(_components.code, {\n children: \"MANAGED_USER_INACTIVE\"\n }), \". The tag is set here and does not change afterwards. A copy made with\\n\", _jsx(_components.code, {\n children: \"duplicateComposition\"\n }), \" keeps the tag of the original.\"]\n }), \"\\n\", _jsxs(_components.p, {\n children: [\"An editor session with the \", _jsx(_components.code, {\n children: \"creator\"\n }), \" surface may call this to start a composition of a widget it built:\\nit sends only \", _jsx(_components.code, {\n children: \"name\"\n }), \", \", _jsx(_components.code, {\n children: \"widgetId\"\n }), \" (a widget made for the session’s managed user) and \", _jsx(_components.code, {\n children: \"content\"\n }), \", and the\\ncomposition is always made for that managed user.\"]\n }), \"\\n\", _jsxs(_components.p, {\n children: [\"Send \", _jsx(_components.code, {\n children: \"databaseSchema\"\n }), \" to give the composition tables of its own for what visitors send it (the shape, the\\nallowed types and the limits are described on the field). A \", _jsx(_components.code, {\n children: \"databaseSchema\"\n }), \" that cannot be used is refused\\nbefore anything is created, with \", _jsx(_components.code, {\n children: \"400\"\n }), \" and \", _jsx(_components.code, {\n children: \"INVALID_DATABASE_SCHEMA\"\n }), \". If the composition is created but its\\ntables cannot be made just now, the answer is still \", _jsx(_components.code, {\n children: \"201\"\n }), \" and \", _jsx(_components.code, {\n children: \"meta.warnings\"\n }), \" says so.\"]\n }), \"\\n\", _jsxs(_components.p, {\n children: [\"Leave \", _jsx(_components.code, {\n children: \"databaseSchema\"\n }), \" out and the composition gets the tables its widget declares in its own source\\n(\", _jsx(_components.code, {\n children: \"src/lib/meta/database.json\"\n }), \"), if it declares any: they are made the same way, in a schema of the\\ncomposition’s own. A widget that keeps nothing leaves the composition without tables. If the widget’s file\\ncannot be used, or its tables cannot be made just now, the answer is still \", _jsx(_components.code, {\n children: \"201\"\n }), \" and \", _jsx(_components.code, {\n children: \"meta.warnings\"\n }), \" says so.\\nThe widget is read as it was when it was last published (as it is now, when it never was).\"]\n }), \"\\n\", _jsxs(_components.p, {\n children: [\"The \", _jsx(_components.code, {\n children: \"Idempotency-Key\"\n }), \" header is required (\", _jsx(_components.code, {\n children: \"400\"\n }), \" without it). Send the same key when you retry, so one\\ncomposition is created, not two.\"]\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":"Create Composition","description":"Creates a new composition.\n\nTo make the composition for one of your managed users, send `managedUserId` or `managedUserExternalId`.\nThe composition stays in your account and is yours to edit; the tag lets you list one user's compositions\nwith `getAllCompositions`. The managed user must be yours and active: one that is not yours, or does not\nexist, is answered with 404 and `MANAGED_USER_NOT_FOUND`, and one that is switched off with 409 and\n`MANAGED_USER_INACTIVE`. The tag is set here and does not change afterwards. A copy made with\n`duplicateComposition` keeps the tag of the original.\n\nAn editor session with the `creator` surface may call this to start a composition of a widget it built:\nit sends only `name`, `widgetId` (a widget made for the session's managed user) and `content`, and the\ncomposition is always made for that managed user.\n\nSend `databaseSchema` to give the composition tables of its own for what visitors send it (the shape, the\nallowed types and the limits are described on the field). A `databaseSchema` that cannot be used is refused\nbefore anything is created, with `400` and `INVALID_DATABASE_SCHEMA`. If the composition is created but its\ntables cannot be made just now, the answer is still `201` and `meta.warnings` says so.\n\nLeave `databaseSchema` out and the composition gets the tables its widget declares in its own source\n(`src/lib/meta/database.json`), if it declares any: they are made the same way, in a schema of the\ncomposition's own. A widget that keeps nothing leaves the composition without tables. If the widget's file\ncannot be used, or its tables cannot be made just now, the answer is still `201` and `meta.warnings` says so.\nThe widget is read as it was when it was last published (as it is now, when it never was).\n\nThe `Idempotency-Key` header is required (`400` without it). Send the same key when you retry, so one\ncomposition is created, not two.\n","deprecated":null,"version":null,"openapi":"/openapi/widgetic-api-public.json post /compositions","href":"/api-reference/compositions/create-composition","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":"createComposition","summary":"Create Composition","description":"Creates a new composition.\n\nTo make the composition for one of your managed users, send `managedUserId` or `managedUserExternalId`.\nThe composition stays in your account and is yours to edit; the tag lets you list one user's compositions\nwith `getAllCompositions`. The managed user must be yours and active: one that is not yours, or does not\nexist, is answered with 404 and `MANAGED_USER_NOT_FOUND`, and one that is switched off with 409 and\n`MANAGED_USER_INACTIVE`. The tag is set here and does not change afterwards. A copy made with\n`duplicateComposition` keeps the tag of the original.\n\nAn editor session with the `creator` surface may call this to start a composition of a widget it built:\nit sends only `name`, `widgetId` (a widget made for the session's managed user) and `content`, and the\ncomposition is always made for that managed user.\n\nSend `databaseSchema` to give the composition tables of its own for what visitors send it (the shape, the\nallowed types and the limits are described on the field). A `databaseSchema` that cannot be used is refused\nbefore anything is created, with `400` and `INVALID_DATABASE_SCHEMA`. If the composition is created but its\ntables cannot be made just now, the answer is still `201` and `meta.warnings` says so.\n\nLeave `databaseSchema` out and the composition gets the tables its widget declares in its own source\n(`src/lib/meta/database.json`), if it declares any: they are made the same way, in a schema of the\ncomposition's own. A widget that keeps nothing leaves the composition without tables. If the widget's file\ncannot be used, or its tables cannot be made just now, the answer is still `201` and `meta.warnings` says so.\nThe widget is read as it was when it was last published (as it is now, when it never was).\n\nThe `Idempotency-Key` header is required (`400` without it). Send the same key when you retry, so one\ncomposition is created, not two.\n","tags":["Compositions"],"security":["602277a2-eec9-408b-9527-ce0c13252b29"],"x-access-level":"user","x-visibility":"public","requestBody":"83363103-709f-4413-9e38-3e3720a213a5","responses":{"201":"324ed6e0-0a09-4121-889e-5511c95660b4","400":"621e74c7-5bd6-4f53-8403-fbc2409a591b","401":"71627b7b-09e8-4075-87a4-066af2e4c3c5","404":"3a319730-0ec2-460e-9f7b-f77c0e3f1aaf","409":"2fe551db-6905-458c-863f-dc5706fbc25f"},"x-code-samples":[{"lang":"TypeScript","label":"TypeScript SDK","source":"import { randomUUID } from 'node:crypto';\nimport { Configuration, CompositionsApi, ResponseError } from '@widgetic/api-sdk-ts';\n\nconst config = new Configuration({\n apiKey: 'YOUR_API_KEY'\n});\n\nconst compositionsApi = new CompositionsApi(config);\n\ntry {\n const composition = await compositionsApi.createComposition({\n // The call needs an idempotency key: reuse the same key if you retry this call.\n idempotencyKey: randomUUID(),\n newComposition: {\n name: 'My New Composition',\n widgetId: '123e4567-e89b-12d3-a456-426614174002',\n content: {}\n }\n });\n \n console.log('Created composition:', composition);\n} catch (error) {\n if (error instanceof ResponseError \u0026\u0026 error.response.status === 400) {\n // The body of the answer says what was wrong\n console.error('Invalid input:', await error.response.json());\n } else {\n console.error('Failed to create composition:', error);\n }\n}\n"}],"parameters":["42d56c2e-7152-493d-a215-e9219bc13648","e25489f8-0bfe-4d2a-9430-62c59eb80674","5453f51d-622e-47fd-bcd2-bde7157b4f8f"],"method":"post","type":"path","servers":["8cdad7e2-72d7-448d-a767-c0ce9882d766"],"path":"/compositions","baseUrlOptions":["https://api.widgetic.com/v1"],"title":"Create Composition","codeSamples":[{"label":"TypeScript SDK","lang":"TypeScript","source":"import { randomUUID } from 'node:crypto';\nimport { Configuration, CompositionsApi, ResponseError } from '@widgetic/api-sdk-ts';\n\nconst config = new Configuration({\n apiKey: 'YOUR_API_KEY'\n});\n\nconst compositionsApi = new CompositionsApi(config);\n\ntry {\n const composition = await compositionsApi.createComposition({\n // The call needs an idempotency key: reuse the same key if you retry this call.\n idempotencyKey: randomUUID(),\n newComposition: {\n name: 'My New Composition',\n widgetId: '123e4567-e89b-12d3-a456-426614174002',\n content: {}\n }\n });\n \n console.log('Created composition:', composition);\n} catch (error) {\n if (error instanceof ResponseError \u0026\u0026 error.response.status === 400) {\n // The body of the answer says what was wrong\n console.error('Invalid input:', await error.response.json());\n } else {\n console.error('Failed to create composition:', error);\n }\n}\n"}],"requiredOnlyExamples":false,"requestExampleType":"codeSamples","responseExampleType":"generated"},"dependencies":{"parameters":{"42d56c2e-7152-493d-a215-e9219bc13648":{"in":"header","name":"Idempotency-Key","required":true,"description":"Required: a call without it is refused with `400`. A key of your own that names this one request; a UUID is ideal. It is 8 to 50 characters of letters, digits, `-` and `_`. Send the same key again when you retry (after a timeout, a dropped connection or a `5xx`) and the call is carried out once: the retry gets the first answer back, marked `X-Idempotency-Cached: true`. The same key with a different body is refused with `422`, and a retry that arrives while the first call is still running with `409` (see `Retry-After`).","schema":{"type":"string","minLength":8,"maxLength":50,"pattern":"^[a-zA-Z0-9_-]{8,50}$","example":"9b2d6f0a-3c41-4e5a-8d77-1f2e3a4b5c6d","isRequired":true,"description":"Required: a call without it is refused with `400`. A key of your own that names this one request; a UUID is ideal. It is 8 to 50 characters of letters, digits, `-` and `_`. Send the same key again when you retry (after a timeout, a dropped connection or a `5xx`) and the call is carried out once: the retry gets the first answer back, marked `X-Idempotency-Cached: true`. The same key with a different body is refused with `422`, and a retry that arrives while the first call is still running with `409` (see `Retry-After`).","uniqueKey":"","typeLabel":"string"}},"e25489f8-0bfe-4d2a-9430-62c59eb80674":{"in":"header","name":"X-Managed-User-Id","required":false,"description":"The id Widgetic gave the managed user (`POST /managed-users`). Makes this call for one of your managed users, so that a mistake in your own code cannot reach another customer's work. Send this header, or the other one, never both. Left out, the call works on your whole account, as it always has. With it, the call reaches only that user's compositions and workflows: a list shows only theirs, a composition or a workflow the call makes is filed under them, and one of another user, or one that does not exist, answers `404` (the same answer, so the call cannot be used to find out what another customer has). A managed user that is not yours answers `404` with `MANAGED_USER_NOT_FOUND`. An empty, repeated or malformed header is `400` with `MANAGED_USER_SCOPE_INVALID`; an empty header is never read as no header. A call that is about the whole account, such as the list of your managed users, is refused with `403` and `MANAGED_USER_SCOPE_ROUTE_NOT_AVAILABLE`: send it without the header. Only your API key can send it. The header is a limit the call asks for: whoever holds the key can leave it out, so for a credential that a customer's browser holds, use an editor session. An `Idempotency-Key` is kept apart for each managed user.","schema":{"type":"string","format":"uuid","example":"3f2b8c1e-7a4d-4e0b-9c55-2d1a6b7e8f90","isRequired":false,"description":"The id Widgetic gave the managed user (`POST /managed-users`). Makes this call for one of your managed users, so that a mistake in your own code cannot reach another customer's work. Send this header, or the other one, never both. Left out, the call works on your whole account, as it always has. With it, the call reaches only that user's compositions and workflows: a list shows only theirs, a composition or a workflow the call makes is filed under them, and one of another user, or one that does not exist, answers `404` (the same answer, so the call cannot be used to find out what another customer has). A managed user that is not yours answers `404` with `MANAGED_USER_NOT_FOUND`. An empty, repeated or malformed header is `400` with `MANAGED_USER_SCOPE_INVALID`; an empty header is never read as no header. A call that is about the whole account, such as the list of your managed users, is refused with `403` and `MANAGED_USER_SCOPE_ROUTE_NOT_AVAILABLE`: send it without the header. Only your API key can send it. The header is a limit the call asks for: whoever holds the key can leave it out, so for a credential that a customer's browser holds, use an editor session. An `Idempotency-Key` is kept apart for each managed user.","uniqueKey":"","typeLabel":"string\u003cuuid>"}},"5453f51d-622e-47fd-bcd2-bde7157b4f8f":{"in":"header","name":"X-Managed-User-External-Id","required":false,"description":"Your own id for the managed user (its `externalId`), when you do not keep Widgetic's. Makes this call for one of your managed users, so that a mistake in your own code cannot reach another customer's work. Send this header, or the other one, never both. Left out, the call works on your whole account, as it always has. With it, the call reaches only that user's compositions and workflows: a list shows only theirs, a composition or a workflow the call makes is filed under them, and one of another user, or one that does not exist, answers `404` (the same answer, so the call cannot be used to find out what another customer has). A managed user that is not yours answers `404` with `MANAGED_USER_NOT_FOUND`. An empty, repeated or malformed header is `400` with `MANAGED_USER_SCOPE_INVALID`; an empty header is never read as no header. A call that is about the whole account, such as the list of your managed users, is refused with `403` and `MANAGED_USER_SCOPE_ROUTE_NOT_AVAILABLE`: send it without the header. Only your API key can send it. The header is a limit the call asks for: whoever holds the key can leave it out, so for a credential that a customer's browser holds, use an editor session. An `Idempotency-Key` is kept apart for each managed user.","schema":{"type":"string","minLength":1,"maxLength":255,"example":"customer-1042","isRequired":false,"description":"Your own id for the managed user (its `externalId`), when you do not keep Widgetic's. Makes this call for one of your managed users, so that a mistake in your own code cannot reach another customer's work. Send this header, or the other one, never both. Left out, the call works on your whole account, as it always has. With it, the call reaches only that user's compositions and workflows: a list shows only theirs, a composition or a workflow the call makes is filed under them, and one of another user, or one that does not exist, answers `404` (the same answer, so the call cannot be used to find out what another customer has). A managed user that is not yours answers `404` with `MANAGED_USER_NOT_FOUND`. An empty, repeated or malformed header is `400` with `MANAGED_USER_SCOPE_INVALID`; an empty header is never read as no header. A call that is about the whole account, such as the list of your managed users, is refused with `403` and `MANAGED_USER_SCOPE_ROUTE_NOT_AVAILABLE`: send it without the header. Only your API key can send it. The header is a limit the call asks for: whoever holds the key can leave it out, so for a credential that a customer's browser holds, use an editor session. An `Idempotency-Key` is kept apart for each managed user.","uniqueKey":"","typeLabel":"string"}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","description":"Name of the composition","example":"My New Composition","isRequired":true,"uniqueKey":"name","typeLabel":"string"},"widgetId":{"type":"string","format":"uuid","description":"ID of the widget this composition is based on","example":"123e4567-e89b-12d3-a456-426614174002","isRequired":true,"uniqueKey":"widgetId","typeLabel":"string\u003cuuid>"},"creatorId":{"type":"string","format":"uuid","description":"ID of the user creating the composition","example":"123e4567-e89b-12d3-a456-426614174001","uniqueKey":"creatorId","typeLabel":"string\u003cuuid>"},"content":{"type":"object","description":"Content data for the composition","example":{"key":"value"},"uniqueKey":"content","typeLabel":"object"},"status":{"type":"string","description":"Initial status of the composition","default":"draft","example":"draft","uniqueKey":"status","typeLabel":"string"},"embedSettings":{"type":"object","description":"Settings for embedding the composition","example":{"width":"100%","height":"500px"},"uniqueKey":"embedSettings","typeLabel":"object"},"design":{"type":"object","description":"Design settings for the composition","example":{"theme":"light","colors":{"primary":"#0066ff"}},"uniqueKey":"design","typeLabel":"object"},"databaseSchema":{"type":"object","description":"The tables this composition keeps what visitors send it in (votes, ratings, answers). They are made when\nthe composition is created, in a schema of their own that no other composition can reach: in Widgetic's\ndatabase, or in your own Neon database when you have set one with `setPartnerDataDatabase`. They are\ndeleted with the composition.\n\nThe shape is `{ \"tables\": [ ... ] }`. A table has a `name`, a list of `columns` and, optionally, a list of\n`indexes`, and optionally `countable`. A column has a `name` and a `type`, and optionally `primaryKey`,\n`notNull`, `unique`, `default` and `readable`. An index has a `name` and the `columns` it covers (1 to 8),\nand optionally `unique`. Any other key is refused, except `source` (see below).\n\n`countable` and `readable` are the read policy of the composition's own page: nothing the visitors sent\ncan be read back by the page until you say so. `countable: true` on a table lets the widget show how many\nrows it has; `readable: true` on a column lets it show or total that column's values (a tally of votes,\nan average rating). Mark only what is safe to show to anyone who opens the page. A column whose name\nholds `email`, `phone`, `address`, `token`, `password`, `secret`, `ip` or the like, and a `json`, `jsonb`\nor `uuid` column, cannot be `readable`.\n\n- Names (tables, columns, indexes) use lower-case letters, digits and underscores, start with a letter and\n are at most 63 characters long. A name that starts with `_` or `pg_` is reserved.\n- `type` is one of `text`, `smallint`, `integer` (or `int`), `bigint`, `numeric`, `real`,\n `double precision`, `boolean` (or `bool`), `date`, `timestamp`, `timestamptz` (or\n `timestamp with time zone`), `uuid`, `json`, `jsonb`, `serial`, `bigserial`.\n- `default` is a number, `true` or `false`, a text of at most 500 characters (no backslash), a JSON value\n for a `json` or `jsonb` column, or one of `now()`, `current_timestamp` and `current_date` (date and\n timestamp columns) and `gen_random_uuid()` (a `uuid` column). A `serial` column numbers itself and has\n no default.\n- A composition declares at most 20 tables, with at most 64 columns and 10 indexes each.\n\nA declaration that cannot be used is refused with `400` and `INVALID_DATABASE_SCHEMA`;\n`error.details.problems` lists what to change. Tables that already exist are never changed or dropped:\nsending more tables later, when you update the composition, adds the ones that are missing. When the\ncomposition is saved but its tables cannot be made just now, the answer says so in `meta.warnings`: send\nthe same `databaseSchema` again to retry.\n\nLeave it out and the composition gets the tables its widget declares in its own source\n(`src/lib/meta/database.json`), if any. Send `{ \"tables\": [] }` to give the composition no tables and\nkeep it from getting its widget's.\n\nA composition whose tables were made from its widget's own file reads back with `\"source\": \"widget\"` next\nto `tables`. When the widget is published again, a table, a field or an index its file gained is added to\nthem; nothing that exists is changed or dropped, and what a page may read does not change. Send `source`\nback as it was and it stays. Leave it out and the tables are yours: no widget's file adds anything to\nthem. It is the only value `source` can have.\n","example":{"tables":[{"name":"votes","columns":[{"name":"id","type":"serial","primaryKey":true},{"name":"choice","type":"text","notNull":true},{"name":"created_at","type":"timestamptz","default":"now()"}],"indexes":[{"name":"votes_choice_idx","columns":["choice"]}]}]},"uniqueKey":"databaseSchema","typeLabel":"object"},"projectId":{"type":"string","format":"uuid","description":"ID of the project this composition belongs to","example":"123e4567-e89b-12d3-a456-426614174004","uniqueKey":"projectId","typeLabel":"string\u003cuuid>"},"managedUserId":{"type":"string","format":"uuid","description":"Make the composition for one of your managed users, by Widgetic's id for the user. Send this or `managedUserExternalId`, not both. The managed user must be yours and active. The composition stays in your account; the tag lets you list one user's compositions and keeps it out of the others' lists. It is set here and does not change afterwards.","example":"b7c8d9e0-1f2a-4b3c-8d4e-5f6a7b8c9d0e","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 (answers show it as `externalId`). Send this or `managedUserId`, not both.","example":"user-8841","uniqueKey":"managedUserExternalId","typeLabel":"string"}},"required":["name","widgetId"],"example":{"name":"My New Composition","widgetId":"123e4567-e89b-12d3-a456-426614174002","creatorId":"123e4567-e89b-12d3-a456-426614174001","content":{"key":"value"},"status":"draft","embedSettings":{"width":"100%","height":"500px"},"design":{"theme":"light","colors":{"primary":"#0066ff"}},"databaseSchema":{"tables":[{"name":"votes","columns":[{"name":"id","type":"serial","primaryKey":true},{"name":"choice","type":"text","notNull":true},{"name":"created_at","type":"timestamptz","default":"now()"}],"indexes":[{"name":"votes_choice_idx","columns":["choice"]}]}]},"projectId":"123e4567-e89b-12d3-a456-426614174004","managedUserId":"b7c8d9e0-1f2a-4b3c-8d4e-5f6a7b8c9d0e","managedUserExternalId":"user-8841"},"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"name":"My New Composition","widgetId":"123e4567-e89b-12d3-a456-426614174002","creatorId":"123e4567-e89b-12d3-a456-426614174001","content":{"key":"value"},"status":"draft","embedSettings":{"width":"100%","height":"500px"},"design":{"theme":"light","colors":{"primary":"#0066ff"}},"databaseSchema":{"tables":[{"name":"votes","columns":[{"name":"id","type":"serial","primaryKey":true},{"name":"choice","type":"text","notNull":true},{"name":"created_at","type":"timestamptz","default":"now()"}],"indexes":[{"name":"votes_choice_idx","columns":["choice"]}]}]},"projectId":"123e4567-e89b-12d3-a456-426614174004","managedUserId":"b7c8d9e0-1f2a-4b3c-8d4e-5f6a7b8c9d0e","managedUserExternalId":"user-8841"}}},"exampleType":"generated"}},"exampleType":"generated"},"responses":{"324ed6e0-0a09-4121-889e-5511c95660b4":{"description":"Composition created successfully","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","properties":{"id":{"type":"string","format":"uuid","description":"Unique identifier for the composition","example":"123e4567-e89b-12d3-a456-426614174000","isRequired":true,"uniqueKey":"data.id","typeLabel":"string\u003cuuid>"},"creatorId":{"type":"string","format":"uuid","description":"ID of the user who created the composition","example":"123e4567-e89b-12d3-a456-426614174001","isRequired":true,"uniqueKey":"data.creatorId","typeLabel":"string\u003cuuid>"},"widgetId":{"type":"string","format":"uuid","description":"ID of the widget this composition is based on","example":"123e4567-e89b-12d3-a456-426614174002","isRequired":true,"uniqueKey":"data.widgetId","typeLabel":"string\u003cuuid>"},"name":{"type":"string","description":"Name of the composition","example":"My Composition","isRequired":true,"uniqueKey":"data.name","typeLabel":"string"},"content":{"type":"object","description":"Content data for the composition","example":{"key":"value"},"isRequired":true,"uniqueKey":"data.content","typeLabel":"object"},"status":{"type":"string","description":"Current status of the composition","enum":["draft","published","archived"],"example":"draft","isRequired":true,"uniqueKey":"data.status","typeLabel":"enum\u003cstring>"},"createdAt":{"type":"string","format":"date-time","description":"When the composition was created","example":"2023-01-01T00:00:00Z","isRequired":true,"uniqueKey":"data.createdAt","typeLabel":"string\u003cdate-time>"},"updatedAt":{"type":"string","format":"date-time","description":"When the composition was last updated","example":"2023-01-02T00:00:00Z","isRequired":true,"uniqueKey":"data.updatedAt","typeLabel":"string\u003cdate-time>"},"contentVersion":{"type":"integer","description":"Monotonic content version when the content_version migration is applied","example":3,"uniqueKey":"data.contentVersion","typeLabel":"integer"},"embedSettings":{"type":"object","description":"Settings for embedding the composition","example":{"width":"100%","height":"500px"},"uniqueKey":"data.embedSettings","typeLabel":"object"},"design":{"type":"object","description":"Design settings for the composition","example":{"theme":"light","colors":{"primary":"#0066ff"}},"uniqueKey":"data.design","typeLabel":"object"},"databaseId":{"type":"string","format":"uuid","description":"Legacy. The id of a Neon database that an earlier version made for this composition. A composition now keeps its tables in a schema of its own (named `comp_` followed by its id) in a database shared with other compositions, so new compositions have none.","example":"123e4567-e89b-12d3-a456-426614174003","uniqueKey":"data.databaseId","typeLabel":"string\u003cuuid>"},"projectId":{"type":"string","format":"uuid","description":"ID of the project this composition belongs to","example":"123e4567-e89b-12d3-a456-426614174004","uniqueKey":"data.projectId","typeLabel":"string\u003cuuid>"},"managedUserId":{"oneOf":[{"type":"string","format":"uuid","description":"The managed user the composition was made for, or null when it is your own. List one managed user's compositions with the `managedUserId` or `managedUserExternalId` query parameter of `getAllCompositions`.","example":"b7c8d9e0-1f2a-4b3c-8d4e-5f6a7b8c9d0e","uniqueKey":"data.managedUserId.oneOf.0","typeLabel":"string\u003cuuid>"},{"type":"null","format":"uuid","description":"The managed user the composition was made for, or null when it is your own. List one managed user's compositions with the `managedUserId` or `managedUserExternalId` query parameter of `getAllCompositions`.","example":"b7c8d9e0-1f2a-4b3c-8d4e-5f6a7b8c9d0e","uniqueKey":"data.managedUserId.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.managedUserId","typeLabel":"string\u003cuuid> | null"},"direct":{"oneOf":[{"type":"boolean","description":"Whether the widget the composition is made from is drawn straight into the page, without a frame\n(`true`), or inside a frame (`false`). `null` when the widget has no published version yet. It is a\nfact about the widget's published version, so every composition of one widget answers the same, and it\nchanges when you publish another version. It cannot be set. Only `getCompositionById` returns it:\nthe other calls that return a composition leave it out, and so does that one on the rare occasion the\nanswer could not be worked out just then (ask again).\n","example":true,"uniqueKey":"data.direct.oneOf.0","typeLabel":"boolean"},{"type":"null","description":"Whether the widget the composition is made from is drawn straight into the page, without a frame\n(`true`), or inside a frame (`false`). `null` when the widget has no published version yet. It is a\nfact about the widget's published version, so every composition of one widget answers the same, and it\nchanges when you publish another version. It cannot be set. Only `getCompositionById` returns it:\nthe other calls that return a composition leave it out, and so does that one on the rare occasion the\nanswer could not be worked out just then (ask again).\n","example":true,"uniqueKey":"data.direct.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.direct","typeLabel":"boolean | null"},"lastEditedBy":{"oneOf":[{"type":"object","description":"Who made the latest change to a composition a team shares (one filed under a project of an organization,\nor one made in a Shopify store's workspace), so that a teammate who opens it can be told \"Anna changed\nthis at 14:32\" and a save that someone else got ahead of can say who. It is `null` when nobody can be\nnamed: a change made by a Widgetic service, through an editor session, by a partner's call made for one\nmanaged user, or one made before this was recorded.\n\nOnly `getCompositionById` returns it, and only for a composition a team shares, and only to a person (a\nsigned-in member or a key of one): a composition in a personal project leaves it out, and so does every\nanswer given to an editor session or to a call made for one managed user. It is also left out on the rare\noccasion the team could not be worked out just then (ask again). The other calls that return a\ncomposition leave it out.\n\nIt is not the same as `creatorId`, who made the composition, and the account behind a change is never\npart of the composition itself: this is the only place it is told.\n","properties":{"id":{"type":"string","format":"uuid","description":"The account that made the latest change","example":"123e4567-e89b-12d3-a456-426614174001","uniqueKey":"data.lastEditedBy.oneOf.0.id","typeLabel":"string\u003cuuid>"},"name":{"oneOf":[{"type":"string","maxLength":120,"description":"The name on that account, or `null` when it has none or it could not be read just then. Never an email address.","example":"Anna","uniqueKey":"data.lastEditedBy.oneOf.0.name.oneOf.0","typeLabel":"string"},{"type":"null","maxLength":120,"description":"The name on that account, or `null` when it has none or it could not be read just then. Never an email address.","example":"Anna","uniqueKey":"data.lastEditedBy.oneOf.0.name.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.lastEditedBy.oneOf.0.name","typeLabel":"string | null"}},"uniqueKey":"data.lastEditedBy.oneOf.0","typeLabel":"object"},{"type":"null","description":"Who made the latest change to a composition a team shares (one filed under a project of an organization,\nor one made in a Shopify store's workspace), so that a teammate who opens it can be told \"Anna changed\nthis at 14:32\" and a save that someone else got ahead of can say who. It is `null` when nobody can be\nnamed: a change made by a Widgetic service, through an editor session, by a partner's call made for one\nmanaged user, or one made before this was recorded.\n\nOnly `getCompositionById` returns it, and only for a composition a team shares, and only to a person (a\nsigned-in member or a key of one): a composition in a personal project leaves it out, and so does every\nanswer given to an editor session or to a call made for one managed user. It is also left out on the rare\noccasion the team could not be worked out just then (ask again). The other calls that return a\ncomposition leave it out.\n\nIt is not the same as `creatorId`, who made the composition, and the account behind a change is never\npart of the composition itself: this is the only place it is told.\n","properties":{"id":{"type":"string","format":"uuid","description":"The account that made the latest change","example":"123e4567-e89b-12d3-a456-426614174001"},"name":{"oneOf":[{"type":"string","maxLength":120,"description":"The name on that account, or `null` when it has none or it could not be read just then. Never an email address.","example":"Anna"},{"type":"null","maxLength":120,"description":"The name on that account, or `null` when it has none or it could not be read just then. Never an email address.","example":"Anna"}]}},"uniqueKey":"data.lastEditedBy.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.lastEditedBy","typeLabel":"object | null"},"lastEditedAt":{"oneOf":[{"type":"string","format":"date-time","description":"When that latest change was made. Present whenever `lastEditedBy` is.","example":"2026-10-28T14:32:00Z","uniqueKey":"data.lastEditedAt.oneOf.0","typeLabel":"string\u003cdate-time>"},{"type":"null","format":"date-time","description":"When that latest change was made. Present whenever `lastEditedBy` is.","example":"2026-10-28T14:32:00Z","uniqueKey":"data.lastEditedAt.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.lastEditedAt","typeLabel":"string\u003cdate-time> | null"}},"required":["id","creatorId","widgetId","name","content","status","createdAt","updatedAt"],"example":{"id":"123e4567-e89b-12d3-a456-426614174000","creatorId":"123e4567-e89b-12d3-a456-426614174001","widgetId":"123e4567-e89b-12d3-a456-426614174002","name":"My Composition","content":{"key":"value"},"contentVersion":3,"status":"draft","createdAt":"2023-01-01T00:00:00Z","updatedAt":"2023-01-02T00:00:00Z","embedSettings":{"width":"100%","height":"500px"},"design":{"theme":"light","colors":{"primary":"#0066ff"}},"databaseId":"123e4567-e89b-12d3-a456-426614174003","projectId":"123e4567-e89b-12d3-a456-426614174004","managedUserId":"b7c8d9e0-1f2a-4b3c-8d4e-5f6a7b8c9d0e","direct":true,"lastEditedBy":{},"lastEditedAt":"2026-10-28T14:32:00Z"},"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":"123e4567-e89b-12d3-a456-426614174000","creatorId":"123e4567-e89b-12d3-a456-426614174001","widgetId":"123e4567-e89b-12d3-a456-426614174002","name":"My Composition","content":{"key":"value"},"contentVersion":3,"status":"draft","createdAt":"2023-01-01T00:00:00Z","updatedAt":"2023-01-02T00:00:00Z","embedSettings":{"width":"100%","height":"500px"},"design":{"theme":"light","colors":{"primary":"#0066ff"}},"databaseId":"123e4567-e89b-12d3-a456-426614174003","projectId":"123e4567-e89b-12d3-a456-426614174004","managedUserId":"b7c8d9e0-1f2a-4b3c-8d4e-5f6a7b8c9d0e","direct":true,"lastEditedBy":{},"lastEditedAt":"2026-10-28T14:32:00Z"},"meta":{"page":1,"size":20,"total":135,"limit":20,"offset":0,"hasNextPage":true,"hasPreviousPage":false,"nextCursor":"\u003cstring>","warnings":["\u003cstring>"]}}}},"exampleType":"generated"}},"exampleType":"generated"},"621e74c7-5bd6-4f53-8403-fbc2409a591b":{"description":"Invalid input (including a `managedUserId` that is not a UUID, both `managedUserId` and `managedUserExternalId`, or a `databaseSchema` that cannot be used, `INVALID_DATABASE_SCHEMA`)","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"},"71627b7b-09e8-4075-87a4-066af2e4c3c5":{"description":"Unauthorized","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"},"3a319730-0ec2-460e-9f7b-f77c0e3f1aaf":{"description":"The managed user named by `managedUserId` or `managedUserExternalId` 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"},"2fe551db-6905-458c-863f-dc5706fbc25f":{"description":"The managed user is switched off, so nothing new can be made for it (`MANAGED_USER_INACTIVE`).","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":{"602277a2-eec9-408b-9527-ce0c13252b29":{"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":"Create Composition - Widgetic","navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{}},"lastModified":"2026-11-08T14:06:37.269Z","originalFileLocation":"api-reference/compositions/create-composition.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=\"Creates a new composition. To make the composition for one of your managed users, send managedUserId or managedUserExternalId. The composition stays in your account and is yours to edit; the tag lets you list one user\u0026#x27;s compositions with getAllCompositions. The managed user must be yours and active: one that is not yours, or does not exist, is answered with 404 and MANAGED_USER_NOT_FOUND, and one that is switched off with 409 and MANAGED_USER_INACTIVE. The tag is set here and does not change afterwards. A copy made with duplicateComposition keeps the tag of the original. An editor session with the creator surface may call this to start a composition of a widget it built: it sends only name, widgetId (a widget made for the session\u0026#x27;s managed user) and content, and the composition is always made for that managed user. Send databaseSchema to give the composition tables of its own for what visitors send it (the shape, the allowed types and the limits are described on the field). A databaseSchema that cannot be used is refused before anything is created, with 400 and INVALID_DATABASE_SCHEMA. If the composition is created but its tables cannot be made just now, the answer is still 201 and meta.warnings says so. Leave databaseSchema out and the composition gets the tables its widget declares in its own source (src/lib/meta/database.json), if it declares any: they are made the same way, in a schema of the composition\u0026#x27;s own. A widget that keeps nothing leaves the composition without tables. If the widget\u0026#x27;s file cannot be used, or its tables cannot be made just now, the answer is still 201 and meta.warnings says so. The widget is read as it was when it was last published (as it is now, when it never was). The Idempotency-Key header is required (400 without it). Send the same key when you retry, so one composition is created, not two.\">\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=\"Create Composition - Widgetic\">\u003cmeta data-mint-head property=\"og:description\" content=\"Creates a new composition. To make the composition for one of your managed users, send managedUserId or managedUserExternalId. The composition stays in your account and is yours to edit; the tag lets you list one user\u0026#x27;s compositions with getAllCompositions. The managed user must be yours and active: one that is not yours, or does not exist, is answered with 404 and MANAGED_USER_NOT_FOUND, and one that is switched off with 409 and MANAGED_USER_INACTIVE. The tag is set here and does not change afterwards. A copy made with duplicateComposition keeps the tag of the original. An editor session with the creator surface may call this to start a composition of a widget it built: it sends only name, widgetId (a widget made for the session\u0026#x27;s managed user) and content, and the composition is always made for that managed user. Send databaseSchema to give the composition tables of its own for what visitors send it (the shape, the allowed types and the limits are described on the field). A databaseSchema that cannot be used is refused before anything is created, with 400 and INVALID_DATABASE_SCHEMA. If the composition is created but its tables cannot be made just now, the answer is still 201 and meta.warnings says so. Leave databaseSchema out and the composition gets the tables its widget declares in its own source (src/lib/meta/database.json), if it declares any: they are made the same way, in a schema of the composition\u0026#x27;s own. A widget that keeps nothing leaves the composition without tables. If the widget\u0026#x27;s file cannot be used, or its tables cannot be made just now, the answer is still 201 and meta.warnings says so. The widget is read as it was when it was last published (as it is now, when it never was). The Idempotency-Key header is required (400 without it). Send the same key when you retry, so one composition is created, not two.\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"Widgetic\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://widgetic.com/api-reference/compositions/create-composition\">\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=Compositions\u0026amp;title=Create+Composition\u0026amp;description=Creates+a+new+composition.%0A%0ATo+make+the+composition+for+one+of+your+managed+users%2C+send+%60managedUserId%60+or+%60managedUserExternalId%60.%0AThe+composition+stays+in+you\u0026amp;theme=7fb55fb4aca22bb80111c88a\u0026amp;signature=a4c772346fe6fa2782d3fe23311425ed366079907277b8899e93cba9c242d79d\">\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=\"Create Composition - Widgetic\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"Creates a new composition. To make the composition for one of your managed users, send managedUserId or managedUserExternalId. The composition stays in your account and is yours to edit; the tag lets you list one user\u0026#x27;s compositions with getAllCompositions. The managed user must be yours and active: one that is not yours, or does not exist, is answered with 404 and MANAGED_USER_NOT_FOUND, and one that is switched off with 409 and MANAGED_USER_INACTIVE. The tag is set here and does not change afterwards. A copy made with duplicateComposition keeps the tag of the original. An editor session with the creator surface may call this to start a composition of a widget it built: it sends only name, widgetId (a widget made for the session\u0026#x27;s managed user) and content, and the composition is always made for that managed user. Send databaseSchema to give the composition tables of its own for what visitors send it (the shape, the allowed types and the limits are described on the field). A databaseSchema that cannot be used is refused before anything is created, with 400 and INVALID_DATABASE_SCHEMA. If the composition is created but its tables cannot be made just now, the answer is still 201 and meta.warnings says so. Leave databaseSchema out and the composition gets the tables its widget declares in its own source (src/lib/meta/database.json), if it declares any: they are made the same way, in a schema of the composition\u0026#x27;s own. A widget that keeps nothing leaves the composition without tables. If the widget\u0026#x27;s file cannot be used, or its tables cannot be made just now, the answer is still 201 and meta.warnings says so. The widget is read as it was when it was last published (as it is now, when it never was). The Idempotency-Key header is required (400 without it). Send the same key when you retry, so one composition is created, not two.\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://widgetic.mintlify.site/_mintlify/api/og/v2?division=Compositions\u0026amp;title=Create+Composition\u0026amp;description=Creates+a+new+composition.%0A%0ATo+make+the+composition+for+one+of+your+managed+users%2C+send+%60managedUserId%60+or+%60managedUserExternalId%60.%0AThe+composition+stays+in+you\u0026amp;theme=7fb55fb4aca22bb80111c88a\u0026amp;signature=a4c772346fe6fa2782d3fe23311425ed366079907277b8899e93cba9c242d79d\">\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/compositions/create-composition\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/api-reference/compositions/create-composition.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/compositions/create-composition#webpage\",\"url\":\"https://widgetic.com/api-reference/compositions/create-composition\",\"name\":\"Create Composition\",\"description\":\"Creates a new composition. To make the composition for one of your managed users, send managedUserId or managedUserExternalId. The composition stays in your account and is yours to edit; the tag lets you list one user's compositions with getAllCompositions. The managed user must be yours and active: one that is not yours, or does not exist, is answered with 404 and MANAGED_USER_NOT_FOUND, and one that is switched off with 409 and MANAGED_USER_INACTIVE. The tag is set here and does not change afterwards. A copy made with duplicateComposition keeps the tag of the original. An editor session with the creator surface may call this to start a composition of a widget it built: it sends only name, widgetId (a widget made for the session's managed user) and content, and the composition is always made for that managed user. Send databaseSchema to give the composition tables of its own for what visitors send it (the shape, the allowed types and the limits are described on the field). A databaseSchema that cannot be used is refused before anything is created, with 400 and INVALID_DATABASE_SCHEMA. If the composition is created but its tables cannot be made just now, the answer is still 201 and meta.warnings says so. Leave databaseSchema out and the composition gets the tables its widget declares in its own source (src/lib/meta/database.json), if it declares any: they are made the same way, in a schema of the composition's own. A widget that keeps nothing leaves the composition without tables. If the widget's file cannot be used, or its tables cannot be made just now, the answer is still 201 and meta.warnings says so. The widget is read as it was when it was last published (as it is now, when it never was). The Idempotency-Key header is required (400 without it). Send the same key when you retry, so one composition is created, not two.\",\"dateModified\":\"2026-11-08T14:06:37.269Z\",\"isPartOf\":{\"@id\":\"https://widgetic.com#website\"},\"breadcrumb\":{\"@id\":\"https://widgetic.com/api-reference/compositions/create-composition#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://widgetic.com/api-reference/compositions/create-composition#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Compositions\",\"item\":\"https://widgetic.com/api-reference/compositions/get-all-compositions\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Create Composition\",\"item\":\"https://widgetic.com/api-reference/compositions/create-composition\"}]},{\"@type\":[\"TechArticle\",\"APIReference\"],\"@id\":\"https://widgetic.com/api-reference/compositions/create-composition#apireference\",\"headline\":\"Create Composition\",\"name\":\"Create Composition\",\"description\":\"Creates a new composition. To make the composition for one of your managed users, send managedUserId or managedUserExternalId. The composition stays in your account and is yours to edit; the tag lets you list one user's compositions with getAllCompositions. The managed user must be yours and active: one that is not yours, or does not exist, is answered with 404 and MANAGED_USER_NOT_FOUND, and one that is switched off with 409 and MANAGED_USER_INACTIVE. The tag is set here and does not change afterwards. A copy made with duplicateComposition keeps the tag of the original. An editor session with the creator surface may call this to start a composition of a widget it built: it sends only name, widgetId (a widget made for the session's managed user) and content, and the composition is always made for that managed user. Send databaseSchema to give the composition tables of its own for what visitors send it (the shape, the allowed types and the limits are described on the field). A databaseSchema that cannot be used is refused before anything is created, with 400 and INVALID_DATABASE_SCHEMA. If the composition is created but its tables cannot be made just now, the answer is still 201 and meta.warnings says so. Leave databaseSchema out and the composition gets the tables its widget declares in its own source (src/lib/meta/database.json), if it declares any: they are made the same way, in a schema of the composition's own. A widget that keeps nothing leaves the composition without tables. If the widget's file cannot be used, or its tables cannot be made just now, the answer is still 201 and meta.warnings says so. The widget is read as it was when it was last published (as it is now, when it never was). The Idempotency-Key header is required (400 without it). Send the same key when you retry, so one composition is created, not two.\",\"url\":\"https://widgetic.com/api-reference/compositions/create-composition\",\"mainEntityOfPage\":{\"@id\":\"https://widgetic.com/api-reference/compositions/create-composition#webpage\"},\"dateModified\":\"2026-11-08T14:06:37.269Z\",\"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/compositions/create-composition.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","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","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","description":"Retrieves all compositions with pagination support.\n\nPass `managedUserId` (Widgetic's id for one of your managed users) or `managedUserExternalId` (your own\nidentifier for the user) to list only the compositions made for that managed user. The compositions of\nyour other managed users, and your own, are left out. It combines with the other filters and with paging.\nA managed user that is not yours, or does not exist, is answered with 404 and `MANAGED_USER_NOT_FOUND`.\n\nAn editor session with the `creator` surface may call this to list the compositions of ONE widget it\nbuilt: it must send `widgetId`, and the answer holds only the compositions made for the session's\nmanaged user.\n","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","description":"Creates a duplicate of an existing composition for the authenticated user.\n\nThe duplicate is made after the answer: the call returns `202` with an `operationId`. Ask\n`GET /operations/{id}` for that operation until its `status` is `completed`; the new composition is\nnamed in `metadata.newCompositionId`. A problem with the duplicate's database (for example, tables that\ncould not be made just now) is listed in `metadata.warnings`, which is absent when there is none.\n\nThe `Idempotency-Key` header is required (`400` without it). Send the same key when you retry, so one\nduplicate is made, not two.\n","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":"Create Composition - 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"]}