PREMIUM / DEVELOPERS

Every handoff. Connected.

Use File Link Pro from your own system: encrypted uploads, sharing controls, download counts, recipient emails and key management. Create your first API key in your Premium workspace. Each request checks the active subscription and limits access to that key’s owner.

Explore the interactive API reference · Download OpenAPI 3.1 JSON

Your Premium subscription covers API uploads: files up to 1 GB each and a 10 GB workspace. All you need is your File Link Pro API key and the encryption library below.

Authorization: Bearer flp_YOUR_KEY
Content-Type: application/json

Keep workspace API keys in trusted server environments. Decryption keys stay in your system and in the recipient’s private link. Add a downloadKey when you want a recipient email to include that link. Integrations perform encryption using the official libsodium library.

Download the working Node.js upload example · Manage API keys

Start with a real upload

npm install libsodium-wrappers
# Set FILELINK_API_KEY securely in your server environment.
node upload.mjs ./presentation.pdf

The example creates an included Premium transfer, encrypts and uploads the file in chunks, finalizes it, and prints the complete private link. Optional environment variables: FILELINK_EMAIL_LINK=true (explicitly includes the key in recipient emails), FILELINK_ORIGIN, FILELINK_PASSWORD, FILELINK_DAYS (1, 7 or 30), FILELINK_MAX_DOWNLOADS, and FILELINK_RECIPIENTS (comma separated). Treat the printed link as a secret.

The transfer lifecycle

All operations below use POST /api/v1/transfers. The transfer capability token returned by create is separate from your API key; keep both private. Send usePremium: true for included transfers up to 1 GB. Choose false to buy a separately paid transfer up to 50 GB. You are charged only when you make that choice.

{
  "operation": "create",
  "name": "presentation.pdf",
  "size": 5242880,
  "mime": "application/pdf",
  "days": 7,
  "usePremium": true,
  "password": "optional recipient password",
  "maxDownloads": 10
}
  1. Create returns publicId, token, amount (USD cents), included, days, rate and gigabytes. Included transfers reserve workspace storage immediately. Upload within 24 hours, while the capability and payment allowance are valid.
  2. Encrypt using libsodium secretstream XChaCha20-Poly1305 with a fresh 32-byte key and 24-byte header. Encode the key and header as unpadded base64url. Split plaintext into 8,388,608-byte chunks; use TAG_MESSAGE for each chunk and TAG_FINAL for the last. Each encrypted chunk has 17 bytes of overhead.
  3. Send operation: "start", publicId, token and header. Then send operation: "part" with those same fields plus a one-based part number. PUT that encrypted chunk to the returned URL. Upload URLs expire after ten minutes. Retrying the same part with identical bytes is safe.
  4. Send operation: "complete", publicId, token and header. The service verifies all uploaded part sizes before activation. Repeating completion with the same header is safe. Use operation: "status" with publicId and token to inspect state, transferId and expiry.
  5. Share https://filelink.pro/d/PUBLIC_ID#key=BASE64URL_KEY. If you restart encryption, start fresh with a new key and header and upload every part again, so each transfer uses one encryption stream.

Sharing controls & usage

Read /api/v1/account for current storage and limits. GET /api/v1/shares/ID accepts the public l_ identifier or internal transfer identifier, and returns metadata, downloadPath, expiresAt, downloads, hasPassword, maxDownloads and encryption format. Download counts measure how many times the link was requested.

PATCH /api/v1/shares/PUBLIC_ID
{
  "operation": "settings",
  "days": 30,
  "maxDownloads": 20
}

For stream transfers, expiry can be changed to 1, 7 or 30 days from initial activation. One-off transfers remain seven days. A null or omitted maxDownloads removes the cap; otherwise use 1–1,000. Set the password when creating a transfer. Delete a transfer to revoke it from that moment on. Files already downloaded stay with their recipients.

Recipient emails, with delivery status

POST /api/v1/shares/PUBLIC_ID/notifications
{
  "recipients": [
    "recipient@example.com"
  ]
}

This returns 202 when accepted into the durable Resend queue. Repeating the same transfer and recipient is safe: only one notification is sent. GET the same endpoint to see pending, queued, sent, delivered, delayed, bounced, failed or complained status. Watch for delivered: it means the recipient’s mail server accepted the message. Automatic provider retries are handled by the queue.

Emails announce the file name, size and expiry. Omit downloadKey to share the private link separately, or add downloadKey (43-character unpadded base64url) to include the complete link. Supplying this field explicitly sends the decryption key through File Link Pro and Resend to the recipient’s email provider. Ordinary email shares the key with email providers whether sent here or by you. Keep complete links private. Each request accepts up to 10 addresses, each transfer up to 30 recipients, and each Premium account up to 100 recipients daily (10 per minute). Notifications require an active, unexpired transfer with downloads remaining.

QR codes, print cards and Apple Wallet

Basic QR codes, printing and Apple Wallet passes are free on the website. Pro adds custom sender labels and accent colors, and API access for your own systems. Generate QR codes locally from the complete private URL, including #key=. Never strip the fragment.

POST /api/v1/shares/ID/pass with downloadKey and optional sender and accent (a six-digit hex color) returns a signed application/vnd.apple.pkpass file. Save the binary response as File-Link.pkpass. This is the one endpoint that returns a file instead of JSON on success. Repeating the request with the same key updates the same pass. Supplying the key explicitly allows File Link Pro to retain an encrypted copy for pass signing and updates. Apple also processes the complete link when the pass is saved to Wallet.

Passes register for automatic updates when added on an iPhone. Expiry, revocation, remaining downloads and changes to sharing settings update the pass. Delivery depends on the device and Apple; download access is enforced online immediately. Printed copies do not update. QR codes and passes never extend expiry or bypass passwords and limits.

Receive files in your own system

Recipients reach these endpoints with the link alone. GET /api/download/PUBLIC_ID returns fileName, fileSize, mimeType, hasPassword, maxDownloads, downloadCount, expiresAt and encryption. POST to the same URL with a JSON password field (or an empty object for an unprotected transfer) validates access and counts one download request. It returns blobUrl, iv (the stream header), chunkSize, encryption and file metadata. The encrypted blob URL expires after 60 seconds.

Fetch the encrypted bytes from blobUrl and decrypt locally with the key from the private link, using libsodium secretstream init_pull and pull. Consume ciphertext in chunkSize + 17 byte chunks, except the shorter final chunk. Verify the authentication tag on every chunk, require TAG_FINAL on the final chunk, and reject missing or trailing data. Keep the link fragment and key on the recipient’s device; the download endpoint works from the public ID alone. Downloads remain subject to password, expiry and download-count limits.

Optional: separately purchased larger transfers

Included Premium transfers use usePremium: true and are covered by your subscription. For a separately purchased transfer up to 50 GB, explicitly choose usePremium: false. The member rate is $1 per started binary GB, with seven-day availability. You pay for a larger transfer only when you choose one.

The optional checkout operation returns a Stripe Checkout Elements clientSecret for an inline payment screen inside your app. To build that screen, use Stripe’s browser SDK with File Link Pro’s publishable key, so payments go through File Link Pro’s Stripe account. Contact hello@filelink.pro to arrange this integration. Poll status until the server confirms paid before uploading. Payment must be confirmed by Stripe. Premium subscriptions are purchased through our checkout and managed on the billing page.

Endpoints at a glance

MethodEndpointPurpose
GET/api/v1/accountStorage, active transfers, limits and member pricing
GET/api/v1/transfersList your workspace transfers
POST/api/v1/transfersCreate, start, upload parts, finalize, check status or start one-off payment
GET/api/v1/shares/{id}Metadata, expiry, download count and access settings
PATCH/api/v1/shares/{id}Update expiry and download limit
DELETE/api/v1/shares/{id}Revoke access and remove encrypted storage
POST / GET/api/v1/shares/{id}/notificationsNotify recipients / read delivery status
GET / POST/api/v1/keysList / create integration keys
DELETE/api/v1/keys/{id}Revoke an integration key
GET / POST/api/download/{publicId}Recipient metadata / authorized encrypted download

API keys & errors

POST /api/v1/keys with a name to create a key. The response includes its token once. GET lists each key by its safe prefix; DELETE /api/v1/keys/ID revokes a key immediately. There can be ten active keys per workspace. Revoking the key used for the request is supported.

Requests return JSON, except a successful Wallet pass response. A missing key returns 401; denied access returns 403; malformed transfer operations or unavailable settings return 400; rate-limited upload requests return 429. Read the error field, correct the request, then retry. Retry a part, completion or notification after a brief failure. Each create reserves a new transfer, so check the result before you call it again.

One public API

Version 1 is the File Link Pro public API. Create and finalize uploads through /api/v1/transfers, and manage their sharing settings through /api/v1/shares/ID.

Included workspace limits are 1 GB per file and 10 GB total active/reserved storage, three pending reservations, and 200 transfer records. One-off transfers use separately purchased storage.

Back to workspace