> ## Documentation Index
> Fetch the complete documentation index at: https://docs.audivo.dev/llms.txt
> Use this file to discover all available pages before exploring further.

# Outbound fetching

> What Audivo downloads on your behalf, from where, and the rules every fetch obeys.

To transcribe an episode Audivo reads two kinds of thing from the public
internet: the show's RSS feed and the episode's audio file. Nothing else. A
feed may declare a publisher-supplied transcript; Audivo records that it is
declared and does not fetch it yet. It never fetches a
URL a caller hands it directly as audio, and it never fetches on a schedule:
every read is caused by a request of yours.

## How Audivo identifies itself

Feed and audio requests carry the User-Agent `HarkApi/0.1` and no
credential. Publishers see an ordinary, honest client.

## The rules every fetch obeys

* **HTTPS only.** A plain-HTTP feed URL is accepted only where a publisher's
  feed redirects to one, and the redirect chain is capped.
* **No private addresses.** Loopback, private, link-local, multicast,
  reserved and cloud-metadata ranges are refused for both IPv4 and IPv6, and
  the check is repeated after DNS resolution and after every redirect. A
  request that tries is refused as `unsafe_source` without disclosing what
  was found.
* **No credentials in URLs.**
* **Bounded reads.** Connect, read and total timeouts on every request; byte
  caps on feeds and transcripts; a 5 GB cap on audio; a decompression-ratio
  cap; content-type allow-lists; and feeds parsed with external entities
  disabled and depth limited.
* **Nothing sensitive is logged.** No signed query strings, no authorization
  headers, no API keys, and never a full customer-supplied URL.
* **Retries are bounded**, and a denylist honours takedown requests.

## What is read from a feed

The item's guid, title, publish date, enclosure URL and declared size, the
declared duration, and whether a transcript is linked. Show notes are not
stored.

## Where inference happens

Audio is chunked and sent to one inference sub-processor over an
authenticated connection, with the model version pinned; a provider-side
model change fails the job closed rather than switching engines silently. The
full sub-processor list is on [Your data](/data).
