Update a digital product
/digital_products/{id}Costs 2 rate-limit points · Rate limits
Change a digital product's files or settings, as the product page does. Deep partial: delivery.message, delivery.attach_to_every_order, preorder., update_email. change only when sent; files: [{id, folder}] replaces the whole file list and folders (add or remove single files with POST /digital_products/:id/files/attach and /detach instead). Enabling a pre-order needs preorder.launch_at and a delivery.message, sent now or already saved.
preorder.launch_at must be at least two hours ahead (422 naming the field otherwise). The Shopify product or variant cannot be changed; make a new digital product.
Also searched asedit digital productchange delivery messageenable pre-orderset launch datemove file into folderupdate the product's files
Path parameters
idstringRequired
Request body
filesanydeliveryobjectShow 1 child attributeHide child attributes
messagestringExample:Thanks for your order! Your files are below.
preorderobjectShow 2 child attributesHide child attributes
enabledbooleanExample:truelaunch_atstringExample:2026-12-01T09:00:00Z
update_emailany
Returns
Errors
Missing or invalid API key.
The resource does not exist for this shop, or the action path is not registered.
The request failed validation, or sent a key the action does not take (code: "unknown_parameters" with unknown and accepted). Nothing was saved.
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.
Every error has the same shape: see Errors.
curl -X PATCH "https://app.filemonk.io/api/v2/external/digital_products/7ea3c05d-6f29-42b6-b24f-43260caeaa32" \
-H "X-Auth-Token: $FILEMONK_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"delivery": {
"message": "Thanks for your order! Your files are below."
},
"preorder": {
"enabled": true,
"launch_at": "2026-12-01T09:00:00Z"
}
}'const res = await fetch("https://app.filemonk.io/api/v2/external/digital_products/7ea3c05d-6f29-42b6-b24f-43260caeaa32", {
method: "PATCH",
headers: {
"X-Auth-Token": process.env.FILEMONK_API_KEY,
"Content-Type": "application/json",
},
body: JSON.stringify({
"delivery": {
"message": "Thanks for your order! Your files are below."
},
"preorder": {
"enabled": true,
"launch_at": "2026-12-01T09:00:00Z"
}
}),
});
const data = await res.json();import os
import requests
res = requests.patch(
"https://app.filemonk.io/api/v2/external/digital_products/7ea3c05d-6f29-42b6-b24f-43260caeaa32",
headers={"X-Auth-Token": os.environ["FILEMONK_API_KEY"]},
json={
"delivery": {
"message": "Thanks for your order! Your files are below."
},
"preorder": {
"enabled": True,
"launch_at": "2026-12-01T09:00:00Z"
}
},
)
data = res.json()require "net/http"
require "json"
uri = URI("https://app.filemonk.io/api/v2/external/digital_products/7ea3c05d-6f29-42b6-b24f-43260caeaa32")
req = Net::HTTP::Patch.new(uri, "X-Auth-Token" => ENV["FILEMONK_API_KEY"], "Content-Type" => "application/json")
req.body = {
delivery: {
message: "Thanks for your order! Your files are below."
},
preorder: {
enabled: true,
launch_at: "2026-12-01T09:00:00Z"
}
}.to_json
res = Net::HTTP.start(uri.host, uri.port, use_ssl: true) { |http| http.request(req) }
data = JSON.parse(res.body){
"id": "7ea3c05d-6f29-42b6-b24f-43260caeaa32",
"scope": "product",
"shopify_product_id": "gid://shopify/Product/9642107044135",
"shopify_variant_id": null,
"title": "Watercolour Course",
"variant_title": null,
"sku": null,
"exists_on_shopify": null,
"files": [
{
"id": "7ea42f2a-6dbe-459c-b8a4-27b0eb823e52",
"name": "price-list.csv",
"type": "file",
"byte_size": 100634,
"folder": null
},
{
"id": "96fbe30b-c819-4cb8-9666-814c0c8853f1",
"name": "Beginner's Guide.pdf",
"type": "file",
"byte_size": 116711,
"folder": null
}
],
"folders": [],
"delivery": {
"message": null,
"attach_to_every_order": false
},
"preorder": {
"enabled": false,
"launch_at": null,
"released": true,
"email": {
"subject": null,
"heading": null,
"description": null
}
},
"update_email": {
"subject": null,
"body": null
},
"orders_count": 46,
"created_at": "2025-05-31T13:37:52Z",
"updated_at": "2025-05-31T13:37:52Z"
}{
"errors": [
"Invalid API key"
]
}{
"errors": [
"Order not found: c3d4e5f6-7a8b-4c9d-8e0f-1a2b3c4d5e6f"
]
}{
"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"
]
}
}{
"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)."
}