---
title: "Update a file"
description: "Change a link's or licence key's name, a link's url, watermark.enabled or licence_keys (autogenerate, tags), as the Files page's edit does. Deep partial: only the fields sent change. A stored file's name is its filename:"
url: https://docs.filemonk.io/v2/api-reference/assets/update-a-file/
api: "API v2 reference"
method: PATCH
path: "/assets/{id}"
---

# Update a file

`PATCH https://app.filemonk.io/api/v2/external/assets/{id}`

Change a link's or licence key's name, a link's url, watermark.enabled or licence_keys (autogenerate, tags), as the Files page's edit does. Deep partial: only the fields sent change. A stored file's name is its filename: rename it by replacing the file with [`POST /assets/:id/replace`](https://docs.filemonk.io/v2/api-reference/assets/replace-a-file/).

**Note:** Fields that don't apply to the file's type (url on a stored file or licence key, watermark on a link, licence_keys on anything but a licence key) are a 422. Like the Files page, an edit does not re-stamp copies already watermarked for past orders; replacing the file does.

## Path parameters

- `id` (string, required)

## Request body

- `name` (string): e.g. `Beginner's Guide (2026 edition)`
- `url` (any)
- `watermark` (object)
  - `enabled` (boolean): e.g. `true`
- `licence_keys` (any)

## Returns

The [asset object](https://docs.filemonk.io/v2/api-reference/assets/).

Rate limit: this call costs 2 points ([rate limits](https://docs.filemonk.io/v2/errors-and-rate-limits/)).

## Example request

```sh
curl -X PATCH "https://app.filemonk.io/api/v2/external/assets/e2b7727e-45ad-42b7-b842-cc4615205b10" \
  -H "X-Auth-Token: $FILEMONK_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "Beginner'\''s Guide (2026 edition)",
    "watermark": {
      "enabled": true
    }
  }'
```

## 200

Success: the write completed; the body is the updated resource.

```json
{
  "id": "e2b7727e-45ad-42b7-b842-cc4615205b10",
  "type": "link",
  "name": "Beginner's Guide (2026 edition)",
  "filename": "ebook-2026.zip",
  "extension": "zip",
  "content_type": "application/zip",
  "byte_size": 0,
  "url": "https://example.com/ebook-2026.zip",
  "url_expires_at": null,
  "watermark": {
    "enabled": true
  },
  "licence_keys": {
    "autogenerate": false,
    "tags": []
  },
  "usage": {
    "digital_products_count": 2,
    "orders_count": 0
  },
  "digital_products": [
    {
      "id": "f5f278c8-4a92-48a3-bc40-216468b9bccd",
      "scope": "variant",
      "shopify_product_id": "gid://shopify/Product/9642107207975",
      "shopify_variant_id": "gid://shopify/ProductVariant/49417715843367",
      "title": "Watercolour Course",
      "variant_title": "xs / blue / water",
      "sku": "ae8ea669-7bd1-4afd-b200-a7b75777b46a",
      "files_count": 2,
      "preorder": {
        "enabled": false
      },
      "delivery": {
        "attach_to_every_order": false
      },
      "exists_on_shopify": null,
      "updated_at": "2026-10-30T16:55:48Z",
      "folder": null
    },
    {
      "id": "4d08443e-549b-44c8-afee-c3836d767e7c",
      "scope": "product",
      "shopify_product_id": "gid://shopify/Product/9642103537959",
      "shopify_variant_id": null,
      "title": "The Draft Snowboard",
      "variant_title": null,
      "sku": null,
      "files_count": 2,
      "preorder": {
        "enabled": false
      },
      "delivery": {
        "attach_to_every_order": false
      },
      "exists_on_shopify": null,
      "updated_at": "2026-10-30T16:56:48Z",
      "folder": "Extras"
    }
  ],
  "recent_orders": [],
  "created_at": "2026-10-30T16:49:38Z",
  "updated_at": "2026-10-30T16:49:38Z"
}
```

## 401

Missing or invalid API key.

```json
{
  "errors": [
    "Invalid API key"
  ]
}
```

## 404

The resource does not exist for this shop, or the action path is not registered.

```json
{
  "errors": [
    "Order not found: c3d4e5f6-7a8b-4c9d-8e0f-1a2b3c4d5e6f"
  ]
}
```

## 422

The request failed validation, or sent a key the action does not take (`code: &quot;unknown_parameters&quot;` with `unknown` and `accepted`). Nothing was saved.

```json
{
  "errors": [
    "access.download_limit_count must be an integer of at least 0"
  ],
  "field_errors": {
    "access.download_limit_count": [
      "must be an integer of at least 0"
    ]
  }
}
```

## 429

Rate limited. Cost-weighted per API key, shared with API v1: a read costs 1 point, a write 2, 40 points per fixed 60-second window. Every response carries `X-RateLimit-Limit`, `X-RateLimit-Remaining` and `X-RateLimit-Reset` (Unix time the window ends); a 429 adds `Retry-After` (seconds), `retry_after`, `retryable: true` and a `next_step` in the body. A 429 did nothing: wait `retry_after` seconds, then send the same request again. The budget is per key, so every tool or script using the key shares it; prefer one list call with `per_page` over many single reads.

```json
{
  "errors": [
    "You have exceeded the rate limit of 40 points per 60 seconds. Read requests cost 1 point(s) and write requests cost 2 point(s). Please retry after 12 second(s)."
  ],
  "code": "rate_limited",
  "retry_after": 12,
  "error": "Rate limit exceeded",
  "message": "You have exceeded the rate limit of 40 points per 60 seconds. Read requests cost 1 point(s) and write requests cost 2 point(s). Please retry after 12 second(s)."
}
```

