{
  "openapi": "3.1.0",
  "info": {
    "title": "Podmenti API",
    "version": "1.0.0",
    "summary": "Podcast transcripts for any episode of any public podcast.",
    "description": "One key, one credit balance, shared with the website. Every plan including Free is a monthly credit allowance (10 credits free). One credit is one hour of audio. Finding shows and listing episodes costs nothing. Unlocking an episode we hold costs 1 credit once, any length (then 0 forever); transcribing one nobody has yet costs its length in hours (nearest hour, minimum 1, 1 per hour) and includes its unlock; an AI Search query costs 1. Ids: feed_id is the show's Podcast Index id; transcript_id is sha1(episode guid)[:16], 16 hex characters, identical for everyone. Fast lane on /requests: 2 credits per hour, ready in minutes; the measured median is published in the fast block of https://podmenti.com/api/queue. Two meters, see x-cost on every operation: every call made with a key counts one request against the plan's daily allowance (Free 1000, Plus 5000, Pro 20000, Business 50000 per UTC day; X-RateLimit-Limit and X-RateLimit-Remaining headers, 429 when spent), and credits are charged on top only where x-cost says so. A full sample episode, a7c18c255b33d645, is unlocked for everyone and needs no key on /transcripts.",
    "contact": {
      "email": "contact@podmenti.com",
      "url": "https://podmenti.com/api"
    }
  },
  "servers": [
    {
      "url": "https://podmenti.com/api/v1"
    }
  ],
  "security": [
    {
      "bearerAuth": []
    }
  ],
  "tags": [
    {
      "name": "account"
    },
    {
      "name": "discover",
      "description": "Find shows and episodes. No credits on any plan, one request each."
    },
    {
      "name": "transcripts",
      "description": "Read, export, transcribe, search inside."
    }
  ],
  "paths": {
    "/register/start": {
      "post": {
        "tags": [
          "account"
        ],
        "security": [],
        "summary": "Email a one-time login link (creates the account on first confirmation; creating an account accepts https://podmenti.com/terms and https://podmenti.com/privacy)",
        "x-cost": {
          "requests": 0,
          "credits": 0,
          "note": "No key needed"
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "email"
                ],
                "properties": {
                  "email": {
                    "type": "string",
                    "format": "email"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "ok": {
                      "type": "boolean"
                    },
                    "message": {
                      "type": "string"
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "Too many attempts for this address",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/register/confirm": {
      "post": {
        "tags": [
          "account"
        ],
        "security": [],
        "summary": "Exchange the emailed token for the API key",
        "x-cost": {
          "requests": 0,
          "credits": 0,
          "note": "No key needed"
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "token"
                ],
                "properties": {
                  "token": {
                    "type": "string"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "key": {
                      "type": "string",
                      "example": "pm_…"
                    },
                    "credits": {
                      "type": "integer"
                    },
                    "created": {
                      "type": "boolean"
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "Invalid or used token",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/me": {
      "get": {
        "tags": [
          "account"
        ],
        "summary": "Balance, plan and unlocks for the calling key",
        "x-cost": {
          "requests": 1,
          "credits": 0
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Me"
                }
              }
            }
          }
        }
      }
    },
    "/usage": {
      "get": {
        "tags": [
          "account"
        ],
        "summary": "Full account picture: allowance, requests today and request_limit, ledger, unlocks",
        "x-cost": {
          "requests": 1,
          "credits": 0
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          }
        }
      }
    },
    "/key/rotate": {
      "post": {
        "tags": [
          "account"
        ],
        "summary": "Issue a new key and retire the current one immediately",
        "x-cost": {
          "requests": 1,
          "credits": 0
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "key": {
                      "type": "string"
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/billing/portal": {
      "post": {
        "tags": [
          "account"
        ],
        "summary": "Stripe billing portal URL (switch plan, cancel, update card)",
        "x-cost": {
          "requests": 1,
          "credits": 0
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "url": {
                      "type": "string"
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "This key has never subscribed",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/search": {
      "get": {
        "tags": [
          "discover"
        ],
        "summary": "Find shows by name, or resolve a pasted Apple Podcasts / RSS link",
        "x-cost": {
          "requests": 1,
          "credits": 0
        },
        "parameters": [
          {
            "name": "q",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Show name, or an Apple Podcasts URL, or an RSS feed URL. Spotify links cannot be resolved."
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "query": {
                      "type": "string"
                    },
                    "shows": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/ShowSummary"
                      }
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "Bad query or Spotify link",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/shows/lookup": {
      "get": {
        "tags": [
          "discover"
        ],
        "summary": "Turn an Apple id, Apple link or feed URL into a feed_id",
        "x-cost": {
          "requests": 1,
          "credits": 0
        },
        "parameters": [
          {
            "name": "url",
            "in": "query",
            "schema": {
              "type": "string"
            },
            "description": "Apple Podcasts or RSS link"
          },
          {
            "name": "apple_id",
            "in": "query",
            "schema": {
              "type": "integer"
            }
          },
          {
            "name": "feed_url",
            "in": "query",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ShowSummary"
                }
              }
            }
          },
          "404": {
            "description": "Nothing in the index matches",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/shows/{feed_id}": {
      "get": {
        "tags": [
          "discover"
        ],
        "summary": "Show details",
        "x-cost": {
          "requests": 1,
          "credits": 0
        },
        "parameters": [
          {
            "name": "feed_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Show"
                }
              }
            }
          },
          "404": {
            "description": "Show not found",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/shows/{feed_id}/episodes": {
      "get": {
        "tags": [
          "discover"
        ],
        "summary": "Episodes with transcript_id and transcript status",
        "x-cost": {
          "requests": 1,
          "credits": 0
        },
        "parameters": [
          {
            "name": "feed_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer"
            }
          },
          {
            "name": "max",
            "in": "query",
            "schema": {
              "type": "integer",
              "default": 100,
              "maximum": 1000
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "show": {
                      "type": "object"
                    },
                    "ready_count": {
                      "type": "integer"
                    },
                    "truncated": {
                      "type": "boolean"
                    },
                    "episodes": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/Episode"
                      }
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/episodes/{transcript_id}": {
      "get": {
        "tags": [
          "discover"
        ],
        "summary": "What we know about one episode by transcript id, and whether you have unlocked it",
        "x-cost": {
          "requests": 1,
          "credits": 0
        },
        "parameters": [
          {
            "name": "transcript_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "pattern": "^[0-9a-f]{16}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "transcript_id": {
                      "type": "string"
                    },
                    "title": {
                      "type": "string"
                    },
                    "transcript_status": {
                      "type": "string",
                      "enum": [
                        "ready",
                        "none"
                      ]
                    },
                    "unlocked": {
                      "type": "boolean"
                    },
                    "unlock_cost": {
                      "type": "integer",
                      "nullable": true
                    },
                    "word_count": {
                      "type": "integer"
                    },
                    "duration_seconds": {
                      "type": "number"
                    },
                    "show": {
                      "type": "object",
                      "nullable": true
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/charts": {
      "get": {
        "tags": [
          "discover"
        ],
        "summary": "Apple US top chart, overall or per genre (daily)",
        "x-cost": {
          "requests": 1,
          "credits": 0
        },
        "parameters": [
          {
            "name": "genre",
            "in": "query",
            "schema": {
              "type": "string"
            },
            "description": "Genre slug; omit for the overall top 100. The response lists valid slugs."
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "genre": {
                      "type": "object",
                      "nullable": true
                    },
                    "genres": {
                      "type": "array",
                      "items": {
                        "type": "object"
                      }
                    },
                    "chart": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "properties": {
                          "rank": {
                            "type": "integer"
                          },
                          "apple_id": {
                            "type": "string"
                          },
                          "title": {
                            "type": "string"
                          },
                          "author": {
                            "type": "string"
                          },
                          "artwork": {
                            "type": "string"
                          },
                          "lookup_url": {
                            "type": "string"
                          }
                        }
                      }
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/trending": {
      "get": {
        "tags": [
          "discover"
        ],
        "summary": "Shows publishing right now across the open index, optionally within a category",
        "x-cost": {
          "requests": 1,
          "credits": 0
        },
        "parameters": [
          {
            "name": "category",
            "in": "query",
            "schema": {
              "type": "string"
            },
            "description": "A Podcast Index category name, e.g. Technology. The response lists them."
          },
          {
            "name": "max",
            "in": "query",
            "schema": {
              "type": "integer",
              "default": 24,
              "maximum": 100
            }
          },
          {
            "name": "lang",
            "in": "query",
            "schema": {
              "type": "string",
              "default": "en"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "categories": {
                      "type": "array",
                      "items": {
                        "type": "string"
                      }
                    },
                    "shows": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/ShowSummary"
                      }
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/transcripts/{transcript_id}": {
      "get": {
        "tags": [
          "transcripts"
        ],
        "summary": "The transcript in any format (unlock required, except the public sample)",
        "x-cost": {
          "requests": 1,
          "credits": 0
        },
        "parameters": [
          {
            "name": "transcript_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "pattern": "^[0-9a-f]{16}$"
            }
          },
          {
            "name": "format",
            "in": "query",
            "schema": {
              "type": "string",
              "enum": [
                "json",
                "text",
                "txt",
                "srt",
                "vtt"
              ],
              "default": "json"
            }
          },
          {
            "name": "timestamps",
            "in": "query",
            "schema": {
              "type": "string",
              "enum": [
                "1"
              ]
            },
            "description": "With format=json: timed segments"
          },
          {
            "name": "words",
            "in": "query",
            "schema": {
              "type": "string",
              "enum": [
                "1"
              ]
            },
            "description": "With format=json&timestamps=1: word-level start times"
          }
        ],
        "responses": {
          "200": {
            "description": "The transcript",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              },
              "text/plain": {
                "schema": {
                  "type": "string"
                }
              },
              "application/x-subrip": {
                "schema": {
                  "type": "string"
                }
              },
              "text/vtt": {
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "402": {
            "description": "Locked: unlock first (1 credits)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No transcript yet",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/unlock": {
      "post": {
        "tags": [
          "transcripts"
        ],
        "summary": "Unlock an episode we hold (1 credit once, any length, then 0 forever)",
        "x-cost": {
          "requests": 1,
          "credits": 1,
          "note": "Once per episode; 0 if this key already unlocked it"
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "transcript"
                ],
                "properties": {
                  "transcript": {
                    "type": "string",
                    "pattern": "^[0-9a-f]{16}$"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "unlocked": {
                      "type": "string"
                    },
                    "credits": {
                      "type": "integer"
                    },
                    "formats": {
                      "type": "array",
                      "items": {
                        "type": "string"
                      }
                    }
                  }
                }
              }
            }
          },
          "402": {
            "description": "Insufficient credits",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No transcript yet",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/requests": {
      "post": {
        "tags": [
          "transcripts"
        ],
        "summary": "Transcribe episodes nobody has yet (one credit per hour of audio, nearest hour, minimum 1, unlock included); library episodes in the list are unlocked at 1",
        "x-cost": {
          "requests": 1,
          "credits": "1 per hour of audio (nearest hour, minimum 1), 2 per hour with fast: true, 1 per library episode",
          "note": "dry_run: true quotes without charging"
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "episodes"
                ],
                "properties": {
                  "episodes": {
                    "type": "array",
                    "maxItems": 25,
                    "items": {
                      "type": "object",
                      "required": [
                        "guid",
                        "url"
                      ],
                      "properties": {
                        "guid": {
                          "type": "string"
                        },
                        "url": {
                          "type": "string",
                          "description": "audio_url from the episodes endpoint"
                        },
                        "title": {
                          "type": "string"
                        },
                        "date": {
                          "type": "string"
                        },
                        "secs": {
                          "type": "integer",
                          "description": "Duration in seconds, from the episodes endpoint; sets the price (one credit per hour, nearest hour, minimum 1)"
                        }
                      }
                    }
                  },
                  "email": {
                    "type": "string",
                    "format": "email",
                    "description": "Defaults to the account email"
                  },
                  "webhook_url": {
                    "type": "string",
                    "format": "uri",
                    "description": "https URL to POST {event: \"job.done\", job} to when every transcript exists. Signed (X-Podmenti-Signature), retried with backoff on non-2xx."
                  },
                  "dry_run": {
                    "type": "boolean",
                    "description": "Quote only: returns credits_required, per-episode charges and the ETA without spending anything"
                  },
                  "fast": {
                    "type": "boolean",
                    "description": "Fast lane: the queued episodes run on a rented GPU and are ready in minutes whatever their length. 2 credits per hour instead of 1. Promised within promise_seconds of the request (300 s for a typical job, longer for big batches, returned on the job and by dry_run); the extra credit per hour is refunded automatically if a job is later than that or an episode falls back to the standard lane."
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "request_id": {
                      "type": "string",
                      "nullable": true
                    },
                    "job": {
                      "$ref": "#/components/schemas/Job"
                    },
                    "already_transcribed": {
                      "type": "array",
                      "items": {
                        "type": "object"
                      }
                    },
                    "queued": {
                      "type": "integer"
                    },
                    "credits_charged": {
                      "type": "integer"
                    },
                    "credits_remaining": {
                      "type": "integer"
                    },
                    "delivery": {
                      "type": "string"
                    }
                  }
                }
              }
            }
          },
          "402": {
            "description": "Insufficient credits",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/jobs": {
      "get": {
        "tags": [
          "transcripts"
        ],
        "summary": "Transcription jobs for the calling key, newest first, paginated",
        "x-cost": {
          "requests": 1,
          "credits": 0
        },
        "parameters": [
          {
            "name": "page",
            "in": "query",
            "schema": {
              "type": "integer",
              "default": 1
            }
          },
          {
            "name": "per",
            "in": "query",
            "schema": {
              "type": "integer",
              "default": 20,
              "maximum": 50
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "jobs": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/Job"
                      }
                    },
                    "page": {
                      "type": "integer"
                    },
                    "per": {
                      "type": "integer"
                    },
                    "total": {
                      "type": "integer"
                    },
                    "has_more": {
                      "type": "boolean"
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/jobs/{id}": {
      "get": {
        "tags": [
          "transcripts"
        ],
        "summary": "Poll a transcription job (status, ETA, per-episode readiness)",
        "x-cost": {
          "requests": 1,
          "credits": 0
        },
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Job"
                }
              }
            }
          },
          "404": {
            "description": "No such job for this key",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/webhooks/secret": {
      "get": {
        "tags": [
          "transcripts"
        ],
        "summary": "Webhook signing secret (created on first call)",
        "x-cost": {
          "requests": 1,
          "credits": 0
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "secret": {
                      "type": "string"
                    },
                    "header": {
                      "type": "string"
                    },
                    "scheme": {
                      "type": "string"
                    }
                  }
                }
              }
            }
          }
        }
      },
      "post": {
        "tags": [
          "transcripts"
        ],
        "summary": "Rotate the webhook signing secret",
        "x-cost": {
          "requests": 1,
          "credits": 0
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "secret": {
                      "type": "string"
                    },
                    "rotated": {
                      "type": "boolean"
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/webhooks/inbox": {
      "post": {
        "tags": [
          "transcripts"
        ],
        "summary": "Create a hosted https test receiver (24 h)",
        "x-cost": {
          "requests": 1,
          "credits": 0
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "id": {
                      "type": "string"
                    },
                    "url": {
                      "type": "string"
                    },
                    "deliveries_url": {
                      "type": "string"
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/webhooks/inbox/{id}": {
      "get": {
        "tags": [
          "transcripts"
        ],
        "summary": "Deliveries received by a test inbox",
        "x-cost": {
          "requests": 1,
          "credits": 0
        },
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "deliveries": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "properties": {
                          "received_at": {
                            "type": "string"
                          },
                          "headers": {
                            "type": "object"
                          },
                          "body": {
                            "type": "object"
                          }
                        }
                      }
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/ai-search/query": {
      "post": {
        "tags": [
          "transcripts"
        ],
        "summary": "Find a topic in one episode, verbatim quotes with timestamps (1 credit, refunded on failure)",
        "x-cost": {
          "requests": 1,
          "credits": 1,
          "note": "Refunded on failure"
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "transcript_id",
                  "topic"
                ],
                "properties": {
                  "transcript_id": {
                    "type": "string"
                  },
                  "topic": {
                    "type": "string",
                    "maxLength": 200
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "found": {
                      "type": "boolean"
                    },
                    "summary": {
                      "type": "string"
                    },
                    "mentions": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "properties": {
                          "quote": {
                            "type": "string"
                          },
                          "context": {
                            "type": "string"
                          },
                          "timestamp_seconds": {
                            "type": "number"
                          },
                          "listen_url": {
                            "type": "string"
                          }
                        }
                      }
                    },
                    "credits": {
                      "type": "integer"
                    }
                  }
                }
              }
            }
          },
          "402": {
            "description": "Insufficient credits",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "409": {
            "description": "Not transcribed yet: transcribe first (its hours, plus 1 for the query)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    }
  },
  "components": {
    "securitySchemes": {
      "bearerAuth": {
        "type": "http",
        "scheme": "bearer",
        "description": "Your pm_ key. Also accepted as X-Api-Key."
      }
    },
    "schemas": {
      "Error": {
        "type": "object",
        "properties": {
          "error": {
            "type": "object",
            "properties": {
              "code": {
                "type": "string"
              },
              "message": {
                "type": "string"
              }
            }
          }
        }
      },
      "Me": {
        "type": "object",
        "properties": {
          "credits": {
            "type": "integer"
          },
          "plan": {
            "type": "string"
          },
          "email": {
            "type": "string",
            "nullable": true
          },
          "billing_managed": {
            "type": "boolean"
          },
          "unlocks": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "transcript": {
                  "type": "string"
                },
                "unlocked_at": {
                  "type": "string"
                },
                "url": {
                  "type": "string"
                }
              }
            }
          }
        }
      },
      "ShowSummary": {
        "type": "object",
        "properties": {
          "feed_id": {
            "type": "integer"
          },
          "title": {
            "type": "string"
          },
          "author": {
            "type": "string"
          },
          "artwork": {
            "type": "string"
          },
          "apple_id": {
            "type": "integer",
            "nullable": true
          },
          "indexed": {
            "type": "boolean",
            "description": "We index this show continuously"
          },
          "url": {
            "type": "string"
          },
          "episodes_url": {
            "type": "string"
          }
        }
      },
      "Show": {
        "type": "object",
        "properties": {
          "feed_id": {
            "type": "integer"
          },
          "title": {
            "type": "string"
          },
          "author": {
            "type": "string"
          },
          "description": {
            "type": "string"
          },
          "artwork": {
            "type": "string"
          },
          "language": {
            "type": "string",
            "nullable": true
          },
          "categories": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "episode_count_tracked": {
            "type": "integer",
            "nullable": true
          },
          "newest_episode_at": {
            "type": "string",
            "nullable": true
          },
          "feed_url": {
            "type": "string",
            "nullable": true
          },
          "website": {
            "type": "string",
            "nullable": true
          },
          "apple_id": {
            "type": "integer",
            "nullable": true
          },
          "indexed": {
            "type": "boolean"
          },
          "url": {
            "type": "string"
          },
          "episodes_url": {
            "type": "string"
          }
        }
      },
      "Job": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "status": {
            "type": "string",
            "enum": [
              "queued",
              "processing",
              "done"
            ]
          },
          "fast": {
            "type": "boolean",
            "description": "true when the job runs on the GPU fast lane"
          },
          "promise_seconds": {
            "type": "integer",
            "nullable": true,
            "description": "Fast lane only, while running: seconds from creation by which it is promised, else the premium is refunded"
          },
          "estimated_ready_at": {
            "type": "string",
            "nullable": true,
            "description": "From the live queue length and measured throughput"
          },
          "poll_after_seconds": {
            "type": "integer",
            "nullable": true
          },
          "poll_url": {
            "type": "string"
          },
          "webhook_url": {
            "type": "string",
            "nullable": true
          },
          "done": {
            "type": "integer"
          },
          "total": {
            "type": "integer"
          },
          "episodes": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "transcript_id": {
                  "type": "string"
                },
                "title": {
                  "type": "string"
                },
                "status": {
                  "type": "string",
                  "enum": [
                    "queued",
                    "ready"
                  ]
                },
                "url": {
                  "type": "string",
                  "nullable": true
                },
                "transcript_url": {
                  "type": "string",
                  "nullable": true
                }
              }
            }
          }
        }
      },
      "Episode": {
        "type": "object",
        "properties": {
          "guid": {
            "type": "string"
          },
          "transcript_id": {
            "type": "string"
          },
          "title": {
            "type": "string"
          },
          "description": {
            "type": "string",
            "nullable": true
          },
          "episode": {
            "type": "integer",
            "nullable": true
          },
          "season": {
            "type": "integer",
            "nullable": true
          },
          "published_at": {
            "type": "string",
            "nullable": true
          },
          "duration_seconds": {
            "type": "integer",
            "nullable": true
          },
          "audio_url": {
            "type": "string"
          },
          "transcript_status": {
            "type": "string",
            "enum": [
              "ready",
              "processing",
              "none"
            ]
          },
          "transcript_url": {
            "type": "string"
          },
          "page_url": {
            "type": "string"
          }
        }
      }
    }
  }
}