Place a gate from your server. It is placed as a draft; send activate: true to make it live in the same call. In Production the Console’s checks apply to activation — business verified, a verified domain, the plan’s gate allowance — and if they block it the gate is still placed: the call succeeds with activated: false and activation_error. The policy document is the preset’s pre-fill overlaid by policy, validated whole (version defaults to 3 when neither sends one). A key is never auto-suffixed: a key already placed in this environment is refused with gate_key_taken. Nothing is half-placed — if the policy cannot be saved, the gate is removed.
Your secret server API key (bs_dev_… or bs_production_…) with Gates API access: the gates:write scope, granted in the Console under Settings → Developer Tools → API Keys. Without it every Gates API call answers gates_scope_required. The organization and environment always come from the key. Site keys are refused.
Body
application/json
key
string
required
The gate key: lower-case letters, digits, _ or -, up to 64, starting with a letter or digit. What create-verification-link sends as gate. Unique per environment.
Pattern: ^[a-z0-9][a-z0-9_-]{0,63}$
Example:
"presale-nyc-1120"
name
string
required
Required string length: 1 - 120
Example:
"NYC presale"
message
string
The gate's line to people on the arrival card.
Maximum string length: 90
Example:
"Two tickets per fan. Real fans only."
gateType
enum<string>
default:human
Available options:
human,
age
ageThreshold
enum<integer>
Required when gateType is age (else age_threshold_required).
Available options:
13,
18,
21
preset
enum<string>
Pre-fill the policy from a preset; any policy fields override it.
Available options:
presale,
promo,
drop,
vote,
reservation,
claim
policy
object
A gate's policy document (versioned; validated whole). Unknown fields are refused. When preset is also sent on the create call, the preset pre-fills these fields and any field here overrides it.
Where the gate sends a person after they pass. https:// only. Revealed to the person only after their request passes.
Maximum string length: 2048
Example:
"https://example.com/presale/nyc"
activate
boolean
default:false
Make the gate live in the same call.
Response
The placed gate. NOTE: handler errors also arrive here (HTTP 200) as data.error — codes: invalid_key (401 — missing, malformed or inactive key), gates_scope_required (403 — the key lacks Gates API access), org_not_found (404), age_threshold_required (400), invalid_policy (400), gate_key_taken (409), internal (500).
data
object
required
Show child attributes
{"docsConfig":{"theme":"mint","$schema":"https://mintlify.com/docs.json","name":"BotShield Documentation","description":"BotShield proves a real human is present, and gets a verified human’s Confirm or Deny on an agent’s action, without telling you who the human is.\n\nBotShield answers two questions for your platform. Is a real human here right now? And did a verified human confirm this action an agent wants to take? The human answers on their own phone, in the BotShield app, with a passkey. You receive the result. You never receive the person’s identity.","colors":{"primary":"#00A4EF","light":"#00A4EF","dark":"#010100"},"logo":{"light":"https://mintcdn.com/botshield-0eb40fde/-C8B5h-kfSlZfTf2/images/a_margin.png?fit=max\u0026auto=format\u0026n=-C8B5h-kfSlZfTf2\u0026q=85\u0026s=77987b865078b53bf6c7d2da810ffbda","dark":"https://mintcdn.com/botshield-0eb40fde/-C8B5h-kfSlZfTf2/images/a_margin.png?fit=max\u0026auto=format\u0026n=-C8B5h-kfSlZfTf2\u0026q=85\u0026s=77987b865078b53bf6c7d2da810ffbda","href":"https://botshield.ai"},"favicon":{"light":"https://botshield.ai/favicon.ico","dark":"https://botshield.ai/favicon.ico"},"api":{"playground":{}},"appearance":{"default":"dark","strict":true},"navbar":{"links":[{"href":"https://botshield.ai","label":"Website"},{"icon":"play","href":"https://demo.botshield.ai","label":"Demos"},{"icon":"signal","href":"https://status.botshield.ai","label":"Status"}],"primary":{"type":"button","label":"Open Console","href":"https://console.botshield.ai"}},"footer":{"socials":{"github":"https://github.com/Bot-Shield"}},"seo":{"metatags":{"msvalidate.01":"762C29F581130524B27FA90CDC7A8A05"}},"styling":{"latex":false},"navigation":{"pages":[]}},"deployment":{"deploymentMetadataValue":{"subdomain":"botshield-0eb40fde","hasAudioNarration":false,"actualSubdomain":"botshield-0eb40fde","customDomains":["docs.botshield.ai"],"gitSource":{"type":"github","owner":"bot-shield","repo":"docs","deployBranch":"main","contentDirectory":"","isPrivate":true,"mountPath":"","label":""},"entitlements":{},"buildId":"6af751edb6ccd6eca79de515","clientVersion":"0.0.4143","searchFilterCounts":[{"language":"default","tag":"Documentation","count":50},{"language":"default","tag":"API Reference","count":27},{"language":"default","tag":"BotShield Gate","count":17},{"language":"default","tag":"Verified Accounts","count":12},{"language":"default","tag":"Gates API","count":12},{"language":"default","tag":"Agents Ask","count":9},{"language":"default","tag":"Integrations","count":8},{"language":"default","tag":"Salesforce","count":7},{"language":"default","tag":"Concepts","count":4},{"language":"default","tag":"Overview","count":3}]},"assistantConfig":{"enableAskAiButton":false,"enableStarterQuestions":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":"custom-rbac-roles","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-mintlify-slack","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-integrations-settings","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"rbac-expansion","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-pr-grouping","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"custom-prefix","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"analytics-v7","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"user-flows-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"no-publish-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-onboarding","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving-live","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"stripTemperatureMiddleware","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"support-platform-pylon-zendesk","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"instant-rollback","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications-server","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-fable","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fixed-ai-action-pricing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automation-resolve-merge-conflict","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"scoped-publishing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"mintql","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"page-level-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-version-history-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-page-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"full-page-search","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workspace-projects","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"assistant-v5","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fork-pr-previews","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"revalidation-jwt","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-sso-scim","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"hobby-abuse-scan","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"dashboard-inbox","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-signup","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"turbopuffer-dual-write","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-enabled","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"approve-review-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-metadata","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"sso-setup-deadline-banner","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"turbopuffer-serve","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"live-agents","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"llms-txt-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false}],"googleFontsInlined":false},"customCss":[],"page":{"pagePath":"api-reference/gates-api/place-a-gate","slug":"/api-reference/gates-api/place-a-gate","pageMetadata":{"title":"Place a gate","description":"Place a gate from your server. It is placed as a `draft`; send `activate: true` to make it live in the same call. In Production the Console's checks apply to activation — business verified, a verified domain, the plan's gate allowance — and if they block it the gate is still placed: the call succeeds with `activated: false` and `activation_error`. The policy document is the `preset`'s pre-fill overlaid by `policy`, validated whole (`version` defaults to 3 when neither sends one). A key is never auto-suffixed: a key already placed in this environment is refused with `gate_key_taken`. Nothing is half-placed — if the policy cannot be saved, the gate is removed.","deprecated":null,"version":null,"openapi":"/openapi.json post /gates-api/create","href":"/api-reference/gates-api/place-a-gate","autogeneratedByOpenApi":true},"description":{"compiledSource":"\"use strict\";\nconst {jsx: _jsx, jsxs: _jsxs} = arguments[0];\nconst {useMDXComponents: _provideComponents} = arguments[0];\nfunction _createMdxContent(props) {\n const _components = {\n code: \"code\",\n p: \"p\",\n ..._provideComponents(),\n ...props.components\n };\n return _jsxs(_components.p, {\n children: [\"Place a gate from your server. It is placed as a \", _jsx(_components.code, {\n children: \"draft\"\n }), \"; send \", _jsx(_components.code, {\n children: \"activate: true\"\n }), \" to make it live in the same call. In Production the Console’s checks apply to activation — business verified, a verified domain, the plan’s gate allowance — and if they block it the gate is still placed: the call succeeds with \", _jsx(_components.code, {\n children: \"activated: false\"\n }), \" and \", _jsx(_components.code, {\n children: \"activation_error\"\n }), \". The policy document is the \", _jsx(_components.code, {\n children: \"preset\"\n }), \"’s pre-fill overlaid by \", _jsx(_components.code, {\n children: \"policy\"\n }), \", validated whole (\", _jsx(_components.code, {\n children: \"version\"\n }), \" defaults to 3 when neither sends one). A key is never auto-suffixed: a key already placed in this environment is refused with \", _jsx(_components.code, {\n children: \"gate_key_taken\"\n }), \". Nothing is half-placed — if the policy cannot be saved, the gate is removed.\"]\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":"Place a gate","description":"Place a gate from your server. It is placed as a `draft`; send `activate: true` to make it live in the same call. In Production the Console's checks apply to activation — business verified, a verified domain, the plan's gate allowance — and if they block it the gate is still placed: the call succeeds with `activated: false` and `activation_error`. The policy document is the `preset`'s pre-fill overlaid by `policy`, validated whole (`version` defaults to 3 when neither sends one). A key is never auto-suffixed: a key already placed in this environment is refused with `gate_key_taken`. Nothing is half-placed — if the policy cannot be saved, the gate is removed.","deprecated":null,"version":null,"openapi":"/openapi.json post /gates-api/create","href":"/api-reference/gates-api/place-a-gate","autogeneratedByOpenApi":true}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[],"codeExamples":{}},"jsLinks":[],"openApiReferenceData":{"operation":{"operationId":"GatesApiCreate","summary":"Place a gate","description":"Place a gate from your server. It is placed as a `draft`; send `activate: true` to make it live in the same call. In Production the Console's checks apply to activation — business verified, a verified domain, the plan's gate allowance — and if they block it the gate is still placed: the call succeeds with `activated: false` and `activation_error`. The policy document is the `preset`'s pre-fill overlaid by `policy`, validated whole (`version` defaults to 3 when neither sends one). A key is never auto-suffixed: a key already placed in this environment is refused with `gate_key_taken`. Nothing is half-placed — if the policy cannot be saved, the gate is removed.","tags":["Gates API"],"security":["bdcc741c-977d-40d4-8141-c95638054f20"],"requestBody":"6522e517-e09f-4a79-993d-adabcef63c58","responses":{"200":"4dccb8bc-4132-4ac5-b087-8b406456f9c4","400":"cdcf0c0b-c0bf-4007-a567-fcf2301f898e","500":"f0930a65-ffaf-4b06-a07e-3d99c0657e84"},"method":"post","type":"path","servers":["1f7e8ef8-f89b-4286-ab96-2fc3b02d5ff3"],"path":"/gates-api/create","baseUrlOptions":["https://api.botshield.ai/operations"],"title":"Place a gate","codeSamples":[],"requiredOnlyExamples":false,"requestExampleType":"generated","responseExampleType":"generated"},"dependencies":{"parameters":{},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["key","name"],"properties":{"key":{"type":"string","pattern":"^[a-z0-9][a-z0-9_-]{0,63}$","description":"The gate key: lower-case letters, digits, `_` or `-`, up to 64, starting with a letter or digit. What `create-verification-link` sends as `gate`. Unique per environment.","example":"presale-nyc-1120","isRequired":true,"uniqueKey":"key","typeLabel":"string"},"name":{"type":"string","minLength":1,"maxLength":120,"example":"NYC presale","isRequired":true,"uniqueKey":"name","typeLabel":"string"},"message":{"type":"string","maxLength":90,"description":"The gate's line to people on the arrival card.","example":"Two tickets per fan. Real fans only.","uniqueKey":"message","typeLabel":"string"},"gateType":{"type":"string","enum":["human","age"],"default":"human","uniqueKey":"gateType","typeLabel":"enum\u003cstring>"},"ageThreshold":{"type":"integer","enum":[13,18,21],"description":"Required when `gateType` is `age` (else `age_threshold_required`).","uniqueKey":"ageThreshold","typeLabel":"enum\u003cinteger>"},"preset":{"type":"string","enum":["presale","promo","drop","vote","reservation","claim"],"description":"Pre-fill the policy from a preset; any `policy` fields override it.","uniqueKey":"preset","typeLabel":"enum\u003cstring>"},"policy":{"type":"object","required":["version"],"additionalProperties":false,"description":"A gate's policy document (versioned; validated whole). Unknown fields are refused. When `preset` is also sent on the create call, the preset pre-fills these fields and any field here overrides it.","properties":{"version":{"type":"integer","enum":[1,2,3],"description":"Document version. Send 3 (v3 adds `link`).","example":3,"isRequired":true,"uniqueKey":"policy.version","typeLabel":"enum\u003cinteger>"},"preset":{"oneOf":[{"type":"string","enum":["presale","promo","drop","vote","reservation","claim",null],"description":"The label for the moment. It only pre-fills attributes; the engine never branches on it. Null/omitted = Custom.","uniqueKey":"policy.preset.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","enum":["presale","promo","drop","vote","reservation","claim",null],"description":"The label for the moment. It only pre-fills attributes; the engine never branches on it. Null/omitted = Custom.","uniqueKey":"policy.preset.oneOf.1","typeLabel":"null"}],"uniqueKey":"policy.preset","typeLabel":"enum\u003cstring> | null"},"link":{"type":"string","enum":["required","optional","never"],"description":"Does a pass link the person to your platform? `required` — you must send `partner_user_ref` with every request and the pass links in the same tap; `optional` — links when a ref is sent, anonymous otherwise; `never` — no link, no ref kept. Always `never` on an Age Gate. Tightens like a limit: required > optional > never.","example":"optional","uniqueKey":"policy.link","typeLabel":"enum\u003cstring>"},"signedUp":{"type":"boolean","description":"Only people who signed up for this one may pass. Stored now; enforced with sign-ups.","uniqueKey":"policy.signedUp","typeLabel":"boolean"},"schedule":{"type":"object","additionalProperties":false,"description":"The gate's runtime. `closesAt` must be after `opensAt`.","properties":{"opensAt":{"oneOf":[{"type":"string","format":"date-time","description":"When the gate opens (ISO 8601 with offset). Omitted/null = open from placement.","example":"2026-11-20T17:00:00Z","uniqueKey":"policy.schedule.opensAt.oneOf.0","typeLabel":"string\u003cdate-time>"},{"type":"null","format":"date-time","description":"When the gate opens (ISO 8601 with offset). Omitted/null = open from placement.","example":"2026-11-20T17:00:00Z","uniqueKey":"policy.schedule.opensAt.oneOf.1","typeLabel":"null"}],"uniqueKey":"policy.schedule.opensAt","typeLabel":"string\u003cdate-time> | null"},"closesAt":{"oneOf":[{"type":"string","format":"date-time","description":"When it closes. Omitted/null = runs until closed.","example":"2026-11-22T05:00:00Z","uniqueKey":"policy.schedule.closesAt.oneOf.0","typeLabel":"string\u003cdate-time>"},{"type":"null","format":"date-time","description":"When it closes. Omitted/null = runs until closed.","example":"2026-11-22T05:00:00Z","uniqueKey":"policy.schedule.closesAt.oneOf.1","typeLabel":"null"}],"uniqueKey":"policy.schedule.closesAt","typeLabel":"string\u003cdate-time> | null"}},"uniqueKey":"policy.schedule","typeLabel":"object"},"asks":{"type":"string","enum":["always"],"description":"A gate always asks — every pass is a fresh confirmation on the person's phone. The field exists only so a document can say so.","uniqueKey":"policy.asks","typeLabel":"enum\u003cstring>"},"passesPerPerson":{"oneOf":[{"type":"object","description":"Null = as often as they like.","required":["limit","window"],"properties":{"limit":{"type":"integer","minimum":1,"maximum":100,"example":2,"isRequired":true,"uniqueKey":"policy.passesPerPerson.oneOf.0.limit","typeLabel":"integer"},"window":{"type":"string","enum":["day","week","30d","ever"],"example":"ever","isRequired":true,"uniqueKey":"policy.passesPerPerson.oneOf.0.window","typeLabel":"enum\u003cstring>"}},"additionalProperties":false,"uniqueKey":"policy.passesPerPerson.oneOf.0","typeLabel":"object"},{"type":"null","description":"Null = as often as they like.","uniqueKey":"policy.passesPerPerson.oneOf.1","typeLabel":"null"}],"uniqueKey":"policy.passesPerPerson","typeLabel":"object | null"},"realDaysAtLeast":{"type":"integer","minimum":0,"maximum":365,"description":"The person's BotShield ID must have proved a person on at least this many distinct days. 0 = anyone.","example":0,"uniqueKey":"policy.realDaysAtLeast","typeLabel":"integer"}},"example":{"version":3,"preset":"presale","link":"required","passesPerPerson":{"limit":2,"window":"ever"},"realDaysAtLeast":0,"schedule":{"opensAt":"2026-11-20T17:00:00Z","closesAt":null}},"uniqueKey":"policy","typeLabel":"object"},"destinationUrl":{"type":"string","format":"uri","maxLength":2048,"description":"Where the gate sends a person after they pass. `https://` only. Revealed to the person only after their request passes.","example":"https://example.com/presale/nyc","uniqueKey":"destinationUrl","typeLabel":"string\u003curi>"},"activate":{"type":"boolean","default":false,"description":"Make the gate live in the same call.","uniqueKey":"activate","typeLabel":"boolean"}},"example":{"key":"presale-nyc-1120","name":"NYC presale","message":"Two tickets per fan.","preset":"presale","policy":{"version":3,"link":"required","schedule":{"opensAt":"2026-11-20T17:00:00Z"}},"destinationUrl":"https://example.com/presale/nyc","activate":true},"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"key":"presale-nyc-1120","name":"NYC presale","message":"Two tickets per fan.","preset":"presale","policy":{"version":3,"link":"required","schedule":{"opensAt":"2026-11-20T17:00:00Z"}},"destinationUrl":"https://example.com/presale/nyc","activate":true}}},"exampleType":"generated"}},"exampleType":"generated"},"responses":{"4dccb8bc-4132-4ac5-b087-8b406456f9c4":{"description":"The placed gate. NOTE: handler errors also arrive here (HTTP 200) as data.error — codes: `invalid_key` (401 — missing, malformed or inactive key), `gates_scope_required` (403 — the key lacks Gates API access), `org_not_found` (404), `age_threshold_required` (400), `invalid_policy` (400), `gate_key_taken` (409), `internal` (500).","content":{"application/json":{"schema":{"type":"object","required":["data"],"properties":{"data":{"type":"object","properties":{"data":{"type":"object","required":["gate","activated"],"properties":{"gate":{"type":"object","required":["key","name","message","status","state","environment","destination_url","policy","placed_at","placed_by_api"],"description":"A gate as the Gates API returns it — your own facts about the gate, never anything about people.","properties":{"key":{"type":"string","pattern":"^[a-z0-9][a-z0-9_-]{0,63}$","description":"The gate key — what `create-verification-link` sends as `gate`.","example":"presale-nyc-1120","isRequired":true,"uniqueKey":"data.data.gate.key","typeLabel":"string"},"name":{"type":"string","example":"NYC presale","isRequired":true,"uniqueKey":"data.data.gate.name","typeLabel":"string"},"message":{"oneOf":[{"type":"string","description":"The gate's line to people on the arrival card.","isRequired":true,"uniqueKey":"data.data.gate.message.oneOf.0","typeLabel":"string"},{"type":"null","description":"The gate's line to people on the arrival card.","isRequired":true,"uniqueKey":"data.data.gate.message.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"data.data.gate.message","typeLabel":"string | null"},"status":{"type":"string","enum":["draft","active","closed"],"description":"`draft` until activated; `closed` once closed (a closed gate cannot be reopened).","isRequired":true,"uniqueKey":"data.data.gate.status","typeLabel":"enum\u003cstring>"},"state":{"oneOf":[{"type":"string","enum":["scheduled","open","closed",null],"description":"Where an active gate is in its schedule. Null unless `status` is `active`.","isRequired":true,"uniqueKey":"data.data.gate.state.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","enum":["scheduled","open","closed",null],"description":"Where an active gate is in its schedule. Null unless `status` is `active`.","isRequired":true,"uniqueKey":"data.data.gate.state.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"data.data.gate.state","typeLabel":"enum\u003cstring> | null"},"environment":{"type":"string","enum":["development","production"],"description":"The key's environment.","isRequired":true,"uniqueKey":"data.data.gate.environment","typeLabel":"enum\u003cstring>"},"destination_url":{"oneOf":[{"type":"string","format":"uri","description":"Where the gate sends a person after they pass.","isRequired":true,"uniqueKey":"data.data.gate.destination_url.oneOf.0","typeLabel":"string\u003curi>"},{"type":"null","format":"uri","description":"Where the gate sends a person after they pass.","isRequired":true,"uniqueKey":"data.data.gate.destination_url.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"data.data.gate.destination_url","typeLabel":"string\u003curi> | null"},"policy":{"oneOf":[{"type":"object","description":"The effective policy (base → org → gate). Null if none could be loaded.","required":["preset","gate_type","age_threshold","signed_up","link","passes_per_person","real_days_at_least","schedule","line"],"properties":{"preset":{"oneOf":[{"type":"string","enum":["presale","promo","drop","vote","reservation","claim",null],"isRequired":true,"uniqueKey":"data.data.gate.policy.oneOf.0.preset.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","enum":["presale","promo","drop","vote","reservation","claim",null],"isRequired":true,"uniqueKey":"data.data.gate.policy.oneOf.0.preset.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"data.data.gate.policy.oneOf.0.preset","typeLabel":"enum\u003cstring> | null"},"gate_type":{"type":"string","enum":["human","age"],"isRequired":true,"uniqueKey":"data.data.gate.policy.oneOf.0.gate_type","typeLabel":"enum\u003cstring>"},"age_threshold":{"oneOf":[{"type":"integer","enum":[13,18,21,null],"description":"Age Gate only; null on a Human Gate.","isRequired":true,"uniqueKey":"data.data.gate.policy.oneOf.0.age_threshold.oneOf.0","typeLabel":"enum\u003cinteger>"},{"type":"null","enum":[13,18,21,null],"description":"Age Gate only; null on a Human Gate.","isRequired":true,"uniqueKey":"data.data.gate.policy.oneOf.0.age_threshold.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"data.data.gate.policy.oneOf.0.age_threshold","typeLabel":"enum\u003cinteger> | null"},"signed_up":{"type":"boolean","isRequired":true,"uniqueKey":"data.data.gate.policy.oneOf.0.signed_up","typeLabel":"boolean"},"link":{"type":"string","enum":["required","optional","never"],"isRequired":true,"uniqueKey":"data.data.gate.policy.oneOf.0.link","typeLabel":"enum\u003cstring>"},"passes_per_person":{"oneOf":[{"type":"object","description":"Null = as often as they like.","required":["limit","window"],"properties":{"limit":{"type":"integer","minimum":1,"maximum":100,"example":2,"isRequired":true,"uniqueKey":"data.data.gate.policy.oneOf.0.passes_per_person.oneOf.0.limit","typeLabel":"integer"},"window":{"type":"string","enum":["day","week","30d","ever"],"example":"ever","isRequired":true,"uniqueKey":"data.data.gate.policy.oneOf.0.passes_per_person.oneOf.0.window","typeLabel":"enum\u003cstring>"}},"additionalProperties":false,"isRequired":true,"uniqueKey":"data.data.gate.policy.oneOf.0.passes_per_person.oneOf.0","typeLabel":"object"},{"type":"null","description":"Null = as often as they like.","isRequired":true,"uniqueKey":"data.data.gate.policy.oneOf.0.passes_per_person.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"data.data.gate.policy.oneOf.0.passes_per_person","typeLabel":"object | null"},"real_days_at_least":{"type":"integer","minimum":0,"maximum":365,"isRequired":true,"uniqueKey":"data.data.gate.policy.oneOf.0.real_days_at_least","typeLabel":"integer"},"schedule":{"type":"object","required":["opensAt","closesAt"],"properties":{"opensAt":{"oneOf":[{"type":"string","format":"date-time","isRequired":true,"uniqueKey":"data.data.gate.policy.oneOf.0.schedule.opensAt.oneOf.0","typeLabel":"string\u003cdate-time>"},{"type":"null","format":"date-time","isRequired":true,"uniqueKey":"data.data.gate.policy.oneOf.0.schedule.opensAt.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"data.data.gate.policy.oneOf.0.schedule.opensAt","typeLabel":"string\u003cdate-time> | null"},"closesAt":{"oneOf":[{"type":"string","format":"date-time","isRequired":true,"uniqueKey":"data.data.gate.policy.oneOf.0.schedule.closesAt.oneOf.0","typeLabel":"string\u003cdate-time>"},{"type":"null","format":"date-time","isRequired":true,"uniqueKey":"data.data.gate.policy.oneOf.0.schedule.closesAt.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"data.data.gate.policy.oneOf.0.schedule.closesAt","typeLabel":"string\u003cdate-time> | null"}},"isRequired":true,"uniqueKey":"data.data.gate.policy.oneOf.0.schedule","typeLabel":"object"},"line":{"type":"string","description":"The human-readable policy readback the Console shows.","example":"2 per person · ever","isRequired":true,"uniqueKey":"data.data.gate.policy.oneOf.0.line","typeLabel":"string"}},"isRequired":true,"uniqueKey":"data.data.gate.policy.oneOf.0","typeLabel":"object"},{"type":"null","description":"The effective policy (base → org → gate). Null if none could be loaded.","required":["preset","gate_type","age_threshold","signed_up","link","passes_per_person","real_days_at_least","schedule","line"],"properties":{"preset":{"oneOf":[{"type":"string","enum":["presale","promo","drop","vote","reservation","claim",null]},{"type":"null","enum":["presale","promo","drop","vote","reservation","claim",null]}]},"gate_type":{"type":"string","enum":["human","age"]},"age_threshold":{"oneOf":[{"type":"integer","enum":[13,18,21,null],"description":"Age Gate only; null on a Human Gate."},{"type":"null","enum":[13,18,21,null],"description":"Age Gate only; null on a Human Gate."}]},"signed_up":{"type":"boolean"},"link":{"type":"string","enum":["required","optional","never"]},"passes_per_person":{"oneOf":[{"type":"object","description":"Null = as often as they like.","required":["limit","window"],"properties":{"limit":{"type":"integer","minimum":1,"maximum":100,"example":2},"window":{"type":"string","enum":["day","week","30d","ever"],"example":"ever"}},"additionalProperties":false},{"type":"null","description":"Null = as often as they like."}]},"real_days_at_least":{"type":"integer","minimum":0,"maximum":365},"schedule":{"type":"object","required":["opensAt","closesAt"],"properties":{"opensAt":{"oneOf":[{"type":"string","format":"date-time"},{"type":"null","format":"date-time"}]},"closesAt":{"oneOf":[{"type":"string","format":"date-time"},{"type":"null","format":"date-time"}]}}},"line":{"type":"string","description":"The human-readable policy readback the Console shows.","example":"2 per person · ever"}},"isRequired":true,"uniqueKey":"data.data.gate.policy.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"data.data.gate.policy","typeLabel":"object | null"},"placed_at":{"type":"string","format":"date-time","isRequired":true,"uniqueKey":"data.data.gate.placed_at","typeLabel":"string\u003cdate-time>"},"placed_by_api":{"type":"boolean","description":"true when an API key (not the Console) placed the gate.","isRequired":true,"uniqueKey":"data.data.gate.placed_by_api","typeLabel":"boolean"}},"isRequired":true,"uniqueKey":"data.data.gate","typeLabel":"object"},"activated":{"type":"boolean","description":"Whether the gate is live now.","isRequired":true,"uniqueKey":"data.data.activated","typeLabel":"boolean"},"activation_error":{"type":"object","description":"Present only when `activate: true` was sent and Production activation was blocked: `org_not_verified`, `domain_not_verified` or `gate_limit_reached` (403). The gate stays a draft — call activate once fixed.","required":["message","statusCode","code"],"properties":{"message":{"type":"string","isRequired":true,"uniqueKey":"data.data.activation_error.message","typeLabel":"string"},"statusCode":{"type":"integer","example":409,"isRequired":true,"uniqueKey":"data.data.activation_error.statusCode","typeLabel":"integer"},"code":{"type":"string","example":"gate_key_taken","isRequired":true,"uniqueKey":"data.data.activation_error.code","typeLabel":"string"}},"uniqueKey":"data.data.activation_error","typeLabel":"object"}},"uniqueKey":"data.data","typeLabel":"object"},"error":{"type":"object","required":["message","statusCode","code"],"description":"Gates API handler error. Arrives inside `data.error` with HTTP 200 — check for it before reading the result.","properties":{"message":{"type":"string","isRequired":true,"uniqueKey":"data.error.message","typeLabel":"string"},"statusCode":{"type":"integer","example":409,"isRequired":true,"uniqueKey":"data.error.statusCode","typeLabel":"integer"},"code":{"type":"string","example":"gate_key_taken","isRequired":true,"uniqueKey":"data.error.code","typeLabel":"string"}},"uniqueKey":"data.error","typeLabel":"object"}},"isRequired":true,"uniqueKey":"data","typeLabel":"object"}},"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"data":{"data":{"gate":{"key":"presale-nyc-1120","name":"NYC presale","message":"\u003cstring>","status":"draft","state":"scheduled","environment":"development","destination_url":"\u003cstring>","policy":{"preset":"presale","gate_type":"human","age_threshold":13,"signed_up":true,"link":"required","passes_per_person":{"limit":2,"window":"ever"},"real_days_at_least":182,"schedule":{"opensAt":"2023-11-07T05:31:56Z","closesAt":"2023-11-07T05:31:56Z"},"line":"2 per person · ever"},"placed_at":"2023-11-07T05:31:56Z","placed_by_api":true},"activated":true,"activation_error":{"message":"\u003cstring>","statusCode":409,"code":"gate_key_taken"}},"error":{"message":"\u003cstring>","statusCode":409,"code":"gate_key_taken"}}}}},"exampleType":"generated"}},"exampleType":"generated"},"cdcf0c0b-c0bf-4007-a567-fcf2301f898e":{"description":"Invalid input","content":{"application/json":{"schema":{"type":"object","required":["message","input","errors"],"properties":{"message":{"type":"string","example":"Invalid input provided","isRequired":true,"uniqueKey":"message","typeLabel":"string"},"input":{"type":"object","additionalProperties":true,"isRequired":true,"uniqueKey":"input","typeLabel":"object"},"errors":{"type":"array","items":{"type":"object","required":["propertyPath","invalidValue","message"],"properties":{"propertyPath":{"type":"string","isRequired":true,"uniqueKey":"errors.items.[INDEX].propertyPath","typeLabel":"string"},"invalidValue":{"description":"The invalid value","isRequired":true,"uniqueKey":"errors.items.[INDEX].invalidValue","typeLabel":"any"},"message":{"type":"string","isRequired":true,"uniqueKey":"errors.items.[INDEX].message","typeLabel":"string"}},"uniqueKey":"errors.items.[INDEX]","typeLabel":"object"},"isRequired":true,"uniqueKey":"errors","typeLabel":"object[]"}},"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"message":"Invalid input provided","input":{},"errors":[{"propertyPath":"\u003cstring>","invalidValue":"\u003cunknown>","message":"\u003cstring>"}]}}},"exampleType":"generated"}},"exampleType":"generated"},"f0930a65-ffaf-4b06-a07e-3d99c0657e84":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["message","statusCode"],"properties":{"message":{"type":"string","isRequired":true,"uniqueKey":"error.message","typeLabel":"string"},"statusCode":{"type":"integer","isRequired":true,"uniqueKey":"error.statusCode","typeLabel":"integer"}},"isRequired":true,"uniqueKey":"error","typeLabel":"object"}},"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"error":{"message":"\u003cstring>","statusCode":123}}}},"exampleType":"generated"}},"exampleType":"generated"}},"security":{"bdcc741c-977d-40d4-8141-c95638054f20":{"GatesKeyAuth":{"type":"http","scheme":"bearer","description":"Your secret server API key (`bs_dev_…` or `bs_production_…`) with Gates API access: the `gates:write` scope, granted in the Console under Settings → Developer Tools → API Keys. Without it every Gates API call answers `gates_scope_required`. The organization and environment always come from the key. Site keys are refused.","scopes":[],"schemeName":"GatesKeyAuth"}}},"servers":{"1f7e8ef8-f89b-4286-ab96-2fc3b02d5ff3":{"url":"https://api.botshield.ai/operations","description":"Production"}},"processedSecurityOptions":[{"schemes":[{"scheme":{"type":"http","scheme":"bearer","description":"Your secret server API key (`bs_dev_…` or `bs_production_…`) with Gates API access: the `gates:write` scope, granted in the Console under Settings → Developer Tools → API Keys. Without it every Gates API call answers `gates_scope_required`. The organization and environment always come from the key. Site keys are refused.","scopes":[],"schemeName":"GatesKeyAuth"},"schema":{"title":"Bearer Auth","type":"string","isRequired":true,"description":"Your secret server API key (`bs_dev_…` or `bs_production_…`) with Gates API access: the `gates:write` scope, granted in the Console under Settings → Developer Tools → API Keys. Without it every Gates API call answers `gates_scope_required`. The organization and environment always come from the key. Site keys are refused.","format":"bearer","typeLabel":"string\u003cbearer>","deprecated":false},"schemeName":"GatesKeyAuth","name":"Authorization"}],"title":"GatesKeyAuth"}]},"originalFileLocation":"openapi.json"},"subdomain":"botshield-0eb40fde","siteName":"BotShield Documentation","title":"Place a gate - BotShield Documentation","navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{}},"lastModified":"2026-11-13T18:07:45.676Z","originalFileLocation":"api-reference/gates-api/place-a-gate.mdx"},"headHtml":"\u003cscript data-mint-head>(function(){var d=document.documentElement,p=\"dark\";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=\"dark\"}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=\"Place a gate from your server. It is placed as a draft; send activate: true to make it live in the same call. In Production the Console\u0026#x27;s checks apply to activation — business verified, a verified domain, the plan\u0026#x27;s gate allowance — and if they block it the gate is still placed: the call succeeds with activated: false and activation_error. The policy document is the preset\u0026#x27;s pre-fill overlaid by policy, validated whole (version defaults to 3 when neither sends one). A key is never auto-suffixed: a key already placed in this environment is refused with gate_key_taken. Nothing is half-placed — if the policy cannot be saved, the gate is removed.\">\u003cmeta data-mint-head name=\"application-name\" content=\"BotShield Documentation\">\u003cmeta data-mint-head name=\"generator\" content=\"Mintlify\">\u003clink data-mint-head rel=\"apple-touch-icon\" type=\"image/x-icon\" sizes=\"180x180\" href=\"https://botshield.ai/favicon.ico\">\u003clink data-mint-head rel=\"icon\" type=\"image/x-icon\" sizes=\"32x32\" href=\"https://botshield.ai/favicon.ico\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/x-icon\" sizes=\"16x16\" href=\"https://botshield.ai/favicon.ico\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"https://botshield.ai/favicon.ico\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/x-icon\" sizes=\"32x32\" href=\"https://botshield.ai/favicon.ico\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/x-icon\" sizes=\"16x16\" href=\"https://botshield.ai/favicon.ico\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"https://botshield.ai/favicon.ico\" media=\"(prefers-color-scheme: dark)\">\u003cmeta data-mint-head property=\"og:title\" content=\"Place a gate - BotShield Documentation\">\u003cmeta data-mint-head property=\"og:description\" content=\"Place a gate from your server. It is placed as a draft; send activate: true to make it live in the same call. In Production the Console\u0026#x27;s checks apply to activation — business verified, a verified domain, the plan\u0026#x27;s gate allowance — and if they block it the gate is still placed: the call succeeds with activated: false and activation_error. The policy document is the preset\u0026#x27;s pre-fill overlaid by policy, validated whole (version defaults to 3 when neither sends one). A key is never auto-suffixed: a key already placed in this environment is refused with gate_key_taken. Nothing is half-placed — if the policy cannot be saved, the gate is removed.\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"BotShield Documentation\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://docs.botshield.ai/api-reference/gates-api/place-a-gate\">\u003cmeta data-mint-head property=\"og:type\" content=\"website\">\u003cmeta data-mint-head property=\"og:image\" content=\"https://botshield-0eb40fde.mintlify.site/_mintlify/api/og/v2?division=Gates+API\u0026amp;title=Place+a+gate\u0026amp;description=Place+a+gate+from+your+server.+It+is+placed+as+a+%60draft%60%3B+send+%60activate%3A+true%60+to+make+it+live+in+the+same+call.+In+Production+the+Console%27s+checks+apply+to+ac\u0026amp;theme=57f1b480943ff13a3f72093c\u0026amp;signature=ce12b30803d42b364efcc3afc7e7c9fbbf05d318ae287770240d2f52cb5788b1\">\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=\"Place a gate - BotShield Documentation\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"Place a gate from your server. It is placed as a draft; send activate: true to make it live in the same call. In Production the Console\u0026#x27;s checks apply to activation — business verified, a verified domain, the plan\u0026#x27;s gate allowance — and if they block it the gate is still placed: the call succeeds with activated: false and activation_error. The policy document is the preset\u0026#x27;s pre-fill overlaid by policy, validated whole (version defaults to 3 when neither sends one). A key is never auto-suffixed: a key already placed in this environment is refused with gate_key_taken. Nothing is half-placed — if the policy cannot be saved, the gate is removed.\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://botshield-0eb40fde.mintlify.site/_mintlify/api/og/v2?division=Gates+API\u0026amp;title=Place+a+gate\u0026amp;description=Place+a+gate+from+your+server.+It+is+placed+as+a+%60draft%60%3B+send+%60activate%3A+true%60+to+make+it+live+in+the+same+call.+In+Production+the+Console%27s+checks+apply+to+ac\u0026amp;theme=57f1b480943ff13a3f72093c\u0026amp;signature=ce12b30803d42b364efcc3afc7e7c9fbbf05d318ae287770240d2f52cb5788b1\">\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=\"https://mintlify.s3.us-west-1.amazonaws.com/botshield-0eb40fde/_generated/favicon/browserconfig.xml?v=3\">\u003cmeta data-mint-head name=\"apple-mobile-web-app-title\" content=\"BotShield Documentation\">\u003cmeta data-mint-head name=\"msapplication-TileColor\" content=\"#00A4EF\">\u003cmeta data-mint-head name=\"msvalidate.01\" content=\"762C29F581130524B27FA90CDC7A8A05\">\u003clink data-mint-head rel=\"canonical\" href=\"https://docs.botshield.ai/api-reference/gates-api/place-a-gate\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/api-reference/gates-api/place-a-gate.md\">\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"Organization\",\"@id\":\"https://docs.botshield.ai/#organization\",\"name\":\"BotShield Documentation\",\"url\":\"https://docs.botshield.ai\",\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https://mintcdn.com/botshield-0eb40fde/-C8B5h-kfSlZfTf2/images/a_margin.png?fit=max\u0026auto=format\u0026n=-C8B5h-kfSlZfTf2\u0026q=85\u0026s=77987b865078b53bf6c7d2da810ffbda\"}},{\"@type\":\"WebSite\",\"@id\":\"https://docs.botshield.ai#website\",\"name\":\"BotShield Documentation\",\"url\":\"https://docs.botshield.ai\",\"publisher\":{\"@id\":\"https://docs.botshield.ai/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https://docs.botshield.ai/api-reference/gates-api/place-a-gate#webpage\",\"url\":\"https://docs.botshield.ai/api-reference/gates-api/place-a-gate\",\"name\":\"Place a gate\",\"description\":\"Place a gate from your server. It is placed as a draft; send activate: true to make it live in the same call. In Production the Console's checks apply to activation — business verified, a verified domain, the plan's gate allowance — and if they block it the gate is still placed: the call succeeds with activated: false and activation_error. The policy document is the preset's pre-fill overlaid by policy, validated whole (version defaults to 3 when neither sends one). A key is never auto-suffixed: a key already placed in this environment is refused with gate_key_taken. Nothing is half-placed — if the policy cannot be saved, the gate is removed.\",\"dateModified\":\"2026-11-13T18:07:45.676Z\",\"isPartOf\":{\"@id\":\"https://docs.botshield.ai#website\"},\"breadcrumb\":{\"@id\":\"https://docs.botshield.ai/api-reference/gates-api/place-a-gate#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://docs.botshield.ai/api-reference/gates-api/place-a-gate#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"BotShield Documentation\",\"item\":\"https://docs.botshield.ai\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Place a gate\",\"item\":\"https://docs.botshield.ai/api-reference/gates-api/place-a-gate\"}]},{\"@type\":[\"TechArticle\",\"APIReference\"],\"@id\":\"https://docs.botshield.ai/api-reference/gates-api/place-a-gate#apireference\",\"headline\":\"Place a gate\",\"name\":\"Place a gate\",\"description\":\"Place a gate from your server. It is placed as a draft; send activate: true to make it live in the same call. In Production the Console's checks apply to activation — business verified, a verified domain, the plan's gate allowance — and if they block it the gate is still placed: the call succeeds with activated: false and activation_error. The policy document is the preset's pre-fill overlaid by policy, validated whole (version defaults to 3 when neither sends one). A key is never auto-suffixed: a key already placed in this environment is refused with gate_key_taken. Nothing is half-placed — if the policy cannot be saved, the gate is removed.\",\"url\":\"https://docs.botshield.ai/api-reference/gates-api/place-a-gate\",\"mainEntityOfPage\":{\"@id\":\"https://docs.botshield.ai/api-reference/gates-api/place-a-gate#webpage\"},\"dateModified\":\"2026-11-13T18:07:45.676Z\",\"publisher\":{\"@id\":\"https://docs.botshield.ai/#organization\"},\"isPartOf\":{\"@id\":\"https://docs.botshield.ai#website\"}}]}\u003c/script>\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@type\":\"WebSite\",\"name\":\"BotShield Documentation\",\"publisher\":{\"@type\":\"Organization\",\"name\":\"BotShield Documentation\"},\"provider\":{\"@type\":\"Organization\",\"name\":\"Mintlify\",\"url\":\"https://mintlify.com\"}}\u003c/script>","agentPointerHref":"/api-reference/gates-api/place-a-gate.md","siteName":"BotShield Documentation","nav":{"global":null,"anchors":[{"anchor":"Documentation","icon":"book-open","pages":[{"title":"Documentation","href":"/introduction"}]},{"anchor":"API Reference","icon":"code","groups":[{"group":"Overview","pages":[{"title":"API overview","sidebarTitle":"Overview","icon":"code","href":"/api-reference/overview"},{"title":"Errors","icon":"triangle-exclamation","href":"/api-reference/errors"},{"title":"Rate limits","icon":"gauge","href":"/api-reference/rate-limits"}]},{"group":"BotShield Gate","pages":[{"title":"Create a grant token","deprecated":null,"version":null,"openapi":"/openapi.json post /sdk/create-session","href":"/api-reference/botshield-gate/create-a-grant-token"},{"title":"Create a verification request","deprecated":null,"version":null,"openapi":"/openapi.json post /sdk/create-verification-link","href":"/api-reference/botshield-gate/create-a-verification-request"},{"title":"Get verification status","deprecated":null,"version":null,"openapi":"/openapi.json get /verification/status","href":"/api-reference/botshield-gate/get-verification-status"},{"title":"Verify a result token","deprecated":null,"version":null,"openapi":"/openapi.json post /sdk/verify-token","href":"/api-reference/botshield-gate/verify-a-result-token"},{"title":"Revoke a pending verification","deprecated":null,"version":null,"openapi":"/openapi.json post /sdk/revoke-verification","href":"/api-reference/botshield-gate/revoke-a-pending-verification"},{"title":"Revoke a grant token","description":null,"deprecated":null,"version":null,"openapi":"/openapi.json post /sdk/logout","href":"/api-reference/botshield-gate/revoke-a-grant-token"}]},{"group":"Gates API","pages":[{"title":"Place a gate","deprecated":null,"version":null,"openapi":"/openapi.json post /gates-api/create","href":"/api-reference/gates-api/place-a-gate"},{"title":"Activate a gate","description":"Make a draft gate live. Idempotent — an active gate is returned as-is. In Production the gate goes live only when the business is verified, a domain is verified and the plan's gate allowance has room.","deprecated":null,"version":null,"openapi":"/openapi.json post /gates-api/activate","href":"/api-reference/gates-api/activate-a-gate"},{"title":"Close a gate","deprecated":null,"version":null,"openapi":"/openapi.json post /gates-api/close","href":"/api-reference/gates-api/close-a-gate"},{"title":"Extend a gate's window","deprecated":null,"version":null,"openapi":"/openapi.json post /gates-api/extend","href":"/api-reference/gates-api/extend-a-gates-window"},{"title":"Cancel a gate","deprecated":null,"version":null,"openapi":"/openapi.json post /gates-api/cancel","href":"/api-reference/gates-api/cancel-a-gate"},{"title":"Get a gate","deprecated":null,"version":null,"openapi":"/openapi.json get /gates-api/get","href":"/api-reference/gates-api/get-a-gate"},{"title":"List gates","deprecated":null,"version":null,"openapi":"/openapi.json get /gates-api/list","href":"/api-reference/gates-api/list-gates"},{"title":"Place a BotShield Action","deprecated":null,"version":null,"openapi":"/openapi.json post /gates-api/actions/create","href":"/api-reference/gates-api/place-a-botshield-action"},{"title":"List BotShield Actions","deprecated":null,"version":null,"openapi":"/openapi.json get /gates-api/actions/list","href":"/api-reference/gates-api/list-botshield-actions"},{"title":"Turn a BotShield Action on or off","deprecated":null,"version":null,"openapi":"/openapi.json post /gates-api/actions/set-state","href":"/api-reference/gates-api/turn-a-botshield-action-on-or-off"},{"title":"Ask a linked person to confirm an action","deprecated":null,"version":null,"openapi":"/openapi.json post /gates-api/actions/request","href":"/api-reference/gates-api/ask-a-linked-person-to-confirm-an-action"},{"title":"Where an action request stands","deprecated":null,"version":null,"openapi":"/openapi.json get /gates-api/actions/request-status","href":"/api-reference/gates-api/where-an-action-request-stands"}]},{"group":"Verified Accounts","pages":[{"title":"Get a Verified Account status","deprecated":null,"version":null,"openapi":"/openapi.json get /secured-accounts/status","href":"/api-reference/verified-accounts/get-a-verified-account-status"},{"title":"List Verified Accounts","deprecated":null,"version":null,"openapi":"/openapi.json get /secured-accounts/list","href":"/api-reference/verified-accounts/list-verified-accounts"},{"title":"Unlink (revoke) a Verified Account","deprecated":null,"version":null,"openapi":"/openapi.json post /secured-accounts/revoke","href":"/api-reference/verified-accounts/unlink-revoke-a-verified-account"}]},{"group":"Agents Ask","pages":[{"title":"Propose an action for human confirmation","deprecated":null,"version":null,"openapi":"/openapi.json post /agentlink/inquire","href":"/api-reference/agents-ask/propose-an-action-for-human-confirmation"},{"title":"Check action proposal status","deprecated":null,"version":null,"openapi":"/openapi.json get /agentlink/check-status","href":"/api-reference/agents-ask/check-action-proposal-status"},{"title":"Cancel a queued action proposal","deprecated":null,"version":null,"openapi":"/openapi.json post /agentlink/cancel","href":"/api-reference/agents-ask/cancel-a-queued-action-proposal"}]}]}]},"basePath":"","title":"Place a gate - BotShield Documentation","buildId":"dpl_Fyv1NbzwP68g2bEH2Roy98uY1zmE","deploymentId":"dpl_Fyv1NbzwP68g2bEH2Roy98uY1zmE","dynamics":["c2aa737661","2b790eda92","b0f84f53ff","a9bb46feb3"],"chunks":["OpenApiReferenceProvider-DdEMm2kG.js","utils-BMo572L7.js","cloneDeep-izs3Hzxb.js","_Uint8Array-BVIqJ90l.js","isObjectLike-C8vmzPEN.js","isArray-Dcu1dQ5t.js","utils-C-4m9KAx.js","toString-BX-iyh8G.js","isSymbol-CSH9U2Gm.js","addUniqueKeysToSchema-DPLK2Oq9.js","snippetPresets-BKjfJMC9.js","style-to-object-BY3JEAdk.js","v4-DIgz8zy6.js","conditional-requirements-CFM0id0Q.js","ApiExamples-DTsgtCEj.js","isEqual-BfaiBbcl.js","usePlaygroundInputsStore-C8vmhyQM.js","shallow-r9w8LQGS.js","getApiPlaygroundDisplay-DjPI64HQ.js","CodeSnippet-C8Bvhl16.js","CodeSnippets-BtWUwcMy.js","Page-BIYvYBgk.js","getPastedJson-Dcm_3Pgl.js","icon-BXwrTpjc.js","MethodPill-CcjfVmmy.js","DuplicateIcon-BuKIbXAQ.js","createIcon-DaL9yXsO.js","DynamicMarkdown-Co5nikxh.js","SectionHeading-P4UNTsMZ.js","axios-vUo_bRtp.js","Markdown-CEfymfIH.js","clsx-Dq9TQuNi.js","lib-DuNMoZ05.js","lib-B8HbPgcC.js","html-void-elements-mCSPHezU.js","dist-D2J8knkn.js","katex-YMM-FMeD.js","marked.esm-CZWythHk.js","AssistantPageLink-BgZ2ThuU.js"]}