[{"data":1,"prerenderedAt":704},["ShallowReactive",2],{"nav-docs":3,"nav-api":60,"api-index":89},[4],{"title":5,"path":6,"stem":7,"children":8},"Docs","\u002Fdocs","docs",[9,12,16,20,24,28,32,36,40,44,48,52,56],{"title":10,"path":6,"stem":11},"Installation","docs\u002Findex",{"title":13,"path":14,"stem":15},"Sending files","\u002Fdocs\u002Fsending-files","docs\u002F02.sending-files",{"title":17,"path":18,"stem":19},"Receiving files","\u002Fdocs\u002Freceiving-files","docs\u002F03.receiving-files",{"title":21,"path":22,"stem":23},"Passwords, galleries and backgrounds","\u002Fdocs\u002Fshare-options","docs\u002F04.share-options",{"title":25,"path":26,"stem":27},"Expiry and deletion","\u002Fdocs\u002Fexpiry","docs\u002F05.expiry",{"title":29,"path":30,"stem":31},"Users","\u002Fdocs\u002Fusers","docs\u002F06.users",{"title":33,"path":34,"stem":35},"Configuration","\u002Fdocs\u002Fconfiguration","docs\u002F07.configuration",{"title":37,"path":38,"stem":39},"Colours and branding","\u002Fdocs\u002Fcolors","docs\u002F08.colors",{"title":41,"path":42,"stem":43},"Docker","\u002Fdocs\u002Fdocker","docs\u002F09.docker",{"title":45,"path":46,"stem":47},"API keys","\u002Fdocs\u002Fapi-keys","docs\u002F10.api-keys",{"title":49,"path":50,"stem":51},"MCP server","\u002Fdocs\u002Fmcp-server","docs\u002F11.mcp-server",{"title":53,"path":54,"stem":55},"Troubleshooting","\u002Fdocs\u002Ftroubleshooting","docs\u002F12.troubleshooting",{"title":57,"path":58,"stem":59},"Contributing","\u002Fdocs\u002Fcontributing","docs\u002F13.contributing",[61],{"title":62,"path":63,"stem":64,"children":65},"Api","\u002Fapi","api",[66,69,73,77,81,85],{"title":67,"path":63,"stem":68},"REST API","api\u002Findex",{"title":70,"path":71,"stem":72},"Transfers","\u002Fapi\u002Ftransfers","api\u002F02.transfers",{"title":74,"path":75,"stem":76},"Uploading files","\u002Fapi\u002Fupload","api\u002F03.upload",{"title":78,"path":79,"stem":80},"Sending a transfer","\u002Fapi\u002Fsend","api\u002F04.send",{"title":82,"path":83,"stem":84},"Downloading","\u002Fapi\u002Fdownload","api\u002F05.download",{"title":86,"path":87,"stem":88},"Recipients","\u002Fapi\u002Frecipients","api\u002F06.recipients",{"id":90,"title":67,"body":91,"description":101,"extension":700,"meta":701,"navigation":349,"path":63,"seo":702,"stem":68,"__hash__":703},"api\u002Fapi\u002Findex.md",{"type":92,"value":93,"toc":694},"minimark",[94,98,102,107,120,156,159,172,176,183,298,310,313,316,536,540,683,690],[95,96,67],"h1",{"id":97},"rest-api",[99,100,101],"p",{},"Everything the web interface does with transfers can be done over HTTP. This is\nwhat makes the instance scriptable: a build server that ships nightly artefacts\nto a client, a backup job handing over an export, or an AI assistant sending\nfiles on your behalf.",[103,104,106],"h2",{"id":105},"authentication","Authentication",[99,108,109,110,114,115,119],{},"Send an ",[111,112,113],"a",{"href":46},"API key"," in the ",[116,117,118],"code",{},"x-api-key"," header:",[121,122,127],"pre",{"className":123,"code":124,"language":125,"meta":126,"style":126},"language-bash shiki shiki-themes github-light github-dark","curl -H \"x-api-key: $KEY\" https:\u002F\u002Ftransfer.example.com\u002Fapi\u002Ftransfers\n","bash","",[116,128,129],{"__ignoreMap":126},[130,131,134,138,142,146,150,153],"span",{"class":132,"line":133},"line",1,[130,135,137],{"class":136},"sScJk","curl",[130,139,141],{"class":140},"sj4cs"," -H",[130,143,145],{"class":144},"sZZnC"," \"x-api-key: ",[130,147,149],{"class":148},"sVt8B","$KEY",[130,151,152],{"class":144},"\"",[130,154,155],{"class":144}," https:\u002F\u002Ftransfer.example.com\u002Fapi\u002Ftransfers\n",[99,157,158],{},"A key acts as the person who created it and carries exactly their permissions.\nTwo limits are deliberate: a key can never administer users, and a key can never\ncreate or revoke another key. Both are refused even for an administrator's key.",[99,160,161,162,166,167,171],{},"The ",[163,164,165],"strong",{},"download"," routes take no key at all. The token in the URL ",[168,169,170],"em",{},"is"," the\ncredential, because recipients are people with no account on your instance.",[103,173,175],{"id":174},"errors","Errors",[99,177,178,179,182],{},"Errors come back as ",[116,180,181],{},"{ \"error\": \"CODE\" }"," with a matching HTTP status.",[184,185,186,202],"table",{},[187,188,189],"thead",{},[190,191,192,196,199],"tr",{},[193,194,195],"th",{},"Status",[193,197,198],{},"Code",[193,200,201],{},"Meaning",[203,204,205,219,232,244,256,269,282],"tbody",{},[190,206,207,211,216],{},[208,209,210],"td",{},"401",[208,212,213],{},[116,214,215],{},"UNAUTHORIZED",[208,217,218],{},"Missing, malformed, revoked or expired key",[190,220,221,224,229],{},[208,222,223],{},"403",[208,225,226],{},[116,227,228],{},"API_KEY_READ_ONLY",[208,230,231],{},"The key may not write",[190,233,234,236,241],{},[208,235,223],{},[208,237,238],{},[116,239,240],{},"API_KEY_CANNOT_ADMINISTER",[208,242,243],{},"Admin endpoints refuse keys",[190,245,246,248,253],{},[208,247,223],{},[208,249,250],{},[116,251,252],{},"API_KEY_CANNOT_MANAGE_KEYS",[208,254,255],{},"Keys cannot manage keys",[190,257,258,261,266],{},[208,259,260],{},"404",[208,262,263],{},[116,264,265],{},"NOT_FOUND",[208,267,268],{},"No such transfer — or not yours",[190,270,271,274,279],{},[208,272,273],{},"409",[208,275,276],{},[116,277,278],{},"TRANSFER_ALREADY_SENT",[208,280,281],{},"The transfer has already gone out",[190,283,284,287,292],{},[208,285,286],{},"429",[208,288,289],{},[116,290,291],{},"TOO_MANY_REQUESTS",[208,293,294,295],{},"Rate limited; see ",[116,296,297],{},"Retry-After",[99,299,300,301,303,304,306,307,309],{},"Another account's transfer answers ",[116,302,260],{},", not ",[116,305,223],{},". That is on purpose: a\n",[116,308,223],{}," would confirm the id exists, which turns the endpoint into a way to\nenumerate them.",[103,311,78],{"id":312},"sending-a-transfer",[99,314,315],{},"Three steps, mirroring what the browser does. File bytes go over a normal\nmultipart upload rather than a JSON body, so a multi-gigabyte file streams to\ndisk instead of being buffered.",[121,317,319],{"className":123,"code":318,"language":125,"meta":126,"style":126},"KEY=your-api-key\nBASE=https:\u002F\u002Ftransfer.example.com\n\n# 1. Create a draft. Omit \"recipients\" for a link-only transfer.\nID=$(curl -s -X POST \"$BASE\u002Fapi\u002Ftransfers\" \\\n  -H \"x-api-key: $KEY\" -H 'Content-Type: application\u002Fjson' \\\n  -d '{\"subject\":\"Nightly build\",\"retentionDays\":7,\"recipients\":[\"client@example.com\"]}' \\\n  | jq -r .data.id)\n\n# 2. Upload each file, one request each.\ncurl -s -X POST \"$BASE\u002Fapi\u002Ftransfers\u002F$ID\u002Ffiles\" \\\n  -H \"x-api-key: $KEY\" -F \"file=@build.zip\"\n\n# 3. Send it. This mails the recipients and starts the retention clock.\ncurl -s -X POST \"$BASE\u002Fapi\u002Ftransfers\u002F$ID\u002Fsend\" -H \"x-api-key: $KEY\"\n",[116,320,321,333,344,351,358,392,411,422,440,445,451,477,494,499,505],{"__ignoreMap":126},[130,322,323,326,330],{"class":132,"line":133},[130,324,325],{"class":148},"KEY",[130,327,329],{"class":328},"szBVR","=",[130,331,332],{"class":144},"your-api-key\n",[130,334,336,339,341],{"class":132,"line":335},2,[130,337,338],{"class":148},"BASE",[130,340,329],{"class":328},[130,342,343],{"class":144},"https:\u002F\u002Ftransfer.example.com\n",[130,345,347],{"class":132,"line":346},3,[130,348,350],{"emptyLinePlaceholder":349},true,"\n",[130,352,354],{"class":132,"line":353},4,[130,355,357],{"class":356},"sJ8bj","# 1. Create a draft. Omit \"recipients\" for a link-only transfer.\n",[130,359,361,364,366,369,371,374,377,380,383,386,389],{"class":132,"line":360},5,[130,362,363],{"class":148},"ID",[130,365,329],{"class":328},[130,367,368],{"class":148},"$(",[130,370,137],{"class":136},[130,372,373],{"class":140}," -s",[130,375,376],{"class":140}," -X",[130,378,379],{"class":144}," POST",[130,381,382],{"class":144}," \"",[130,384,385],{"class":148},"$BASE",[130,387,388],{"class":144},"\u002Fapi\u002Ftransfers\"",[130,390,391],{"class":140}," \\\n",[130,393,395,398,400,402,404,406,409],{"class":132,"line":394},6,[130,396,397],{"class":140},"  -H",[130,399,145],{"class":144},[130,401,149],{"class":148},[130,403,152],{"class":144},[130,405,141],{"class":140},[130,407,408],{"class":144}," 'Content-Type: application\u002Fjson'",[130,410,391],{"class":140},[130,412,414,417,420],{"class":132,"line":413},7,[130,415,416],{"class":140},"  -d",[130,418,419],{"class":144}," '{\"subject\":\"Nightly build\",\"retentionDays\":7,\"recipients\":[\"client@example.com\"]}'",[130,421,391],{"class":140},[130,423,425,428,431,434,437],{"class":132,"line":424},8,[130,426,427],{"class":328},"  |",[130,429,430],{"class":136}," jq",[130,432,433],{"class":140}," -r",[130,435,436],{"class":144}," .data.id",[130,438,439],{"class":148},")\n",[130,441,443],{"class":132,"line":442},9,[130,444,350],{"emptyLinePlaceholder":349},[130,446,448],{"class":132,"line":447},10,[130,449,450],{"class":356},"# 2. Upload each file, one request each.\n",[130,452,454,456,458,460,462,464,466,469,472,475],{"class":132,"line":453},11,[130,455,137],{"class":136},[130,457,373],{"class":140},[130,459,376],{"class":140},[130,461,379],{"class":144},[130,463,382],{"class":144},[130,465,385],{"class":148},[130,467,468],{"class":144},"\u002Fapi\u002Ftransfers\u002F",[130,470,471],{"class":148},"$ID",[130,473,474],{"class":144},"\u002Ffiles\"",[130,476,391],{"class":140},[130,478,480,482,484,486,488,491],{"class":132,"line":479},12,[130,481,397],{"class":140},[130,483,145],{"class":144},[130,485,149],{"class":148},[130,487,152],{"class":144},[130,489,490],{"class":140}," -F",[130,492,493],{"class":144}," \"file=@build.zip\"\n",[130,495,497],{"class":132,"line":496},13,[130,498,350],{"emptyLinePlaceholder":349},[130,500,502],{"class":132,"line":501},14,[130,503,504],{"class":356},"# 3. Send it. This mails the recipients and starts the retention clock.\n",[130,506,508,510,512,514,516,518,520,522,524,527,529,531,533],{"class":132,"line":507},15,[130,509,137],{"class":136},[130,511,373],{"class":140},[130,513,376],{"class":140},[130,515,379],{"class":144},[130,517,382],{"class":144},[130,519,385],{"class":148},[130,521,468],{"class":144},[130,523,471],{"class":148},[130,525,526],{"class":144},"\u002Fsend\"",[130,528,141],{"class":140},[130,530,145],{"class":144},[130,532,149],{"class":148},[130,534,535],{"class":144},"\"\n",[103,537,539],{"id":538},"endpoints","Endpoints",[184,541,542,555],{},[187,543,544],{},[190,545,546,549,552],{},[193,547,548],{},"Method",[193,550,551],{},"Path",[193,553,554],{},"Purpose",[203,556,557,573,589,605,621,638,654,669],{},[190,558,559,564,570],{},[208,560,561],{},[116,562,563],{},"GET",[208,565,566],{},[111,567,568],{"href":71},[116,569,71],{},[208,571,572],{},"Transfers you sent and received",[190,574,575,580,586],{},[208,576,577],{},[116,578,579],{},"POST",[208,581,582],{},[111,583,584],{"href":71},[116,585,71],{},[208,587,588],{},"Create a draft",[190,590,591,595,602],{},[208,592,593],{},[116,594,579],{},[208,596,597],{},[111,598,599],{"href":75},[116,600,601],{},"\u002Fapi\u002Ftransfers\u002F:id\u002Ffiles",[208,603,604],{},"Upload one file",[190,606,607,611,618],{},[208,608,609],{},[116,610,579],{},[208,612,613],{},[111,614,615],{"href":79},[116,616,617],{},"\u002Fapi\u002Ftransfers\u002F:id\u002Fsend",[208,619,620],{},"Deliver it",[190,622,623,628,635],{},[208,624,625],{},[116,626,627],{},"DELETE",[208,629,630],{},[111,631,632],{"href":71},[116,633,634],{},"\u002Fapi\u002Ftransfers\u002F:id",[208,636,637],{},"Revoke it — files erased",[190,639,640,644,651],{},[208,641,642],{},[116,643,563],{},[208,645,646],{},[111,647,648],{"href":83},[116,649,650],{},"\u002Fapi\u002Fdownload\u002F:token",[208,652,653],{},"Public transfer contents",[190,655,656,660,666],{},[208,657,658],{},[116,659,563],{},[208,661,662],{},[111,663,664],{"href":87},[116,665,87],{},[208,667,668],{},"Team members you can address",[190,670,671,675,680],{},[208,672,673],{},[116,674,563],{},[208,676,677],{},[116,678,679],{},"\u002Fapi\u002Fhealth",[208,681,682],{},"Liveness, including the database",[99,684,685,686,689],{},"Key management (",[116,687,688],{},"\u002Fapi\u002Fauth\u002Fapi-key",") is session-only and deliberately not part\nof this API.",[691,692,693],"style",{},"html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .szBVR, html code.shiki .szBVR{--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sJ8bj, html code.shiki .sJ8bj{--shiki-default:#6A737D;--shiki-dark:#6A737D}",{"title":126,"searchDepth":335,"depth":335,"links":695},[696,697,698,699],{"id":105,"depth":335,"text":106},{"id":174,"depth":335,"text":175},{"id":312,"depth":335,"text":78},{"id":538,"depth":335,"text":539},"md",{},{"title":67,"description":101},"REyjmF0h67NEmnXZdS34hTbvguCL1jEfIhbnADHN9yk",1790104591762]