{"openapi":"3.1.0","info":{"title":"AutoBoy Public API","version":"0.1.0","description":"REST API for AutoBoy — browse projects, view detailed stats about your own launch, create buy orders and manage your AutoBoy smart wallet.\n\n## Authentication\n\nMost endpoints require an API key, sent as a bearer token:\n\n```\nAuthorization: Bearer autoboy_…\n```\n\n## Quick start\n\n- **Buying tokens?** Request a key — `POST /api/public/v1/api-key-requests`.\n- **Launching a token?** Register your project — `POST /api/public/v1/projects`; approval comes with an API key.\n\nNew to AutoBoy? Read the product docs https://docs.thefirm.biz."},"servers":[{"url":"https://thefirm.biz"}],"tags":[{"name":"API Keys","description":"Request and create API keys."},{"name":"Identity","description":"Inspect the identity behind your API key."},{"name":"Projects","description":"Browse projects and their buyers."},{"name":"Buy Orders","description":"Read and manage the API key owner's pre-launch buy orders."},{"name":"AutoBoy Wallet","description":"Balances of, and withdrawals from, the AutoBoy smart wallet."},{"name":"Feedback","description":"Send feedback to The Firm."}],"components":{"securitySchemes":{"apiKeyAuth":{"type":"http","scheme":"bearer","bearerFormat":"API key","description":"API key issued via POST /api/public/v1/api-keys."},"adminAuth":{"type":"http","scheme":"bearer","bearerFormat":"Admin secret","description":"Privileged admin secret for issuing new API keys. Required to create API keys."}},"schemas":{"ErrorResponse":{"type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}},"required":["error","message"],"example":{"error":"Bad request","message":"Invalid request body"}},"CreateApiKeyResponse":{"type":"object","properties":{"apiKey":{"type":"string","description":"The plaintext API key. Returned exactly once — it is never stored in plaintext and cannot be retrieved again. Store it securely on receipt; if lost, create a new key with a different label.","example":"autoboy_abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQ"},"autoboyWalletAddress":{"type":"string","description":"On-chain smart wallet address provisioned for this key.","example":"0x1234567890123456789012345678901234567890"}},"required":["apiKey","autoboyWalletAddress"]},"CreateApiKeyConflictResponse":{"type":"object","properties":{"error":{"type":"string","description":"Short HTTP error label, always \"Conflict\"."},"code":{"type":"string","enum":["already_provisioned","provisioning_in_progress"],"description":"Machine-readable conflict reason. `provisioning_in_progress`: another request is still creating this key — retry the same label for the final status. `already_provisioned`: a key for this label was already issued and cannot be retrieved."},"message":{"type":"string","description":"Human-readable explanation of the conflict."},"autoboyWalletAddress":{"type":"string","description":"Smart wallet for an already-provisioned label, so the caller can recover it. Omitted while provisioning is still in progress.","example":"0x1234567890123456789012345678901234567890"}},"required":["error","code","message"]},"RequestApiKeyResponse":{"type":"object","properties":{"status":{"type":"string","enum":["received"]},"message":{"type":"string"}},"required":["status","message"]},"IdentityResponse":{"type":"object","properties":{"autoboyWalletAddress":{"type":"string","description":"AutoBoy smart wallet address owned by the API key.","example":"0x1234567890123456789012345678901234567890"},"label":{"type":"string","description":"Human-readable name the API key was created with."},"ownedProjectSlugs":{"type":"array","items":{"type":"string"},"description":"Project slugs owned by this API key. Empty when the key owns no project."}},"required":["autoboyWalletAddress","label","ownedProjectSlugs"]},"ProjectsResponse":{"type":"object","properties":{"data":{"type":"array","items":{"type":"object","properties":{"identity":{"type":"object","properties":{"slug":{"type":"string","description":"URL-safe identifier, used as the `{slug}` path parameter.","example":"yurts-by-nurt"},"displayName":{"type":"string","description":"Human-readable project name.","example":"Yurts By Nurt"},"fid":{"type":"number","description":"Farcaster ID of the project account, if any.","example":3324275},"xHandle":{"type":["string","null"],"description":"X (Twitter) handle without the leading @, or null."},"farcasterUsername":{"type":"string","description":"Farcaster username, if any.","example":"nurt"}},"required":["slug","displayName","xHandle"],"description":"Stable identifiers and handles for the project."},"content":{"type":"object","properties":{"bannerImageUrl":{"type":"string","description":"Absolute URL of the profile banner image."},"pfpUrl":{"type":"string","description":"Absolute URL of the profile picture."},"bio":{"type":"array","items":{"type":"string"},"description":"Profile bio, as an ordered list of paragraphs."},"telegramUrl":{"type":["string","null"],"description":"Telegram link, if any."},"websiteUrl":{"type":["string","null"],"description":"Project website, if any.","example":"https://thefirm.biz/autoboy"},"teamMembers":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string","description":"Team member’s name.","example":"Nurt Baglard"},"pfpUrl":{"type":"string","description":"Absolute URL of the team member’s profile picture.","example":"https://thefirm.biz/profiles/headshots/headshot-nurt.png"},"followerCount":{"type":"number","description":"Farcaster follower count.","example":1},"roles":{"type":"array","items":{"type":"object","properties":{"projectName":{"type":"string","example":"Yurts By Nurt"},"title":{"type":"string","example":"Spokesperson"}},"required":["projectName","title"]},"description":"Positions the member holds, across this and other projects."},"farcasterUrl":{"type":["string","null"],"description":"Link to the member’s Farcaster profile, if any.","example":"https://farcaster.xyz/nurt"},"xUrl":{"type":["string","null"],"description":"Link to the member’s X profile, if any."}},"required":["name","pfpUrl","followerCount","roles"]},"description":"Public team roster for the project."}},"required":["bio"],"description":"Display content for the project profile."},"expectedLaunch":{"oneOf":[{"type":"object","properties":{"kind":{"type":"string","enum":["datetime"]},"value":{"type":"string","description":"ISO 8601 timestamp of the expected launch.","example":"2026-07-01T15:00:00.000Z"}},"required":["kind","value"]},{"type":"object","properties":{"kind":{"type":"string","enum":["month"]},"value":{"type":"string","description":"Expected launch month, e.g. \"2026-07\".","example":"2026-07"}},"required":["kind","value"]},{"type":"object","properties":{"kind":{"type":"string","enum":["label"]},"value":{"type":"string","description":"Free-text launch window, e.g. \"Soon\".","example":"Soon"}},"required":["kind","value"]}],"description":"When the project expects to launch, expressed as a precise datetime, a month, or a free-text label. The `kind` field discriminates the shape of `value`."},"status":{"type":"object","properties":{"isProfileRegistered":{"type":"boolean","description":"Whether the project has registered a profile with AutoBoy."},"isLaunchVerified":{"type":"boolean","description":"Whether the project has verified its token deployment will support auto-buys via AutoBoy."},"hasSniperProtection":{"type":"boolean","description":"Whether the project has enabled Sniper Protection, deploying its token via AutoBoy at launch."}},"required":["isProfileRegistered","isLaunchVerified","hasSniperProtection"],"description":"Verification and protection status flags for the project."},"defaultMaxSpendUsdc":{"type":"string","description":"Owner-only. Default max autobuy spend in USDC applied to every user on this project, overriding the global default. Present only when the requesting API key owns the project.","example":"500"},"maxSpendOverrides":{"type":"array","items":{"type":"object"},"description":"Owner-only. Per-account max autobuy spend overrides. Each entry pairs a USDC limit with the accounts it applies to, matched by FID, address, or X username. Present only when the requesting API key owns the project."},"clanker4DeploymentConfig":{"type":"object","description":"Owner-only. Clanker V4 token deployment config for sniper-protected projects: token admin, pool configuration, and fee structure. Present only when the requesting API key owns the project."}},"required":["identity","content","status"]}},"meta":{"type":"object","properties":{"total":{"type":"integer","description":"Total number of projects across all pages.","example":12},"limit":{"type":"integer","description":"Page size that was applied to this response.","example":20},"nextCursor":{"type":["string","null"],"description":"Cursor for the next page, or null when this is the last page. Pass it as the `cursor` query parameter to page forward."}},"required":["total","limit","nextCursor"]}},"required":["data","meta"]},"RegisterProjectResponse":{"type":"object","properties":{"status":{"type":"string","enum":["received"]},"message":{"type":"string"}},"required":["status","message"]},"ProjectDetailResponse":{"type":"object","properties":{"identity":{"type":"object","properties":{"slug":{"type":"string","description":"URL-safe identifier, used as the `{slug}` path parameter.","example":"yurts-by-nurt"},"displayName":{"type":"string","description":"Human-readable project name.","example":"Yurts By Nurt"},"fid":{"type":"number","description":"Farcaster ID of the project account, if any.","example":3324275},"xHandle":{"type":["string","null"],"description":"X (Twitter) handle without the leading @, or null."},"farcasterUsername":{"type":"string","description":"Farcaster username, if any.","example":"nurt"}},"required":["slug","displayName","xHandle"],"description":"Stable identifiers and handles for the project."},"content":{"type":"object","properties":{"bannerImageUrl":{"type":"string","description":"Absolute URL of the profile banner image."},"pfpUrl":{"type":"string","description":"Absolute URL of the profile picture."},"bio":{"type":"array","items":{"type":"string"},"description":"Profile bio, as an ordered list of paragraphs."},"telegramUrl":{"type":["string","null"],"description":"Telegram link, if any."},"websiteUrl":{"type":["string","null"],"description":"Project website, if any.","example":"https://thefirm.biz/autoboy"},"teamMembers":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string","description":"Team member’s name.","example":"Nurt Baglard"},"pfpUrl":{"type":"string","description":"Absolute URL of the team member’s profile picture.","example":"https://thefirm.biz/profiles/headshots/headshot-nurt.png"},"followerCount":{"type":"number","description":"Farcaster follower count.","example":1},"roles":{"type":"array","items":{"type":"object","properties":{"projectName":{"type":"string","example":"Yurts By Nurt"},"title":{"type":"string","example":"Spokesperson"}},"required":["projectName","title"]},"description":"Positions the member holds, across this and other projects."},"farcasterUrl":{"type":["string","null"],"description":"Link to the member’s Farcaster profile, if any.","example":"https://farcaster.xyz/nurt"},"xUrl":{"type":["string","null"],"description":"Link to the member’s X profile, if any."}},"required":["name","pfpUrl","followerCount","roles"]},"description":"Public team roster for the project."}},"required":["bio"],"description":"Display content for the project profile."},"expectedLaunch":{"oneOf":[{"type":"object","properties":{"kind":{"type":"string","enum":["datetime"]},"value":{"type":"string","description":"ISO 8601 timestamp of the expected launch.","example":"2026-07-01T15:00:00.000Z"}},"required":["kind","value"]},{"type":"object","properties":{"kind":{"type":"string","enum":["month"]},"value":{"type":"string","description":"Expected launch month, e.g. \"2026-07\".","example":"2026-07"}},"required":["kind","value"]},{"type":"object","properties":{"kind":{"type":"string","enum":["label"]},"value":{"type":"string","description":"Free-text launch window, e.g. \"Soon\".","example":"Soon"}},"required":["kind","value"]}],"description":"When the project expects to launch, expressed as a precise datetime, a month, or a free-text label. The `kind` field discriminates the shape of `value`."},"status":{"type":"object","properties":{"isProfileRegistered":{"type":"boolean","description":"Whether the project has registered a profile with AutoBoy."},"isLaunchVerified":{"type":"boolean","description":"Whether the project has verified its token deployment will support auto-buys via AutoBoy."},"hasSniperProtection":{"type":"boolean","description":"Whether the project has enabled Sniper Protection, deploying its token via AutoBoy at launch."}},"required":["isProfileRegistered","isLaunchVerified","hasSniperProtection"],"description":"Verification and protection status flags for the project."},"defaultMaxSpendUsdc":{"type":"string","description":"Owner-only. Default max autobuy spend in USDC applied to every user on this project, overriding the global default. Present only when the requesting API key owns the project.","example":"500"},"maxSpendOverrides":{"type":"array","items":{"type":"object"},"description":"Owner-only. Per-account max autobuy spend overrides. Each entry pairs a USDC limit with the accounts it applies to, matched by FID, address, or X username. Present only when the requesting API key owns the project."},"clanker4DeploymentConfig":{"type":"object","description":"Owner-only. Clanker V4 token deployment config for sniper-protected projects: token admin, pool configuration, and fee structure. Present only when the requesting API key owns the project."},"stats":{"type":"object","properties":{"buyerCount":{"type":"integer","description":"Number of accounts that have placed an order for the project.","example":482},"launch":{"type":["object","null"],"properties":{"tokenAddress":{"type":"string","description":"Contract address of the launched token.","example":"0x1234567890123456789012345678901234567890"},"launchedAt":{"type":"string","description":"ISO 8601 timestamp of the launch.","example":"2026-05-12T18:30:00.000Z"}},"required":["tokenAddress","launchedAt"],"description":"Launch details once the token is live, or null before launch."},"simulatedMaxFdvUsdc":{"type":"string","description":"Owner-only. Simulated fully-diluted valuation in USD with AutoBoy buys.","example":"1250000"},"startingMcapUsdc":{"type":"string","description":"Owner-only. Starting market cap in USD from the deployment pool config.","example":"50000"},"totalDepositedUsdc":{"type":"string","description":"Owner-only. USDC currently deposited across buyer smart wallets.","example":"125000"},"totalBuysUsdc":{"type":"string","description":"Owner-only. Total committed buy spend in USDC across all buyers.","example":"98000"},"averageBuyUsdc":{"type":"string","description":"Owner-only. Average committed buy spend in USDC per buyer.","example":"203.32"}},"required":["buyerCount","launch"]}},"required":["identity","content","status","stats"]},"BuyersResponse":{"type":"object","properties":{"data":{"type":"array","items":{"type":"object","properties":{"source":{"type":"string","enum":["farcaster","x","wallet"],"description":"Which identity the buyer is shown under. `farcaster`: a Farcaster account. `x`: an X (Twitter) account. `wallet`: a wallet with no linked social account.","example":"farcaster"},"fid":{"type":"integer","description":"Farcaster ID when `source` is `farcaster`; `0` otherwise.","example":3324275},"username":{"type":"string","description":"Display handle: the Farcaster username (`source: farcaster`), the X handle without the leading @ (`source: x`), or a shortened wallet address such as `0x1234…5678` (`source: wallet`).","example":"nurt"},"pfpUrl":{"type":["string","null"],"description":"Absolute URL of the buyer’s profile picture, or null when none is available. Always null for `wallet` buyers."},"followerCount":{"type":"integer","description":"Follower count of the buyer’s account, used to rank the page. `0` when no follower data is available, such as `wallet` buyers.","example":1240},"maxSpendUsdc":{"type":"string","description":"Owner-only. Committed max autobuy spend in USDC for this buyer.","example":"250"},"maxFdvUsdc":{"type":["string","null"],"description":"Owner-only. Max fully-diluted valuation in USD the buyer will buy up to, or null for no cap.","example":"1000000"}},"required":["source","fid","username","pfpUrl","followerCount"]}},"meta":{"type":"object","properties":{"limit":{"type":"integer","description":"Page size that was applied to this response.","example":20},"nextCursor":{"type":["string","null"],"description":"Cursor for the next page, or null when this is the last page. Pass it as the `cursor` query parameter to page forward."}},"required":["limit","nextCursor"]}},"required":["data","meta"]},"BuyOrderListResponse":{"type":"object","properties":{"data":{"type":"array","items":{"type":"object","properties":{"slug":{"type":"string","example":"thefirm"},"status":{"type":"string","enum":["active","execution_in_progress","execution_success","execution_failed","deleted","monitoring_started","monitoring_expired"],"example":"active"},"maxSpendUsdc":{"type":"string","description":"Per-buy USDC spend cap.","example":"50"},"maxFdvUsdc":{"type":["string","null"],"description":"FDV cap in USDC, or null when uncapped.","example":"5000000"},"expiresInMs":{"type":"integer","description":"How long, in milliseconds, the buy order stays active.","example":86400000},"createdAt":{"type":"string","format":"date-time","example":"2026-01-15T09:30:00.000Z"},"updatedAt":{"type":["string","null"],"format":"date-time","example":null}},"required":["slug","status","maxSpendUsdc","maxFdvUsdc","expiresInMs","createdAt","updatedAt"]}},"meta":{"type":"object","properties":{"limit":{"type":"integer","example":20},"nextCursor":{"type":["string","null"],"description":"Opaque cursor for the next page, or null on the last page. Pass it back as the `cursor` query parameter.","example":"eyJtYXhTcGVuZFVzZGNBdG9taWMiOiIyNTAwMDAwMCIsImlkIjoiYjJjM2Q0ZTUifQ"}},"required":["limit","nextCursor"]}},"required":["data","meta"]},"BuyOrderMutationResponse":{"type":"object","properties":{"results":{"type":"array","items":{"oneOf":[{"type":"object","properties":{"slug":{"type":"string","example":"thefirm"},"ok":{"type":"boolean","enum":[true]},"status":{"type":"string","enum":["created","updated","deleted","unchanged","already_deleted"],"example":"created"}},"required":["slug","ok","status"]},{"type":"object","properties":{"slug":{"type":"string","example":"no-such-project"},"ok":{"type":"boolean","enum":[false]},"code":{"type":"string","enum":["unknown_project","already_exists","not_found","not_modifiable","invalid_value","duplicate_in_request"],"example":"unknown_project"},"message":{"type":"string","example":"No project matches the slug"}},"required":["slug","ok","code","message"]}]}}},"required":["results"]},"TokenBalance":{"type":"object","properties":{"address":{"type":"string","description":"Token contract address. Native ETH uses the 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE sentinel address.","example":"0x1234567890123456789012345678901234567890"},"symbol":{"type":"string","example":"USDC"},"name":{"type":"string","example":"USD Coin"},"decimals":{"type":"integer","example":6},"balance":{"type":"string","description":"Balance in atomic units (smallest denomination), base-10 string.","example":"2500000"}},"required":["address","symbol","name","decimals","balance"]},"BalanceResponse":{"type":"object","properties":{"autoboyWalletAddress":{"type":"string","example":"0x1234567890123456789012345678901234567890"},"balances":{"type":"array","items":{"type":"object","properties":{"address":{"type":"string","description":"Token contract address. Native ETH uses the 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE sentinel address.","example":"0x1234567890123456789012345678901234567890"},"symbol":{"type":"string","example":"USDC"},"name":{"type":"string","example":"USD Coin"},"decimals":{"type":"integer","example":6},"balance":{"type":"string","description":"Balance in atomic units (smallest denomination), base-10 string.","example":"2500000"}},"required":["address","symbol","name","decimals","balance"]},"description":"ERC-20 tokens and native ETH held by the autoboy smart wallet on Base. Native ETH, when held, is the first entry; an empty wallet returns an empty array."}},"required":["autoboyWalletAddress","balances"]},"WithdrawResponse":{"type":"object","properties":{"txHash":{"type":"string","description":"Hash of the confirmed on-chain transaction.","example":"0xa3f5c9e1b7d2048fa3f5c9e1b7d2048fa3f5c9e1b7d2048fa3f5c9e1b7d2048f"},"tokenAddress":{"type":"string","example":"0x1234567890123456789012345678901234567890"},"withdrawAddress":{"type":"string","example":"0x1234567890123456789012345678901234567890"},"amount":{"type":"string","description":"Atomic units actually transferred (decimal string).","example":"12500000"}},"required":["txHash","tokenAddress","withdrawAddress","amount"]},"SendFeedbackResponse":{"type":"object","properties":{"status":{"type":"string","enum":["received"]},"message":{"type":"string"}},"required":["status","message"]}},"parameters":{}},"paths":{"/api/public/v1/api-key-requests":{"post":{"operationId":"requestApiKey","summary":"Request an API key","description":"Submits a request for an API key to The Firm.\n\nThe Computer Operations Division will review the request within 52 business weeks and reach out via the contact provided.","tags":["API Keys"],"requestBody":{"required":true,"description":"Particulars on you and your venture.","content":{"application/json":{"schema":{"type":"object","properties":{"projectName":{"type":"string","minLength":1,"maxLength":100,"description":"The name your project or agent trades under."},"projectUrls":{"type":"array","items":{"type":"string","format":"uri"},"minItems":1,"maxItems":10,"description":"One or more URLs for the project - site, repo, socials."},"projectInfo":{"type":"string","minLength":1,"maxLength":2000,"description":"Tell us what you are building and why."},"contact":{"type":"string","minLength":1,"maxLength":200,"description":"Where we may reach you to deliver the key (Telegram, X, Farcaster, etc)."},"businessSignOff":{"type":"string","minLength":1,"maxLength":500,"description":"An optional business sign-off to close out your request."}},"required":["projectName","projectUrls","projectInfo","contact"]}}}},"responses":{"202":{"description":"Request received and entered into the record for review.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RequestApiKeyResponse"},"example":{"status":"received","message":"Your request is in and headed to the Computer Operations Division for review. If it's approved, we'll reach out via the contact you provided."}}}},"400":{"description":"Invalid or missing request body.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Failed to submit the request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"503":{"description":"API key requests are temporarily unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"example":{"error":"Service unavailable","message":"The application desk is temporarily closed. Please try again later."}}}}}}},"/api/public/v1/me":{"get":{"operationId":"getIdentity","summary":"Get current identity","description":"Returns the identity behind the API key used to make the request: its AutoBoy smart wallet, label, and the slugs of the projects it owns.","tags":["Identity"],"security":[{"apiKeyAuth":[]}],"responses":{"200":{"description":"The identity behind the API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IdentityResponse"},"example":{"autoboyWalletAddress":"0x1234567890123456789012345678901234567890","label":"arca-bot","ownedProjectSlugs":["arcabot"]}}}},"401":{"description":"Missing, invalid, or revoked API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Failed to read the identity.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/public/v1/projects":{"get":{"operationId":"listProjects","summary":"List projects","description":"Returns a cursor-paginated list of public project profiles. Pass the `meta.nextCursor` from a response as the `cursor` of the next request to page forward.","tags":["Projects"],"security":[{"apiKeyAuth":[]}],"parameters":[{"schema":{"type":"string","minLength":1,"description":"Opaque cursor marking where the previous page ended. Omit it to fetch the first page; pass the `meta.nextCursor` from a response verbatim to fetch the next. A null `meta.nextCursor` means there are no more pages. Treat the value as opaque — its format varies per endpoint."},"required":false,"description":"Opaque cursor marking where the previous page ended. Omit it to fetch the first page; pass the `meta.nextCursor` from a response verbatim to fetch the next. A null `meta.nextCursor` means there are no more pages. Treat the value as opaque — its format varies per endpoint.","name":"cursor","in":"query"},{"schema":{"type":["integer","null"],"default":20,"description":"Maximum number of items per page. Defaults to 20; values are clamped to 1–100."},"required":false,"description":"Maximum number of items per page. Defaults to 20; values are clamped to 1–100.","name":"limit","in":"query"}],"responses":{"200":{"description":"A page of projects.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProjectsResponse"},"example":{"data":[{"identity":{"slug":"yurts-by-nurt","displayName":"Yurts By Nurt","fid":3324275,"xHandle":null,"farcasterUsername":"nurt"},"content":{"bannerImageUrl":"https://thefirm.biz/profiles/yurts-by-nurt/yurts-logo.png","pfpUrl":"https://thefirm.biz/profiles/yurts-by-nurt/yurts-pfp.png","bio":["Yurts by Nurt aims to be a yurt-centric construction organization leveraging synergy and quantum resistance to deliver sustainable employee housing."],"websiteUrl":"https://thefirm.biz/autoboy","teamMembers":[{"name":"Nurt Baglard","pfpUrl":"https://thefirm.biz/profiles/headshots/headshot-nurt.png","followerCount":1,"farcasterUrl":"https://farcaster.xyz/nurt","roles":[{"projectName":"Yurts By Nurt","title":"Spokesperson"}]}]},"status":{"isProfileRegistered":true,"isLaunchVerified":true,"hasSniperProtection":true}}],"meta":{"total":12,"limit":20,"nextCursor":"yurts-by-nurt"}}}}},"400":{"description":"Invalid pagination parameters or an unknown cursor.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"invalidPagination":{"value":{"error":"Bad request","message":"Invalid pagination parameters"}},"unknownCursor":{"value":{"error":"Bad request","message":"cursor does not match a known project"}}}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"missingAuthorizationHeader":{"value":{"error":"Unauthorized","message":"Missing or invalid Authorization header"}},"invalidApiKey":{"value":{"error":"Unauthorized","message":"Invalid API key"}}}}}}}},"post":{"operationId":"registerProject","summary":"Register a project","description":"Submit a project or agent for registration with AutoBoy.\n\nNo API key required - Jeffrey (Computer Operator) reviews each submission and responds via the contact provided. On approval you receive your API key.","tags":["Projects"],"requestBody":{"required":true,"description":"Particulars on your project.","content":{"application/json":{"schema":{"type":"object","properties":{"projectName":{"type":"string","minLength":1,"maxLength":100,"description":"The name your project conducts business under."},"projectUrls":{"type":"array","items":{"type":"string","format":"uri"},"minItems":1,"maxItems":10,"description":"One or more URLs to corroborate the venture - site, repo, socials."},"projectInfo":{"type":"string","minLength":1,"maxLength":2000,"description":"State your business: what you are building, and why it is booming."},"contact":{"type":"string","minLength":1,"maxLength":200,"description":"Where the Computer Operations Division may reach you (Telegram, X, Farcaster, etc)."},"businessSignOff":{"type":"string","minLength":1,"maxLength":500,"description":"An optional business sign-off to close out your request."}},"required":["projectName","projectUrls","projectInfo","contact"]}}}},"responses":{"202":{"description":"Submission received and entered into the record for review.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RegisterProjectResponse"},"example":{"status":"received","message":"Your petition is in and entered into the record. Jeffrey reviews each submission personally; should it prove a fit, we'll reach out via the contact you provided. Business is booming."}}}},"400":{"description":"Invalid or missing request body.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Failed to submit the registration.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"503":{"description":"Project registrations are temporarily unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"example":{"error":"Service unavailable","message":"The registration desk is temporarily closed. Please petition again later."}}}}}}},"/api/public/v1/projects/{slug}":{"get":{"operationId":"getProject","summary":"Get a project","description":"Returns a project profile and its current stats. If your API key is associated with the project, the response includes additional owner-only stats.","tags":["Projects"],"security":[{"apiKeyAuth":[]}],"parameters":[{"schema":{"type":"string","description":"URL-safe identifier of the project.","example":"yurts-by-nurt"},"required":true,"description":"URL-safe identifier of the project.","name":"slug","in":"path"}],"responses":{"200":{"description":"The project and its stats.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProjectDetailResponse"},"example":{"identity":{"slug":"yurts-by-nurt","displayName":"Yurts By Nurt","fid":3324275,"xHandle":null,"farcasterUsername":"nurt"},"content":{"bannerImageUrl":"https://thefirm.biz/profiles/yurts-by-nurt/yurts-logo.png","pfpUrl":"https://thefirm.biz/profiles/yurts-by-nurt/yurts-pfp.png","bio":["Yurts by Nurt aims to be a yurt-centric construction organization leveraging synergy and quantum resistance to deliver sustainable employee housing."],"websiteUrl":"https://thefirm.biz/autoboy","teamMembers":[{"name":"Nurt Baglard","pfpUrl":"https://thefirm.biz/profiles/headshots/headshot-nurt.png","followerCount":1,"farcasterUrl":"https://farcaster.xyz/nurt","roles":[{"projectName":"Yurts By Nurt","title":"Spokesperson"}]}]},"status":{"isProfileRegistered":true,"isLaunchVerified":true,"hasSniperProtection":true},"stats":{"buyerCount":482,"launch":{"tokenAddress":"0x4200000000000000000000000000000000000042","launchedAt":"2026-05-12T18:30:00.000Z"}}}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"missingAuthorizationHeader":{"value":{"error":"Unauthorized","message":"Missing or invalid Authorization header"}},"invalidApiKey":{"value":{"error":"Unauthorized","message":"Invalid API key"}}}}}},"404":{"description":"No project matches the slug.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"example":{"error":"Not found","message":"No project matches the slug"}}}}}}},"/api/public/v1/projects/{slug}/buyers":{"get":{"operationId":"listProjectBuyers","summary":"List a project's buyers","description":"Returns a cursor-paginated page of a project's buyers, ordered by follower count (highest first). When the request's API key owns the project, each buyer additionally carries `maxSpendUsdc` & `maxFdvUsdc`.","tags":["Projects"],"security":[{"apiKeyAuth":[]}],"parameters":[{"schema":{"type":"string","description":"URL-safe identifier of the project.","example":"yurts-by-nurt"},"required":true,"description":"URL-safe identifier of the project.","name":"slug","in":"path"},{"schema":{"type":"string","minLength":1,"description":"Opaque cursor marking where the previous page ended. Omit it to fetch the first page; pass the `meta.nextCursor` from a response verbatim to fetch the next. A null `meta.nextCursor` means there are no more pages. Treat the value as opaque — its format varies per endpoint."},"required":false,"description":"Opaque cursor marking where the previous page ended. Omit it to fetch the first page; pass the `meta.nextCursor` from a response verbatim to fetch the next. A null `meta.nextCursor` means there are no more pages. Treat the value as opaque — its format varies per endpoint.","name":"cursor","in":"query"},{"schema":{"type":["integer","null"],"default":20,"description":"Maximum number of items per page. Defaults to 20; values are clamped to 1–100."},"required":false,"description":"Maximum number of items per page. Defaults to 20; values are clamped to 1–100.","name":"limit","in":"query"}],"responses":{"200":{"description":"A page of buyers.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BuyersResponse"},"example":{"data":[{"source":"farcaster","fid":3324275,"username":"nurt","pfpUrl":"https://thefirm.biz/profiles/headshots/headshot-nurt.png","followerCount":1240},{"source":"x","fid":0,"username":"thefirm","pfpUrl":"https://pbs.twimg.com/profile_images/thefirm.jpg","followerCount":980},{"source":"wallet","fid":0,"username":"0x1234…5678","pfpUrl":null,"followerCount":0}],"meta":{"limit":20,"nextCursor":null}}}}},"400":{"description":"Invalid pagination parameters or cursor.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"invalidPagination":{"value":{"error":"Bad request","message":"Invalid pagination parameters"}},"invalidCursor":{"value":{"error":"Bad request","message":"Invalid cursor"}}}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"missingAuthorizationHeader":{"value":{"error":"Unauthorized","message":"Missing or invalid Authorization header"}},"invalidApiKey":{"value":{"error":"Unauthorized","message":"Invalid API key"}}}}}},"404":{"description":"No project matches the slug.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"example":{"error":"Not found","message":"No project matches the slug"}}}}}}},"/api/public/v1/orders":{"get":{"operationId":"listBuyOrders","summary":"List buy orders","description":"Returns a cursor-paginated page of the API key owner's buy orders, ordered by spend amount. Excludes deleted buy orders unless `?status=deleted` is passed.","tags":["Buy Orders"],"security":[{"apiKeyAuth":[]}],"parameters":[{"schema":{"type":"string","minLength":1,"description":"Opaque cursor marking where the previous page ended. Omit it to fetch the first page; pass the `meta.nextCursor` from a response verbatim to fetch the next. A null `meta.nextCursor` means there are no more pages. Treat the value as opaque — its format varies per endpoint."},"required":false,"description":"Opaque cursor marking where the previous page ended. Omit it to fetch the first page; pass the `meta.nextCursor` from a response verbatim to fetch the next. A null `meta.nextCursor` means there are no more pages. Treat the value as opaque — its format varies per endpoint.","name":"cursor","in":"query"},{"schema":{"type":["integer","null"],"default":20,"description":"Maximum number of items per page. Defaults to 20; values are clamped to 1–100."},"required":false,"description":"Maximum number of items per page. Defaults to 20; values are clamped to 1–100.","name":"limit","in":"query"},{"schema":{"type":"string","enum":["active","execution_in_progress","execution_success","execution_failed","deleted","monitoring_started","monitoring_expired"]},"required":false,"name":"status","in":"query"}],"responses":{"200":{"description":"A page of buy orders.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BuyOrderListResponse"},"example":{"data":[{"slug":"thefirm","status":"active","maxSpendUsdc":"50","maxFdvUsdc":"5000000","expiresInMs":86400000,"createdAt":"2026-01-15T09:30:00.000Z","updatedAt":null},{"slug":"charms","status":"active","maxSpendUsdc":"25","maxFdvUsdc":null,"expiresInMs":3600000,"createdAt":"2026-01-14T12:00:00.000Z","updatedAt":"2026-01-15T08:00:00.000Z"}],"meta":{"limit":20,"nextCursor":"eyJtYXhTcGVuZFVzZGNBdG9taWMiOiIyNTAwMDAwMCIsImlkIjoiYjJjM2Q0ZTUifQ"}}}}},"400":{"description":"Invalid pagination parameters, an unknown cursor, or an unknown status filter.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"invalidPagination":{"value":{"error":"Bad request","message":"Invalid pagination parameters"}},"invalidCursor":{"value":{"error":"Bad request","message":"Invalid cursor"}},"invalidStatus":{"value":{"error":"Bad request","message":"status must be one of: active, execution_in_progress, execution_success, execution_failed, deleted, monitoring_started, monitoring_expired"}}}}}},"401":{"description":"Missing, invalid, or revoked API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"missingAuthorizationHeader":{"value":{"error":"Unauthorized","message":"Missing or invalid Authorization header"}},"invalidApiKey":{"value":{"error":"Unauthorized","message":"Invalid API key"}}}}}},"500":{"description":"An unexpected server-side error occurred.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"example":{"error":"Internal server error","message":"Failed to load buy orders"}}}}}},"post":{"operationId":"createBuyOrders","summary":"Create buy orders","description":"Creates one or more pre-launch buy orders for the listed projects — each buy order auto-buys that project's future token at launch.\n\n- Each item is processed independently. The response is always HTTP 200 once authenticated and the body is valid — check the per-item `ok` flag in `results` (index-aligned to your request) for each outcome.\n- Re-ordering a project that already has an active buy order is idempotent (`status: \"unchanged\"`).","tags":["Buy Orders"],"security":[{"apiKeyAuth":[]}],"requestBody":{"required":true,"description":"The projects to order and their per-project buy caps.","content":{"application/json":{"schema":{"type":"object","properties":{"items":{"type":"array","items":{"type":"object","properties":{"slug":{"type":"string","minLength":1,"description":"Public project slug identifying the project to place a buy order for.","example":"thefirm"},"maxSpendUsdc":{"type":"string","pattern":"^\\d+(\\.\\d+)?$","description":"Maximum USDC to spend auto-buying this project on each buy.","example":"50"},"maxFdvUsdc":{"type":"string","pattern":"^\\d+(\\.\\d+)?$","description":"Maximum fully-diluted valuation, in USDC, at which the auto-buy should execute. Omit to set NO FDV cap — the project is then bought at any market cap.","example":"5000000"},"expiresInMs":{"type":"integer","minimum":1000,"maximum":86400000,"description":"How long, in milliseconds, the buy order stays active.","example":86400000}},"required":["slug","maxSpendUsdc","expiresInMs"]},"minItems":1,"maxItems":50}},"required":["items"]}}}},"responses":{"200":{"description":"Per-item results for the batch.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BuyOrderMutationResponse"},"example":{"results":[{"slug":"thefirm","ok":true,"status":"created"},{"slug":"charms","ok":true,"status":"unchanged"},{"slug":"no-such-project","ok":false,"code":"unknown_project","message":"No project matches the slug"}]}}}},"400":{"description":"Malformed JSON, an invalid body, or an over-limit batch.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"example":{"error":"Bad request","message":"Invalid request body"}}}},"401":{"description":"Missing, invalid, or revoked API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"missingAuthorizationHeader":{"value":{"error":"Unauthorized","message":"Missing or invalid Authorization header"}},"invalidApiKey":{"value":{"error":"Unauthorized","message":"Invalid API key"}}}}}},"500":{"description":"An unexpected server-side error occurred.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"example":{"error":"Internal server error","message":"Failed to create buy orders"}}}}}},"patch":{"operationId":"updateBuyOrders","summary":"Update buy orders","description":"Updates the spend cap, FDV cap, or validity of one or more active buy orders.\n\nEach item is processed independently. The response is always HTTP 200 once authenticated and the body is valid — check the per-item `ok` flag in `results` (index-aligned to your request) for each outcome.","tags":["Buy Orders"],"security":[{"apiKeyAuth":[]}],"requestBody":{"required":true,"description":"The buy orders to update, keyed by project slug.","content":{"application/json":{"schema":{"type":"object","properties":{"items":{"type":"array","items":{"type":"object","properties":{"slug":{"type":"string","minLength":1,"description":"Public project slug identifying the buy order to update.","example":"thefirm"},"maxSpendUsdc":{"type":"string","pattern":"^\\d+(\\.\\d+)?$","description":"New per-buy USDC spend cap. Omit to keep the current value.","example":"50"},"maxFdvUsdc":{"type":["string","null"],"pattern":"^\\d+(\\.\\d+)?$","description":"New maximum FDV cap, in USDC. Omit to keep the current cap; pass an explicit null to clear it — no FDV cap, so the project is bought as quickly as possible.","example":"5000000"},"expiresInMs":{"type":"integer","minimum":1000,"maximum":86400000,"description":"New validity window, in milliseconds. Omit to keep the current value.","example":86400000}},"required":["slug"]},"minItems":1,"maxItems":50}},"required":["items"]}}}},"responses":{"200":{"description":"Per-item results for the batch.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BuyOrderMutationResponse"},"example":{"results":[{"slug":"thefirm","ok":true,"status":"created"},{"slug":"charms","ok":true,"status":"unchanged"},{"slug":"no-such-project","ok":false,"code":"unknown_project","message":"No project matches the slug"}]}}}},"400":{"description":"Malformed JSON, an invalid body, or an over-limit batch.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"example":{"error":"Bad request","message":"Invalid request body"}}}},"401":{"description":"Missing, invalid, or revoked API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"missingAuthorizationHeader":{"value":{"error":"Unauthorized","message":"Missing or invalid Authorization header"}},"invalidApiKey":{"value":{"error":"Unauthorized","message":"Invalid API key"}}}}}},"500":{"description":"An unexpected server-side error occurred.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"example":{"error":"Internal server error","message":"Failed to update buy orders"}}}}}},"delete":{"operationId":"deleteBuyOrders","summary":"Delete buy orders","description":"Deletes one or more of the caller's buy orders, keyed by project slug.\n\n- Idempotent: deleting a project that has no active buy order returns `status: \"already_deleted\"` instead of an error.\n- Each item is processed independently. The response is always HTTP 200 once authenticated and the body is valid — check the per-item `ok` flag in `results` (index-aligned to your request) for each outcome.","tags":["Buy Orders"],"security":[{"apiKeyAuth":[]}],"requestBody":{"required":true,"description":"The buy orders to delete, keyed by project slug.","content":{"application/json":{"schema":{"type":"object","properties":{"items":{"type":"array","items":{"type":"object","properties":{"slug":{"type":"string","minLength":1,"description":"Public project slug identifying the buy order to remove.","example":"thefirm"}},"required":["slug"]},"minItems":1,"maxItems":50}},"required":["items"]}}}},"responses":{"200":{"description":"Per-item results for the batch.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BuyOrderMutationResponse"},"example":{"results":[{"slug":"thefirm","ok":true,"status":"created"},{"slug":"charms","ok":true,"status":"unchanged"},{"slug":"no-such-project","ok":false,"code":"unknown_project","message":"No project matches the slug"}]}}}},"400":{"description":"Malformed JSON, an invalid body, or an over-limit batch.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"example":{"error":"Bad request","message":"Invalid request body"}}}},"401":{"description":"Missing, invalid, or revoked API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"missingAuthorizationHeader":{"value":{"error":"Unauthorized","message":"Missing or invalid Authorization header"}},"invalidApiKey":{"value":{"error":"Unauthorized","message":"Invalid API key"}}}}}},"500":{"description":"An unexpected server-side error occurred.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"example":{"error":"Internal server error","message":"Failed to delete buy orders"}}}}}}},"/api/public/v1/wallet":{"get":{"operationId":"getWallet","summary":"Get AutoBoy wallet","description":"Returns the AutoBoy smart wallet address associated with the API key, along with the ERC-20 tokens and native ETH it holds on Base.","tags":["AutoBoy Wallet"],"security":[{"apiKeyAuth":[]}],"responses":{"200":{"description":"The AutoBoy wallet balances.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BalanceResponse"},"example":{"autoboyWalletAddress":"0x1234567890123456789012345678901234567890","balances":[{"address":"0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE","symbol":"ETH","name":"Ether","decimals":18,"balance":"1500000000000000000"},{"address":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913","symbol":"USDC","name":"USD Coin","decimals":6,"balance":"2500000"}]}}}},"401":{"description":"Missing, invalid, or revoked API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"missingAuthorizationHeader":{"value":{"error":"Unauthorized","message":"Missing or invalid Authorization header"}},"invalidApiKey":{"value":{"error":"Unauthorized","message":"Invalid API key"}}}}}},"404":{"description":"The API key owner has no AutoBoy wallet.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"example":{"error":"Not found","message":"API key owner has no autoboy wallet"}}}},"500":{"description":"Failed to read the balance.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"example":{"error":"Internal server error","message":"Failed to read balance"}}}},"502":{"description":"The balance provider (Alchemy / RPC) is unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"example":{"error":"Bad gateway","message":"Failed to fetch wallet balances"}}}}}}},"/api/public/v1/wallet/withdrawals":{"post":{"operationId":"createWithdrawal","summary":"Withdraw an asset","description":"Withdraws an ERC-20 token or native ETH from the AutoBoy smart wallet associated with the API key to an arbitrary destination address on Base.\n\n- The endpoint waits for the on-chain receipt and returns the final transaction hash.","tags":["AutoBoy Wallet"],"security":[{"apiKeyAuth":[]}],"requestBody":{"required":true,"description":"The asset, destination, and amount to withdraw.","content":{"application/json":{"schema":{"type":"object","properties":{"withdrawAddress":{"type":"string","description":"Destination address that receives the withdrawn asset.","example":"0x1234567890123456789012345678901234567890"},"tokenAddress":{"type":"string","description":"ERC-20 contract address, or the native-ETH sentinel 0xEeee…EEeE.","example":"0x1234567890123456789012345678901234567890"},"amount":{"type":"string","minLength":1,"description":"Decimal amount to withdraw, e.g. \"12.5\", or \"max\" to withdraw the entire on-chain balance of the asset.","example":"12.5"}},"required":["withdrawAddress","tokenAddress","amount"]}}}},"responses":{"200":{"description":"The withdrawal was confirmed on-chain.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WithdrawResponse"},"example":{"txHash":"0xa3f5c9e1b7d2048fa3f5c9e1b7d2048fa3f5c9e1b7d2048fa3f5c9e1b7d2048f","tokenAddress":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913","withdrawAddress":"0x1234567890123456789012345678901234567890","amount":"12500000"}}}},"400":{"description":"Invalid request body or amount.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"invalidRequestBody":{"value":{"error":"Bad request","message":"Invalid request body"}},"invalidAmount":{"value":{"error":"Bad request","message":"amount must be a valid decimal string"}},"amountTooSmall":{"value":{"error":"Bad request","message":"Withdrawal amount must be greater than zero"}},"amountExceedsBalance":{"value":{"error":"Bad request","message":"Withdrawal amount exceeds the available balance"}},"invalidTokenContract":{"value":{"error":"Bad request","message":"tokenAddress is not a valid ERC-20 token contract"}}}}}},"401":{"description":"Missing, invalid, or revoked API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"missingAuthorizationHeader":{"value":{"error":"Unauthorized","message":"Missing or invalid Authorization header"}},"invalidApiKey":{"value":{"error":"Unauthorized","message":"Invalid API key"}}}}}},"404":{"description":"The API key owner has no AutoBoy wallet.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"example":{"error":"Not found","message":"API key owner has no autoboy wallet"}}}},"500":{"description":"The transaction reverted or an unexpected error occurred.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"reverted":{"value":{"error":"Internal server error","message":"Withdrawal reverted on-chain"}},"submissionFailed":{"value":{"error":"Internal server error","message":"Failed to submit the withdrawal transaction"}},"notConfigured":{"value":{"error":"Internal server error","message":"Withdrawal is not configured on this environment"}}}}}},"502":{"description":"The RPC is unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"providerUnavailable":{"value":{"error":"Bad gateway","message":"Bundler, paymaster, or RPC is currently unavailable"}},"balanceReadFailed":{"value":{"error":"Bad gateway","message":"Unable to read the token balance from the RPC"}}}}}}}}},"/api/public/v1/feedback":{"post":{"operationId":"sendFeedback","summary":"Send feedback","description":"Send feedback to The Firm.\n\nNo API key required - the Computer Operations Division reads each note and reaches out via the contact provided when a reply is warranted.","tags":["Feedback"],"requestBody":{"required":true,"description":"Your message, who you are, and how to reach you.","content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string","minLength":1,"maxLength":2000,"description":"Your feedback, in plain words."},"name":{"type":"string","minLength":1,"maxLength":200,"description":"The name your project or agent trades under."},"contact":{"type":"string","minLength":1,"maxLength":200,"description":"Where the Computer Operations Division may reach you to reply (Telegram, X, Farcaster, email, etc)."}},"required":["message","name","contact"]}}}},"responses":{"202":{"description":"Feedback received and entered into the record.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SendFeedbackResponse"},"example":{"status":"received","message":"Your feedback is in and entered into the record. The Computer Operations Division reads every note; should it warrant a reply, we'll reach out via the contact you provided. Business is booming."}}}},"400":{"description":"Invalid or missing request body.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Failed to submit the feedback.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"503":{"description":"Feedback submissions are temporarily unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"example":{"error":"Service unavailable","message":"The feedback desk is temporarily closed. Please try again later."}}}}}}}},"webhooks":{}}