API Endpoints
Complete reference for all available REST API endpoints.
Projects
Projects are the top-level containers for your dynamic links. Each project has a unique subdomain that forms the base of every link URL within it.
GET /api/v1/projects
Returns a paginated list of all projects belonging to the authenticated account.
| Field | Type | Required | Description |
|---|---|---|---|
page | number | No | Page number (default: 1). |
limit | number | No | Results per page, max 100 (default: 10). |
search | string | No | Filter projects by name or subdomain. |
sortBy | string | No | Field to sort by: name | subdomain | created_at | updated_at (default: created_at). |
sortOrder | string | No | Sort direction: asc or desc (default: desc). |
curl -H "Authorization: Bearer ls_live_..." \
"https://linksense.net/api/v1/projects?page=1&limit=10"{
"data": {
"data": [
{
"id": "proj_abc123",
"name": "My Project",
"subdomain": "my-project",
"created_at": "2024-01-01T00:00:00Z",
"updated_at": "2024-01-01T00:00:00Z",
"_count": { "dynamic_links": 5 }
}
],
"pagination": {
"page": 1,
"limit": 10,
"total": 1,
"totalPages": 1,
"hasNextPage": false,
"hasPreviousPage": false
}
}
}POST /api/v1/projects
Creates a new project. The subdomain must be globally unique.
| Field | Type | Required | Description |
|---|---|---|---|
name | string | Yes | Display name for the project. |
subdomain | string | Yes | Unique subdomain (lowercase letters, numbers, hyphens only). |
curl -X POST \
-H "Authorization: Bearer ls_live_..." \
-H "Content-Type: application/json" \
-d '{"name":"My Project","subdomain":"my-project"}' \
https://linksense.net/api/v1/projects{
"data": {
"id": "proj_abc123",
"name": "My Project",
"subdomain": "my-project",
"created_at": "2024-01-01T00:00:00Z",
"updated_at": "2024-01-01T00:00:00Z",
"user_id": "user_123"
}
}GET /api/v1/projects/:id
Retrieves a single project by its ID.
curl -H "Authorization: Bearer ls_live_..." \
https://linksense.net/api/v1/projects/proj_abc123{
"data": {
"id": "proj_abc123",
"name": "My Project",
"subdomain": "my-project",
"created_at": "2024-01-01T00:00:00Z",
"updated_at": "2024-01-01T00:00:00Z",
"user_id": "user_123"
}
}PUT /api/v1/projects/:id
Updates an existing project. Both the name and subdomain can be changed. When the subdomain is updated, all dynamic link URLs within the project are automatically regenerated.
| Field | Type | Required | Description |
|---|---|---|---|
name | string | No | New display name for the project. |
subdomain | string | No | New subdomain. When changed, all dynamic link URLs in this project are updated automatically. |
curl -X PUT \
-H "Authorization: Bearer ls_live_..." \
-H "Content-Type: application/json" \
-d '{"name":"Updated Project Name"}' \
https://linksense.net/api/v1/projects/proj_abc123{
"data": {
"id": "proj_abc123",
"name": "Updated Project Name",
"subdomain": "my-project",
"created_at": "2024-01-01T00:00:00Z",
"updated_at": "2024-01-02T00:00:00Z",
"user_id": "user_123"
}
}DELETE /api/v1/projects/:id
Permanently deletes a project and all of its dynamic links, app registrations, and analytics data. This action cannot be undone.
curl -X DELETE \
-H "Authorization: Bearer ls_live_..." \
https://linksense.net/api/v1/projects/proj_abc123{
"data": { "message": "Project deleted successfully" }
}Dynamic Links
Dynamic links are scoped to a project and contain the device routing configuration that determines where each user is sent when they click the link.
GET /api/v1/projects/:projectId/links
Returns a paginated list of dynamic links within a project.
| Field | Type | Required | Description |
|---|---|---|---|
page | number | No | Page number (default: 1). |
limit | number | No | Results per page, max 100 (default: 10). |
search | string | No | Filter links by name or custom path. |
sortBy | string | No | Field to sort by: name | custom_path | created_at | updated_at (default: created_at). |
sortOrder | string | No | Sort direction: asc or desc (default: desc). |
ios_app_id | string | No | Filter links by iOS app UUID. |
android_app_id | string | No | Filter links by Android app UUID. |
curl -H "Authorization: Bearer ls_live_..." \
"https://linksense.net/api/v1/projects/proj_abc123/links?page=1&limit=10"{
"data": {
"data": [
{
"id": "link_xyz789",
"project_id": "proj_abc123",
"name": "Summer Sale",
"desktop_url": "https://example.com",
"custom_path": "summer-sale",
"full_url": "https://my-project.linksense.net/summer-sale",
"ios_app_id": "ios_app_111",
"android_app_id": null,
"social_title": "Summer Sale - 50% Off",
"social_description": null,
"social_image_url": null,
"ios_deferred_deep_link": false,
"ios_fallback_url": null,
"android_fallback_url": null,
"created_at": "2024-01-01T00:00:00Z",
"updated_at": "2024-01-01T00:00:00Z",
"ios_apps": { "id": "ios_app_111", "name": "My iOS App", "bundle_id": "com.example.myapp" },
"android_apps": null
}
],
"pagination": {
"page": 1,
"limit": 10,
"total": 1,
"totalPages": 1,
"hasNextPage": false,
"hasPreviousPage": false
}
}
}POST /api/v1/projects/:projectId/links
Creates a new dynamic link within a project. Only a name is required — all other fields are optional. If no custom_path is provided, an 8-character alphanumeric path is auto-generated.
| Field | Type | Required | Description |
|---|---|---|---|
name | string | Yes | Display name for the link (internal reference only). |
desktop_url | string | No | Destination URL for desktop users. |
custom_path | string | No | Custom path segment (e.g., summer-sale). Auto-generated if omitted. |
ios_app_id | string | No | UUID of a registered iOS app in this project. |
android_app_id | string | No | UUID of a registered Android app in this project. |
social_title | string | No | Title used in social media previews (Open Graph). |
social_description | string | No | Description used in social media previews. |
social_image_url | string | No | Image URL used in social media previews. |
referrer_params | object | No | Key-value pairs appended as query parameters for attribution. |
ios_deferred_deep_link | boolean | No | Enable deferred deep linking for iOS (default: false). |
ios_fallback_url | string | No | Fallback URL when the iOS app is not installed. |
android_fallback_url | string | No | Fallback URL when the Android app is not installed. |
curl -X POST \
-H "Authorization: Bearer ls_live_..." \
-H "Content-Type: application/json" \
-d '{
"name": "Summer Sale",
"desktop_url": "https://example.com",
"custom_path": "summer-sale",
"ios_app_id": "ios_app_111",
"social_title": "Summer Sale - 50% Off"
}' \
https://linksense.net/api/v1/projects/proj_abc123/links{
"data": {
"id": "link_xyz789",
"project_id": "proj_abc123",
"name": "Summer Sale",
"desktop_url": "https://example.com",
"custom_path": "summer-sale",
"full_url": "https://my-project.linksense.net/summer-sale",
"ios_app_id": "ios_app_111",
"android_app_id": null,
"social_title": "Summer Sale - 50% Off",
"social_description": null,
"social_image_url": null,
"ios_deferred_deep_link": false,
"ios_fallback_url": null,
"android_fallback_url": null,
"created_at": "2024-01-01T00:00:00Z",
"updated_at": "2024-01-01T00:00:00Z"
}
}GET /api/v1/projects/:projectId/links/:id
Retrieves a single dynamic link by its ID.
curl -H "Authorization: Bearer ls_live_..." \
https://linksense.net/api/v1/projects/proj_abc123/links/link_xyz789{
"data": {
"id": "link_xyz789",
"project_id": "proj_abc123",
"name": "Summer Sale",
"desktop_url": "https://example.com",
"custom_path": "summer-sale",
"full_url": "https://my-project.linksense.net/summer-sale",
"ios_app_id": "ios_app_111",
"android_app_id": null,
"social_title": "Summer Sale - 50% Off",
"social_description": null,
"social_image_url": null,
"ios_deferred_deep_link": false,
"ios_fallback_url": null,
"android_fallback_url": null,
"created_at": "2024-01-01T00:00:00Z",
"updated_at": "2024-01-01T00:00:00Z",
"ios_apps": { "id": "ios_app_111", "name": "My iOS App", "bundle_id": "com.example.myapp" },
"android_apps": null
}
}PUT /api/v1/projects/:projectId/links/:id
Updates one or more fields on an existing dynamic link. Only the fields you include in the request body are modified. If the custom_path changes, the full_url is updated automatically.
| Field | Type | Required | Description |
|---|---|---|---|
name | string | No | New display name for the link. |
desktop_url | string | null | No | New desktop destination URL. Set to null to clear. |
custom_path | string | No | New custom path (must be unique within the project). |
ios_app_id | string | null | No | UUID of a registered iOS app. Set to null to unlink. |
android_app_id | string | null | No | UUID of a registered Android app. Set to null to unlink. |
social_title | string | null | No | New social media preview title. |
social_description | string | null | No | New social media preview description. |
social_image_url | string | null | No | New social media preview image URL. |
referrer_params | object | null | No | New referrer parameters. Set to null to clear. |
ios_deferred_deep_link | boolean | No | Enable or disable iOS deferred deep linking. |
ios_fallback_url | string | null | No | New iOS fallback URL. Set to null to clear. |
android_fallback_url | string | null | No | New Android fallback URL. Set to null to clear. |
curl -X PUT \
-H "Authorization: Bearer ls_live_..." \
-H "Content-Type: application/json" \
-d '{"desktop_url":"https://example.com/new","social_title":"Updated Title"}' \
https://linksense.net/api/v1/projects/proj_abc123/links/link_xyz789{
"data": {
"id": "link_xyz789",
"project_id": "proj_abc123",
"name": "Summer Sale",
"desktop_url": "https://example.com/new",
"custom_path": "summer-sale",
"full_url": "https://my-project.linksense.net/summer-sale",
"ios_app_id": "ios_app_111",
"android_app_id": null,
"social_title": "Updated Title",
"social_description": null,
"social_image_url": null,
"ios_deferred_deep_link": false,
"ios_fallback_url": null,
"android_fallback_url": null,
"created_at": "2024-01-01T00:00:00Z",
"updated_at": "2024-01-02T00:00:00Z",
"ios_apps": { "id": "ios_app_111", "name": "My iOS App", "bundle_id": "com.example.myapp" },
"android_apps": null
}
}DELETE /api/v1/projects/:projectId/links/:id
Permanently deletes a dynamic link. Any existing traffic to the link URL will stop resolving.
curl -X DELETE \
-H "Authorization: Bearer ls_live_..." \
https://linksense.net/api/v1/projects/proj_abc123/links/link_xyz789{
"data": { "message": "Dynamic link deleted successfully" }
}iOS Apps
Register iOS apps against a project to enable Universal Links deep linking. Each iOS app must have a unique bundle ID within the project.
GET /api/v1/projects/:projectId/ios-apps
Returns a paginated list of iOS app registrations for a project.
| Field | Type | Required | Description |
|---|---|---|---|
page | number | No | Page number (default: 1). |
limit | number | No | Results per page, max 100 (default: 10). |
search | string | No | Filter by name or bundle ID. |
sortBy | string | No | Field to sort by: name | bundle_id | created_at | updated_at (default: created_at). |
sortOrder | string | No | Sort direction: asc or desc (default: desc). |
curl -H "Authorization: Bearer ls_live_..." \
https://linksense.net/api/v1/projects/proj_abc123/ios-apps{
"data": {
"data": [
{
"id": "ios_app_111",
"name": "My iOS App",
"bundle_id": "com.example.myapp",
"team_id": "ABCDE12345",
"appstore_id": "123456789",
"project_id": "proj_abc123",
"created_at": "2024-01-01T00:00:00Z",
"updated_at": "2024-01-01T00:00:00Z"
}
],
"pagination": {
"page": 1,
"limit": 10,
"total": 1,
"totalPages": 1,
"hasNextPage": false,
"hasPreviousPage": false
}
}
}POST /api/v1/projects/:projectId/ios-apps
Registers an iOS app with the project. This enables the Apple App Site Association (AASA) file served by LinkSense to include your app's credentials.
| Field | Type | Required | Description |
|---|---|---|---|
name | string | Yes | Display name for the iOS app. |
bundle_id | string | Yes | Your app's bundle identifier (e.g., com.example.myapp). |
team_id | string | Yes | Your Apple Developer Team ID (10-character string). |
appstore_id | string | No | Your app's App Store numeric ID. |
curl -X POST \
-H "Authorization: Bearer ls_live_..." \
-H "Content-Type: application/json" \
-d '{
"name": "My iOS App",
"bundle_id": "com.example.myapp",
"team_id": "ABCDE12345",
"appstore_id": "123456789"
}' \
https://linksense.net/api/v1/projects/proj_abc123/ios-apps{
"data": {
"id": "ios_app_111",
"name": "My iOS App",
"bundle_id": "com.example.myapp",
"team_id": "ABCDE12345",
"appstore_id": "123456789",
"project_id": "proj_abc123",
"created_at": "2024-01-01T00:00:00Z",
"updated_at": "2024-01-01T00:00:00Z"
}
}GET /api/v1/projects/:projectId/ios-apps/:id
Retrieves a single iOS app registration by its ID.
curl -H "Authorization: Bearer ls_live_..." \
https://linksense.net/api/v1/projects/proj_abc123/ios-apps/ios_app_111{
"data": {
"id": "ios_app_111",
"name": "My iOS App",
"bundle_id": "com.example.myapp",
"team_id": "ABCDE12345",
"appstore_id": "123456789",
"project_id": "proj_abc123",
"created_at": "2024-01-01T00:00:00Z",
"updated_at": "2024-01-01T00:00:00Z"
}
}PUT /api/v1/projects/:projectId/ios-apps/:id
Updates fields on an existing iOS app registration.
| Field | Type | Required | Description |
|---|---|---|---|
name | string | No | New display name. |
bundle_id | string | No | New bundle identifier. |
team_id | string | No | New Apple Developer Team ID. |
appstore_id | string | No | New App Store numeric ID. |
curl -X PUT \
-H "Authorization: Bearer ls_live_..." \
-H "Content-Type: application/json" \
-d '{"appstore_id":"987654321"}' \
https://linksense.net/api/v1/projects/proj_abc123/ios-apps/ios_app_111{
"data": {
"id": "ios_app_111",
"name": "My iOS App",
"bundle_id": "com.example.myapp",
"team_id": "ABCDE12345",
"appstore_id": "987654321",
"project_id": "proj_abc123",
"created_at": "2024-01-01T00:00:00Z",
"updated_at": "2024-01-02T00:00:00Z"
}
}DELETE /api/v1/projects/:projectId/ios-apps/:id
Removes an iOS app registration from the project. The AASA file will no longer include this app's credentials after deletion. Deletion fails if the app is referenced by any dynamic links within the project.
curl -X DELETE \
-H "Authorization: Bearer ls_live_..." \
https://linksense.net/api/v1/projects/proj_abc123/ios-apps/ios_app_111{
"data": { "message": "iOS app deleted successfully" }
}Android Apps
Register Android apps against a project to enable App Links deep linking. Each Android app must have a unique package name within the project.
GET /api/v1/projects/:projectId/android-apps
Returns a paginated list of Android app registrations for a project.
| Field | Type | Required | Description |
|---|---|---|---|
page | number | No | Page number (default: 1). |
limit | number | No | Results per page, max 100 (default: 10). |
search | string | No | Filter by name or package name. |
sortBy | string | No | Field to sort by: name | package_name | created_at | updated_at (default: created_at). |
sortOrder | string | No | Sort direction: asc or desc (default: desc). |
curl -H "Authorization: Bearer ls_live_..." \
https://linksense.net/api/v1/projects/proj_abc123/android-apps{
"data": {
"data": [
{
"id": "android_app_222",
"name": "My Android App",
"package_name": "com.example.myapp",
"sha_fingerprints": ["AA:BB:CC:DD:EE:FF:00:11:22:33:44:55:66:77:88:99:AA:BB:CC:DD:EE:FF:00:11:22:33:44:55:66:77:88:99"],
"project_id": "proj_abc123",
"created_at": "2024-01-01T00:00:00Z",
"updated_at": "2024-01-01T00:00:00Z"
}
],
"pagination": {
"page": 1,
"limit": 10,
"total": 1,
"totalPages": 1,
"hasNextPage": false,
"hasPreviousPage": false
}
}
}POST /api/v1/projects/:projectId/android-apps
Registers an Android app with the project. This enables the Digital Asset Links (assetlinks.json) file served by LinkSense to include your app's credentials.
| Field | Type | Required | Description |
|---|---|---|---|
name | string | Yes | Display name for the Android app. |
package_name | string | Yes | Your app's package name (e.g., com.example.myapp). |
sha_fingerprints | string[] | Yes | Array of SHA-256 fingerprints of your app's signing certificates (colon-separated hex). |
curl -X POST \
-H "Authorization: Bearer ls_live_..." \
-H "Content-Type: application/json" \
-d '{
"name": "My Android App",
"package_name": "com.example.myapp",
"sha_fingerprints": ["AA:BB:CC:DD:EE:FF:00:11:22:33:44:55:66:77:88:99:AA:BB:CC:DD:EE:FF:00:11:22:33:44:55:66:77:88:99"]
}' \
https://linksense.net/api/v1/projects/proj_abc123/android-apps{
"data": {
"id": "android_app_222",
"name": "My Android App",
"package_name": "com.example.myapp",
"sha_fingerprints": ["AA:BB:CC:DD:..."],
"project_id": "proj_abc123",
"created_at": "2024-01-01T00:00:00Z",
"updated_at": "2024-01-01T00:00:00Z"
}
}GET /api/v1/projects/:projectId/android-apps/:id
Retrieves a single Android app registration by its ID.
curl -H "Authorization: Bearer ls_live_..." \
https://linksense.net/api/v1/projects/proj_abc123/android-apps/android_app_222{
"data": {
"id": "android_app_222",
"name": "My Android App",
"package_name": "com.example.myapp",
"sha_fingerprints": ["AA:BB:CC:DD:EE:FF:00:11:22:33:44:55:66:77:88:99:AA:BB:CC:DD:EE:FF:00:11:22:33:44:55:66:77:88:99"],
"project_id": "proj_abc123",
"created_at": "2024-01-01T00:00:00Z",
"updated_at": "2024-01-01T00:00:00Z"
}
}PUT /api/v1/projects/:projectId/android-apps/:id
Updates fields on an existing Android app registration.
| Field | Type | Required | Description |
|---|---|---|---|
name | string | No | New display name. |
package_name | string | No | New package name. |
sha_fingerprints | string[] | No | New SHA-256 certificate fingerprints. |
curl -X PUT \
-H "Authorization: Bearer ls_live_..." \
-H "Content-Type: application/json" \
-d '{"sha_fingerprints":["11:22:33:..."]}' \
https://linksense.net/api/v1/projects/proj_abc123/android-apps/android_app_222{
"data": {
"id": "android_app_222",
"name": "My Android App",
"package_name": "com.example.myapp",
"sha_fingerprints": ["11:22:33:..."],
"project_id": "proj_abc123",
"created_at": "2024-01-01T00:00:00Z",
"updated_at": "2024-01-02T00:00:00Z"
}
}DELETE /api/v1/projects/:projectId/android-apps/:id
Removes an Android app registration from the project. The assetlinks.json file will no longer include this app's credentials after deletion. Deletion fails if the app is referenced by any dynamic links within the project.
curl -X DELETE \
-H "Authorization: Bearer ls_live_..." \
https://linksense.net/api/v1/projects/proj_abc123/android-apps/android_app_222{
"data": { "message": "Android app deleted successfully" }
}