Each Gomry API key carries a scope map that controls which resources it can access and at what level. Scopes are configured per-resource and per-action, letting you create keys with exactly the access an integration needs.
contacts, events, experiences, attendees, ticket_classes, applications, and spaces support write. checkout is the one resource that supports write but not read — see Commerce scopes. Every other resource is read-only, and selecting read is sufficient to use each endpoint listed.
Resource
Endpoints
Supported actions
spaces
GET/POST /v1/spaces, GET/PATCH /v1/spaces/:identifier, PUT /v1/spaces/:identifier/tax-details
catalog and checkout power the Agentic Commerce surface and behave differently from every other scope on this page. Both are off by default on every key, including keys created before scopes existed — the legacy full-access rule does not extend to them, and they must be granted explicitly.
These two are not organization-scoped.catalog is a cross-organization read: one key returns live public events from every organizer on Gomry. Granting it to an organizer’s own integration would silently hand that integration a platform-wide catalog.checkout goes further — it sells an arbitrary organizer’s tickets and takes payment against their Stripe account. It is the most privileged scope in this API.
checkout supports write and not read: reading a session is part of the same capability, and a read-only checkout scope would grant access to buyer details without any ability to act on them.The checkout scope alone is not sufficient. A request must also come from a key on Gomry’s ACP partner allowlist and carry a valid request signature. A scope can be granted by anyone with settings access; a surface that can sell tickets and charge cards needs a gate a misconfigured dashboard cannot open. See Access.Some endpoints depend on multiple resources. For example, GET /v1/lists/:id/contacts requires both lists:read and contacts:read because the response exposes contact records.Application responses include a resolved applicant object (email, first/last name) — this is part of applications:read, there is no separate scope for it. Each field is null when no linked record (application, user, contact, or a name/email-tagged answer) supplies it. See List Applications.API keys created before events:write shipped are capped at events:read for backwards compatibility — to enable event creation on a legacy key, edit it in the dashboard and select write. The same cap applies to experiences:write, attendees:write, ticket_classes:write, applications:write, and spaces:write: legacy keys must be opted in explicitly so a key sitting in someone’s .env cannot silently start mutating tickets, ticket classes, applications, or — most sensitively — creating spaces and setting their tax details when the write endpoints ship.
When creating a key in Organization Settings → API Keys, the scope picker lets you set each resource to none, read, or write. Scopes can be updated later from the same screen without rotating the key.API keys created before scopes existed are treated as having full access (write on every resource) for backwards compatibility. We recommend tightening these legacy keys to the minimum scopes their integration actually needs.
Principle of least privilege. Start with none everywhere, then enable only what your integration needs.
Use separate keys per integration. A CRM sync needs contacts:read, lists:read, custom_fields:read. A finance reconciliation job needs payments:read. Don’t share keys.
Rotate periodically. Create a new key with the desired scopes, switch over, then revoke the old one.
{"docsConfig":{"theme":"mint","$schema":"https://mintlify.com/docs.json","name":"Gomry API","colors":{"primary":"#000000","light":"#FFFFFF","dark":"#FFFFFF"},"logo":{"light":"https://mintcdn.com/gomry/jDJp3Wqzn5wDGgQC/images/logo-light.png?fit=max\u0026auto=format\u0026n=jDJp3Wqzn5wDGgQC\u0026q=85\u0026s=f219d76acf24de2d111ed934cfcb6606","dark":"https://mintcdn.com/gomry/jDJp3Wqzn5wDGgQC/images/logo-dark.png?fit=max\u0026auto=format\u0026n=jDJp3Wqzn5wDGgQC\u0026q=85\u0026s=72b9aee24c65cf76a8c0f17f88337855"},"favicon":"https://mintcdn.com/gomry/jDJp3Wqzn5wDGgQC/favicon.ico?fit=max\u0026auto=format\u0026n=jDJp3Wqzn5wDGgQC\u0026q=85\u0026s=a81575b3950229a1b14b4260130ce0bf","api":{"mdx":{"auth":{"method":"key","name":"X-API-KEY"},"server":"https://www.gomry.com/api/v1"}},"navbar":{"links":[{"href":"https://www.gomry.com","label":"Dashboard"}]},"footer":{"socials":{"website":"https://gomry.com","linkedin":"https://www.linkedin.com/company/gomry"}},"styling":{"latex":false},"navigation":{"pages":[]}},"deployment":{"deploymentMetadataValue":{"subdomain":"gomry","hasAudioNarration":false,"actualSubdomain":"gomry","customDomains":["docs.gomry.com"],"gitSource":{"type":"github","owner":"gomryhq","repo":"gomry","deployBranch":"master","contentDirectory":"docs/api-reference","isPrivate":true,"mountPath":"","label":""},"chroma":{"liveDeploymentHistoryId":"6ae12b08fdd8d33d7ee5e1af","collectionId":"ac7a70bb-9059-4864-ad06-2d862cdd6c29","schemaVersion":"v3","latestBuiltDeploymentHistoryId":"6ae12b08fdd8d33d7ee5e1af"},"entitlements":{"AI_CHAT":{"status":"DISABLED"}},"buildId":"6ae12b08fdd8d33d7ee5e1af","clientVersion":"0.0.4044","searchFilterCounts":[{"language":"default","tag":"Documentation","count":105},{"language":"default","tag":"API Reference","count":69},{"language":"default","tag":"Retail Vendor API","count":12},{"language":"default","tag":"Checkout Sessions","count":7},{"language":"default","tag":"Contacts","count":6},{"language":"default","tag":"Webhooks","count":6},{"language":"default","tag":"Getting Started","count":6},{"language":"default","tag":"Attendees","count":5},{"language":"default","tag":"Events","count":5},{"language":"default","tag":"Experiences","count":5}]},"assistantConfig":{"enableAskAiButton":false,"enableStarterQuestions":false,"enableContextualStarterQuestions":false,"enableAskAiSearchBar":true},"basePath":"","hasChatPermissions":false,"hasWebMcpPermissions":false,"toggles":[{"name":"kill-isr","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":"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":"byok-sep-25","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":"vite-origin","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-updated-9-15","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":"sso-setup-deadline-banner","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false}],"googleFontsInlined":false},"customCss":[],"page":{"pagePath":"scopes","slug":"/scopes","pageMetadata":{"title":"Scopes","description":"Per-resource read/write permissions on API keys","href":"/scopes"},"description":{"compiledSource":"\"use strict\";\nconst {jsx: _jsx} = arguments[0];\nconst {useMDXComponents: _provideComponents} = arguments[0];\nfunction _createMdxContent(props) {\n const _components = {\n p: \"p\",\n ..._provideComponents(),\n ...props.components\n };\n return _jsx(_components.p, {\n children: \"Per-resource read/write permissions on API keys\"\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,jsxs:_jsxs}=arguments[0];const{useMDXComponents:_provideComponents}=arguments[0];function _createMdxContent(props){const _components={a:`a`,code:`code`,li:`li`,p:`p`,pre:`pre`,span:`span`,strong:`strong`,tbody:`tbody`,td:`td`,th:`th`,thead:`thead`,tr:`tr`,ul:`ul`,..._provideComponents(),...props.components},{CodeBlock,Heading,Table,Warning}=_components;if(!CodeBlock)_missingMdxReference(`CodeBlock`,true);if(!Heading)_missingMdxReference(`Heading`,true);if(!Table)_missingMdxReference(`Table`,true);if(!Warning)_missingMdxReference(`Warning`,true);return _jsxs(_Fragment,{children:[_jsx(Heading,{level:`1`,id:`scopes`,children:`Scopes`}),`\n`,_jsxs(_components.p,{children:[`Each Gomry API key carries a `,_jsx(_components.strong,{children:`scope map`}),` that controls which resources it can access and at what level. Scopes are configured per-resource and per-action, letting you create keys with exactly the access an integration needs.`]}),`\n`,_jsx(Heading,{level:`2`,id:`available-actions`,children:`Available Actions`}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Action`}),_jsx(_components.th,{children:`Description`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`none`})}),_jsxs(_components.td,{children:[`No access. Requests to this resource return `,_jsx(_components.code,{children:`403 insufficient_scope`}),`.`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`read`})}),_jsxs(_components.td,{children:[`Read-only access (`,_jsx(_components.code,{children:`GET`}),` requests).`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`write`})}),_jsxs(_components.td,{children:[`Full access (`,_jsx(_components.code,{children:`GET`}),`, `,_jsx(_components.code,{children:`POST`}),`, `,_jsx(_components.code,{children:`PATCH`}),`, `,_jsx(_components.code,{children:`PUT`}),`, `,_jsx(_components.code,{children:`DELETE`}),`). Implies `,_jsx(_components.code,{children:`read`}),`.`]})]})]})]}),`\n`,_jsx(Heading,{level:`2`,id:`available-resources`,children:`Available Resources`}),`\n`,_jsxs(_components.p,{children:[_jsx(_components.code,{children:`contacts`}),`, `,_jsx(_components.code,{children:`events`}),`, `,_jsx(_components.code,{children:`experiences`}),`, `,_jsx(_components.code,{children:`attendees`}),`, `,_jsx(_components.code,{children:`ticket_classes`}),`, `,_jsx(_components.code,{children:`applications`}),`, and `,_jsx(_components.code,{children:`spaces`}),` support `,_jsx(_components.code,{children:`write`}),`. `,_jsx(_components.code,{children:`checkout`}),` is the one resource that supports `,_jsx(_components.code,{children:`write`}),` but not `,_jsx(_components.code,{children:`read`}),` — see `,_jsx(_components.a,{href:`#commerce-scopes`,children:`Commerce scopes`}),`. Every other resource is read-only, and selecting `,_jsx(_components.code,{children:`read`}),` is sufficient to use each endpoint listed.`]}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Resource`}),_jsx(_components.th,{children:`Endpoints`}),_jsx(_components.th,{children:`Supported actions`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`spaces`})}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`GET/POST /v1/spaces`}),`, `,_jsx(_components.code,{children:`GET/PATCH /v1/spaces/:identifier`}),`, `,_jsx(_components.code,{children:`PUT /v1/spaces/:identifier/tax-details`})]}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`none`}),`, `,_jsx(_components.code,{children:`read`}),`, `,_jsx(_components.code,{children:`write`})]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`events`})}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`GET/POST /v1/events`}),`, `,_jsx(_components.code,{children:`GET/PATCH/DELETE /v1/events/:id`})]}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`none`}),`, `,_jsx(_components.code,{children:`read`}),`, `,_jsx(_components.code,{children:`write`})]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`experiences`})}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`GET/POST /v1/experiences`}),`, `,_jsx(_components.code,{children:`GET/PATCH/DELETE /v1/experiences/:id`}),`, `,_jsx(_components.code,{children:`GET/POST /v1/experiences/:id/recurrences`}),`, `,_jsx(_components.code,{children:`GET/PATCH/DELETE /v1/experiences/:id/recurrences/:id`})]}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`none`}),`, `,_jsx(_components.code,{children:`read`}),`, `,_jsx(_components.code,{children:`write`})]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`attendees`})}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`GET/POST /v1/events/:id/attendees`}),`, `,_jsx(_components.code,{children:`GET/PATCH/DELETE /v1/events/:id/attendees/:id`})]}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`none`}),`, `,_jsx(_components.code,{children:`read`}),`, `,_jsx(_components.code,{children:`write`})]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`ticket_classes`})}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`GET/POST /v1/events/:id/ticket-classes`}),`, `,_jsx(_components.code,{children:`GET/PATCH/DELETE /v1/events/:id/ticket-classes/:id`})]}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`none`}),`, `,_jsx(_components.code,{children:`read`}),`, `,_jsx(_components.code,{children:`write`})]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`contacts`})}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`GET/POST /v1/contacts`}),`, `,_jsx(_components.code,{children:`GET/PATCH/DELETE /v1/contacts/:id`})]}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`none`}),`, `,_jsx(_components.code,{children:`read`}),`, `,_jsx(_components.code,{children:`write`})]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`applications`})}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`GET /v1/applications`}),`, `,_jsx(_components.code,{children:`GET/PATCH /v1/applications/:id`}),`, `,_jsx(_components.code,{children:`GET /v1/contacts/:id/applications`})]}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`none`}),`, `,_jsx(_components.code,{children:`read`}),`, `,_jsx(_components.code,{children:`write`})]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`forms`})}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`GET /v1/forms`}),`, `,_jsx(_components.code,{children:`GET /v1/forms/:id`})]}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`none`}),`, `,_jsx(_components.code,{children:`read`})]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`lists`})}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`GET /v1/lists`}),`, `,_jsx(_components.code,{children:`GET /v1/lists/:id`}),`, `,_jsx(_components.code,{children:`GET /v1/lists/:id/contacts`})]}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`none`}),`, `,_jsx(_components.code,{children:`read`})]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`custom_fields`})}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`GET /v1/custom-fields`}),`, `,_jsx(_components.code,{children:`GET /v1/custom-fields/:id`})]}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`none`}),`, `,_jsx(_components.code,{children:`read`})]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`payments`})}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`GET /v1/payments`}),`, `,_jsx(_components.code,{children:`GET /v1/payments/:id`}),`. Also needed to refund: rejecting or deleting an attendee who paid, and deleting an event with paid orders`]}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`none`}),`, `,_jsx(_components.code,{children:`read`})]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`catalog`})}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`GET /v1/catalog/events`}),`, `,_jsx(_components.code,{children:`GET /v1/catalog/events/:id`}),`, `,_jsx(_components.code,{children:`GET /v1/catalog/feed`})]}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`none`}),`, `,_jsx(_components.code,{children:`read`})]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`checkout`})}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`POST /v1/checkout_sessions`}),`, `,_jsx(_components.code,{children:`GET/POST /v1/checkout_sessions/:id`}),`, `,_jsx(_components.code,{children:`POST /v1/checkout_sessions/:id/complete`}),`, `,_jsx(_components.code,{children:`POST /v1/checkout_sessions/:id/cancel`})]}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`none`}),`, `,_jsx(_components.code,{children:`write`})]})]})]})]}),`\n`,_jsx(Heading,{level:`2`,id:`commerce-scopes`,children:`Commerce scopes`}),`\n`,_jsxs(_components.p,{children:[_jsx(_components.code,{children:`catalog`}),` and `,_jsx(_components.code,{children:`checkout`}),` power the `,_jsx(_components.a,{href:`/commerce/introduction`,children:`Agentic Commerce`}),` surface and behave differently from every other scope on this page. Both are `,_jsx(_components.strong,{children:`off by default on every key`}),`, including keys created before scopes existed — the legacy full-access rule does not extend to them, and they must be granted explicitly.`]}),`\n`,_jsxs(Warning,{children:[_jsx(_components.p,{children:`These two are not organization-scoped.`}),_jsxs(_components.p,{children:[_jsx(_components.code,{children:`catalog`}),` is a `,_jsx(_components.strong,{children:`cross-organization read`}),`: one key returns live public events from every organizer on Gomry. Granting it to an organizer’s own integration would silently hand that integration a platform-wide catalog.`]}),_jsxs(_components.p,{children:[_jsx(_components.code,{children:`checkout`}),` goes further — it `,_jsx(_components.strong,{children:`sells an arbitrary organizer’s tickets`}),` and takes payment against their Stripe account. It is the most privileged scope in this API.`]})]}),`\n`,_jsxs(_components.p,{children:[_jsx(_components.code,{children:`checkout`}),` supports `,_jsx(_components.code,{children:`write`}),` and not `,_jsx(_components.code,{children:`read`}),`: reading a session is part of the same capability, and a read-only checkout scope would grant access to buyer details without any ability to act on them.`]}),`\n`,_jsxs(_components.p,{children:[`The `,_jsx(_components.code,{children:`checkout`}),` scope alone is `,_jsx(_components.strong,{children:`not sufficient`}),`. A request must also come from a key on Gomry’s ACP partner allowlist and carry a valid request signature. A scope can be granted by anyone with settings access; a surface that can sell tickets and charge cards needs a gate a misconfigured dashboard cannot open. See `,_jsx(_components.a,{href:`/commerce/introduction#access`,children:`Access`}),`.`]}),`\n`,_jsxs(_components.p,{children:[`Some endpoints depend on multiple resources. For example, `,_jsx(_components.code,{children:`GET /v1/lists/:id/contacts`}),` requires both `,_jsx(_components.code,{children:`lists:read`}),` and `,_jsx(_components.code,{children:`contacts:read`}),` because the response exposes contact records.`]}),`\n`,_jsxs(_components.p,{children:[`Application responses include a resolved `,_jsx(_components.code,{children:`applicant`}),` object (email, first/last name) — this is part of `,_jsx(_components.code,{children:`applications:read`}),`, there is no separate scope for it. Each field is `,_jsx(_components.code,{children:`null`}),` when no linked record (application, user, contact, or a name/email-tagged answer) supplies it. See `,_jsx(_components.a,{href:`/api-reference/applications/list-applications`,children:`List Applications`}),`.`]}),`\n`,_jsxs(_components.p,{children:[`API keys created before `,_jsx(_components.code,{children:`events:write`}),` shipped are capped at `,_jsx(_components.code,{children:`events:read`}),` for backwards compatibility — to enable event creation on a legacy key, edit it in the dashboard and select `,_jsx(_components.code,{children:`write`}),`. The same cap applies to `,_jsx(_components.code,{children:`experiences:write`}),`, `,_jsx(_components.code,{children:`attendees:write`}),`, `,_jsx(_components.code,{children:`ticket_classes:write`}),`, `,_jsx(_components.code,{children:`applications:write`}),`, and `,_jsx(_components.code,{children:`spaces:write`}),`: legacy keys must be opted in explicitly so a key sitting in someone’s `,_jsx(_components.code,{children:`.env`}),` cannot silently start mutating tickets, ticket classes, applications, or — most sensitively — creating spaces and setting their tax details when the write endpoints ship.`]}),`\n`,_jsx(Heading,{level:`2`,id:`configuring-scopes-on-a-key`,children:`Configuring Scopes on a Key`}),`\n`,_jsxs(_components.p,{children:[`When creating a key in `,_jsx(_components.strong,{children:`Organization Settings → API Keys`}),`, the scope picker lets you set each resource to `,_jsx(_components.code,{children:`none`}),`, `,_jsx(_components.code,{children:`read`}),`, or `,_jsx(_components.code,{children:`write`}),`. Scopes can be updated later from the same screen without rotating the key.`]}),`\n`,_jsxs(_components.p,{children:[`API keys created `,_jsx(_components.strong,{children:`before scopes existed`}),` are treated as having full access (`,_jsx(_components.code,{children:`write`}),` on every resource) for backwards compatibility. We recommend tightening these legacy keys to the minimum scopes their integration actually needs.`]}),`\n`,_jsx(Heading,{level:`2`,id:`insufficient-scope-errors`,children:`Insufficient Scope Errors`}),`\n`,_jsx(_components.p,{children:`If a request hits an endpoint the key isn’t authorized for, the API returns:`}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`5`,language:`json`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`json`,children:_jsxs(_components.code,{language:`json`,numberOfLines:`5`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`{`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"error\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"insufficient_scope\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"message\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"This API key does not have 'read' access to 'payments'.\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"required_scope\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"payments:read\"`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`}`})}),`\n`]})})}),`\n`,_jsxs(_components.p,{children:[`Status: `,_jsx(_components.code,{children:`403 Forbidden`}),`. The fix is to grant the missing scope from the dashboard or use a different key.`]}),`\n`,_jsx(Heading,{level:`2`,id:`recommendations`,children:`Recommendations`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Principle of least privilege.`}),` Start with `,_jsx(_components.code,{children:`none`}),` everywhere, then enable only what your integration needs.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Use separate keys per integration.`}),` A CRM sync needs `,_jsx(_components.code,{children:`contacts:read`}),`, `,_jsx(_components.code,{children:`lists:read`}),`, `,_jsx(_components.code,{children:`custom_fields:read`}),`. A finance reconciliation job needs `,_jsx(_components.code,{children:`payments:read`}),`. Don’t share keys.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Rotate periodically.`}),` Create a new key with the desired scopes, switch over, then revoke the old one.`]}),`\n`]})]})}function MDXContent(props={}){const{wrapper:MDXLayout}={..._provideComponents(),...props.components};return MDXLayout?_jsx(MDXLayout,{...props,children:_jsx(_createMdxContent,{...props})}):_createMdxContent(props)}return{default:MDXContent};function _missingMdxReference(id,component){throw new Error(`Expected `+(component?`component`:`object`)+\" `\"+id+\"` to be defined: you likely forgot to import, pass, or provide it.\")}","frontmatter":{},"scope":{"config":{},"pageMetadata":{"title":"Scopes","description":"Per-resource read/write permissions on API keys","href":"/scopes"}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[{"title":"Scopes","slug":"scopes","depth":1,"children":[]},{"title":"Available Actions","slug":"available-actions","depth":2,"children":[]},{"title":"Available Resources","slug":"available-resources","depth":2,"children":[]},{"title":"Commerce scopes","slug":"commerce-scopes","depth":2,"children":[]},{"title":"Configuring Scopes on a Key","slug":"configuring-scopes-on-a-key","depth":2,"children":[]},{"title":"Insufficient Scope Errors","slug":"insufficient-scope-errors","depth":2,"children":[]},{"title":"Recommendations","slug":"recommendations","depth":2,"children":[]}],"codeExamples":{}},"jsLinks":[],"subdomain":"gomry","siteName":"Gomry API","title":"Scopes - Gomry API","navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{}},"lastModified":"2026-10-23T15:23:29.350Z","originalFileLocation":"scopes.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=\"Per-resource read/write permissions on API keys\">\u003cmeta data-mint-head name=\"application-name\" content=\"Gomry API\">\u003cmeta data-mint-head name=\"generator\" content=\"Mintlify\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/gomry/bqp84X4_mSd9jp4X/_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/gomry/bqp84X4_mSd9jp4X/_generated/favicon/apple-touch-icon.png\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/gomry/bqp84X4_mSd9jp4X/_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/gomry/bqp84X4_mSd9jp4X/_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/gomry/bqp84X4_mSd9jp4X/_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/gomry/bqp84X4_mSd9jp4X/_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/gomry/bqp84X4_mSd9jp4X/_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/gomry/bqp84X4_mSd9jp4X/_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/gomry/bqp84X4_mSd9jp4X/_generated/favicon-dark/favicon.ico\" media=\"(prefers-color-scheme: dark)\">\u003cmeta data-mint-head property=\"og:title\" content=\"Scopes - Gomry API\">\u003cmeta data-mint-head property=\"og:description\" content=\"Per-resource read/write permissions on API keys\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"Gomry API\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://docs.gomry.com/scopes\">\u003cmeta data-mint-head property=\"og:type\" content=\"website\">\u003cmeta data-mint-head property=\"og:image\" content=\"https://gomry.mintlify.app/_mintlify/api/og/v2?division=Getting+Started\u0026amp;title=Scopes\u0026amp;description=Per-resource+read%2Fwrite+permissions+on+API+keys\u0026amp;theme=09718fab176c688eeda09506\u0026amp;signature=f9e8ac97d4dcc3583473d4f02ca23287ae6a391631e0f492a48b746d7161e9bb\">\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=\"Scopes - Gomry API\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"Per-resource read/write permissions on API keys\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://gomry.mintlify.app/_mintlify/api/og/v2?division=Getting+Started\u0026amp;title=Scopes\u0026amp;description=Per-resource+read%2Fwrite+permissions+on+API+keys\u0026amp;theme=09718fab176c688eeda09506\u0026amp;signature=f9e8ac97d4dcc3583473d4f02ca23287ae6a391631e0f492a48b746d7161e9bb\">\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/gomry/bqp84X4_mSd9jp4X/_generated/favicon/browserconfig.xml\">\u003cmeta data-mint-head name=\"apple-mobile-web-app-title\" content=\"Gomry API\">\u003cmeta data-mint-head name=\"msapplication-TileColor\" content=\"#000000\">\u003clink data-mint-head rel=\"canonical\" href=\"https://docs.gomry.com/scopes\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/scopes.md\">\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"Organization\",\"@id\":\"https://docs.gomry.com/#organization\",\"name\":\"Gomry API\",\"url\":\"https://docs.gomry.com\",\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https://mintcdn.com/gomry/jDJp3Wqzn5wDGgQC/images/logo-light.png?fit=max\u0026auto=format\u0026n=jDJp3Wqzn5wDGgQC\u0026q=85\u0026s=f219d76acf24de2d111ed934cfcb6606\"}},{\"@type\":\"WebSite\",\"@id\":\"https://docs.gomry.com#website\",\"name\":\"Gomry API\",\"url\":\"https://docs.gomry.com\",\"publisher\":{\"@id\":\"https://docs.gomry.com/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https://docs.gomry.com/scopes#webpage\",\"url\":\"https://docs.gomry.com/scopes\",\"name\":\"Scopes\",\"description\":\"Per-resource read/write permissions on API keys\",\"dateModified\":\"2026-10-23T15:23:29.350Z\",\"isPartOf\":{\"@id\":\"https://docs.gomry.com#website\"},\"breadcrumb\":{\"@id\":\"https://docs.gomry.com/scopes#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://docs.gomry.com/scopes#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Getting Started\",\"item\":\"https://docs.gomry.com/introduction\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Scopes\",\"item\":\"https://docs.gomry.com/scopes\"}]},{\"@type\":[\"Article\",\"TechArticle\"],\"@id\":\"https://docs.gomry.com/scopes#article\",\"headline\":\"Scopes\",\"name\":\"Scopes\",\"description\":\"Per-resource read/write permissions on API keys\",\"url\":\"https://docs.gomry.com/scopes\",\"mainEntityOfPage\":{\"@id\":\"https://docs.gomry.com/scopes#webpage\"},\"dateModified\":\"2026-10-23T15:23:29.350Z\",\"publisher\":{\"@id\":\"https://docs.gomry.com/#organization\"},\"isPartOf\":{\"@id\":\"https://docs.gomry.com#website\"}}]}\u003c/script>\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@type\":\"WebSite\",\"name\":\"Gomry API\",\"creator\":{\"@type\":\"Organization\",\"name\":\"Mintlify\",\"url\":\"https://mintlify.com\"}}\u003c/script>","siteName":"Gomry API","nav":{"global":null,"anchors":[{"anchor":"Documentation","icon":"book-open","tabs":[{"tab":"Documentation","groups":[{"group":"Getting Started","pages":[{"title":"Introduction","href":"/introduction"},{"title":"Authentication","description":"Authenticate with an organization API key, or, as an agent, register a credential yourself","href":"/authentication"},{"title":"Scopes","href":"/scopes"},{"title":"Errors","description":"Understand API error responses and status codes","href":"/errors"},{"title":"Rate Limits","href":"/rate-limits"},{"title":"Pagination","href":"/pagination"}]},{"group":"MCP Server","pages":[{"title":"MCP Server","href":"/mcp/introduction"},{"title":"Setup","href":"/mcp/setup"},{"title":"Available Tools","href":"/mcp/tools"}]},{"group":"Agentic Commerce","pages":[{"title":"Agentic Commerce","href":"/commerce/introduction"},{"title":"Checkout Errors","href":"/commerce/errors"}]},{"group":"Webhooks","pages":[{"title":"Webhooks","href":"/webhooks"}]}]},{"tab":"API Reference","pages":[{"title":"API Reference","href":"/api-reference/organization/get-organization"}]},{"tab":"Retail Vendor API","pages":[{"title":"Retail Vendor API","href":"/vendor-api/introduction"}]}]},{"anchor":"Support","icon":"envelope","href":"mailto:support@gomry.com"}]},"basePath":"","title":"Scopes - Gomry API","buildId":"dpl_DeHjVRGfFnhYQwHnfC2pjeXXv8h9","deploymentId":"dpl_DeHjVRGfFnhYQwHnfC2pjeXXv8h9","dynamics":[],"chunks":[]}