Developers

API documentation

Upload files, import remote links and manage your links programmatically with an API key.

Overview

Upload files, import remote links and manage your files from your own scripts and apps. Every request is made over HTTPS to the base url below.

Base url
https://api.blinkupload.com/api/public/v1

Authentication

Create a key on the API keys page of your dashboard and send it in the x-api-key header of every request. A key only ever reaches its own account's files. Keep it secret — revoke it if it leaks.

Responses

Every response is JSON with a matching HTTP status. status is true on success, with the result in message; on failure it is false and message explains what went wrong.

Shape
{ "status": true, "message": { … } }
{ "status": false, "message": "Invalid API key", "errors": [] }

Limits

How many calls an account can make a day depends on its plan; free accounts get 1,000. The allowance covers all of the account's keys, resets at 00:00 UTC, and Get account info shows yours. Every response carries X-RateLimit-Limit and X-RateLimit-Remaining headers. Signing part urls inside an upload you already opened is free. File size and storage follow your plan — see Get account info. Dates are ISO 8601 in UTC; sizes are in bytes.

The examples below use $API for the base url and $KEY for your key.

Errors

400The request is invalid — the message says which field and why.
401The x-api-key header is missing, or the key is unknown or revoked.
403The account that owns the key is deactivated.
404The file, upload or import doesn't exist or isn't yours.
411A single-request upload was sent without a Content-Length.
413A single-request upload is over 500 MB; use the chunked upload.
415A single-request upload was sent as JSON or form data instead of raw bytes.
429The daily call limit is used up, or too many remote imports are running.

Account

Who the key belongs to, what the account may store, and how many calls are left today.

Get account info

GET/account

Details and limits of the account that owns the key.

ParameterInDescription
x-api-key

stringrequired

headerYour API key.
Example
curl -H "x-api-key: $KEY" "$API/account"
Response
{
  "status": true,
  "message": {
    "firstName": "Ada",
    "lastName": "Lovelace",
    "email": "[email protected]",
    "joinedAt": "2026-01-02T17:33:00.000Z",
    "plan": "Pro",
    "isPro": true,
    "maxFileSizeBytes": 107374182400,
    "storageLimitBytes": 1099511627776,
    "storageUsedBytes": 5368709120,
    "apiCallsLimit": 5000,
    "apiCallsRemaining": 4973
  }
}

A storage or file-size limit of 0 means no ceiling of its own. apiCallsLimit is your plan's daily allowance.

Upload in one request

The quickest way to upload a file of up to 500 MB: send its bytes as the request body and get the link back.

Upload a file

POST/uploads/simple

The request body is the raw file — not multipart form data. Its size is read from Content-Length and its type from Content-Type.

ParameterInDescription
x-api-key

stringrequired

headerYour API key.
x-file-password

string

headerPassword visitors must enter to download, at least 4 characters. Sent as a header so it stays out of urls and logs.
Content-Type

string

headerThe file's type, e.g. application/pdf. Use application/octet-stream when unsure.
name

stringrequired

queryFile name, up to 255 characters.
title

string

queryTitle shown on the download page, up to 120 characters.
description

string

queryDescription shown on the download page, up to 1000 characters.
expiresInDays

integer

queryDays until the link expires, 1–365. Defaults to 30.
Example
curl -X POST \
  -H "x-api-key: $KEY" \
  -H "Content-Type: application/pdf" \
  --data-binary @report.pdf \
  "$API/uploads/simple?name=report.pdf&expiresInDays=7"
Response
{
  "status": true,
  "message": {
    "file": {
      "id": "6720f1c2a4b5c6d7e8f90123",
      "token": "Xk3v9QpL2mN8rT4w",
      "title": "Q3 report",
      "description": null,
      "isProtected": false,
      "originalName": "report.pdf",
      "mimeType": "application/pdf",
      "size": 1048576,
      "status": "ready",
      "downloads": 0,
      "expiresAt": "2026-11-25T12:00:00.000Z",
      "createdAt": "2026-10-26T12:00:00.000Z",
      "updatedAt": "2026-10-26T12:00:00.000Z"
    },
    "url": "https://blinkupload.com/f/Xk3v9QpL2mN8rT4w"
  }
}

Chunked upload

For files up to 100 GB. You open an upload, send its parts straight to storage using signed urls, then complete it. An interrupted upload can be resumed.

1. Open an upload

POST/uploads

Creates the upload and tells you how to split the file.

ParameterInDescription
x-api-key

stringrequired

headerYour API key.
originalName

stringrequired

bodyFile name, up to 255 characters.
size

integerrequired

bodyExact file size in bytes.
mimeType

string

bodyThe file's type.
password

string

bodyDownload password, at least 4 characters.
title

string

bodyTitle shown on the download page, up to 120 characters.
description

string

bodyDescription shown on the download page, up to 1000 characters.
expiresInDays

integer

bodyDays until the link expires, 1–365. Defaults to 30.
Example
curl -X POST -H "x-api-key: $KEY" -H "Content-Type: application/json" \
  -d '{"originalName":"video.mp4","size":2147483648}' \
  "$API/uploads"
Response
{
  "status": true,
  "message": {
    "file": { "id": "6720f1c2a4b5c6d7e8f90123", "status": "pending", "...": "..." },
    "upload": { "partSize": 8388608, "partCount": 256 }
  }
}

Part n covers bytes (n − 1) × partSize up to n × partSize; the last part may be shorter.

2. Get part upload urls

POST/uploads/{id}/part-urls

Signs upload urls for up to 50 parts at a time. PUT each part's bytes to its url with a Content-MD5 header equal to the checksum you sent. These calls don't count toward your daily limit.

ParameterInDescription
x-api-key

stringrequired

headerYour API key.
parts

arrayrequired

body1–50 items of { partNumber, checksum }, where checksum is the base64 MD5 of that part's bytes.
Example
curl -X POST -H "x-api-key: $KEY" -H "Content-Type: application/json" \
  -d '{"parts":[{"partNumber":1,"checksum":"1B2M2Y8AsgTpgAmY7PhCfg=="}]}' \
  "$API/uploads/$ID/part-urls"

# then, for each part:
curl -X PUT -H "Content-MD5: 1B2M2Y8AsgTpgAmY7PhCfg==" --data-binary @part1 "$PART_URL"
Response
{
  "status": true,
  "message": { "urls": [{ "partNumber": 1, "url": "https://…" }] }
}

Resume an upload

GET/uploads/{id}/resume

Lists the parts storage already holds, so you only send the missing ones.

ParameterInDescription
x-api-key

stringrequired

headerYour API key.
Example
curl -H "x-api-key: $KEY" "$API/uploads/$ID/resume"
Response
{
  "status": true,
  "message": {
    "partSize": 8388608,
    "partCount": 256,
    "uploadedParts": [{ "partNumber": 1, "eTag": "\"…\"", "size": 8388608, "lastModified": "2026-10-26T12:01:00.000Z" }]
  }
}

3. Complete the upload

POST/uploads/{id}/complete

Assembles the parts, checks the size and publishes the link.

ParameterInDescription
x-api-key

stringrequired

headerYour API key.
Example
curl -X POST -H "x-api-key: $KEY" "$API/uploads/$ID/complete"
Response
{
  "status": true,
  "message": {
    "file": {
      "id": "6720f1c2a4b5c6d7e8f90123",
      "token": "Xk3v9QpL2mN8rT4w",
      "title": "Q3 report",
      "description": null,
      "isProtected": false,
      "originalName": "report.pdf",
      "mimeType": "application/pdf",
      "size": 1048576,
      "status": "ready",
      "downloads": 0,
      "expiresAt": "2026-11-25T12:00:00.000Z",
      "createdAt": "2026-10-26T12:00:00.000Z",
      "updatedAt": "2026-10-26T12:00:00.000Z"
    },
    "url": "https://blinkupload.com/f/Xk3v9QpL2mN8rT4w"
  }
}

Cancel an upload

DELETE/uploads/{id}

Abandons an upload that hasn't been completed and frees its parts.

ParameterInDescription
x-api-key

stringrequired

headerYour API key.
Example
curl -X DELETE -H "x-api-key: $KEY" "$API/uploads/$ID"
Response
{ "status": true, "message": "upload successfully cancelled" }

Remote upload

Import a file or folder from PixelDrain, GoFile or Mega. The transfer runs on our servers; poll it until it completes.

Start an import

POST/remote-uploads

Starts the import in the background and returns its id.

ParameterInDescription
x-api-key

stringrequired

headerYour API key.
url

stringrequired

bodyA PixelDrain, GoFile or Mega share link.
fileName

string

bodyRename the file; only used when the link is a single file.
password

string

bodyDownload password, at least 4 characters.
title

string

bodyTitle shown on the download page, up to 120 characters.
description

string

bodyDescription shown on the download page, up to 1000 characters.
expiresInDays

integer

bodyDays until the link expires, 1–365. Defaults to 30.
Example
curl -X POST -H "x-api-key: $KEY" -H "Content-Type: application/json" \
  -d '{"url":"https://pixeldrain.com/u/abc123"}' \
  "$API/remote-uploads"
Response
{ "status": true, "message": { "jobId": "6720f1c2a4b5c6d7e8f90456" } }

Check an import

GET/remote-uploads/{id}

Progress of the import. Each file's url works once status is completed.

ParameterInDescription
x-api-key

stringrequired

headerYour API key.
Example
curl -H "x-api-key: $KEY" "$API/remote-uploads/$JOB_ID"
Response
{
  "status": true,
  "message": {
    "id": "6720f1c2a4b5c6d7e8f90456",
    "status": "completed",
    "host": "pixeldrain",
    "bytesTransferred": 1048576,
    "totalBytes": 1048576,
    "currentFileName": null,
    "error": null,
    "files": [{
      "name": "report.pdf",
      "size": 1048576,
      "bytesTransferred": 1048576,
      "fileId": "6720f1c2a4b5c6d7e8f90123",
      "token": "Xk3v9QpL2mN8rT4w",
      "url": "https://blinkupload.com/f/Xk3v9QpL2mN8rT4w"
    }],
    "createdAt": "2026-10-26T12:00:00.000Z"
  }
}

status is one of queued, fetching, uploading, completed or failed.

Files

Read and delete the files on your account.

List files

GET/files

Your files, newest first, each with its link.

ParameterInDescription
x-api-key

stringrequired

headerYour API key.
page

integer

queryPage number, from 1.
limit

integer

queryFiles per page. Defaults to 10.
status

string

querypending, ready, expired or failed.
searchKey

string

queryMatches the title or file name.
Example
curl -H "x-api-key: $KEY" "$API/files?status=ready&page=1"
Response
{
  "status": true,
  "message": {
    "docs": [{ "id": "6720f1c2a4b5c6d7e8f90123", "originalName": "report.pdf", "...": "...", "url": "https://blinkupload.com/f/Xk3v9QpL2mN8rT4w" }],
    "meta": { "totalDocs": 1, "totalPages": 1, "page": 1 }
  }
}

Get file info

GET/files/{id}

One file and its link.

ParameterInDescription
x-api-key

stringrequired

headerYour API key.
Example
curl -H "x-api-key: $KEY" "$API/files/$FILE_ID"
Response
{
  "status": true,
  "message": {
    "file": {
      "id": "6720f1c2a4b5c6d7e8f90123",
      "token": "Xk3v9QpL2mN8rT4w",
      "title": "Q3 report",
      "description": null,
      "isProtected": false,
      "originalName": "report.pdf",
      "mimeType": "application/pdf",
      "size": 1048576,
      "status": "ready",
      "downloads": 0,
      "expiresAt": "2026-11-25T12:00:00.000Z",
      "createdAt": "2026-10-26T12:00:00.000Z",
      "updatedAt": "2026-10-26T12:00:00.000Z"
    },
    "url": "https://blinkupload.com/f/Xk3v9QpL2mN8rT4w"
  }
}

Delete a file

DELETE/files/{id}

Deletes the file and its link for good.

ParameterInDescription
x-api-key

stringrequired

headerYour API key.
Example
curl -X DELETE -H "x-api-key: $KEY" "$API/files/$FILE_ID"
Response
{ "status": true, "message": "file successfully deleted" }