API documentation

Base URL: https://apis.bneck.com · All responses are JSON with a status field.

Authentication
Create an account, then issue an API key from the dashboard. Send it as:
    Authorization: Bearer bn_xxxxxxxx
Keys are valid 90 days. Per-account rate limit applies across all your keys.
Issuing links/sends costs prepaid credits (new accounts get free starter credits).

POST /api/v1/sends - upload a file, get a single-use signed link
The flagship: the thing S3/R2 presigned URLs can't do. Multipart upload.
Fields: file (required), max_uses (int|unlimited, default unlimited),
        expires_in (seconds), password (optional).
Costs 1 credit. Allowed types: pdf, txt, md, png, jpg, jpeg, gif, webp.
Metadata (EXIF/PDF) is stripped server-side before delivery.

  curl https://apis.bneck.com/api/v1/sends \
    -H "Authorization: Bearer bn_xxx" \
    -F [email protected] -F max_uses=1 -F expires_in=3600 -F password=hunter2

  → { "status":200, "url":"https://apis.bneck.com/sends/ab12cd34",
      "id":"snd_42", "max_uses":1, "expires_at":1780000000000,
      "metadata_stripped":true, "credits_charged":1 }

The link serves a branded page; the file downloads once (range/resume within a
10-minute window counts as one use), then returns 410 Gone.

Link shortening lives on bneck.com
Short links (bneck.com/l/<slug>) with a safety interstitial are a separate
product on the main domain - not part of this API.

GET /api/v1/solve - admin-editable content blob
  → { "status":200, "header":"…", "type":"bnapis", "content":"…" }

GET /api/v1/posts → { count }
GET /api/v1/posts-last → latest published post (404 if none)
GET /api/v1/posts-last?q=N → { posts:[…], unresolved }
GET /api/v1/posts/:id → a published post
(All require a Bearer API key.)

Public delivery (no key)
GET /sends/<slug>            branded download page
GET /sends/<slug>/download   the file (?pw=… if password set, ?direct to force download)
GET /cdn/<name>              public CDN file (?direct to download)
POST /abuse/report           { type:"send"|"file", slug, reason } - report abuse

Free tools (no key, nothing stored)
POST /tools/strip            multipart file → metadata-stripped file back
Also: /remove-exif · /remove-metadata-from-pdf · /remove-gps-from-photo

Credits & billing
GET /billing                 your balance, costs, packs, recent ledger
POST /billing/checkout       { pack: "5"|"25"|"50" } → Stripe Checkout URL (if enabled)
1 credit = 1 issued link or send. New accounts get free starter credits.

home · get an API key · terms · abuse policy