TLDR Pods API

Create Tldrs from your own product.

Send one question and receive a source-linked podcast Tldr. API usage shares the same paid plan, limits, and Tldr shelf as the TLDR Pods console.

POSThttps://api.tldrpods.com/api/jobs

Quickstart

Create a key in Account, store it as a server-side secret, and submit the question once. A successful request returns 202 Accepted with a status URL. Poll that URL until the job succeeds, fails, or is canceled.

curl --include https://api.tldrpods.com/api/jobs \
  --request POST \
  --header "Authorization: Bearer $TLDRPODS_API_KEY" \
  --header "Idempotency-Key: report-20260713-hormozi-offers" \
  --header "Content-Type: application/json" \
  --data '{"query":"How has Alex Hormozi explained offers on Modern Wisdom?","maxEpisodes":8}'

New Tldrs require an active Pro or Research subscription. A successful Tldr uses one from the account allowance; a run that fails before producing a Tldr is returned.

Authentication

Send the key as a bearer token. Keys begin with tldr_sk_, are shown once when created, and can be revoked from your account at any time.

Authorization: Bearer tldr_sk_YOUR_KEY
Keep keys on the server. Do not put them in browser code, mobile bundles, public repositories, URLs, or logs.

Request

Send a JSON object with the question and an optional episode cap.

Every submission also needs an Idempotency-Keyheader of 8 to 160 letters, numbers, underscores, or hyphens. Reuse the key only when retrying the exact same request. Use a new key for a new Tldr.

FieldTypeRequiredDescription
querystringYes3–400 characters. Name the person, show, or topic as specifically as you can.
maxEpisodesintegerNoDefaults to 3. The maximum is 8 on all current paid plans.

Write a useful query

Include the person and the decision or idea you care about. “Alex Hormozi appearances on Modern Wisdom” is valid; “How has Alex Hormozi explained offers on Modern Wisdom?” gives the Tldr a clearer job.

Job lifecycle

A successful submission returns 202. Read the relative status URL from job.statusUrl or theLocation response header, then poll it with the same bearer token. Clients should ignore unknown fields.

StatusMeaning
queuedThe job is saved and waiting for available compute.
runningThe job is active. Continue polling with a short delay.
succeededThe response includes your Tldr in the report field.
failedRead job.error. Failed jobs return their Tldr allowance.
canceledThe job stopped without a Tldr.

Send DELETE to the same status URL to cancel a queued or running job. Closing your process or losing the network connection does not cancel it.

{
  "job": {
    "id": "018f47a2-01be-7f4d-92b7-74a3fe1024f8",
    "query": "How has Alex Hormozi explained offers on Modern Wisdom?",
    "status": "succeeded",
    "stage": "done",
    "reportId": "41ae676a-badd-42d3-9d3f-21d93f2168e0",
    "canCancel": false
  },
  "report": {
    "markdown": "## The core idea\n...",
    "person": "Alex Hormozi",
    "topic": "offers",
    "citations": [
      {
        "title": "Alex Hormozi: The Business Advice That Made Me $100M",
        "show": "Modern Wisdom",
        "timestampS": 834,
        "link": "https://example.com/episode#t=834"
      }
    ]
  }
}

Node.js example

const apiKey = process.env.TLDRPODS_API_KEY;
const response = await fetch("https://api.tldrpods.com/api/jobs", {
  method: "POST",
  headers: {
    authorization: `Bearer ${apiKey}`,
    "content-type": "application/json",
    "idempotency-key": crypto.randomUUID(),
  },
  body: JSON.stringify({
    query: "How has Alex Hormozi explained offers on Modern Wisdom?",
    maxEpisodes: 8,
  }),
});

if (response.status !== 202) {
  throw new Error(`TLDR Pods request failed: ${response.status}`);
}

const queued = await response.json();
const statusUrl = new URL(queued.job.statusUrl, response.url);

while (true) {
  await new Promise((resolve) => setTimeout(resolve, 3000));
  const statusResponse = await fetch(statusUrl, {
    headers: { authorization: `Bearer ${apiKey}` },
  });
  if (!statusResponse.ok) {
    throw new Error(`Status request failed: ${statusResponse.status}`);
  }

  const result = await statusResponse.json();
  if (result.job.status === "succeeded") {
    console.log(result.report.markdown, result.report.citations);
    break;
  }
  if (["failed", "canceled"].includes(result.job.status)) {
    throw new Error(result.job.error?.message ?? `Tldr ${result.job.status}`);
  }
}

Errors & limits

StatusAction
400Fix the JSON body, query length, or episode value.
401Replace an unknown or revoked API key.
402Activate a paid plan, reduce maxEpisodes, or wait for the plan allowance to reset.
409Use a new idempotency key, or retry it with the original request body.
429Wait before retrying. The account is rate-limited or another Tldr is running.
503Retry later with backoff. The service is temporarily unavailable.

API and console usage share one allowance. Avoid automatic retries for 400, 401, or 402. For transient failures, use exponential backoff and cap retries.

Privacy & permitted use

API-created Tldrs are saved to the key owner’s account and visible only to them. The API returns the Tldr in its existing report field with source references, never a raw transcript. Do not submit secrets, sensitive personal data, or material you do not have the right to process.

Use of the API is subject to the Terms of Service, Acceptable Use Policy, and Privacy Notice.