Exporting Links (CSV)
Export every link in a project — together with its click and install analytics — to a CSV file. Exports are a paid-plan feature and run as a background job, so a large project never blocks your browser. When the file is ready you get an email and a download link.
Exporting from the dashboard
- Go to Dashboard → Links.
- (Optional) Apply any search or date filters — the export honours exactly what you have filtered to.
- Click Export → CSV.
The job starts immediately. You can keep working; when it finishes you'll receive an "export ready" email with a download link, and the download also appears in the dashboard.
What's in the file
One row per link, with these columns:
| Column | Description |
|---|---|
| Name | The link's name |
| Type | dynamic or unified |
| Slug | The link's slug |
| Short URL | The full short link |
| Created At | When the link was created |
| Clicks | Total clicks |
| New Installs | Installs attributed to the link |
| Returning Users | Returning-user opens attributed to the link |
| Attributed Clicks | Clicks matched to an install/open |
| Top Device | Most common device |
| Top OS | Most common operating system |
| Top Browser | Most common browser |
| Top Country | Most common country |
| Last Clicked At | Timestamp of the most recent click |
Limits
- 100,000 links per export. If a project (after filters) exceeds this, the job fails with a message asking you to narrow the filters — split the export by date range to stay under the cap.
- Download links are signed and valid for 7 days. Re-open the export from the dashboard to mint a fresh link after that.
How it works (API)
The dashboard drives two endpoints. They authenticate with a dashboard (Supabase) session — these are not API-key endpoints, and an export cannot be triggered with an SDK API key.
Start an export
POST https://api.ulink.ly/api/v1/projects/{projectId}/links/export
Authorization: Bearer <supabase-session-jwt>
Content-Type: application/json
{
"search": "summer",
"createdAfter": "2026-01-01",
"createdBefore": "2026-06-30",
"sortBy": "createdAt",
"sortOrder": "desc"
}
All body fields are optional and mirror the filters on the Links page. The response returns a job to poll:
{ "success": true, "data": { "jobId": "…", "status": "pending" } }
Poll for the result
GET https://api.ulink.ly/api/v1/projects/{projectId}/links/export/{jobId}
Authorization: Bearer <supabase-session-jwt>
{
"success": true,
"data": {
"status": "completed",
"rowCount": 1280,
"error": null,
"downloadUrl": "https://…signed-url…"
}
}
status moves through pending → processing → completed (or failed, with the
reason in error). A fresh signed downloadUrl is minted on each read of a
completed job, so you can always poll again for a new link rather than caching
the URL.
Free plans receive 402 Payment Required from the start endpoint.