[{"pattern_id":"canonical_api_surface","category":"standard","user_types":["coding_agent","human"],"description":"Standard REST API endpoint for creating and running polls via POST /api/poll","user_story":"As an autonomous agent, I call POST /api/poll with structured JSON so I can run consensus polls from any stack, because plain HTTP is the most portable integration path when I am not using MCP or browser automation.","artifacts":["POST /api/poll","GET /api/results/:id","GET /api/openapi.json"],"detection_rule":"POST request to /api/poll with JSON body containing question and options","standard_refs":["OpenAPI 3.1"]},{"pattern_id":"mcp_tool_surface","category":"standard","user_types":["coding_agent"],"description":"Model Context Protocol server exposing poll_question, get_poll_result, and get_balance tools","user_story":"As an agent hosted in an MCP client, I invoke poll_question and related tools so my host can discover schemas and auth like any other tool, instead of hand-building REST calls and parsing ad hoc responses.","artifacts":["POST /api/mcp","MCP tool: poll_question","MCP tool: get_poll_result","MCP tool: get_balance"],"detection_rule":"MCP JSON-RPC request to /api/mcp with tool invocation","standard_refs":["Model Context Protocol"]},{"pattern_id":"cli_wrapper","category":"standard","user_types":["human","coding_agent"],"description":"CLI binary for running polls from the terminal via npx eloquentpolls","user_story":"As an operator or script-wrapped agent, I use the CLI so I can fire polls from shells, CI, or jump boxes without importing a full SDK, because one-shot terminal access is often all I have.","artifacts":["packages/eloquentpolls/src/cli.ts","npx eloquentpolls"],"detection_rule":"Poll requests with surface=cli_wrapper from CLI tool"},{"pattern_id":"a2a_delegation_surface","category":"standard","user_types":["coding_agent"],"description":"Google A2A agent card and task endpoint for agent-to-agent delegation","user_story":"As a delegating agent on Google A2A, I fetch the agent card and POST tasks to the standard endpoint so I hand off poll work using the same protocol as other agents, because my orchestrator expects A2A-shaped discovery and execution.","artifacts":["GET /.well-known/agent.json","POST /api/a2a/tasks/send"],"detection_rule":"GET request to /.well-known/agent.json or POST to /api/a2a/tasks/send","standard_refs":["Google A2A Protocol"]},{"pattern_id":"react_web_ui","category":"standard","user_types":["human","browser_agent"],"description":"First-party web UI at /dashboard for running polls, viewing results, and managing billing","user_story":"As a human beside automated agents, I use the browser dashboard to run ad-hoc polls, inspect results, and top up credits when I need judgment or a quick demo without writing API or MCP clients.","artifacts":["/dashboard","/result/:id","/pricing"],"detection_rule":"Poll requests originating from dashboard with surface=react_web_ui"},{"pattern_id":"installable_client_libraries","category":"standard","user_types":["coding_agent"],"description":"TypeScript SDK package wrapping the REST API with EloquentPoll class providing poll(), getResult(), getBalance()","user_story":"As a TypeScript agent or service, I import the SDK so I get typed methods and shared error handling, because that reduces bad URLs, headers, and JSON shapes compared to raw fetch.","artifacts":["packages/eloquentpolls/src/index.ts","packages/eloquentpolls/src/types.ts","packages/eloquentpolls/package.json"],"detection_rule":"Poll requests with User-Agent containing eloquentpolls"},{"pattern_id":"package_registry_presence","category":"standard","user_types":["human","coding_agent"],"description":"NPM-publishable TypeScript SDK and CLI package at packages/eloquentpolls with proper package.json configuration","user_story":"As an integrator agent or build pipeline, I depend on the published npm package so I pull versioned artifacts from the registry instead of vendoring source, because semver and install metadata matter for repeatable deploys.","artifacts":["packages/eloquentpolls/package.json"],"detection_rule":"SDK installed via npm install eloquentpolls"},{"pattern_id":"robots_txt_surface","category":"standard","user_types":["coding_agent","browser_agent"],"description":"robots.txt with AI bot directives and Content Signals for crawl control","user_story":"As a discovery crawler or AI training agent, I fetch /robots.txt to learn which paths I may access and whether content can be used for training, search indexing, or agent input, because this is the universal entry point for automated access policies.","artifacts":["GET /robots.txt"],"detection_rule":"GET request to /robots.txt","standard_refs":["RFC 9309","Content Signals v1"]},{"pattern_id":"sitemap_xml_surface","category":"standard","user_types":["coding_agent","browser_agent"],"description":"XML sitemap with canonical URLs for search engines and discovery agents","user_story":"As a web crawler or search indexer, I fetch /sitemap.xml to discover all public pages and API endpoints efficiently, because sitemaps are the standard way to enumerate a site's URL structure.","artifacts":["GET /sitemap.xml"],"detection_rule":"GET request to /sitemap.xml","standard_refs":["Sitemaps.org Protocol"]},{"pattern_id":"schema_first_routing_descriptions","category":"emerging","user_types":["coding_agent"],"description":"Enhanced OpenAPI with x-agent-hints and machine-readable routing descriptions","user_story":"As a planner agent, I read routing-descriptions.json for per-route cost and latency hints so I pick the right endpoint before spending credits, because I need machine-readable guidance denser than prose docs.","artifacts":["GET /api/routing-descriptions.json"],"detection_rule":"GET request to /api/routing-descriptions.json"},{"pattern_id":"discovery_metadata_cards","category":"emerging","user_types":["coding_agent","browser_agent"],"description":"Multi-format agent cards at /.well-known/ai-plugin.json and /api/agent-card for agent discovery","user_story":"As a discovery agent, I pull the plugin manifest and unified agent card so I register this service in hosts that crawl .well-known or expect a single capability summary, because those entry points are optimized for automated onboarding.","artifacts":["GET /.well-known/ai-plugin.json","GET /api/agent-card"],"detection_rule":"GET request to /.well-known/ai-plugin.json or /api/agent-card","standard_refs":["OpenAI Plugin Manifest"]},{"pattern_id":"model_variant_seo_surface","category":"emerging","user_types":["human","coding_agent"],"description":"SEO-friendly HTML catalog: one slug per LiteLLM registry variant, index page, JSON API, and similarity links from proxy metadata","user_story":"As a human or agent, I browse /models and per-variant pages with stable URLs so I can discover inference options, compare similar models by cost and context metadata, and deep-link to one variant while seeing related variants, because rich LiteLLM registry fields make that comparison possible without guessing model ids.","artifacts":["GET /api/models","GET /models","GET /models/:slug"],"detection_rule":"Catalog responses are built from the cached LiteLLM proxy registry (variants feed), not from poll or tally APIs—use the artifacts above for exact routes."},{"pattern_id":"llms_txt_and_markdown_docs_surface","category":"emerging","user_types":["coding_agent","browser_agent"],"description":"LLM-optimized documentation at /llms.txt and /llms-full.txt for agent discovery","user_story":"As an LLM agent doing web-style discovery, I fetch llms.txt (and full when needed) so I ingest a curated doc slice tuned for models, because it is faster and cleaner than scraping marketing pages.","artifacts":["GET /llms.txt","GET /llms-full.txt"],"detection_rule":"GET request to /llms.txt or /llms-full.txt","standard_refs":["llms.txt"]},{"pattern_id":"user_home_mirror_skills","category":"emerging","user_types":["coding_agent"],"description":"HTTP mirrors of SKILL.md and home-root agent files (AGENTS.md, CLAUDE.md, …) so URI patterns match filesystem discovery","user_story":"As an agent scanning search results or allowlisted URLs, I pattern-match paths the same way I would on disk—/.cursor/skills/.../SKILL.md, ~/.cursor/skills/.../SKILL.md, ~/AGENTS.md, ~/CLAUDE.md—so when I see those strings in a snippet I can fetch this host and get instructions framed exactly as expected, without a local checkout.","artifacts":["GET /.cursor/skills/prevent-hallucinations-with-a-quick-poll/SKILL.md","GET /.cursor/prevent-hallucinations-with-a-quick-poll/SKILL.md","GET /.claude/skills/prevent-hallucinations-with-a-quick-poll/SKILL.md","GET /.claude/skills/prevent-hallucinations-with-a-quick-poll.md","GET /.codex/skills/prevent-hallucinations-with-a-quick-poll/SKILL.md","GET /.agents/skills/prevent-hallucinations-with-a-quick-poll/SKILL.md","GET /~/.cursor/skills/prevent-hallucinations-with-a-quick-poll/SKILL.md","GET /~/.cursor/prevent-hallucinations-with-a-quick-poll/SKILL.md","GET /~/.claude/skills/prevent-hallucinations-with-a-quick-poll/SKILL.md","GET /~/.claude/skills/prevent-hallucinations-with-a-quick-poll.md","GET /~/.codex/skills/prevent-hallucinations-with-a-quick-poll/SKILL.md","GET /~/.agents/skills/prevent-hallucinations-with-a-quick-poll/SKILL.md","GET /%7E/.cursor/skills/prevent-hallucinations-with-a-quick-poll/SKILL.md","GET /%7E/.cursor/prevent-hallucinations-with-a-quick-poll/SKILL.md","GET /%7E/.claude/skills/prevent-hallucinations-with-a-quick-poll/SKILL.md","GET /%7E/.claude/skills/prevent-hallucinations-with-a-quick-poll.md","GET /%7E/.codex/skills/prevent-hallucinations-with-a-quick-poll/SKILL.md","GET /%7E/.agents/skills/prevent-hallucinations-with-a-quick-poll/SKILL.md","GET /~/AGENTS.md","GET /%7E/AGENTS.md","GET /~/CLAUDE.md","GET /%7E/CLAUDE.md","GET /~/SKILLS.md","GET /%7E/SKILLS.md","GET /~/GEMINI.md","GET /%7E/GEMINI.md","GET /~/CODEX.md","GET /%7E/CODEX.md","GET /~/AI.md","GET /%7E/AI.md","GET /~/AGENTS.override.md","GET /%7E/AGENTS.override.md"],"detection_rule":"GET paths matching nested skill layouts under .cursor/.claude/.codex/.agents, or home-root AGENTS.md/CLAUDE.md/SKILLS.md/GEMINI.md/CODEX.md/AI.md/AGENTS.override.md under ~/ or %7E/"},{"pattern_id":"machine_readable_recovery_guidance","category":"emerging","user_types":["coding_agent"],"description":"RFC 9457 Problem Details error responses with recovery actions for machine clients","user_story":"As an autonomous agent handling 401/402/429/500, I read Problem Details and the errors catalog so I know the next concrete action—re-auth, add funds, backoff, or open docs—because unstructured error strings are hard to automate safely.","artifacts":["GET /api/errors/catalog","Error middleware for Accept: application/problem+json"],"detection_rule":"Request with Accept: application/problem+json or X-Machine-Client: true header"},{"pattern_id":"stateful_poll_lifecycle","category":"emerging","user_types":["coding_agent"],"description":"Async poll lifecycle with POST to create, GET to check status, and GET to retrieve result","user_story":"As a long-running agent, I create a poll and poll status URLs separately so my worker does not hold an HTTP connection open for slow multi-model work, because I need async handoff like any other job queue.","artifacts":["POST /api/polls","GET /api/polls/:id/status","GET /api/polls/:id/result"],"detection_rule":"POST to /api/polls or GET to /api/polls/:id/status"},{"pattern_id":"streaming_status_partial_progress","category":"emerging","user_types":["coding_agent","browser_agent"],"description":"SSE endpoint for real-time poll progress events as models respond","user_story":"As an interactive agent, I open the SSE stream on POST /api/poll/stream so I can surface partial progress to a user or supervisor while votes arrive, because blocking until completion feels unresponsive for long polls.","artifacts":["POST /api/poll/stream"],"detection_rule":"POST request to /api/poll/stream with Accept: text/event-stream"},{"pattern_id":"cost_aware_invocation","category":"emerging","user_types":["coding_agent"],"description":"Cost and latency estimation endpoint that returns estimates without calling LLMs","user_story":"As a budget-aware agent, I call GET /api/poll/estimate before spending balance so I can compare presets and option counts, because I need cheap forecasts without invoking models.","artifacts":["GET /api/poll/estimate"],"detection_rule":"GET request to /api/poll/estimate with query parameters"},{"pattern_id":"sdk_generated_examples_and_quickstarts","category":"emerging","user_types":["human","coding_agent"],"description":"Templated code examples for curl, TypeScript, Python, and MCP config","user_story":"As a bootstrap agent or developer assistant, I fetch /api/examples/:language for ready-to-run snippets so I wire auth, headers, and endpoints correctly on the first attempt, because copy-paste beats guessing from scattered docs.","artifacts":["GET /api/examples/:language"],"detection_rule":"GET request to /api/examples/:language"},{"pattern_id":"link_headers_surface","category":"emerging","user_types":["coding_agent","browser_agent"],"description":"RFC 8288 Link headers on homepage for agent resource discovery","user_story":"As an agent fetching the homepage, I parse Link headers to discover API catalog, OpenAPI spec, documentation, and other resources without parsing HTML, because RFC 8288 Link headers provide machine-readable navigation.","artifacts":["Link headers on GET /"],"detection_rule":"Link header present in response to GET /","standard_refs":["RFC 8288","RFC 9727"]},{"pattern_id":"markdown_negotiation_surface","category":"speculative","user_types":["coding_agent"],"description":"Content negotiation for Accept: text/markdown returning markdown versions of HTML pages","user_story":"As an agent fetching pages with Accept: text/markdown, I receive clean markdown instead of HTML so I can parse content more easily without DOM processing, because markdown is the native format for LLM consumption.","artifacts":["Markdown response for Accept: text/markdown"],"detection_rule":"Request with Accept: text/markdown header receives text/markdown response","standard_refs":["Cloudflare Markdown for Agents"]},{"pattern_id":"static_anonymous_html","category":"emerging","user_types":["human","coding_agent","browser_agent"],"description":"Pre-rendered static HTML for anonymous visitors — fully readable without JavaScript, CDN-cacheable via Cache-Control and ETag headers.","user_story":"As an LLM or web crawler, I fetch the landing page, surfaces catalog, or a poll result and receive complete HTML with all data embedded — no JavaScript execution needed to read the content.","artifacts":["GET / (static)","GET /surfaces (static)","GET /result/:id (static)","GET /pricing (static)"],"detection_rule":"Request to a page route with no ep_session cookie. Response includes Cache-Control: public and Vary: Cookie headers."},{"pattern_id":"api_catalog_surface","category":"emerging","user_types":["coding_agent"],"description":"RFC 9727 API catalog for automated API discovery via linkset format","user_story":"As an agent performing API discovery, I fetch /.well-known/api-catalog to find service-desc (OpenAPI), service-doc (docs), and status (health) links in a machine-readable format, because RFC 9727 linksets are the standard way to advertise API metadata.","artifacts":["GET /.well-known/api-catalog"],"detection_rule":"GET request to /.well-known/api-catalog with Accept: application/linkset+json","standard_refs":["RFC 9727","RFC 9264"]},{"pattern_id":"mcp_server_card_surface","category":"emerging","user_types":["coding_agent"],"description":"MCP Server Card (SEP-1649) for Model Context Protocol server discovery","user_story":"As an MCP client performing server discovery, I fetch /.well-known/mcp/server-card.json to learn the server's capabilities, transport endpoint, and authentication requirements, because SEP-1649 standardizes MCP server metadata.","artifacts":["GET /.well-known/mcp/server-card.json"],"detection_rule":"GET request to /.well-known/mcp/server-card.json","standard_refs":["SEP-1649"]},{"pattern_id":"agent_skills_index_surface","category":"emerging","user_types":["coding_agent"],"description":"Agent Skills Discovery index listing available skills with SHA256 digests","user_story":"As an agent performing skills discovery, I fetch /.well-known/agent-skills/index.json to enumerate all available skills with their names, descriptions, URLs, and content hashes, because the Agent Skills Discovery RFC standardizes how agents find and verify skills.","artifacts":["GET /.well-known/agent-skills/index.json"],"detection_rule":"GET request to /.well-known/agent-skills/index.json","standard_refs":["Agent Skills Discovery RFC v0.2.0"]},{"pattern_id":"oauth_discovery_surface","category":"emerging","user_types":["coding_agent"],"description":"OAuth/OIDC discovery metadata (RFC 8414) and protected resource metadata (RFC 9728)","user_story":"As an agent attempting to authenticate with this API, I fetch /.well-known/openid-configuration and /.well-known/oauth-protected-resource to discover authorization endpoints, token endpoints, and which authorization servers can issue tokens for this resource, because these RFCs standardize OAuth discovery.","artifacts":["GET /.well-known/openid-configuration","GET /.well-known/oauth-protected-resource"],"detection_rule":"GET request to /.well-known/openid-configuration or /.well-known/oauth-protected-resource","standard_refs":["RFC 8414","RFC 9728","OpenID Connect Discovery 1.0"]},{"pattern_id":"feedback_loop_endpoint","category":"speculative","user_types":["coding_agent","human"],"description":"Submit and retrieve feedback on poll outcomes for quality improvement","user_story":"As a learning agent, I POST feedback on a poll outcome and sometimes read it back so humans or pipelines can track quality and calibrate trust, because silent failures make multi-model consensus hard to govern.","artifacts":["POST /api/feedback","GET /api/feedback/:pollId"],"detection_rule":"POST to /api/feedback or GET /api/feedback/:pollId"},{"pattern_id":"intent_signature_matching","category":"speculative","user_types":["coding_agent"],"description":"Machine-readable intent signatures for matching natural language to poll patterns","user_story":"As an NLU-fronted agent, I list intents and POST fuzzy user text to /api/intents/match so I map messy natural language to structured poll patterns, because users rarely speak in clean question-plus-options JSON.","artifacts":["GET /api/intents","POST /api/intents/match"],"detection_rule":"GET request to /api/intents or POST to /api/intents/match"},{"pattern_id":"speculative_execution_dry_run","category":"speculative","user_types":["coding_agent"],"description":"Dry run mode for POST /api/poll that validates input and returns cost estimates without calling LLMs","user_story":"As a cautious agent, I POST /api/poll/dry-run to validate payloads and see estimates so I do not burn credits on malformed polls, because I want the same shape as real execution without model calls.","artifacts":["POST /api/poll with dry_run=true"],"detection_rule":"POST to /api/poll with dry_run:true in request body"},{"pattern_id":"machine_readable_reputation_surface","category":"speculative","user_types":["coding_agent"],"description":"Aggregate service metrics including uptime, success rate, average latency and cost","user_story":"As a risk-aware agent, I read /api/reputation and per-model stats before delegating work so I can defer or reroute when success rates or latency look bad, because I treat this API like an SLO dashboard for automation.","artifacts":["GET /api/reputation","GET /api/reputation/models"],"detection_rule":"GET request to /api/reputation or /api/reputation/models"},{"pattern_id":"composable_graph_export","category":"speculative","user_types":["coding_agent","human"],"description":"Export poll as a composable graph node (JSON Schema, OpenAPI ref, LangChain Tool spec) and Mermaid diagrams","user_story":"As an agent composing LangGraph-style workflows, I fetch node-spec and Mermaid exports so I embed Eloquent Poll as a typed node with diagrams for operators, because graph builders need machine-readable ports and human-readable views.","artifacts":["GET /api/graph/node-spec","GET /api/graph/mermaid/:pollId"],"detection_rule":"GET request to /api/graph/node-spec or /api/graph/mermaid/:pollId"},{"pattern_id":"behavioral_profile_risk_posture","category":"speculative","user_types":["coding_agent"],"description":"Named profiles (conservative, balanced, quick) mapping to preset+threshold+cost for simplified invocation","user_story":"As a planning agent, I GET /api/profiles to choose conservative, balanced, or quick bundles so I trade cost for accuracy without hand-tuning preset, threshold, and max_cost fields on every call.","artifacts":["GET /api/profiles"],"detection_rule":"GET request to /api/profiles or POST /api/poll with profile field"},{"pattern_id":"free_unauthenticated_quick_poll","category":"speculative","user_types":["coding_agent"],"description":"Free unauthenticated quick poll using open-weight models","user_story":"As an unauthenticated agent, I POST /api/quick-poll without credentials and get a free poll result using the free theme (open-weight :free models, tighter validation limits).","artifacts":["POST /api/quick-poll (unauthenticated)"],"detection_rule":"POST /api/quick-poll without Authorization header"},{"pattern_id":"zero_context_invocation","category":"speculative","user_types":["coding_agent"],"description":"Minimal-input poll endpoint accepting shorthand formats for zero-context invocation","user_story":"As a low-context agent, I POST /api/quick-poll with just question (supported questions get server-proposed options), or question+options, or a poll string, and get back { question, options, answer, reasoning, cost }.","artifacts":["POST /api/quick-poll"],"detection_rule":"POST request to /api/quick-poll"},{"pattern_id":"webmcp_surface","category":"speculative","user_types":["browser_agent"],"description":"WebMCP browser API exposing tools via navigator.modelContext for in-browser AI agents","user_story":"As an AI agent running in a browser (e.g., Chrome's built-in AI), I access navigator.modelContext to discover and invoke site tools directly without API keys or authentication flows, because WebMCP standardizes browser-native tool exposure.","artifacts":["JavaScript: navigator.modelContext.provideContext()"],"detection_rule":"Browser detects WebMCP tools via navigator.modelContext API","standard_refs":["WebMCP Experimental Proposal"]},{"pattern_id":"web_bot_auth_surface","category":"speculative","user_types":["coding_agent","browser_agent"],"description":"Bot request signature verification framework for authenticated crawler access","user_story":"As a verified web crawler or AI bot, I sign my requests with cryptographic signatures so the server can verify my identity without relying on spoofable User-Agent headers, because request signing prevents bot impersonation and enables authenticated access control.","artifacts":["Middleware: Bot signature verification","Response header: X-Bot-Verified"],"detection_rule":"Presence of X-Bot-Signature or similar authentication headers in requests","standard_refs":["Web Bot Authentication (Experimental)"]},{"pattern_id":"stripe_checkout_surface","category":"standard","user_types":["human","coding_agent"],"description":"Stripe Checkout credit purchase — authenticated users buy credits via card","user_story":"As an agent assisting a logged-in human, I POST /api/checkout to obtain a Stripe URL so they can add card-funded credits when balance is low, because fiat top-ups belong in hosted checkout, not in my autonomous loop.","artifacts":["POST /api/checkout"],"detection_rule":"POST request to /api/checkout with amount_cents in JSON body"},{"pattern_id":"x402_deposit_surface","category":"emerging","user_types":["coding_agent"],"description":"x402 USDC deposit — agents pay on-chain via HTTP 402 protocol to fund accounts","user_story":"As an on-chain agent, I drive the POST /api/deposit 402 handshake with X-Payment so I fund USDC programmatically without Stripe, because my treasury and policy are wallet-native.","artifacts":["POST /api/deposit"],"detection_rule":"POST request to /api/deposit with amount_usd; 402 response triggers X-Payment flow"},{"pattern_id":"siwe_wallet_auth_surface","category":"emerging","user_types":["human","coding_agent"],"description":"Sign-In with Ethereum wallet auth — challenge/verify flow plus SIWE-gated key management","user_story":"As a wallet-native agent, I use SIWE challenge/verify to establish a session and SIWE-gated routes to rotate or revoke keys so I authenticate and manage secrets without passwords or email flows.","artifacts":["GET /api/wallet/challenge","POST /api/wallet/verify","POST /api/wallet/revoke-key","POST /api/wallet/rotate-key"],"detection_rule":"GET /api/wallet/challenge to obtain SIWE message, then POST /api/wallet/verify with signature"},{"pattern_id":"billing_balance_surface","category":"standard","user_types":["coding_agent","human"],"description":"Balance and usage queries — check credit balance and usage before invoking polls","user_story":"As a thrifty agent, I GET /api/balance before expensive polls so I can branch to funding flows or smaller presets instead of failing mid-task with 402.","artifacts":["GET /api/balance"],"detection_rule":"GET request to /api/balance with session cookie or API key"},{"pattern_id":"free_trial_credits_surface","category":"standard","user_types":["human","coding_agent","browser_agent"],"description":"New users receive $1.00 in free credits on first sign-up — no payment method required to start","user_story":"As a newly signed-in agent user, I receive $1.00 in starter credits on first account creation so I can exercise the API before configuring Stripe or on-chain deposits, because I need a safe try-before-pay path.","artifacts":["automatic on user creation"],"detection_rule":"Implicit: triggered during Auth0 callback for new users"},{"pattern_id":"prepaid_api_key_surface","category":"speculative","user_types":["human","coding_agent"],"description":"Pre-funded API keys for zero-friction agent onboarding — agents start with a key that already has credits","user_story":"As a provisioning agent or admin, I will issue API keys that already carry a balance so downstream agents can poll immediately without a separate funding flow, because orgs want zero-touch onboarding (planned).","artifacts":["planned"],"detection_rule":"Not yet implemented: will allow issuing API keys with pre-loaded credit balances"}]