---
title: v1: Create a link (POST /public-api/file/{file_id}/link) | HelpRange API
description: POST /public-api/file/{file_id}/link: A new labelled link for a document.
url: https://www.helprange.com/developers/api/v1-create-link
---

POST

# v1: Create a link

`https://www.helprange.com/public-api/file/{file_id}/link`

A new labelled link for a document. label, isAllowDownloadingAndPrint, isOnlyOneUserViewing, passcode and expirationDate must be present (passcode and expirationDate may be null). Booleans: true / false, 1 / 0 or "true" / "false". An empty label, an expirationDate in the past or unreadable, or a negative / non-whole viewsLimit answer 400 with {"result": "failure", "reason"}. A protection setting your plan does not include answers 403 with {"result": "failure", "reason", "plan_error", "features"}.

**Plans:** Pro, Max, Unlimited, Deal Room Pass, trial. **Auth:** the API key in `Authorization` (bare, or `Bearer hr_live_…`) (v1). **Scope:** `links:write`. **Operation id:** `v1CreateLink`

## Parameters

| Name | In | Type | Description |
|---|---|---|---|
| `file_id` required | path | integer | Document id. (min 1) |

**Header** `Idempotency-Key` (optional, up to 255 characters): retry with the same key and body within 24 hours and you get the first response back (`Idempotent-Replayed: true`) – the request is not run twice. Another body: `422 idempotency_key_reused`; still running: `409 idempotency_key_in_progress`. [More](https://www.helprange.com/developers/api#idempotency).

## Request body

Content types: `application/json`.

| Field | Type | Description |
|---|---|---|
| `label` required | string | Name of the link (not empty). |
| `isAllowDownloadingAndPrint` required | boolean or integer or string | Allow download & print. true / false (also 1 / 0 or "true" / "false"). |
| `isOnlyOneUserViewing` required | boolean or integer or string | Only one person can view at the same time. true / false (also 1 / 0 or "true" / "false"). |
| `passcode` required | string or null | Only spaces = no passcode. |
| `expirationDate` required | string (date) or null | Last day, YYYY-MM-DD: today or later (a past day → 400). |
| `viewsLimit` | integer or null | 0 or null = no limit; negative → 400. (min 0) |
| `isForwardable` | boolean or integer or string | Default true. true / false (also 1 / 0 or "true" / "false"). |
| `isScreenshotMask` | boolean or integer or string | Screenshot protection. true / false (also 1 / 0 or "true" / "false"). |
| `isScreenAppOnly` | boolean or integer or string | Open only in the app. true / false (also 1 / 0 or "true" / "false"). |
| `isWatermark` | boolean or integer or string | Watermark. true / false (also 1 / 0 or "true" / "false"). |

## Example request

```
curl -X POST https://www.helprange.com/public-api/file/124/link \
  -H "Authorization: $HELPRANGE_API_KEY" \
  -H 'Content-Type: application/json' \
  --data-binary '{"label": "someLabel", "isAllowDownloadingAndPrint": true, "isOnlyOneUserViewing": false, "isForwardable": true, "isScreenshotMask": false, "isWatermark": false, "passcode": "abcd", "expirationDate": "2026-12-24", "viewsLimit": 10}'
```

```
const res = await fetch('https://www.helprange.com/public-api/file/124/link', {
  method: 'POST',
  headers: {'Authorization': process.env.HELPRANGE_API_KEY, 'Content-Type': 'application/json'},
  body: JSON.stringify({
    "label": "someLabel",
    "isAllowDownloadingAndPrint": true,
    "isOnlyOneUserViewing": false,
    "isForwardable": true,
    "isScreenshotMask": false,
    "isWatermark": false,
    "passcode": "abcd",
    "expirationDate": "2026-12-24",
    "viewsLimit": 10
  }),
});
const data = await res.json();
if (!res.ok) throw new Error(`${res.status}: ${data.error || data.message || data.reason}`);
console.log(data);
```

```
import os

import requests

r = requests.post(
    'https://www.helprange.com/public-api/file/124/link',
    headers={'Authorization': os.environ['HELPRANGE_API_KEY']},
    json={
        "label": "someLabel",
        "isAllowDownloadingAndPrint": True,
        "isOnlyOneUserViewing": False,
        "isForwardable": True,
        "isScreenshotMask": False,
        "isWatermark": False,
        "passcode": "abcd",
        "expirationDate": "2026-12-24",
        "viewsLimit": 10,
    },
    timeout=60,
)
r.raise_for_status()
print(r.json())
```

The samples read the key from the `HELPRANGE_API_KEY` environment variable.

## Responses

| Status | Description |
|---|---|
| `200` | OK |
| `400` | Invalid input – the message says which parameter. |
| `401` | Missing or invalid API key / OAuth token. Team keys: code invalid_key, key_revoked, key_expired or key_owner_removed. |
| `402` | Your plan does not include the REST API (the Free plan) or this feature (e.g. NDA needs Max). |
| `403` | v1: the key is invalid, or the folder / file / guest / data room is not yours (HTML page unless you send Accept: application/json). Team keys (v1 and v2): code insufficient_scope with required_scope – the key lacks the scope this endpoint needs. |
| `404` | Not found. |
| `409` | The data room is frozen, the signed PDF is not ready yet, (webhooks) the team already has an endpoint / the endpoint is turned off, or (code idempotency_key_in_progress) a request with the same Idempotency-Key is still running – retry in a few seconds. |
| `422` | code idempotency_key_reused: this Idempotency-Key was already used in the last 24 hours with a different request (method, path or body). Use a new key for a new request. |
| `429` | A usage limit was reached – wait Retry-After seconds. |

Example response · 200

```
{
  "id": 261,
  "link": "/view/8956d1e7b91b47e1a67a8040b1d4894f"
}
```

## Try it

**Uses your real account.** The request goes from your browser straight to `www.helprange.com` with your API key and acts as you – this POST **changes data**. The key stays in this page (in this tab's session storage only if you tick the box), is never put in a URL and is not sent to analytics. Do not paste a key on a shared computer.
 API key

  Remember in this tab

file_id (path, required)  JSON body { "label": "someLabel", "isAllowDownloadingAndPrint": true, "isOnlyOneUserViewing": false, "isForwardable": true, "isScreenshotMask": false, "isWatermark": false, "passcode": "abcd", "expirationDate": "2026-12-24", "viewsLimit": 10 }

```

```
