Create a digital product
/digital_productsCosts 2 rate-limit points · Rate limits
Make a Shopify product or one of its variants a digital product, as the Products page's Add does: give shopify_product_id (whole product) or shopify_variant_id (one variant; add shopify_product_id too unless Filemonk already knows the variant), the files to deliver as files: [{id, folder}], and optionally delivery.message, delivery.attach_to_every_order, preorder {enabled, launch_at, email {subject, heading, description}} (enabling a pre-order needs launch_at and delivery.message) and update_email {subject, body}.
preorder.enabled: true needs preorder.launch_at at least two hours ahead and a delivery.message (422 naming the missing field otherwise). 404 when Shopify has no such product or variant in this store. 409 when the product or variant already is a digital product (PATCH it instead). Buyers of existing orders are not emailed; use POST /digital_products/:id/notify_buyers.
Also searched asadd digital productattach files to a productmake this product digitalset up delivery for a variantnew digital product
Request body
shopify_product_idstringExample:gid://shopify/Product/9642107044135shopify_variant_idanyfilesarray of objectsShow 2 child attributesHide child attributes
idstringExample:e2b7727e-45ad-42b7-b842-cc4615205b10folderstringExample:Extras
deliveryobjectShow 2 child attributesHide child attributes
messagestringExample:Thanks for your order! Your files are below.attach_to_every_orderbooleanExample:false
preorderanyupdate_emailany
Errors
Missing or invalid API key.
The resource does not exist for this shop, or the action path is not registered.
The request conflicts with the current state (an order Shopify is not ready to fulfil, a digital product that already exists). Nothing was changed; read the message, don't retry blindly.
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 POST "https://app.filemonk.io/api/v2/external/digital_products" \
-H "X-Auth-Token: $FILEMONK_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"shopify_product_id": "gid://shopify/Product/9642107044135",
"files": [
{
"id": "e2b7727e-45ad-42b7-b842-cc4615205b10",
"folder": "Extras"
}
],
"delivery": {
"message": "Thanks for your order! Your files are below.",
"attach_to_every_order": false
}
}'const res = await fetch("https://app.filemonk.io/api/v2/external/digital_products", {
method: "POST",
headers: {
"X-Auth-Token": process.env.FILEMONK_API_KEY,
"Content-Type": "application/json",
},
body: JSON.stringify({
"shopify_product_id": "gid://shopify/Product/9642107044135",
"files": [
{
"id": "e2b7727e-45ad-42b7-b842-cc4615205b10",
"folder": "Extras"
}
],
"delivery": {
"message": "Thanks for your order! Your files are below.",
"attach_to_every_order": false
}
}),
});
const data = await res.json();import os
import requests
res = requests.post(
"https://app.filemonk.io/api/v2/external/digital_products",
headers={"X-Auth-Token": os.environ["FILEMONK_API_KEY"]},
json={
"shopify_product_id": "gid://shopify/Product/9642107044135",
"files": [
{
"id": "e2b7727e-45ad-42b7-b842-cc4615205b10",
"folder": "Extras"
}
],
"delivery": {
"message": "Thanks for your order! Your files are below.",
"attach_to_every_order": False
}
},
)
data = res.json()require "net/http"
require "json"
uri = URI("https://app.filemonk.io/api/v2/external/digital_products")
req = Net::HTTP::Post.new(uri, "X-Auth-Token" => ENV["FILEMONK_API_KEY"], "Content-Type" => "application/json")
req.body = {
shopify_product_id: "gid://shopify/Product/9642107044135",
files: [
{
id: "e2b7727e-45ad-42b7-b842-cc4615205b10",
folder: "Extras"
}
],
delivery: {
message: "Thanks for your order! Your files are below.",
attach_to_every_order: false
}
}.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"
}{
"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": [
"This product already has a digital product"
]
}{
"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)."
}curl -X POST "https://app.filemonk.io/api/v2/external/digital_products" \
-H "X-Auth-Token: $FILEMONK_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"shopify_product_id": "gid://shopify/Product/9642107207975",
"shopify_variant_id": "gid://shopify/ProductVariant/49417715843367",
"files": [
{
"id": "e2b7727e-45ad-42b7-b842-cc4615205b10"
}
]
}'const res = await fetch("https://app.filemonk.io/api/v2/external/digital_products", {
method: "POST",
headers: {
"X-Auth-Token": process.env.FILEMONK_API_KEY,
"Content-Type": "application/json",
},
body: JSON.stringify({
"shopify_product_id": "gid://shopify/Product/9642107207975",
"shopify_variant_id": "gid://shopify/ProductVariant/49417715843367",
"files": [
{
"id": "e2b7727e-45ad-42b7-b842-cc4615205b10"
}
]
}),
});
const data = await res.json();import os
import requests
res = requests.post(
"https://app.filemonk.io/api/v2/external/digital_products",
headers={"X-Auth-Token": os.environ["FILEMONK_API_KEY"]},
json={
"shopify_product_id": "gid://shopify/Product/9642107207975",
"shopify_variant_id": "gid://shopify/ProductVariant/49417715843367",
"files": [
{
"id": "e2b7727e-45ad-42b7-b842-cc4615205b10"
}
]
},
)
data = res.json()require "net/http"
require "json"
uri = URI("https://app.filemonk.io/api/v2/external/digital_products")
req = Net::HTTP::Post.new(uri, "X-Auth-Token" => ENV["FILEMONK_API_KEY"], "Content-Type" => "application/json")
req.body = {
shopify_product_id: "gid://shopify/Product/9642107207975",
shopify_variant_id: "gid://shopify/ProductVariant/49417715843367",
files: [
{
id: "e2b7727e-45ad-42b7-b842-cc4615205b10"
}
]
}.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": "variant",
"shopify_product_id": "gid://shopify/Product/9642107207975",
"shopify_variant_id": "gid://shopify/ProductVariant/49417715843367",
"title": "Watercolour Course",
"variant_title": "xs / blue / water",
"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": 0,
"created_at": "2025-05-31T13:37:52Z",
"updated_at": "2025-05-31T13:37:52Z"
}{
"id": "7ea3c05d-6f29-42b6-b24f-43260caeaa32",
"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": 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": 0,
"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": [
"This product already has a digital product"
]
}{
"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)."
}launch_at must be at least two hours ahead, and a pre-order needs delivery.message.
curl -X POST "https://app.filemonk.io/api/v2/external/digital_products" \
-H "X-Auth-Token: $FILEMONK_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"shopify_product_id": "gid://shopify/Product/9642107044135",
"files": [
{
"id": "e2b7727e-45ad-42b7-b842-cc4615205b10"
}
],
"delivery": {
"message": "Thanks for pre-ordering! Your files arrive on launch day."
},
"preorder": {
"enabled": true,
"launch_at": "2026-12-01T09:00:00Z"
}
}'const res = await fetch("https://app.filemonk.io/api/v2/external/digital_products", {
method: "POST",
headers: {
"X-Auth-Token": process.env.FILEMONK_API_KEY,
"Content-Type": "application/json",
},
body: JSON.stringify({
"shopify_product_id": "gid://shopify/Product/9642107044135",
"files": [
{
"id": "e2b7727e-45ad-42b7-b842-cc4615205b10"
}
],
"delivery": {
"message": "Thanks for pre-ordering! Your files arrive on launch day."
},
"preorder": {
"enabled": true,
"launch_at": "2026-12-01T09:00:00Z"
}
}),
});
const data = await res.json();import os
import requests
res = requests.post(
"https://app.filemonk.io/api/v2/external/digital_products",
headers={"X-Auth-Token": os.environ["FILEMONK_API_KEY"]},
json={
"shopify_product_id": "gid://shopify/Product/9642107044135",
"files": [
{
"id": "e2b7727e-45ad-42b7-b842-cc4615205b10"
}
],
"delivery": {
"message": "Thanks for pre-ordering! Your files arrive on launch day."
},
"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")
req = Net::HTTP::Post.new(uri, "X-Auth-Token" => ENV["FILEMONK_API_KEY"], "Content-Type" => "application/json")
req.body = {
shopify_product_id: "gid://shopify/Product/9642107044135",
files: [
{
id: "e2b7727e-45ad-42b7-b842-cc4615205b10"
}
],
delivery: {
message: "Thanks for pre-ordering! Your files arrive on launch day."
},
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": "Thanks for pre-ordering! Your files arrive on launch day.",
"attach_to_every_order": false
},
"preorder": {
"enabled": true,
"launch_at": "2026-12-01T09:00:00Z",
"released": false,
"email": {
"subject": null,
"heading": null,
"description": null
}
},
"update_email": {
"subject": null,
"body": null
},
"orders_count": 0,
"created_at": "2025-05-31T13:37:52Z",
"updated_at": "2025-05-31T13:37:52Z"
}{
"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": "Thanks for pre-ordering! Your files arrive on launch day.",
"attach_to_every_order": false
},
"preorder": {
"enabled": true,
"launch_at": "2026-12-01T09:00:00Z",
"released": false,
"email": {
"subject": null,
"heading": null,
"description": null
}
},
"update_email": {
"subject": null,
"body": null
},
"orders_count": 0,
"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": [
"This product already has a digital product"
]
}{
"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)."
}