REST API

Create and manage upload links from your own systems. The API is available on all plans; plan limits on active links apply.

Authentication

Create a key in Dashboard → API keys and send it as a bearer token:

Authorization: Bearer uh_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

Keys are shown only once. We store a hash, so a lost key can't be recovered — just create a new one and revoke the old one.

Create a link

POST /api/v1/links

curl -X POST https://upload-here.com/api/v1/links \
  -H "Authorization: Bearer $UPLOAD_HERE_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "title": "Monthly reports 12/2026",
    "description": "Dear Mr. Doe, please upload the December reports as CSV.",
    "location": "s3://my-bucket/reports/doe/2026-12",
    "expiresInDays": 14,
    "maxFileSizeMb": 2048,
    "maxTotalSizeMb": 10240,
    "password": "december-2026"
  }'
Field Type Required Description
title string yes Shown to the uploader (2–120 characters).
description string no Instructions shown under the title.
location string yes* s3://bucket/folder, gs://bucket/folder or az://container/folder.
provider, bucket, prefix string yes* Alternative to location. provider is AWS, GCS or AZURE.
expiresInDays number no Link stops accepting uploads after this many days. Default 30; 0 = never expires.
maxFileSizeMb number no Maximum size of a single file.
maxTotalSizeMb number no Maximum size of all files together, including uploads in progress.
password string no Uploaders must enter it before uploading (4–200 characters). It's stored hashed and never returned.

* Either location or provider + bucket.

Response 201 Created:

{
  "id": "k7Qm2xPa9c",
  "url": "https://upload-here.com/u/k7Qm2xPa9c",
  "title": "Monthly reports 12/2026",
  "description": "Dear Mr. Doe, please upload the December reports as CSV.",
  "provider": "AWS",
  "bucket": "my-bucket",
  "prefix": "reports/doe/2026-12",
  "active": true,
  "maxFileSizeMb": 2048,
  "maxTotalSizeMb": 10240,
  "passwordProtected": true,
  "expiresAt": "2026-12-21T10:00:00.000Z",
  "uploadCount": 0,
  "bytesUploaded": 0,
  "lastUploadAt": null,
  "createdAt": "2026-12-07T10:00:00.000Z"
}

Send url to your customer.

List links

GET /api/v1/links → { "links": [ ...link objects... ] } (newest first, up to 500).

Get a link

GET /api/v1/links/{id} → link object, including uploadCount and bytesUploaded.

Delete a link

DELETE /api/v1/links/{id} → 204 No Content. The URL stops working immediately; files already uploaded stay in your bucket.

Errors

Errors return JSON { "error": "message" } with a matching status code:

Status Meaning
400 Invalid input (the message says which field).
401 Missing or invalid API key.
403 Plan limit reached — upgrade to create more active links.
404 Link not found.