Every API here is available over the APIs.io API and to AI agents over MCP.
MCP server
One button, every client — Claude, Cursor, VS Code and the rest.
https://apis.io/mcp
Tools for apis
7 MCP tools reach this
find_apisBrowse and filter every API in the catalog.
get_api_artifactsOne API's artifacts, grouped by type.
get_openapiThe primary OpenAPI for this API.
find_similar_apisAPIs that look like this one.
apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.
resolveTurn a domain, URL or GitHub org into the provider it belongs to.
find_cohortsEvery scored population of providers in the catalog.
All 92 tools →
Call it yourself
curl for this page
This API
curl "https://apis.io/api/v1/apis/yappy-biz:yappy-biz-documentation-api"
All apis
curl "https://apis.io/api/v1/apis?limit=25"
Discovery needs no key. Ratings and market analysis are Pro.
Get an API key
Free tier, no form to fill in. Signing in shares your email address with us — we
store it to create your key and to recognise you if you sign in with another
provider. See our Privacy Policy and
Terms.
A second provider on the same verified email joins the account you already have.
openapi: 3.2.0
info:
title: Yappy Web Documentation API
version: 1.0.0
summary: Free, keyless, read-only access to everything factual about Yappy.
description: 'Yappy is a voice agent for macOS: hold a key and it types what you say, hold another and it does what you ask. This API describes the product — releases, documentation, FAQ, pricing, requirements — so an agent answering a question about Yappy reads structured data instead of scraping a marketing page.
**No API key is required for any read operation.** Credentials exist only to raise the rate ceiling and to unlock export jobs; nothing behind them is secret. See https://yappy.biz/auth.md.
**This API does not transcribe audio.** Yappy''s speech recognition runs on the user''s own Mac and there is no hosted endpoint behind it. If a user wants dictation, the answer is to install the app.
Conventions: cursor pagination on every list, a strong `ETag` on every GET, RFC 9457 `application/problem+json` on every error, RFC-style `RateLimit-*` headers on every response, and a dated `API-Version` header naming the build that answered. The major version lives in the path; a removal is announced with `Deprecation` and `Sunset` headers at least 180 days ahead.'
termsOfService: https://yappy.biz/privacy/
contact:
name: Yappy support
email: support@yappy.biz
url: https://yappy.biz/contact/
license:
name: Proprietary — LicenseRef-Proprietary
identifier: LicenseRef-Proprietary
x-api-version: '2026-08-25'
x-logo:
url: https://yappy.biz/assets/favicon.svg
altText: Yappy
servers:
- url: https://yappy.biz/api/v1
description: Production
- url: https://yappy.biz/api/v1/sandbox
description: Sandbox — deterministic fixtures, ?simulate= to force any error
security:
- {}
- bearerAuth: []
- oauth2:
- read:releases
- read:docs
- read:pricing
- read:faq
- export:docs
tags:
- name: Documentation
description: Documentation pages, FAQ, and search.
paths:
/docs:
get:
operationId: listDocs
summary: List documentation pages
description: 'The documentation index: slug, title, description, HTML URL, and markdown URL for every page. Cursor-paginated. Fetch a page''s content with /docs/{slug}.'
tags:
- Documentation
responses:
'200':
description: A page of documentation entries
headers:
ETag:
$ref: '#/components/headers/ETag'
API-Version:
$ref: '#/components/headers/APIVersion'
Cache-Control:
$ref: '#/components/headers/CacheControl'
RateLimit-Limit:
$ref: '#/components/headers/RateLimitLimit'
RateLimit-Remaining:
$ref: '#/components/headers/RateLimitRemaining'
RateLimit-Reset:
$ref: '#/components/headers/RateLimitReset'
RateLimit-Policy:
$ref: '#/components/headers/RateLimitPolicy'
X-Request-Id:
$ref: '#/components/headers/XRequestId'
Link:
$ref: '#/components/headers/Link'
content:
application/json:
schema:
$ref: '#/components/schemas/DocList'
'400':
$ref: '#/components/responses/BadRequest'
'401':
$ref: '#/components/responses/Unauthorized'
'403':
$ref: '#/components/responses/Forbidden'
'429':
$ref: '#/components/responses/RateLimited'
'500':
$ref: '#/components/responses/InternalError'
'503':
$ref: '#/components/responses/UpstreamUnavailable'
parameters:
- $ref: '#/components/parameters/Limit'
- $ref: '#/components/parameters/Cursor'
security:
- {}
- bearerAuth:
- read:docs
- oauth2:
- read:docs
/docs/{slug}:
get:
operationId: getDoc
summary: Get one documentation page
description: One documentation page as markdown, with its title, description, and last update date. The slug is the path after /docs/ — for example 'quickstart', 'agent-mode', or 'privacy-model'. On a miss the 404 detail suggests the nearest slug, so a typo costs one request rather than a guessing game.
tags:
- Documentation
responses:
'200':
description: The requested documentation page
headers:
ETag:
$ref: '#/components/headers/ETag'
API-Version:
$ref: '#/components/headers/APIVersion'
Cache-Control:
$ref: '#/components/headers/CacheControl'
RateLimit-Limit:
$ref: '#/components/headers/RateLimitLimit'
RateLimit-Remaining:
$ref: '#/components/headers/RateLimitRemaining'
RateLimit-Reset:
$ref: '#/components/headers/RateLimitReset'
RateLimit-Policy:
$ref: '#/components/headers/RateLimitPolicy'
X-Request-Id:
$ref: '#/components/headers/XRequestId'
content:
application/json:
schema:
$ref: '#/components/schemas/Doc'
'404':
$ref: '#/components/responses/NotFound'
'400':
$ref: '#/components/responses/BadRequest'
'401':
$ref: '#/components/responses/Unauthorized'
'403':
$ref: '#/components/responses/Forbidden'
'429':
$ref: '#/components/responses/RateLimited'
'500':
$ref: '#/components/responses/InternalError'
'503':
$ref: '#/components/responses/UpstreamUnavailable'
parameters:
- $ref: '#/components/parameters/Slug'
security:
- {}
- bearerAuth:
- read:docs
- oauth2:
- read:docs
/faq:
get:
operationId: listFaq
summary: List frequently asked questions
description: Question and answer pairs about Yappy — privacy, requirements, cost, permissions, and how it differs from other dictation tools. The same set is published as FAQPage structured data on the homepage.
tags:
- Documentation
responses:
'200':
description: A page of FAQ entries
headers:
ETag:
$ref: '#/components/headers/ETag'
API-Version:
$ref: '#/components/headers/APIVersion'
Cache-Control:
$ref: '#/components/headers/CacheControl'
RateLimit-Limit:
$ref: '#/components/headers/RateLimitLimit'
RateLimit-Remaining:
$ref: '#/components/headers/RateLimitRemaining'
RateLimit-Reset:
$ref: '#/components/headers/RateLimitReset'
RateLimit-Policy:
$ref: '#/components/headers/RateLimitPolicy'
X-Request-Id:
$ref: '#/components/headers/XRequestId'
Link:
$ref: '#/components/headers/Link'
content:
application/json:
schema:
$ref: '#/components/schemas/FaqList'
'400':
$ref: '#/components/responses/BadRequest'
'401':
$ref: '#/components/responses/Unauthorized'
'403':
$ref: '#/components/responses/Forbidden'
'429':
$ref: '#/components/responses/RateLimited'
'500':
$ref: '#/components/responses/InternalError'
'503':
$ref: '#/components/responses/UpstreamUnavailable'
parameters:
- $ref: '#/components/parameters/Limit'
- $ref: '#/components/parameters/Cursor'
security:
- {}
- bearerAuth:
- read:faq
- oauth2:
- read:faq
/search:
get:
operationId: search
summary: Search documentation and FAQ
description: Full-text search across every documentation page and FAQ entry. Results carry a relevance score, the matching excerpt, and both HTML and markdown URLs, so you can quote the excerpt and cite the page in one step. Cursor-paginated.
tags:
- Documentation
responses:
'200':
description: Ranked search results
headers:
ETag:
$ref: '#/components/headers/ETag'
API-Version:
$ref: '#/components/headers/APIVersion'
Cache-Control:
$ref: '#/components/headers/CacheControl'
RateLimit-Limit:
$ref: '#/components/headers/RateLimitLimit'
RateLimit-Remaining:
$ref: '#/components/headers/RateLimitRemaining'
RateLimit-Reset:
$ref: '#/components/headers/RateLimitReset'
RateLimit-Policy:
$ref: '#/components/headers/RateLimitPolicy'
X-Request-Id:
$ref: '#/components/headers/XRequestId'
Link:
$ref: '#/components/headers/Link'
content:
application/json:
schema:
$ref: '#/components/schemas/SearchResults'
'400':
$ref: '#/components/responses/BadRequest'
'401':
$ref: '#/components/responses/Unauthorized'
'403':
$ref: '#/components/responses/Forbidden'
'429':
$ref: '#/components/responses/RateLimited'
'500':
$ref: '#/components/responses/InternalError'
'503':
$ref: '#/components/responses/UpstreamUnavailable'
parameters:
- $ref: '#/components/parameters/Query'
- $ref: '#/components/parameters/SearchLimit'
- $ref: '#/components/parameters/Cursor'
- $ref: '#/components/parameters/SearchType'
security:
- {}
- bearerAuth:
- read:docs
- oauth2:
- read:docs
components:
responses:
Forbidden:
description: The credential is valid but lacks the required scope
headers:
RateLimit-Limit:
$ref: '#/components/headers/RateLimitLimit'
RateLimit-Remaining:
$ref: '#/components/headers/RateLimitRemaining'
RateLimit-Reset:
$ref: '#/components/headers/RateLimitReset'
X-Request-Id:
$ref: '#/components/headers/XRequestId'
WWW-Authenticate:
$ref: '#/components/headers/WWWAuthenticate'
content:
application/problem+json:
schema:
$ref: '#/components/schemas/Problem'
example:
type: https://yappy.biz/developers/errors#insufficient_scope
title: The credential is valid but lacks the required scope
status: 403
code: insufficient_scope
detail: This operation needs the export:docs scope.
instance: /api/v1/releases
request_id: 01J9X4Q0F7
docs_url: https://yappy.biz/developers/errors
BadRequest:
description: The request was malformed
headers:
RateLimit-Limit:
$ref: '#/components/headers/RateLimitLimit'
RateLimit-Remaining:
$ref: '#/components/headers/RateLimitRemaining'
RateLimit-Reset:
$ref: '#/components/headers/RateLimitReset'
X-Request-Id:
$ref: '#/components/headers/XRequestId'
content:
application/problem+json:
schema:
$ref: '#/components/schemas/Problem'
example:
type: https://yappy.biz/developers/errors#invalid_request
title: The request was malformed
status: 400
code: invalid_request
detail: limit must be between 1 and 100, got 500.
instance: /api/v1/releases
request_id: 01J9X4Q0F7
docs_url: https://yappy.biz/developers/errors
Unauthorized:
description: The supplied credential is missing, expired, or invalid
headers:
RateLimit-Limit:
$ref: '#/components/headers/RateLimitLimit'
RateLimit-Remaining:
$ref: '#/components/headers/RateLimitRemaining'
RateLimit-Reset:
$ref: '#/components/headers/RateLimitReset'
X-Request-Id:
$ref: '#/components/headers/XRequestId'
WWW-Authenticate:
$ref: '#/components/headers/WWWAuthenticate'
content:
application/problem+json:
schema:
$ref: '#/components/schemas/Problem'
example:
type: https://yappy.biz/developers/errors#invalid_token
title: The supplied credential is missing, expired, or invalid
status: 401
code: invalid_token
detail: The access token has expired. Request a new one at /oauth/token.
instance: /api/v1/releases
request_id: 01J9X4Q0F7
docs_url: https://yappy.biz/developers/errors
NotFound:
description: No such resource
headers:
RateLimit-Limit:
$ref: '#/components/headers/RateLimitLimit'
RateLimit-Remaining:
$ref: '#/components/headers/RateLimitRemaining'
RateLimit-Reset:
$ref: '#/components/headers/RateLimitReset'
X-Request-Id:
$ref: '#/components/headers/XRequestId'
content:
application/problem+json:
schema:
$ref: '#/components/schemas/Problem'
example:
type: https://yappy.biz/developers/errors#not_found
title: No such resource
status: 404
code: not_found
detail: No release with version '9.9.9'.
instance: /api/v1/releases
request_id: 01J9X4Q0F7
docs_url: https://yappy.biz/developers/errors
InternalError:
description: Unexpected server error
headers:
RateLimit-Limit:
$ref: '#/components/headers/RateLimitLimit'
RateLimit-Remaining:
$ref: '#/components/headers/RateLimitRemaining'
RateLimit-Reset:
$ref: '#/components/headers/RateLimitReset'
X-Request-Id:
$ref: '#/components/headers/XRequestId'
content:
application/problem+json:
schema:
$ref: '#/components/schemas/Problem'
example:
type: https://yappy.biz/developers/errors#internal_error
title: Unexpected server error
status: 500
code: internal_error
detail: Something failed on our side. Retry once, then report request_id to support@yappy.biz.
instance: /api/v1/releases
request_id: 01J9X4Q0F7
docs_url: https://yappy.biz/developers/errors
RateLimited:
description: Too many requests
headers:
RateLimit-Limit:
$ref: '#/components/headers/RateLimitLimit'
RateLimit-Remaining:
$ref: '#/components/headers/RateLimitRemaining'
RateLimit-Reset:
$ref: '#/components/headers/RateLimitReset'
X-Request-Id:
$ref: '#/components/headers/XRequestId'
Retry-After:
$ref: '#/components/headers/RetryAfter'
content:
application/problem+json:
schema:
$ref: '#/components/schemas/Problem'
example:
type: https://yappy.biz/developers/errors#rate_limited
title: Too many requests
status: 429
code: rate_limited
detail: 120 requests per 60s exceeded. Retry in 12 seconds, or batch your reads via POST /batch.
instance: /api/v1/releases
request_id: 01J9X4Q0F7
docs_url: https://yappy.biz/developers/errors
UpstreamUnavailable:
description: A dependency was unavailable
headers:
RateLimit-Limit:
$ref: '#/components/headers/RateLimitLimit'
RateLimit-Remaining:
$ref: '#/components/headers/RateLimitRemaining'
RateLimit-Reset:
$ref: '#/components/headers/RateLimitReset'
X-Request-Id:
$ref: '#/components/headers/XRequestId'
content:
application/problem+json:
schema:
$ref: '#/components/schemas/Problem'
example:
type: https://yappy.biz/developers/errors#upstream_unavailable
title: A dependency was unavailable
status: 503
code: upstream_unavailable
detail: The release feed did not answer. Retry with backoff.
instance: /api/v1/releases
request_id: 01J9X4Q0F7
docs_url: https://yappy.biz/developers/errors
headers:
APIVersion:
description: The dated build of v1 that answered this request.
schema:
type: string
example: '2026-08-25'
ETag:
description: Strong validator. Send it back as If-None-Match for a cheap 304.
schema:
type: string
example: '"r-0.4.19"'
RateLimitPolicy:
description: The policy in force, as quota;w=window.
schema:
type: string
example: 120;w=60
XRequestId:
description: Identifier for this request. Quote it in a support mail.
schema:
type: string
RetryAfter:
description: Seconds to wait before retrying.
schema:
type: integer
example: 12
WWWAuthenticate:
description: Bearer challenge. Carries resource_metadata on an unauthenticated 401, and error/scope on a rejected credential.
schema:
type: string
example: Bearer resource_metadata="https://yappy.biz/.well-known/oauth-protected-resource"
Link:
description: RFC 8288 links. rel="next" carries the next page.
schema:
type: string
RateLimitReset:
description: Seconds until the window resets.
schema:
type: integer
example: 43
RateLimitRemaining:
description: Requests left in the current window.
schema:
type: integer
example: 117
CacheControl:
description: How long this response may be reused.
schema:
type: string
example: public, max-age=300
RateLimitLimit:
description: Requests permitted in the current window.
schema:
type: integer
example: 120
parameters:
Limit:
name: limit
in: query
required: false
description: How many items to return, 1 to 100.
schema:
type: integer
minimum: 1
maximum: 100
default: 20
Query:
name: q
in: query
required: true
description: What to search for, in plain words.
schema:
type: string
minLength: 2
maxLength: 200
example: accessibility permission
SearchType:
name: type
in: query
required: false
description: Narrow the search to one kind of result.
schema:
type: string
enum:
- doc
- faq
SearchLimit:
name: limit
in: query
required: false
description: How many results to return, 1 to 50.
schema:
type: integer
minimum: 1
maximum: 50
default: 10
Slug:
name: slug
in: path
required: true
description: Documentation page slug — the path after /docs/.
schema:
type: string
enum:
- quickstart
- dictation
- agent-mode
- backends
- configuration
- privacy-model
- troubleshooting
- changelog
example: quickstart
Cursor:
name: cursor
in: query
required: false
description: Opaque cursor from a previous response's pagination.next_cursor. Pass it back verbatim; do not construct one.
schema:
type: string
maxLength: 256
schemas:
DocList:
type: object
title: DocSummaryList
description: A cursor-paginated page of documentation entries.
required:
- object
- data
- pagination
properties:
object:
type: string
const: list
description: Type discriminator.
data:
type: array
items:
$ref: '#/components/schemas/DocSummary'
description: This page of items.
pagination:
$ref: '#/components/schemas/Pagination'
total:
type: integer
description: How many items exist in total.
Doc:
type: object
title: Doc
description: A documentation page, content included.
required:
- object
- slug
- title
- description
- url
- markdown_url
- content
properties:
object:
type: string
const: doc
description: Type discriminator.
slug:
type: string
description: Path after /docs/.
title:
type: string
description: Page title.
description:
type: string
description: One-line summary.
url:
type: string
format: uri
description: HTML page.
markdown_url:
type: string
format: uri
description: Markdown twin.
content:
type: string
description: The page body as markdown.
word_count:
type: integer
description: Length of the body in words.
last_updated:
type: string
format: date
description: When the page last changed.
sandbox:
type: boolean
description: Present and true on sandbox fixtures.
SearchResult:
type: object
title: SearchResult
description: One hit, with enough context to quote and cite.
required:
- object
- type
- title
- url
- excerpt
- score
properties:
object:
type: string
const: search_result
description: Type discriminator.
type:
type: string
enum:
- doc
- faq
description: What kind of thing matched.
id:
type: string
description: Slug or FAQ id.
title:
type: string
description: Title of the matching page or question.
url:
type: string
format: uri
description: HTML page.
markdown_url:
type: string
format: uri
description: Markdown twin.
excerpt:
type: string
description: The matching passage.
score:
type: number
description: Relevance, higher is better.
Faq:
type: object
title: Faq
description: One question and its answer.
required:
- object
- id
- question
- answer
properties:
object:
type: string
const: faq
description: Type discriminator.
id:
type: string
description: Stable identifier for this entry.
question:
type: string
description: The question, as a user would ask it.
answer:
type: string
description: The answer, complete enough to quote.
topic:
type: string
description: Which area the question belongs to.
sandbox:
type: boolean
description: Present and true on sandbox fixtures.
SearchResults:
type: object
title: SearchResults
description: Ranked search results with the query echoed back.
required:
- object
- query
- data
- pagination
properties:
object:
type: string
const: list
description: Type discriminator.
query:
type: string
description: The query that produced these results.
total:
type: integer
description: How many results matched in total.
data:
type: array
items:
$ref: '#/components/schemas/SearchResult'
description: This page of results.
pagination:
$ref: '#/components/schemas/Pagination'
Problem:
type: object
title: Problem
description: RFC 9457 problem details. Branch on `code`, which is stable; `title` and `detail` are prose for a human or for an agent explaining itself.
required:
- type
- title
- status
- code
properties:
type:
type: string
format: uri
description: Link to the documentation for this error code.
title:
type: string
description: Short, human-readable summary.
status:
type: integer
description: The HTTP status code.
detail:
type: string
description: What went wrong here specifically, and the fix.
instance:
type: string
description: The path that produced the error.
code:
type: string
description: Stable machine-readable error code.
enum:
- invalid_request
- invalid_cursor
- invalid_token
- insufficient_scope
- not_found
- method_not_allowed
- not_acceptable
- idempotency_conflict
- payload_too_large
- unsupported_media_type
- unprocessable
- rate_limited
- internal_error
- upstream_unavailable
request_id:
type: string
description: Identifier for this request.
docs_url:
type: string
format: uri
description: Where the full error reference lives.
errors:
type: array
description: One entry per offending field, when the failure was validation.
items:
type: object
required:
- field
- code
properties:
field:
type: string
description: The parameter at fault.
code:
type: string
description: Why it was rejected.
detail:
type: string
description: The specific problem, in words.
DocSummary:
type: object
title: DocSummary
description: A documentation page without its body.
required:
- object
- slug
- title
- description
- url
- markdown_url
properties:
object:
type: string
const: doc
description: Type discriminator.
slug:
type: string
description: Path after /docs/.
title:
type: string
description: Page title.
description:
type: string
description: One-line summary.
url:
type: string
format: uri
description: HTML page.
markdown_url:
type: string
format: uri
description: Markdown twin.
word_count:
type: integer
description: Length of the body in words.
last_updated:
type: string
format: date
description: When the page last changed.
sandbox:
type: boolean
description: Present and true on sandbox fixtures.
Pagination:
type: object
title: Pagination
description: Cursor pagination. When has_more is false, next_cursor is null.
required:
- limit
- has_more
- next_cursor
properties:
limit:
type: integer
description: How many items this page holds at most.
has_more:
type: boolean
description: Whether another page exists.
next_cursor:
type:
- string
- 'null'
description: Opaque cursor for the next page, or null.
next_url:
type:
- string
- 'null'
format: uri
description: Fully-formed URL for the next page, or null.
FaqList:
type: object
title: FaqList
description: A cursor-paginated page of FAQ entries.
required:
- object
- data
- pagination
properties:
object:
type: string
const: list
description: Type discriminator.
data:
type: array
items:
$ref: '#/components/schemas/Faq'
description: This page of items.
pagination:
$ref: '#/components/schemas/Pagination'
total:
type: integer
description: How many items exist in total.
securitySchemes:
bearerAuth:
type: http
scheme: bearer
bearerFormat: opaque
description: An access token from /oauth/token. Optional — every read endpoint also answers anonymously.
oauth2:
type: oauth2
description: OAuth 2.1 with PKCE S256. Dynamic client registration (RFC 7591) at /oauth/register; no human approval step.
flows:
clientCredentials:
tokenUrl: https://yappy.biz/oauth/token
refreshUrl: https://yappy.biz/oauth/token
scopes:
read:releases: Read release history and the current version
read:docs: Read documentation pages and run searches
read:pricing: Read pricing and plan data
read:faq: Read frequently asked questions
export:docs: Start and poll documentation export jobs
authorizationCode:
authorizationUrl: https://yappy.biz/oauth/authorize
tokenUrl: https://yappy.biz/oauth/token
refreshUrl: https://yappy.biz/oauth/token
scopes:
read:releases: Read release history and the current version
read:docs: Read documentation pages and run searches
read:pricing: Read pricing and plan data
read:faq: Read frequently asked questions
export:docs: Start and poll documentation export jobs
externalDocs:
description: Developer portal, including the versioning and deprecation policy
url: https://yappy.biz/developers/deprecation
x-mcp:
server: https://yappy.biz/mcp
transport: streamable-http
serverCard: https://yappy.biz/.well-known/mcp/server-card.json
docsServer: https://yappy.biz/docs/mcp
x-rate-limit:
anonymous:
requests: 120
window_seconds: 60
authenticated:
requests: 600
window_seconds: 60
headers:
- RateLimit-Limit
- RateLimit-Remaining
- RateLimit-Reset
- RateLimit-Policy
- Retry-After
documentation: https://yappy.biz/developers/rate-limits
x-deprecation-policy:
versioning: major version in the path (/api/v1)
current_version: v1
current_status: current - not deprecated, no Sunset date set
signals:
- Deprecation
- Sunset
- Link rel=deprecation
- Link rel=successor-version
sunset_rfc: RFC 8594
minimum_notice_days: 180
retired_status_code: 410
retired_versions:
- version: v0
path: /api/v0
deprecated_on: '2026-02-01'
sunset_on: '2026-08-01'
status: 410
successor: https://yappy.biz/api/v1
documentation: https://yappy.biz/developers/deprecation
x-idempotency:
header: Idempotency-Key
applies_to:
- POST /batch
- POST /exports
documentation: https://yappy.biz/developers/rest-api#idempotency