Skip to content
Slingdrop

Developers

Slingdrop, from your code

A CLI for the terminal, a REST API with an OpenAPI spec, a typed SDK and signed webhooks. Everything the app can do, you can automate.

CLI

Sling files, folders or piped output and get a link, a QR code and the URL on your clipboard. Requires Node 20 or later.

No install, no account
npx slingdrop deck.pdf                     # public link for 24 hours
npx slingdrop screenshot.png --passcode 4821
cat build.log | npx slingdrop --name build.log
Sign in once (opens your browser)
npm i -g slingdrop
slingdrop login
slingdrop ./dist --expires 30d              # a whole folder
slingdrop contract.pdf --vault              # end-to-end encrypted
slingdrop review.mp4 --private ana@studio.com,sam@client.com --approval
slingdrop ls
slingdrop rm <id>            # moves to Trash; add --forever to delete now
slingdrop request "Brand assets"

Authentication

Create an API key in Settings → Developer. Keys start with sd_ and are shown once. Send them as a bearer token. The base URL is https://api.slingdrop.my/v1.

curl
curl https://api.slingdrop.my/v1/me \
  -H "Authorization: Bearer $SLINGDROP_API_KEY"

Create a drop

Creating a drop returns its link immediately and one upload target per file. Send each file's bytes to its target. Files over 10 MB use multipart uploads in 8 MB parts.

curl
# 1. Create the drop
curl https://api.slingdrop.my/v1/drops \
  -H "Authorization: Bearer $SLINGDROP_API_KEY" -H "content-type: application/json" \
  -d '{"title":"Q3 plan","expiry":"7d","files":[{"name":"q3.pdf","size":482113,"type":"application/pdf"}]}'
# → { "drop": { "id": "…", "url": "https://slingdrop.my/d/…" }, "files": [{ "id": "F", "mode": "single", "token": "T" }] }

# 2. Upload the bytes
curl -X PUT https://slingdrop.my/api/uploads/F -H "x-upload-token: T" --data-binary @q3.pdf

TypeScript SDK

Handles uploads (including multipart and Vault encryption), retries and types. Works in Node 20+ and modern browsers.

TypeScript
import { Slingdrop } from "@slingdrop/sdk";

const sd = new Slingdrop({ apiKey: process.env.SLINGDROP_API_KEY });
const { drop, shareUrl } = await sd.drops.create(
  [{ name: "build-418.zip", data: blob }],
  { title: "Build #418", expiry: "7d", passcode: "tiger42" },
);
console.log(shareUrl);

const report = await sd.drops.analytics(drop.id, 7);

Webhooks

Subscribe an HTTPS endpoint to events. Each delivery is a JSON POST signed with your webhook secret and retried with backoff if your endpoint doesn't answer with a 2xx.

drop.createddrop.readydrop.vieweddrop.downloadeddrop.expiredcomment.createdapproval.createdrequest.fulfilledversion.created
Verify a delivery
import { verifyWebhook } from "@slingdrop/sdk";

export default async function handler(req: Request) {
  const body = await req.text();
  const ok = await verifyWebhook(process.env.SLINGDROP_WEBHOOK_SECRET!, req.headers.get("slingdrop-signature"), body);
  if (!ok) return new Response("bad signature", { status: 401 });
  const event = JSON.parse(body); // { id, type, createdAt, data }
  return new Response("ok");
}
// Signature header: Slingdrop-Signature: t=<unix>,v1=<hex HMAC-SHA256 of "t.body">

API reference

Generated from the same schemas that validate requests. Download the OpenAPI 3.1 spec to generate a client in any language.

  • get/meCurrent account, plan and limits
  • get/dropsList your drops
  • post/dropsCreate a drop and get upload targets
  • get/drops/{id}Get a drop with files and versions
  • patch/drops/{id}Update access, permissions or expiry
  • delete/drops/{id}Move a drop to Trash (restorable for 30 days). Add ?forever=1 to delete immediately.
  • post/drops/{id}/revokeTurn off the link
  • post/drops/{id}/versionsUpload a new version behind the same link
  • get/drops/{id}/analyticsViews, viewers, page dwell and devices
  • get/drops/{id}/commentsAll comments with anchors
  • get/requestsList file requests
  • post/requestsCreate a file request
  • patch/requests/{id}Close or reopen a request, or change its title or deadline
  • delete/requests/{id}Delete a request (uploaded drops are kept)
  • post/requests/{id}/nudgeEmail invited uploaders who haven't uploaded yet (at most every 6 hours)
  • get/webhooksList webhooks
  • post/webhooksCreate a webhook. The signing secret is returned once.
  • delete/webhooks/{id}Delete a webhook
  • get/webhooks/{id}/deliveriesRecent delivery attempts

Raycast

Sling the selected Finder files or your clipboard, browse recent drops and copy links without leaving the keyboard. Install the Slingdrop extension in Raycast and paste an API key from Settings when asked.

Limits

Free accounts get read-only access with 100 calls a day. Pro allows 10,000 calls a day and Team 100,000. Responses over the limit return 429. Upload size limits follow your plan.

Build something with Slingdrop

Create an API key and send your first drop from code.

Get an API key