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-releases-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 Releases 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: Releases
description: Yappy's macOS release history and current version.
paths:
/releases:
get:
operationId: listReleases
summary: List releases
description: Yappy's release history for macOS, newest first, cursor-paginated. Each entry carries the version, publication date, human-readable notes, and a download URL. Use this to answer 'what changed recently'; use /releases/latest when you only need the current version.
tags:
- Releases
responses:
'200':
description: A page of releases
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/ReleaseList'
'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:releases
- oauth2:
- read:releases
/releases/latest:
get:
operationId: getLatestRelease
summary: Get the current release
description: The release Yappy's own updater would install right now, read from the same signed appcast rather than from hand-maintained marketing copy, so it cannot be stale. Returns the version, publication date, release notes, download URL, and the platform floor (macOS version and CPU architecture).
tags:
- Releases
responses:
'200':
description: The current release
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/Release'
'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'
security:
- {}
- bearerAuth:
- read:releases
- oauth2:
- read:releases
/releases/{version}:
get:
operationId: getRelease
summary: Get one release
description: One release by its exact version string, for example '0.4.17'. Responds 404 with code 'not_found' when no such version was published.
tags:
- Releases
responses:
'200':
description: The requested release
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/Release'
'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/Version'
security:
- {}
- bearerAuth:
- read:releases
- oauth2:
- read:releases
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
schemas:
Release:
type: object
title: Release
description: One published build of the Yappy Mac app.
required:
- object
- version
- published_at
- notes
- download_url
- platform
properties:
object:
type: string
const: release
description: Type discriminator.
version:
type: string
description: Semantic version.
examples:
- 0.4.19
published_at:
type: string
format: date
description: Publication date.
notes:
type: string
description: What changed, in prose.
download_url:
type: string
format: uri
description: Direct download for this build.
platform:
$ref: '#/components/schemas/Platform'
is_latest:
type: boolean
description: Whether this is the current release.
sandbox:
type: boolean
description: Present and true on sandbox fixtures.
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.
Platform:
type: object
title: Platform
description: The floor a release requires.
required:
- os
- min_version
- arch
properties:
os:
type: string
description: Operating system name.
examples:
- macOS
min_version:
type: string
description: Lowest supported OS version.
arch:
type: string
enum:
- arm64
description: Required CPU architecture.
ReleaseList:
type: object
title: ReleaseList
description: A cursor-paginated page of release entries.
required:
- object
- data
- pagination
properties:
object:
type: string
const: list
description: Type discriminator.
data:
type: array
items:
$ref: '#/components/schemas/Release'
description: This page of items.
pagination:
$ref: '#/components/schemas/Pagination'
total:
type: integer
description: How many items exist in total.
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.
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
Version:
name: version
in: path
required: true
description: Exact release version, for example 0.4.19, or the literal 'latest'.
schema:
type: string
pattern: ^(latest|\d+\.\d+\.\d+)$
example: 0.4.19
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
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