Overview
The LinkVault API is a RESTful JSON API. All endpoints accept and return application/json unless otherwise noted (file uploads use multipart/form-data).
Base URL
https://linkvault.biz/apiPlan requirements: API access requires a Professional plan or above. Integrations and Branding endpoints require a Business plan.
Authentication
Include your API key in the Authorization header of every request:
Authorization: Bearer lv_your_api_key_here
Quick Start Example
curl -H 'Authorization: Bearer lv_your_key' \ https://linkvault.biz/api/links
Generate API keys from Settings → API Keys. Max 5 keys per account.
Errors
All errors return a JSON object with an error field:
{ "error": "Description of the error" }| Status | Meaning |
|---|---|
| 400 | Bad Request — invalid parameters |
| 401 | Unauthorized — missing or invalid API key |
| 403 | Forbidden — insufficient plan or permissions |
| 404 | Not Found — resource does not exist |
| 410 | Gone — link has expired |
| 422 | Unprocessable Entity — validation failed |
Links
/api/linksReturns a paginated list of your links.
Query Parameters
page (int), limit (int, 1-100), tab (active|expired)
Response
{ "links": [...], "pagination": { "page": 1, "limit": 10, "total": 42, "totalPages": 5 } }/api/links/{id}Returns metadata for a specific link.
Response
{ "id": "abc123", "name": "report.pdf", "mime": "application/pdf", "views": 12, "requires_password": false, "has_watermark": true }/api/links/{id}Delete a link and its stored file.
Response
{ "ok": true }/api/links/{id}/activeActivate or deactivate a link.
Request Body
{ "isActive": true }Response
{ "ok": true }/api/links/{id}/passwordSet or remove password. Send empty string to remove.
Request Body
{ "password": "mySecret" }Response
{ "ok": true, "hasPassword": true }/api/links/{id}/watermarkEnable or disable watermark.
Request Body
{ "hasWatermark": true }Response
{ "ok": true, "hasWatermark": true }/api/links/{id}/approvalRequire approval before viewing.
Request Body
{ "requiresApproval": true }Response
{ "ok": true, "requiresApproval": true }/api/links/{id}/otpRequire OTP verification and restrict by emails/domains.
Request Body
{ "requiresOtp": true, "allowedEmails": ["user@acme.com"], "allowedDomains": ["acme.com"] }Response
{ "ok": true }/api/links/{id}/booking-urlAttach a Calendly or custom booking link to the viewer.
Request Body
{ "booking_url": "https://calendly.com/me" }Response
{ "ok": true }/api/links/{id}/shareSend the viewer link to recipients.
Request Body
{ "emails": ["user@example.com"], "message": "Check this out" }Response
{ "ok": true }/api/links/{id}/fileUpload a new version of the file without changing the URL.
Request Body
file (binary multipart/form-data)
Response
{ "ok": true, "version": 2 }/api/links/roomCreate a Data Room from existing links.
Request Body
{ "name": "Project Vault", "children_ids": ["uuid1", "uuid2"] }Response
{ "ok": true, "id": "uuid" }/api/links/pending-countCount of pending access requests across all links.
Response
{ "count": 3 }/api/links/{id}/requestsList access requests for a link with approval required.
Response
{ "requests": [{ "id": 1, "visitorIp": "...", "status": "pending" }] }/api/links/{id}/requests/{requestId}Update access request status.
Request Body
{ "status": "approved" }Response
{ "ok": true, "status": "approved" }Upload
/api/uploadUpload a file and create a viewer link. Max 100 MB. Use multipart/form-data.
Form Fields
file (binary), expiration (1h|24h|7d), addPassword (0|1), password (string), hasWatermark (0|1), requiresApproval (0|1), requiresOtp (0|1), allowedEmails (string, comma-separated), allowedDomains (string, comma-separated), bookingUrl (string), previewPages (int), viewSessionTtlSeconds (60-86400), maxViews (0=unlimited), requirePaymentToDownload (0|1), downloadPrice (int, cents, min 50), downloadCurrency (string, e.g. eur)
Response
{ "id": "abc123def456", "viewer_url": "https://linkvault.biz/viewer/abc123def456" }API Keys
/api/api-keysList all your API keys (masked).
Response
{ "api_keys": [{ "id": 1, "name": "Production", "key_prefix": "lv_a3f1••••", "active": true, "total_requests": 142 }] }/api/api-keysGenerate a new key. The plain key is shown ONLY in this response.
Request Body
{ "name": "My Key" }Response
{ "api_key": { "id": 1, "name": "My Key", "key": "lv_a3f1b2c4d5e6f789..." }, "message": "Copy it now — it won't be shown again." }/api/api-keys/{id}/toggleActivate or deactivate a key.
Response
{ "active": false, "message": "API key deactivated" }/api/api-keys/{id}Permanently deactivate a key.
Response
{ "message": "API key revoked" }Integrations
/api/integrationsList configured Slack/Discord integrations. Business plan.
Response
{ "integrations": [{ "id": 1, "type": "slack", "enabled": true }] }/api/integrationsCreate a Slack or Discord webhook integration.
Request Body
{ "type": "slack", "config": { "webhook_url": "https://hooks.slack.com/...", "channel": "#general" } }Response
{ "ok": true }/api/integrations/{id}Remove an integration.
Response
{ "ok": true }Branding
/api/brandingGet current branding and SMTP settings. Business plan.
Response
{ "company_name": "Acme", "logo_url": "/uploads/logo.png", "primary_color": "#6366f1", "custom_domain": "share.acme.com", "bg_color": "#111827", "btn_radius": "8px", "smtp_host": "smtp.acme.com", "email_locale": "en" }/api/brandingUpdate branding and custom SMTP. Use multipart/form-data for logo upload.
Request Body
company_name (string), primary_color (hex), bg_color (hex), btn_text_color (hex), btn_radius (string), card_bg_color (hex), card_border_color (hex), text_color (hex), logo_size (int), custom_domain (string), logo (file), smtp_host, smtp_port, smtp_encryption, smtp_username, smtp_password, from_email, from_name, email_locale (string: en,es,fr,pt,it)
Response
{ "ok": true, "company_name": "Acme", ... }/api/branding/logoRemove the custom company logo.
Response
{ "ok": true }Client Portals
/api/client-portalsReturns a list of your client portals.
Response
{ "portals": [{ "id": "uuid", "name": "Acme", "slug": "acme" }] }/api/client-portalsCreate a new portal.
Request Body
{ "name": "Acme", "slug": "acme", "allowedEmails": ["user@acme.com"] }Response
{ "ok": true, "id": "uuid" }/api/client-portals/{id}Returns details of a specific portal.
Response
{ "portal": { "name": "Acme", "links": [] } }/api/client-portals/{id}Update portal details.
Request Body
{ "name": "Acme v2" }Response
{ "ok": true }/api/client-portals/{id}Delete a client portal.
Response
{ "ok": true }/api/client-portals/{id}/linksAssign existing files to this client portal.
Request Body
{ "linkIds": ["uuid1", "uuid2"] }Response
{ "ok": true }/api/client-portals/{id}/links/{linkId}Unassign a file from this portal.
Response
{ "ok": true }Templates
/api/templatesReturns a list of your link templates.
Response
{ "templates": [{ "id": 1, "name": "Standard" }] }/api/templatesCreate a new template.
Request Body
{ "name": "Standard", "hasWatermark": true }Response
{ "ok": true, "id": 1 }/api/templates/{id}Update template details.
Request Body
{ "name": "Premium" }Response
{ "ok": true }/api/templates/{id}Delete a link template.
Response
{ "ok": true }Analytics
/api/analytics/globalReturns global metrics and charts for all your links.
Response
{ "metrics": { "totalViews": 150 }, "topLinks": [], "recentActivity": [], "charts": {} }Monetization
/api/stripe/connect-statusCheck whether the authenticated user has connected their Stripe Express account and whether charges are enabled.
Response
{ "connected": true, "charges_enabled": true, "account_id": "acct_xxx" }/api/stripe/connectCreates a Stripe Express account (if needed) and returns an onboarding link. Redirect the user to this URL to complete their Stripe setup.
Response
{ "url": "https://connect.stripe.com/setup/..." }/api/stripe/checkout-download/{linkId}Initiates a Stripe Checkout session for a paid download. The visitor is redirected to Stripe to complete payment. On success they return with a session_id to retrieve the file.
Request Body
{ "email": "buyer@example.com" }Response
{ "url": "https://checkout.stripe.com/..." }/api/links/{id}/download-originalServes the original, un-watermarked file after a successful purchase. Requires a valid download token or Stripe session_id. Files are decrypted at rest and served as attachment.
Query Parameters
token (string) OR session_id (string)
Response
Binary file download (Content-Disposition: attachment)
Blocked File Types
The following extensions are rejected on upload: exe, dll, bat, cmd, msi, bin, iso, img, zip, rar, tar, gz
Need help? Contact Support or manage your API keys.