dev.atfs.repo.uploadFile

atfs.dev

{
  "$type": "com.atproto.lexicon.schema",
  "defs": {
    "main": {
      "description": "Upload a file to be served by this atfs instance over IPFS and plain HTTP. Intentionally fully wire-compatible with com.atproto.repo.uploadBlob — same binary request body, same inter-service auth mechanism, same response shape — so any uploadBlob client works against this endpoint unchanged, by switching only the NSID in the request path and the `lxm` claim of its auth token. This method is also mounted, unmodified, as com.atproto.repo.uploadBlob itself, for callers that have no reason to know atfs has its own name for it; a token minted for one NSID is rejected on the other's path. Requires auth (a caller's own inter-service auth JWT, signed by its account's signing key); restricted to the instance's configured account allowlist (see dev.atfs.server's accounts field).",
      "errors": [
        {
          "description": "The request body exceeds this instance's maximum blob size.",
          "name": "BlobTooLarge"
        }
      ],
      "input": {
        "encoding": "*/*"
      },
      "output": {
        "encoding": "application/json",
        "schema": {
          "properties": {
            "blob": {
              "description": "The PDS's own uploadBlob response shape: the uploaded bytes' blessed CID (see dev.atfs.file's cid field), the mimeType recorded (defaulting to application/octet-stream when the request carried no Content-Type), and size in bytes.",
              "type": "blob"
            },
            "ipfsRoot": {
              "description": "atfs's own addition to the PDS response shape, absent from a plain com.atproto.repo.uploadBlob response: the CID to fetch the just-uploaded file over the IPFS network, exactly as dev.atfs.file's ipfsRoot field documents — the UnixFS root for a large file, or equal to blob's own CID when it fits a single Bitswap block. Standard atproto clients ignore unknown top-level fields, so this stays response-compatible with the PDS. Omitted (not a misleading zero value) on the rare occasion indexing hasn't finished yet; the file is already safely stored either way, and a later dev.atfs.repo.getFile or /ipfs/<cid> request is unaffected.",
              "type": "cid-link"
            }
          },
          "required": [
            "blob"
          ],
          "type": "object"
        }
      },
      "type": "procedure"
    }
  },
  "id": "dev.atfs.repo.uploadFile",
  "lexicon": 1
}

Validate Record

Validate a record against dev.atfs.repo.uploadFile

Validation Options
Treat any remaining unresolved references as valid

Metadata

DID
did:web:atfs.dev
CID
bafyreiafeiamtrsr5pmda4v57zs2am56isv4pkeedkjx7i7di64oalqsmi
Indexed At
2026-08-09 02:33 UTC
AT-URI
at://did:web:atfs.dev/com.atproto.lexicon.schema/dev.atfs.repo.uploadFile

Version History (3 versions)

Similar Lexicons

Lexicons whose schemas describe something close to this one. Check them before publishing a new one that overlaps.

  • dev.atfs.file object

    An embeddable reference to a file hosted on an atfs instance and addressed by IPFS content-addressing. Deliberately not the native `blob` lexicon type: a PDS scans records for blob refs and rejects any whose blob isn't …

  • Pin a file that already exists on the IPFS network, as if the caller had uploaded it to this instance: the bytes are fetched, verified against the reference's blessed cid, stored, served, and announced, and the caller e…

  • Upload raw image bytes to the authenticated viewer's own PDS, mediated by the AppView using its server-held session (confidential OAuth client only). Mirrors com.atproto.repo.uploadBlob. The returned blob ref is passed …

  • Upload a new blob, to be referenced from a repository record. The blob will be deleted if it is not referenced within a time window (eg, minutes). Blob restrictions (mimetype, size, etc) are enforced when the reference …

Lexicon Garden

@