Grants uncapped Subnet Points to a recipient identified by exactly one of bitrobot_user_id, email, discord_user_id, or wallet_address.
This is a dedicated, single-purpose endpoint for granting Subnet Points — not tied to a task run or the multiplexed events endpoint. It accepts the grant fields directly (no event_type wrapper) and returns the resolved recipient. It is functionally equivalent to sending a points_grant event to Create a new event: both share the same grant logic, validation, and client_ref idempotency, and both record the grant against your subnet’s current open distribution window. The server assigns the grant timestamp and epoch automatically, so caller-supplied granted_at and brb_epoch_id are rejected with a 422.
If the recipient is identified by email, discord_user_id, or an unregistered wallet_address and is not yet a BitRobot user, the grant is held on a placeholder account and applied when they sign up or connect the wallet (see created_placeholder_user in the response). Granting by bitrobot_user_id requires an existing user.
Request body for the dedicated Grant Subnet Points endpoint. The same grant fields as the points_grant event, without the event_type discriminator. The recipient is identified by exactly one of bitrobot_user_id, email, discord_user_id, or wallet_address. The grant is recorded against the current open distribution window; the server assigns the timestamp and epoch automatically, so granted_at and brb_epoch_id are not accepted.
Exactly one of bitrobot_user_id, email, discord_user_id, or wallet_address must be provided. On grants, email, discord_user_id, and wallet_address support pre-registration attribution: if the recipient is not yet on BitRobot, the grant is held on a placeholder and applied when they create a BitRobot account or connect the wallet. bitrobot_user_id must reference an existing user, and revocations always require a recipient who already exists.
Whether a placeholder account was created because the recipient was not yet a BitRobot user. The grant is applied to the real account when they sign up (email or Discord) or connect the wallet. Always false when granting by bitrobot_user_id.
Example:
false
{"docsConfig":{"theme":"mint","$schema":"https://mintlify.com/docs.json","name":"BitRobot","colors":{"primary":"#5d4bff","light":"#eeecfe","dark":"#4a3acc"},"logo":{"light":"https://mintcdn.com/bitrobot/lyIPJ4DsA8cKp50w/logo/light.svg?fit=max\u0026auto=format\u0026n=lyIPJ4DsA8cKp50w\u0026q=85\u0026s=18accea02ce6ad7a85f82b988d3bac87","dark":"https://mintcdn.com/bitrobot/lyIPJ4DsA8cKp50w/logo/dark.svg?fit=max\u0026auto=format\u0026n=lyIPJ4DsA8cKp50w\u0026q=85\u0026s=41a5abf124fdc224b1607f0535b73774"},"favicon":"https://mintcdn.com/bitrobot/lyIPJ4DsA8cKp50w/favicon.svg?fit=max\u0026auto=format\u0026n=lyIPJ4DsA8cKp50w\u0026q=85\u0026s=1f1da64f08642134cd1e468955181b78","navbar":{"links":[{"icon":"discord","href":"https://discord.gg/VzgKQAba2A","label":"Community"}],"primary":{"type":"button","label":"App","href":"https://app.bitrobot.ai"}},"footer":{"socials":{"x":"https://x.com/bitrobotnetwork","github":"https://github.com/bitrobot-foundation"}},"contextual":{"options":["copy","view","chatgpt","claude","perplexity","mcp","cursor","vscode"],"display":"header"},"styling":{"latex":false},"navigation":{"global":{"anchors":[{"anchor":"Website","icon":"globe","href":"https://bitrobot.ai"}]},"pages":[]}},"deployment":{"deploymentMetadataValue":{"subdomain":"bitrobot","hasAudioNarration":false,"actualSubdomain":"bitrobot","customDomains":["docs.bitrobot.ai"],"gitSource":{"type":"github","owner":"bitrobot-foundation","repo":"bitrobot-public-docs","deployBranch":"main","contentDirectory":"","isPrivate":true,"mountPath":"","label":""},"chroma":{"liveDeploymentHistoryId":"6ad531f219affb9b01b0418f","collectionId":"045ed5c0-da9a-4dc0-977c-a160f47c7dcf","schemaVersion":"v3","latestBuiltDeploymentHistoryId":"6ad531f219affb9b01b0418f"},"entitlements":{},"buildId":"6ad531f219affb9b01b0418f","clientVersion":"0.0.4076","searchFilterCounts":[{"language":"default","tag":"API reference","count":12},{"language":"default","tag":"Guides","count":8},{"language":"default","tag":"Getting started","count":8},{"language":"default","tag":"Subnets","count":4},{"language":"default","tag":"Task Batch Uploads","count":2},{"language":"default","tag":"Task Runs","count":2},{"language":"default","tag":"Connect","count":1},{"language":"default","tag":"Events","count":1},{"language":"default","tag":"API documentation","count":1},{"language":"default","tag":"Points","count":1}]},"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":"agent-mintlify-slack","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-integrations-settings","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"rbac-expansion","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-pr-grouping","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"custom-prefix","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"analytics-v7","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"user-flows-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"no-publish-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-onboarding","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"llms-txt-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving-live","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"stripTemperatureMiddleware","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"support-platform-pylon-zendesk","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"instant-rollback","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications-server","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-fable","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fixed-ai-action-pricing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automation-resolve-merge-conflict","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"scoped-publishing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"mintql","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"page-level-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-version-history-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-page-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"full-page-search","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workspace-projects","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"assistant-v5","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fork-pr-previews","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"revalidation-jwt","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-sso-scim","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"hobby-abuse-scan","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"dashboard-inbox","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-signup","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"turbopuffer-dual-write","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-enabled","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"approve-review-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"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":"comment-mode","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false}],"googleFontsInlined":false},"customCss":[],"page":{"pagePath":"api-reference/points/grant-subnet-points","slug":"/api-reference/points/grant-subnet-points","pageMetadata":{"openapi":"post /subnets/{subnet_id}/points/grants","title":"Grant Subnet Points","description":"Grants uncapped Subnet Points to a recipient identified by exactly one of `bitrobot_user_id`, `email`, `discord_user_id`, or `wallet_address`.\n\nThis is a dedicated, single-purpose endpoint for granting Subnet Points — not tied to a task run or the multiplexed events endpoint. It accepts the grant fields directly (no `event_type` wrapper) and returns the resolved recipient. It is functionally equivalent to sending a `points_grant` event to [Create a new event](/api-reference/events/create-a-new-event): both share the same grant logic, validation, and `client_ref` idempotency, and both record the grant against your subnet's current open distribution window. The server assigns the grant timestamp and epoch automatically, so caller-supplied `granted_at` and `brb_epoch_id` are rejected with a `422`.\n\nIf the recipient is identified by `email`, `discord_user_id`, or an unregistered `wallet_address` and is not yet a BitRobot user, the grant is held on a placeholder account and applied when they sign up or connect the wallet (see `created_placeholder_user` in the response). Granting by `bitrobot_user_id` requires an existing user.","href":"/api-reference/points/grant-subnet-points"},"description":{"compiledSource":"\"use strict\";\nconst {Fragment: _Fragment, jsx: _jsx, jsxs: _jsxs} = arguments[0];\nconst {useMDXComponents: _provideComponents} = arguments[0];\nfunction _createMdxContent(props) {\n const _components = {\n a: \"a\",\n code: \"code\",\n p: \"p\",\n ..._provideComponents(),\n ...props.components\n };\n return _jsxs(_Fragment, {\n children: [_jsxs(_components.p, {\n children: [\"Grants uncapped Subnet Points to a recipient identified by exactly one of \", _jsx(_components.code, {\n children: \"bitrobot_user_id\"\n }), \", \", _jsx(_components.code, {\n children: \"email\"\n }), \", \", _jsx(_components.code, {\n children: \"discord_user_id\"\n }), \", or \", _jsx(_components.code, {\n children: \"wallet_address\"\n }), \".\"]\n }), \"\\n\", _jsxs(_components.p, {\n children: [\"This is a dedicated, single-purpose endpoint for granting Subnet Points — not tied to a task run or the multiplexed events endpoint. It accepts the grant fields directly (no \", _jsx(_components.code, {\n children: \"event_type\"\n }), \" wrapper) and returns the resolved recipient. It is functionally equivalent to sending a \", _jsx(_components.code, {\n children: \"points_grant\"\n }), \" event to \", _jsx(_components.a, {\n href: \"/api-reference/events/create-a-new-event\",\n children: \"Create a new event\"\n }), \": both share the same grant logic, validation, and \", _jsx(_components.code, {\n children: \"client_ref\"\n }), \" idempotency, and both record the grant against your subnet’s current open distribution window. The server assigns the grant timestamp and epoch automatically, so caller-supplied \", _jsx(_components.code, {\n children: \"granted_at\"\n }), \" and \", _jsx(_components.code, {\n children: \"brb_epoch_id\"\n }), \" are rejected with a \", _jsx(_components.code, {\n children: \"422\"\n }), \".\"]\n }), \"\\n\", _jsxs(_components.p, {\n children: [\"If the recipient is identified by \", _jsx(_components.code, {\n children: \"email\"\n }), \", \", _jsx(_components.code, {\n children: \"discord_user_id\"\n }), \", or an unregistered \", _jsx(_components.code, {\n children: \"wallet_address\"\n }), \" and is not yet a BitRobot user, the grant is held on a placeholder account and applied when they sign up or connect the wallet (see \", _jsx(_components.code, {\n children: \"created_placeholder_user\"\n }), \" in the response). Granting by \", _jsx(_components.code, {\n children: \"bitrobot_user_id\"\n }), \" requires an existing user.\"]\n })]\n });\n}\nfunction MDXContent(props = {}) {\n const {wrapper: MDXLayout} = {\n ..._provideComponents(),\n ...props.components\n };\n return MDXLayout ? _jsx(MDXLayout, {\n ...props,\n children: _jsx(_createMdxContent, {\n ...props\n })\n }) : _createMdxContent(props);\n}\nreturn {\n default: MDXContent\n};\n","frontmatter":{},"scope":{}},"pageType":"default","mdx":{"mdxSource":{"compiledSource":"\"use strict\";const{Fragment:_Fragment,jsx:_jsx}=arguments[0];const{useMDXComponents:_provideComponents}=arguments[0];function _createMdxContent(props){return _jsx(_Fragment,{})}function MDXContent(props={}){const{wrapper:MDXLayout}={..._provideComponents(),...props.components};return MDXLayout?_jsx(MDXLayout,{...props,children:_jsx(_createMdxContent,{...props})}):_createMdxContent(props)}return{default:MDXContent}","frontmatter":{},"scope":{"config":{},"pageMetadata":{"openapi":"post /subnets/{subnet_id}/points/grants","title":"Grant Subnet Points","description":"Grants uncapped Subnet Points to a recipient identified by exactly one of `bitrobot_user_id`, `email`, `discord_user_id`, or `wallet_address`.\n\nThis is a dedicated, single-purpose endpoint for granting Subnet Points — not tied to a task run or the multiplexed events endpoint. It accepts the grant fields directly (no `event_type` wrapper) and returns the resolved recipient. It is functionally equivalent to sending a `points_grant` event to [Create a new event](/api-reference/events/create-a-new-event): both share the same grant logic, validation, and `client_ref` idempotency, and both record the grant against your subnet's current open distribution window. The server assigns the grant timestamp and epoch automatically, so caller-supplied `granted_at` and `brb_epoch_id` are rejected with a `422`.\n\nIf the recipient is identified by `email`, `discord_user_id`, or an unregistered `wallet_address` and is not yet a BitRobot user, the grant is held on a placeholder account and applied when they sign up or connect the wallet (see `created_placeholder_user` in the response). Granting by `bitrobot_user_id` requires an existing user.","href":"/api-reference/points/grant-subnet-points"}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[],"codeExamples":{}},"jsLinks":[],"openApiReferenceData":{"operation":{"summary":"Grant Subnet Points","description":"Grants uncapped Subnet Points to a recipient identified by exactly one of `bitrobot_user_id`, `email`, `discord_user_id`, or `wallet_address`.\n\nThis is a dedicated, single-purpose endpoint for granting Subnet Points — not tied to a task run or the multiplexed events endpoint. It accepts the grant fields directly (no `event_type` wrapper) and returns the resolved recipient. It is functionally equivalent to sending a `points_grant` event to [Create a new event](/api-reference/events/create-a-new-event): both share the same grant logic, validation, and `client_ref` idempotency, and both record the grant against your subnet's current open distribution window. The server assigns the grant timestamp and epoch automatically, so caller-supplied `granted_at` and `brb_epoch_id` are rejected with a `422`.\n\nIf the recipient is identified by `email`, `discord_user_id`, or an unregistered `wallet_address` and is not yet a BitRobot user, the grant is held on a placeholder account and applied when they sign up or connect the wallet (see `created_placeholder_user` in the response). Granting by `bitrobot_user_id` requires an existing user.","operationId":"grantSubnetPoints","tags":["Points"],"security":["6968031d-bb85-450e-9d8e-c7b6bfab83e4"],"parameters":["3e2ce396-be8c-4408-9d17-20e1d126c092"],"requestBody":"662ce174-6029-4abc-a2fe-22980c2069d0","responses":{"201":"67b47464-03d6-4089-8f57-04efe9ed7da7","401":"05827390-933e-44ba-9e80-e21cea2aec97","422":"e4e771df-c473-4c52-9e34-1cf2c3e2c386"},"method":"post","type":"path","servers":["18c7761c-57e3-463e-b8a0-01325bbf5691","bd8a040d-e936-4914-b056-69885413b6c2"],"path":"/subnets/{subnet_id}/points/grants","baseUrlOptions":["https://api-stage.bitrobot.ai","https://api.bitrobot.ai"],"title":"Grant Subnet Points","codeSamples":[],"requiredOnlyExamples":false,"requestExampleType":"generated","responseExampleType":"generated"},"dependencies":{"parameters":{"3e2ce396-be8c-4408-9d17-20e1d126c092":{"name":"subnet_id","in":"path","required":true,"description":"The unique identifier of the subnet (ULID format)","schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$","isRequired":true,"description":"The unique identifier of the subnet (ULID format)","uniqueKey":"","typeLabel":"string"},"example":"01ARZ3NDEKTSV4RRFFQ69G5FAV"}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"title":"Grant Subnet Points Request","description":"Request body for the dedicated Grant Subnet Points endpoint. The same grant fields as the `points_grant` event, without the `event_type` discriminator. The recipient is identified by exactly one of `bitrobot_user_id`, `email`, `discord_user_id`, or `wallet_address`. The grant is recorded against the current open distribution window; the server assigns the timestamp and epoch automatically, so `granted_at` and `brb_epoch_id` are not accepted.","type":"object","required":["recipient","points","reason"],"properties":{"recipient":{"title":"Reward Recipient","type":"object","description":"Exactly one of `bitrobot_user_id`, `email`, `discord_user_id`, or `wallet_address` must be provided. On grants, `email`, `discord_user_id`, and `wallet_address` support pre-registration attribution: if the recipient is not yet on BitRobot, the grant is held on a placeholder and applied when they create a BitRobot account or connect the wallet. `bitrobot_user_id` must reference an existing user, and revocations always require a recipient who already exists.","properties":{"bitrobot_user_id":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$","description":"BitRobot user ID (ULID format).","uniqueKey":"recipient.bitrobot_user_id","typeLabel":"string"},"email":{"type":"string","format":"email","description":"Email address for pre-signup reward attribution.","uniqueKey":"recipient.email","typeLabel":"string\u003cemail>"},"discord_user_id":{"type":"string","description":"Stable Discord user ID for pre-signup reward attribution.","uniqueKey":"recipient.discord_user_id","typeLabel":"string"},"wallet_address":{"type":"string","description":"Solana wallet address for pre-registration reward attribution.","uniqueKey":"recipient.wallet_address","typeLabel":"string"}},"example":{"bitrobot_user_id":"01HQXK5V7YWQZ8NGQB2RJVT9MS"},"isRequired":true,"uniqueKey":"recipient","typeLabel":"Reward Recipient · object"},"points":{"type":"integer","minimum":1,"description":"The number of points to grant (must be greater than 0).","example":100,"isRequired":true,"uniqueKey":"points","typeLabel":"integer"},"reason":{"type":"string","maxLength":256,"description":"The reason for granting these points.","example":"Task completion bonus","isRequired":true,"uniqueKey":"reason","typeLabel":"string"},"client_ref":{"type":"string","maxLength":64,"description":"Optional client reference ID for idempotency and tracking. Duplicate values for the same subnet are rejected.","example":"task_123_completion","uniqueKey":"client_ref","typeLabel":"string"}},"example":{"recipient":{"bitrobot_user_id":"01HQXK5V7YWQZ8NGQB2RJVT9MS"},"points":100,"reason":"Task completion bonus","client_ref":"task_123_completion"},"uniqueKey":"","typeLabel":"Grant Subnet Points Request · object"},"examples":{"byUserId":{"title":"byUserId","value":{"recipient":{"bitrobot_user_id":"01HQXK5V7YWQZ8NGQB2RJVT9MS"},"points":100,"reason":"Task completion bonus","client_ref":"task_123_completion"}},"byEmail":{"title":"byEmail","value":{"recipient":{"email":"[email protected]"},"points":100,"reason":"Task completion bonus","client_ref":"task_124_completion"}},"byWallet":{"title":"byWallet","value":{"recipient":{"wallet_address":"HN7cABqLq46Es1jh92dQQisAq662SmxELLLsHHe4YWrH"},"points":100,"reason":"Task completion bonus","client_ref":"task_125_completion"}}},"exampleType":"examples"}},"exampleType":"examples"},"responses":{"67b47464-03d6-4089-8f57-04efe9ed7da7":{"description":"Subnet Points granted successfully.","content":{"application/json":{"schema":{"type":"object","required":["message","ledger_id","resolved_user_id","resolved_by","created_placeholder_user"],"properties":{"message":{"type":"string","description":"Human-readable confirmation message.","example":"Subnet Points granted successfully","isRequired":true,"uniqueKey":"message","typeLabel":"string"},"ledger_id":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$","description":"ID of the points ledger entry created for this grant.","example":"01ARZ3NDEKTSV4RRFFQ69G5FAX","isRequired":true,"uniqueKey":"ledger_id","typeLabel":"string"},"resolved_user_id":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$","description":"ID of the BitRobot user (or newly created placeholder user) the grant was applied to.","example":"01HQXK5V7YWQZ8NGQB2RJVT9MS","isRequired":true,"uniqueKey":"resolved_user_id","typeLabel":"string"},"resolved_by":{"type":"string","enum":["bitrobot_user_id","email","discord","wallet_address"],"description":"Which recipient identifier was used to resolve or create the user.","example":"bitrobot_user_id","isRequired":true,"uniqueKey":"resolved_by","typeLabel":"enum\u003cstring>"},"created_placeholder_user":{"type":"boolean","description":"Whether a placeholder account was created because the recipient was not yet a BitRobot user. The grant is applied to the real account when they sign up (email or Discord) or connect the wallet. Always `false` when granting by `bitrobot_user_id`.","example":false,"isRequired":true,"uniqueKey":"created_placeholder_user","typeLabel":"boolean"}},"uniqueKey":"","typeLabel":"object"},"example":{"message":"Subnet Points granted successfully","ledger_id":"01ARZ3NDEKTSV4RRFFQ69G5FAX","resolved_user_id":"01HQXK5V7YWQZ8NGQB2RJVT9MS","resolved_by":"bitrobot_user_id","created_placeholder_user":false},"examples":{"Example":{"title":"Example","value":{"message":"Subnet Points granted successfully","ledger_id":"01ARZ3NDEKTSV4RRFFQ69G5FAX","resolved_user_id":"01HQXK5V7YWQZ8NGQB2RJVT9MS","resolved_by":"bitrobot_user_id","created_placeholder_user":false}}},"exampleType":"examples"}},"exampleType":"examples"},"05827390-933e-44ba-9e80-e21cea2aec97":{"description":"Unauthorized - Invalid or missing API key","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"string","description":"Description of the error","example":"Invalid or missing API key","isRequired":true,"uniqueKey":"error","typeLabel":"string"}},"uniqueKey":"","typeLabel":"object"},"example":{"error":"Invalid or missing API key"},"examples":{"Example":{"title":"Example","value":{"error":"Invalid or missing API key"}}},"exampleType":"examples"}},"exampleType":"examples"},"e4e771df-c473-4c52-9e34-1cf2c3e2c386":{"description":"Unprocessable Entity - Invalid grant data","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"string","description":"Description of the error","example":"Invalid or missing API key","isRequired":true,"uniqueKey":"error","typeLabel":"string"}},"uniqueKey":"","typeLabel":"object"},"examples":{"missingRecipient":{"title":"missingRecipient","value":{"error":"Exactly one recipient identity is required: bitrobot_user_id, email, discord_user_id, or wallet_address"}},"invalidPoints":{"title":"invalidPoints","value":{"error":"Points must be greater than 0"}},"missingReason":{"title":"missingReason","value":{"error":"Reason is required"}},"duplicateClientRef":{"title":"duplicateClientRef","value":{"error":"Duplicate client_ref: task_123_completion"}},"historicalTimingNotAccepted":{"title":"historicalTimingNotAccepted","value":{"error":"granted_at and brb_epoch_id are not accepted for subnet-facing points grants; the server assigns the current epoch and open window"}},"noOpenWindow":{"title":"noOpenWindow","value":{"error":"No open Subnet Points window is available for this subnet"}}},"exampleType":"examples"}},"exampleType":"examples"}},"security":{"6968031d-bb85-450e-9d8e-c7b6bfab83e4":{"BearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"API Key","description":"API key authentication. Your API key should start with `brb_`.\n\nExample: `Authorization: Bearer brb_1234567890abcdef`\n","scopes":[],"schemeName":"BearerAuth"}}},"servers":{"18c7761c-57e3-463e-b8a0-01325bbf5691":{"url":"https://api-stage.bitrobot.ai","description":"Staging server"},"bd8a040d-e936-4914-b056-69885413b6c2":{"url":"https://api.bitrobot.ai","description":"Production server"}},"processedSecurityOptions":[{"schemes":[{"scheme":{"type":"http","scheme":"bearer","bearerFormat":"API Key","description":"API key authentication. Your API key should start with `brb_`.\n\nExample: `Authorization: Bearer brb_1234567890abcdef`\n","scopes":[],"schemeName":"BearerAuth"},"schema":{"title":"Bearer Auth","type":"string","isRequired":true,"description":"API key authentication. Your API key should start with `brb_`.\n\nExample: `Authorization: Bearer brb_1234567890abcdef`\n","format":"bearer","typeLabel":"string\u003cbearer>","deprecated":false},"schemeName":"BearerAuth","name":"Authorization"}],"title":"BearerAuth"}]},"originalFileLocation":"openapi.json"},"subdomain":"bitrobot","siteName":"BitRobot","title":"Grant Subnet Points - BitRobot","navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{}},"lastModified":"2026-06-23T18:14:47.996Z","originalFileLocation":"api-reference/points/grant-subnet-points.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=\"Grants uncapped Subnet Points to a recipient identified by exactly one of bitrobot_user_id, email, discord_user_id, or wallet_address. This is a dedicated, single-purpose endpoint for granting Subnet Points — not tied to a task run or the multiplexed events endpoint. It accepts the grant fields directly (no event_type wrapper) and returns the resolved recipient. It is functionally equivalent to sending a points_grant event to Create a new event: both share the same grant logic, validation, and client_ref idempotency, and both record the grant against your subnet\u0026#x27;s current open distribution window. The server assigns the grant timestamp and epoch automatically, so caller-supplied granted_at and brb_epoch_id are rejected with a 422. If the recipient is identified by email, discord_user_id, or an unregistered wallet_address and is not yet a BitRobot user, the grant is held on a placeholder account and applied when they sign up or connect the wallet (see created_placeholder_user in the response). Granting by bitrobot_user_id requires an existing user.\">\u003cmeta data-mint-head name=\"application-name\" content=\"BitRobot\">\u003cmeta data-mint-head name=\"generator\" content=\"Mintlify\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/bitrobot/E0cmnQBcZQQi9OJz/_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/bitrobot/E0cmnQBcZQQi9OJz/_generated/favicon/apple-touch-icon.png\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/bitrobot/E0cmnQBcZQQi9OJz/_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/bitrobot/E0cmnQBcZQQi9OJz/_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/bitrobot/E0cmnQBcZQQi9OJz/_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/bitrobot/E0cmnQBcZQQi9OJz/_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/bitrobot/E0cmnQBcZQQi9OJz/_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/bitrobot/E0cmnQBcZQQi9OJz/_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/bitrobot/E0cmnQBcZQQi9OJz/_generated/favicon-dark/favicon.ico\" media=\"(prefers-color-scheme: dark)\">\u003cmeta data-mint-head property=\"og:title\" content=\"Grant Subnet Points - BitRobot\">\u003cmeta data-mint-head property=\"og:description\" content=\"Grants uncapped Subnet Points to a recipient identified by exactly one of bitrobot_user_id, email, discord_user_id, or wallet_address. This is a dedicated, single-purpose endpoint for granting Subnet Points — not tied to a task run or the multiplexed events endpoint. It accepts the grant fields directly (no event_type wrapper) and returns the resolved recipient. It is functionally equivalent to sending a points_grant event to Create a new event: both share the same grant logic, validation, and client_ref idempotency, and both record the grant against your subnet\u0026#x27;s current open distribution window. The server assigns the grant timestamp and epoch automatically, so caller-supplied granted_at and brb_epoch_id are rejected with a 422. If the recipient is identified by email, discord_user_id, or an unregistered wallet_address and is not yet a BitRobot user, the grant is held on a placeholder account and applied when they sign up or connect the wallet (see created_placeholder_user in the response). Granting by bitrobot_user_id requires an existing user.\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"BitRobot\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://docs.bitrobot.ai/api-reference/points/grant-subnet-points\">\u003cmeta data-mint-head property=\"og:type\" content=\"website\">\u003cmeta data-mint-head property=\"og:image\" content=\"https://bitrobot.mintlify.site/_mintlify/api/og/v2?division=Points\u0026amp;title=Grant+Subnet+Points\u0026amp;description=Grants+uncapped+Subnet+Points+to+a+recipient+identified+by+exactly+one+of+%60bitrobot_user_id%60%2C+%60email%60%2C+%60discord_user_id%60%2C+or+%60wallet_address%60.%0A%0AThis+is+a+dedica\u0026amp;theme=3517e46cd36d37f8c655c380\u0026amp;signature=edfc7779f2cbe344ea89771c7b0ad325a2fee39991872c837fe985a0481e3ac0\">\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=\"Grant Subnet Points - BitRobot\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"Grants uncapped Subnet Points to a recipient identified by exactly one of bitrobot_user_id, email, discord_user_id, or wallet_address. This is a dedicated, single-purpose endpoint for granting Subnet Points — not tied to a task run or the multiplexed events endpoint. It accepts the grant fields directly (no event_type wrapper) and returns the resolved recipient. It is functionally equivalent to sending a points_grant event to Create a new event: both share the same grant logic, validation, and client_ref idempotency, and both record the grant against your subnet\u0026#x27;s current open distribution window. The server assigns the grant timestamp and epoch automatically, so caller-supplied granted_at and brb_epoch_id are rejected with a 422. If the recipient is identified by email, discord_user_id, or an unregistered wallet_address and is not yet a BitRobot user, the grant is held on a placeholder account and applied when they sign up or connect the wallet (see created_placeholder_user in the response). Granting by bitrobot_user_id requires an existing user.\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://bitrobot.mintlify.site/_mintlify/api/og/v2?division=Points\u0026amp;title=Grant+Subnet+Points\u0026amp;description=Grants+uncapped+Subnet+Points+to+a+recipient+identified+by+exactly+one+of+%60bitrobot_user_id%60%2C+%60email%60%2C+%60discord_user_id%60%2C+or+%60wallet_address%60.%0A%0AThis+is+a+dedica\u0026amp;theme=3517e46cd36d37f8c655c380\u0026amp;signature=edfc7779f2cbe344ea89771c7b0ad325a2fee39991872c837fe985a0481e3ac0\">\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/bitrobot/E0cmnQBcZQQi9OJz/_generated/favicon/browserconfig.xml\">\u003cmeta data-mint-head name=\"apple-mobile-web-app-title\" content=\"BitRobot\">\u003cmeta data-mint-head name=\"msapplication-TileColor\" content=\"#5d4bff\">\u003clink data-mint-head rel=\"canonical\" href=\"https://docs.bitrobot.ai/api-reference/points/grant-subnet-points\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/api-reference/points/grant-subnet-points.md\">\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"Organization\",\"@id\":\"https://docs.bitrobot.ai/#organization\",\"name\":\"BitRobot\",\"url\":\"https://docs.bitrobot.ai\",\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https://mintcdn.com/bitrobot/lyIPJ4DsA8cKp50w/logo/light.svg?fit=max\u0026auto=format\u0026n=lyIPJ4DsA8cKp50w\u0026q=85\u0026s=18accea02ce6ad7a85f82b988d3bac87\"}},{\"@type\":\"WebSite\",\"@id\":\"https://docs.bitrobot.ai#website\",\"name\":\"BitRobot\",\"url\":\"https://docs.bitrobot.ai\",\"publisher\":{\"@id\":\"https://docs.bitrobot.ai/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https://docs.bitrobot.ai/api-reference/points/grant-subnet-points#webpage\",\"url\":\"https://docs.bitrobot.ai/api-reference/points/grant-subnet-points\",\"name\":\"Grant Subnet Points\",\"description\":\"Grants uncapped Subnet Points to a recipient identified by exactly one of bitrobot_user_id, email, discord_user_id, or wallet_address. This is a dedicated, single-purpose endpoint for granting Subnet Points — not tied to a task run or the multiplexed events endpoint. It accepts the grant fields directly (no event_type wrapper) and returns the resolved recipient. It is functionally equivalent to sending a points_grant event to Create a new event: both share the same grant logic, validation, and client_ref idempotency, and both record the grant against your subnet's current open distribution window. The server assigns the grant timestamp and epoch automatically, so caller-supplied granted_at and brb_epoch_id are rejected with a 422. If the recipient is identified by email, discord_user_id, or an unregistered wallet_address and is not yet a BitRobot user, the grant is held on a placeholder account and applied when they sign up or connect the wallet (see created_placeholder_user in the response). Granting by bitrobot_user_id requires an existing user.\",\"dateModified\":\"2026-06-23T18:14:47.996Z\",\"isPartOf\":{\"@id\":\"https://docs.bitrobot.ai#website\"},\"breadcrumb\":{\"@id\":\"https://docs.bitrobot.ai/api-reference/points/grant-subnet-points#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://docs.bitrobot.ai/api-reference/points/grant-subnet-points#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"BitRobot\",\"item\":\"https://docs.bitrobot.ai\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Grant Subnet Points\",\"item\":\"https://docs.bitrobot.ai/api-reference/points/grant-subnet-points\"}]},{\"@type\":[\"TechArticle\",\"APIReference\"],\"@id\":\"https://docs.bitrobot.ai/api-reference/points/grant-subnet-points#apireference\",\"headline\":\"Grant Subnet Points\",\"name\":\"Grant Subnet Points\",\"description\":\"Grants uncapped Subnet Points to a recipient identified by exactly one of bitrobot_user_id, email, discord_user_id, or wallet_address. This is a dedicated, single-purpose endpoint for granting Subnet Points — not tied to a task run or the multiplexed events endpoint. It accepts the grant fields directly (no event_type wrapper) and returns the resolved recipient. It is functionally equivalent to sending a points_grant event to Create a new event: both share the same grant logic, validation, and client_ref idempotency, and both record the grant against your subnet's current open distribution window. The server assigns the grant timestamp and epoch automatically, so caller-supplied granted_at and brb_epoch_id are rejected with a 422. If the recipient is identified by email, discord_user_id, or an unregistered wallet_address and is not yet a BitRobot user, the grant is held on a placeholder account and applied when they sign up or connect the wallet (see created_placeholder_user in the response). Granting by bitrobot_user_id requires an existing user.\",\"url\":\"https://docs.bitrobot.ai/api-reference/points/grant-subnet-points\",\"mainEntityOfPage\":{\"@id\":\"https://docs.bitrobot.ai/api-reference/points/grant-subnet-points#webpage\"},\"dateModified\":\"2026-06-23T18:14:47.996Z\",\"publisher\":{\"@id\":\"https://docs.bitrobot.ai/#organization\"},\"isPartOf\":{\"@id\":\"https://docs.bitrobot.ai#website\"}}]}\u003c/script>\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@type\":\"WebSite\",\"name\":\"BitRobot\",\"creator\":{\"@type\":\"Organization\",\"name\":\"Mintlify\",\"url\":\"https://mintlify.com\"}}\u003c/script>","siteName":"BitRobot","nav":{"global":{"anchors":[{"anchor":"Website","icon":"globe","href":"https://bitrobot.ai"}]},"tabs":[{"tab":"Guides","pages":[{"title":"Guides","href":""}]},{"tab":"API reference","groups":[{"group":"API documentation","pages":[{"title":"Introduction","href":"/api-reference/introduction"}]},{"group":"Events","pages":[{"openapi":"post /subnets/{subnet_id}/events","title":"Create a new event","href":"/api-reference/events/create-a-new-event"}]},{"group":"Task Runs","pages":[{"openapi":"get /subnets/{subnet_id}/task_runs/{id}/status","title":"Get task run status","href":"/api-reference/task-runs/get-task-run-status"},{"openapi":"get /subnets/{subnet_id}/task_runs/pending","title":"List pending task runs","description":"Lists task runs whose on-chain end has not landed yet (`blockchain_status` is `pending` or `running`). Results are ordered oldest-`updated_at`-first, so anything that has been stuck the longest floats to the top. Validated/finished runs are not included — unvalidated runs whose on-chain end has completed are normal lag and excluded. Limited to 100 rows; if `count` equals `limit`, you have more pending rows than fit in one response.","href":"/api-reference/task-runs/list-pending-task-runs"}]},{"group":"Points","pages":[{"openapi":"post /subnets/{subnet_id}/points/grants","title":"Grant Subnet Points","href":"/api-reference/points/grant-subnet-points"}]},{"group":"Connect","pages":[{"openapi":"post /subnets/{subnet_id}/connect/confirm","title":"Confirm a wallet connection","description":"Confirms the wallet the signed-in user has on your subnet for a [BitRobot Connect](/bitrobot-connect) request.\n\nCall this from your backend when the user presses **Connect** on your connect page. Send the `request_id` and `nonce` you stored when the user landed on the page, and the user's wallet address.\n\nRedirect the browser to the `return_url` in the response verbatim, fragment included. Branch on `auth_code`, not the HTTP status: a `409 already_confirmed` response can also carry `auth_code`. Never log, display, or store `auth_code`.\n\nIf you send an `Idempotency-Key` header, use a new value on every attempt, including retries. Limit: 120 requests per minute per API key.","href":"/api-reference/connect/confirm-wallet-connection"}]},{"group":"Subnets","pages":[{"openapi":"get /subnets/{subnet_id}/balances","title":"List balances","href":"/api-reference/subnets/list-balances"},{"openapi":"get /subnets/{subnet_id}/points/history","title":"List points history","href":"/api-reference/subnets/list-points-history"},{"openapi":"get /subnets/{subnet_id}/conversions","title":"List conversions","href":"/api-reference/subnets/list-conversions"},{"openapi":"get /subnets/{subnet_id}/resources/by-wallet","title":"List resources by wallet","href":"/api-reference/subnets/list-resources-by-wallet"}]},{"group":"Task Batch Uploads","pages":[{"openapi":"post /subnets/{subnet_id}/task_batch_uploads","title":"Upload a task batch CSV","href":"/api-reference/task-batch-uploads/upload-a-task-batch-csv"},{"openapi":"get /subnets/{subnet_id}/task_batch_uploads/{id}","title":"Get task batch upload status","href":"/api-reference/task-batch-uploads/get-task-batch-upload-status"}]}]}]},"basePath":"","title":"Grant Subnet Points - BitRobot","buildId":"dpl_8LJbrAiZvr1K98WQNZXCyY5AvT34","deploymentId":"dpl_8LJbrAiZvr1K98WQNZXCyY5AvT34","dynamics":["c2aa737661","2b790eda92","b0f84f53ff","a9bb46feb3"],"chunks":["OpenApiReferenceProvider-i2a3QZ8E.js","utils-ChLwp8m0.js","cloneDeep-izs3Hzxb.js","_Uint8Array-BVIqJ90l.js","isObjectLike-C8vmzPEN.js","isArray-Dcu1dQ5t.js","utils-DRktVTDc.js","toString-BX-iyh8G.js","isSymbol-CSH9U2Gm.js","addUniqueKeysToSchema-CA2pEs4T.js","snippetPresets-ClQ6XrKD.js","style-to-object-BY3JEAdk.js","v4-DIgz8zy6.js","ApiExamples-Ct_Lv36y.js","isEqual-BfaiBbcl.js","usePlaygroundInputsStore-Cn2PYw9e.js","shallow-rkyymjXQ.js","getApiPlaygroundDisplay-BB9vkXtE.js","CodeSnippet-Bm5RU7m1.js","CodeSnippets-BgU9Deuz.js","Page-BUDYNlhG.js","getPastedJson-BD-6NNum.js","icon-8Z6tud2e.js","MethodPill-Tuzr4g3V.js","DuplicateIcon-0ceWFYhN.js","createIcon-FBXow_ST.js","DynamicMarkdown-CD8713Yy.js","SectionHeading-7zgzQbH-.js","axios-vUo_bRtp.js","Markdown-D7Ofw1oz.js","clsx-eKJ4rcii.js","lib-DuNMoZ05.js","lib-B8HbPgcC.js","html-void-elements-mCSPHezU.js","dist-CwjSCXIK.js","katex-YMM-FMeD.js","marked.esm-CZWythHk.js","AssistantPageLink-9EK5IAXV.js"]}