EmberlyEmberly Docs

API Reference

Use the Emberly REST API to upload files, shorten links and manage your account.

Every Emberly instance has the same REST API, whether it's embrly.ca or your own server. Anything you can do in the dashboard for your own files, links and account, you can do through the API.

Base URL

Use your instance's address. For embrly.ca:

https://embrly.ca/api

Authentication

Send a key in the Authorization header:

curl https://embrly.ca/api/files \
  -H "Authorization: Bearer ebk_..."
CredentialWhere to get itUse it for
API key (ebk_...)Profile → API, or POST /api/profile/api-keysScripts and apps. You can have up to 10, each with a name, and revoke them one by one.
Upload tokenProfile → UploadsShareX, Flameshot and other upload tools. You have one, and resetting it breaks every tool using it.
Browser sessionSigning in to the websiteThe dashboard itself. Not meant for scripts.

API keys and upload tokens both act as your whole account, so keep them secret. Prefer API keys for anything new: you can see when each was last used and revoke one without affecting the others.

Desktop apps should use device sign-in instead of asking for a password.

Responses

Successful responses are JSON with success: true and the result in data:

{
  "success": true,
  "data": { "id": "clx...", "url": "https://embrly.ca/aB3dE/photo.png" }
}

Errors return success: false and a message:

{
  "success": false,
  "error": "File not found"
}

Lists that support paging add a pagination object:

{
  "success": true,
  "data": [ ... ],
  "pagination": { "total": 120, "pageCount": 5, "page": 1, "limit": 24 }
}

A few older endpoints return the object directly, without the success/data wrapper. Each page says so where it applies.

Status Codes

CodeMeaning
200Success
201Created
202Accepted, still in progress (used while polling)
204Success, no content
400The request was invalid. The error field says why.
401Missing or invalid credentials, or a wrong file password
403Signed in, but not allowed to do this
404Not found, or private and not yours
413File too large for your upload limit
429Rate limited. Wait and try again.
500Server error

Rate Limits

Uploads and most endpoints aren't rate limited; storage quotas and upload size limits apply instead. These endpoints are limited per IP address:

EndpointLimit
POST /api/auth/register5 per minute
POST /api/auth/password/forgot1 per 10 minutes
POST /api/auth/password/reset5 per 10 minutes
POST /api/auth/resend-verification3 per 10 minutes
POST /api/device/code10 per 10 minutes

Health Check

GET /api/health needs no authentication. It reports whether the database, Redis, storage and background jobs are working, and returns 503 if the database is down. See Health Checks.

Server Information

GET /api/instance needs no authentication. Apps use it to adapt to the server they're connected to:

{
  "success": true,
  "data": {
    "name": "Emberly",
    "version": "3.1.0",
    "cloud": true,
    "billingEnabled": false,
    "features": {
      "customDomains": true,
      "squads": true,
      "discovery": true,
      "deviceSignIn": true
    }
  }
}

On this page