When you have a campaign launch with fifty UTM permutations or a content backlog to back-fill, hand-cranking the create modal is slow. LinkLane's bulk surface covers the four moves you'd actually want: shorten a batch, import a CSV, export everything, and edit / delete in bulk.
Bulk shorten — up to 200 in a paste
On /bulk, paste up to 200 lines, each one URL with optional inline alias and tags. The endpoint POST /api/bulk/shorten returns one result per row — { ok, link, error?, input_url } — so partial failures are visible and recoverable. Existing aliases collide gracefully with a per-row error instead of failing the whole batch.
CSV import — up to 500 rows
POST /api/bulk/import accepts a CSV body (Content-Type: text/csv) with columns url, alias, tags. tags is a pipe-separated string per cell (work|launch|q2). Empty cells are skipped, malformed URLs return per-row 400s, and the response includes both successes and per-row error messages.
CSV export — your dashboard, on disk
GET /api/bulk/export.csv streams a 12-column CSV of every lane you own: code, url, short_url, alias, tags, campaign, clicks, expires_at, created_at, has_password, max_clicks, activates_at. It's free for all plans — your data is your data.
Bulk edit — tags + campaigns
Select rows in the dashboard's URL table and the bulk toolbar appears. From there you can add tags, remove tags, set or clear a campaign across the selection. The PATCH endpoint is owner-filtered, so cross-user IDs in a payload simply don't match and don't return data.
Bulk delete
POST /api/bulk/links/delete with a list of link_ids removes them all in one call and cleans up the related click_events. Cross-user IDs are silently dropped — the response tells you how many were actually deleted so you can sanity-check.
