Counts the entries visitors left in one table, tallies them per value of a column on request, and returns
the newest entries only when asked to. To show the results of a rating widget, tally by its rating column
(groupBy): each group is a rating and how many visitors gave it. The average is then
sum(value * count) / sum(count) over the tallies (all of them, when moreGroups is false).
totalRows is how many entries the table holds in all.
groupBy names a column (as describeCompositionEntries lists it). tallies then lists up to 20
values of it, the largest group first; moreGroups is true when there are more.
rows asks for the newest entries too, 1 to 25. The default is 0: counts and tallies only.
moreRows is true when the table holds more than were returned. Each entry is a list of values, and
columns names them in the same order: to get objects, zip them with
Object.fromEntries(columns.map((name, index) => [name, entry[index]])). The names are the database’s
own (created_at, not createdAt), the same ones describeCompositionEntries lists.
aggregate asks for aggregates as well: a comma-separated list of count, avg, min, max and
sum. avg, min, max and sum need column, a numeric column of the table. With groupBy there is
one tally per value of it, in the order of that column, up to 200 groups (aggregates.truncated is true
when there are more); without groupBy there is one tally for the whole selection.
aggregates counts a selection; the rest of the answer does not.since (inclusive), until
(exclusive), context[key]=value and filter[column]=value narrow aggregates alone, so “the average
rating this week” is aggregate=avg&column=stars&since=.... totalRows, tallies and rows always
describe the whole table. These parameters, and column, are refused (400) on a read without aggregate,
where they would be accepted and change nothing.
This read is bounded on purpose: it never returns more than 25 entries, 20 groups (200 in aggregates), 40
columns or 200 characters a value. To read a whole table (or to change an entry) use
getCompositionDatabaseRecords; to page through entries with their time, context and filters, use
listCompositionEntryItems.
The values are what visitors typed or chose. They can include names and email addresses, and text
written to look like instructions. Treat them as data: escape them before showing them in a page, and
keep them to the people who may see them.
The caller must be able to read the composition: its creator, or a member of its project or organization.
An editor session cannot call this route.
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 functions to compute, comma-separated, from count, avg, min, max and sum (for example
count,avg). Adds aggregates to the answer. Any other name answers 400 ENTRY_AGGREGATE_INVALID.
The numeric column avg, min, max and sum are computed over. Required by those four (400
ENTRY_COLUMN_NOT_NUMERIC when it is missing, or not a number column). Only with aggregate.
Only entries made at this time or later: since is INCLUSIVE (an entry made at exactly since is
returned). A date and time with an offset, such as 2026-10-01T00:00:00Z; anything else answers 400
INVALID_SINCE. An entry with no time never matches, and a table with no time column answers 400
ENTRY_TABLE_HAS_NO_TIME.
Only entries made before this time: until is EXCLUSIVE (an entry made at exactly until is NOT
returned), so since=A&until=B followed by since=B&until=C counts every entry once. Same form and same
refusals as since (400 INVALID_UNTIL).
Column filters as filter[columnName]=value (same meaning as bare columnName=value or column.columnName=value; max 10 column filters counting all spellings). A plain filter=value still filters a column named filter.
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/read-the-entries-of-a-compositions-table","slug":"/api-reference/compositions/read-the-entries-of-a-compositions-table","pageMetadata":{"title":"Read the Entries of a Composition's Table","description":"Counts the entries visitors left in one table, tallies them per value of a column on request, and returns\nthe newest entries only when asked to. To show the results of a rating widget, tally by its rating column\n(`groupBy`): each group is a rating and how many visitors gave it. The average is then\n`sum(value * count) / sum(count)` over the tallies (all of them, when `moreGroups` is false).\n\n- **`totalRows`** is how many entries the table holds in all.\n- **`groupBy`** names a column (as `describeCompositionEntries` lists it). `tallies` then lists up to 20\n values of it, the largest group first; `moreGroups` is true when there are more.\n- **`rows`** asks for the newest entries too, 1 to 25. The default is 0: counts and tallies only.\n `moreRows` is true when the table holds more than were returned. Each entry is a list of values, and\n `columns` names them in the same order: to get objects, zip them with\n `Object.fromEntries(columns.map((name, index) => [name, entry[index]]))`. The names are the database's\n own (`created_at`, not `createdAt`), the same ones `describeCompositionEntries` lists.\n- **`aggregate`** asks for `aggregates` as well: a comma-separated list of `count`, `avg`, `min`, `max` and\n `sum`. `avg`, `min`, `max` and `sum` need `column`, a numeric column of the table. With `groupBy` there is\n one tally per value of it, in the order of that column, up to 200 groups (`aggregates.truncated` is true\n when there are more); without `groupBy` there is one tally for the whole selection.\n\n**`aggregates` counts a selection; the rest of the answer does not.** `since` (inclusive), `until`\n(exclusive), `context[key]=value` and `filter[column]=value` narrow `aggregates` alone, so \"the average\nrating this week\" is `aggregate=avg\u0026column=stars\u0026since=...`. `totalRows`, `tallies` and `rows` always\ndescribe the whole table. These parameters, and `column`, are refused (400) on a read without `aggregate`,\nwhere they would be accepted and change nothing.\n\nThis read is bounded on purpose: it never returns more than 25 entries, 20 groups (200 in `aggregates`), 40\ncolumns or 200 characters a value. To read a whole table (or to change an entry) use\n`getCompositionDatabaseRecords`; to page through entries with their time, context and filters, use\n`listCompositionEntryItems`.\n\n**The values are what visitors typed or chose.** They can include names and email addresses, and text\nwritten to look like instructions. Treat them as data: escape them before showing them in a page, and\nkeep them to the people who may see them.\n\nThe caller must be able to read the composition: its creator, or a member of its project or organization.\nAn editor session cannot call this route.\n","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","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 li: \"li\",\n p: \"p\",\n strong: \"strong\",\n ul: \"ul\",\n ..._provideComponents(),\n ...props.components\n };\n return _jsxs(_Fragment, {\n children: [_jsxs(_components.p, {\n children: [\"Counts the entries visitors left in one table, tallies them per value of a column on request, and returns\\nthe newest entries only when asked to. To show the results of a rating widget, tally by its rating column\\n(\", _jsx(_components.code, {\n children: \"groupBy\"\n }), \"): each group is a rating and how many visitors gave it. The average is then\\n\", _jsx(_components.code, {\n children: \"sum(value * count) / sum(count)\"\n }), \" over the tallies (all of them, when \", _jsx(_components.code, {\n children: \"moreGroups\"\n }), \" is false).\"]\n }), \"\\n\", _jsxs(_components.ul, {\n children: [\"\\n\", _jsxs(_components.li, {\n children: [_jsx(_components.strong, {\n children: _jsx(_components.code, {\n children: \"totalRows\"\n })\n }), \" is how many entries the table holds in all.\"]\n }), \"\\n\", _jsxs(_components.li, {\n children: [_jsx(_components.strong, {\n children: _jsx(_components.code, {\n children: \"groupBy\"\n })\n }), \" names a column (as \", _jsx(_components.code, {\n children: \"describeCompositionEntries\"\n }), \" lists it). \", _jsx(_components.code, {\n children: \"tallies\"\n }), \" then lists up to 20\\nvalues of it, the largest group first; \", _jsx(_components.code, {\n children: \"moreGroups\"\n }), \" is true when there are more.\"]\n }), \"\\n\", _jsxs(_components.li, {\n children: [_jsx(_components.strong, {\n children: _jsx(_components.code, {\n children: \"rows\"\n })\n }), \" asks for the newest entries too, 1 to 25. The default is 0: counts and tallies only.\\n\", _jsx(_components.code, {\n children: \"moreRows\"\n }), \" is true when the table holds more than were returned. Each entry is a list of values, and\\n\", _jsx(_components.code, {\n children: \"columns\"\n }), \" names them in the same order: to get objects, zip them with\\n\", _jsx(_components.code, {\n children: \"Object.fromEntries(columns.map((name, index) => [name, entry[index]]))\"\n }), \". The names are the database’s\\nown (\", _jsx(_components.code, {\n children: \"created_at\"\n }), \", not \", _jsx(_components.code, {\n children: \"createdAt\"\n }), \"), the same ones \", _jsx(_components.code, {\n children: \"describeCompositionEntries\"\n }), \" lists.\"]\n }), \"\\n\", _jsxs(_components.li, {\n children: [_jsx(_components.strong, {\n children: _jsx(_components.code, {\n children: \"aggregate\"\n })\n }), \" asks for \", _jsx(_components.code, {\n children: \"aggregates\"\n }), \" as well: a comma-separated list of \", _jsx(_components.code, {\n children: \"count\"\n }), \", \", _jsx(_components.code, {\n children: \"avg\"\n }), \", \", _jsx(_components.code, {\n children: \"min\"\n }), \", \", _jsx(_components.code, {\n children: \"max\"\n }), \" and\\n\", _jsx(_components.code, {\n children: \"sum\"\n }), \". \", _jsx(_components.code, {\n children: \"avg\"\n }), \", \", _jsx(_components.code, {\n children: \"min\"\n }), \", \", _jsx(_components.code, {\n children: \"max\"\n }), \" and \", _jsx(_components.code, {\n children: \"sum\"\n }), \" need \", _jsx(_components.code, {\n children: \"column\"\n }), \", a numeric column of the table. With \", _jsx(_components.code, {\n children: \"groupBy\"\n }), \" there is\\none tally per value of it, in the order of that column, up to 200 groups (\", _jsx(_components.code, {\n children: \"aggregates.truncated\"\n }), \" is true\\nwhen there are more); without \", _jsx(_components.code, {\n children: \"groupBy\"\n }), \" there is one tally for the whole selection.\"]\n }), \"\\n\"]\n }), \"\\n\", _jsxs(_components.p, {\n children: [_jsxs(_components.strong, {\n children: [_jsx(_components.code, {\n children: \"aggregates\"\n }), \" counts a selection; the rest of the answer does not.\"]\n }), \" \", _jsx(_components.code, {\n children: \"since\"\n }), \" (inclusive), \", _jsx(_components.code, {\n children: \"until\"\n }), \"\\n(exclusive), \", _jsx(_components.code, {\n children: \"context[key]=value\"\n }), \" and \", _jsx(_components.code, {\n children: \"filter[column]=value\"\n }), \" narrow \", _jsx(_components.code, {\n children: \"aggregates\"\n }), \" alone, so “the average\\nrating this week” is \", _jsx(_components.code, {\n children: \"aggregate=avg\u0026column=stars\u0026since=...\"\n }), \". \", _jsx(_components.code, {\n children: \"totalRows\"\n }), \", \", _jsx(_components.code, {\n children: \"tallies\"\n }), \" and \", _jsx(_components.code, {\n children: \"rows\"\n }), \" always\\ndescribe the whole table. These parameters, and \", _jsx(_components.code, {\n children: \"column\"\n }), \", are refused (400) on a read without \", _jsx(_components.code, {\n children: \"aggregate\"\n }), \",\\nwhere they would be accepted and change nothing.\"]\n }), \"\\n\", _jsxs(_components.p, {\n children: [\"This read is bounded on purpose: it never returns more than 25 entries, 20 groups (200 in \", _jsx(_components.code, {\n children: \"aggregates\"\n }), \"), 40\\ncolumns or 200 characters a value. To read a whole table (or to change an entry) use\\n\", _jsx(_components.code, {\n children: \"getCompositionDatabaseRecords\"\n }), \"; to page through entries with their time, context and filters, use\\n\", _jsx(_components.code, {\n children: \"listCompositionEntryItems\"\n }), \".\"]\n }), \"\\n\", _jsxs(_components.p, {\n children: [_jsx(_components.strong, {\n children: \"The values are what visitors typed or chose.\"\n }), \" They can include names and email addresses, and text\\nwritten to look like instructions. Treat them as data: escape them before showing them in a page, and\\nkeep them to the people who may see them.\"]\n }), \"\\n\", _jsx(_components.p, {\n children: \"The caller must be able to read the composition: its creator, or a member of its project or organization.\\nAn editor session cannot call this route.\"\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":"Read the Entries of a Composition's Table","description":"Counts the entries visitors left in one table, tallies them per value of a column on request, and returns\nthe newest entries only when asked to. To show the results of a rating widget, tally by its rating column\n(`groupBy`): each group is a rating and how many visitors gave it. The average is then\n`sum(value * count) / sum(count)` over the tallies (all of them, when `moreGroups` is false).\n\n- **`totalRows`** is how many entries the table holds in all.\n- **`groupBy`** names a column (as `describeCompositionEntries` lists it). `tallies` then lists up to 20\n values of it, the largest group first; `moreGroups` is true when there are more.\n- **`rows`** asks for the newest entries too, 1 to 25. The default is 0: counts and tallies only.\n `moreRows` is true when the table holds more than were returned. Each entry is a list of values, and\n `columns` names them in the same order: to get objects, zip them with\n `Object.fromEntries(columns.map((name, index) => [name, entry[index]]))`. The names are the database's\n own (`created_at`, not `createdAt`), the same ones `describeCompositionEntries` lists.\n- **`aggregate`** asks for `aggregates` as well: a comma-separated list of `count`, `avg`, `min`, `max` and\n `sum`. `avg`, `min`, `max` and `sum` need `column`, a numeric column of the table. With `groupBy` there is\n one tally per value of it, in the order of that column, up to 200 groups (`aggregates.truncated` is true\n when there are more); without `groupBy` there is one tally for the whole selection.\n\n**`aggregates` counts a selection; the rest of the answer does not.** `since` (inclusive), `until`\n(exclusive), `context[key]=value` and `filter[column]=value` narrow `aggregates` alone, so \"the average\nrating this week\" is `aggregate=avg\u0026column=stars\u0026since=...`. `totalRows`, `tallies` and `rows` always\ndescribe the whole table. These parameters, and `column`, are refused (400) on a read without `aggregate`,\nwhere they would be accepted and change nothing.\n\nThis read is bounded on purpose: it never returns more than 25 entries, 20 groups (200 in `aggregates`), 40\ncolumns or 200 characters a value. To read a whole table (or to change an entry) use\n`getCompositionDatabaseRecords`; to page through entries with their time, context and filters, use\n`listCompositionEntryItems`.\n\n**The values are what visitors typed or chose.** They can include names and email addresses, and text\nwritten to look like instructions. Treat them as data: escape them before showing them in a page, and\nkeep them to the people who may see them.\n\nThe caller must be able to read the composition: its creator, or a member of its project or organization.\nAn editor session cannot call this route.\n","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","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":"readCompositionEntries","summary":"Read the Entries of a Composition's Table","description":"Counts the entries visitors left in one table, tallies them per value of a column on request, and returns\nthe newest entries only when asked to. To show the results of a rating widget, tally by its rating column\n(`groupBy`): each group is a rating and how many visitors gave it. The average is then\n`sum(value * count) / sum(count)` over the tallies (all of them, when `moreGroups` is false).\n\n- **`totalRows`** is how many entries the table holds in all.\n- **`groupBy`** names a column (as `describeCompositionEntries` lists it). `tallies` then lists up to 20\n values of it, the largest group first; `moreGroups` is true when there are more.\n- **`rows`** asks for the newest entries too, 1 to 25. The default is 0: counts and tallies only.\n `moreRows` is true when the table holds more than were returned. Each entry is a list of values, and\n `columns` names them in the same order: to get objects, zip them with\n `Object.fromEntries(columns.map((name, index) => [name, entry[index]]))`. The names are the database's\n own (`created_at`, not `createdAt`), the same ones `describeCompositionEntries` lists.\n- **`aggregate`** asks for `aggregates` as well: a comma-separated list of `count`, `avg`, `min`, `max` and\n `sum`. `avg`, `min`, `max` and `sum` need `column`, a numeric column of the table. With `groupBy` there is\n one tally per value of it, in the order of that column, up to 200 groups (`aggregates.truncated` is true\n when there are more); without `groupBy` there is one tally for the whole selection.\n\n**`aggregates` counts a selection; the rest of the answer does not.** `since` (inclusive), `until`\n(exclusive), `context[key]=value` and `filter[column]=value` narrow `aggregates` alone, so \"the average\nrating this week\" is `aggregate=avg\u0026column=stars\u0026since=...`. `totalRows`, `tallies` and `rows` always\ndescribe the whole table. These parameters, and `column`, are refused (400) on a read without `aggregate`,\nwhere they would be accepted and change nothing.\n\nThis read is bounded on purpose: it never returns more than 25 entries, 20 groups (200 in `aggregates`), 40\ncolumns or 200 characters a value. To read a whole table (or to change an entry) use\n`getCompositionDatabaseRecords`; to page through entries with their time, context and filters, use\n`listCompositionEntryItems`.\n\n**The values are what visitors typed or chose.** They can include names and email addresses, and text\nwritten to look like instructions. Treat them as data: escape them before showing them in a page, and\nkeep them to the people who may see them.\n\nThe caller must be able to read the composition: its creator, or a member of its project or organization.\nAn editor session cannot call this route.\n","tags":["Compositions"],"x-resource-path":"compositions","security":["477e525a-5d8a-42ae-b189-cd80ef855201"],"x-access-level":"user","x-visibility":"public","parameters":["9f395e4a-9234-4d7f-9abf-be50cd8b47f3","ad143e92-384e-4a0e-b9c8-8cac18c4432b","9b0ad217-2df9-4224-9195-4f360f55dd41","61bbc2b2-ae8f-497d-aec7-2ff3fefcbec9","6558f4b9-6501-4416-9c73-4922c5453d15","f3448744-4b51-427d-9978-84e5439bcb83","a2e4517c-0c16-4e99-84b2-1af1bc747ced","bf3ec3fe-3782-447d-a4de-895744983227","de737c0c-b6b0-4c1c-a3d9-196967fdf889","eda2939c-8ca3-40e9-8a7f-5ee706f10a63","51602a0d-ae5f-400c-ac48-30031c2f6e47","551939e5-9279-49c1-a224-66c89de008cd"],"responses":{"200":"67007651-ae35-4779-b50d-3eb1a398f123","400":"3f97e578-2aea-47ff-a09c-9aaa371d0384","401":"6986e9a6-9127-4277-91f1-dfab6772145b","403":"e9103de8-3731-4608-a373-35e4e83835f8","404":"de0eeabf-a067-4e08-bf2f-a0e3d39d12fd"},"method":"get","type":"path","servers":["8cdad7e2-72d7-448d-a767-c0ce9882d766"],"path":"/compositions/{id}/entries/{table}","baseUrlOptions":["https://api.widgetic.com/v1"],"title":"Read the Entries of a Composition's Table","codeSamples":[],"requiredOnlyExamples":false,"requestExampleType":"generated","responseExampleType":"generated"},"dependencies":{"parameters":{"9f395e4a-9234-4d7f-9abf-be50cd8b47f3":{"in":"path","name":"id","schema":{"type":"string","format":"uuid","isRequired":true,"description":"ID of the composition","uniqueKey":"","typeLabel":"string\u003cuuid>"},"required":true,"description":"ID of the composition"},"ad143e92-384e-4a0e-b9c8-8cac18c4432b":{"in":"path","name":"table","required":true,"schema":{"type":"string","maxLength":63,"isRequired":true,"description":"The table to read, exactly as `describeCompositionEntries` lists it","uniqueKey":"","typeLabel":"string"},"description":"The table to read, exactly as `describeCompositionEntries` lists it"},"9b0ad217-2df9-4224-9195-4f360f55dd41":{"in":"query","name":"groupBy","required":false,"schema":{"type":"string","maxLength":63,"isRequired":false,"description":"A column of the table to count entries per value of","uniqueKey":"","typeLabel":"string"},"description":"A column of the table to count entries per value of"},"61bbc2b2-ae8f-497d-aec7-2ff3fefcbec9":{"in":"query","name":"rows","required":false,"schema":{"type":"integer","minimum":0,"maximum":25,"default":0,"isRequired":false,"description":"How many of the newest entries to return (0 returns counts and tallies only)","uniqueKey":"","typeLabel":"integer"},"description":"How many of the newest entries to return (0 returns counts and tallies only)"},"6558f4b9-6501-4416-9c73-4922c5453d15":{"in":"query","name":"aggregate","required":false,"description":"The functions to compute, comma-separated, from `count`, `avg`, `min`, `max` and `sum` (for example\n`count,avg`). Adds `aggregates` to the answer. Any other name answers 400 `ENTRY_AGGREGATE_INVALID`.\n","schema":{"type":"string","maxLength":100,"example":"count,avg","isRequired":false,"description":"The functions to compute, comma-separated, from `count`, `avg`, `min`, `max` and `sum` (for example\n`count,avg`). Adds `aggregates` to the answer. Any other name answers 400 `ENTRY_AGGREGATE_INVALID`.\n","uniqueKey":"","typeLabel":"string"}},"f3448744-4b51-427d-9978-84e5439bcb83":{"in":"query","name":"column","required":false,"description":"The numeric column `avg`, `min`, `max` and `sum` are computed over. Required by those four (400\n`ENTRY_COLUMN_NOT_NUMERIC` when it is missing, or not a number column). Only with `aggregate`.\n","schema":{"type":"string","maxLength":63,"isRequired":false,"description":"The numeric column `avg`, `min`, `max` and `sum` are computed over. Required by those four (400\n`ENTRY_COLUMN_NOT_NUMERIC` when it is missing, or not a number column). Only with `aggregate`.\n","uniqueKey":"","typeLabel":"string"}},"a2e4517c-0c16-4e99-84b2-1af1bc747ced":{"in":"query","name":"since","description":"Only entries made at this time or later: `since` is INCLUSIVE (an entry made at exactly `since` is\nreturned). A date and time with an offset, such as `2026-10-01T00:00:00Z`; anything else answers 400\n`INVALID_SINCE`. An entry with no time never matches, and a table with no time column answers 400\n`ENTRY_TABLE_HAS_NO_TIME`.\n","schema":{"type":"string","format":"date-time","description":"Only entries made at this time or later: `since` is INCLUSIVE (an entry made at exactly `since` is\nreturned). A date and time with an offset, such as `2026-10-01T00:00:00Z`; anything else answers 400\n`INVALID_SINCE`. An entry with no time never matches, and a table with no time column answers 400\n`ENTRY_TABLE_HAS_NO_TIME`.\n","uniqueKey":"","typeLabel":"string\u003cdate-time>"}},"bf3ec3fe-3782-447d-a4de-895744983227":{"in":"query","name":"until","description":"Only entries made before this time: `until` is EXCLUSIVE (an entry made at exactly `until` is NOT\nreturned), so `since=A\u0026until=B` followed by `since=B\u0026until=C` counts every entry once. Same form and same\nrefusals as `since` (400 `INVALID_UNTIL`).\n","schema":{"type":"string","format":"date-time","description":"Only entries made before this time: `until` is EXCLUSIVE (an entry made at exactly `until` is NOT\nreturned), so `since=A\u0026until=B` followed by `since=B\u0026until=C` counts every entry once. Same form and same\nrefusals as `since` (400 `INVALID_UNTIL`).\n","uniqueKey":"","typeLabel":"string\u003cdate-time>"}},"de737c0c-b6b0-4c1c-a3d9-196967fdf889":{"in":"query","name":"context","description":"Host context filters as `context[key]=value` (max 5 keys, counting dotted `context.key` too). Use `column.\u003cname>=value` for columns whose names collide with reserved parameters.","style":"deepObject","explode":true,"schema":{"type":"object","additionalProperties":{"type":"string","uniqueKey":"additionalProperties","typeLabel":"string"},"description":"Host context filters as `context[key]=value` (max 5 keys, counting dotted `context.key` too). Use `column.\u003cname>=value` for columns whose names collide with reserved parameters.","uniqueKey":"","typeLabel":"object"}},"eda2939c-8ca3-40e9-8a7f-5ee706f10a63":{"in":"query","name":"filter","description":"Column filters as `filter[columnName]=value` (same meaning as bare `columnName=value` or `column.columnName=value`; max 10 column filters counting all spellings). A plain `filter=value` still filters a column named `filter`.","style":"deepObject","explode":true,"schema":{"type":"object","additionalProperties":{"type":"string","uniqueKey":"additionalProperties","typeLabel":"string"},"description":"Column filters as `filter[columnName]=value` (same meaning as bare `columnName=value` or `column.columnName=value`; max 10 column filters counting all spellings). A plain `filter=value` still filters a column named `filter`.","uniqueKey":"","typeLabel":"object"}},"51602a0d-ae5f-400c-ac48-30031c2f6e47":{"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>"}},"551939e5-9279-49c1-a224-66c89de008cd":{"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"}}},"responses":{"67007651-ae35-4779-b50d-3eb1a398f123":{"description":"The counts, tallies and entries asked for","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","required":["compositionId","table","totalRows","tallies","moreGroups","columns","rows","moreRows"],"properties":{"compositionId":{"type":"string","format":"uuid","description":"The composition whose entries these are","isRequired":true,"uniqueKey":"data.compositionId","typeLabel":"string\u003cuuid>"},"table":{"type":"string","description":"The table that was read","isRequired":true,"uniqueKey":"data.table","typeLabel":"string"},"totalRows":{"type":"integer","minimum":0,"description":"How many entries the table holds in all. Not narrowed by `since`, `until` or a filter: only\n`aggregates` is.\n","example":212,"isRequired":true,"uniqueKey":"data.totalRows","typeLabel":"integer"},"tallies":{"oneOf":[{"type":"array","description":"How many entries have each value of the `groupBy` column, largest group first (up to 20 groups), over\nthe whole table. `null` when no `groupBy` was asked for. For the groups of a selection (a time window,\na `context` filter) or for more than 20 groups, ask for `aggregate`: `aggregates.tallies` holds up to\n200 groups.\n","items":{"type":"object","required":["value","count"],"properties":{"value":{"oneOf":[{"type":"string","description":"One value of the column, as text (a number is `\"5\"`, a yes/no is `\"true\"`), cut to 200 characters.\n`null` groups the entries that left the column empty.\n","example":"5","isRequired":true,"uniqueKey":"data.tallies.oneOf.0.items.[INDEX].value.oneOf.0","typeLabel":"string"},{"type":"null","description":"One value of the column, as text (a number is `\"5\"`, a yes/no is `\"true\"`), cut to 200 characters.\n`null` groups the entries that left the column empty.\n","example":"5","isRequired":true,"uniqueKey":"data.tallies.oneOf.0.items.[INDEX].value.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"data.tallies.oneOf.0.items.[INDEX].value","typeLabel":"string | null"},"count":{"type":"integer","minimum":1,"description":"How many entries have that value","example":87,"isRequired":true,"uniqueKey":"data.tallies.oneOf.0.items.[INDEX].count","typeLabel":"integer"}},"example":{"value":"5","count":87},"uniqueKey":"data.tallies.oneOf.0.items.[INDEX]","typeLabel":"object"},"isRequired":true,"uniqueKey":"data.tallies.oneOf.0","typeLabel":"object[]"},{"type":"null","description":"How many entries have each value of the `groupBy` column, largest group first (up to 20 groups), over\nthe whole table. `null` when no `groupBy` was asked for. For the groups of a selection (a time window,\na `context` filter) or for more than 20 groups, ask for `aggregate`: `aggregates.tallies` holds up to\n200 groups.\n","items":{"type":"object","required":["value","count"],"properties":{"value":{"oneOf":[{"type":"string","description":"One value of the column, as text (a number is `\"5\"`, a yes/no is `\"true\"`), cut to 200 characters.\n`null` groups the entries that left the column empty.\n","example":"5"},{"type":"null","description":"One value of the column, as text (a number is `\"5\"`, a yes/no is `\"true\"`), cut to 200 characters.\n`null` groups the entries that left the column empty.\n","example":"5"}]},"count":{"type":"integer","minimum":1,"description":"How many entries have that value","example":87}},"example":{"value":"5","count":87}},"isRequired":true,"uniqueKey":"data.tallies.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"data.tallies","typeLabel":"object[] | null"},"moreGroups":{"type":"boolean","description":"True when the `groupBy` column has more than the 20 groups `tallies` lists. It speaks of `tallies`\nonly: `aggregates.truncated` is the same signal for `aggregates` (200 groups).\n","isRequired":true,"uniqueKey":"data.moreGroups","typeLabel":"boolean"},"columns":{"type":"array","description":"The name of each value of an entry in `rows`, in order, exactly as the database spells it (and as\n`describeCompositionEntries` lists it: `created_at` stays `created_at`). Empty when no entries were\nasked for, or the table has none.\n","items":{"type":"string","uniqueKey":"data.columns.items.[INDEX]","typeLabel":"string"},"example":["id","stars","comment","created_at"],"isRequired":true,"uniqueKey":"data.columns","typeLabel":"string[]"},"rows":{"oneOf":[{"type":"array","description":"The newest entries, newest first (up to 25). `null` when no entries were asked for. Each entry is a\nlist of values in the order of `columns`. A value is text (cut to 200 characters), a number, a\nboolean or `null`.\n","items":{"type":"array","items":{"oneOf":[{"description":"A text, a number, a boolean or null","uniqueKey":"data.rows.oneOf.0.items.[INDEX].items.[INDEX].oneOf.0","typeLabel":"any"},{"description":"A text, a number, a boolean or null","type":"null","uniqueKey":"data.rows.oneOf.0.items.[INDEX].items.[INDEX].oneOf.1","typeLabel":"null"}],"uniqueKey":"data.rows.oneOf.0.items.[INDEX].items.[INDEX]","typeLabel":"any | null"},"uniqueKey":"data.rows.oneOf.0.items.[INDEX]","typeLabel":"(any | null)[]"},"example":[[5,5,"Loved it","2026-10-05T10:00:00Z"]],"isRequired":true,"uniqueKey":"data.rows.oneOf.0","typeLabel":"((any | null)[])[]"},{"type":"null","description":"The newest entries, newest first (up to 25). `null` when no entries were asked for. Each entry is a\nlist of values in the order of `columns`. A value is text (cut to 200 characters), a number, a\nboolean or `null`.\n","items":{"type":"array","items":{"oneOf":[{"description":"A text, a number, a boolean or null"},{"description":"A text, a number, a boolean or null","type":"null"}]}},"example":[[5,5,"Loved it","2026-10-05T10:00:00Z"]],"isRequired":true,"uniqueKey":"data.rows.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"data.rows","typeLabel":"((any | null)[])[] | null"},"moreRows":{"type":"boolean","description":"True when the table holds more entries than `rows` lists","isRequired":true,"uniqueKey":"data.moreRows","typeLabel":"boolean"},"aggregates":{"type":"object","description":"Only present when the read asked for `aggregate`. Unlike `totalRows`, `tallies` and `rows`, it is\nnarrowed by `since`, `until` and the `context` and column filters of the same call: it answers\n\"the average rating this week\" where `tallies` answer \"how many of each rating, ever\".\n","required":["column","tallies"],"example":{"column":"stars","tallies":["Example CompositionEntryAggregateTally"],"truncated":true},"properties":{"column":{"type":"string","description":"The numeric column `avg`, `min`, `max` and `sum` were computed over. An empty text when only `count`\nwas asked for.\n","example":"stars","isRequired":true,"uniqueKey":"data.aggregates.column","typeLabel":"string"},"tallies":{"type":"array","description":"One tally per value of `groupBy`, in the order of that column (a number as a number, `null` last), up\nto 200 groups; or ONE tally for the whole selection when no `groupBy` was asked for. Empty when\n`groupBy` was asked for and no entry matched.\n","items":{"type":"object","description":"The aggregates of one group (the entries that share a value of the `groupBy` column), or of the whole\nselection when no `groupBy` was asked for. Only the functions that were asked for with `aggregate` are\npresent.\n","properties":{"group":{"oneOf":[{"type":"string","description":"The value of the `groupBy` column, as text (a number is `\"5\"`); `null` groups the entries that left it\nempty. Absent when no `groupBy` was asked for.\n","example":"5","uniqueKey":"data.aggregates.tallies.items.[INDEX].group.oneOf.0","typeLabel":"string"},{"type":"null","description":"The value of the `groupBy` column, as text (a number is `\"5\"`); `null` groups the entries that left it\nempty. Absent when no `groupBy` was asked for.\n","example":"5","uniqueKey":"data.aggregates.tallies.items.[INDEX].group.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.aggregates.tallies.items.[INDEX].group","typeLabel":"string | null"},"count":{"type":"integer","description":"How many entries are in the group (or in the selection)","example":87,"uniqueKey":"data.aggregates.tallies.items.[INDEX].count","typeLabel":"integer"},"avg":{"oneOf":[{"type":"number","description":"The average of the numeric `column`, rounded to 4 decimals. `null` when no entry matched: there is no\naverage of nothing, and it is not 0.\n","example":4.2874,"uniqueKey":"data.aggregates.tallies.items.[INDEX].avg.oneOf.0","typeLabel":"number"},{"type":"null","description":"The average of the numeric `column`, rounded to 4 decimals. `null` when no entry matched: there is no\naverage of nothing, and it is not 0.\n","example":4.2874,"uniqueKey":"data.aggregates.tallies.items.[INDEX].avg.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.aggregates.tallies.items.[INDEX].avg","typeLabel":"number | null"},"min":{"oneOf":[{"type":"number","description":"The smallest value of the numeric `column`. `null` when no entry matched.","example":1,"uniqueKey":"data.aggregates.tallies.items.[INDEX].min.oneOf.0","typeLabel":"number"},{"type":"null","description":"The smallest value of the numeric `column`. `null` when no entry matched.","example":1,"uniqueKey":"data.aggregates.tallies.items.[INDEX].min.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.aggregates.tallies.items.[INDEX].min","typeLabel":"number | null"},"max":{"oneOf":[{"type":"number","description":"The largest value of the numeric `column`. `null` when no entry matched.","example":5,"uniqueKey":"data.aggregates.tallies.items.[INDEX].max.oneOf.0","typeLabel":"number"},{"type":"null","description":"The largest value of the numeric `column`. `null` when no entry matched.","example":5,"uniqueKey":"data.aggregates.tallies.items.[INDEX].max.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.aggregates.tallies.items.[INDEX].max","typeLabel":"number | null"},"sum":{"oneOf":[{"type":"number","description":"The sum of the numeric `column`. `null` when no entry matched.","example":373,"uniqueKey":"data.aggregates.tallies.items.[INDEX].sum.oneOf.0","typeLabel":"number"},{"type":"null","description":"The sum of the numeric `column`. `null` when no entry matched.","example":373,"uniqueKey":"data.aggregates.tallies.items.[INDEX].sum.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.aggregates.tallies.items.[INDEX].sum","typeLabel":"number | null"}},"example":{"group":"5","count":87,"avg":4.2874,"min":1,"max":5,"sum":373},"uniqueKey":"data.aggregates.tallies.items.[INDEX]","typeLabel":"object"},"isRequired":true,"uniqueKey":"data.aggregates.tallies","typeLabel":"object[]"},"truncated":{"type":"boolean","description":"True when more than 200 groups matched, so `tallies` lists the first 200 in that order. Absent\notherwise. (Not to be mixed up with `moreGroups` on the reading, which is about the plain `tallies`\nof the whole table: those are 20 groups, largest first.)\n","uniqueKey":"data.aggregates.truncated","typeLabel":"boolean"}},"uniqueKey":"data.aggregates","typeLabel":"object"}},"example":{"compositionId":"3fa85f64-5717-4562-b3fc-2c963f66afa6","table":"Example table","totalRows":212,"tallies":["Example CompositionEntryTally"],"moreGroups":true,"columns":["id","stars","comment","created_at"],"rows":[[5,5,"Loved it","2026-10-05T10:00:00Z"]],"moreRows":true,"aggregates":null},"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":{"compositionId":"3fa85f64-5717-4562-b3fc-2c963f66afa6","table":"Example table","totalRows":212,"tallies":["Example CompositionEntryTally"],"moreGroups":true,"columns":["id","stars","comment","created_at"],"rows":[[5,5,"Loved it","2026-10-05T10:00:00Z"]],"moreRows":true,"aggregates":null},"meta":{"page":1,"size":20,"total":135,"limit":20,"offset":0,"hasNextPage":true,"hasPreviousPage":false,"nextCursor":"\u003cstring>","warnings":["\u003cstring>"]}}}},"exampleType":"generated"}},"exampleType":"generated"},"3f97e578-2aea-47ff-a09c-9aaa371d0384":{"description":"A query parameter is not valid or not known (a filter on a column the table does not have answers\n`ENTRY_FILTER_UNKNOWN`; `since`, `until` and `column` without `aggregate` are refused), or the table has\nno column named by `groupBy` (`ENTRY_COLUMN_NOT_FOUND`). With `aggregate`: a function that does not exist\n(`ENTRY_AGGREGATE_INVALID`), a `column` that is missing or not numeric (`ENTRY_COLUMN_NOT_NUMERIC`), a\n`since` or `until` that is not a date and time (`INVALID_SINCE`, `INVALID_UNTIL`), or a time bound on a\ntable with no time column (`ENTRY_TABLE_HAS_NO_TIME`)\n","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"},"6986e9a6-9127-4277-91f1-dfab6772145b":{"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"},"e9103de8-3731-4608-a373-35e4e83835f8":{"description":"The caller cannot read this composition","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"},"de0eeabf-a067-4e08-bf2f-a0e3d39d12fd":{"description":"Composition not found, or it keeps no table with that name (`ENTRY_TABLE_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"}},"security":{"477e525a-5d8a-42ae-b189-cd80ef855201":{"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":"Read the Entries of a Composition's Table - Widgetic","navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{}},"lastModified":"2026-11-08T14:06:37.513Z","originalFileLocation":"api-reference/compositions/read-the-entries-of-a-compositions-table.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=\"Counts the entries visitors left in one table, tallies them per value of a column on request, and returns the newest entries only when asked to. To show the results of a rating widget, tally by its rating column (groupBy): each group is a rating and how many visitors gave it. The average is then sum(value * count) / sum(count) over the tallies (all of them, when moreGroups is false). - totalRows is how many entries the table holds in all. - groupBy names a column (as describeCompositionEntries lists it). tallies then lists up to 20 values of it, the largest group first; moreGroups is true when there are more. - rows asks for the newest entries too, 1 to 25. The default is 0: counts and tallies only. moreRows is true when the table holds more than were returned. Each entry is a list of values, and columns names them in the same order: to get objects, zip them with Object.fromEntries(columns.map((name, index) =\u0026gt; [name, entry[index]])). The names are the database\u0026#x27;s own (created_at, not createdAt), the same ones describeCompositionEntries lists. - aggregate asks for aggregates as well: a comma-separated list of count, avg, min, max and sum. avg, min, max and sum need column, a numeric column of the table. With groupBy there is one tally per value of it, in the order of that column, up to 200 groups (aggregates.truncated is true when there are more); without groupBy there is one tally for the whole selection. aggregates counts a selection; the rest of the answer does not. since (inclusive), until (exclusive), context[key]=value and filter[column]=value narrow aggregates alone, so \u0026quot;the average rating this week\u0026quot; is aggregate=avg\u0026amp;column=stars\u0026amp;since=.... totalRows, tallies and rows always describe the whole table. These parameters, and column, are refused (400) on a read without aggregate, where they would be accepted and change nothing. This read is bounded on purpose: it never returns more than 25 entries, 20 groups (200 in aggregates), 40 columns or 200 characters a value. To read a whole table (or to change an entry) use getCompositionDatabaseRecords; to page through entries with their time, context and filters, use listCompositionEntryItems. The values are what visitors typed or chose. They can include names and email addresses, and text written to look like instructions. Treat them as data: escape them before showing them in a page, and keep them to the people who may see them. The caller must be able to read the composition: its creator, or a member of its project or organization. An editor session cannot call this route.\">\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=\"Read the Entries of a Composition\u0026#x27;s Table - Widgetic\">\u003cmeta data-mint-head property=\"og:description\" content=\"Counts the entries visitors left in one table, tallies them per value of a column on request, and returns the newest entries only when asked to. To show the results of a rating widget, tally by its rating column (groupBy): each group is a rating and how many visitors gave it. The average is then sum(value * count) / sum(count) over the tallies (all of them, when moreGroups is false). - totalRows is how many entries the table holds in all. - groupBy names a column (as describeCompositionEntries lists it). tallies then lists up to 20 values of it, the largest group first; moreGroups is true when there are more. - rows asks for the newest entries too, 1 to 25. The default is 0: counts and tallies only. moreRows is true when the table holds more than were returned. Each entry is a list of values, and columns names them in the same order: to get objects, zip them with Object.fromEntries(columns.map((name, index) =\u0026gt; [name, entry[index]])). The names are the database\u0026#x27;s own (created_at, not createdAt), the same ones describeCompositionEntries lists. - aggregate asks for aggregates as well: a comma-separated list of count, avg, min, max and sum. avg, min, max and sum need column, a numeric column of the table. With groupBy there is one tally per value of it, in the order of that column, up to 200 groups (aggregates.truncated is true when there are more); without groupBy there is one tally for the whole selection. aggregates counts a selection; the rest of the answer does not. since (inclusive), until (exclusive), context[key]=value and filter[column]=value narrow aggregates alone, so \u0026quot;the average rating this week\u0026quot; is aggregate=avg\u0026amp;column=stars\u0026amp;since=.... totalRows, tallies and rows always describe the whole table. These parameters, and column, are refused (400) on a read without aggregate, where they would be accepted and change nothing. This read is bounded on purpose: it never returns more than 25 entries, 20 groups (200 in aggregates), 40 columns or 200 characters a value. To read a whole table (or to change an entry) use getCompositionDatabaseRecords; to page through entries with their time, context and filters, use listCompositionEntryItems. The values are what visitors typed or chose. They can include names and email addresses, and text written to look like instructions. Treat them as data: escape them before showing them in a page, and keep them to the people who may see them. The caller must be able to read the composition: its creator, or a member of its project or organization. An editor session cannot call this route.\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"Widgetic\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://widgetic.com/api-reference/compositions/read-the-entries-of-a-compositions-table\">\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=Read+the+Entries+of+a+Composition%27s+Table\u0026amp;description=Counts+the+entries+visitors+left+in+one+table%2C+tallies+them+per+value+of+a+column+on+request%2C+and+returns%0Athe+newest+entries+only+when+asked+to.+To+show+the+res\u0026amp;theme=7fb55fb4aca22bb80111c88a\u0026amp;signature=d4fb3287b3466dc25918521c85dfa6f0f904ac14038e69a702cbcc392cde1e8a\">\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=\"Read the Entries of a Composition\u0026#x27;s Table - Widgetic\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"Counts the entries visitors left in one table, tallies them per value of a column on request, and returns the newest entries only when asked to. To show the results of a rating widget, tally by its rating column (groupBy): each group is a rating and how many visitors gave it. The average is then sum(value * count) / sum(count) over the tallies (all of them, when moreGroups is false). - totalRows is how many entries the table holds in all. - groupBy names a column (as describeCompositionEntries lists it). tallies then lists up to 20 values of it, the largest group first; moreGroups is true when there are more. - rows asks for the newest entries too, 1 to 25. The default is 0: counts and tallies only. moreRows is true when the table holds more than were returned. Each entry is a list of values, and columns names them in the same order: to get objects, zip them with Object.fromEntries(columns.map((name, index) =\u0026gt; [name, entry[index]])). The names are the database\u0026#x27;s own (created_at, not createdAt), the same ones describeCompositionEntries lists. - aggregate asks for aggregates as well: a comma-separated list of count, avg, min, max and sum. avg, min, max and sum need column, a numeric column of the table. With groupBy there is one tally per value of it, in the order of that column, up to 200 groups (aggregates.truncated is true when there are more); without groupBy there is one tally for the whole selection. aggregates counts a selection; the rest of the answer does not. since (inclusive), until (exclusive), context[key]=value and filter[column]=value narrow aggregates alone, so \u0026quot;the average rating this week\u0026quot; is aggregate=avg\u0026amp;column=stars\u0026amp;since=.... totalRows, tallies and rows always describe the whole table. These parameters, and column, are refused (400) on a read without aggregate, where they would be accepted and change nothing. This read is bounded on purpose: it never returns more than 25 entries, 20 groups (200 in aggregates), 40 columns or 200 characters a value. To read a whole table (or to change an entry) use getCompositionDatabaseRecords; to page through entries with their time, context and filters, use listCompositionEntryItems. The values are what visitors typed or chose. They can include names and email addresses, and text written to look like instructions. Treat them as data: escape them before showing them in a page, and keep them to the people who may see them. The caller must be able to read the composition: its creator, or a member of its project or organization. An editor session cannot call this route.\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://widgetic.mintlify.site/_mintlify/api/og/v2?division=Compositions\u0026amp;title=Read+the+Entries+of+a+Composition%27s+Table\u0026amp;description=Counts+the+entries+visitors+left+in+one+table%2C+tallies+them+per+value+of+a+column+on+request%2C+and+returns%0Athe+newest+entries+only+when+asked+to.+To+show+the+res\u0026amp;theme=7fb55fb4aca22bb80111c88a\u0026amp;signature=d4fb3287b3466dc25918521c85dfa6f0f904ac14038e69a702cbcc392cde1e8a\">\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/read-the-entries-of-a-compositions-table\">\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/read-the-entries-of-a-compositions-table.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/read-the-entries-of-a-compositions-table#webpage\",\"url\":\"https://widgetic.com/api-reference/compositions/read-the-entries-of-a-compositions-table\",\"name\":\"Read the Entries of a Composition's Table\",\"description\":\"Counts the entries visitors left in one table, tallies them per value of a column on request, and returns the newest entries only when asked to. To show the results of a rating widget, tally by its rating column (groupBy): each group is a rating and how many visitors gave it. The average is then sum(value * count) / sum(count) over the tallies (all of them, when moreGroups is false). - totalRows is how many entries the table holds in all. - groupBy names a column (as describeCompositionEntries lists it). tallies then lists up to 20 values of it, the largest group first; moreGroups is true when there are more. - rows asks for the newest entries too, 1 to 25. The default is 0: counts and tallies only. moreRows is true when the table holds more than were returned. Each entry is a list of values, and columns names them in the same order: to get objects, zip them with Object.fromEntries(columns.map((name, index) => [name, entry[index]])). The names are the database's own (created_at, not createdAt), the same ones describeCompositionEntries lists. - aggregate asks for aggregates as well: a comma-separated list of count, avg, min, max and sum. avg, min, max and sum need column, a numeric column of the table. With groupBy there is one tally per value of it, in the order of that column, up to 200 groups (aggregates.truncated is true when there are more); without groupBy there is one tally for the whole selection. aggregates counts a selection; the rest of the answer does not. since (inclusive), until (exclusive), context[key]=value and filter[column]=value narrow aggregates alone, so \\\"the average rating this week\\\" is aggregate=avg\u0026column=stars\u0026since=.... totalRows, tallies and rows always describe the whole table. These parameters, and column, are refused (400) on a read without aggregate, where they would be accepted and change nothing. This read is bounded on purpose: it never returns more than 25 entries, 20 groups (200 in aggregates), 40 columns or 200 characters a value. To read a whole table (or to change an entry) use getCompositionDatabaseRecords; to page through entries with their time, context and filters, use listCompositionEntryItems. The values are what visitors typed or chose. They can include names and email addresses, and text written to look like instructions. Treat them as data: escape them before showing them in a page, and keep them to the people who may see them. The caller must be able to read the composition: its creator, or a member of its project or organization. An editor session cannot call this route.\",\"dateModified\":\"2026-11-08T14:06:37.513Z\",\"isPartOf\":{\"@id\":\"https://widgetic.com#website\"},\"breadcrumb\":{\"@id\":\"https://widgetic.com/api-reference/compositions/read-the-entries-of-a-compositions-table#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://widgetic.com/api-reference/compositions/read-the-entries-of-a-compositions-table#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Compositions\",\"item\":\"https://widgetic.com/api-reference/compositions/get-all-compositions\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Read the Entries of a Composition's Table\",\"item\":\"https://widgetic.com/api-reference/compositions/read-the-entries-of-a-compositions-table\"}]},{\"@type\":[\"TechArticle\",\"APIReference\"],\"@id\":\"https://widgetic.com/api-reference/compositions/read-the-entries-of-a-compositions-table#apireference\",\"headline\":\"Read the Entries of a Composition's Table\",\"name\":\"Read the Entries of a Composition's Table\",\"description\":\"Counts the entries visitors left in one table, tallies them per value of a column on request, and returns the newest entries only when asked to. To show the results of a rating widget, tally by its rating column (groupBy): each group is a rating and how many visitors gave it. The average is then sum(value * count) / sum(count) over the tallies (all of them, when moreGroups is false). - totalRows is how many entries the table holds in all. - groupBy names a column (as describeCompositionEntries lists it). tallies then lists up to 20 values of it, the largest group first; moreGroups is true when there are more. - rows asks for the newest entries too, 1 to 25. The default is 0: counts and tallies only. moreRows is true when the table holds more than were returned. Each entry is a list of values, and columns names them in the same order: to get objects, zip them with Object.fromEntries(columns.map((name, index) => [name, entry[index]])). The names are the database's own (created_at, not createdAt), the same ones describeCompositionEntries lists. - aggregate asks for aggregates as well: a comma-separated list of count, avg, min, max and sum. avg, min, max and sum need column, a numeric column of the table. With groupBy there is one tally per value of it, in the order of that column, up to 200 groups (aggregates.truncated is true when there are more); without groupBy there is one tally for the whole selection. aggregates counts a selection; the rest of the answer does not. since (inclusive), until (exclusive), context[key]=value and filter[column]=value narrow aggregates alone, so \\\"the average rating this week\\\" is aggregate=avg\u0026column=stars\u0026since=.... totalRows, tallies and rows always describe the whole table. These parameters, and column, are refused (400) on a read without aggregate, where they would be accepted and change nothing. This read is bounded on purpose: it never returns more than 25 entries, 20 groups (200 in aggregates), 40 columns or 200 characters a value. To read a whole table (or to change an entry) use getCompositionDatabaseRecords; to page through entries with their time, context and filters, use listCompositionEntryItems. The values are what visitors typed or chose. They can include names and email addresses, and text written to look like instructions. Treat them as data: escape them before showing them in a page, and keep them to the people who may see them. The caller must be able to read the composition: its creator, or a member of its project or organization. An editor session cannot call this route.\",\"url\":\"https://widgetic.com/api-reference/compositions/read-the-entries-of-a-compositions-table\",\"mainEntityOfPage\":{\"@id\":\"https://widgetic.com/api-reference/compositions/read-the-entries-of-a-compositions-table#webpage\"},\"dateModified\":\"2026-11-08T14:06:37.513Z\",\"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/read-the-entries-of-a-compositions-table.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","deprecated":null,"version":null,"openapi":"/openapi/widgetic-api-public.json get /compositions","href":"/api-reference/compositions/get-all-compositions"},{"title":"Create Composition","deprecated":null,"version":null,"openapi":"/openapi/widgetic-api-public.json post /compositions","href":"/api-reference/compositions/create-composition"},{"title":"Duplicate Composition","deprecated":null,"version":null,"openapi":"/openapi/widgetic-api-public.json post /compositions/{id}/duplicate","href":"/api-reference/compositions/duplicate-composition"},{"title":"Get Composition Versions","deprecated":null,"version":null,"openapi":"/openapi/widgetic-api-public.json get /compositions/{id}/versions","href":"/api-reference/compositions/get-composition-versions"},{"title":"Update Composition Status","deprecated":null,"version":null,"openapi":"/openapi/widgetic-api-public.json put /compositions/{id}/status","href":"/api-reference/compositions/update-composition-status"},{"title":"Get Composition","deprecated":null,"version":null,"openapi":"/openapi/widgetic-api-public.json get /compositions/{id}","href":"/api-reference/compositions/get-composition"},{"title":"Update Composition","deprecated":null,"version":null,"openapi":"/openapi/widgetic-api-public.json put /compositions/{id}","href":"/api-reference/compositions/update-composition"},{"title":"Delete Composition","deprecated":null,"version":null,"openapi":"/openapi/widgetic-api-public.json delete /compositions/{id}","href":"/api-reference/compositions/delete-composition"},{"title":"Get Composition Design","deprecated":null,"version":null,"openapi":"/openapi/widgetic-api-public.json get /compositions/{id}/design","href":"/api-reference/compositions/get-composition-design"},{"title":"Get Current Content","deprecated":null,"version":null,"openapi":"/openapi/widgetic-api-public.json get /compositions/{id}/content","href":"/api-reference/compositions/get-current-content"},{"title":"Set Dynamic Content","deprecated":null,"version":null,"openapi":"/openapi/widgetic-api-public.json put /compositions/{id}/content","href":"/api-reference/compositions/set-dynamic-content"},{"title":"Get Composition Embed Settings","deprecated":null,"version":null,"openapi":"/openapi/widgetic-api-public.json get /compositions/{id}/embed-settings","href":"/api-reference/compositions/get-composition-embed-settings"},{"title":"Get Composition Preview","deprecated":null,"version":null,"openapi":"/openapi/widgetic-api-public.json get /compositions/{id}/preview","href":"/api-reference/compositions/get-composition-preview"},{"title":"Get All Records From Composition Database Table","deprecated":null,"version":null,"openapi":"/openapi/widgetic-api-public.json get /compositions/{id}/database/{table}","href":"/api-reference/compositions/get-all-records-from-composition-database-table"},{"title":"Create Record In Composition Database","deprecated":null,"version":null,"openapi":"/openapi/widgetic-api-public.json post /compositions/{id}/database/{table}","href":"/api-reference/compositions/create-record-in-composition-database"},{"title":"Get Record From Composition Database","deprecated":null,"version":null,"openapi":"/openapi/widgetic-api-public.json get /compositions/{id}/database/{table}/{recordId}","href":"/api-reference/compositions/get-record-from-composition-database"},{"title":"Update Record In Composition Database","deprecated":null,"version":null,"openapi":"/openapi/widgetic-api-public.json put /compositions/{id}/database/{table}/{recordId}","href":"/api-reference/compositions/update-record-in-composition-database"},{"title":"Delete Record From Composition Database","deprecated":null,"version":null,"openapi":"/openapi/widgetic-api-public.json delete /compositions/{id}/database/{table}/{recordId}","href":"/api-reference/compositions/delete-record-from-composition-database"},{"title":"Describe What a Composition Keeps","description":"Names the tables a composition's widget keeps entries in (the votes, ratings, answers or sign-ups its\nvisitors left), their columns, and how many entries each holds. Call it first to learn the table and\ncolumn names that `readCompositionEntries` takes.\n\nA widget that only shows content keeps nothing of its own: the answer is `hasData: false` with no tables,\nand that is not an error. A table that could not be counted has `rows: null`, which is not zero.\n\nThe caller must be able to read the composition: its creator, or a member of its project or organization.\nAn editor session cannot call this route.\n","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","description":"Creates one item in a widget content list without replacing the whole list. Item field keys are widget data (camelCase or snake_case are kept as sent). Partners use this to keep galleries in sync.","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":"Read the Entries of a Composition's Table - 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"]}