Developer documentation

LazyListen Zapier API Reference

OAuth 2.0 and REST endpoints used by the official LazyListen integration for Zapier. The API creates private episode jobs and permits owner-scoped retrieval only.

Overview

Base URLhttps://lazylisten.comAuthorizationOAuth 2.0 authorization code grant with refresh tokensScopezapier:episodesRequest formatJSON for API calls; form-encoded token requestsAccess-token lifeOne hour

All API responses use JSON. Every episode job and completed episode is bound to the authenticated LazyListen owner. Unknown request fields are rejected.

OAuth 2.0

GET/oauth/authorize

Begins authorization. A signed-in LazyListen user sees an explicit consent page. Approval requires a same-origin, CSRF-protected POST; the browser session does not auto-authorize.

response_typecodeclient_idIssued confidential-client identifierredirect_uriMust exactly match a registered Zapier redirect URIscopezapier:episodesstateOpaque Zapier state value, returned unchanged

POST/oauth/token

Exchanges a one-time authorization code or a refresh token. The confidential client authenticates with its client ID and client secret.

grant_typeauthorization_code or refresh_tokenAuthorization codeSingle use and short livedRefresh tokenRotated on every successful refresh
{
  "access_token": "…",
  "token_type": "Bearer",
  "expires_in": 3600,
  "refresh_token": "…",
  "scope": "zapier:episodes"
}

Account test

GET/api/integrations/zapier/me

Validates the connection and returns the authenticated LazyListen account’s public identity fields. Requires Authorization: Bearer <access_token>.

Episode jobs

POST/api/integrations/zapier/episode-jobs

Creates a private episode-generation job. Send exactly one of url or text.

{ "url": "https://example.com/newsletter/story" }

or

{ "text": "Text to turn into an episode…" }
urlPublic HTTP(S) URL. Local, private-network, loopback, and credential-bearing URLs are rejected.textPlain source text, maximum 12,000 characters.ResponseJob ID, status, source type, and timestamps.

GET/api/integrations/zapier/episode-jobs/:id

Returns an owner-scoped job with status pending, processing, ready, or failed. Jobs owned by another account are never exposed.

GET/api/integrations/zapier/episodes/:jobId

Returns the completed private episode for a ready job, including title, transcript excerpt, private episode page, authenticated audio link, duration, and completion time. A job that is not ready produces a non-success response.

Errors and limits

400Malformed input, unknown fields, both/neither source fields, or unsupported URL.401Missing, expired, revoked, or malformed bearer token.403Token lacks zapier:episodes.404Job does not exist for the authenticated owner.409Completed episode requested before the job is ready.429Rate limit exceeded; retry with backoff.5xxTemporary service or generation failure.

Security and data handling

LazyListen validates redirect URIs against an exact allowlist, stores client secrets and refresh tokens only as hashes, rotates refresh tokens, limits CORS, rejects internal-network source URLs, redacts URL query strings and fragments from logs, and enforces owner-only reads. See the privacy policy and terms.

Support: support@lazylisten.com