FileShareFree

API

Everything the website does, curl can do too. No account required — the same free limits apply.

Upload a file with curl

$ curl https://filesharefree.com/api/upload/init \
    -d '{"files":[{"name":"notes.txt","size":11,"mime":"text/plain"}]}'

$ curl -X PUT --data-binary @chunk0 \
    "https://filesharefree.com/api/upload/chunk?uploadId=…&index=0"

$ curl https://filesharefree.com/api/upload/complete \
    -d '{"transferId":"…","files":[{"uploadId":"…",…}]}'

$ curl https://filesharefree.com/api/transfer/k7m2pxq4

Endpoints

POST/api/upload/init

Create a transfer. Returns an upload session per file.

Request

{ "files": [{ "name": "video.mp4", "size": 20971520, "mime": "video/mp4" }],
  "password": "optional",       // omit for none
  "burnAfterRead": false }      // every transfer is deleted 24h after upload

Response

{ "transferId": "k7m2pxq4", "editKey": "…20 chars…",
  "files": [{ "uploadId": "…", "chunkSize": 8388608, "chunkCount": 3 }] }
PUT/api/upload/chunk?uploadId=…&index=0

Upload one raw 8 MiB chunk. Repeat until chunkCount is reached. Resumable.

Request

<raw bytes>

Response

204 No Content
GET/api/upload/chunk?uploadId=…

List already-received chunk indices (for resuming).

Request

Response

{ "received": [0, 1] }
POST/api/upload/complete

Seal the transfer: chunks are concatenated and encrypted at rest.

Request

{ "transferId": "k7m2pxq4",
  "files": [{ "uploadId": "…", "name": "video.mp4", "size": 20971520,
              "mime": "video/mp4", "chunkCount": 3 }] }

Response

{ "ok": true, "link": "/t/k7m2pxq4", "manageUrl": "/manage/…" }
GET/api/transfer/:id

Public metadata. File names/sizes stay hidden until unlock.

Request

Response

{ "id": "k7m2pxq4", "status": "ready", "hasPassword": false, "expiresAt": 0 }
POST/api/transfer/:id

Unlock a transfer (password optional if none set). Returns a 10-minute download token.

Request

{ "password": "…" }

Response

{ "ok": true, "token": "…", "files": [{ "index": 0, "name": "video.mp4" }] }
GET/api/download/:id/:index?token=…

Stream a decrypted file. Increments the download counter; burns burn-after-read transfers.

Request

Response

file stream
GET/api/manage/:editKey

Sender's view: stats, file list, status.

Request

Response

{ "downloads": 2, "status": "ready", "files": […] }
POST/api/manage/:editKey

Revoke the sender's link (files wiped).

Request

{ "action": "revoke" }

Response

{ "ok": true, "status": "revoked" }
DELETE/api/manage/:editKey

Delete the transfer and all records immediately.

Request

Response

{ "ok": true, "deleted": true }