{"name":"Eloquent Poll","version":"1.0.0","description":"Multi-model consensus polling service. 50-100+ AI models vote on your question, results tallied via FPTP with automatic early termination.","base_url":"https://www.eloquentpolls.com","capabilities":{"polling":true,"streaming":true,"async_execution":true,"feedback":true,"dry_run":true},"authentication":{"methods":["bearer_api_key","session_cookie","siwe_wallet"],"api_key_prefix":"ep_k_","create_key_endpoint":"/api/keys"},"interfaces":{"rest":{"endpoint":"/api/poll","spec":"/api/openapi.json","docs":"/api/docs"},"mcp":{"endpoint":"/api/mcp","tools":["poll_question","get_poll_result","get_balance"]},"a2a":{"agent_card":"/.well-known/agent.json","task_endpoint":"/api/a2a/tasks/send"},"llms_txt":{"compact":"/llms.txt","full":"/llms-full.txt"}},"surfaces":[{"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/poll without credentials and get a free poll result using the free theme (open-weight :free models, tighter validation limits)."},{"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."},{"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."},{"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."},{"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."},{"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."},{"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."},{"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."},{"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."},{"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."},{"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."},{"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."},{"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."},{"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."},{"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."},{"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."},{"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."},{"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."},{"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."},{"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."},{"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."},{"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."},{"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."},{"pattern_id":"model_variant_seo_surface","category":"emerging","user_types":["coding_agent","browser_agent"],"description":"Machine-readable model variant registry proxied from LiteLLM with cache envelope and SEO-friendly HTML pages","user_story":"As an agent, I GET /api/models to enumerate all available LLM variants with provider, pricing, and capability metadata in a stable JSON envelope with cache timestamps."},{"pattern_id":"static_anonymous_html","category":"emerging","user_types":["human","coding_agent"],"description":"Server-rendered anonymous HTML pages with baked-in model counts and surface catalog","user_story":"As an anonymous visitor or crawling agent, I GET / or /surfaces and receive fully-rendered HTML with real data baked in, no client-side fetch needed, because the server pre-renders with live model counts and surface metadata."},{"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."},{"pattern_id":"ratelimit_quota_headers_surface","category":"emerging","user_types":["coding_agent"],"description":"Standard RateLimit response headers so agents can self-throttle","user_story":"As an agent calling this API, I read RateLimit-Remaining and RateLimit-Reset headers so I can pace my requests and avoid 429 errors, because agents retry aggressively and need explicit quota signals."},{"pattern_id":"idempotency_key_retry_safety_surface","category":"emerging","user_types":["coding_agent"],"description":"Idempotency-Key header support to prevent duplicate operations on retry","user_story":"As an agent retrying a timed-out POST, I include an Idempotency-Key header so the server returns the cached result instead of creating a duplicate poll, because network failures are common and retries must be safe."},{"pattern_id":"content_signal_http_header_surface","category":"emerging","user_types":["coding_agent","browser_agent"],"description":"Content-Signal HTTP response headers declaring AI usage preferences per content","user_story":"As an AI agent or crawler, I read Content-Signal headers to know whether content can be used for training, inference, or search, because robots.txt only covers crawl-time and these headers provide per-response granularity."},{"pattern_id":"markdown_token_budget_header_surface","category":"emerging","user_types":["coding_agent"],"description":"x-markdown-tokens header with approximate token count for markdown responses","user_story":"As an agent budgeting context window tokens, I read the x-markdown-tokens header before consuming a document so I know whether the content fits my remaining budget, because downloading large docs only to discard them wastes latency."},{"pattern_id":"a2a_agent_card_alias_surface","category":"emerging","user_types":["coding_agent"],"description":"Alias /.well-known/agent-card.json to /.well-known/agent.json for newer A2A clients","user_story":"As a newer A2A client, I look for /.well-known/agent-card.json per the latest spec revision so I discover the agent card without trying the legacy path, because the ecosystem is transitioning to agent-card.json."},{"pattern_id":"mcp_tool_annotations_surface","category":"emerging","user_types":["coding_agent"],"description":"MCP tool annotations with behavioral hints and output schemas for client validation","user_story":"As an MCP client, I read tool annotations to understand side effects before invoking, so I can warn users before destructive operations and cache results for idempotent reads, because annotations are the spec-standard way to communicate tool behavior."},{"pattern_id":"schema_org_webapi_surface","category":"emerging","user_types":["coding_agent","browser_agent"],"description":"Schema.org WebAPI structured data in landing page for search engines and agents","user_story":"As a search engine or discovery agent, I parse JSON-LD on the page to find WebAPI metadata including documentation URL, terms of service, provider, and executable actions, because structured data is more reliable than scraping HTML."},{"pattern_id":"asyncapi_event_api_surface","category":"emerging","user_types":["coding_agent"],"description":"AsyncAPI 3.0 specification describing the SSE streaming poll endpoint","user_story":"As an agent integrating with event-driven APIs, I fetch /asyncapi.json to discover streaming channels, message schemas, and protocols, because AsyncAPI is the standard for describing message-driven APIs."},{"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."},{"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."},{"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."},{"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."},{"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."},{"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."},{"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/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 }."},{"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."},{"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."},{"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."},{"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."},{"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."},{"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."},{"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."},{"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)."}],"pricing":{"model":"usage_based","estimate":"$0.01-0.50 per poll","details_url":"https://www.eloquentpolls.com/pricing"}}