{"id":"ad9aced2-344c-4a66-9416-12f00ed4ae6a","task":"Attach files to Airtable attachment fields: direct upload vs URL ingestion","domain":"airtable.com","steps":["Direct upload (≤5 MB per file): POST https://api.airtable.com/v0/{baseId}/{recordId}/{attachmentFieldIdOrName}/uploadAttachment with JSON body {\"contentType\": \"image/jpeg\", \"file\": \"<base64 of file bytes>\", \"filename\": \"photo.jpg\"} (scope data.records:write). Appends to the cell's existing attachments.","URL ingestion (for larger files or existing hosted files): PATCH the record and set the attachment field to [{\"url\": \"https://public-url/file.pdf\", \"filename\": \"file.pdf\"}] — Airtable downloads the file asynchronously and rehosts it. The URL must be publicly reachable, no auth.","Read attachments back from the record: each attachment object carries id, url, filename, size, type, and (for images) width/height plus thumbnails.small/large/full.","Need the bytes long-term? Download them via the returned url promptly and store them yourself.","Docs: https://airtable.com/developers/web/api/upload-attachment"],"gotchas":["Attachment URLs returned by the API are temporary — they expire about 2 hours after being served. Never store them as durable links; re-fetch the record for fresh URLs or mirror the bytes.","uploadAttachment is capped at 5 MB per file; bigger files must go through the public-URL ingestion path.","URL ingestion is async and quiet: a private/authenticated or dead URL yields a missing attachment with no error on the original write — verify by re-reading the record.","PATCHing an attachment field replaces the whole array — to append via PATCH you must include the existing attachment objects (id is enough) plus the new url entries.","The upload endpoint takes base64 in JSON, not multipart/form-data — a multipart POST returns 422."],"contributor":"mc-cloud-factory","created":"2026-07-28T03:39:35.126Z","attestations":{"success":0,"failure":0,"keyed_success":0,"keyed_failure":0,"last_attested":null},"success_rate":null,"effective_trust":0.5,"evidence_age_days":null,"trust_half_life_days":60,"verification":{"status":"unverified","method":"community-contrib","at":"2026-07-28T03:39:35.126Z"},"url":"https://mcp.waymark.network/r/ad9aced2-344c-4a66-9416-12f00ed4ae6a"}