<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/">
    <channel>
        <title>FileSpin Developer Guides</title>
        <link>https://developers.filespin.io/guides/</link>
        <description>Practical guides and tutorials for working with FileSpin.</description>
        <lastBuildDate>Tue, 15 Sep 2026 00:00:00 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <language>en</language>
        <copyright>Copyright © 2026 FileSpin.io. All rights reserved.</copyright>
        <item>
            <title><![CDATA[Change Product Image Sizes Without Re-Exporting: A FileSpin Guide]]></title>
            <link>https://developers.filespin.io/guides/responsive-product-images/</link>
            <guid>https://developers.filespin.io/guides/responsive-product-images/</guid>
            <pubDate>Tue, 15 Sep 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[A new layout needs new image sizes. Use FileSpin URL parameters to deliver them from the assets you already have, without another batch of manual exports.]]></description>
            <content:encoded><![CDATA[<p>You already have the product photo in FileSpin. Now the storefront needs a larger thumbnail, the email needs a wide banner, and the partner feed needs a square image. Preparing a separate export for each one leaves you with another set of files to maintain when those requirements change.</p>
<p>Start with the photo you already have. This guide walks through copying its image link from the Dashboard, changing the size and crop in the URL, and checking the image FileSpin returns.</p>
<p>You will then add responsive image markup and check format negotiation, so your page can request an appropriate image for the screen. The guide also shows where to update your application or feed to use the new URLs.</p>
<p><strong>By the end:</strong> you will have working thumbnail, preview and email-image links from the same asset, plus a repeatable pattern for the rest of your catalogue.</p>
<p>For every parameter with more recipes (quality, effects, rotation, downloads), see the companion reference guide, <a class="" href="https://developers.filespin.io/guides/image-transformations/">On-Demand Image Transformations: A Practical Guide</a>.</p>
<p><em>Image sizes, crop examples and format negotiation last verified on 9 September 2026 using the public demo assets below.</em></p>
<blockquote>
<p><strong>The short version:</strong> upload and process the asset once, then request delivery variants through URL parameters. On-demand outputs generated from Standard Image Conversion do not consume storage quota; stored originals and Custom Image Conversions are separate. Different dimensions use different URLs; supported browser formats can be negotiated at the same URL.</p>
</blockquote>
<p><img decoding="async" loading="lazy" alt="One FileSpin asset supplies four delivery URLs through on-demand transformations and CDN delivery." src="https://developers.filespin.io/assets/images/odi-catalogue-workflow-8e351186d52726bc7f78adb53578f268.svg" width="900" height="380" class="img_ev3q"></p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="1-get-your-first-transformation-link">1. Get your first transformation link<a href="https://developers.filespin.io/guides/responsive-product-images/#1-get-your-first-transformation-link" class="hash-link" aria-label="Direct link to 1. Get your first transformation link" title="Direct link to 1. Get your first transformation link" translate="no">​</a></h2>
<p>Every URL in this guide is the same shape, and the Dashboard will hand you one
for your own asset. Start there rather than assembling a URL by hand.</p>
<ol>
<li class="">Open a processed product image in the FileSpin Dashboard.</li>
<li class="">Choose <strong>Get link / Embed</strong>.</li>
<li class="">Ignore <strong>Temporary download link (original file)</strong>. That link is signed,
expires in 24 hours and returns the original file — it is not a
transformation URL.</li>
<li class="">Under <strong>Permanent image links (resized)</strong>, pick a size. <strong>Small</strong>,
<strong>Medium</strong> and <strong>Large</strong> are 480×480, 1024×1024 and 2048×1536; <strong>Custom</strong>
takes your own width and height.</li>
<li class="">Leave <strong>Format</strong> on <strong>Auto (best for each browser)</strong> for now. Section 4
explains what that setting does and when to override it.</li>
<li class="">Press <strong>Copy link</strong>.</li>
</ol>
<p>You now have a working URL that looks like this:</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">https://&lt;your-cdn-host&gt;/api/v1/assets/&lt;your-asset-id&gt;/conversions?resize=480,480</span><br></span></code></pre></div></div>
<p>That one link contains both things the rest of the guide needs:</p>
<table><thead><tr><th>Part of the link</th><th>What it is</th><th>Where it comes from</th></tr></thead><tbody><tr><td><code>https://&lt;your-cdn-host&gt;</code></td><td>Your account's CDN host</td><td>Your account, including a custom enterprise CDN host where one is configured</td></tr><tr><td><code>/api/v1/assets/&lt;your-asset-id&gt;/conversions</code></td><td>The asset and its transformation endpoint</td><td>Fixed for that asset — you never change this part</td></tr><tr><td><code>?resize=480,480</code></td><td>The instruction</td><td>The only part you edit from here on</td></tr></tbody></table>
<p>Everything after the question mark is what the following sections change. The
asset ID and host stay exactly as the Dashboard gave them to you.</p>
<p>The dialog also offers <strong>Copy <code>&lt;img&gt;</code> code</strong> if you would rather start from a
complete tag.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="following-along-with-the-demo-assets">Following along with the demo assets<a href="https://developers.filespin.io/guides/responsive-product-images/#following-along-with-the-demo-assets" class="hash-link" aria-label="Direct link to Following along with the demo assets" title="Direct link to Following along with the demo assets" translate="no">​</a></h3>
<p>The examples below use FileSpin's public demo photos on <code>cdn.filespin.io</code>, so
you can open every link as written before touching your own catalogue: a
landscape photo, <code>2e1bc0f4159343779b82923e951a9256</code>, for sizing, and a
portrait, <code>3632004ce6214137b188e40e1c00af32</code>, for the crop comparison. When you
apply the pattern for real, substitute the host and asset ID from your own
copied link.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="two-conditions-to-check-first">Two conditions to check first<a href="https://developers.filespin.io/guides/responsive-product-images/#two-conditions-to-check-first" class="hash-link" aria-label="Direct link to Two conditions to check first" title="Direct link to Two conditions to check first" translate="no">​</a></h3>
<p>The image must finish processing before its normal ODI output is available. The
<a class="" href="https://developers.filespin.io/image-transformations/">ODI overview</a> explains
the <code>ON_DEMAND_IMAGE</code> entry in <code>addons_info</code>. An image requested immediately
after upload can temporarily return a low-resolution preview; allow processing
to finish before assessing quality.</p>
<p>These examples use public delivery URLs. ODI URLs are always public. If a
custom conversion is private, the dialog offers no permanent link and points
you to the <strong>Public</strong> switch in the <strong>Formats</strong> tab instead; a private
conversion needs an <a class="" href="https://developers.filespin.io/image-transformations/standard-odi-copy/#using-non-public-custom-image-conversion">API key or JWT</a>.
Do not place an API key in browser code or a public image URL.</p>
<p>FileSpin normally renders ODI from its prepared Standard Image Conversion, so
you do not need to export every requested delivery size yourself. Custom Image
Conversions are a separate option: they are prepared and stored according to
your account settings.</p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="2-request-the-sizes-your-channels-need">2. Request the sizes your channels need<a href="https://developers.filespin.io/guides/responsive-product-images/#2-request-the-sizes-your-channels-need" class="hash-link" aria-label="Direct link to 2. Request the sizes your channels need" title="Direct link to 2. Request the sizes your channels need" translate="no">​</a></h2>
<p>The Dashboard gave you one size. Your placements need several, and each is the
same link with a different instruction after the question mark. Start with this
<a href="https://cdn.filespin.io/api/v1/assets/2e1bc0f4159343779b82923e951a9256/conversions?resize=300,300" target="_blank" rel="noopener noreferrer" class="">working demo image</a>:</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">https://cdn.filespin.io/api/v1/assets/2e1bc0f4159343779b82923e951a9256/conversions?resize=300,300</span><br></span></code></pre></div></div>
<p><code>resize=300,300</code> fits the image inside a 300-by-300-pixel box while preserving its proportions. It does not necessarily return a square. The demo source is 4:3, and this request returns 300×225 pixels.</p>
<p>To try another output, keep the asset path and replace the text after <code>?</code> with one of the parameter sets below. Use <code>&amp;</code> between additional options.</p>
<p>Choose the transformation according to the layout:</p>
<table><thead><tr><th>Placement in this example</th><th>Parameters</th><th>Intended result</th></tr></thead><tbody><tr><td>Storefront product card</td><td><code>resize=300,300,fill:white</code></td><td>Fit the whole product into a square with white padding</td></tr><tr><td>Mobile app preview</td><td><code>resize=600,600</code></td><td>Fit inside a larger box without cropping</td></tr><tr><td>Email hero</td><td><code>crop=960,480,center&amp;format=jpg</code></td><td>A wide crop with an explicit JPEG format</td></tr><tr><td>Partner feed image</td><td><code>resize=720,720,fill:white&amp;format=jpg</code></td><td>A padded product image in the agreed format</td></tr></tbody></table>
<p>These are example delivery requirements, not specifications for every app, email client or marketplace. Confirm the receiving system's requirements before choosing its output.</p>
<p><a href="https://cdn.filespin.io/api/v1/assets/2e1bc0f4159343779b82923e951a9256/conversions?resize=300,300,fill:white" target="_blank" rel="noopener noreferrer" class="">Open the padded card</a>, <a href="https://cdn.filespin.io/api/v1/assets/2e1bc0f4159343779b82923e951a9256/conversions?resize=600,600" target="_blank" rel="noopener noreferrer" class="">app preview</a>, <a href="https://cdn.filespin.io/api/v1/assets/2e1bc0f4159343779b82923e951a9256/conversions?crop=960,480,center&amp;format=jpg" target="_blank" rel="noopener noreferrer" class="">email crop</a> or <a href="https://cdn.filespin.io/api/v1/assets/2e1bc0f4159343779b82923e951a9256/conversions?resize=720,720,fill:white&amp;format=jpg" target="_blank" rel="noopener noreferrer" class="">partner image</a>.</p>
<p>The four requests were checked on the public demo asset: the outputs are 300×300, 600×450, 960×480 and 720×720 pixels respectively. All four requests use the same asset ID. If the storefront needs a larger card later, update the URL rule that constructs its image links; the existing asset can supply the new size.</p>
<p>For the complete syntax, see <a class="" href="https://developers.filespin.io/image-transformations/resize/">Resize</a>, <a class="" href="https://developers.filespin.io/image-transformations/crop/">Crop</a> and <a class="" href="https://developers.filespin.io/image-transformations/format/">Format</a>.</p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="3-make-the-storefront-responsive">3. Make the storefront responsive<a href="https://developers.filespin.io/guides/responsive-product-images/#3-make-the-storefront-responsive" class="hash-link" aria-label="Direct link to 3. Make the storefront responsive" title="Direct link to 3. Make the storefront responsive" translate="no">​</a></h2>
<p>Keep placement sizes in a shared image component or feed configuration. When a placement changes, update that rule and deploy it through your normal application or CMS workflow. The stored asset can remain the same.</p>
<p>For a website, the browser also needs to know which image sizes are available. ODI supplies the images; HTML supplies the selection hints.</p>
<p>This example assumes a product card displayed at 300 CSS pixels on larger screens and nearly the viewport width on screens up to 600 pixels wide. The 300, 600 and 720-pixel crops provide candidates for different display densities. Use a source large enough for the largest candidate.</p>
<div class="language-html codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-html codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">img</span><span class="token tag" style="color:#00009f"></span><br></span><span class="token-line" style="color:#393A34"><span class="token tag" style="color:#00009f">  </span><span class="token tag attr-name" style="color:#00a4db">src</span><span class="token tag attr-value punctuation attr-equals" style="color:#393A34">=</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag attr-value" style="color:#e3116c">https://cdn.filespin.io/api/v1/assets/2e1bc0f4159343779b82923e951a9256/conversions?crop=300,300,center</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag" style="color:#00009f"></span><br></span><span class="token-line" style="color:#393A34"><span class="token tag" style="color:#00009f">  </span><span class="token tag attr-name" style="color:#00a4db">srcset</span><span class="token tag attr-value punctuation attr-equals" style="color:#393A34">=</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag attr-value" style="color:#e3116c"></span><br></span><span class="token-line" style="color:#393A34"><span class="token tag attr-value" style="color:#e3116c">    https://cdn.filespin.io/api/v1/assets/2e1bc0f4159343779b82923e951a9256/conversions?crop=300,300,center 300w,</span><br></span><span class="token-line" style="color:#393A34"><span class="token tag attr-value" style="color:#e3116c">    https://cdn.filespin.io/api/v1/assets/2e1bc0f4159343779b82923e951a9256/conversions?crop=600,600,center 600w,</span><br></span><span class="token-line" style="color:#393A34"><span class="token tag attr-value" style="color:#e3116c">    https://cdn.filespin.io/api/v1/assets/2e1bc0f4159343779b82923e951a9256/conversions?crop=720,720,center 720w</span><br></span><span class="token-line" style="color:#393A34"><span class="token tag attr-value" style="color:#e3116c">  </span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag" style="color:#00009f"></span><br></span><span class="token-line" style="color:#393A34"><span class="token tag" style="color:#00009f">  </span><span class="token tag attr-name" style="color:#00a4db">sizes</span><span class="token tag attr-value punctuation attr-equals" style="color:#393A34">=</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag attr-value" style="color:#e3116c">(max-width: 600px) calc(100vw - 32px), 300px</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag" style="color:#00009f"></span><br></span><span class="token-line" style="color:#393A34"><span class="token tag" style="color:#00009f">  </span><span class="token tag attr-name" style="color:#00a4db">width</span><span class="token tag attr-value punctuation attr-equals" style="color:#393A34">=</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag attr-value" style="color:#e3116c">300</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag" style="color:#00009f"></span><br></span><span class="token-line" style="color:#393A34"><span class="token tag" style="color:#00009f">  </span><span class="token tag attr-name" style="color:#00a4db">height</span><span class="token tag attr-value punctuation attr-equals" style="color:#393A34">=</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag attr-value" style="color:#e3116c">300</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag" style="color:#00009f"></span><br></span><span class="token-line" style="color:#393A34"><span class="token tag" style="color:#00009f">  </span><span class="token tag special-attr attr-name" style="color:#00a4db">style</span><span class="token tag special-attr attr-value punctuation attr-equals" style="color:#393A34">=</span><span class="token tag special-attr attr-value punctuation" style="color:#393A34">"</span><span class="token tag special-attr attr-value value css language-css property" style="color:#36acaa">display</span><span class="token tag special-attr attr-value value css language-css punctuation" style="color:#393A34">:</span><span class="token tag special-attr attr-value value css language-css" style="color:#e3116c"> block</span><span class="token tag special-attr attr-value value css language-css punctuation" style="color:#393A34">;</span><span class="token tag special-attr attr-value value css language-css" style="color:#e3116c"> </span><span class="token tag special-attr attr-value value css language-css property" style="color:#36acaa">width</span><span class="token tag special-attr attr-value value css language-css punctuation" style="color:#393A34">:</span><span class="token tag special-attr attr-value value css language-css" style="color:#e3116c"> </span><span class="token tag special-attr attr-value value css language-css number" style="color:#36acaa">100</span><span class="token tag special-attr attr-value value css language-css unit" style="color:#e3116c">%</span><span class="token tag special-attr attr-value value css language-css punctuation" style="color:#393A34">;</span><span class="token tag special-attr attr-value value css language-css" style="color:#e3116c"> </span><span class="token tag special-attr attr-value value css language-css property" style="color:#36acaa">max-width</span><span class="token tag special-attr attr-value value css language-css punctuation" style="color:#393A34">:</span><span class="token tag special-attr attr-value value css language-css" style="color:#e3116c"> </span><span class="token tag special-attr attr-value value css language-css number" style="color:#36acaa">100</span><span class="token tag special-attr attr-value value css language-css unit" style="color:#e3116c">%</span><span class="token tag special-attr attr-value value css language-css punctuation" style="color:#393A34">;</span><span class="token tag special-attr attr-value value css language-css" style="color:#e3116c"> </span><span class="token tag special-attr attr-value value css language-css property" style="color:#36acaa">height</span><span class="token tag special-attr attr-value value css language-css punctuation" style="color:#393A34">:</span><span class="token tag special-attr attr-value value css language-css" style="color:#e3116c"> auto</span><span class="token tag special-attr attr-value value css language-css punctuation" style="color:#393A34">;</span><span class="token tag special-attr attr-value punctuation" style="color:#393A34">"</span><span class="token tag" style="color:#00009f"></span><br></span><span class="token-line" style="color:#393A34"><span class="token tag" style="color:#00009f">  </span><span class="token tag attr-name" style="color:#00a4db">alt</span><span class="token tag attr-value punctuation attr-equals" style="color:#393A34">=</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag attr-value" style="color:#e3116c">Demo photograph of a woman wearing a white top</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag" style="color:#00009f"></span><br></span><span class="token-line" style="color:#393A34"><span class="token tag" style="color:#00009f"></span><span class="token tag punctuation" style="color:#393A34">/&gt;</span><br></span></code></pre></div></div>
<p>This example crops because the demo is a lifestyle photo. For product cut-outs where the whole item must stay visible, use padding instead: <code>resize=300,300,fill:white</code>, and the same for the 600 and 720 candidates.</p>
<p>Match <code>sizes</code> to your actual layout and replace the example alt text with a useful description of the product. The <code>w</code> descriptors must match the returned image widths. Check those widths if the source is small or delivery constraints apply.</p>
<p>The browser uses <code>srcset</code> and <code>sizes</code> to choose a candidate. The asset endpoint does not discover your CSS layout and choose a new width on its own. See the <a href="https://developer.mozilla.org/en-US/docs/Web/HTML/Reference/Elements/img" target="_blank" rel="noopener noreferrer" class="">HTML image element reference</a> for how these attributes work.</p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="4-allow-browser-format-negotiation">4. Allow browser format negotiation<a href="https://developers.filespin.io/guides/responsive-product-images/#4-allow-browser-format-negotiation" class="hash-link" aria-label="Direct link to 4. Allow browser format negotiation" title="Direct link to 4. Allow browser format negotiation" translate="no">​</a></h2>
<p>The responsive example deliberately omits <code>format</code>. For supported browser requests, FileSpin can choose AVIF or WebP using the <code>Accept</code> request header. AVIF delivery must be enabled in the serving environment. For ordinary JPEG delivery, the fallback is JPEG; PNG sources retain a transparency-capable fallback.</p>
<p>For the 300×300 demo URL above, live requests returned <code>image/avif</code> when AVIF and WebP were offered, <code>image/webp</code> when WebP was offered, and <code>image/jpeg</code> when JPEG was requested. All three returned 300×300 pixels. The output format changed while the URL and pixel dimensions stayed the same.</p>
<p>This is the part that works at the same URL. You do not need separate AVIF, WebP and JPEG URLs in your markup just to negotiate formats. You still need the size-selection markup from the previous section.</p>
<p>To check delivery, open your browser's Network panel, reload the image and inspect:</p>
<ol>
<li class="">The image request's <code>Accept</code> header.</li>
<li class="">The response's <code>Content-Type</code>, such as <code>image/avif</code>, <code>image/webp</code> or <code>image/jpeg</code>.</li>
<li class="">The rendered dimensions and transferred bytes.</li>
</ol>
<p>The extensionless URL alone does not tell you the returned format. When a downstream system needs a fixed format, specify it explicitly:</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">https://cdn.filespin.io/api/v1/assets/2e1bc0f4159343779b82923e951a9256/conversions?crop=960,480,center&amp;format=jpg</span><br></span></code></pre></div></div>
<p>Use an agreed format for email and partner feeds, then test it in the receiving systems. FileSpin's Campaign Link Builder also specifies JPEG for its default email-hero placement. That choice avoids depending on browser-style format negotiation in an email workflow.</p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="5-choose-crops-deliberately">5. Choose crops deliberately<a href="https://developers.filespin.io/guides/responsive-product-images/#5-choose-crops-deliberately" class="hash-link" aria-label="Direct link to 5. Choose crops deliberately" title="Direct link to 5. Choose crops deliberately" translate="no">​</a></h2>
<p>A portrait does not automatically make a good wide banner. Use the second public demo photo to compare two 600×300 crops:</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">https://cdn.filespin.io/api/v1/assets/3632004ce6214137b188e40e1c00af32/conversions?crop=600,300,center&amp;format=jpg</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">https://cdn.filespin.io/api/v1/assets/3632004ce6214137b188e40e1c00af32/conversions?crop=600,300,face&amp;format=jpg</span><br></span></code></pre></div></div>
<table><thead><tr><th>Centre crop</th><th>Face-aware crop</th></tr></thead><tbody><tr><td><img decoding="async" loading="lazy" src="https://cdn.filespin.io/api/v1/assets/3632004ce6214137b188e40e1c00af32/conversions?crop=600,300,center&amp;format=jpg" alt="Centre crop of the demo portrait, with the upper part of the face outside the frame." class="img_ev3q"></td><td><img decoding="async" loading="lazy" src="https://cdn.filespin.io/api/v1/assets/3632004ce6214137b188e40e1c00af32/conversions?crop=600,300,face&amp;format=jpg" alt="Face-aware crop of the same portrait, repositioned to keep the face in frame." class="img_ev3q"></td></tr></tbody></table>
<p><a href="https://cdn.filespin.io/api/v1/assets/3632004ce6214137b188e40e1c00af32/conversions?crop=600,300,center&amp;format=jpg" target="_blank" rel="noopener noreferrer" class="">Open the centre crop</a> or <a href="https://cdn.filespin.io/api/v1/assets/3632004ce6214137b188e40e1c00af32/conversions?crop=600,300,face&amp;format=jpg" target="_blank" rel="noopener noreferrer" class="">face-aware crop</a> to inspect the full output.</p>
<p>Both images are actual FileSpin outputs at 600×300 pixels. In this example, the centre crop cuts through the upper part of the face. The explicit <code>face</code> option shifts the crop upward to keep the face in frame. Only the alignment parameter changes.</p>
<p>Review both outputs. Smart cropping is useful when the person is away from the centre, but it cannot guarantee that every face, garment detail or brand mark stays visible. For product cutouts where the whole object matters, use proportional resizing with padding. For art-directed photography, choose an explicit alignment or crop region and inspect the result.</p>
<p>The Campaign Link Builder applies this same idea to selected channel placements: it constructs image URLs with placement dimensions and tracking parameters. Keep its output tied to the receiving channel's needs, and inspect tall crops rather than assuming a preset guarantees the final resolution.</p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="6-check-delivery-before-expanding">6. Check delivery before expanding<a href="https://developers.filespin.io/guides/responsive-product-images/#6-check-delivery-before-expanding" class="hash-link" aria-label="Direct link to 6. Check delivery before expanding" title="Direct link to 6. Check delivery before expanding" translate="no">​</a></h2>
<p>The published ODI overview describes a standard delivery envelope of <strong>2048 pixels wide by 1536 pixels high</strong>, with 72 PPI metadata. Keep this walkthrough inside that envelope. The Dashboard's own <strong>Custom</strong> size clamps to those bounds before it builds a link, which is a useful confirmation of where the ceiling sits.</p>
<p><strong>A URL accepting your dimensions is not proof of the resulting resolution.</strong> The source matters as much as the ceiling. Requesting <code>resize=3000,3000</code> from the landscape demo asset returns HTTP 200 and a perfectly good image — at 1024×768, because <code>resize</code> fits within bounds and does not upscale, and that is the largest output this asset has to give. Nothing in the response announces the difference. Check the pixel dimensions you actually received, especially for your largest placement.</p>
<p>Pixel dimensions determine how much image detail you have for a screen. Changing the quality parameter does not turn a standard ODI output into an archival master or a print export. Use the original or an appropriately configured conversion when you need that output.</p>
<p>For a catalogue rollout:</p>
<table><thead><tr><th>Check</th><th>What to verify</th></tr></thead><tbody><tr><td>Framing</td><td>Landscape photos, portraits, transparent cutouts and group shots work in the intended placements</td></tr><tr><td>Dimensions</td><td>Actual output widths match your HTML descriptors and receiving-system requirements</td></tr><tr><td>Formats</td><td>Browser negotiation works on your CDN host; fixed-format outputs work in email and feeds</td></tr><tr><td>Access</td><td>Public and private conversion settings produce the access behaviour you intend</td></tr><tr><td>Performance</td><td>Measure both first requests and repeat requests on representative assets</td></tr><tr><td>Integration</td><td>The deployed component or feed uses the new URLs and can be rolled back</td></tr></tbody></table>
<p>On-demand outputs generated from Standard Image Conversion do not consume storage quota. Stored originals and Custom Image Conversions are separate, and processing and delivery remain subject to your account's terms — none of this makes the pipeline free. Assess your account's usage and commercial terms separately. A useful pilot measures image bytes, request performance and the work required to change a placement, rather than assuming a universal savings percentage.</p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="best-practices">Best practices<a href="https://developers.filespin.io/guides/responsive-product-images/#best-practices" class="hash-link" aria-label="Direct link to Best practices" title="Direct link to Best practices" translate="no">​</a></h2>
<p>Keep your size and crop rules in one shared place. Use a bounded set of sizes so every small layout change does not create another delivery variant. Preserve the whole product where its details matter, and use explicit smart cropping for suitable lifestyle photos.</p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="next-steps">Next steps<a href="https://developers.filespin.io/guides/responsive-product-images/#next-steps" class="hash-link" aria-label="Direct link to Next steps" title="Direct link to Next steps" translate="no">​</a></h2>
<p>Choose one product category and connect its card, detail view and email image to the same FileSpin assets. Check the outputs, then change one placement size through the shared URL rule. That is a small, repeatable test of ODI's value in your own catalogue.</p>
<ul>
<li class=""><a class="" href="https://developers.filespin.io/image-transformations/">ODI overview and limitations</a></li>
<li class=""><a class="" href="https://developers.filespin.io/image-transformations/resize/">Resize and padding</a></li>
<li class=""><a class="" href="https://developers.filespin.io/image-transformations/crop/">Crop alignment</a></li>
<li class=""><a class="" href="https://developers.filespin.io/guides/image-transformations/">On-Demand Image Transformations: A Practical Guide</a>: every parameter, with recipes</li>
<li class=""><a class="" href="https://developers.filespin.io/guides/workflow-engines/">Build repeatable workflows</a></li>
</ul>]]></content:encoded>
            <category>images</category>
            <category>transformations</category>
            <category>cdn</category>
            <category>odi</category>
        </item>
        <item>
            <title><![CDATA[Automating Addons with Event Hooks and Schema Criteria]]></title>
            <link>https://developers.filespin.io/guides/automating-addons/</link>
            <guid>https://developers.filespin.io/guides/automating-addons/</guid>
            <pubDate>Wed, 29 Apr 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[Configure Face Recognition, Image Analysis, and Remove Background to run automatically based on asset events and custom metadata — set up entirely from the Dashboard.]]></description>
            <content:encoded><![CDATA[<p>Configure Face Recognition, Image Analysis, and Remove Background to run automatically based on asset events and custom metadata — set up entirely from the Dashboard.</p>
<p>If your team uploads thousands of images a week, processing each one through an AI addon by hand gets old fast. You either remember to run Face Recognition on every batch, or you accept that auto-tagging only happens for assets someone thought to process. Neither scales.</p>
<p>FileSpin's Automated Media Pipeline solves this. You configure each addon once in the Dashboard — which events to listen to, which content types qualify, which custom metadata patterns to match — and the platform runs the addon for you whenever an asset event fires. Upload a portrait, Face Recognition runs. Tag a product photo as an original, Remove Background fires and saves a transparent PNG. Edit metadata on a stock image, Image Analysis re-evaluates only if the criteria still match.</p>
<p>This guide walks through the Dashboard setup for all three addons, with examples covering the most common automation patterns. For the conceptual reference, see <a class="" href="https://developers.filespin.io/automated-media-pipeline/">Automated Media Pipeline</a>.</p>
<p><img decoding="async" loading="lazy" alt="Automated Addon Pipeline" src="https://developers.filespin.io/assets/images/automated-addons-workflow-a2b5831efd277545d147959830bb4aa6.svg" width="720" height="100" class="img_ev3q"></p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="how-addon-automation-works">How addon automation works<a href="https://developers.filespin.io/guides/automating-addons/#how-addon-automation-works" class="hash-link" aria-label="Direct link to How addon automation works" title="Direct link to How addon automation works" translate="no">​</a></h2>
<p>Three filters decide whether an addon runs on a given asset event:</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">Asset event fires</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">       │</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">       ▼</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">┌─────────────────┐</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│ Event hook      │  → Is the addon listening for this event type?</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">└─────────────────┘     (file-saved, file-data-updated)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">       │</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">       ▼</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">┌─────────────────┐</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│ Content type    │  → Does the asset's MIME type match?</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">└─────────────────┘     (image/*, image/jpeg, */*, etc.)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">       │</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">       ▼</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">┌─────────────────┐</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│ Schema criteria │  → Does the asset's schema and custom data match?</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">└─────────────────┘     (only on file-data-updated)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">       │</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">       ▼</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">   Run addon</span><br></span></code></pre></div></div>
<p>Each addon is configured independently. You can have Face Recognition running on every upload, Image Analysis scoped to a "Stock Library" schema, and Remove Background firing only when a product photo is flagged as an original — all from the same upload event.</p>
<p>The platform also handles dedup automatically. When an addon completes, it writes a system marker to the asset's metadata (any field beginning with <code>_filespin_</code>). On any subsequent event, if the marker is present, the addon is skipped — no double-billing, no duplicate processing.</p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="setting-it-up-in-the-dashboard">Setting it up in the Dashboard<a href="https://developers.filespin.io/guides/automating-addons/#setting-it-up-in-the-dashboard" class="hash-link" aria-label="Direct link to Setting it up in the Dashboard" title="Direct link to Setting it up in the Dashboard" translate="no">​</a></h2>
<p>Go to <strong>Settings → Addons</strong> and click the gear icon next to the addon you want to automate.</p>
<p><img decoding="async" loading="lazy" alt="Settings → Addons page with gear icons for configurable addons" src="https://developers.filespin.io/assets/images/addons-settings-page-11a0e9fbc6f95ee1f2fea3edada71a44.png" width="2520" height="1824" class="img_ev3q"></p>
<p>The configuration modal has three sections, in order:</p>
<ol>
<li class=""><strong>Event hooks</strong> — pick which events the addon listens to.</li>
<li class=""><strong>Schema criteria</strong> — restrict the <em>file-data-updated</em> hook to assets matching a schema or specific field values.</li>
<li class=""><strong>Disposition</strong> — addon-specific output options.</li>
</ol>
<p><img decoding="async" loading="lazy" alt="Addon settings modal with event hooks, schema criteria, and disposition sections" src="https://developers.filespin.io/assets/images/addon-settings-modal-6239b876d4a55df8f3f4aa203d3f761d.png" width="1438" height="756" class="img_ev3q"></p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="step-1--pick-your-events">Step 1 — Pick your events<a href="https://developers.filespin.io/guides/automating-addons/#step-1--pick-your-events" class="hash-link" aria-label="Direct link to Step 1 — Pick your events" title="Direct link to Step 1 — Pick your events" translate="no">​</a></h3>
<p>For each event type (<em>file-saved</em>, <em>file-data-updated</em>), toggle it on if the addon should listen, and choose the content types that qualify. Most image addons want <code>image/*</code>.</p>
<p>A good default for most workflows:</p>
<table><thead><tr><th>Event</th><th>Toggle</th><th>Content types</th></tr></thead><tbody><tr><td><em>file-saved</em></td><td>On</td><td><code>image/*</code></td></tr><tr><td><em>file-data-updated</em></td><td>On (only if you use schema criteria)</td><td><code>image/*</code></td></tr></tbody></table>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="step-2--add-schema-criteria-optional">Step 2 — Add schema criteria (optional)<a href="https://developers.filespin.io/guides/automating-addons/#step-2--add-schema-criteria-optional" class="hash-link" aria-label="Direct link to Step 2 — Add schema criteria (optional)" title="Direct link to Step 2 — Add schema criteria (optional)" translate="no">​</a></h3>
<p>Schema criteria only apply to <em>file-data-updated</em> — fresh uploads have no custom metadata yet, so criteria can't be evaluated on <em>file-saved</em>.</p>
<p><img decoding="async" loading="lazy" alt="Schema criteria builder with schema picker and key/value field rows" src="https://developers.filespin.io/assets/images/schema-criteria-builder-d593972ff00bf9d761306f4dfb138af4.png" width="1442" height="1638" class="img_ev3q"></p>
<p>Two filters, both optional, both applied:</p>
<ul>
<li class=""><strong>Schema</strong> — pick a schema to restrict the addon to assets following it. Useful when you want different addons for different content types (e.g. Face Recognition on "Event Photo" assets, Remove Background on "Product Photo" assets).</li>
<li class=""><strong>Fields</strong> — add one or more <em>key → value</em> pairs. The asset's metadata must contain the key, types must match, and string matching is by substring (so <code>"GM"</code> matches <code>"GM-2024"</code> and <code>"BGM"</code>). Booleans match exactly.</li>
</ul>
<p>Leave both empty if you want the addon to fire on every asset whose content type matches.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="step-3--choose-the-disposition">Step 3 — Choose the disposition<a href="https://developers.filespin.io/guides/automating-addons/#step-3--choose-the-disposition" class="hash-link" aria-label="Direct link to Step 3 — Choose the disposition" title="Direct link to Step 3 — Choose the disposition" translate="no">​</a></h3>
<p>The disposition section is where the addons differ. Each addon's options are documented inline in the Dashboard, but here's what each one means.</p>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="face-recognition">Face Recognition<a href="https://developers.filespin.io/guides/automating-addons/#face-recognition" class="hash-link" aria-label="Direct link to Face Recognition" title="Direct link to Face Recognition" translate="no">​</a></h4>
<p>Two toggles:</p>
<ul>
<li class=""><strong>Tag asset with face count and IDs</strong> — when on, the asset's metadata is enriched with a face count and the IDs of detected faces, which makes them searchable in the Dashboard. When off, the face index still gets built (so face search keeps working), but the asset's metadata stays clean.</li>
<li class=""><strong>Process derived assets</strong> <em>(default off)</em> — when off, FR skips system-generated derivative assets like background-removed PNGs. Leave this off unless you specifically want FR to also index faces in cut-outs (it would create duplicate entries — one from the original photo, one from the cut-out — and pollute face search results).</li>
</ul>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="image-analysis">Image Analysis<a href="https://developers.filespin.io/guides/automating-addons/#image-analysis" class="hash-link" aria-label="Direct link to Image Analysis" title="Direct link to Image Analysis" translate="no">​</a></h4>
<p>A single toggle: <strong>Process derived assets</strong> <em>(default off)</em>. When off, IA skips system-generated derivative assets like background-removed PNGs. Leave this off unless you specifically want auto-tags on cut-outs — they tend to produce noisy labels because transparent-background images confuse general-purpose vision models.</p>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="remove-background">Remove Background<a href="https://developers.filespin.io/guides/automating-addons/#remove-background" class="hash-link" aria-label="Direct link to Remove Background" title="Direct link to Remove Background" translate="no">​</a></h4>
<p>Two output modes:</p>
<ul>
<li class=""><strong>Add as conversion</strong> — saves the cut-out as a named conversion on the source asset (default name: <code>bg_removed</code>). The original stays canonical; the cut-out is a sibling visible in the Dashboard and in branded share pages with signed URLs. Best when the cut-out is a deliverable, not its own asset.</li>
<li class=""><strong>Add as new asset</strong> — creates a brand-new PNG asset, linked back to the source. Optionally inherit the source's custom metadata and schema assignment. Best when the cut-out needs its own ID, share permissions, or independent metadata.</li>
</ul>
<p><img decoding="async" loading="lazy" alt="Remove Background disposition section with output mode select" src="https://developers.filespin.io/assets/images/rbg-disposition-e7d1bea4e4e9d702cb84f4a1be67af29.png" width="1436" height="778" class="img_ev3q"></p>
<p>Switching modes clears the now-irrelevant fields automatically — pick <em>Add as conversion</em> and the conversion name input appears; pick <em>Add as new asset</em> and the inherit-metadata checkbox appears instead.</p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="common-automation-patterns">Common automation patterns<a href="https://developers.filespin.io/guides/automating-addons/#common-automation-patterns" class="hash-link" aria-label="Direct link to Common automation patterns" title="Direct link to Common automation patterns" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="index-every-face-in-every-uploaded-image">Index every face in every uploaded image<a href="https://developers.filespin.io/guides/automating-addons/#index-every-face-in-every-uploaded-image" class="hash-link" aria-label="Direct link to Index every face in every uploaded image" title="Direct link to Index every face in every uploaded image" translate="no">​</a></h3>
<p>Goal: build a searchable face index from every photo on upload, regardless of how it's tagged.</p>
<table><thead><tr><th>Section</th><th>Setting</th></tr></thead><tbody><tr><td>Event hook</td><td><em>file-saved</em> on, content types <code>image/*</code></td></tr><tr><td>Schema criteria</td><td>None</td></tr><tr><td>Disposition</td><td><em>Tag asset with face count and IDs</em> on</td></tr></tbody></table>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="auto-tag-only-assets-in-the-stock-library-schema">Auto-tag only assets in the Stock Library schema<a href="https://developers.filespin.io/guides/automating-addons/#auto-tag-only-assets-in-the-stock-library-schema" class="hash-link" aria-label="Direct link to Auto-tag only assets in the Stock Library schema" title="Direct link to Auto-tag only assets in the Stock Library schema" translate="no">​</a></h3>
<p>Goal: run Image Analysis only when an asset is assigned to your Stock Library schema, not for press releases or working files.</p>
<table><thead><tr><th>Section</th><th>Setting</th></tr></thead><tbody><tr><td>Event hook</td><td><em>file-saved</em> on, content types <code>image/*</code></td></tr><tr><td>Event hook</td><td><em>file-data-updated</em> on, content types <code>image/*</code></td></tr><tr><td>Schema criteria (on <em>file-data-updated</em>)</td><td>Schema → Stock Library</td></tr><tr><td>Disposition</td><td>n/a</td></tr></tbody></table>
<p>The <em>file-saved</em> hook fires on every image upload, so Image Analysis still runs immediately when an asset is created. The <em>file-data-updated</em> hook handles the case where someone re-classifies an asset into the Stock Library schema later.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="auto-cut-backgrounds-for-original-product-photos-only">Auto-cut backgrounds for original product photos only<a href="https://developers.filespin.io/guides/automating-addons/#auto-cut-backgrounds-for-original-product-photos-only" class="hash-link" aria-label="Direct link to Auto-cut backgrounds for original product photos only" title="Direct link to Auto-cut backgrounds for original product photos only" translate="no">​</a></h3>
<p>Goal: when a product photo is marked as an original (not a re-upload of an existing image), automatically generate a transparent-background version.</p>
<table><thead><tr><th>Section</th><th>Setting</th></tr></thead><tbody><tr><td>Event hook</td><td><em>file-data-updated</em> on, content types <code>image/*</code></td></tr><tr><td>Schema criteria</td><td>Field → <code>originalAsset</code> = <code>Y</code></td></tr><tr><td>Disposition</td><td>Output mode → <em>Add as conversion</em>; conversion name → <code>bg_removed</code></td></tr></tbody></table>
<p>The cut-out lands on the same asset as a <code>bg_removed</code> conversion, accessible in the Dashboard and in branded share pages.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="auto-cut-backgrounds-and-create-a-separate-asset">Auto-cut backgrounds and create a separate asset<a href="https://developers.filespin.io/guides/automating-addons/#auto-cut-backgrounds-and-create-a-separate-asset" class="hash-link" aria-label="Direct link to Auto-cut backgrounds and create a separate asset" title="Direct link to Auto-cut backgrounds and create a separate asset" translate="no">​</a></h3>
<p>Goal: same as above but the cut-out should be its own asset, not a conversion.</p>
<table><thead><tr><th>Section</th><th>Setting</th></tr></thead><tbody><tr><td>Event hook</td><td><em>file-data-updated</em> on, content types <code>image/*</code></td></tr><tr><td>Schema criteria</td><td>Field → <code>originalAsset</code> = <code>Y</code></td></tr><tr><td>Disposition</td><td>Output mode → <em>Add as new asset</em>; <em>Inherit metadata</em> on</td></tr></tbody></table>
<p>The new PNG inherits the source's metadata and schema, and links back to the original. Remove Background won't loop on the new asset — the platform detects derived assets and excludes them from matching.</p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="best-practices">Best practices<a href="https://developers.filespin.io/guides/automating-addons/#best-practices" class="hash-link" aria-label="Direct link to Best practices" title="Direct link to Best practices" translate="no">​</a></h2>
<p><strong>Start with <em>file-saved</em> and no criteria.</strong> Schema criteria are useful, but they're easy to over-tune. Begin with a simple "run on every image upload" config, observe what the addon produces, then narrow down.</p>
<p><strong>Use the schema filter before fields.</strong> Schema-level filtering is exact and fast; field matching is substring-based and easier to get wrong. If your goal is "only run on Marketing assets", point the schema filter at the Marketing schema rather than building a fields filter.</p>
<p><strong>Marker fields are platform-managed.</strong> Anything starting with <code>_filespin_</code> is owned by FileSpin and shown read-only in the Dashboard. Don't rely on these for your own metadata — define your own fields in your schema instead.</p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="next-steps">Next steps<a href="https://developers.filespin.io/guides/automating-addons/#next-steps" class="hash-link" aria-label="Direct link to Next steps" title="Direct link to Next steps" translate="no">​</a></h2>
<ul>
<li class=""><a class="" href="https://developers.filespin.io/automated-media-pipeline/">Automated Media Pipeline reference</a> — what each setting does and per-addon disposition options</li>
<li class=""><a class="" href="https://developers.filespin.io/guides/face-recognition/">Face Recognition guide</a> — face indexing, search, and pagination</li>
<li class=""><a class="" href="https://developers.filespin.io/intro/ai/background-removal/">Background Removal</a> — manual triggering, asset-based and upload-based modes</li>
<li class=""><a class="" href="https://developers.filespin.io/guides/asset-schemas/">Asset Schemas guide</a> — designing the schemas that drive your criteria</li>
</ul>]]></content:encoded>
            <category>addons</category>
            <category>automation</category>
            <category>schemas</category>
            <category>face-recognition</category>
            <category>image-analysis</category>
            <category>background-removal</category>
        </item>
        <item>
            <title><![CDATA[Automating Media Workflows with Make, Zapier, and n8n]]></title>
            <link>https://developers.filespin.io/guides/workflow-engines/</link>
            <guid>https://developers.filespin.io/guides/workflow-engines/</guid>
            <pubDate>Tue, 17 Mar 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[How to build visual automation pipelines using FileSpin's native modules for Make, Zapier, and n8n — triggered by asset events, powered by FileSpin operations, and connected to your downstream systems.]]></description>
            <content:encoded><![CDATA[<p>How to build visual automation pipelines using FileSpin's native modules for Make, Zapier, and n8n — triggered by asset events, powered by FileSpin operations, and connected to your downstream systems.</p>
<p><img decoding="async" loading="lazy" alt="Workflow Engine Architecture" src="https://developers.filespin.io/assets/images/workflow-engine-architecture-7efd548ef5487d6d58a512a893e0b6e9.svg" width="900" height="400" class="img_ev3q"></p>
<p>FileSpin offers three automation paths: AI agents for ad-hoc, complex workflows through natural language; workflow engines for repeatable, visual pipelines operations teams build without engineering; and REST APIs for custom, high-throughput integrations. This guide covers the second path — workflow engines.</p>
<p>FileSpin provides <strong>native modules</strong> for Make, Zapier and n8n that wrap the FileSpin REST API into drag-and-drop building blocks — real-time triggers, actions, and searches (24+ modules). Your operations team can build end-to-end media automation pipelines that react to uploads, processing completions, metadata changes, and errors — then push results to downstream systems. No code required.</p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="how-it-works">How it works<a href="https://developers.filespin.io/guides/workflow-engines/#how-it-works" class="hash-link" aria-label="Direct link to How it works" title="Direct link to How it works" translate="no">​</a></h2>
<p>The architecture has three layers:</p>
<p><strong>1. FileSpin fires a trigger event</strong> — when an asset is uploaded or processing completes, FileSpin's native trigger modules deliver the event to your workflow engine in real time. The trigger modules handle webhook registration automatically — no manual setup needed.</p>
<p><strong>2. The workflow engine executes a pipeline</strong> — using FileSpin's native action modules to perform operations (search, transform, remove background, tag, share, watermark) and any other connected service modules (commerce platforms, Slack, Salesforce, etc.) for downstream actions.</p>
<p><strong>3. Results flow to downstream systems</strong> — transformed assets pushed to storefronts, metadata synced to PIMs, share pages delivered to stakeholders, notifications sent to teams.</p>
<p>This is event-driven automation. Nothing polls. Nothing waits. The moment an asset event occurs in FileSpin, your pipeline runs.</p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="triggers-what-starts-your-pipeline">Triggers: what starts your pipeline<a href="https://developers.filespin.io/guides/workflow-engines/#triggers-what-starts-your-pipeline" class="hash-link" aria-label="Direct link to Triggers: what starts your pipeline" title="Direct link to Triggers: what starts your pipeline" translate="no">​</a></h2>
<p>Every workflow starts with a trigger. FileSpin's native modules include six webhook-based trigger types that fire instantly when asset events occur — no polling delays.</p>
<table><thead><tr><th>Trigger</th><th>Event</th><th>Description</th></tr></thead><tbody><tr><td><strong>New Asset Uploaded</strong></td><td><code>asset.created</code></td><td>Fires when a new asset is uploaded via Picker, Teleport sync, or API</td></tr><tr><td><strong>Asset Processing Complete</strong></td><td><code>asset.processed</code></td><td>Fires when async processing finishes (thumbnails, transcoding, conversions)</td></tr><tr><td><strong>Addon Processing Complete</strong></td><td><code>asset.addon-processed</code></td><td>Fires when an addon completes (background removal, face indexing, auto-tagging)</td></tr><tr><td><strong>Asset Updated</strong></td><td><code>asset.updated</code></td><td>Fires when asset metadata is changed</td></tr><tr><td><strong>Asset Deleted</strong></td><td><code>asset.deleted</code></td><td>Fires when an asset is moved to trash</td></tr><tr><td><strong>Asset Processing Failed</strong></td><td><code>asset.failed</code></td><td>Fires when processing encounters an error</td></tr></tbody></table>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="which-trigger-to-use">Which trigger to use<a href="https://developers.filespin.io/guides/workflow-engines/#which-trigger-to-use" class="hash-link" aria-label="Direct link to Which trigger to use" title="Direct link to Which trigger to use" translate="no">​</a></h3>
<p>For most automation pipelines, <strong>Asset Processing Complete</strong> is the primary trigger — it fires when the asset is fully ready with all conversions and transcodes available. Use <strong>Addon Processing Complete</strong> when your pipeline depends on AI results (auto-tags, face recognition, background removal). Use <strong>New Asset Uploaded</strong> when you need to react to the upload itself before processing finishes — for immediate notifications, metadata validation, or routing logic. <strong>Asset Processing Failed</strong> enables error-handling workflows that alert your team or retry operations.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="connecting-your-filespin-account">Connecting your FileSpin account<a href="https://developers.filespin.io/guides/workflow-engines/#connecting-your-filespin-account" class="hash-link" aria-label="Direct link to Connecting your FileSpin account" title="Direct link to Connecting your FileSpin account" translate="no">​</a></h3>
<p>All three platforms authenticate with FileSpin using <strong>OAuth 2.0 Authorization Code</strong> flow. When you add a FileSpin connection, the platform opens a browser window for you to log in to FileSpin and grant permissions. The platform manages token refresh automatically — no API keys or manual token handling required.</p>
<div class="theme-admonition theme-admonition-tip admonition_xJq3 alert alert--success"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>tip</div><div class="admonitionContent_BuS1"><p>Create a dedicated FileSpin user account for your automation workflows with the minimum role required. This gives you a clean audit trail and precise permission control.</p></div></div>
<p>The trigger modules handle webhook registration behind the scenes — when you activate a scenario, the module registers a webhook with FileSpin; when you deactivate, it cleans up. No manual webhook management required.</p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="filespins-native-modules">FileSpin's native modules<a href="https://developers.filespin.io/guides/workflow-engines/#filespins-native-modules" class="hash-link" aria-label="Direct link to FileSpin's native modules" title="Direct link to FileSpin's native modules" translate="no">​</a></h2>
<p>FileSpin provides 24+ native modules for Make, Zapier, and n8n — all available on all three platforms with identical functionality. Instead of configuring HTTP requests manually, you drag and drop FileSpin actions into your pipeline and configure them with business-friendly fields.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="actions--asset-management">Actions — asset management<a href="https://developers.filespin.io/guides/workflow-engines/#actions--asset-management" class="hash-link" aria-label="Direct link to Actions — asset management" title="Direct link to Actions — asset management" translate="no">​</a></h3>
<table><thead><tr><th>Module</th><th>Description</th></tr></thead><tbody><tr><td><strong>Upload Asset from URL</strong></td><td>Import a file from a public URL into FileSpin</td></tr><tr><td><strong>Upload Asset (File)</strong></td><td>Upload a file directly from a previous step (binary data)</td></tr><tr><td><strong>Get Asset Info</strong></td><td>Retrieve full metadata, processing status, and conversion details for an asset</td></tr><tr><td><strong>Update Metadata</strong></td><td>Add or update custom metadata fields (supports APPEND and REPLACE modes)</td></tr><tr><td><strong>Delete Asset</strong></td><td>Move an asset to trash</td></tr><tr><td><strong>Get Download Link</strong></td><td>Generate a signed download or display URL for an asset or its conversions</td></tr></tbody></table>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="actions--image-processing">Actions — image processing<a href="https://developers.filespin.io/guides/workflow-engines/#actions--image-processing" class="hash-link" aria-label="Direct link to Actions — image processing" title="Direct link to Actions — image processing" translate="no">​</a></h3>
<table><thead><tr><th>Module</th><th>Description</th></tr></thead><tbody><tr><td><strong>Generate Marketplace Image</strong></td><td>Generate a resized CDN URL for marketplace listings</td></tr><tr><td><strong>Remove Background</strong></td><td>Remove image background using AI, optionally saving as a new asset with inherited metadata</td></tr><tr><td><strong>Generate Social Media Kit</strong></td><td>Generate optimised image URLs for 8 social platforms in a single step (Instagram, Facebook, Twitter, LinkedIn, YouTube, Pinterest)</td></tr></tbody></table>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="actions--ai-and-addons">Actions — AI and addons<a href="https://developers.filespin.io/guides/workflow-engines/#actions--ai-and-addons" class="hash-link" aria-label="Direct link to Actions — AI and addons" title="Direct link to Actions — AI and addons" translate="no">​</a></h3>
<table><thead><tr><th>Module</th><th>Description</th></tr></thead><tbody><tr><td><strong>Get Auto Tags</strong></td><td>Retrieve ML-generated labels with confidence scores for an image</td></tr><tr><td><strong>Index Faces</strong></td><td>Detect and index faces in an image (max 10 per image) for face search</td></tr><tr><td><strong>Get Face Index Status</strong></td><td>Check whether face indexing is complete for an asset</td></tr><tr><td><strong>Search by Face</strong></td><td>Find assets containing a specific person using a reference image</td></tr></tbody></table>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="actions--sharing-and-collections">Actions — sharing and collections<a href="https://developers.filespin.io/guides/workflow-engines/#actions--sharing-and-collections" class="hash-link" aria-label="Direct link to Actions — sharing and collections" title="Direct link to Actions — sharing and collections" translate="no">​</a></h3>
<table><thead><tr><th>Module</th><th>Description</th></tr></thead><tbody><tr><td><strong>Create Share Page</strong></td><td>Create a branded share page with download controls, approval workflow, password, and expiry</td></tr><tr><td><strong>Create Collection</strong></td><td>Create a new asset collection for organising assets by brand, campaign, or event</td></tr><tr><td><strong>Add to Collection</strong></td><td>Add one or more assets to an existing collection</td></tr></tbody></table>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="searches">Searches<a href="https://developers.filespin.io/guides/workflow-engines/#searches" class="hash-link" aria-label="Direct link to Searches" title="Direct link to Searches" translate="no">​</a></h3>
<table><thead><tr><th>Module</th><th>Description</th></tr></thead><tbody><tr><td><strong>Find Asset</strong></td><td>Search assets by keyword, content type, upload date, metadata schema, and custom field values</td></tr><tr><td><strong>Find Collection</strong></td><td>Search collections by name</td></tr></tbody></table>
<p>These modules cover the full asset lifecycle: ingest (upload), process (resize, remove background, auto-tag), organise (metadata, collections), distribute (share pages, download links), and search (full-text, face search). Combined with FileSpin's six triggers, you can build end-to-end automation that reacts to asset events and composes with thousands of other apps on each platform.</p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="build-your-pipeline">Build your pipeline<a href="https://developers.filespin.io/guides/workflow-engines/#build-your-pipeline" class="hash-link" aria-label="Direct link to Build your pipeline" title="Direct link to Build your pipeline" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="common-pipeline-patterns">Common pipeline patterns<a href="https://developers.filespin.io/guides/workflow-engines/#common-pipeline-patterns" class="hash-link" aria-label="Direct link to Common pipeline patterns" title="Direct link to Common pipeline patterns" translate="no">​</a></h3>
<p><strong>E-commerce: New product → marketplace-ready images</strong></p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">Trigger: Asset Processing Complete</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  → Filter: check content_type is image</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  → FileSpin: Generate Marketplace Image (Amazon, 1600×1600)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  → FileSpin: Generate Marketplace Image (website-hero, 1920×600)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  → FileSpin: Generate Marketplace Image (Instagram square, 1080×1080)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  → Commerce Platform: Update Product Image</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  → Slack: Notify #product-images channel</span><br></span></code></pre></div></div>
<p><strong>Events: Speaker photos → press distribution</strong></p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">Trigger: Asset Processing Complete</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  → Filter: check metadata for event tag</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  → FileSpin: Update Metadata (speaker, session, event name)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  → FileSpin: Generate Social Media Kit (LinkedIn + Instagram)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  → FileSpin: Create Share Page (branded press page, expiry 1 week)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  → Email: Send share URL to press list</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  → Slack: Post to #event-comms</span><br></span></code></pre></div></div>
<p><strong>Content publishing: Asset ready → push to CMS</strong></p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">Trigger: Asset Processing Complete</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  → Filter: check metadata for status = "approved"</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  → FileSpin: Generate Marketplace Image (desktop 1920×600, tablet 1024×400, mobile 640×300)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  → CMS: Create/Update Asset Entry</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  → CMS: Publish Entry</span><br></span></code></pre></div></div>
<p><strong>Brand compliance: New upload → metadata validation</strong></p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">Trigger: New Asset Uploaded</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  → FileSpin: Get Auto Tags (detect content type, categories)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  → Router:</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    → IF metadata complete: FileSpin: Update Metadata (status = "approved")</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    → IF metadata missing: Email: Notify uploader to complete fields</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    → IF wrong format: Slack: Alert #brand-compliance</span><br></span></code></pre></div></div>
<p><strong>Sponsor deliverables: Post-event asset distribution</strong></p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">Trigger: Addon Processing Complete (face indexing)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  → FileSpin: Find Asset (by sponsor tag + event)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  → FileSpin: Create Share Page (branded sponsor page, password protected, approval enabled)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  → Email: Send share URL + password to sponsor contact</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  → Google Sheets: Log delivery in sponsor tracking sheet</span><br></span></code></pre></div></div>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="recipe-walkthrough-e-commerce-product-pipeline-in-make">Recipe walkthrough: E-commerce product pipeline in Make<a href="https://developers.filespin.io/guides/workflow-engines/#recipe-walkthrough-e-commerce-product-pipeline-in-make" class="hash-link" aria-label="Direct link to Recipe walkthrough: E-commerce product pipeline in Make" title="Direct link to Recipe walkthrough: E-commerce product pipeline in Make" translate="no">​</a></h2>
<p><img decoding="async" loading="lazy" alt="E-commerce product pipeline steps" src="https://developers.filespin.io/assets/images/recipe-ecommerce-make-81bc998550085c1b2c8a57d5e1795be0.svg" width="900" height="100" class="img_ev3q"></p>
<p>Here's a step-by-step walkthrough of building the e-commerce product pipeline in Make:</p>
<p><strong>1. Asset Processing Complete trigger</strong>
Add a FileSpin → Asset Processing Complete trigger module. This automatically registers a webhook with FileSpin — when an asset finishes processing, it fires.</p>
<p><strong>2. Filter: images only</strong>
Add a filter after the trigger: <code>content_type</code> contains <code>image/</code>. This skips video and document assets.</p>
<p><strong>3. FileSpin: Generate Marketplace Image (Amazon)</strong>
Add a FileSpin → Generate Marketplace Image module. Map the asset ID from the trigger payload. Select the "Amazon" preset, or set width and height to <code>1600</code>, crop mode to <code>center</code>, format to <code>webp</code>, quality to <code>90</code>.</p>
<p><strong>4. FileSpin: Generate Marketplace Image (website hero)</strong>
Clone the previous module. Select the "website-hero" preset or change dimensions to <code>1920x600</code>.</p>
<p><strong>5. FileSpin: Generate Marketplace Image (Instagram)</strong>
Clone again. Select the "Instagram square" preset or change dimensions to <code>1080x1080</code>.</p>
<p><strong>6. Commerce platform: Update Product</strong>
Add your commerce platform module. Map the product by SKU from the trigger's custom metadata fields. Attach the generated image URLs as product images.</p>
<p><strong>7. Slack: Send notification</strong>
Add a Slack module. Post to <code>#product-images</code> with the product name, SKU, and a summary of generated sizes.</p>
<p>The entire pipeline runs automatically every time a product image is processed in FileSpin.</p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="recipe-walkthrough-event-photo-distribution-in-n8n">Recipe walkthrough: Event photo distribution in n8n<a href="https://developers.filespin.io/guides/workflow-engines/#recipe-walkthrough-event-photo-distribution-in-n8n" class="hash-link" aria-label="Direct link to Recipe walkthrough: Event photo distribution in n8n" title="Direct link to Recipe walkthrough: Event photo distribution in n8n" translate="no">​</a></h2>
<p><img decoding="async" loading="lazy" alt="Event photo distribution steps" src="https://developers.filespin.io/assets/images/recipe-event-photos-n8n-1f4cb587e38ea863cfbb6a259d37802a.svg" width="820" height="100" class="img_ev3q"></p>
<p><strong>1. Asset Processing Complete node</strong>
Add a FileSpin trigger node. Select "Asset Processing Complete" as the event type. This registers a webhook with FileSpin automatically.</p>
<p><strong>2. IF node: event assets only</strong>
Route based on whether <code>event_name</code> exists in the asset's custom metadata.</p>
<p><strong>3. FileSpin: Update Metadata</strong>
Use the FileSpin Update Metadata node. Map speaker name, session, and event from the asset's custom metadata.</p>
<p><strong>4. FileSpin: Create Share Page</strong>
Use the Create Share Page node. Set the title to the event name + speaker, enable approval workflow, set expiry to one week, and apply branding.</p>
<p><strong>5. Send Email node</strong>
Send the share URL to the press distribution list pulled from a Google Sheet or Airtable base.</p>
<p><strong>6. Slack node</strong>
Post to <code>#event-comms</code> with the share URL and a count of assets included.</p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="pre-built-recipes-and-building-blocks">Pre-built recipes and building blocks<a href="https://developers.filespin.io/guides/workflow-engines/#pre-built-recipes-and-building-blocks" class="hash-link" aria-label="Direct link to Pre-built recipes and building blocks" title="Direct link to Pre-built recipes and building blocks" translate="no">​</a></h2>
<p>FileSpin publishes production-ready workflow templates — <strong>pre-built recipes</strong> — that you can import directly into Make, Zapier, or n8n and customise to your stack.</p>
<p>These are not black-box connectors. Every step is visible, modifiable, and composable. Deploy as-is for standard workflows or adapt them to match your exact process.</p>
<p>New recipes are published regularly. Check the FileSpin documentation for the latest library.</p>
<p><strong>Why recipes, not rigid connectors:</strong></p>
<ul>
<li class=""><strong>You see every step.</strong> No hidden logic. When something breaks, you know exactly where and why.</li>
<li class=""><strong>Your ops team builds.</strong> Recipes run on visual platforms your operations team already knows — no engineering tickets.</li>
<li class=""><strong>Every stack is unique.</strong> Combine, extend, and chain recipes to match how your team actually works.</li>
</ul>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="webhook-reliability">Webhook reliability<a href="https://developers.filespin.io/guides/workflow-engines/#webhook-reliability" class="hash-link" aria-label="Direct link to Webhook reliability" title="Direct link to Webhook reliability" translate="no">​</a></h2>
<p>FileSpin's trigger modules are backed by enterprise-grade webhook delivery:</p>
<ul>
<li class=""><strong>At-least-once delivery</strong> — events are retried with exponential backoff if delivery fails, up to 8 retries over 8 hours.</li>
<li class=""><strong>HMAC-SHA256 signing</strong> — every payload is cryptographically signed. The trigger modules verify signatures automatically; if you build custom webhook handlers, verify the <code>X-FileSpin-Signature</code> header to ensure the request comes from FileSpin.</li>
<li class=""><strong>Idempotency</strong> — use the <code>delivery_id</code> field as a deduplication key. Your pipeline may receive the same event more than once during retries.</li>
<li class=""><strong>Automatic registration</strong> — trigger modules handle webhook registration and deregistration as you activate and deactivate scenarios. No manual webhook management.</li>
</ul>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="best-practices">Best practices<a href="https://developers.filespin.io/guides/workflow-engines/#best-practices" class="hash-link" aria-label="Direct link to Best practices" title="Direct link to Best practices" translate="no">​</a></h2>
<ol>
<li class="">
<p><strong>Trigger on Asset Processing Complete, not New Asset Uploaded</strong> for distribution workflows. The New Asset Uploaded trigger fires before processing is complete — conversions, transcodes, and addon results aren't available yet. Use Asset Processing Complete for pipelines that need the fully ready asset.</p>
</li>
<li class="">
<p><strong>Use filters early in the pipeline.</strong> Not every asset event needs the full pipeline. Filter by content type, metadata values, or asset status immediately after the trigger to avoid unnecessary processing.</p>
</li>
<li class="">
<p><strong>Handle idempotency.</strong> Network retries can deliver the same event twice. Use <code>delivery_id</code> to detect duplicates — check if you've already processed this delivery before running the pipeline.</p>
</li>
<li class="">
<p><strong>Use named presets in Generate Marketplace Image.</strong> Presets let your ops team think in channels ("Amazon", "Instagram Story", "website-hero") instead of pixels. Define your team's presets in the FileSpin dashboard and they'll appear in the module dropdowns automatically.</p>
</li>
<li class="">
<p><strong>Use Addon Processing Complete for AI-dependent workflows.</strong> If your pipeline depends on face recognition, background removal, or auto-tagging results, use the Addon Processing Complete trigger instead of Asset Processing Complete — it fires specifically when the addon finishes, so your pipeline only runs when those results are available.</p>
</li>
<li class="">
<p><strong>Keep pipelines modular.</strong> Build small, focused scenarios rather than one large pipeline. A scenario that tags + shares is easier to debug than one that tags + shares + pushes to three CMSs + notifies four channels.</p>
</li>
<li class="">
<p><strong>Use Update Metadata to close the loop.</strong> After your pipeline runs, write status back to FileSpin — mark assets as "distributed", "published", or "synced". This makes search workflows and audit pipelines possible downstream.</p>
</li>
</ol>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="comparison-with-other-dam-platforms">Comparison with other DAM platforms<a href="https://developers.filespin.io/guides/workflow-engines/#comparison-with-other-dam-platforms" class="hash-link" aria-label="Direct link to Comparison with other DAM platforms" title="Direct link to Comparison with other DAM platforms" translate="no">​</a></h2>
<table><thead><tr><th>Capability</th><th>FileSpin</th><th>Cloudinary</th><th>Bynder</th><th>Canto</th></tr></thead><tbody><tr><td>Webhook triggers (instant)</td><td>6 events</td><td>Polling only (15-min delay)</td><td>Comment-based only</td><td>2 events</td></tr><tr><td>Upload action</td><td>URL + File upload</td><td>URL + File upload</td><td>No</td><td>File only</td></tr><tr><td>Search action</td><td>Full-text + metadata</td><td>No</td><td>No</td><td>No</td></tr><tr><td>Metadata update</td><td>Yes (APPEND/REPLACE)</td><td>Tags only</td><td>No</td><td>No</td></tr><tr><td>Collection management</td><td>Yes</td><td>No</td><td>No</td><td>No</td></tr><tr><td>Share page creation</td><td>Yes</td><td>No</td><td>No</td><td>No</td></tr><tr><td>On-demand image resize</td><td>URL-based (instant)</td><td>URL-based</td><td>No</td><td>No</td></tr><tr><td>Authentication</td><td>OAuth 2.0 + PKCE</td><td>API Key only</td><td>OAuth 2.0</td><td>API Key only</td></tr></tbody></table>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="next-steps">Next steps<a href="https://developers.filespin.io/guides/workflow-engines/#next-steps" class="hash-link" aria-label="Direct link to Next steps" title="Direct link to Next steps" translate="no">​</a></h2>
<ul>
<li class=""><a class="" href="https://developers.filespin.io/guides/ai-agent-integration/">Using FileSpin within an AI Agent</a> — For complex, ad-hoc workflows through natural language</li>
<li class=""><a class="" href="https://developers.filespin.io/guides/webhooks/">Real-time Notifications with Webhooks</a> — Deep dive into webhook setup, HMAC verification, and handler code</li>
<li class=""><a class="" href="https://developers.filespin.io/guides/asset-lifecycle/">Upload, Process, Deliver: The Complete Asset Lifecycle</a> — Understand the events in context</li>
<li class=""><a class="" href="https://developers.filespin.io/guides/sharing-assets/">Sharing Assets with External Stakeholders</a> — Branded share pages for distribution workflows</li>
</ul>]]></content:encoded>
            <category>workflow-engines</category>
            <category>make</category>
            <category>zapier</category>
            <category>n8n</category>
            <category>automation</category>
            <category>integration</category>
            <category>webhooks</category>
        </item>
        <item>
            <title><![CDATA[Using FileSpin within an AI Agent]]></title>
            <link>https://developers.filespin.io/guides/ai-agent-integration/</link>
            <guid>https://developers.filespin.io/guides/ai-agent-integration/</guid>
            <pubDate>Wed, 04 Mar 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[How MCP-compatible AI agents connect to FileSpin, discover a focused set of tools and workflow recipes, and execute end-to-end media operations through natural language -- setup, authentication, tool patterns, and real-world examples.]]></description>
            <content:encoded><![CDATA[<p>How MCP-compatible AI agents connect to FileSpin, discover a focused set of tools and workflow recipes, and execute end-to-end media operations through natural language -- setup, authentication, tool patterns, and real-world examples.</p>
<p><img decoding="async" loading="lazy" alt="AI Agent MCP Integration" src="https://developers.filespin.io/assets/images/ai-agent-mcp-workflow-64d80608d9547b20e08cf0d9b512354a.svg" width="900" height="532" class="img_ev3q"></p>
<p>FileSpin offers three automation paths: AI agents for ad-hoc, complex workflows through natural language; workflow engines for repeatable, visual pipelines operations teams build without engineering; and REST APIs for custom, high-throughput integrations. This guide covers the first path -- AI agents.</p>
<p>FileSpin is an AI-native digital asset management platform used by eCommerce retailers, event producers, attractions operators, and media companies to manage, transform, and deliver assets autonomously. One of the most powerful ways to interact with FileSpin is through AI agents -- Claude, ChatGPT, Mistral or any MCP-compatible client -- that connect to the platform via the Model Context Protocol and execute complex media workflows through natural language.</p>
<p>Instead of learning API endpoints and building integration code, your team describes what they need: <em>"Tag all new arrivals by SKU, remove backgrounds, and send a review link to the buying team."</em> The agent discovers FileSpin's capabilities, chains the right operations together, and executes the entire workflow end-to-end.</p>
<p>This guide covers the architecture, setup, available capabilities, and real-world workflow patterns so your engineering team can evaluate and integrate FileSpin's MCP server.</p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="what-is-the-model-context-protocol-mcp">What is the Model Context Protocol (MCP)?<a href="https://developers.filespin.io/guides/ai-agent-integration/#what-is-the-model-context-protocol-mcp" class="hash-link" aria-label="Direct link to What is the Model Context Protocol (MCP)?" title="Direct link to What is the Model Context Protocol (MCP)?" translate="no">​</a></h2>
<p>MCP is an open standard that lets AI agents discover and use external tools. Instead of hard-coding API calls or building custom plugins, an MCP server advertises its capabilities -- tools and prompt templates -- and any compatible AI agent can discover and invoke them at runtime.</p>
<p>FileSpin's MCP server exposes the full FileSpin platform as a focused set of tools and prompt templates across <strong>11 workflow categories</strong>. The agent connects to FileSpin MCP, authenticates via OAuth2, and has access to every operation your FileSpin account role permits.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="key-concepts">Key concepts<a href="https://developers.filespin.io/guides/ai-agent-integration/#key-concepts" class="hash-link" aria-label="Direct link to Key concepts" title="Direct link to Key concepts" translate="no">​</a></h3>
<table><thead><tr><th>Concept</th><th>What it means</th></tr></thead><tbody><tr><td><strong>Tools</strong></td><td>Atomic operations (search, upload, tag, share, transform, etc.) callable by any MCP client.</td></tr><tr><td><strong>Prompts</strong></td><td>Multi-step workflow recipes that chain tools together, registered across 11 categories.</td></tr><tr><td><strong>OAuth2 Authentication</strong></td><td>Standard OAuth2 flow. The agent authenticates as a FileSpin user and inherits that user's account role and permissions.</td></tr><tr><td><strong>Asset Shares</strong></td><td>Branded, hosted web pages for external distribution with download controls, approval workflows, and analytics.</td></tr><tr><td><strong>Collections</strong></td><td>Internal organizational groups for team collaboration and bulk operations.</td></tr><tr><td><strong>Addons</strong></td><td>Platform capabilities (face recognition, auto-tagging, background removal) that gate certain tools; checked at runtime.</td></tr></tbody></table>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="how-it-works">How it works<a href="https://developers.filespin.io/guides/ai-agent-integration/#how-it-works" class="hash-link" aria-label="Direct link to How it works" title="Direct link to How it works" translate="no">​</a></h2>
<p>When an AI agent connects to the FileSpin MCP server, the interaction follows three phases: the agent discovers available capabilities, executes a chain of tool calls to fulfill the user's request, and returns the result.</p>
<p><img decoding="async" loading="lazy" alt="How MCP Integration Works" src="https://developers.filespin.io/assets/images/ai-agent-mcp-sequence-70124b3f6bf357b5fcd292a8691b56e1.svg" width="900" height="380" class="img_ev3q"></p>
<p>The agent handles all orchestration -- deciding which tools to call, in what order, with what parameters -- based on the user's natural language request. The MCP server translates each tool call into the corresponding FileSpin REST API request.</p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="step-1-configure-the-filespin-mcp-server">Step 1: Configure the FileSpin MCP server<a href="https://developers.filespin.io/guides/ai-agent-integration/#step-1-configure-the-filespin-mcp-server" class="hash-link" aria-label="Direct link to Step 1: Configure the FileSpin MCP server" title="Direct link to Step 1: Configure the FileSpin MCP server" translate="no">​</a></h2>
<p>FileSpin The MCP URL: <strong><a href="https://mcp.filespin.io/mcp" target="_blank" rel="noopener noreferrer" class="">https://mcp.filespin.io/mcp</a></strong></p>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="claude-desktop">Claude Desktop<a href="https://developers.filespin.io/guides/ai-agent-integration/#claude-desktop" class="hash-link" aria-label="Direct link to Claude Desktop" title="Direct link to Claude Desktop" translate="no">​</a></h4>
<p>Add FileSpin to your Claude Desktop via Settings -&gt; Connectors.</p>
<p><img decoding="async" loading="lazy" alt="FileSpin MCP Connector for Claude" src="https://developers.filespin.io/assets/images/filespin-mcp-claude-connector-2e65644f4623811cc26bca55d73fe5d7.png" width="1200" height="429" class="img_ev3q"></p>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="chatgpt-and-other-mcp-clients">ChatGPT and other MCP clients<a href="https://developers.filespin.io/guides/ai-agent-integration/#chatgpt-and-other-mcp-clients" class="hash-link" aria-label="Direct link to ChatGPT and other MCP clients" title="Direct link to ChatGPT and other MCP clients" translate="no">​</a></h4>
<p>Any MCP-compatible client can connect to the FileSpin MCP server. Add the MCP server using standard connector option.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="step-2-authentication-and-permissions">Step 2: Authentication and permissions<a href="https://developers.filespin.io/guides/ai-agent-integration/#step-2-authentication-and-permissions" class="hash-link" aria-label="Direct link to Step 2: Authentication and permissions" title="Direct link to Step 2: Authentication and permissions" translate="no">​</a></h2>
<p>The FileSpin MCP server uses standard <strong>OAuth2 authentication</strong>. When the agent connects, it authenticates through the OAuth2 flow (i.e. a broser window opes and user is asked to authenticate FileSpin MCP by logginh into FileSpin). The agent  receives a token scoped to the authenticating user's FileSpin account role after successful login.</p>
<p>What the agent can do is determined entirely by the <strong>FileSpin account role</strong> of the authenticated user. If the user has read-only access, the agent can only read. If the user has full admin access, the agent can upload, tag, share, and manage assets.</p>
<p>This means:</p>
<ul>
<li class=""><strong>No separate API key scoping</strong> -- the agent inherits the user's existing permissions.</li>
<li class=""><strong>Audit trails</strong> -- every action the agent takes is logged under the authenticated user's account.</li>
<li class=""><strong>Role-based control</strong> -- restrict what agents can do by assigning appropriate FileSpin roles to the users who connect agents.</li>
</ul>
<div class="theme-admonition theme-admonition-tip admonition_xJq3 alert alert--success"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>tip</div><div class="admonitionContent_BuS1"><p>Create a dedicated FileSpin user account for your AI agent with the minimum role required for its intended workflows. This gives you a clean audit trail and precise permission control.</p><p><strong>Note that complete purging of assets is not available via MCP.</strong></p></div></div>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="let-the-ai-get-you-started">Let the AI get you started<a href="https://developers.filespin.io/guides/ai-agent-integration/#let-the-ai-get-you-started" class="hash-link" aria-label="Direct link to Let the AI get you started" title="Direct link to Let the AI get you started" translate="no">​</a></h2>
<p>The quickest way to get started is to let the AI Agent such as Claude or ChatGPT guide you in using FileSpin MCP. When FileSpin MCP is added to the AI Agent, it provides the AI Agent with comprehensive information to guide you in using it. Start with the prompt:</p>
<p><code>Help me get started with FileSpin MCP, walk me through the prompts and workflows I can do - starting with how to login, find assets and have them reviewed and finalised</code></p>
<p><img decoding="async" loading="lazy" alt="AI Agent led guidenace" src="https://developers.filespin.io/assets/images/filespin_mcp_ai_guidance-91fa12ba3fed2f1166b482b9ffb7e8c0.png" width="1200" height="1124" class="img_ev3q"></p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="available-tools">Available tools<a href="https://developers.filespin.io/guides/ai-agent-integration/#available-tools" class="hash-link" aria-label="Direct link to Available tools" title="Direct link to Available tools" translate="no">​</a></h2>
<p>The FileSpin MCP server exposes a focused set of tools that agents can call directly. These are atomic operations -- the building blocks that agents compose into workflows. They are an intelligence layer on top of FileSpin REST APIs that securely mediate the AI Agent's calls to the FileSpin API.</p>
<table><thead><tr><th>Category</th><th>Summary</th></tr></thead><tbody><tr><td><strong>Asset management</strong></td><td>Search and inspect assets, upload new files, update metadata (single or bulk), discover schemas, and check account capabilities.</td></tr><tr><td><strong>Image transformation</strong></td><td>Generate on-brand image variants -- resizing, cropping, social-platform sizes, and logo or text watermarks.</td></tr><tr><td><strong>AI and addons</strong></td><td>Find related photos using face search and retrieve AI-generated labels with confidence scores.</td></tr><tr><td><strong>Sharing and distribution</strong></td><td>Create, list, and delete branded share pages; track analytics and approvals; and reuse share templates.</td></tr><tr><td><strong>Collections</strong></td><td>Create and search collections, manage included assets, and generate ZIP download links.</td></tr><tr><td><strong>Video</strong></td><td>Transcode videos, create trimmed/custom clips, and retrieve streaming URLs.</td></tr><tr><td><strong>Delivery</strong></td><td>Generate CDN view URLs and signed download URLs for assets.</td></tr></tbody></table>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="prompt-templates----pre-built-workflow-recipes">Prompt templates -- pre-built workflow recipes<a href="https://developers.filespin.io/guides/ai-agent-integration/#prompt-templates----pre-built-workflow-recipes" class="hash-link" aria-label="Direct link to Prompt templates -- pre-built workflow recipes" title="Direct link to Prompt templates -- pre-built workflow recipes" translate="no">​</a></h2>
<p>Prompt templates are the most powerful feature of the FileSpin MCP server. They are multi-step workflow recipes that guide the agent through complex operations. The agent discovers them automatically, and when invoked, receives a structured message that tells it exactly which tools to call and in what order.</p>
<p>The prompt templates are organised across <strong>11 categories</strong>:</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="industry-specific-workflows">Industry-specific workflows<a href="https://developers.filespin.io/guides/ai-agent-integration/#industry-specific-workflows" class="hash-link" aria-label="Direct link to Industry-specific workflows" title="Direct link to Industry-specific workflows" translate="no">​</a></h3>
<table><thead><tr><th>Workflow</th><th>Summary</th></tr></thead><tbody><tr><td><strong>E-commerce (2 prompts)</strong></td><td>Run end-to-end product-image workflows, including tagging, social output generation, review sharing, and marketplace-ready sizing.</td></tr><tr><td><strong>Events (2 prompts)</strong></td><td>Automate event media workflows with speaker/sponsor discovery, session tagging, social crops, and branded approval shares.</td></tr><tr><td><strong>Attractions (2 prompts)</strong></td><td>Support attraction photo operations with guest face discovery, preview watermarking, and branded gallery sharing.</td></tr></tbody></table>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="platform-workflows">Platform workflows<a href="https://developers.filespin.io/guides/ai-agent-integration/#platform-workflows" class="hash-link" aria-label="Direct link to Platform workflows" title="Direct link to Platform workflows" translate="no">​</a></h3>
<table><thead><tr><th>Workflow</th><th>Summary</th></tr></thead><tbody><tr><td><strong>Social Media (3 prompts)</strong></td><td>Generate platform-specific image sizes, apply logo watermarks, add text watermarks.</td></tr><tr><td><strong>AI Workflows (4 prompts)</strong></td><td>Face search by asset or URL, find addon-processed assets, retrieve AI auto-tags with confidence scores.</td></tr><tr><td><strong>Video Processing (2 prompts)</strong></td><td>Transcode with existing-conversion check (avoids redundant processing), create custom clips with trimming.</td></tr><tr><td><strong>Creative (2 prompts)</strong></td><td>Face-centered profile pictures at multiple sizes, responsive hero images for desktop/tablet/mobile.</td></tr><tr><td><strong>Branded Shares (8 prompts)</strong></td><td>Press kits, branded galleries, video showcases, review/approval pages, template-based shares, analytics review, approval status checks, expired share cleanup.</td></tr><tr><td><strong>Collections (3 prompts)</strong></td><td>Save search results to a collection, download collection as ZIP, update collection membership.</td></tr><tr><td><strong>Administration (4 prompts)</strong></td><td>Bulk tag photoshoot assets, audit metadata completeness, find assets needing review, standardize inconsistent metadata values.</td></tr><tr><td><strong>Content Creation (4 prompts)</strong></td><td>Save HTML reports, CSV exports, Markdown docs, and metadata CSV exports to FileSpin.</td></tr></tbody></table>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="how-prompts-work">How prompts work<a href="https://developers.filespin.io/guides/ai-agent-integration/#how-prompts-work" class="hash-link" aria-label="Direct link to How prompts work" title="Direct link to How prompts work" translate="no">​</a></h3>
<p>When a user says <em>"Process all product images from the summer shoot"</em>, the agent matches this to the prompt template and receives:</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">Process product images matching "summer shoot" uploaded recently:</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">1. Find images matching "summer shoot".</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">2. Discover the available metadata schema, then bulk-tag the matching assets with</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">   campaign = "Summer Campaign", category = "product", status = "ready".</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">3. Generate Instagram feed and Facebook post versions using branded image transformation.</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">4. Create a branded review page with approvals enabled for the buying team.</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">Give me the share URL and a summary of assets processed.</span><br></span></code></pre></div></div>
<p>The agent then executes each step, calling the appropriate tools in sequence, handling responses, and reporting back to the user.</p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="workflow-patterns">Workflow patterns<a href="https://developers.filespin.io/guides/ai-agent-integration/#workflow-patterns" class="hash-link" aria-label="Direct link to Workflow patterns" title="Direct link to Workflow patterns" translate="no">​</a></h2>
<p>When agents compose multi-step workflows -- whether guided by prompts or working from free-form instructions -- they follow a few canonical sequences:</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="discovery-first">Discovery first<a href="https://developers.filespin.io/guides/ai-agent-integration/#discovery-first" class="hash-link" aria-label="Direct link to Discovery first" title="Direct link to Discovery first" translate="no">​</a></h3>
<p>Before operating on assets, the agent checks what addons are enabled, discovers the available metadata schemas, and searches for assets matching the user's request.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="single-asset-inspection-and-delivery">Single-asset inspection and delivery<a href="https://developers.filespin.io/guides/ai-agent-integration/#single-asset-inspection-and-delivery" class="hash-link" aria-label="Direct link to Single-asset inspection and delivery" title="Direct link to Single-asset inspection and delivery" translate="no">​</a></h3>
<p>The agent fetches the asset's details, then returns a viewable CDN URL, a signed download URL, or a resized/cropped variant as needed.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="metadata-workflows">Metadata workflows<a href="https://developers.filespin.io/guides/ai-agent-integration/#metadata-workflows" class="hash-link" aria-label="Direct link to Metadata workflows" title="Direct link to Metadata workflows" translate="no">​</a></h3>
<p>The agent discovers the relevant schema, then updates fields on a single asset or bulk-tags many assets at once.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="external-sharing">External sharing<a href="https://developers.filespin.io/guides/ai-agent-integration/#external-sharing" class="hash-link" aria-label="Direct link to External sharing" title="Direct link to External sharing" translate="no">​</a></h3>
<p>The agent searches for the target assets (or picks up a collection), creates a branded share page, and can later pull analytics or approval status for that share.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="video-workflows">Video workflows<a href="https://developers.filespin.io/guides/ai-agent-integration/#video-workflows" class="hash-link" aria-label="Direct link to Video workflows" title="Direct link to Video workflows" translate="no">​</a></h3>
<p>The agent inspects the asset's existing conversions, transcodes or clips as required, and returns a streaming URL.</p>
<div class="theme-admonition theme-admonition-info admonition_xJq3 alert alert--info"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"></path></svg></span>info</div><div class="admonitionContent_BuS1"><p>The agent always checks asset data before video operations to verify the asset is a video and to inspect existing conversions -- avoiding redundant transcoding.</p></div></div>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="real-world-example-e-commerce-product-pipeline">Real-world example: E-commerce product pipeline<a href="https://developers.filespin.io/guides/ai-agent-integration/#real-world-example-e-commerce-product-pipeline" class="hash-link" aria-label="Direct link to Real-world example: E-commerce product pipeline" title="Direct link to Real-world example: E-commerce product pipeline" translate="no">​</a></h2>
<p><strong>User prompt:</strong> <em>"Tag all new arrivals by SKU, remove backgrounds, and send a review link to the buying team."</em></p>
<p>Here's what the agent does:</p>
<ol>
<li class=""><strong>Discover context.</strong> Confirms the Background Removal addon is enabled and retrieves the relevant metadata schema (fields: sku, category, status, campaign).</li>
<li class=""><strong>Find assets.</strong> Searches for recent "new arrivals" and returns 24 product images uploaded in the last 7 days.</li>
<li class=""><strong>Tag with metadata.</strong> Bulk-tags all 24 assets with category = "new-arrival", status = "pending-review", campaign = "Spring 2026".</li>
<li class=""><strong>Create review share.</strong> Creates a branded share page titled "Spring 2026 New Arrivals -- Review" with approvals and feedback enabled, expiring in seven days.</li>
</ol>
<p><strong>Agent response to user:</strong> <em>"Done. 24 new arrival images tagged with Spring 2026 campaign metadata. Review page with approval workflow that includes Social media versions: <a href="https://app.filespin.io/shared/sh_abc123" target="_blank" rel="noopener noreferrer" class="">https://app.filespin.io/shared/sh_abc123</a> -- the buying team can approve or reject each image directly."</em></p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="real-world-example-event-photo-distribution">Real-world example: Event photo distribution<a href="https://developers.filespin.io/guides/ai-agent-integration/#real-world-example-event-photo-distribution" class="hash-link" aria-label="Direct link to Real-world example: Event photo distribution" title="Direct link to Real-world example: Event photo distribution" translate="no">​</a></h2>
<p><strong>User prompt:</strong> <em>"Find all photos of the keynote speaker, tag by session, and build a branded share page for the press team."</em></p>
<p>Here's what the agent does:</p>
<ol>
<li class=""><strong>Face search.</strong> Uses the speaker's headshot to find all photos of this person across the event -- returns 87 matches with high matching strictness.</li>
<li class=""><strong>Tag by session.</strong> Retrieves the event schema and bulk-tags the 87 matching assets with speaker = "Jane Smith", session = "Opening Keynote", event = "TechConf 2026".</li>
<li class=""><strong>Branded press share.</strong> Creates a share page titled "TechConf 2026 -- Jane Smith Keynote Photos" with company branding (logo from watermark, primary colour #1a73e8), feedback enabled, expiring in one week.</li>
</ol>
<p><strong>Agent response:</strong> <em>"Found 87 photos of Jane Smith across all event sessions via face recognition. Tagged with speaker, session, and event metadata. Press share page with Social media crops: <a href="https://dashboard.filespin.io/shared/sh_press456" target="_blank" rel="noopener noreferrer" class="">https://dashboard.filespin.io/shared/sh_press456</a>"</em></p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="addon-availability-and-runtime-checks">Addon availability and runtime checks<a href="https://developers.filespin.io/guides/ai-agent-integration/#addon-availability-and-runtime-checks" class="hash-link" aria-label="Direct link to Addon availability and runtime checks" title="Direct link to Addon availability and runtime checks" translate="no">​</a></h2>
<p>Some capabilities depend on addons being enabled on your FileSpin account. The agent always verifies addon availability before attempting addon-dependent operations by querying the account's enabled addons through the MCP server.</p>
<table><thead><tr><th>Addon</th><th>Required for</th><th>Capability gated</th></tr></thead><tbody><tr><td><code>FACE_RECOGNITION</code></td><td>Face search across assets</td><td>Face search</td></tr><tr><td><code>IMAGE_ANALYSIS</code></td><td>AI auto-tagging on upload</td><td>Auto-tag retrieval</td></tr><tr><td><code>BACKGROUND_REMOVAL</code></td><td>AI background removal</td><td>Background removal processing</td></tr><tr><td><code>ON_DEMAND_IMAGE</code></td><td>Real-time image transformations</td><td>Resized/cropped variants and branded variant generation</td></tr></tbody></table>
<p>If an addon isn't enabled, the agent will report this to the user rather than failing silently.</p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="best-practices">Best practices<a href="https://developers.filespin.io/guides/ai-agent-integration/#best-practices" class="hash-link" aria-label="Direct link to Best practices" title="Direct link to Best practices" translate="no">​</a></h2>
<ol>
<li class="">
<p><strong>Create a dedicated agent user.</strong> Set up a FileSpin user account specifically for AI agent access. Assign the appropriate role for the agent's intended workflows. This gives you a clean audit trail and precise permission control.</p>
</li>
<li class="">
<p><strong>Use prompt templates for common workflows.</strong> Prompts encode best practices -- correct tool ordering, required checks, and sensible defaults. They're faster and more reliable than free-form instructions for repeatable operations.</p>
</li>
<li class="">
<p><strong>Check addon availability first.</strong> Have the agent call ask which addons are available before attempting face recognition, auto-tagging, or background removal to verify the addon is enabled.</p>
</li>
<li class="">
<p><strong>Use collections for internal grouping, shares for external distribution.</strong> Collections are for your team's organization. Shares create branded, trackable pages for external stakeholders -- with download controls, approval workflows, and analytics.</p>
</li>
<li class="">
<p><strong>Let the agent handle orchestration.</strong> Don't try to script every tool call. Describe the outcome you want and let the agent decide which tools to chain and in what order. This is what MCP is designed for.</p>
</li>
</ol>
<hr>]]></content:encoded>
            <category>ai-agents</category>
            <category>mcp</category>
            <category>integration</category>
            <category>automation</category>
            <category>getting-started</category>
        </item>
        <item>
            <title><![CDATA[FileSpin Teleport: Hybrid Cloud-Edge Media Processing]]></title>
            <link>https://developers.filespin.io/guides/teleport/</link>
            <guid>https://developers.filespin.io/guides/teleport/</guid>
            <pubDate>Fri, 13 Feb 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[How to deploy FileSpin Teleport on your local hardware for hybrid cloud-edge media operations -- install, configure, integrate via REST APIs and hot-folder ingest, and sync to FileSpin Cloud when connected.]]></description>
            <content:encoded><![CDATA[<p>How to deploy FileSpin Teleport on your local hardware for hybrid cloud-edge media operations -- install, configure, integrate via REST APIs and hot-folder ingest, and sync to FileSpin Cloud when connected.</p>
<p><img decoding="async" loading="lazy" alt="Teleport Architecture" src="https://developers.filespin.io/assets/images/teleport-architecture-f5ffd3ab5f0e7df95089ad6cd8af08d5.svg" width="920" height="420" class="img_ev3q"></p>
<p>Cloud-only operation assumes reliable internet. For most teams -- eCommerce, agencies, publishing -- that assumption largely holds. But event venues with unreliable Wi-Fi, attractions that process and deliver media, remote sites with no connectivity, and operations with data sovereignty requirements -- cloud-only breaks down.</p>
<p>Teleport is FileSpin's hybrid deployment model. A single binary that runs the core media processing pipeline on your local hardware -- ingest, transform, watermark, transcode, search, deliver -- with zero internet dependency. When connected, cloud-powered features like face recognition and background removal activate in real time. Once assets sync to FileSpin Cloud, the full intelligence layer takes over: AI agents, workflow engines, extended APIs.</p>
<p>This guide covers the architecture, installation, local APIs, hot-folder workflows, and cloud sync -- everything your engineering team needs to deploy and integrate Teleport.</p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="architecture-three-capability-tiers">Architecture: Three capability tiers<a href="https://developers.filespin.io/guides/teleport/#architecture-three-capability-tiers" class="hash-link" aria-label="Direct link to Architecture: Three capability tiers" title="Direct link to Architecture: Three capability tiers" translate="no">​</a></h2>
<p>Teleport's capabilities scale with connectivity. Nothing fails when the network drops -- features degrade gracefully across three tiers.</p>
<table><thead><tr><th>Tier</th><th>Connectivity</th><th>What runs</th><th>Examples</th></tr></thead><tbody><tr><td><strong>Always Local</strong></td><td>None required</td><td>Ingest, transform, watermark, transcode, search, deliver, metadata, cache</td><td>Guest photo previews, social variants, jury panel streaming, field capture processing</td></tr><tr><td><strong>Cloud Pass-Through</strong></td><td>Active connection</td><td>Face recognition, background removal, shares, collections</td><td>Guest galleries linked by face across rides, branded share pages for sponsors, background-free photos on-site</td></tr><tr><td><strong>Cloud-Only</strong></td><td>After sync</td><td>AI auto-tagging, AI agents (Claude, ChatGPT, Mistral), workflow engines (Make, Zapier, n8n), extended APIs</td><td>Automated classification, natural language workflows, downstream distribution pipelines</td></tr></tbody></table>
<p>The Always Local tier is Teleport's foundation. It runs entirely on your hardware -- no cloud round-trip, no upload queue, no network dependency. The other two tiers add intelligence as connectivity permits, but local operations never wait for them.</p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="what-teleport-exposes-locally">What Teleport exposes locally<a href="https://developers.filespin.io/guides/teleport/#what-teleport-exposes-locally" class="hash-link" aria-label="Direct link to What Teleport exposes locally" title="Direct link to What Teleport exposes locally" translate="no">​</a></h2>
<p>Teleport monitors the designed hot folder for assets. It also runs a REST API server on your hardware that mirrors a subset of the FileSpin Cloud API -- the endpoints built for local operations. Your capture systems, POS, and guest apps integrate via these local endpoints at local speed.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="hot-folder-ingest">Hot-folder ingest<a href="https://developers.filespin.io/guides/teleport/#hot-folder-ingest" class="hash-link" aria-label="Direct link to Hot-folder ingest" title="Direct link to Hot-folder ingest" translate="no">​</a></h3>
<p>Drop files into a watched directory and Teleport processes them automatically -- no API calls required.</p>
<p><img decoding="async" loading="lazy" alt="Hot-folder ingest flow" src="https://developers.filespin.io/assets/images/hotfolder-ingest-0c82807b988bd69cf0ce013e64467bf3.svg" width="820" height="100" class="img_ev3q"></p>
<p>The file watcher detects new files, validates them, assigns an asset ID, queues them for upload, and moves them through the lifecycle. Configurable stability wait handles files still being written -- critical for network drives and large transfers.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="rest-api-endpoints">REST API endpoints<a href="https://developers.filespin.io/guides/teleport/#rest-api-endpoints" class="hash-link" aria-label="Direct link to REST API endpoints" title="Direct link to REST API endpoints" translate="no">​</a></h3>
<table><thead><tr><th>Endpoint</th><th>Method</th><th>What it does</th></tr></thead><tbody><tr><td><code>/api/v1/assets/new/content/original/upload</code></td><td>POST</td><td>Upload an asset (multipart or binary)</td></tr><tr><td><code>/api/v1/assets/search</code></td><td>POST</td><td>Search assets by keyword, metadata, content type, date range</td></tr><tr><td><code>/api/v1/assets/{id}/data</code></td><td>GET</td><td>Get full asset metadata, custom data, and status</td></tr><tr><td><code>/api/v1/assets/{id}/data/update</code></td><td>POST</td><td>Update custom metadata fields</td></tr><tr><td><code>/api/v1/assets/{id}/conversions</code></td><td>GET</td><td>Get image conversions (resize, crop, format)</td></tr><tr><td><code>/api/v1/assets/{id}/get_link</code></td><td>GET</td><td>Get a signed content URL for delivery</td></tr><tr><td><code>/api/v1/assets/get_link</code></td><td>POST</td><td>Get signed URLs for multiple assets in one call</td></tr><tr><td><code>/api/v1/assets/{id}/content/{key}/download</code></td><td>GET</td><td>Download original or converted content</td></tr><tr><td><code>/api/v1/assets/{id}/content/original/replace</code></td><td>POST</td><td>Replace an asset's content</td></tr><tr><td><code>/api/v1/assets/{id}/transcodes/{key}</code></td><td>GET</td><td>Stream video transcodes</td></tr><tr><td><code>/api/v1/schemas</code></td><td>GET</td><td>List all cached asset schemas</td></tr><tr><td><code>/api/v1/schemas/{id}</code></td><td>GET</td><td>Get a single schema definition</td></tr></tbody></table>
<p>Authentication uses the same <code>X-FileSpin-Api-Key</code> header as the Cloud API. Teleport validates locally against your configured API key.</p>
<div class="theme-admonition theme-admonition-tip admonition_xJq3 alert alert--success"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>tip</div><div class="admonitionContent_BuS1"><p>API Key validation can be optionally turned off for access from trusted clients. All cURL examples shown in this guide assume trusted client access.</p></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="web-dashboard">Web dashboard<a href="https://developers.filespin.io/guides/teleport/#web-dashboard" class="hash-link" aria-label="Direct link to Web dashboard" title="Direct link to Web dashboard" translate="no">​</a></h3>
<p>Teleport includes a local web UI.</p>
<p><strong>Dashboard Home</strong>
<img decoding="async" loading="lazy" alt="Teleport Architecture" src="https://developers.filespin.io/assets/images/teleport-dashboard-7f0490e2e40f7ed64fa9cdc1f32ee238.png" width="1200" height="1220" class="img_ev3q"></p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="install-teleport">Install Teleport<a href="https://developers.filespin.io/guides/teleport/#install-teleport" class="hash-link" aria-label="Direct link to Install Teleport" title="Direct link to Install Teleport" translate="no">​</a></h2>
<p>Teleport is a single binary. No dependencies, no runtime, no container. Download and install as a service on Windows, Mac or Linux.</p>
<p><a href="https://filespin.io/" target="_blank" rel="noopener noreferrer" class="">Get in touch to start a Free Trial</a></p>
<p><img decoding="async" loading="lazy" alt="Download Teleport" src="https://developers.filespin.io/assets/images/teleport-download-985fa380cb0b1359a111d7ce3a62cb37.png" width="1200" height="1175" class="img_ev3q"></p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="hardware-benchmark">Hardware benchmark<a href="https://developers.filespin.io/guides/teleport/#hardware-benchmark" class="hash-link" aria-label="Direct link to Hardware benchmark" title="Direct link to Hardware benchmark" translate="no">​</a></h2>
<p>Teleport includes a built-in benchmark to evaluate your hardware before deployment. Use the Performance Tests option in Teleport Web Dashboard or execute it via commandline for automated tests.</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic"># Interactive web UI</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">teleport </span><span class="token parameter variable" style="color:#36acaa">--benchmark</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># CLI output (headless, for automation)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">teleport </span><span class="token parameter variable" style="color:#36acaa">--benchmark</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">--headless</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">--output</span><span class="token plain"> text</span><br></span></code></pre></div></div>
<p>The benchmark measures API throughput, image processing speed, file I/O performance, and video delivery -- and produces a performance score with specific latency percentiles.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="configure-settings">Configure Settings<a href="https://developers.filespin.io/guides/teleport/#configure-settings" class="hash-link" aria-label="Direct link to Configure Settings" title="Direct link to Configure Settings" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="hot-folder-and-cache-purge-settings">Hot folder and cache purge settings<a href="https://developers.filespin.io/guides/teleport/#hot-folder-and-cache-purge-settings" class="hash-link" aria-label="Direct link to Hot folder and cache purge settings" title="Direct link to Hot folder and cache purge settings" translate="no">​</a></h3>
<p>Use the Settings page to update the hot folder settings.</p>
<table><thead><tr><th>Folder</th><th>Purpose</th><th>Auto-cleaned</th></tr></thead><tbody><tr><td><code>hotfolder/</code></td><td>Drop files here</td><td>Yes -- moved to queued</td></tr><tr><td><code>queued/</code></td><td>Waiting for upload</td><td>Yes -- moved to archived or errors</td></tr><tr><td><code>archived/</code></td><td>Successfully uploaded</td><td>Yes -- purged on schedule</td></tr><tr><td><code>archived/preserved/</code></td><td>Protected from purge</td><td>No -- manual only</td></tr><tr><td><code>errors/</code></td><td>Failed after 30 retries</td><td>No -- review and retry</td></tr><tr><td><code>cache/</code></td><td>Processed images, video posters</td><td>Yes -- LRU eviction</td></tr></tbody></table>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="retention-settings">Retention settings<a href="https://developers.filespin.io/guides/teleport/#retention-settings" class="hash-link" aria-label="Direct link to Retention settings" title="Direct link to Retention settings" translate="no">​</a></h3>
<p>Asset Retention Policies. Configure which assets should be retained and never purged. Add asset IDs or create metadata-based rules.</p>
<p><img decoding="async" loading="lazy" alt="Teleport Retention Settings" src="https://developers.filespin.io/assets/images/teleport-asset-retention-settings-e97758149c238aa694fcfb779e280c5e.png" width="1200" height="943" class="img_ev3q"></p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="local-only-assets-settings">Local-only Assets Settings<a href="https://developers.filespin.io/guides/teleport/#local-only-assets-settings" class="hash-link" aria-label="Direct link to Local-only Assets Settings" title="Direct link to Local-only Assets Settings" translate="no">​</a></h3>
<p>Local-only assets for total privacy control. Configure rules for assets that should be kept locally and not uploaded to FileSpin Cloud.</p>
<p><img decoding="async" loading="lazy" alt="Teleport Retention Settings" src="https://developers.filespin.io/assets/images/teleport-local-only-asset-settings-a0cc1789bf3f542efe210a07a3da962b.png" width="1200" height="943" class="img_ev3q"></p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="multi-site-visibility-via-cloud-dashboard">Multi-Site Visibility via Cloud Dashboard<a href="https://developers.filespin.io/guides/teleport/#multi-site-visibility-via-cloud-dashboard" class="hash-link" aria-label="Direct link to Multi-Site Visibility via Cloud Dashboard" title="Direct link to Multi-Site Visibility via Cloud Dashboard" translate="no">​</a></h3>
<p>Cloud dashboard monitors all Teleport instances. Status, performance, and telemetry across distributed deployments.</p>
<p><img decoding="async" loading="lazy" alt="Teleport Retention Settings" src="https://developers.filespin.io/assets/images/cloud-teleports-dashboard-8d15921705ff8bb071c319e8ad4c588b.png" width="1200" height="1076" class="img_ev3q"></p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="fetch-from-cloud">Fetch from Cloud<a href="https://developers.filespin.io/guides/teleport/#fetch-from-cloud" class="hash-link" aria-label="Direct link to Fetch from Cloud" title="Direct link to Fetch from Cloud" translate="no">​</a></h2>
<p>Fetch assets selectively from Cloud for local-first delivery. Use this to bring centrally managed assets for local delivery. Deliver event media on-site without worrying about internet connectivity.</p>
<p><img decoding="async" loading="lazy" alt="Teleport Cloud Fetch" src="https://developers.filespin.io/assets/images/teleport-fetch-from-cloud-33eb3009ce3beb72488180b1b8e6db5e.png" width="1200" height="964" class="img_ev3q"></p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="recipe-walkthrough">Recipe walkthrough<a href="https://developers.filespin.io/guides/teleport/#recipe-walkthrough" class="hash-link" aria-label="Direct link to Recipe walkthrough" title="Direct link to Recipe walkthrough" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="event-photography-pipeline">Event photography pipeline<a href="https://developers.filespin.io/guides/teleport/#event-photography-pipeline" class="hash-link" aria-label="Direct link to Event photography pipeline" title="Direct link to Event photography pipeline" translate="no">​</a></h3>
<p><img decoding="async" loading="lazy" alt="Event photography pipeline steps" src="https://developers.filespin.io/assets/images/recipe-teleport-event-5770289219919a74b930d58cb382a2bd.svg" width="880" height="100" class="img_ev3q"></p>
<p>A conference photography team captures thousands of images over a multi-day event. Venue Wi-Fi is unreliable. Sponsors expect same-day delivery. The social team needs platform-ready variants during sessions.</p>
<p><strong>1. Deploy Teleport at the venue</strong>
Install Teleport on a venue server or workstation. Configure the hot folder path and FileSpin Cloud connection. Takes under 10 minutes.</p>
<p><strong>2. Photographers dump camera cards to the hot folder</strong>
Photographers ingest directly -- drag camera card contents to the hot folder, or configure their tethering software to write to it. Teleport detects files, assigns asset IDs, and begins processing.</p>
<p><strong>3. Generate social variants locally</strong>
Your integration calls the conversions endpoint to generate platform-ready sizes:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic"># Instagram square</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">curl</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"http://localhost:8080/api/v1/assets/{id}/conversions?resize=1080,1080&amp;format=jpg"</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">\</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token parameter variable" style="color:#36acaa">--output</span><span class="token plain"> ig.jpg</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># LinkedIn landscape</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">curl</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"http://localhost:8080/api/v1/assets/{id}/conversions?resize=1200,627&amp;format=jpg"</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">\</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token parameter variable" style="color:#36acaa">--output</span><span class="token plain"> linkedin.jpg</span><br></span></code></pre></div></div>
<p>All processed locally -- no upload wait, no cloud latency.</p>
<p><strong>4. Apply event watermarks</strong>
Use the conversions endpoint with watermark parameters to brand assets before distribution.</p>
<p><strong>5. When venue Wi-Fi connects -- cloud pass-through activates</strong>
Face recognition identifies speakers and VIPs across thousands of photos in real time. Branded share pages become available for sponsor distribution. If connectivity drops, local processing continues.</p>
<p><strong>6. Assets sync to FileSpin Cloud</strong>
Once synced, the full automation stack activates: AI auto-tagging classifies by session, speaker, and sponsor. Make/Zapier pipelines trigger downstream distribution -- press kits, social scheduling, sponsor deliverables.</p>
<hr>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="attractions-guest-imaging">Attractions guest imaging<a href="https://developers.filespin.io/guides/teleport/#attractions-guest-imaging" class="hash-link" aria-label="Direct link to Attractions guest imaging" title="Direct link to Attractions guest imaging" translate="no">​</a></h3>
<p><img decoding="async" loading="lazy" alt="Attractions guest imaging pipeline steps" src="https://developers.filespin.io/assets/images/recipe-teleport-attractions-cbf244efe82e45ef99bf22d6305157ae.svg" width="760" height="100" class="img_ev3q"></p>
<p>A theme park processes millions of guest photos daily. The business runs on preview-to-purchase -- if the watermarked preview is slow, the sale is lost.</p>
<p><strong>1. Ride capture system uploads via REST API</strong>
The capture system sends photos to Teleport's upload endpoint immediately after capture:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token function" style="color:#d73a49">curl</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">-X</span><span class="token plain"> POST </span><span class="token string" style="color:#e3116c">"http://localhost:8080/api/v1/assets/new/content/original/upload"</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">\</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token parameter variable" style="color:#36acaa">-F</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"file=@ride-photo-001.jpg"</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">\</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token parameter variable" style="color:#36acaa">-F</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"data={</span><span class="token string entity" style="color:#36acaa">\"</span><span class="token string" style="color:#e3116c">ride</span><span class="token string entity" style="color:#36acaa">\"</span><span class="token string" style="color:#e3116c">:</span><span class="token string entity" style="color:#36acaa">\"</span><span class="token string" style="color:#e3116c">coaster-1</span><span class="token string entity" style="color:#36acaa">\"</span><span class="token string" style="color:#e3116c">}"</span><br></span></code></pre></div></div>
<p><strong>2. Generate watermarked preview locally</strong>
The guest app requests a watermarked preview via the conversions endpoint -- sub-10ms response, no cloud round-trip:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token function" style="color:#d73a49">curl</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"http://localhost:8080/api/v1/assets/{id}/conversions?resize=800,600&amp;watermark={params}"</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">\</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token parameter variable" style="color:#36acaa">--output</span><span class="token plain"> preview.jpg</span><br></span></code></pre></div></div>
<p>Guest sees the preview the moment they step off the ride.</p>
<p><strong>3. Face recognition links captures across the park (when connected)</strong>
At connected venues, Teleport's cloud pass-through enables face recognition in real time -- a single face search discovers photos from rides, meet-and-greets, roaming photographers, and green screen stations. Unified guest galleries drive cross-venue photo discovery and incremental sales.</p>
<p><strong>4. Purchase triggers high-quality download</strong>
On purchase, the guest app requests the unwatermarked original via <code>get_link</code>:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token function" style="color:#d73a49">curl</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"http://localhost:8080/api/v1/assets/{id}/get_link"</span><br></span></code></pre></div></div>
<p><strong>5. Selective sync to cloud</strong>
Not every guest photo needs cloud backup. Configure sync rules to upload purchased photos, flagged assets, or a configurable percentage -- typically 15–20% of total captures. The rest stays local with configurable retention.</p>
<hr>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="awards-festival-judging">Awards festival judging<a href="https://developers.filespin.io/guides/teleport/#awards-festival-judging" class="hash-link" aria-label="Direct link to Awards festival judging" title="Direct link to Awards festival judging" translate="no">​</a></h3>
<p><img decoding="async" loading="lazy" alt="Awards festival judging pipeline steps" src="https://developers.filespin.io/assets/images/recipe-teleport-awards-688ea906e9ea2b88d8bfe8886df693a0.svg" width="880" height="100" class="img_ev3q"></p>
<p>A creative awards festival runs on-site judging across multiple jury rooms. Entries include 30-second films, print campaigns, digital experiences, and case study videos. Jury panels need instant video playback and high-res image viewing -- but venue Wi-Fi collapses under load. The old way: USB drives shuttled between rooms, inconsistent playback quality, and no way to search or filter entries during deliberation.</p>
<p><strong>1. Deploy Teleport at the venue</strong>
Install Teleport on a workstation in each jury room -- or a single server serving multiple rooms over the local network. Configure the FileSpin Cloud connection and run the benchmark to confirm playback performance meets requirements.</p>
<p><strong>2. Fetch shortlisted entries from Cloud</strong>
Use Teleport's Fetch from Cloud feature to pre-load the shortlisted entries for each category before judging begins. Entries arrive with all metadata intact -- category, entrant, agency, brand, country. The jury room now has everything locally.</p>
<p><strong>3. Jury browses and searches entries locally</strong>
The judging app queries Teleport's local search API to filter entries by category, subcategory, or entrant -- no internet required:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token function" style="color:#d73a49">curl</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">-X</span><span class="token plain"> POST </span><span class="token string" style="color:#e3116c">"http://localhost:8080/api/v1/assets/search"</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">\</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token parameter variable" style="color:#36acaa">-H</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"Content-Type: application/json"</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">\</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token parameter variable" style="color:#36acaa">-d</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'{"query": "", "filters": {"category": "Film Craft"}, "sort": "entrant", "size": 50}'</span><br></span></code></pre></div></div>
<p>Sub-10ms response times. Judges navigate entries without waiting.</p>
<p><strong>4. Instant video playback from local hardware</strong>
Film and case study entries stream directly from Teleport -- no buffering, no cloud round-trip:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token function" style="color:#d73a49">curl</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"http://localhost:8080/api/v1/assets/{id}/transcodes/1080p-video.mp4"</span><br></span></code></pre></div></div>
<p>For print and digital entries, the conversions endpoint serves high-res previews locally:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token function" style="color:#d73a49">curl</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"http://localhost:8080/api/v1/assets/{id}/conversions?resize=2560,1400&amp;format=jpg"</span><br></span></code></pre></div></div>
<p><strong>5. Scoring and deliberation via share pages (when connected)</strong>
When venue connectivity permits, Teleport's cloud pass-through enables <a class="" href="https://developers.filespin.io/guides/sharing-assets/">branded share pages</a> for formal scoring. Create per-category share pages with the "Confidential Review" template -- jurors approve or reject entries with notes, and the jury president tracks progress through analytics. If connectivity drops, local browsing and playback continue uninterrupted.</p>
<p><strong>6. Sync winners and archive to Cloud</strong>
After judging concludes, sync winning entries and the full shortlist to FileSpin Cloud. The automation stack activates: AI agents assemble press kits, workflow engines trigger winner notifications, and branded share pages deliver clean originals to winners and press teams. Configure preservation rules so award entries survive local cleanup.</p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="upgrading-teleport">Upgrading Teleport<a href="https://developers.filespin.io/guides/teleport/#upgrading-teleport" class="hash-link" aria-label="Direct link to Upgrading Teleport" title="Direct link to Upgrading Teleport" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="dashboard-upgrade-recommended">Dashboard upgrade (recommended)<a href="https://developers.filespin.io/guides/teleport/#dashboard-upgrade-recommended" class="hash-link" aria-label="Direct link to Dashboard upgrade (recommended)" title="Direct link to Dashboard upgrade (recommended)" translate="no">​</a></h3>
<p>When a new version is available, Teleport shows an upgrade banner on the dashboard. Click <strong>Upgrade Now</strong> -- Teleport backs up the database and previous binary, downloads the new version, and restarts automatically. Typically under 30 seconds of downtime.</p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="best-practices">Best practices<a href="https://developers.filespin.io/guides/teleport/#best-practices" class="hash-link" aria-label="Direct link to Best practices" title="Direct link to Best practices" translate="no">​</a></h2>
<ol>
<li class="">
<p><strong>Use SSD for hot folder and staging.</strong> File watcher performance and upload throughput scale directly with disk I/O speed. Putting hot folder and staging on the same SSD drive avoids cross-device moves.</p>
<ol>
<li class=""><strong>Set <code>file_stability_wait</code> for network drives.</strong> If your hot folder is on a NAS or network share, files may still be writing when detected. A 30-second stability wait prevents partial uploads (more details are in the Operation Guide).</li>
</ol>
</li>
<li class="">
<p><strong>Size the queue for your peak volume.</strong> Default is 10,000. Event venues processing 20,000+ assets in a day should increase <code>queue_size</code> to 50,000 (more details are in the Operation Guide). Attractions with continuous capture may need more.</p>
</li>
<li class="">
<p><strong>Use preservation rules for critical assets.</strong> Archived assets are auto-purged based on retention settings. Tag hero images, purchased guest photos, or award entries as preserved so they survive cleanup.</p>
</li>
<li class="">
<p><strong>Configure selective sync rules.</strong> Not every locally processed asset needs cloud backup. Sync purchased photos, approved assets, or a percentage -- reduces bandwidth and cloud storage costs by 80%+.</p>
</li>
<li class="">
<p><strong>Run the benchmark before deployment.</strong> <code>teleport --benchmark --headless</code> gives you concrete performance numbers for your specific hardware. Use the results for capacity planning and to validate that your edge hardware meets throughput requirements.</p>
</li>
</ol>
<hr>]]></content:encoded>
            <category>teleport</category>
            <category>hybrid</category>
            <category>edge</category>
            <category>deployment</category>
            <category>offline</category>
            <category>local-processing</category>
            <category>getting-started</category>
        </item>
        <item>
            <title><![CDATA[Branded Share Pages — Distribution, Review, and Delivery]]></title>
            <link>https://developers.filespin.io/guides/sharing-assets/</link>
            <guid>https://developers.filespin.io/guides/sharing-assets/</guid>
            <pubDate>Wed, 11 Feb 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[How to use branded share pages to replace zip-and-email workflows — sponsor deliverables, wholesale portals, press kits, client review cycles, and guest photo delivery with approval workflows, download controls, and analytics.]]></description>
            <content:encoded><![CDATA[<p>How to use branded share pages to replace zip-and-email workflows — sponsor deliverables, wholesale portals, press kits, client review cycles, and guest photo delivery with approval workflows, download controls, and analytics.</p>
<p>Every team that works with external stakeholders hits the same bottleneck: getting the right assets to the right people in the right format, with some control over what happens next. The standard workflow — zip a folder, upload to WeTransfer, email a link, hope they download the right version — breaks down the moment you need tracking, branding, feedback, or approval.</p>
<p>Branded share pages replace that cycle. A share creates a branded, hosted page with a curated set of assets — configurable download options (including social media sizes), password protection, expiry dates, feedback collection, approval workflows, and full analytics on who viewed and downloaded what. No FileSpin account required for recipients.</p>
<p>Event teams use shares to deliver sponsor packages same-day. Wholesale teams use them as partner portals with controlled formats. Press teams use them for embargoed content with watermark protection. Attractions operators use them for guest photo discovery. And AI agents can assemble any of these from a single prompt.</p>
<p>This guide covers how to create and manage shares — from the Dashboard, through AI agents, or via workflow automation — plus real-world recipes for common distribution patterns.</p>
<p><img decoding="async" loading="lazy" alt="Sharing Assets Workflow" src="https://developers.filespin.io/assets/images/sharing-assets-workflow-f8d2d468e8ecf44d5cb0e37942c55c03.svg" width="900" height="380" class="img_ev3q"></p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="creating-shares-from-the-dashboard">Creating shares from the Dashboard<a href="https://developers.filespin.io/guides/sharing-assets/#creating-shares-from-the-dashboard" class="hash-link" aria-label="Direct link to Creating shares from the Dashboard" title="Direct link to Creating shares from the Dashboard" translate="no">​</a></h2>
<p>The fastest way to create a share is directly from the FileSpin Dashboard. Select one or more assets, click <strong>Share</strong>, and configure the options.</p>
<p><img decoding="async" loading="lazy" alt="Share Page" src="https://developers.filespin.io/assets/images/share-create-b71e22bc5ce680d06cf588373b99ed1c.png" width="1200" height="873" class="img_ev3q"></p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="share-settings">Share settings<a href="https://developers.filespin.io/guides/sharing-assets/#share-settings" class="hash-link" aria-label="Direct link to Share settings" title="Direct link to Share settings" translate="no">​</a></h3>
<p>When creating a share, you configure:</p>
<table><thead><tr><th>Setting</th><th>What it controls</th></tr></thead><tbody><tr><td><strong>Title</strong></td><td>Display name shown on the share page</td></tr><tr><td><strong>Expiry</strong></td><td>Auto-expire date — recipients lose access after this</td></tr><tr><td><strong>Password</strong></td><td>Optional password protection for sensitive content</td></tr><tr><td><strong>Branding</strong></td><td>Logo, primary color, background color</td></tr><tr><td><strong>Watermark</strong></td><td>Overlay your watermark on all previews and downloads</td></tr><tr><td><strong>Download options</strong></td><td>Control formats — originals, ODI sizes, video transcodes</td></tr><tr><td><strong>Feedback</strong></td><td>Enable comments from reviewers</td></tr><tr><td><strong>Approvals</strong></td><td>Enable approve/reject per asset</td></tr></tbody></table>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-share-page">The share page<a href="https://developers.filespin.io/guides/sharing-assets/#the-share-page" class="hash-link" aria-label="Direct link to The share page" title="Direct link to The share page" translate="no">​</a></h3>
<p>Once created, you get a branded URL that recipients open directly — no login, no account, no software to install.</p>
<p><img decoding="async" loading="lazy" alt="Share Page" src="https://developers.filespin.io/assets/images/share-page-b5ed6be33cc86e911f4eb6744b6be754.png" width="1200" height="1024" class="img_ev3q"></p>
<p>Recipients see a clean, branded page with your logo and colors. Depending on your settings, they can browse assets, leave comments, approve or reject individual items, and download in the formats you've made available.</p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="creating-shares-with-ai-agents">Creating shares with AI agents<a href="https://developers.filespin.io/guides/sharing-assets/#creating-shares-with-ai-agents" class="hash-link" aria-label="Direct link to Creating shares with AI agents" title="Direct link to Creating shares with AI agents" translate="no">​</a></h2>
<p>FileSpin's MCP integration lets AI agents create shares through natural language. Instead of manually selecting assets and configuring settings, describe what you need:</p>
<blockquote>
<p><em>"Find all photos tagged 'Gold Sponsor - Acme Corp' from Day 1 of the conference, create a branded share page with our event branding and password protection, and give me the link."</em></p>
</blockquote>
<p>The agent searches your library, filters by tags, creates the share with your branding template, and returns the URL — all from a single prompt.</p>
<p>Common agent-driven share workflows:</p>
<ul>
<li class=""><strong>Sponsor delivery:</strong> <em>"Create share pages for each sponsor from yesterday's event, branded with our event logo, password-protected, expiring in 30 days."</em></li>
<li class=""><strong>Client review:</strong> <em>"Share the latest hero images with the client for approval. Enable feedback and watermark everything."</em></li>
<li class=""><strong>Press kit:</strong> <em>"Assemble a press kit with the five approved product shots and the launch video. Watermark it, set a 7-day expiry."</em></li>
</ul>
<p>For setup details, see the <a class="" href="https://developers.filespin.io/guides/ai-agent-integration/">AI Agent Integration guide</a>.</p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="creating-shares-with-workflow-engines---coming-soon">Creating shares with workflow engines - COMING SOON<a href="https://developers.filespin.io/guides/sharing-assets/#creating-shares-with-workflow-engines---coming-soon" class="hash-link" aria-label="Direct link to Creating shares with workflow engines - COMING SOON" title="Direct link to Creating shares with workflow engines - COMING SOON" translate="no">​</a></h2>
<p>Workflow engines like Make, Zapier, and n8n can create shares automatically based on triggers — new assets uploaded, tags applied, approval status changed.</p>
<p><strong>Example: Auto-create sponsor share in Make</strong>
A Make scenario watches for assets tagged with a sponsor name. When the batch is complete (triggered by a "batch complete" tag or a scheduled check), the scenario creates a branded share page with the sponsor's assets, applies the event branding template, and sends the share URL via email to the sponsor contact.</p>
<p><strong>Example: Post-approval delivery in n8n</strong>
An n8n workflow monitors approval status. When all assets in a collection are approved, the workflow creates a clean (unwatermarked) share with high-res download options and notifies the client that final deliverables are ready.</p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="share-features">Share features<a href="https://developers.filespin.io/guides/sharing-assets/#share-features" class="hash-link" aria-label="Direct link to Share features" title="Direct link to Share features" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="branding">Branding<a href="https://developers.filespin.io/guides/sharing-assets/#branding" class="hash-link" aria-label="Direct link to Branding" title="Direct link to Branding" translate="no">​</a></h3>
<p>Every share page can carry your brand identity — logo, colors, and background. Set these per share, or save them as part of a template to reuse across all your distribution workflows.</p>
<table><thead><tr><th>Option</th><th>Description</th></tr></thead><tbody><tr><td><strong>Logo</strong></td><td>Use your account watermark image or any asset from your library</td></tr><tr><td><strong>Primary color</strong></td><td>Buttons, links, and accents</td></tr><tr><td><strong>Background color</strong></td><td>Page background</td></tr></tbody></table>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="watermark-protection">Watermark protection<a href="https://developers.filespin.io/guides/sharing-assets/#watermark-protection" class="hash-link" aria-label="Direct link to Watermark protection" title="Direct link to Watermark protection" translate="no">​</a></h3>
<p>Enable watermarks to overlay your account watermark on all image and video previews and downloads. Useful during review phases — watermarks deter screenshot-based theft and signal that assets aren't final. Switch to clean downloads for final delivery.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="download-options">Download options<a href="https://developers.filespin.io/guides/sharing-assets/#download-options" class="hash-link" aria-label="Direct link to Download options" title="Direct link to Download options" translate="no">​</a></h3>
<p>Control exactly what recipients can download:</p>
<table><thead><tr><th>Content type</th><th>Options</th></tr></thead><tbody><tr><td><strong>Images</strong></td><td>Original files, ODI-transformed sizes (any dimension, format), social media presets</td></tr><tr><td><strong>Video</strong></td><td>1080p, 720p, or other available transcodes</td></tr><tr><td><strong>Documents</strong></td><td>PDF and other available formats</td></tr></tbody></table>
<p>With ODI (On-Demand Imaging) enabled, recipients can download images in any size — including social media dimensions — directly from the share page.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="feedback-and-comments">Feedback and comments<a href="https://developers.filespin.io/guides/sharing-assets/#feedback-and-comments" class="hash-link" aria-label="Direct link to Feedback and comments" title="Direct link to Feedback and comments" translate="no">​</a></h3>
<p>Enable comments so reviewers provide feedback directly on shared assets. Reviewers access the share link and submit comments — no authentication required. Comments can be attached to specific assets or left at the share level. Reviewers optionally provide their name and email.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="approval-workflows">Approval workflows<a href="https://developers.filespin.io/guides/sharing-assets/#approval-workflows" class="hash-link" aria-label="Direct link to Approval workflows" title="Direct link to Approval workflows" translate="no">​</a></h3>
<p>For formal review processes, enable approvals so reviewers can approve or reject individual assets with notes. The share owner sees approval status per asset — approved, rejected, or pending — along with reviewer comments and timestamps.</p>
<p>This powers the review-revise-deliver cycle: share watermarked assets for review, collect approvals, fix rejected items, re-share if needed, then deliver clean originals once approved.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="analytics">Analytics<a href="https://developers.filespin.io/guides/sharing-assets/#analytics" class="hash-link" aria-label="Direct link to Analytics" title="Direct link to Analytics" translate="no">​</a></h3>
<p>Every share automatically tracks engagement.</p>
<p><img decoding="async" loading="lazy" alt="Asset Share Analytics" src="https://developers.filespin.io/assets/images/share_analytics-47767f7e51a65ad86aabb7dd11d15ff5.png" width="1200" height="1108" class="img_ev3q"></p>
<table><thead><tr><th>Metric</th><th>What it tells you</th></tr></thead><tbody><tr><td><strong>Total views</strong></td><td>How many times the page was accessed</td></tr><tr><td><strong>Downloads by format</strong></td><td>Which formats are most popular</td></tr><tr><td><strong>Downloads by asset</strong></td><td>Which specific assets were downloaded</td></tr><tr><td><strong>Recent activity</strong></td><td>Last download events with timestamps</td></tr><tr><td><strong>Approval status</strong></td><td>Per-asset approval/rejection status and notes</td></tr></tbody></table>
<p>Analytics provide proof of delivery for contractual obligations, and help you understand how recipients engage with your content.</p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="share-templates">Share templates<a href="https://developers.filespin.io/guides/sharing-assets/#share-templates" class="hash-link" aria-label="Direct link to Share templates" title="Direct link to Share templates" translate="no">​</a></h2>
<p>If you create shares with the same settings repeatedly, templates save time and ensure consistency. FileSpin provides 8 ready-to-use preset templates:</p>
<p><img decoding="async" loading="lazy" alt="Share Template Presets" src="https://developers.filespin.io/assets/images/share_template_presets-b9a11e05f04bd3ad3e200e085a174752.png" width="1200" height="917" class="img_ev3q"></p>
<table><thead><tr><th>Template</th><th>Downloads</th><th>Feedback</th><th>Approval</th><th>Expiry</th><th>Best for</th></tr></thead><tbody><tr><td>Feedback &amp; Approval</td><td>Watermarked</td><td>Yes</td><td>Yes</td><td>14 days</td><td>Stakeholder sign-off</td></tr><tr><td>Quick Review</td><td>Clean</td><td>Yes</td><td>No</td><td>3 days</td><td>Fast internal checks</td></tr><tr><td>Confidential Review</td><td>Watermarked</td><td>Yes</td><td>Yes</td><td>3 days</td><td>Sensitive content</td></tr><tr><td>Client Presentation</td><td>Watermarked</td><td>Yes</td><td>No</td><td>14 days</td><td>External presentations</td></tr><tr><td>High-Res Downloads</td><td>Full</td><td>No</td><td>No</td><td>30 days</td><td>Final asset delivery</td></tr><tr><td>Web &amp; Social Downloads</td><td>Optimized</td><td>No</td><td>No</td><td>30 days</td><td>Digital campaigns</td></tr><tr><td>Video Delivery</td><td>Full</td><td>No</td><td>No</td><td>30 days</td><td>Video distribution</td></tr><tr><td>Secure Preview</td><td>Watermarked</td><td>No</td><td>No</td><td>7 days</td><td>Pre-release viewing</td></tr></tbody></table>
<p>Add any preset to your account from the Dashboard, or create custom templates with your own branding, download options, and workflow settings. Set a default template so it's pre-selected when creating new shares.</p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="recipe-event-sponsor-delivery">Recipe: Event sponsor delivery<a href="https://developers.filespin.io/guides/sharing-assets/#recipe-event-sponsor-delivery" class="hash-link" aria-label="Direct link to Recipe: Event sponsor delivery" title="Direct link to Recipe: Event sponsor delivery" translate="no">​</a></h2>
<p><img decoding="async" loading="lazy" alt="Sponsor delivery workflow steps" src="https://developers.filespin.io/assets/images/recipe-sponsor-delivery-11e5bd1afbcb66df2e3df5379ada4e28.svg" width="640" height="100" class="img_ev3q"></p>
<p>A multi-day conference generates thousands of photos. Each sponsor tier is contractually entitled to branded imagery delivered within 24 hours. The old way: someone manually hunts through folders, zips files, uploads to WeTransfer, and emails the link. No tracking, no branding, no proof of delivery.</p>
<p><strong>1. Tag assets by sponsor during capture</strong>
Photographers tag assets by session and sponsor — either manually or through AI auto-tagging after upload. Search surfaces all assets tagged for a specific sponsor.</p>
<p><strong>2. Create a branded share per sponsor</strong>
From the Dashboard, select the sponsor's assets and create a share using your event branding template. Set a password, configure download options (high-res originals plus social-ready ODI sizes for images, 1080p and 720p for video), and set an appropriate expiry.</p>
<p>Or let an AI agent do it: <em>"Find all photos tagged 'Gold Sponsor - Acme Corp' from Day 1, create a branded share page with our event branding, password-protect it, and send me the link."</em></p>
<p>Or automate it: a Make/Zapier scenario watches for the "batch complete" tag and creates the share automatically.</p>
<p><strong>3. Send the link to the sponsor</strong>
The sponsor receives a branded page with the event's identity, password-protected, with download options for both high-res originals and social-ready sizes. No account needed.</p>
<p><strong>4. Track delivery and engagement</strong>
Check analytics to confirm the sponsor accessed the package — views, downloads by format, and timestamps. This is your proof of delivery for the contract.</p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="recipe-wholesale-partner-portal">Recipe: Wholesale partner portal<a href="https://developers.filespin.io/guides/sharing-assets/#recipe-wholesale-partner-portal" class="hash-link" aria-label="Direct link to Recipe: Wholesale partner portal" title="Direct link to Recipe: Wholesale partner portal" translate="no">​</a></h2>
<p>An eCommerce brand needs to get product imagery to wholesale partners and buying teams — with controlled formats, no originals, and brand-compliant downloads.</p>
<p><strong>1. Set up a wholesale template</strong>
Create a share template configured for wholesale distribution: ODI enabled so partners can download in any size they need, but originals excluded — the brand controls the maximum resolution. No feedback or approval (this is delivery, not review). 90-day expiry matches the seasonal buying cycle.</p>
<p><strong>2. Create a share per partner for each collection</strong>
From the Dashboard, select the seasonal collection and create a share using the wholesale template. Add a password for each partner.</p>
<p>Or automate it: when assets in a collection are tagged "wholesale-ready," a workflow engine creates the share and emails the link to the partner contact from your CRM.</p>
<p><strong>3. Monitor partner engagement</strong>
Analytics tell you which partners downloaded, what formats they chose, and when — useful for follow-up and forecasting. A partner who hasn't viewed the share a week after receiving it might need a nudge.</p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="recipe-press-kit-with-watermark-protection">Recipe: Press kit with watermark protection<a href="https://developers.filespin.io/guides/sharing-assets/#recipe-press-kit-with-watermark-protection" class="hash-link" aria-label="Direct link to Recipe: Press kit with watermark protection" title="Direct link to Recipe: Press kit with watermark protection" translate="no">​</a></h2>
<p>A pre-launch or embargoed press kit needs watermark protection during the embargo period, then clean downloads after the announcement.</p>
<p><strong>Phase 1: Embargoed preview (watermarked)</strong>
Create a share with watermarks enabled, password protection, and feedback enabled. Journalists can preview and provide feedback, but all downloads carry the watermark — protecting against premature publication. Set the expiry to the embargo date.</p>
<p><strong>Phase 2: Post-announcement (clean downloads)</strong>
After the embargo lifts, create a new share with the same assets — this time with watermarks disabled, originals included, and a longer expiry. Delete or let the embargoed share expire. Journalists now download clean, high-res assets for publication.</p>
<p>An AI agent can handle the transition: <em>"The embargo lifted — create a clean press kit share with full downloads for the product launch assets, and revoke the embargoed share."</em></p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="recipe-client-review-cycle-with-approvals">Recipe: Client review cycle with approvals<a href="https://developers.filespin.io/guides/sharing-assets/#recipe-client-review-cycle-with-approvals" class="hash-link" aria-label="Direct link to Recipe: Client review cycle with approvals" title="Direct link to Recipe: Client review cycle with approvals" translate="no">​</a></h2>
<p><img decoding="async" loading="lazy" alt="Client review cycle steps" src="https://developers.filespin.io/assets/images/recipe-client-review-9e2e208e6014e0a01fd03243bbcccba3.svg" width="760" height="100" class="img_ev3q"></p>
<p>A creative agency sends campaign assets to a client for approval. The client needs to approve or reject individual assets with feedback, and the agency needs to track the process.</p>
<p><strong>1. Create the review share</strong>
From the Dashboard, select the campaign assets and create a share with the "Feedback &amp; Approval" template. Watermarks protect assets during review. The client receives a branded link — no account needed.</p>
<p><strong>2. Client reviews and approves/rejects</strong>
The client opens the share link and approves or rejects each asset with notes. Watermarks protect assets during the review phase.</p>
<p><strong>3. Check the results</strong>
The Dashboard shows approval status per asset, reviewer comments, and engagement analytics — did the client actually view the share? Which assets did they spend time on?</p>
<p><strong>4. Revise and re-share</strong>
Fix rejected assets based on feedback. Create a new share with the revised assets for another round of approval.</p>
<p><strong>5. Deliver approved assets</strong>
Once all assets are approved, create a "High-Res Downloads" share with clean (unwatermarked) originals for final delivery. The client downloads the approved assets in the formats they need.</p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="recipe-awards-event-judging">Recipe: Awards event judging<a href="https://developers.filespin.io/guides/sharing-assets/#recipe-awards-event-judging" class="hash-link" aria-label="Direct link to Recipe: Awards event judging" title="Direct link to Recipe: Awards event judging" translate="no">​</a></h2>
<p><img decoding="async" loading="lazy" alt="Awards judging workflow steps" src="https://developers.filespin.io/assets/images/recipe-awards-judging-f60eacfaf2a866f58c6e41024b498761.svg" width="760" height="100" class="img_ev3q"></p>
<p>A creative awards festival receives thousands of entries across dozens of categories — film, print, digital, experiential. Jury panels need to shortlist remotely before the festival, then review and score on-site at the venue where Wi-Fi is unreliable and video entries need instant playback. The old way: USB drives passed between jury rooms, spreadsheets emailed between coordinators, and no audit trail of who scored what.</p>
<p><strong>1. Organize entries by category</strong>
Define an <a class="" href="https://developers.filespin.io/guides/asset-schemas/">asset schema</a> for awards entries — category, subcategory, entrant, agency, brand, country, and supporting case study fields. Upload entries and assign metadata during intake. Each category becomes a collection. AI auto-tagging accelerates classification for large entry volumes.</p>
<p><strong>2. Remote shortlisting round</strong>
Before the festival, create per-category share pages for each jury panel using the "Confidential Review" template — watermarked previews, feedback and approval enabled, password-protected, 14-day expiry. Jurors receive a branded link and score entries individually without needing a FileSpin account. Analytics track which jurors have reviewed and which haven't — useful for deadline reminders. Typically around ten percent of entries make the shortlist.</p>
<p><strong>3. On-site judging at the venue</strong>
Deploy <a class="" href="https://developers.filespin.io/guides/teleport/">Teleport</a> at the festival venue for reliable local asset delivery. Jury rooms get instant playback of video entries and high-res image viewing from local hardware — no dependency on venue Wi-Fi. When connected, cloud pass-through enables the full share page experience with live feedback. Create fresh share pages for each jury room with just the shortlisted entries for their category.</p>
<p><strong>4. Calibrate and award metals</strong>
Jury presidents review shortlist results in the Dashboard — approval status, reviewer comments, and engagement analytics per entry. Working from the shortlist, juries decide which entries deserve Bronze, Silver, or Gold. Create a new share page with the medal-worthy subset for final deliberation. It takes a two-thirds majority vote to be awarded.</p>
<p><strong>5. Grand Prix selection and winner delivery</strong>
From the Gold winners, the jury selects the Grand Prix — the best in show. Create "High-Res Downloads" shares with clean originals for winners, press kits, and festival archives. Analytics provide a complete audit trail of the judging process — who viewed what, when they scored, and how the shortlist narrowed to the final winners.</p>
<p>Or let an AI agent handle the logistics: <em>"Find all Gold winners in the Film category, create a branded press kit share with our festival branding, watermarked, password-protected, expiring in 30 days — and a separate clean share for the winners with full downloads."</em></p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="programmatic-access">Programmatic access<a href="https://developers.filespin.io/guides/sharing-assets/#programmatic-access" class="hash-link" aria-label="Direct link to Programmatic access" title="Direct link to Programmatic access" translate="no">​</a></h2>
<p>For teams that need to create and manage shares programmatically, the full Shares API is available. The API supports everything described in this guide — creating shares, configuring branding and download options, enabling feedback and approvals, retrieving analytics, and managing templates.</p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="best-practices">Best practices<a href="https://developers.filespin.io/guides/sharing-assets/#best-practices" class="hash-link" aria-label="Direct link to Best practices" title="Direct link to Best practices" translate="no">​</a></h2>
<ol>
<li class="">
<p><strong>Use templates for consistency.</strong> Create templates for your common workflows (sponsor delivery, wholesale portals, press kits, client review) so every share follows the same branding and settings.</p>
</li>
<li class="">
<p><strong>Set appropriate expiry dates.</strong> 7–14 days for reviews, 30 days for deliverables, 90 days for partner portals. Don't let shares linger indefinitely.</p>
</li>
<li class="">
<p><strong>Watermark during review, not delivery.</strong> Use watermarked downloads during the review phase to protect assets, then switch to clean downloads for final delivery.</p>
</li>
<li class="">
<p><strong>Use password protection for sensitive content.</strong> Pre-launch materials, embargoed content, and confidential assets should be password-protected.</p>
</li>
<li class="">
<p><strong>Check analytics before following up.</strong> Before chasing a client, check analytics to see if they've actually viewed the share. A "haven't reviewed yet" follow-up hits differently when you know they opened the page three times.</p>
</li>
<li class="">
<p><strong>Let AI agents assemble shares.</strong> For ad-hoc distribution — "find all keynote photos, create a branded share for the press team" — an AI agent can search, filter, and create the share in a single prompt. See the <a class="" href="https://developers.filespin.io/guides/ai-agent-integration/">AI Agent Integration guide</a>.</p>
</li>
<li class="">
<p><strong>Clean up expired shares.</strong> Periodically review and delete shares that are no longer needed.</p>
</li>
</ol>
<hr>]]></content:encoded>
            <category>shares</category>
            <category>templates</category>
            <category>collaboration</category>
            <category>approvals</category>
            <category>distribution</category>
            <category>review</category>
        </item>
        <item>
            <title><![CDATA[Upload, Process, Deliver: The Complete Asset Lifecycle]]></title>
            <link>https://developers.filespin.io/guides/asset-lifecycle/</link>
            <guid>https://developers.filespin.io/guides/asset-lifecycle/</guid>
            <pubDate>Tue, 10 Feb 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[The end-to-end journey of an asset from upload to CDN delivery -- multipart upload, URL ingest, status polling, auto-processing, webhooks, and serving via CDN.]]></description>
            <content:encoded><![CDATA[<p>The end-to-end journey of an asset from upload to CDN delivery -- multipart upload, URL ingest, status polling, auto-processing, webhooks, and serving via CDN.</p>
<p><img decoding="async" loading="lazy" alt="Asset Lifecycle" src="https://developers.filespin.io/assets/images/asset-lifecycle-workflow-6abf3a63b9887d9cbb452ff955f9babb.svg" width="900" height="480" class="img_ev3q"></p>
<p>FileSpin offers three automation paths: AI agents for ad-hoc, complex workflows through natural language; workflow engines for repeatable, visual pipelines operations teams build without engineering; and REST APIs for custom, high-throughput integrations. All three paths share the same asset lifecycle described in this guide.</p>
<p>FileSpin is an AI-native digital asset management platform used by eCommerce retailers, event producers, attractions operators, and media companies to manage, transform, and deliver assets autonomously. Whether you're syncing product photos from a photoshoot to multiple marketplaces, processing thousands of event images for sponsor delivery, capturing guest photos at attractions, or delivering media to global audiences -- understanding the asset lifecycle is essential for building integrations that scale.</p>
<p>Every integration with FileSpin follows the same fundamental pattern: get content in, let FileSpin process it, then serve it to your users. This guide walks through the entire pipeline so you can build a reliable, production-ready integration from day one.</p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="how-the-pipeline-works">How the pipeline works<a href="https://developers.filespin.io/guides/asset-lifecycle/#how-the-pipeline-works" class="hash-link" aria-label="Direct link to How the pipeline works" title="Direct link to How the pipeline works" translate="no">​</a></h2>
<p>When you upload a file to FileSpin, it moves through a series of stages before it's ready to serve. Understanding this pipeline is essential for building integrations that handle timing correctly and don't surprise your users with missing thumbnails or incomplete metadata.</p>
<ol>
<li class=""><strong>Upload</strong> -- You send the file (or a URL to fetch it from). FileSpin returns an asset ID immediately.</li>
<li class=""><strong>Storage</strong> -- The original file is saved to cloud storage (S3 or R2). A <code>file-saved</code> webhook fires.</li>
<li class=""><strong>Auto-processing</strong> -- Based on your account settings, FileSpin generates image conversions, video transcodes, and runs any enabled addons (auto-tags, face recognition, etc.). A <code>file-processed</code> webhook fires when complete.</li>
<li class=""><strong>Delivery</strong> -- The asset and its derivatives are available via CDN URLs for fast, global delivery.</li>
</ol>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="step-1-upload-an-asset">Step 1: Upload an asset<a href="https://developers.filespin.io/guides/asset-lifecycle/#step-1-upload-an-asset" class="hash-link" aria-label="Direct link to Step 1: Upload an asset" title="Direct link to Step 1: Upload an asset" translate="no">​</a></h2>
<p>FileSpin supports two upload methods: direct multipart upload and URL ingest. Choose based on where your files originate.</p>
<div class="theme-admonition theme-admonition-info admonition_xJq3 alert alert--info"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"></path></svg></span>info</div><div class="admonitionContent_BuS1"><p>For uploads from websites, use the File Picker Web Widget.</p></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="multipart-upload-files-you-have">Multipart upload (files you have)<a href="https://developers.filespin.io/guides/asset-lifecycle/#multipart-upload-files-you-have" class="hash-link" aria-label="Direct link to Multipart upload (files you have)" title="Direct link to Multipart upload (files you have)" translate="no">​</a></h3>
<p>Use this when your application has the file -- a user-uploaded photo, a generated document, or a file from your server's filesystem.</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token function" style="color:#d73a49">curl</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">-X</span><span class="token plain"> POST </span><span class="token string" style="color:#e3116c">"https://upload.filespin.io/api/v1/assets/new/content/original/upload"</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">\</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token parameter variable" style="color:#36acaa">-H</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"X-FileSpin-Api-Key: YOUR_API_KEY"</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">\</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token parameter variable" style="color:#36acaa">-F</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"file=@product-photo.jpg"</span><br></span></code></pre></div></div>
<p><strong>Response:</strong></p>
<div class="language-json codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"assets"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token property" style="color:#36acaa">"id"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"a1b2c3d4e5f6789012345678abcdef90"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token property" style="color:#36acaa">"status"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"NOT_READY"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token property" style="color:#36acaa">"name"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"product-photo.jpg"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token property" style="color:#36acaa">"size"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">2456789</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token property" style="color:#36acaa">"checksum"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"d41d8cd98f00b204e9800998ecf8427e"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token property" style="color:#36acaa">"content_type"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"image/jpeg"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></span></code></pre></div></div>
<p>You can upload multiple files in a single request by using <code>file1</code>, <code>file2</code>, etc. as form field names.</p>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="attaching-metadata-at-upload-time">Attaching metadata at upload time<a href="https://developers.filespin.io/guides/asset-lifecycle/#attaching-metadata-at-upload-time" class="hash-link" aria-label="Direct link to Attaching metadata at upload time" title="Direct link to Attaching metadata at upload time" translate="no">​</a></h4>
<p>You can include custom metadata in the same upload request. This is useful when your application has context about the file (e.g. which product it belongs to, who approved it, what campaign it's for):</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token function" style="color:#d73a49">curl</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">-X</span><span class="token plain"> POST </span><span class="token string" style="color:#e3116c">"https://upload.filespin.io/api/v1/assets/new/content/original/upload"</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">\</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token parameter variable" style="color:#36acaa">-H</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"X-FileSpin-Api-Key: YOUR_API_KEY"</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">\</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token parameter variable" style="color:#36acaa">-F</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"file=@product-photo.jpg"</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">\</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token parameter variable" style="color:#36acaa">-F</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'custom_metadata={"data": {"project": "Summer Campaign", "status": "draft"}, "data_schema_id=1"}'</span><span class="token plain"> </span><br></span></code></pre></div></div>
<p><code>data_schema_id</code> is the optional ID of asset schema that powers custom searches and other powerful automations. See the post on Asset Schemas for more.*</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="url-ingest-files-hosted-elsewhere">URL ingest (files hosted elsewhere)<a href="https://developers.filespin.io/guides/asset-lifecycle/#url-ingest-files-hosted-elsewhere" class="hash-link" aria-label="Direct link to URL ingest (files hosted elsewhere)" title="Direct link to URL ingest (files hosted elsewhere)" translate="no">​</a></h3>
<p>Use this when the file already lives at a URL -- an image on a partner's CDN, a video on a content server, or an object in an S3 bucket.</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token function" style="color:#d73a49">curl</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">-X</span><span class="token plain"> POST </span><span class="token string" style="color:#e3116c">"https://upload.filespin.io/api/v1/assets/new/content/original/external"</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">\</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token parameter variable" style="color:#36acaa">-H</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"X-FileSpin-Api-Key: YOUR_API_KEY"</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">\</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token parameter variable" style="color:#36acaa">-H</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"Content-Type: application/json"</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">\</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token parameter variable" style="color:#36acaa">-d</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'{</span><br></span><span class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c">    "name": "interview.mp4",</span><br></span><span class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c">    "key": "https://example.com/videos/interview.mp4"</span><br></span><span class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c">  }'</span><br></span></code></pre></div></div>
<p>For S3 objects, use the <code>s3://</code> protocol:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token function" style="color:#d73a49">curl</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">-X</span><span class="token plain"> POST </span><span class="token string" style="color:#e3116c">"https://upload.filespin.io/api/v1/assets/new/content/original/external"</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">\</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token parameter variable" style="color:#36acaa">-H</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"X-FileSpin-Api-Key: YOUR_API_KEY"</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">\</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token parameter variable" style="color:#36acaa">-H</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"Content-Type: application/json"</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">\</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token parameter variable" style="color:#36acaa">-d</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'{</span><br></span><span class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c">    "name": "interview.mp4",</span><br></span><span class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c">    "key": "s3://my-bucket/path/to/file.mp4"</span><br></span><span class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c">  }'</span><br></span></code></pre></div></div>
<p>URL ingests are asynchronous -- FileSpin queues the download and returns a <code>QUEUED</code> status. The file will be fetched in the background.</p>
<p>The URL provided should allow direct downloads without any authorization. If S3 URL is provided, make sure the bucket is accessible for FileSpin (See Custom S3 Storage Setup in the docs).</p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="step-2-check-asset-status">Step 2: Check asset status<a href="https://developers.filespin.io/guides/asset-lifecycle/#step-2-check-asset-status" class="hash-link" aria-label="Direct link to Step 2: Check asset status" title="Direct link to Step 2: Check asset status" translate="no">​</a></h2>
<p>After upload, the asset status is <code>NOT_READY</code> while the file is being saved to storage. You need to wait for it to become <code>OK</code> before performing further operations.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="polling-for-readiness">Polling for readiness<a href="https://developers.filespin.io/guides/asset-lifecycle/#polling-for-readiness" class="hash-link" aria-label="Direct link to Polling for readiness" title="Direct link to Polling for readiness" translate="no">​</a></h3>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token function" style="color:#d73a49">curl</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"https://app.filespin.io/api/v1/assets/a1b2c3d4e5f6789012345678abcdef90/data"</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">\</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token parameter variable" style="color:#36acaa">-H</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"X-FileSpin-Api-Key: YOUR_API_KEY"</span><br></span></code></pre></div></div>
<p><strong>Response when ready:</strong></p>
<p><code>status</code> will be <code>OK</code></p>
<div class="language-json codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"id"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"a1b2c3d4e5f6789012345678abcdef90"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"status"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"OK"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"name"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"product-photo.jpg"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"size"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">2456789</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"content_type"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"image/jpeg"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"metadata"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token property" style="color:#36acaa">"width"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">4000</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token property" style="color:#36acaa">"height"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">3000</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"conversions"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"addons_info"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token property" style="color:#36acaa">"ON_DEMAND_IMAGE"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token property" style="color:#36acaa">"available"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">true</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></span></code></pre></div></div>
<p><strong>Timing guidelines:</strong></p>
<table><thead><tr><th>File size</th><th>Typical wait</th></tr></thead><tbody><tr><td>Small files (&lt; 50 MB)</td><td>A few hundred milliseconds</td></tr><tr><td>Large files (50 MB -- 1 GB)</td><td>A few seconds</td></tr><tr><td>Very large files (1 GB+)</td><td>Several seconds</td></tr></tbody></table>
<div class="theme-admonition theme-admonition-warning admonition_xJq3 alert alert--warning"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 16 16"><path fill-rule="evenodd" d="M8.893 1.5c-.183-.31-.52-.5-.887-.5s-.703.19-.886.5L.138 13.499a.98.98 0 0 0 0 1.001c.193.31.53.501.886.501h13.964c.367 0 .704-.19.877-.5a1.03 1.03 0 0 0 .01-1.002L8.893 1.5zm.133 11.497H6.987v-2.003h2.039v2.003zm0-3.004H6.987V5.987h2.039v4.006z"></path></svg></span>warning</div><div class="admonitionContent_BuS1"><p>Always check <code>status</code> is <code>OK</code> before attempting to access the asset or trigger processing. Attempting to process a <code>NOT_READY</code> asset will fail.</p></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="using-webhooks-instead-of-polling">Using webhooks instead of polling<a href="https://developers.filespin.io/guides/asset-lifecycle/#using-webhooks-instead-of-polling" class="hash-link" aria-label="Direct link to Using webhooks instead of polling" title="Direct link to Using webhooks instead of polling" translate="no">​</a></h3>
<p>Polling works for simple integrations, but webhooks are more efficient at scale. Configure a webhook URL in your account settings to receive <code>file-saved</code> notifications automatically. See the Webhooks in Integrations docs for the complete setup.</p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="step-3-understand-auto-processing">Step 3: Understand auto-processing<a href="https://developers.filespin.io/guides/asset-lifecycle/#step-3-understand-auto-processing" class="hash-link" aria-label="Direct link to Step 3: Understand auto-processing" title="Direct link to Step 3: Understand auto-processing" translate="no">​</a></h2>
<p>Once the file is saved, FileSpin automatically processes it based on your account settings. This includes:</p>
<ul>
<li class=""><strong>Image conversions</strong> -- Smart imaging for on-demand transformations (ODI)</li>
<li class=""><strong>Video transcodes</strong> -- Multiple resolutions (360p, 480p, 720p, 1080p) and HLS adaptive streaming</li>
<li class=""><strong>Addons</strong> -- Auto-tags, face recognition, etc</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="triggering-processing-manually">Triggering processing manually<a href="https://developers.filespin.io/guides/asset-lifecycle/#triggering-processing-manually" class="hash-link" aria-label="Direct link to Triggering processing manually" title="Direct link to Triggering processing manually" translate="no">​</a></h3>
<p>If you need specific processing that isn't enabled by default, or you want to reprocess an asset:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token function" style="color:#d73a49">curl</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">-X</span><span class="token plain"> POST </span><span class="token string" style="color:#e3116c">"https://app.filespin.io/api/v1/assets/a1b2c3d4e5f6789012345678abcdef90/process"</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">\</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token parameter variable" style="color:#36acaa">-H</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"X-FileSpin-Api-Key: YOUR_API_KEY"</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">\</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token parameter variable" style="color:#36acaa">-H</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"Content-Type: application/json"</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">\</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token parameter variable" style="color:#36acaa">-d</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'{</span><br></span><span class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c">    "keys": ["smart_imaging", "720p-video", "1080p-video", "hls-video"]</span><br></span><span class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c">  }'</span><br></span></code></pre></div></div>
<p>Refer to the <a class="" href="https://developers.filespin.io/api-reference/asset-processing/asset-processing-api-introduction/">Asset Processing docs</a> for all the valid processing keys that can be used.</p>
<p>For video processing, the response includes a <code>job_id</code> that you can use to track progress. Processing completion is also notified via webhooks.</p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="step-4-serve-assets-via-cdn">Step 4: Serve assets via CDN<a href="https://developers.filespin.io/guides/asset-lifecycle/#step-4-serve-assets-via-cdn" class="hash-link" aria-label="Direct link to Step 4: Serve assets via CDN" title="Direct link to Step 4: Serve assets via CDN" translate="no">​</a></h2>
<p>Once processing is complete, your assets are ready for delivery through FileSpin's global CDN.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="serving-images-with-on-demand-transformations">Serving images with on-demand transformations<a href="https://developers.filespin.io/guides/asset-lifecycle/#serving-images-with-on-demand-transformations" class="hash-link" aria-label="Direct link to Serving images with on-demand transformations" title="Direct link to Serving images with on-demand transformations" translate="no">​</a></h3>
<p>Once ON_DEMAND_IMAGE processing is complete (usually within a second or two), you can serve images with real-time transformations via URL parameters:</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">https://cdn.filespin.io/api/v1/assets/ASSET_ID/conversions?resize=800,600&amp;quality=85</span><br></span></code></pre></div></div>
<p>This resizes to 800x600 and compresses to quality 85 -- all on the fly, cached at the CDN edge.</p>
<p>See the <a class="" href="https://developers.filespin.io/image-transformations/">Image Transformations Docs</a> for the full transformation reference.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="serving-video-transcodes">Serving video transcodes<a href="https://developers.filespin.io/guides/asset-lifecycle/#serving-video-transcodes" class="hash-link" aria-label="Direct link to Serving video transcodes" title="Direct link to Serving video transcodes" translate="no">​</a></h3>
<p>Video transcodes are available through the get_link API:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token function" style="color:#d73a49">curl</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"https://app.filespin.io/api/v1/assets/ASSET_ID/get_link?key=720p-video&amp;link_type=cdn&amp;delivery=display"</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">\</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token parameter variable" style="color:#36acaa">-H</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"X-FileSpin-Api-Key: YOUR_API_KEY"</span><br></span></code></pre></div></div>
<p>The response includes a signed CDN URL you can use directly in a video player or embed tag:</p>
<div class="language-json codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"url"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"https://cdn.filespin.io/api/v1/assets/ASSET_ID/transcodes/720p-video.mp4?expiry=..."</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></span></code></pre></div></div>
<p>For public videos, you can also construct the URL directly: <code>https://cdn.filespin.io/api/v1/assets/ASSET_ID/transcodes/720p-video.mp4</code></p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="public-vs-private-assets">Public vs. private assets<a href="https://developers.filespin.io/guides/asset-lifecycle/#public-vs-private-assets" class="hash-link" aria-label="Direct link to Public vs. private assets" title="Direct link to Public vs. private assets" translate="no">​</a></h3>
<p>By default, assets are private except for on-demand images. Private files require authentication to access. For public-facing content, you can make individual assets public using the set_public_access API:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token function" style="color:#d73a49">curl</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">-X</span><span class="token plain"> POST </span><span class="token string" style="color:#e3116c">"https://app.filespin.io/api/v1/assets/ASSET_ID/content/set_public_access"</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">\</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token parameter variable" style="color:#36acaa">-H</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"X-FileSpin-Api-Key: YOUR_API_KEY"</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">\</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token parameter variable" style="color:#36acaa">-H</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"Content-Type: application/json"</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">\</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token parameter variable" style="color:#36acaa">-d</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'{</span><br></span><span class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c">    "keys": ["original", "720p-video"]</span><br></span><span class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c">  }'</span><br></span></code></pre></div></div>
<p>For private assets that need temporary access (e.g. serving to authenticated users on your website), use the get_link API with signed URLs:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token function" style="color:#d73a49">curl</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"https://app.filespin.io/api/v1/assets/ASSET_ID/get_link?key=original&amp;expiry=3600"</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">\</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token parameter variable" style="color:#36acaa">-H</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"X-FileSpin-Api-Key: YOUR_API_KEY"</span><br></span></code></pre></div></div>
<p>This returns a signed URL valid for 3600 seconds (1 hour). FileSpin checks the signature and expiry before serving the file.</p>
<div class="theme-admonition theme-admonition-caution admonition_xJq3 alert alert--warning"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 16 16"><path fill-rule="evenodd" d="M8.893 1.5c-.183-.31-.52-.5-.887-.5s-.703.19-.886.5L.138 13.499a.98.98 0 0 0 0 1.001c.193.31.53.501.886.501h13.964c.367 0 .704-.19.877-.5a1.03 1.03 0 0 0 .01-1.002L8.893 1.5zm.133 11.497H6.987v-2.003h2.039v2.003zm0-3.004H6.987V5.987h2.039v4.006z"></path></svg></span>Images stay viewable through on-demand image URLs</div><div class="admonitionContent_BuS1"><p>A signed link protects the file it points to, such as an image's original. It doesn't make the image itself private. On-demand image URLs (<code>https://cdn.filespin.io/api/v1/assets/ASSET_ID/conversions?...</code>) are always available for image assets, can't be signed, and need no authentication. Anyone who knows the asset ID can view the image through them, up to the on-demand size limit. Image URL signing isn't supported.</p><p>To restrict an image, use a non-public <a href="https://developers.filespin.io/image-transformations/standard-odi-copy/#using-non-public-custom-image-conversion" target="_blank" rel="noopener noreferrer" class="">custom conversion</a> and request it from your server with an API key or JWT. For video, use <a href="https://developers.filespin.io/video-streaming/signed-url-for-video-transcodes/" target="_blank" rel="noopener noreferrer" class="">signed URLs for video transcodes</a>.</p></div></div>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="replacing-asset-content">Replacing asset content<a href="https://developers.filespin.io/guides/asset-lifecycle/#replacing-asset-content" class="hash-link" aria-label="Direct link to Replacing asset content" title="Direct link to Replacing asset content" translate="no">​</a></h2>
<p>Sometimes you need to update the file while keeping the same asset ID -- for example, when a designer revises a photo but you want to preserve all the metadata and the reference in your application.</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token function" style="color:#d73a49">curl</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">-X</span><span class="token plain"> POST </span><span class="token string" style="color:#e3116c">"https://upload.filespin.io/api/v1/assets/ASSET_ID/content/original/replace"</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">\</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token parameter variable" style="color:#36acaa">-H</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"X-FileSpin-Api-Key: YOUR_API_KEY"</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">\</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token parameter variable" style="color:#36acaa">-F</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"file=@updated-product-photo.jpg"</span><br></span></code></pre></div></div>
<p>The asset ID stays the same, but the content is replaced. All conversions and transcodes will be regenerated based on accoount settings.</p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="error-handling">Error handling<a href="https://developers.filespin.io/guides/asset-lifecycle/#error-handling" class="hash-link" aria-label="Direct link to Error handling" title="Direct link to Error handling" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="common-status-values">Common status values<a href="https://developers.filespin.io/guides/asset-lifecycle/#common-status-values" class="hash-link" aria-label="Direct link to Common status values" title="Direct link to Common status values" translate="no">​</a></h3>
<table><thead><tr><th>Status</th><th>Meaning</th><th>Action</th></tr></thead><tbody><tr><td><code>OK</code></td><td>Asset saved and ready</td><td>Proceed normally</td></tr><tr><td><code>NOT_READY</code></td><td>File is being saved</td><td>Wait and retry</td></tr><tr><td><code>QUEUED</code></td><td>URL ingest is queued</td><td>Wait for webhook or poll</td></tr><tr><td><code>ERROR</code></td><td>Processing failed</td><td>Check <code>errors</code> field in asset data</td></tr><tr><td><code>ARCHIVED</code></td><td>Asset is archived (read-only)</td><td>Cannot modify, only read</td></tr></tbody></table>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="handling-errors-in-the-asset-data">Handling errors in the asset data<a href="https://developers.filespin.io/guides/asset-lifecycle/#handling-errors-in-the-asset-data" class="hash-link" aria-label="Direct link to Handling errors in the asset data" title="Direct link to Handling errors in the asset data" translate="no">​</a></h3>
<p>When something goes wrong, the <code>errors</code> field in the asset data provides details:</p>
<div class="language-json codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"id"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"a1b2c3d4e5f6789012345678abcdef90"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"status"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"ERROR"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"errors"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token property" style="color:#36acaa">"original"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"Original file appears to be invalid!"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></span></code></pre></div></div>
<p>Warnings (non-fatal issues) are also reported:</p>
<div class="language-json codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"errors"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token property" style="color:#36acaa">"warning"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"This may be a PNG file uploaded as JPG!"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></span></code></pre></div></div>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="putting-it-all-together">Putting it all together<a href="https://developers.filespin.io/guides/asset-lifecycle/#putting-it-all-together" class="hash-link" aria-label="Direct link to Putting it all together" title="Direct link to Putting it all together" translate="no">​</a></h2>
<p>Here's a complete Python example that uploads an image, waits for it to be ready, and builds a CDN URL for serving:</p>
<div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">import</span><span class="token plain"> requests</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">import</span><span class="token plain"> time</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">API_KEY </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"YOUR_API_KEY"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">API_BASE </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"https://app.filespin.io/api/v1"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">UPLOAD_BASE </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"https://upload.filespin.io/api/v1"</span><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic"># upload, ingest and replace use the upload host</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">CDN_BASE </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"https://cdn.filespin.io/api/v1"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">HEADERS </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token string" style="color:#e3116c">"X-FileSpin-Api-Key"</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> API_KEY</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 1. Upload the file</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">with</span><span class="token plain"> </span><span class="token builtin">open</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"product-photo.jpg"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"rb"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">as</span><span class="token plain"> f</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    resp </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> requests</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">post</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token string-interpolation string" style="color:#e3116c">f"</span><span class="token string-interpolation interpolation punctuation" style="color:#393A34">{</span><span class="token string-interpolation interpolation">UPLOAD_BASE</span><span class="token string-interpolation interpolation punctuation" style="color:#393A34">}</span><span class="token string-interpolation string" style="color:#e3116c">/assets/new/content/original/upload"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        headers</span><span class="token operator" style="color:#393A34">=</span><span class="token plain">HEADERS</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        files</span><span class="token operator" style="color:#393A34">=</span><span class="token punctuation" style="color:#393A34">{</span><span class="token string" style="color:#e3116c">"file"</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> f</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">asset_id </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> resp</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">json</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">"assets"</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">[</span><span class="token number" style="color:#36acaa">0</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">"id"</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">print</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string-interpolation string" style="color:#e3116c">f"Uploaded: </span><span class="token string-interpolation interpolation punctuation" style="color:#393A34">{</span><span class="token string-interpolation interpolation">asset_id</span><span class="token string-interpolation interpolation punctuation" style="color:#393A34">}</span><span class="token string-interpolation string" style="color:#e3116c">"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 2. Wait for asset to be ready</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">for</span><span class="token plain"> _ </span><span class="token keyword" style="color:#00009f">in</span><span class="token plain"> </span><span class="token builtin">range</span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">30</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    resp </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> requests</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">get</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token string-interpolation string" style="color:#e3116c">f"</span><span class="token string-interpolation interpolation punctuation" style="color:#393A34">{</span><span class="token string-interpolation interpolation">API_BASE</span><span class="token string-interpolation interpolation punctuation" style="color:#393A34">}</span><span class="token string-interpolation string" style="color:#e3116c">/assets/</span><span class="token string-interpolation interpolation punctuation" style="color:#393A34">{</span><span class="token string-interpolation interpolation">asset_id</span><span class="token string-interpolation interpolation punctuation" style="color:#393A34">}</span><span class="token string-interpolation string" style="color:#e3116c">/data"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        headers</span><span class="token operator" style="color:#393A34">=</span><span class="token plain">HEADERS</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    data </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> resp</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">json</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> data</span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">"status"</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">==</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"OK"</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token keyword" style="color:#00009f">break</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    time</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">sleep</span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">1</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">else</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">raise</span><span class="token plain"> TimeoutError</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"Asset did not become ready in time"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 3. Build a CDN URL with transformations</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">thumbnail_url </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token string-interpolation string" style="color:#e3116c">f"</span><span class="token string-interpolation interpolation punctuation" style="color:#393A34">{</span><span class="token string-interpolation interpolation">CDN_BASE</span><span class="token string-interpolation interpolation punctuation" style="color:#393A34">}</span><span class="token string-interpolation string" style="color:#e3116c">/assets/</span><span class="token string-interpolation interpolation punctuation" style="color:#393A34">{</span><span class="token string-interpolation interpolation">asset_id</span><span class="token string-interpolation interpolation punctuation" style="color:#393A34">}</span><span class="token string-interpolation string" style="color:#e3116c">/conversions"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token string-interpolation string" style="color:#e3116c">f"?resize=400,300&amp;quality=80"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">print</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string-interpolation string" style="color:#e3116c">f"Thumbnail URL: </span><span class="token string-interpolation interpolation punctuation" style="color:#393A34">{</span><span class="token string-interpolation interpolation">thumbnail_url</span><span class="token string-interpolation interpolation punctuation" style="color:#393A34">}</span><span class="token string-interpolation string" style="color:#e3116c">"</span><span class="token punctuation" style="color:#393A34">)</span><br></span></code></pre></div></div>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="best-practices">Best practices<a href="https://developers.filespin.io/guides/asset-lifecycle/#best-practices" class="hash-link" aria-label="Direct link to Best practices" title="Direct link to Best practices" translate="no">​</a></h2>
<ol>
<li class="">
<p><strong>Store the asset ID</strong> in your application database right after upload. This is your permanent reference to the file in FileSpin.</p>
</li>
<li class="">
<p><strong>Use webhooks over polling</strong> for production systems. Polling is fine for development, but webhooks scale better and react faster.</p>
</li>
<li class="">
<p><strong>Check status before operating</strong> on an asset. Never assume an upload is instantly available.</p>
</li>
<li class="">
<p><strong>Use on-demand transformations</strong> for images instead of pre-generating every size. This saves storage and processing time.</p>
</li>
<li class="">
<p><strong>Enable auto-processing for videos</strong> in your account settings for the transcodes you regularly need, so every video upload is processed for transcodes automatically.</p>
</li>
</ol>
<hr>]]></content:encoded>
            <category>assets</category>
            <category>upload</category>
            <category>processing</category>
            <category>cdn</category>
            <category>getting-started</category>
        </item>
        <item>
            <title><![CDATA[Organizing Assets with Custom Metadata Schemas]]></title>
            <link>https://developers.filespin.io/guides/asset-schemas/</link>
            <guid>https://developers.filespin.io/guides/asset-schemas/</guid>
            <pubDate>Mon, 09 Feb 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[Designing, creating, and using asset schemas to add structured, searchable metadata to assets -- field types, naming conventions, preset templates, search integration, and best practices.]]></description>
            <content:encoded><![CDATA[<p>Designing, creating, and using asset schemas to add structured, searchable metadata to assets -- field types, naming conventions, preset templates, search integration, and best practices.</p>
<p><img decoding="async" loading="lazy" alt="Asset Schemas" src="https://developers.filespin.io/assets/images/asset-schemas-workflow-168b57c6f3b3412c1590fe5cd1257054.svg" width="900" height="350" class="img_ev3q"></p>
<p>Every asset in FileSpin has core metadata -- file name, size, content type, dimensions. But real-world asset management needs more. You need to track which campaign a photo belongs to, who approved it, what product SKU it represents, or when the usage rights expire.</p>
<p>Asset schemas let you define structured metadata fields for your assets, with validation, search indexing, and UI rendering -- all powered by JSON Schema standard.</p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="what-is-an-asset-schema">What is an asset schema?<a href="https://developers.filespin.io/guides/asset-schemas/#what-is-an-asset-schema" class="hash-link" aria-label="Direct link to What is an asset schema?" title="Direct link to What is an asset schema?" translate="no">​</a></h2>
<p>An asset schema is a JSON Schema definition that describes the custom metadata fields you want to attach to assets. Think of it as a form definition: it specifies the fields, their types, validation rules, and how they should be displayed and searched.</p>
<p><strong>Schema = field definitions + validation rules + search configuration + UI hints</strong></p>
<p>When you assign a schema to an asset and provide data, FileSpin:</p>
<ul>
<li class=""><strong>Validates</strong> the data against the schema before saving</li>
<li class=""><strong>Indexes</strong> searchable fields for fast retrieval</li>
<li class=""><strong>Renders</strong> form fields in dashboard using the UI hints</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="real-world-use-cases">Real-World Use Cases<a href="https://developers.filespin.io/guides/asset-schemas/#real-world-use-cases" class="hash-link" aria-label="Direct link to Real-World Use Cases" title="Direct link to Real-World Use Cases" translate="no">​</a></h3>
<p>Asset schemas solve critical metadata challenges across industries:</p>
<ul>
<li class=""><strong>eCommerce</strong> — Track SKU, product name, category, seasonal tags, usage rights, and approval status for every product image. Schemas enable fast search-to-shelf workflows and enforcement of channel-specific metadata before syndication to Amazon, Shopify, and marketplace partners.</li>
<li class=""><strong>Events &amp; Conferences</strong> — Capture speaker name, session ID, sponsor affiliation, and usage rights for event photography. Face recognition pairs with metadata for automatic speaker identification, and schemas enable filtered sponsor asset delivery through branded share pages.</li>
<li class=""><strong>Attractions &amp; Experiences</strong> — Tag photos with guest ID, ride, location, and timestamp. Schemas power unified guest galleries ("find all my photos") and drive preview-to-purchase revenue workflows.</li>
<li class=""><strong>Real Estate</strong> — Organize property images by listing ID, room type, and status. Schemas enable automatic portal-specific format generation and off-market watermark protection.</li>
</ul>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="getting-started-with-preset-schemas">Getting started with preset schemas<a href="https://developers.filespin.io/guides/asset-schemas/#getting-started-with-preset-schemas" class="hash-link" aria-label="Direct link to Getting started with preset schemas" title="Direct link to Getting started with preset schemas" translate="no">​</a></h2>
<p>FileSpin provides industry-specific preset schemas so you don't have to start from scratch. These cover the most common metadata patterns for different use cases.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="list-available-presets">List available presets<a href="https://developers.filespin.io/guides/asset-schemas/#list-available-presets" class="hash-link" aria-label="Direct link to List available presets" title="Direct link to List available presets" translate="no">​</a></h3>
<p><img decoding="async" loading="lazy" alt="Asset Schema Presets" src="https://developers.filespin.io/assets/images/asset_schema_presets-c1e03738dff84c30ffc03aff8697620e.png" width="1200" height="917" class="img_ev3q"></p>
<p><strong>Available presets:</strong></p>
<table><thead><tr><th>Preset</th><th>Fields</th><th>Best for</th></tr></thead><tbody><tr><td>Marketing</td><td>19</td><td>Campaign tracking, brand assets, channel distribution</td></tr><tr><td>E-Commerce &amp; Retail</td><td>23</td><td>Product catalogs, SKU tracking, seasonal collections</td></tr><tr><td>Events &amp; Conferences</td><td>21</td><td>Session/speaker tracking, sponsor assets</td></tr><tr><td>Attractions &amp; Experiences</td><td>19</td><td>Venue management, guest photos</td></tr><tr><td>Hospitality &amp; Travel</td><td>20</td><td>Hotel/venue assets, seasonal campaigns</td></tr><tr><td>Fashion &amp; Apparel</td><td>21</td><td>Collections, style tracking, lookbooks</td></tr></tbody></table>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="using-presets">Using presets<a href="https://developers.filespin.io/guides/asset-schemas/#using-presets" class="hash-link" aria-label="Direct link to Using presets" title="Direct link to Using presets" translate="no">​</a></h3>
<p>Presets are available for immediate use. To apply a preset to your assets, reference the preset ID when creating a schema or assigning metadata. For example, use <code>ecommerce</code> to tag assets with product-specific fields like SKU, category, and season.</p>
<p>Each preset includes a set of common fields (title, description, tags, status, project, etc.) plus industry-specific fields. You can customize them after creation by building a custom schema based on the preset structure.</p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="designing-a-custom-schema">Designing a custom schema<a href="https://developers.filespin.io/guides/asset-schemas/#designing-a-custom-schema" class="hash-link" aria-label="Direct link to Designing a custom schema" title="Direct link to Designing a custom schema" translate="no">​</a></h2>
<p>If presets don't fit your needs, you can design a schema from scratch. Here's the anatomy of a schema definition:</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="schema-structure">Schema structure<a href="https://developers.filespin.io/guides/asset-schemas/#schema-structure" class="hash-link" aria-label="Direct link to Schema structure" title="Direct link to Schema structure" translate="no">​</a></h3>
<div class="language-json codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"name"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token property" style="color:#36acaa">"en"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"Product Assets"</span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"status"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"ACTIVE"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"schema"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token property" style="color:#36acaa">"$schema"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"https://json-schema.org/draft/2020-12/schema"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token property" style="color:#36acaa">"type"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"object"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token property" style="color:#36acaa">"properties"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token property" style="color:#36acaa">"product_name"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token property" style="color:#36acaa">"type"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"string"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token property" style="color:#36acaa">"maxLength"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">200</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token property" style="color:#36acaa">"filespin_properties"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token property" style="color:#36acaa">"title"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token property" style="color:#36acaa">"en"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"Product Name"</span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token property" style="color:#36acaa">"hint"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token property" style="color:#36acaa">"en"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"The product this asset is associated with"</span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token property" style="color:#36acaa">"placeholder"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token property" style="color:#36acaa">"en"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"e.g. Summer Hat Collection"</span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token property" style="color:#36acaa">"searchable"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">true</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token property" style="color:#36acaa">"keyword_searchable"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">true</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token property" style="color:#36acaa">"ui"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token property" style="color:#36acaa">"order"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">1</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token property" style="color:#36acaa">"sku"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token property" style="color:#36acaa">"type"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"string"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token property" style="color:#36acaa">"maxLength"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">50</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token property" style="color:#36acaa">"filespin_properties"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token property" style="color:#36acaa">"title"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token property" style="color:#36acaa">"en"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"SKU"</span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token property" style="color:#36acaa">"searchable"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">false</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token property" style="color:#36acaa">"keyword_searchable"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">false</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token property" style="color:#36acaa">"ui"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token property" style="color:#36acaa">"order"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">2</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="supported-field-types">Supported field types<a href="https://developers.filespin.io/guides/asset-schemas/#supported-field-types" class="hash-link" aria-label="Direct link to Supported field types" title="Direct link to Supported field types" translate="no">​</a></h3>
<p><strong>String fields:</strong></p>
<div class="language-json codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token property" style="color:#36acaa">"title"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"type"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"string"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"maxLength"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">500</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></span></code></pre></div></div>
<p><strong>String with format (email):</strong></p>
<div class="language-json codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token property" style="color:#36acaa">"contact_email"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"type"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"string"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"format"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"email"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"maxLength"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">254</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></span></code></pre></div></div>
<p><strong>Date fields:</strong></p>
<div class="language-json codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token property" style="color:#36acaa">"expiration_date"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"type"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"string"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"format"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"date"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></span></code></pre></div></div>
<p>Date values must be in <code>YYYY-MM-DD</code> format.</p>
<p><strong>Enum fields (predefined options):</strong></p>
<div class="language-json codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token property" style="color:#36acaa">"status"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"type"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"string"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"enum"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">"draft"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"in_review"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"approved"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"published"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"archived"</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></span></code></pre></div></div>
<p><strong>Array fields (multiple values):</strong></p>
<div class="language-json codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token property" style="color:#36acaa">"tags"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"type"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"array"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"items"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token property" style="color:#36acaa">"type"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"string"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token property" style="color:#36acaa">"maxLength"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">100</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></span></code></pre></div></div>
<p><strong>Number fields:</strong></p>
<div class="language-json codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token property" style="color:#36acaa">"price"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"type"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"number"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></span></code></pre></div></div>
<p><strong>Boolean fields:</strong></p>
<div class="language-json codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token property" style="color:#36acaa">"approved"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"type"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"boolean"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="filespin-properties">FileSpin properties<a href="https://developers.filespin.io/guides/asset-schemas/#filespin-properties" class="hash-link" aria-label="Direct link to FileSpin properties" title="Direct link to FileSpin properties" translate="no">​</a></h3>
<p>Every field should include <code>filespin_properties</code> to control how it behaves in search and the UI:</p>
<div class="language-json codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token property" style="color:#36acaa">"filespin_properties"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"title"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token property" style="color:#36acaa">"en"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"Display Label"</span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"hint"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token property" style="color:#36acaa">"en"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"Help text shown below the field"</span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"placeholder"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token property" style="color:#36acaa">"en"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"Placeholder text inside the input"</span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"searchable"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">true</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"keyword_searchable"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">true</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"ui"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token property" style="color:#36acaa">"order"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">1</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token property" style="color:#36acaa">"readonly"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">false</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token property" style="color:#36acaa">"disabled"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">false</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token property" style="color:#36acaa">"hidden"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">false</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token property" style="color:#36acaa">"multiline"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">false</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></span></code></pre></div></div>
<table><thead><tr><th>Property</th><th>Effect</th></tr></thead><tbody><tr><td><code>searchable</code></td><td>Field is included in full-text search</td></tr><tr><td><code>keyword_searchable</code></td><td>Field contributes to the keyword search field</td></tr><tr><td><code>ui.order</code></td><td>Display order in forms (lower numbers first)</td></tr><tr><td><code>ui.multiline</code></td><td>Render as a text area instead of single-line input</td></tr><tr><td><code>ui.hidden</code></td><td>Don't show in the form</td></tr></tbody></table>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="creating-a-schema">Creating a schema<a href="https://developers.filespin.io/guides/asset-schemas/#creating-a-schema" class="hash-link" aria-label="Direct link to Creating a schema" title="Direct link to Creating a schema" translate="no">​</a></h2>
<p>Use the <a class="" href="https://developers.filespin.io/api-reference/asset-schema/create-asset-schema-post/">Create Asset Schema</a> API:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token function" style="color:#d73a49">curl</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">-X</span><span class="token plain"> POST </span><span class="token string" style="color:#e3116c">"https://app.filespin.io/api/v1/assetschemas"</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">\</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token parameter variable" style="color:#36acaa">-H</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"X-FileSpin-Api-Key: YOUR_API_KEY"</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">\</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token parameter variable" style="color:#36acaa">-H</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"Content-Type: application/json"</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">\</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token parameter variable" style="color:#36acaa">-d</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'{</span><br></span><span class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c">    "name": {"en": "Product Assets"},</span><br></span><span class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c">    "status": "ACTIVE",</span><br></span><span class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c">    "schema": {</span><br></span><span class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c">      "$schema": "https://json-schema.org/draft/2020-12/schema",</span><br></span><span class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c">      "type": "object",</span><br></span><span class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c">      "properties": {</span><br></span><span class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c">        "product_name_txt": {</span><br></span><span class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c">          "type": "string",</span><br></span><span class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c">          "maxLength": 200,</span><br></span><span class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c">          "filespin_properties": {</span><br></span><span class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c">            "title": {"en": "Product Name"},</span><br></span><span class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c">            "searchable": true,</span><br></span><span class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c">            "keyword_searchable": true,</span><br></span><span class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c">            "ui": {"order": 1}</span><br></span><span class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c">          }</span><br></span><span class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c">        },</span><br></span><span class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c">        "sku": {</span><br></span><span class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c">          "type": "string",</span><br></span><span class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c">          "maxLength": 50,</span><br></span><span class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c">          "filespin_properties": {</span><br></span><span class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c">            "title": {"en": "SKU"},</span><br></span><span class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c">            "searchable": false,</span><br></span><span class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c">            "ui": {"order": 2}</span><br></span><span class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c">          }</span><br></span><span class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c">        },</span><br></span><span class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c">        "category": {</span><br></span><span class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c">          "type": "string",</span><br></span><span class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c">          "enum": ["clothing", "accessories", "footwear", "electronics"],</span><br></span><span class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c">          "filespin_properties": {</span><br></span><span class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c">            "title": {"en": "Category"},</span><br></span><span class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c">            "searchable": false,</span><br></span><span class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c">            "ui": {"order": 3}</span><br></span><span class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c">          }</span><br></span><span class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c">        },</span><br></span><span class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c">        "tags": {</span><br></span><span class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c">          "type": "array",</span><br></span><span class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c">          "items": {"type": "string", "maxLength": 100},</span><br></span><span class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c">          "filespin_properties": {</span><br></span><span class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c">            "title": {"en": "Tags"},</span><br></span><span class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c">            "searchable": true,</span><br></span><span class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c">            "keyword_searchable": true,</span><br></span><span class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c">            "ui": {"order": 4}</span><br></span><span class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c">          }</span><br></span><span class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c">        }</span><br></span><span class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c">      }</span><br></span><span class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c">    }</span><br></span><span class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c">  }'</span><br></span></code></pre></div></div>
<p><strong>Response:</strong></p>
<div class="language-json codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"id"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">3</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></span></code></pre></div></div>
<div class="theme-admonition theme-admonition-info admonition_xJq3 alert alert--info"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"></path></svg></span>Permission required</div><div class="admonitionContent_BuS1"><p>Creating schemas requires the <code>SCHEMA_ADMIN</code> permission. Typically, only ADMIN users have this.</p></div></div>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="assigning-a-schema-to-an-asset">Assigning a schema to an asset<a href="https://developers.filespin.io/guides/asset-schemas/#assigning-a-schema-to-an-asset" class="hash-link" aria-label="Direct link to Assigning a schema to an asset" title="Direct link to Assigning a schema to an asset" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="at-upload-time">At upload time<a href="https://developers.filespin.io/guides/asset-schemas/#at-upload-time" class="hash-link" aria-label="Direct link to At upload time" title="Direct link to At upload time" translate="no">​</a></h3>
<p>Include <code>data_schema_id</code> and <code>custom_metadata</code> in the upload request:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token function" style="color:#d73a49">curl</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">-X</span><span class="token plain"> POST </span><span class="token string" style="color:#e3116c">"https://upload.filespin.io/api/v1/assets/new/content/original/upload"</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">\</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token parameter variable" style="color:#36acaa">-H</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"X-FileSpin-Api-Key: YOUR_API_KEY"</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">\</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token parameter variable" style="color:#36acaa">-F</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"file=@summer-hat.jpg"</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">\</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token parameter variable" style="color:#36acaa">-F</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'custom_metadata={"product_name": "Summer Straw Hat", "sku": "HAT-STR-001", "category": "accessories", "tags": ["summer", "straw", "beach"], data_schema_id=3}'</span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="after-upload-update-metadata">After upload (update metadata)<a href="https://developers.filespin.io/guides/asset-schemas/#after-upload-update-metadata" class="hash-link" aria-label="Direct link to After upload (update metadata)" title="Direct link to After upload (update metadata)" translate="no">​</a></h3>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token function" style="color:#d73a49">curl</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">-X</span><span class="token plain"> POST </span><span class="token string" style="color:#e3116c">"https://app.filespin.io/api/v1/assets/ASSET_ID/data/update"</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">\</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token parameter variable" style="color:#36acaa">-H</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"X-FileSpin-Api-Key: YOUR_API_KEY"</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">\</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token parameter variable" style="color:#36acaa">-H</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"Content-Type: application/json"</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">\</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token parameter variable" style="color:#36acaa">-d</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'{</span><br></span><span class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c">    "data_schema_id": 3,</span><br></span><span class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c">    "data": {</span><br></span><span class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c">      "product_name": "Summer Straw Hat",</span><br></span><span class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c">      "sku": "HAT-STR-001",</span><br></span><span class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c">      "category": "accessories",</span><br></span><span class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c">      "tags": ["summer", "straw", "beach"]</span><br></span><span class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c">    },</span><br></span><span class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c">    "mode": "REPLACE"</span><br></span><span class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c">  }'</span><br></span></code></pre></div></div>
<p>FileSpin validates the data against the schema before saving. If validation fails, a HTTP 400 response will be returned with useful error message.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="using-schemas-with-the-file-picker-widget">Using schemas with the File Picker widget<a href="https://developers.filespin.io/guides/asset-schemas/#using-schemas-with-the-file-picker-widget" class="hash-link" aria-label="Direct link to Using schemas with the File Picker widget" title="Direct link to Using schemas with the File Picker widget" translate="no">​</a></h3>
<p>When using the File Picker widget, assign a schema via the reserved <code>__data_schema_id</code> key:</p>
<div class="language-javascript codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-javascript codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">var</span><span class="token plain"> payload </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token string-property property" style="color:#36acaa">"ASSET_ID"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token string-property property" style="color:#36acaa">"product_namet"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"Summer Straw Hat"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token string-property property" style="color:#36acaa">"sku"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"HAT-STR-001"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token string-property property" style="color:#36acaa">"__data_schema_id"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">3</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">;</span><br></span></code></pre></div></div>
<p>The <code>__data_schema_id</code> key is not stored as data -- it only tells FileSpin which schema to associate.</p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="searching-by-schema-fields">Searching by schema fields<a href="https://developers.filespin.io/guides/asset-schemas/#searching-by-schema-fields" class="hash-link" aria-label="Direct link to Searching by schema fields" title="Direct link to Searching by schema fields" translate="no">​</a></h2>
<p>Once assets have schema data, you can search using <code>schema_criteria</code>:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token function" style="color:#d73a49">curl</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">-X</span><span class="token plain"> POST </span><span class="token string" style="color:#e3116c">"https://app.filespin.io/api/v1/assets/search"</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">\</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token parameter variable" style="color:#36acaa">-H</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"X-FileSpin-Api-Key: YOUR_API_KEY"</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">\</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token parameter variable" style="color:#36acaa">-H</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"Content-Type: application/json"</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">\</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token parameter variable" style="color:#36acaa">-d</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'{</span><br></span><span class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c">    "schema_criteria": {</span><br></span><span class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c">      "data_schema_id": 3,</span><br></span><span class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c">      "fields": {</span><br></span><span class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c">        "category": "accessories",</span><br></span><span class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c">        "tags": "summer"</span><br></span><span class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c">      }</span><br></span><span class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c">    }</span><br></span><span class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c">  }'</span><br></span></code></pre></div></div>
<p>You can combine schema criteria with keyword search and other filters:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token function" style="color:#d73a49">curl</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">-X</span><span class="token plain"> POST </span><span class="token string" style="color:#e3116c">"https://app.filespin.io/api/v1/assets/search"</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">\</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token parameter variable" style="color:#36acaa">-H</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"X-FileSpin-Api-Key: YOUR_API_KEY"</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">\</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token parameter variable" style="color:#36acaa">-H</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"Content-Type: application/json"</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">\</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token parameter variable" style="color:#36acaa">-d</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'{</span><br></span><span class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c">    "keyword": "hat",</span><br></span><span class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c">    "content_type": "image*",</span><br></span><span class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c">    "schema_criteria": {</span><br></span><span class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c">      "data_schema_id": 3,</span><br></span><span class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c">      "fields": {</span><br></span><span class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c">        "category": "accessories"</span><br></span><span class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c">      }</span><br></span><span class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c">    }</span><br></span><span class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c">  }'</span><br></span></code></pre></div></div>
<p>See the <a class="" href="https://developers.filespin.io/guides/search-patterns/">Search Patterns guide</a> for more advanced search techniques.</p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="updating-a-schema">Updating a schema<a href="https://developers.filespin.io/guides/asset-schemas/#updating-a-schema" class="hash-link" aria-label="Direct link to Updating a schema" title="Direct link to Updating a schema" translate="no">​</a></h2>
<p>Use the <a class="" href="https://developers.filespin.io/api-reference/asset-schema/update-asset-schema-put/">Update Asset Schema</a> API to modify schemas. You can change some things, but with restrictions to protect existing data:</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="what-you-can-change">What you CAN change<a href="https://developers.filespin.io/guides/asset-schemas/#what-you-can-change" class="hash-link" aria-label="Direct link to What you CAN change" title="Direct link to What you CAN change" translate="no">​</a></h3>
<ul>
<li class=""><strong>Add new fields</strong> -- Existing assets won't have values for these fields, which is fine</li>
<li class=""><strong>Increase <code>maxLength</code></strong> for text fields -- Makes the field accept longer values</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="what-you-cannot-change">What you CANNOT change<a href="https://developers.filespin.io/guides/asset-schemas/#what-you-cannot-change" class="hash-link" aria-label="Direct link to What you CANNOT change" title="Direct link to What you CANNOT change" translate="no">​</a></h3>
<ul>
<li class=""><strong>Field types</strong> -- Can't change a string to a number</li>
<li class=""><strong>Search properties</strong> (<code>searchable</code>, <code>keyword_searchable</code>) -- Would require re-indexing</li>
<li class=""><strong>Remove fields</strong> -- Would orphan existing data</li>
<li class=""><strong>Rename fields</strong> -- Same as remove + add, breaks existing data</li>
<li class=""><strong>Decrease <code>minLength</code></strong> -- Would invalidate previously valid data</li>
</ul>
<div class="theme-admonition theme-admonition-tip admonition_xJq3 alert alert--success"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>Schema versioning strategy</div><div class="admonitionContent_BuS1"><p>Since you can't change field types or search properties, plan your schema carefully before creating it. If you need incompatible changes, create a new schema and migrate assets gradually. After migration, you can deactivate the old schema by setting <code>status: "INACTIVE"</code>.</p></div></div>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="deleting-a-schema">Deleting a schema<a href="https://developers.filespin.io/guides/asset-schemas/#deleting-a-schema" class="hash-link" aria-label="Direct link to Deleting a schema" title="Direct link to Deleting a schema" translate="no">​</a></h2>
<p>Use the <a class="" href="https://developers.filespin.io/api-reference/asset-schema/delete-asset-schema-delete/">Delete Asset Schema</a> API. Schemas can be deleted directly. To deactivate a schema instead (soft-delete), set its status to <code>INACTIVE</code>:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic"># Delete the schema</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">curl</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">-X</span><span class="token plain"> DELETE </span><span class="token string" style="color:#e3116c">"https://app.filespin.io/api/v1/assetschemas/3"</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">\</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token parameter variable" style="color:#36acaa">-H</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"X-FileSpin-Api-Key: YOUR_API_KEY"</span><br></span></code></pre></div></div>
<p>Alternatively, to keep the schema but prevent new assets from using it, set it to <code>INACTIVE</code>:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token function" style="color:#d73a49">curl</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">-X</span><span class="token plain"> PUT </span><span class="token string" style="color:#e3116c">"https://app.filespin.io/api/v1/assetschemas/3"</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">\</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token parameter variable" style="color:#36acaa">-H</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"X-FileSpin-Api-Key: YOUR_API_KEY"</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">\</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token parameter variable" style="color:#36acaa">-H</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"Content-Type: application/json"</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">\</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token parameter variable" style="color:#36acaa">-d</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'{"id": 3, "status": "INACTIVE", "name": {"en": "Product Assets"}, "schema": {"$schema": "https://json-schema.org/draft/2020-12/schema", "type": "object", "properties": {}}}'</span><br></span></code></pre></div></div>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="best-practices">Best practices<a href="https://developers.filespin.io/guides/asset-schemas/#best-practices" class="hash-link" aria-label="Direct link to Best practices" title="Direct link to Best practices" translate="no">​</a></h2>
<ol>
<li class="">
<p><strong>Use presets as a starting point.</strong> Even if they don't match your use case exactly, they demonstrate good schema design patterns and save time.</p>
</li>
<li class="">
<p><strong>Keep total metadata under 3,000 characters.</strong> This is the storage limit per asset for custom data. Avoid storing lengthy content -- keep metadata concise and descriptive.</p>
</li>
<li class="">
<p><strong>Keep individual text fields under 1,000 characters.</strong> This is the per-field limit for string values.</p>
</li>
<li class="">
<p><strong>Start with common fields.</strong> Fields like title, description, tags, and status are useful in almost every schema. The presets all share 11 common fields for this reason.</p>
</li>
<li class="">
<p><strong>Use enums for controlled vocabularies.</strong> If a field has a fixed set of valid values (status, category, region), use <code>enum</code> to enforce consistency.</p>
</li>
<li class="">
<p><strong>Configure search properties deliberately.</strong> Making every field <code>searchable</code> and <code>keyword_searchable</code> adds indexing overhead. Only enable what you actually need to query.</p>
</li>
</ol>
<hr>]]></content:encoded>
            <category>schemas</category>
            <category>metadata</category>
            <category>search</category>
            <category>getting-started</category>
        </item>
        <item>
            <title><![CDATA[Face Recognition: Indexing, Searching, and Managing Face Data]]></title>
            <link>https://developers.filespin.io/guides/face-recognition/</link>
            <guid>https://developers.filespin.io/guides/face-recognition/</guid>
            <pubDate>Fri, 06 Feb 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[Index faces in your images, find every photo of a person from one reference photo in the Dashboard, through an AI agent or with the API, and manage face data.]]></description>
            <content:encoded><![CDATA[<p>Index faces in your images, find every photo of a person from one reference photo in the Dashboard, through an AI agent or with the API, and manage face data.</p>
<p>A conference produces thousands of photos, and the speaker's agent wants every one with the speaker in it by the end of the day. An attraction captures guests on rides, at meet-and-greets and from roaming photographers, and the guest wants all of their photos, not the three they happen to remember. File names and tags do not help with either: nobody tags a photo with the names of the people in the background.</p>
<p>FileSpin's Face Recognition addon indexes the faces in your images. After that, one reference photo finds every indexed image with that person in it, and the search can be narrowed with your own metadata, such as event, day or location. This guide covers turning indexing on, searching by face from the Dashboard, an AI agent and the API, and what happens to face data.</p>
<p><img decoding="async" loading="lazy" alt="Face Recognition Workflow" src="https://developers.filespin.io/assets/images/face-recognition-workflow-47c3aa7ab1b69995708c623d58480eda.svg" width="900" height="380" class="img_ev3q"></p>
<div class="theme-admonition theme-admonition-info admonition_xJq3 alert alert--info"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"></path></svg></span>Availability</div><div class="admonitionContent_BuS1"><p>Face Recognition is not enabled by default. Contact <a href="mailto:support@filespin.io" target="_blank" rel="noopener noreferrer" class="">support@filespin.io</a> to add it to your account. Indexing an image uses AI credits.</p></div></div>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="how-it-works">How it works<a href="https://developers.filespin.io/guides/face-recognition/#how-it-works" class="hash-link" aria-label="Direct link to How it works" title="Direct link to How it works" translate="no">​</a></h2>
<p>Face recognition has two halves:</p>
<ul>
<li class=""><strong>Indexing</strong> detects up to 10 faces in an image and stores an embedding for each: a set of numbers that describes the face, not a copy of it. The asset's <code>_filespin_fr_count</code> metadata field records how many faces were found. Indexing runs in the background.</li>
<li class=""><strong>Searching</strong> takes the most prominent face in a reference photo, compares it with the indexed faces in your account and returns the matching assets. The reference photo is discarded when the search completes.</li>
</ul>
<p>Only indexed images can be found, so indexing comes first.</p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="step-1-index-your-images">Step 1: Index your images<a href="https://developers.filespin.io/guides/face-recognition/#step-1-index-your-images" class="hash-link" aria-label="Direct link to Step 1: Index your images" title="Direct link to Step 1: Index your images" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="index-automatically-on-upload">Index automatically on upload<a href="https://developers.filespin.io/guides/face-recognition/#index-automatically-on-upload" class="hash-link" aria-label="Direct link to Index automatically on upload" title="Direct link to Index automatically on upload" translate="no">​</a></h3>
<p>For most accounts, the right setup is to index every new image as it arrives. Admins and managers set this up in the Dashboard:</p>
<ol>
<li class="">Open <strong>Admin → Add-ons</strong>.</li>
<li class="">On the <strong>Face Recognition and Search</strong> card, turn the addon on.</li>
<li class="">Select the gear icon to open the trigger settings.</li>
<li class="">Enable <strong>When asset is saved</strong> to index each new upload. <strong>When asset metadata is updated</strong> indexes an asset when its metadata changes instead.</li>
<li class="">Optionally, add schema field conditions so only relevant assets are indexed, such as assets whose <code>event</code> field is set. Narrower conditions mean fewer images processed and fewer credits used.</li>
</ol>
<p>Leave <strong>Process derived assets</strong> off unless you want FileSpin-generated outputs, such as background-removed copies, indexed as well. Otherwise the same face is indexed twice.</p>
<p>The same trigger settings are available through the <a class="" href="https://developers.filespin.io/api-reference/user/update-addons-settings-post/">Update Addons Settings</a> API. That call replaces the account's whole addon configuration, so send every addon's current settings along with the change.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="index-images-you-already-have">Index images you already have<a href="https://developers.filespin.io/guides/face-recognition/#index-images-you-already-have" class="hash-link" aria-label="Direct link to Index images you already have" title="Direct link to Index images you already have" translate="no">​</a></h3>
<p>Triggers only act on new events, so images uploaded before you turned indexing on need indexing separately:</p>
<ul>
<li class=""><strong>In the Dashboard,</strong> the <strong>Reprocess Assets</strong> page (admins and managers) takes a comma-separated list of asset IDs and the addons to run on them. Tick <strong>Face Recognition</strong>.</li>
<li class=""><strong>With the API,</strong> queue each image with <a class="" href="https://developers.filespin.io/api-reference/addons/face-recognition-post/">Index Faces</a>:</li>
</ul>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token function" style="color:#d73a49">curl</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">-X</span><span class="token plain"> POST </span><span class="token string" style="color:#e3116c">"https://app.filespin.io/api/v1/assets/ASSET_ID/addons/face_recognition"</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">\</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token parameter variable" style="color:#36acaa">-H</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"X-FileSpin-Api-Key: YOUR_API_KEY"</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">\</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token parameter variable" style="color:#36acaa">-H</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"Content-Type: application/json"</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">\</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token parameter variable" style="color:#36acaa">-d</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'{"disposition": {"update_metadata": true}}'</span><br></span></code></pre></div></div>
<p>The response is HTTP 202 with an empty body: the image is queued. HTTP 409 means the asset is already indexed. <a class="" href="https://developers.filespin.io/api-reference/addons/get-request-status-get/">Face Index Status</a> reports <code>QUEUED</code>, <code>PROCESSING</code>, <code>DONE</code> or <code>ERROR</code> for about a day after the request.</p>
<p>To find images that are already indexed, run an <a class="" href="https://developers.filespin.io/guides/search-patterns/">asset search</a> with <code>"addons_criteria": ["FACE_RECOGNITION"]</code>, or tick <strong>Face Recognition</strong> under <strong>Addons Processed</strong> in the Dashboard filter panel.</p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="step-2-search-by-face">Step 2: Search by face<a href="https://developers.filespin.io/guides/face-recognition/#step-2-search-by-face" class="hash-link" aria-label="Direct link to Step 2: Search by face" title="Direct link to Step 2: Search by face" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="in-the-dashboard">In the Dashboard<a href="https://developers.filespin.io/guides/face-recognition/#in-the-dashboard" class="hash-link" aria-label="Direct link to In the Dashboard" title="Direct link to In the Dashboard" translate="no">​</a></h3>
<p>When the addon is enabled, the search bar on the Assets page shows a face icon.</p>
<ol>
<li class="">Select the face icon.</li>
<li class="">Take a photo with your camera, or select <strong>Browse from files</strong> to pick a JPEG or PNG reference photo.</li>
<li class="">To narrow the search, pick a schema under <strong>Filters</strong>, fill in the fields to match (for example, the event and day) and select <strong>Submit</strong>.</li>
</ol>
<p>Matches appear in the normal asset grid with a <strong>Face search active</strong> pill. Keyword search, sorting and the regular filter panel are off while a face search is active. Remove the reference photo from the search bar to return to normal search.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="with-an-ai-agent">With an AI agent<a href="https://developers.filespin.io/guides/face-recognition/#with-an-ai-agent" class="hash-link" aria-label="Direct link to With an AI agent" title="Direct link to With an AI agent" translate="no">​</a></h3>
<p>The <code>search_by_face</code> tool on the <a class="" href="https://developers.filespin.io/guides/ai-agent-integration/">FileSpin MCP Server</a> takes the reference face in three ways: an image already in FileSpin (by asset ID), a photo shared in the conversation, or a public image URL. Photos passed in the conversation or by URL are not stored.</p>
<ul>
<li class=""><em>"Use asset 9f2c… as the face reference and find every photo of this person from the Lisbon summit."</em></li>
<li class=""><em>"Here is a photo of our keynote speaker. Find all matching photos, add them to a collection called Keynote – Day 1 and create a share page for the speaker's team."</em></li>
<li class=""><em>"Find all photos of this guest from today, then build a gallery share that expires in 7 days."</em></li>
</ul>
<p>The second and third prompts show where an agent earns its keep: it chains the face search with tagging, collections and <a class="" href="https://developers.filespin.io/guides/sharing-assets/">Branded Share Pages</a>, which would otherwise be several manual steps.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="with-the-api">With the API<a href="https://developers.filespin.io/guides/face-recognition/#with-the-api" class="hash-link" aria-label="Direct link to With the API" title="Direct link to With the API" translate="no">​</a></h3>
<p><a class="" href="https://developers.filespin.io/api-reference/addons/face-search-post/">Face Search</a> is a multipart form upload:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token function" style="color:#d73a49">curl</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">-X</span><span class="token plain"> POST </span><span class="token string" style="color:#e3116c">"https://app.filespin.io/api/v1/ml/people/facesearch"</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">\</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token parameter variable" style="color:#36acaa">-H</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"X-FileSpin-Api-Key: YOUR_API_KEY"</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">\</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token parameter variable" style="color:#36acaa">-F</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"image=@reference-photo.jpg"</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">\</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token parameter variable" style="color:#36acaa">-F</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"strictness=9.5"</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">\</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token parameter variable" style="color:#36acaa">-F</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'filters={"event": "lisbon-summit", "day": "1 2"}'</span><br></span></code></pre></div></div>
<div class="language-json codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"data"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token property" style="color:#36acaa">"matches"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token string" style="color:#e3116c">"a1b2c3d4e5f6789012345678abcdef90"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token string" style="color:#e3116c">"b2c3d4e5f6789012345678abcdef901a"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"page"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">1</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"search_id"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"eed4c602a80a4920a4a9e56b5d3ea161"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"limit_per_page"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">30</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"hits"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">2</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></span></code></pre></div></div>
<table><thead><tr><th>Form field</th><th>Meaning</th></tr></thead><tbody><tr><td><code>image</code></td><td>Reference photo, up to 10 MB. Only the most prominent face is used.</td></tr><tr><td><code>strictness</code></td><td>0 (loose) to 10 (strict). Default 9.9.</td></tr><tr><td><code>filters</code></td><td>JSON string of metadata fields to match, described below.</td></tr><tr><td><code>limit_per_page</code></td><td>1 to 30. Default 30.</td></tr><tr><td><code>extended_result</code></td><td><code>true</code> adds Asset Data for each match under <code>data.extended_result</code>.</td></tr></tbody></table>
<p><strong>Strictness</strong> trades recall for precision. The default of 9.9 returns only close matches. If you know a person is in photos that are not being found, lower it in small steps, such as 9.5 and then 9.0, and check the extra results for look-alikes as you go.</p>
<p><strong>Filters</strong> narrow matches by asset metadata:</p>
<ul>
<li class="">Fields are ANDed together. Field names are case-sensitive.</li>
<li class="">Space-separated values in one field are ORed: <code>{"day": "1 2"}</code> matches day 1 or day 2.</li>
<li class="">Fields whose names end in <code>Date</code> take an inclusive ISO 8601 range: <code>{"captureDate": ["2026-03-01T00:00:00Z", "2026-03-03T23:59:59Z"]}</code>.</li>
<li class="">Filters need face recognition to be running from the addon's trigger settings (Step 1).</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="paging-through-matches">Paging through matches<a href="https://developers.filespin.io/guides/face-recognition/#paging-through-matches" class="hash-link" aria-label="Direct link to Paging through matches" title="Direct link to Paging through matches" translate="no">​</a></h3>
<p><code>hits</code> is the total number of matches. Later pages come from <a class="" href="https://developers.filespin.io/api-reference/addons/retrieve-paginated-search-get/">Paginated Search Results</a> with the <code>search_id</code>:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token function" style="color:#d73a49">curl</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"https://app.filespin.io/api/v1/ml/people/facesearch?search_id=eed4c602a80a4920a4a9e56b5d3ea161&amp;page=2"</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">\</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token parameter variable" style="color:#36acaa">-H</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"X-FileSpin-Api-Key: YOUR_API_KEY"</span><br></span></code></pre></div></div>
<p>The page request has its own <code>limit_per_page</code> (default 30) and <code>extended_result</code> (default <code>false</code>) parameters. They do not carry over from the first request, so send the same values on every page, or page numbers will not line up with the first page. A loop that reads every match:</p>
<div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">import</span><span class="token plain"> math</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">import</span><span class="token plain"> requests</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">API_BASE </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"https://app.filespin.io/api/v1"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">HEADERS </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token string" style="color:#e3116c">"X-FileSpin-Api-Key"</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"YOUR_API_KEY"</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">PER_PAGE </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">30</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">with</span><span class="token plain"> </span><span class="token builtin">open</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"reference-photo.jpg"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"rb"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">as</span><span class="token plain"> f</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    first </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> requests</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">post</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token string-interpolation string" style="color:#e3116c">f"</span><span class="token string-interpolation interpolation punctuation" style="color:#393A34">{</span><span class="token string-interpolation interpolation">API_BASE</span><span class="token string-interpolation interpolation punctuation" style="color:#393A34">}</span><span class="token string-interpolation string" style="color:#e3116c">/ml/people/facesearch"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        headers</span><span class="token operator" style="color:#393A34">=</span><span class="token plain">HEADERS</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        files</span><span class="token operator" style="color:#393A34">=</span><span class="token punctuation" style="color:#393A34">{</span><span class="token string" style="color:#e3116c">"image"</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> f</span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        data</span><span class="token operator" style="color:#393A34">=</span><span class="token punctuation" style="color:#393A34">{</span><span class="token string" style="color:#e3116c">"strictness"</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"9.5"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"limit_per_page"</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token builtin">str</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">PER_PAGE</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">json</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">matches </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token builtin">list</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">first</span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">"data"</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">"matches"</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">for</span><span class="token plain"> page </span><span class="token keyword" style="color:#00009f">in</span><span class="token plain"> </span><span class="token builtin">range</span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">2</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> math</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">ceil</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">first</span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">"hits"</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">/</span><span class="token plain"> PER_PAGE</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">+</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">1</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    resp </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> requests</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">get</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token string-interpolation string" style="color:#e3116c">f"</span><span class="token string-interpolation interpolation punctuation" style="color:#393A34">{</span><span class="token string-interpolation interpolation">API_BASE</span><span class="token string-interpolation interpolation punctuation" style="color:#393A34">}</span><span class="token string-interpolation string" style="color:#e3116c">/ml/people/facesearch"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        headers</span><span class="token operator" style="color:#393A34">=</span><span class="token plain">HEADERS</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        params</span><span class="token operator" style="color:#393A34">=</span><span class="token punctuation" style="color:#393A34">{</span><span class="token string" style="color:#e3116c">"search_id"</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> first</span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">"search_id"</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"page"</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> page</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"limit_per_page"</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> PER_PAGE</span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    resp</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">raise_for_status</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    matches</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">extend</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">resp</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">json</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">"data"</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">"matches"</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">print</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string-interpolation string" style="color:#e3116c">f"</span><span class="token string-interpolation interpolation punctuation" style="color:#393A34">{</span><span class="token string-interpolation interpolation builtin">len</span><span class="token string-interpolation interpolation punctuation" style="color:#393A34">(</span><span class="token string-interpolation interpolation">matches</span><span class="token string-interpolation interpolation punctuation" style="color:#393A34">)</span><span class="token string-interpolation interpolation punctuation" style="color:#393A34">}</span><span class="token string-interpolation string" style="color:#e3116c"> matching assets"</span><span class="token punctuation" style="color:#393A34">)</span><br></span></code></pre></div></div>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="face-data-and-privacy">Face data and privacy<a href="https://developers.filespin.io/guides/face-recognition/#face-data-and-privacy" class="hash-link" aria-label="Direct link to Face data and privacy" title="Direct link to Face data and privacy" translate="no">​</a></h2>
<table><thead><tr><th>Data</th><th>Kept?</th></tr></thead><tbody><tr><td>Face embeddings for indexed images</td><td>Yes, until you delete them</td></tr><tr><td>Reference photos used for search</td><td>No, discarded when the search completes</td></tr><tr><td>Face count (<code>_filespin_fr_count</code>)</td><td>Yes, in the asset's metadata</td></tr></tbody></table>
<p>You control how long face data is kept: it stays until you delete it, in one of two ways:</p>
<ul>
<li class=""><strong>When you delete an asset,</strong> FileSpin deletes its face data as part of the deletion. This applies to single and bulk deletes.</li>
<li class=""><strong>On request,</strong> <a class="" href="https://developers.filespin.io/api-reference/addons/delete-data-post/">Delete Face Data</a> removes the face data for up to 100 assets per call while keeping the assets themselves. Deletion is asynchronous (HTTP 202) and usually completes within seconds. This endpoint needs the admin role.</li>
</ul>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token function" style="color:#d73a49">curl</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">-X</span><span class="token plain"> POST </span><span class="token string" style="color:#e3116c">"https://app.filespin.io/api/v1/assets/addons/face_recognition/delete"</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">\</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token parameter variable" style="color:#36acaa">-H</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"X-FileSpin-Api-Key: YOUR_API_KEY"</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">\</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token parameter variable" style="color:#36acaa">-H</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"Content-Type: application/json"</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">\</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token parameter variable" style="color:#36acaa">-d</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'{"ids": ["a1b2c3d4e5f6789012345678abcdef90", "b2c3d4e5f6789012345678abcdef901a"]}'</span><br></span></code></pre></div></div>
<p>Deleting face data keeps the <code>_filespin_fr_count</code> field, so the asset still shows how many faces it had. To index the asset again later, delete its face data first: indexing an asset that is already indexed returns HTTP 409.</p>
<p>You decide which images are indexed and are responsible for having the right to process the faces in them. <a class="" href="https://developers.filespin.io/api-reference/addons/face-recognition-data-handling/">Face Recognition Data Handling</a> describes how FileSpin stores and protects face data.</p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="limitations">Limitations<a href="https://developers.filespin.io/guides/face-recognition/#limitations" class="hash-link" aria-label="Direct link to Limitations" title="Direct link to Limitations" translate="no">​</a></h2>
<ul>
<li class=""><strong>10 faces per image</strong> are indexed. In crowd shots, some faces will not be.</li>
<li class=""><strong>Image quality decides accuracy.</strong> Small faces (under about 40×40 pixels), strong angles, blur and harsh lighting all reduce matches. See <a class="" href="https://developers.filespin.io/api-reference/addons/face-recognition-limitations/">Face Recognition Limitations</a>.</li>
<li class=""><strong>One face per search.</strong> If the reference photo has several people, only the most prominent face is used. Crop to the person you want.</li>
<li class=""><strong>Indexing is asynchronous.</strong> A photo uploaded a moment ago may not be searchable yet.</li>
</ul>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="best-practices">Best practices<a href="https://developers.filespin.io/guides/face-recognition/#best-practices" class="hash-link" aria-label="Direct link to Best practices" title="Direct link to Best practices" translate="no">​</a></h2>
<ol>
<li class="">
<p><strong>Index on upload, with conditions.</strong> Automatic indexing keeps coverage complete. Schema conditions keep it to the images that need it, which keeps the credit spend proportional.</p>
</li>
<li class="">
<p><strong>Use clear reference photos.</strong> A sharp, well-lit, front-facing photo of one person does more for results than any strictness setting.</p>
</li>
<li class="">
<p><strong>Lower strictness only when you are missing known matches.</strong> Lower it in small steps and check what each step adds.</p>
</li>
<li class="">
<p><strong>Record the facts you will filter on at upload.</strong> Event, day, venue and photographer in schema fields make face search filters possible. They are hard to add afterwards.</p>
</li>
<li class="">
<p><strong>Delete face data you no longer need.</strong> When an event's photos have been delivered, delete the face data for those assets, even if you keep the images.</p>
</li>
</ol>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="next-steps">Next steps<a href="https://developers.filespin.io/guides/face-recognition/#next-steps" class="hash-link" aria-label="Direct link to Next steps" title="Direct link to Next steps" translate="no">​</a></h2>
<ul>
<li class=""><a class="" href="https://developers.filespin.io/guides/search-patterns/">Search patterns</a>: combine metadata filters and paging with any search</li>
<li class=""><a class="" href="https://developers.filespin.io/guides/sharing-assets/">Branded Share Pages</a>: deliver matched photos to speakers, sponsors or guests</li>
<li class=""><a class="" href="https://developers.filespin.io/guides/ai-agent-integration/">AI agent integration</a>: chain face search with tagging, collections and shares</li>
<li class=""><a class="" href="https://developers.filespin.io/api-reference/addons/addons-face-recognition/">Face Recognition API reference</a></li>
</ul>]]></content:encoded>
            <category>addons</category>
            <category>face-recognition</category>
            <category>search</category>
            <category>ai</category>
        </item>
        <item>
            <title><![CDATA[Search Patterns and Best Practices]]></title>
            <link>https://developers.filespin.io/guides/search-patterns/</link>
            <guid>https://developers.filespin.io/guides/search-patterns/</guid>
            <pubDate>Thu, 05 Feb 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[Find assets by keyword, file type, upload date, custom metadata and addon status, in the Dashboard, through an AI agent or with the Search API, and page through large result sets.]]></description>
            <content:encoded><![CDATA[<p>Find assets by keyword, file type, upload date, custom metadata and addon status, in the Dashboard, through an AI agent or with the Search API, and page through large result sets.</p>
<p>A DAM that cannot find things is a storage bill. Retail teams look for every approved shot of one product line, event teams for last Tuesday's keynote photos, attractions for one day's captures at one ride. The asset is almost always there. The question is whether the search can narrow to it before someone gives up and asks a colleague.</p>
<p>FileSpin runs the same search behind the Dashboard, the AI agent and the REST API. A filter you set in one behaves the same in the others, so a search a marketer builds in the Dashboard is the search a developer later automates. This guide covers the criteria you can combine, how paging works, and the patterns that keep result sets small enough to be useful.</p>
<p><img decoding="async" loading="lazy" alt="Search Patterns" src="https://developers.filespin.io/assets/images/search-patterns-workflow-8011c93aaba40687a80140f9214cff08.svg" width="900" height="400" class="img_ev3q"></p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="what-you-can-search-on">What you can search on<a href="https://developers.filespin.io/guides/search-patterns/#what-you-can-search-on" class="hash-link" aria-label="Direct link to What you can search on" title="Direct link to What you can search on" translate="no">​</a></h2>
<p>Every search is a set of criteria. All criteria in one search are combined with AND: an asset must match every one.</p>
<table><thead><tr><th>Criterion</th><th>Matches</th><th>Dashboard</th><th>API field</th></tr></thead><tbody><tr><td>Keyword</td><td>Words in file names (3+ characters), image auto-tags, text found in images, the system and path an asset was imported from, and custom fields marked <code>keyword_searchable</code> (or <code>filespin_search_txt</code> on assets without a schema)</td><td>Search bar</td><td><code>keyword</code></td></tr><tr><td>File name</td><td>File names, with <code>*</code> as a suffix wildcard</td><td>Filter panel: File Name</td><td><code>file_name</code></td></tr><tr><td>File type</td><td>MIME type, with <code>*</code> wildcard (<code>image*</code>, <code>video*</code>, <code>application/pdf</code>)</td><td>Filter panel: Content Type</td><td><code>content_type</code></td></tr><tr><td>Upload date</td><td>Inclusive range, UTC</td><td>Filter panel: Upload Date</td><td><code>upload_time_range</code></td></tr><tr><td>Custom metadata</td><td>Fields from your asset schemas marked <code>searchable</code></td><td>Filter panel: Asset Schema</td><td><code>schema_criteria</code></td></tr><tr><td>Addon processed</td><td>Assets an addon has processed, such as face recognition or auto-tags</td><td>Filter panel: Addons Processed</td><td><code>addons_criteria</code></td></tr><tr><td>File size</td><td>Inclusive range in bytes</td><td>Sort only</td><td><code>file_size_range</code></td></tr><tr><td>Uploaded by</td><td>One user in your user group</td><td>—</td><td><code>creator_id</code></td></tr><tr><td>Specific assets</td><td>Up to 100 asset IDs</td><td>—</td><td><code>ids</code></td></tr><tr><td>Deleted assets</td><td>Assets in the trash, not yet purged (admins only)</td><td>Deleted Assets page</td><td><code>trashed</code></td></tr></tbody></table>
<p>Custom fields only become searchable when the schema says so. Mark a field <code>searchable</code> to filter on it, and <code>keyword_searchable</code> to have the keyword box match it too. The <a class="" href="https://developers.filespin.io/guides/asset-schemas/">custom metadata schemas guide</a> covers schema design.</p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="search-in-the-dashboard">Search in the Dashboard<a href="https://developers.filespin.io/guides/search-patterns/#search-in-the-dashboard" class="hash-link" aria-label="Direct link to Search in the Dashboard" title="Direct link to Search in the Dashboard" translate="no">​</a></h2>
<p>The Assets page is where most people search, and it exposes most of the criteria above without writing a query.</p>
<ol>
<li class=""><strong>Type in the search bar</strong> for a keyword search. Results update as you type.</li>
<li class=""><strong>Open the filter panel</strong> with the sliders icon to add file name, content type, upload date, asset status, addons processed and asset schema filters. For a schema filter, pick the schema, fill in the fields you care about and select <strong>Submit</strong>.</li>
<li class=""><strong>Check the filter pills</strong> above the results. Every active filter shows as a pill you can remove, with <strong>Clear all</strong> to start again. If a search returns fewer assets than expected, a forgotten pill is the usual reason.</li>
<li class=""><strong>Sort</strong> with the <strong>Sort by</strong> menu: upload date, file name, content type or file size. Select the active option again to flip between ascending and descending. The default is newest upload first.</li>
<li class=""><strong>Page</strong> through results with the pager at the bottom. You can show 12, 18 or 30 assets per page.</li>
</ol>
<p>Deleted assets do not appear in normal searches. Admins can search them on the <strong>Deleted Assets</strong> page, which has its own keyword search, sorting and content-type filter.</p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="search-with-an-ai-agent">Search with an AI agent<a href="https://developers.filespin.io/guides/search-patterns/#search-with-an-ai-agent" class="hash-link" aria-label="Direct link to Search with an AI agent" title="Direct link to Search with an AI agent" translate="no">​</a></h2>
<p>Through the <a class="" href="https://developers.filespin.io/guides/ai-agent-integration/">FileSpin MCP Server</a>, an agent turns a plain request into the same search criteria. When you use the agent inside the Dashboard, the filters it applies show up as the same pills, so you can see exactly what it searched for and adjust it by hand.</p>
<p>Prompts that work well name the criteria the way you would set them in the filter panel:</p>
<ul>
<li class=""><em>"Find all PDFs uploaded in March with 'brand guidelines' in the file name."</em></li>
<li class=""><em>"Show the 10 most recent images where the campaign field is spring-2026 and status is approved."</em></li>
<li class=""><em>"Find images older than 18 months that have never been processed for auto-tags."</em></li>
<li class=""><em>"List every video uploaded last week, largest first."</em></li>
</ul>
<p>Agents are good at the follow-up step that search alone does not do: tag the results, add them to a collection or build a <a class="" href="https://developers.filespin.io/guides/sharing-assets/">Branded Share Page</a> from them, in the same conversation.</p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="search-with-the-api">Search with the API<a href="https://developers.filespin.io/guides/search-patterns/#search-with-the-api" class="hash-link" aria-label="Direct link to Search with the API" title="Direct link to Search with the API" translate="no">​</a></h2>
<p>The Search API uses two calls:</p>
<ol>
<li class=""><code>POST /api/v1/assets/search</code> runs the search and returns the first page plus a <code>search_result_id</code>.</li>
<li class=""><code>GET /api/v1/assets/search/{search_result_id}/{page}</code> returns later pages of the same search.</li>
</ol>
<p>A request combines whichever criteria you need:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token function" style="color:#d73a49">curl</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">-X</span><span class="token plain"> POST </span><span class="token string" style="color:#e3116c">"https://app.filespin.io/api/v1/assets/search"</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">\</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token parameter variable" style="color:#36acaa">-H</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"X-FileSpin-Api-Key: YOUR_API_KEY"</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">\</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token parameter variable" style="color:#36acaa">-H</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"Content-Type: application/json"</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">\</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token parameter variable" style="color:#36acaa">-d</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'{</span><br></span><span class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c">    "keyword": "summer",</span><br></span><span class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c">    "content_type": "image*",</span><br></span><span class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c">    "upload_time_range": {</span><br></span><span class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c">      "start": "2026-01-01T00:00:00Z",</span><br></span><span class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c">      "end": "2026-06-30T23:59:59Z"</span><br></span><span class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c">    },</span><br></span><span class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c">    "schema_criteria": {</span><br></span><span class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c">      "data_schema_id": 3,</span><br></span><span class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c">      "fields": {</span><br></span><span class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c">        "category": "clothing",</span><br></span><span class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c">        "status": "approved"</span><br></span><span class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c">      }</span><br></span><span class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c">    },</span><br></span><span class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c">    "sort_by": ["upload_time_range_DESC"]</span><br></span><span class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c">  }'</span><br></span></code></pre></div></div>
<p>The response lists asset IDs for the first page:</p>
<div class="language-json codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"status"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"OK"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"search_result_id"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"0a9761f2f9"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"result"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token string" style="color:#e3116c">"a1b2c3d4e5f6789012345678abcdef90"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token string" style="color:#e3116c">"b2c3d4e5f6789012345678abcdef901a"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"total_files"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">47</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"page"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">1</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"total_pages"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">2</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></span></code></pre></div></div>
<p>The full parameter list is in the <a class="" href="https://developers.filespin.io/api-reference/asset-search/search-standard-options-post/">Search API reference</a>.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="keyword-rules">Keyword rules<a href="https://developers.filespin.io/guides/search-patterns/#keyword-rules" class="hash-link" aria-label="Direct link to Keyword rules" title="Direct link to Keyword rules" translate="no">​</a></h3>
<ul>
<li class=""><strong>OR or AND, not both.</strong> <code>beach OR sunset</code> matches either word. <code>beach AND sunset</code> matches both. A keyword cannot mix <code>AND</code> and <code>OR</code>, and is limited to 40 words.</li>
<li class=""><strong>Exact phrases go in double quotes.</strong> To match <code>ABC 123</code> as a phrase, send <code>"\"ABC 123\""</code>.</li>
<li class=""><strong>Quote words with special characters.</strong> <code>+ - &amp;&amp; || ! ( ) { } [ ] ^ " ~ * ? : \ /</code> have meaning in a query, so search for <code>ABC-123</code> as <code>"\"ABC-123\""</code>.</li>
<li class=""><strong>File names match on words of three or more characters.</strong> A file called <code>IMG_04.jpg</code> will not be found by keyword <code>04</code>. Use the <code>file_name</code> criterion with a wildcard instead: <code>IMG_04*</code>.</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="custom-metadata">Custom metadata<a href="https://developers.filespin.io/guides/search-patterns/#custom-metadata" class="hash-link" aria-label="Direct link to Custom metadata" title="Direct link to Custom metadata" translate="no">​</a></h3>
<p><code>schema_criteria</code> matches values in fields your schemas mark as <code>searchable</code>. Values support the same <code>OR</code>, suffix wildcard (<code>john*</code>) and quoting rules, and number fields take a range:</p>
<div class="language-json codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"schema_criteria"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token property" style="color:#36acaa">"data_schema_id"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">42</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token property" style="color:#36acaa">"fields"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token property" style="color:#36acaa">"season"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"spring OR summer"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token property" style="color:#36acaa">"sku"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"SNK-24*"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token property" style="color:#36acaa">"rating"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token number" style="color:#36acaa">4</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">5</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></span></code></pre></div></div>
<p><a class="" href="https://developers.filespin.io/api-reference/asset-search/advanced-search-options/">Advanced Search Options</a> has the full syntax.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="sorting">Sorting<a href="https://developers.filespin.io/guides/search-patterns/#sorting" class="hash-link" aria-label="Direct link to Sorting" title="Direct link to Sorting" translate="no">​</a></h3>
<p><code>sort_by</code> takes a list of keys, each ending in <code>_ASC</code> or <code>_DESC</code>. The keys are <code>upload_time_range</code>, <code>file_name</code>, <code>content_type</code> and <code>file_size_range</code>. The first key is the primary sort and later keys break ties. Without <code>sort_by</code>, results come newest upload first.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="paging-through-results">Paging through results<a href="https://developers.filespin.io/guides/search-patterns/#paging-through-results" class="hash-link" aria-label="Direct link to Paging through results" title="Direct link to Paging through results" translate="no">​</a></h3>
<p>Each page holds up to 30 asset IDs (<code>limit_per_page</code>, 1 to 30). A few rules shape any code that reads more than one page:</p>
<ul>
<li class=""><strong>A <code>search_result_id</code> lasts 60 minutes.</strong> It stores the search criteria, not the results: each page request runs the search again, so newly uploaded assets can appear and page contents can shift. After 60 minutes the ID returns HTTP 410. Run the search again to get a new one.</li>
<li class=""><strong>A search can page through 10,000 results at most.</strong> <code>total_files</code> can be higher than what <code>total_pages</code> lets you read. Split larger result sets with narrower criteria, such as one month of <code>upload_time_range</code> at a time.</li>
<li class=""><strong>Pages can hold fewer IDs than <code>limit_per_page</code>.</strong> Assets the caller cannot access are left out of the page. Count pages, not IDs.</li>
<li class=""><strong>Requesting a page past <code>total_pages</code> returns HTTP 400.</strong></li>
</ul>
<p>So loop over <code>total_pages</code> rather than comparing the number of IDs you have collected with <code>total_files</code>:</p>
<div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">import</span><span class="token plain"> requests</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">API_BASE </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"https://app.filespin.io/api/v1"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">HEADERS </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token string" style="color:#e3116c">"X-FileSpin-Api-Key"</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"YOUR_API_KEY"</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">first </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> requests</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">post</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token string-interpolation string" style="color:#e3116c">f"</span><span class="token string-interpolation interpolation punctuation" style="color:#393A34">{</span><span class="token string-interpolation interpolation">API_BASE</span><span class="token string-interpolation interpolation punctuation" style="color:#393A34">}</span><span class="token string-interpolation string" style="color:#e3116c">/assets/search"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    headers</span><span class="token operator" style="color:#393A34">=</span><span class="token plain">HEADERS</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    json</span><span class="token operator" style="color:#393A34">=</span><span class="token punctuation" style="color:#393A34">{</span><span class="token string" style="color:#e3116c">"content_type"</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"image*"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"keyword"</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"product"</span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">json</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">asset_ids </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token builtin">list</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">first</span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">"result"</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">for</span><span class="token plain"> page </span><span class="token keyword" style="color:#00009f">in</span><span class="token plain"> </span><span class="token builtin">range</span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">2</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> first</span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">"total_pages"</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">+</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">1</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    resp </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> requests</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">get</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token string-interpolation string" style="color:#e3116c">f"</span><span class="token string-interpolation interpolation punctuation" style="color:#393A34">{</span><span class="token string-interpolation interpolation">API_BASE</span><span class="token string-interpolation interpolation punctuation" style="color:#393A34">}</span><span class="token string-interpolation string" style="color:#e3116c">/assets/search/</span><span class="token string-interpolation interpolation punctuation" style="color:#393A34">{</span><span class="token string-interpolation interpolation">first</span><span class="token string-interpolation interpolation punctuation" style="color:#393A34">[</span><span class="token string-interpolation interpolation string" style="color:#e3116c">'search_result_id'</span><span class="token string-interpolation interpolation punctuation" style="color:#393A34">]</span><span class="token string-interpolation interpolation punctuation" style="color:#393A34">}</span><span class="token string-interpolation string" style="color:#e3116c">/</span><span class="token string-interpolation interpolation punctuation" style="color:#393A34">{</span><span class="token string-interpolation interpolation">page</span><span class="token string-interpolation interpolation punctuation" style="color:#393A34">}</span><span class="token string-interpolation string" style="color:#e3116c">"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        headers</span><span class="token operator" style="color:#393A34">=</span><span class="token plain">HEADERS</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    resp</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">raise_for_status</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    asset_ids</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">extend</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">resp</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">json</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">"result"</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">print</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string-interpolation string" style="color:#e3116c">f"</span><span class="token string-interpolation interpolation punctuation" style="color:#393A34">{</span><span class="token string-interpolation interpolation builtin">len</span><span class="token string-interpolation interpolation punctuation" style="color:#393A34">(</span><span class="token string-interpolation interpolation">asset_ids</span><span class="token string-interpolation interpolation punctuation" style="color:#393A34">)</span><span class="token string-interpolation interpolation punctuation" style="color:#393A34">}</span><span class="token string-interpolation string" style="color:#e3116c"> of </span><span class="token string-interpolation interpolation punctuation" style="color:#393A34">{</span><span class="token string-interpolation interpolation">first</span><span class="token string-interpolation interpolation punctuation" style="color:#393A34">[</span><span class="token string-interpolation interpolation string" style="color:#e3116c">'total_files'</span><span class="token string-interpolation interpolation punctuation" style="color:#393A34">]</span><span class="token string-interpolation interpolation punctuation" style="color:#393A34">}</span><span class="token string-interpolation string" style="color:#e3116c"> assets read"</span><span class="token punctuation" style="color:#393A34">)</span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="asset-data-in-the-results">Asset data in the results<a href="https://developers.filespin.io/guides/search-patterns/#asset-data-in-the-results" class="hash-link" aria-label="Direct link to Asset data in the results" title="Direct link to Asset data in the results" translate="no">​</a></h3>
<p>Set <code>"extended_result": true</code> to get the full <a class="" href="https://developers.filespin.io/api/asset-data-format/">Asset Data</a> for every asset on the page, keyed by asset ID, alongside the <code>result</code> list. It saves a request per asset but makes the search slower. Use it when you are about to display or process the assets, and leave it off when you only need IDs.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="duplicates-and-the-trash">Duplicates and the trash<a href="https://developers.filespin.io/guides/search-patterns/#duplicates-and-the-trash" class="hash-link" aria-label="Direct link to Duplicates and the trash" title="Direct link to Duplicates and the trash" translate="no">​</a></h3>
<ul>
<li class=""><code>GET /api/v1/assets/{asset_id}/content/original/duplicates</code> returns the IDs of other assets whose original file has the same MD5 checksum, whatever their file names. See <a class="" href="https://developers.filespin.io/api-reference/asset-search/find-duplicates-get/">Find Duplicates</a>.</li>
<li class=""><code>"trashed": true</code> searches deleted assets that have not been purged yet. It needs the admin role.</li>
</ul>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="best-practices">Best practices<a href="https://developers.filespin.io/guides/search-patterns/#best-practices" class="hash-link" aria-label="Direct link to Best practices" title="Direct link to Best practices" translate="no">​</a></h2>
<ol>
<li class="">
<p><strong>Start from the narrowest criterion you have.</strong> A content type and an upload date range cut most libraries down faster than a longer keyword does.</p>
</li>
<li class="">
<p><strong>Put the facts you filter on in schema fields.</strong> Status, campaign, SKU and season work better as <code>searchable</code> schema fields than as words in a file name. Exact values match exactly, and ranges work on numbers.</p>
</li>
<li class="">
<p><strong>Turn keyword search on deliberately.</strong> Mark free-text fields such as descriptions <code>keyword_searchable</code> so the search bar finds them. Leave codes and statuses as plain <code>searchable</code> fields so a keyword search does not match them by accident.</p>
</li>
<li class="">
<p><strong>Sort explicitly when order matters.</strong> Newest first is the default. If a report or export depends on order, send <code>sort_by</code> so the result does not change if the default ever does.</p>
</li>
<li class="">
<p><strong>Partition anything over 10,000 results.</strong> Split by month or by content type and run each slice as its own search.</p>
</li>
<li class="">
<p><strong>Ask for asset data only when you use it.</strong> <code>extended_result</code> is the right call for a page you are about to render, and wasted work for a job that only needs IDs.</p>
</li>
</ol>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="next-steps">Next steps<a href="https://developers.filespin.io/guides/search-patterns/#next-steps" class="hash-link" aria-label="Direct link to Next steps" title="Direct link to Next steps" translate="no">​</a></h2>
<ul>
<li class=""><a class="" href="https://developers.filespin.io/guides/asset-schemas/">Custom metadata schemas</a>: design fields that search well</li>
<li class=""><a class="" href="https://developers.filespin.io/guides/face-recognition/">Face recognition</a>: find people by face, not keyword</li>
<li class=""><a class="" href="https://developers.filespin.io/guides/ai-agent-integration/">AI agent integration</a>: search and act on results in one conversation</li>
<li class=""><a class="" href="https://developers.filespin.io/api-reference/asset-search/asset-search-api-introduction/">Search API reference</a></li>
</ul>]]></content:encoded>
            <category>search</category>
            <category>best-practices</category>
            <category>pagination</category>
        </item>
        <item>
            <title><![CDATA[Real-time Notifications with Webhooks]]></title>
            <link>https://developers.filespin.io/guides/webhooks/</link>
            <guid>https://developers.filespin.io/guides/webhooks/</guid>
            <pubDate>Wed, 04 Feb 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[Setting up webhook callbacks, understanding event types and payloads, handling retries, and building reliable event-driven integrations.]]></description>
            <content:encoded><![CDATA[<p>Setting up webhook callbacks, understanding event types and payloads, handling retries, and building reliable event-driven integrations.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="why-event-driven-is-essential-for-media-workflows">Why event-driven is essential for media workflows<a href="https://developers.filespin.io/guides/webhooks/#why-event-driven-is-essential-for-media-workflows" class="hash-link" aria-label="Direct link to Why event-driven is essential for media workflows" title="Direct link to Why event-driven is essential for media workflows" translate="no">​</a></h2>
<p>Media teams in eCommerce, events, attractions, and real estate rely on fast asset delivery. Polling the API to check if an asset has been processed, or scanning for new uploads, wastes resources and adds latency—and in high-volume environments, it simply doesn't scale. Webhooks flip the model: instead of your application asking FileSpin "anything new?", FileSpin tells your application the moment something happens. This is essential for retail teams launching seasonal campaigns, event organizers managing thousands of submissions under deadline, attractions maximizing preview-to-purchase conversion, and real estate teams publishing listings to multiple portals instantly.</p>
<p>This guide covers setting up webhooks, understanding the event types and payloads, and building reliable, event-driven integrations.</p>
<p><img decoding="async" loading="lazy" alt="Webhooks Workflow" src="https://developers.filespin.io/assets/images/webhooks-workflow-9aa633477e815a614c80f9f7ec0c29ea.svg" width="640" height="100" class="img_ev3q"></p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="why-webhooks-matter">Why webhooks matter<a href="https://developers.filespin.io/guides/webhooks/#why-webhooks-matter" class="hash-link" aria-label="Direct link to Why webhooks matter" title="Direct link to Why webhooks matter" translate="no">​</a></h2>
<p>Without webhooks, a typical integration polls repeatedly:</p>
<p><img decoding="async" loading="lazy" alt="Polling Pattern" src="https://developers.filespin.io/assets/images/webhooks-polling-47e0a5653291359d2444fedfd6274dbd.svg" width="640" height="118" class="img_ev3q"></p>
<p>With webhooks, FileSpin pushes events to your app the moment they happen:</p>
<p><img decoding="async" loading="lazy" alt="Webhooks Push Pattern" src="https://developers.filespin.io/assets/images/webhooks-push-927d44e56e4a5543a191b5be43741d7a.svg" width="640" height="118" class="img_ev3q"></p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="setting-up-webhooks">Setting up webhooks<a href="https://developers.filespin.io/guides/webhooks/#setting-up-webhooks" class="hash-link" aria-label="Direct link to Setting up webhooks" title="Direct link to Setting up webhooks" translate="no">​</a></h2>
<p>Webhooks are configured in your FileSpin account settings. You specify one or more callback URLs to receive POST notifications when asset events occur.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="configure-via-dashboard">Configure via Dashboard<a href="https://developers.filespin.io/guides/webhooks/#configure-via-dashboard" class="hash-link" aria-label="Direct link to Configure via Dashboard" title="Direct link to Configure via Dashboard" translate="no">​</a></h3>
<ol>
<li class="">Navigate to <strong>Settings</strong> in your FileSpin Dashboard</li>
<li class="">In the <strong>Webhooks</strong> section, add your callback URL (e.g., <code>https://your-app.com/webhooks/filespin</code>)</li>
<li class="">Save your settings</li>
</ol>
<p>You can configure multiple webhook URLs. FileSpin will POST to all configured URLs whenever an asset event occurs.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="webhook-events">Webhook events<a href="https://developers.filespin.io/guides/webhooks/#webhook-events" class="hash-link" aria-label="Direct link to Webhook events" title="Direct link to Webhook events" translate="no">​</a></h2>
<p>FileSpin sends webhook callbacks for the following asset lifecycle events:</p>
<table><thead><tr><th>Event</th><th>When it fires</th><th>Common use case</th></tr></thead><tbody><tr><td><code>file-saved</code></td><td>File is stored in your storage after upload (File Picker or Upload API)</td><td>Insert new asset into your database</td></tr><tr><td><code>file-processed</code></td><td>Image and video conversions are processed (upload workflow or Conversion API)</td><td>Mark asset as ready, cache CDN URLs, enable in UI</td></tr><tr><td><code>file-data-updated</code></td><td>Custom data is attached via FileSpin.update or Update File Data API</td><td>Sync metadata changes to your application</td></tr><tr><td><code>file-deleted</code></td><td>Conversions, transcodes, or the original file is deleted via Delete API</td><td>Soft-delete or archive in your application</td></tr><tr><td><code>file-undeleted</code></td><td>Original file is undeleted via Undelete API</td><td>Restore references in your application</td></tr><tr><td><code>addon-processed</code></td><td>An addon has completed processing</td><td>React to addon-specific results (face recognition, background removal, etc.)</td></tr></tbody></table>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="event-flow-for-a-typical-upload">Event flow for a typical upload<a href="https://developers.filespin.io/guides/webhooks/#event-flow-for-a-typical-upload" class="hash-link" aria-label="Direct link to Event flow for a typical upload" title="Direct link to Event flow for a typical upload" translate="no">​</a></h3>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">Upload ──&gt; file-saved ──&gt; file-processed</span><br></span></code></pre></div></div>
<ol>
<li class="">
<p><strong><code>file-saved</code></strong> fires when the original file is stored. At this point, the asset has core metadata (name, size, content type, dimensions) but no conversions or transcodes yet.</p>
</li>
<li class="">
<p><strong><code>file-processed</code></strong> fires when all automatic processing is complete. The asset now has its generated conversions, transcodes, and addon results.</p>
</li>
</ol>
<p>For metadata updates:</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">Update data ──&gt; file-data-updated</span><br></span></code></pre></div></div>
<p>For deletion and restoration:</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">Delete ──&gt; file-deleted ──&gt; Undelete ──&gt; file-undeleted</span><br></span></code></pre></div></div>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="webhook-payload">Webhook payload<a href="https://developers.filespin.io/guides/webhooks/#webhook-payload" class="hash-link" aria-label="Direct link to Webhook payload" title="Direct link to Webhook payload" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="standard-events-file-saved-file-processed-file-data-updated-addon-processed">Standard events (file-saved, file-processed, file-data-updated, addon-processed)<a href="https://developers.filespin.io/guides/webhooks/#standard-events-file-saved-file-processed-file-data-updated-addon-processed" class="hash-link" aria-label="Direct link to Standard events (file-saved, file-processed, file-data-updated, addon-processed)" title="Direct link to Standard events (file-saved, file-processed, file-data-updated, addon-processed)" translate="no">​</a></h3>
<p>For these events, the webhook payload is the <a class="" href="https://developers.filespin.io/api/asset-data-format/">Asset Data Format</a> — the same JSON structure returned by the Asset API. This includes:</p>
<div class="language-json codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"id"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"99d819953914402babbdeb68337ea6a3"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"status"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"OK"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"name"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"product-photo.jpg"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"size"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">2456789</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"checksum"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"d41d8cd98f00b204e9800998ecf8427e"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"content_type"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"image/jpeg"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"creator_id"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">42</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"upload_time"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"2026-02-17T10:30:00Z"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"update_time"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"2026-02-17T10:30:05Z"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"metadata"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token property" style="color:#36acaa">"width"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">4000</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token property" style="color:#36acaa">"height"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">3000</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"data"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token property" style="color:#36acaa">"product_name_txt"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"Summer Straw Hat"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token property" style="color:#36acaa">"sku_s"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"HAT-STR-001"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"conversions"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token property" style="color:#36acaa">"720p-video"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token property" style="color:#36acaa">"width"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">1280</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token property" style="color:#36acaa">"height"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">720</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token property" style="color:#36acaa">"size"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">716000</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token property" style="color:#36acaa">"public"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">true</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"addons_info"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token property" style="color:#36acaa">"ON_DEMAND_IMAGE"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token property" style="color:#36acaa">"available"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">true</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></span></code></pre></div></div>
<p>On-demand image (ODI) is available for assets after they are processed the first time. Availability is indicated by the <code>ON_DEMAND_IMAGE</code> key in <code>addons_info</code>.</p>
<p><strong>Key fields to check:</strong></p>
<table><thead><tr><th>Field</th><th>Purpose</th></tr></thead><tbody><tr><td><code>id</code></td><td>The asset ID — use to match with your database records</td></tr><tr><td><code>status</code></td><td>Current asset status (<code>OK</code>, <code>NOT_READY</code>, <code>ERROR</code>, <code>ARCHIVED</code>)</td></tr><tr><td><code>data</code></td><td>Custom metadata (if a schema is assigned)</td></tr><tr><td><code>conversions</code></td><td>Available conversions and transcodes</td></tr><tr><td><code>addons_info</code></td><td>Which addons have been processed</td></tr></tbody></table>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="deletion-events-file-deleted-file-undeleted">Deletion events (file-deleted, file-undeleted)<a href="https://developers.filespin.io/guides/webhooks/#deletion-events-file-deleted-file-undeleted" class="hash-link" aria-label="Direct link to Deletion events (file-deleted, file-undeleted)" title="Direct link to Deletion events (file-deleted, file-undeleted)" translate="no">​</a></h3>
<p>These events use a different payload format:</p>
<div class="language-json codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"event"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"file-deleted"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"id"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"99d819953914402babbdeb68337ea6a3"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"keys"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">"deepzoom"</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"status"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"OK"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"message"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">""</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></span></code></pre></div></div>
<table><thead><tr><th>Field</th><th>Type</th><th>Description</th></tr></thead><tbody><tr><td><code>id</code></td><td>string</td><td>File ID</td></tr><tr><td><code>event</code></td><td>string</td><td><code>file-deleted</code> or <code>file-undeleted</code></td></tr><tr><td><code>keys</code></td><td>JSON</td><td>List of keys sent in original deletion request</td></tr><tr><td><code>status</code></td><td>string</td><td><code>OK</code> if successful, <code>MAYBE</code> if uncertain (check <code>message</code>), <code>ERROR</code> if failed (see <code>errors</code>)</td></tr><tr><td><code>message</code></td><td>string</td><td>Additional details about status</td></tr><tr><td><code>errors</code></td><td>JSON</td><td>Keys that failed and error messages (when status is <code>ERROR</code>)</td></tr></tbody></table>
<p><strong>Example file-deleted with error:</strong></p>
<div class="language-json codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"event"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"file-deleted"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"id"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"99d819953914402babbdeb68337ea6a3"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"keys"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">"deepzoom"</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"status"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"ERROR"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"message"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"S3 Permission denied"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"errors"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token property" style="color:#36acaa">"deepzoom"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"S3 Permission denied"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></span></code></pre></div></div>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="building-a-webhook-handler">Building a webhook handler<a href="https://developers.filespin.io/guides/webhooks/#building-a-webhook-handler" class="hash-link" aria-label="Direct link to Building a webhook handler" title="Direct link to Building a webhook handler" translate="no">​</a></h2>
<p>Here's a practical webhook handler that processes different events:</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="python-flask">Python (Flask)<a href="https://developers.filespin.io/guides/webhooks/#python-flask" class="hash-link" aria-label="Direct link to Python (Flask)" title="Direct link to Python (Flask)" translate="no">​</a></h3>
<div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">from</span><span class="token plain"> flask </span><span class="token keyword" style="color:#00009f">import</span><span class="token plain"> Flask</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> request</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> jsonify</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">app </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> Flask</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">__name__</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token decorator annotation punctuation" style="color:#393A34">@app</span><span class="token decorator annotation punctuation" style="color:#393A34">.</span><span class="token decorator annotation punctuation" style="color:#393A34">route</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"/webhooks/filespin"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> methods</span><span class="token operator" style="color:#393A34">=</span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">"POST"</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">def</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">handle_webhook</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    payload </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> request</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">get_json</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic"># Deletion events include an "event" field</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    event </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> payload</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">get</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"event"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> event </span><span class="token keyword" style="color:#00009f">in</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"file-deleted"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"file-undeleted"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        handle_deletion_event</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">payload</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">else</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        handle_asset_event</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">payload</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">return</span><span class="token plain"> jsonify</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">{</span><span class="token string" style="color:#e3116c">"status"</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"ok"</span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">200</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">def</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">handle_asset_event</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">asset_data</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token triple-quoted-string string" style="color:#e3116c">"""Handle file-saved, file-processed, file-data-updated, addon-processed."""</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    asset_id </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> asset_data</span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">"id"</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    status </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> asset_data</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">get</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"status"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    name </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> asset_data</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">get</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"name"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    content_type </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> asset_data</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">get</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"content_type"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> status </span><span class="token operator" style="color:#393A34">==</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"NOT_READY"</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token comment" style="color:#999988;font-style:italic"># file-saved: asset uploaded but not yet processed</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token keyword" style="color:#00009f">print</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string-interpolation string" style="color:#e3116c">f"New asset saved: </span><span class="token string-interpolation interpolation punctuation" style="color:#393A34">{</span><span class="token string-interpolation interpolation">name</span><span class="token string-interpolation interpolation punctuation" style="color:#393A34">}</span><span class="token string-interpolation string" style="color:#e3116c"> (</span><span class="token string-interpolation interpolation punctuation" style="color:#393A34">{</span><span class="token string-interpolation interpolation">content_type</span><span class="token string-interpolation interpolation punctuation" style="color:#393A34">}</span><span class="token string-interpolation string" style="color:#e3116c">)"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token comment" style="color:#999988;font-style:italic"># db.assets.insert(asset_id=asset_id, name=name, status="processing")</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">elif</span><span class="token plain"> status </span><span class="token operator" style="color:#393A34">==</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"OK"</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token comment" style="color:#999988;font-style:italic"># file-processed: all conversions complete</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        conversions </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> asset_data</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">get</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"conversions"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        urls </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> asset_data</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">get</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"urls"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        available_formats </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token builtin">list</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">conversions</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">keys</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token keyword" style="color:#00009f">print</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string-interpolation string" style="color:#e3116c">f"Asset processed: </span><span class="token string-interpolation interpolation punctuation" style="color:#393A34">{</span><span class="token string-interpolation interpolation">asset_id</span><span class="token string-interpolation interpolation punctuation" style="color:#393A34">}</span><span class="token string-interpolation string" style="color:#e3116c">, formats: </span><span class="token string-interpolation interpolation punctuation" style="color:#393A34">{</span><span class="token string-interpolation interpolation">available_formats</span><span class="token string-interpolation interpolation punctuation" style="color:#393A34">}</span><span class="token string-interpolation string" style="color:#e3116c">"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token comment" style="color:#999988;font-style:italic"># db.assets.update(asset_id, status="ready", formats=available_formats, urls=urls)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">elif</span><span class="token plain"> status </span><span class="token operator" style="color:#393A34">==</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"ERROR"</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        errors </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> asset_data</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">get</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"errors"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token keyword" style="color:#00009f">print</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string-interpolation string" style="color:#e3116c">f"Processing failed for </span><span class="token string-interpolation interpolation punctuation" style="color:#393A34">{</span><span class="token string-interpolation interpolation">asset_id</span><span class="token string-interpolation interpolation punctuation" style="color:#393A34">}</span><span class="token string-interpolation string" style="color:#e3116c">: </span><span class="token string-interpolation interpolation punctuation" style="color:#393A34">{</span><span class="token string-interpolation interpolation">errors</span><span class="token string-interpolation interpolation punctuation" style="color:#393A34">}</span><span class="token string-interpolation string" style="color:#e3116c">"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token comment" style="color:#999988;font-style:italic"># db.assets.update(asset_id, status="error", errors=errors)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">def</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">handle_deletion_event</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">payload</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token triple-quoted-string string" style="color:#e3116c">"""Handle file-deleted and file-undeleted."""</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    asset_id </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> payload</span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">"id"</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    event </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> payload</span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">"event"</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    status </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> payload</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">get</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"status"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    keys </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> payload</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">get</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"keys"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> event </span><span class="token operator" style="color:#393A34">==</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"file-deleted"</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token keyword" style="color:#00009f">print</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string-interpolation string" style="color:#e3116c">f"Asset deleted: </span><span class="token string-interpolation interpolation punctuation" style="color:#393A34">{</span><span class="token string-interpolation interpolation">asset_id</span><span class="token string-interpolation interpolation punctuation" style="color:#393A34">}</span><span class="token string-interpolation string" style="color:#e3116c">, keys: </span><span class="token string-interpolation interpolation punctuation" style="color:#393A34">{</span><span class="token string-interpolation interpolation">keys</span><span class="token string-interpolation interpolation punctuation" style="color:#393A34">}</span><span class="token string-interpolation string" style="color:#e3116c">, status: </span><span class="token string-interpolation interpolation punctuation" style="color:#393A34">{</span><span class="token string-interpolation interpolation">status</span><span class="token string-interpolation interpolation punctuation" style="color:#393A34">}</span><span class="token string-interpolation string" style="color:#e3116c">"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token comment" style="color:#999988;font-style:italic"># db.assets.mark_deleted(asset_id)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">elif</span><span class="token plain"> event </span><span class="token operator" style="color:#393A34">==</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"file-undeleted"</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token keyword" style="color:#00009f">print</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string-interpolation string" style="color:#e3116c">f"Asset restored: </span><span class="token string-interpolation interpolation punctuation" style="color:#393A34">{</span><span class="token string-interpolation interpolation">asset_id</span><span class="token string-interpolation interpolation punctuation" style="color:#393A34">}</span><span class="token string-interpolation string" style="color:#e3116c">, keys: </span><span class="token string-interpolation interpolation punctuation" style="color:#393A34">{</span><span class="token string-interpolation interpolation">keys</span><span class="token string-interpolation interpolation punctuation" style="color:#393A34">}</span><span class="token string-interpolation string" style="color:#e3116c">"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token comment" style="color:#999988;font-style:italic"># db.assets.mark_active(asset_id)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> __name__ </span><span class="token operator" style="color:#393A34">==</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"__main__"</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    app</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">run</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">port</span><span class="token operator" style="color:#393A34">=</span><span class="token number" style="color:#36acaa">5000</span><span class="token punctuation" style="color:#393A34">)</span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="nodejs-express">Node.js (Express)<a href="https://developers.filespin.io/guides/webhooks/#nodejs-express" class="hash-link" aria-label="Direct link to Node.js (Express)" title="Direct link to Node.js (Express)" translate="no">​</a></h3>
<div class="language-javascript codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-javascript codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> express </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">require</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"express"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> app </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">express</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">app</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">use</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">express</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">json</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">app</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">post</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"/webhooks/filespin"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token parameter">req</span><span class="token parameter punctuation" style="color:#393A34">,</span><span class="token parameter"> res</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token arrow operator" style="color:#393A34">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> payload </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> req</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">body</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> event </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> payload</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">event</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token keyword control-flow" style="color:#00009f">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">event </span><span class="token operator" style="color:#393A34">===</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"file-deleted"</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">||</span><span class="token plain"> event </span><span class="token operator" style="color:#393A34">===</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"file-undeleted"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token function" style="color:#d73a49">handleDeletionEvent</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">payload</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"> </span><span class="token keyword control-flow" style="color:#00009f">else</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token function" style="color:#d73a49">handleAssetEvent</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">payload</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  res</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">status</span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">200</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">json</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> </span><span class="token literal-property property" style="color:#36acaa">status</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"ok"</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">function</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">handleAssetEvent</span><span class="token punctuation" style="color:#393A34">(</span><span class="token parameter">assetData</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> id</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> status</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> name</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> content_type </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> assetData</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token keyword control-flow" style="color:#00009f">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">status </span><span class="token operator" style="color:#393A34">===</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"NOT_READY"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token console class-name">console</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">log</span><span class="token punctuation" style="color:#393A34">(</span><span class="token template-string template-punctuation string" style="color:#e3116c">`</span><span class="token template-string string" style="color:#e3116c">New asset saved: </span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:#393A34">${</span><span class="token template-string interpolation">name</span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:#393A34">}</span><span class="token template-string string" style="color:#e3116c"> (</span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:#393A34">${</span><span class="token template-string interpolation">content_type</span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:#393A34">}</span><span class="token template-string string" style="color:#e3116c">)</span><span class="token template-string template-punctuation string" style="color:#e3116c">`</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic">// Insert into database</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"> </span><span class="token keyword control-flow" style="color:#00009f">else</span><span class="token plain"> </span><span class="token keyword control-flow" style="color:#00009f">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">status </span><span class="token operator" style="color:#393A34">===</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"OK"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> formats </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token known-class-name class-name">Object</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">keys</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">assetData</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">conversions</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">||</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token console class-name">console</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">log</span><span class="token punctuation" style="color:#393A34">(</span><span class="token template-string template-punctuation string" style="color:#e3116c">`</span><span class="token template-string string" style="color:#e3116c">Asset processed: </span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:#393A34">${</span><span class="token template-string interpolation">id</span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:#393A34">}</span><span class="token template-string string" style="color:#e3116c">, formats: </span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:#393A34">${</span><span class="token template-string interpolation">formats</span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:#393A34">}</span><span class="token template-string template-punctuation string" style="color:#e3116c">`</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic">// Update database with URLs and formats</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"> </span><span class="token keyword control-flow" style="color:#00009f">else</span><span class="token plain"> </span><span class="token keyword control-flow" style="color:#00009f">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">status </span><span class="token operator" style="color:#393A34">===</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"ERROR"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token console class-name">console</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">error</span><span class="token punctuation" style="color:#393A34">(</span><span class="token template-string template-punctuation string" style="color:#e3116c">`</span><span class="token template-string string" style="color:#e3116c">Processing failed: </span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:#393A34">${</span><span class="token template-string interpolation">id</span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:#393A34">}</span><span class="token template-string template-punctuation string" style="color:#e3116c">`</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> assetData</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">errors</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic">// Log error, alert ops</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">function</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">handleDeletionEvent</span><span class="token punctuation" style="color:#393A34">(</span><span class="token parameter">payload</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> id</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> event</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> keys</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> status </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> payload</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token keyword control-flow" style="color:#00009f">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">event </span><span class="token operator" style="color:#393A34">===</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"file-deleted"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token console class-name">console</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">log</span><span class="token punctuation" style="color:#393A34">(</span><span class="token template-string template-punctuation string" style="color:#e3116c">`</span><span class="token template-string string" style="color:#e3116c">Asset deleted: </span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:#393A34">${</span><span class="token template-string interpolation">id</span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:#393A34">}</span><span class="token template-string string" style="color:#e3116c">, keys: </span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:#393A34">${</span><span class="token template-string interpolation">keys</span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:#393A34">}</span><span class="token template-string template-punctuation string" style="color:#e3116c">`</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic">// Soft delete from your system</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"> </span><span class="token keyword control-flow" style="color:#00009f">else</span><span class="token plain"> </span><span class="token keyword control-flow" style="color:#00009f">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">event </span><span class="token operator" style="color:#393A34">===</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"file-undeleted"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token console class-name">console</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">log</span><span class="token punctuation" style="color:#393A34">(</span><span class="token template-string template-punctuation string" style="color:#e3116c">`</span><span class="token template-string string" style="color:#e3116c">Asset restored: </span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:#393A34">${</span><span class="token template-string interpolation">id</span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:#393A34">}</span><span class="token template-string template-punctuation string" style="color:#e3116c">`</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic">// Restore in your system</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">app</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">listen</span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">5000</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><br></span></code></pre></div></div>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="retry-behavior-and-delivery-guarantees">Retry behavior and delivery guarantees<a href="https://developers.filespin.io/guides/webhooks/#retry-behavior-and-delivery-guarantees" class="hash-link" aria-label="Direct link to Retry behavior and delivery guarantees" title="Direct link to Retry behavior and delivery guarantees" translate="no">​</a></h2>
<ul>
<li class=""><strong>At-least-once delivery</strong> — Webhook callbacks are attempted up to <strong>8 times</strong> if your endpoint does not respond with an HTTP 20x code (200, 201, or 202).</li>
<li class=""><strong>Exponential backoff</strong> — Retries follow a back-off algorithm that spreads attempts over an <strong>8-hour period</strong>.</li>
<li class=""><strong>Idempotency</strong> — Your endpoint may receive the same webhook more than once. Use the <code>asset_id</code> as a key to detect and handle duplicate deliveries.</li>
</ul>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="reissuing-callbacks">Reissuing callbacks<a href="https://developers.filespin.io/guides/webhooks/#reissuing-callbacks" class="hash-link" aria-label="Direct link to Reissuing callbacks" title="Direct link to Reissuing callbacks" translate="no">​</a></h2>
<p>If your endpoint was down or missed callbacks, you can reissue them for a specific time range.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="via-dashboard">Via Dashboard<a href="https://developers.filespin.io/guides/webhooks/#via-dashboard" class="hash-link" aria-label="Direct link to Via Dashboard" title="Direct link to Via Dashboard" translate="no">​</a></h3>
<p>Navigate to <strong>Dashboard &gt; Tools</strong> and use the reissue option.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="via-api">Via API<a href="https://developers.filespin.io/guides/webhooks/#via-api" class="hash-link" aria-label="Direct link to Via API" title="Direct link to Via API" translate="no">​</a></h3>
<p>Send a POST request with an <code>ASSET_ADMIN</code> role API key:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token function" style="color:#d73a49">curl</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">-X</span><span class="token plain"> POST </span><span class="token string" style="color:#e3116c">"https://app.filespin.io/api/v1/callbacks/reissue"</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">\</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token parameter variable" style="color:#36acaa">-H</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"X-FileSpin-Api-Key: YOUR_API_KEY"</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">\</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token parameter variable" style="color:#36acaa">-H</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"Content-Type: application/json"</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">\</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token parameter variable" style="color:#36acaa">-d</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'{</span><br></span><span class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c">    "start_date": "2026-02-01T00:00:00Z",</span><br></span><span class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c">    "end_date": "2026-02-07T23:59:59Z"</span><br></span><span class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c">  }'</span><br></span></code></pre></div></div>
<p><strong>Constraints:</strong></p>
<ul>
<li class="">Time range is limited to a maximum of <strong>7 days</strong></li>
<li class="">Only assets belonging to the authenticated user are reissued</li>
<li class="">Returns <code>202 Accepted</code> — the operation is asynchronous</li>
</ul>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="real-world-pattern-syncing-assets-to-your-application-database">Real-world pattern: syncing assets to your application database<a href="https://developers.filespin.io/guides/webhooks/#real-world-pattern-syncing-assets-to-your-application-database" class="hash-link" aria-label="Direct link to Real-world pattern: syncing assets to your application database" title="Direct link to Real-world pattern: syncing assets to your application database" translate="no">​</a></h2>
<p>Here's a common pattern that you can use to keep your application's database in sync with FileSpin using webhooks.</p>
<p><img decoding="async" loading="lazy" alt="Webhook Asset Sync Flow" src="https://developers.filespin.io/assets/images/recipe-webhook-asset-sync-b15e7a86acb4fb1fc778e1bbe2c0435b.svg" width="640" height="100" class="img_ev3q"></p>
<p><strong>PYTHON</strong></p>
<div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">def</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">sync_asset</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">payload</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    event </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> payload</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">get</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"event"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> event </span><span class="token keyword" style="color:#00009f">in</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"file-deleted"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"file-undeleted"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        asset_id </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> payload</span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">"id"</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> event </span><span class="token operator" style="color:#393A34">==</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"file-deleted"</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            db</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">execute</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                </span><span class="token string" style="color:#e3116c">"UPDATE assets SET status='deleted', deleted_at=NOW() WHERE id=%s"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">asset_id</span><span class="token punctuation" style="color:#393A34">,</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token keyword" style="color:#00009f">elif</span><span class="token plain"> event </span><span class="token operator" style="color:#393A34">==</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"file-undeleted"</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            db</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">execute</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                </span><span class="token string" style="color:#e3116c">"UPDATE assets SET status='active', deleted_at=NULL WHERE id=%s"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">asset_id</span><span class="token punctuation" style="color:#393A34">,</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token keyword" style="color:#00009f">return</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    asset_id </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> payload</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">get</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"id"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    status </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> payload</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">get</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"status"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> status </span><span class="token operator" style="color:#393A34">==</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"NOT_READY"</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token comment" style="color:#999988;font-style:italic"># file-saved</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        db</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">execute</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token string" style="color:#e3116c">"INSERT INTO assets (id, name, content_type, status, created_at) "</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token string" style="color:#e3116c">"VALUES (%s, %s, %s, 'processing', NOW()) "</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token string" style="color:#e3116c">"ON DUPLICATE KEY UPDATE name=%s"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">asset_id</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> payload</span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">"name"</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> payload</span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">"content_type"</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> payload</span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">"name"</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">elif</span><span class="token plain"> status </span><span class="token operator" style="color:#393A34">==</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"OK"</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token comment" style="color:#999988;font-style:italic"># file-processed</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        conversions </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> payload</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">get</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"conversions"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        urls </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> payload</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">get</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"urls"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        addons_info </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> payload</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">get</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"addons_info"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        db</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">execute</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token string" style="color:#e3116c">"UPDATE assets SET status='ready', conversions=%s, "</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token string" style="color:#e3116c">"urls=%s, addons_info=%s, updated_at=NOW() WHERE id=%s"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                json</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">dumps</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">conversions</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                json</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">dumps</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">urls</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                json</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">dumps</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">addons_info</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                asset_id</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">)</span><br></span></code></pre></div></div>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="testing-webhooks-locally">Testing webhooks locally<a href="https://developers.filespin.io/guides/webhooks/#testing-webhooks-locally" class="hash-link" aria-label="Direct link to Testing webhooks locally" title="Direct link to Testing webhooks locally" translate="no">​</a></h2>
<p>During development, your webhook endpoint runs on <code>localhost</code>, which FileSpin can't reach. Use a tunneling tool to expose your local server:</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="using-ngrok">Using ngrok<a href="https://developers.filespin.io/guides/webhooks/#using-ngrok" class="hash-link" aria-label="Direct link to Using ngrok" title="Direct link to Using ngrok" translate="no">​</a></h3>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic"># Start your local webhook handler</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">python webhook_handler.py  </span><span class="token comment" style="color:#999988;font-style:italic"># Runs on port 5000</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># In another terminal, create a tunnel</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">ngrok http </span><span class="token number" style="color:#36acaa">5000</span><br></span></code></pre></div></div>
<p>ngrok gives you a public URL like <code>https://abc123.ngrok.io</code>. Configure this as your webhook URL in FileSpin settings.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="using-cloudflared">Using cloudflared<a href="https://developers.filespin.io/guides/webhooks/#using-cloudflared" class="hash-link" aria-label="Direct link to Using cloudflared" title="Direct link to Using cloudflared" translate="no">​</a></h3>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">cloudflared tunnel </span><span class="token parameter variable" style="color:#36acaa">--url</span><span class="token plain"> http://localhost:5000</span><br></span></code></pre></div></div>
<div class="theme-admonition theme-admonition-tip admonition_xJq3 alert alert--success"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>tip</div><div class="admonitionContent_BuS1"><p>Remember to update your webhook URL to your production endpoint before going live. Development tunnel URLs are temporary.</p></div></div>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="best-practices">Best practices<a href="https://developers.filespin.io/guides/webhooks/#best-practices" class="hash-link" aria-label="Direct link to Best practices" title="Direct link to Best practices" translate="no">​</a></h2>
<ol>
<li class="">
<p><strong>Return 200 quickly.</strong> Process webhook payloads asynchronously. Accept the webhook, queue the work, and return 200 immediately. If your handler takes too long, the connection may time out and trigger unnecessary retries.</p>
</li>
<li class="">
<p><strong>Handle duplicate deliveries.</strong> Network issues can cause the same webhook to be delivered more than once. Use the <code>id</code> field to detect and skip duplicates.</p>
</li>
<li class="">
<p><strong>Log webhook payloads.</strong> Store the raw payload for debugging. When something goes wrong, having the original webhook data is invaluable.</p>
</li>
<li class="">
<p><strong>Monitor your endpoint.</strong> Track webhook delivery success rates. If your endpoint starts failing, you'll miss events and trigger retries.</p>
</li>
<li class="">
<p><strong>Use the reissue API for recovery.</strong> If your endpoint was down, reissue callbacks for the affected time range rather than polling for every asset.</p>
</li>
<li class="">
<p><strong>Differentiate by status.</strong> For standard events, use the <code>status</code> field (<code>NOT_READY</code>, <code>OK</code>, <code>ERROR</code>) to determine the event type rather than relying on separate event names in the payload.</p>
</li>
</ol>
<hr>]]></content:encoded>
            <category>webhooks</category>
            <category>integration</category>
            <category>events</category>
        </item>
        <item>
            <title><![CDATA[On-Demand Image Transformations: A Practical Guide]]></title>
            <link>https://developers.filespin.io/guides/image-transformations/</link>
            <guid>https://developers.filespin.io/guides/image-transformations/</guid>
            <pubDate>Tue, 03 Feb 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[Build dynamic image URLs with resize, crop, format, quality and effects parameters, with tested recipes for responsive images, thumbnails, social cards, product images and placeholders.]]></description>
            <content:encoded><![CDATA[<p>Build dynamic image URLs with resize, crop, format, quality and effects parameters, with tested recipes for responsive images, thumbnails, social cards, product images and placeholders.</p>
<p>Serving the same large original to a mobile thumbnail grid and a desktop hero banner wastes bandwidth. On-Demand Image (ODI) transformations let you resize, crop, convert formats, adjust quality and apply effects through URL parameters, with the results cached by the CDN.</p>
<p>This guide is the parameter catalogue with recipes. For a task-shaped walkthrough that starts from the Dashboard's <strong>Get link / Embed</strong> dialog and rolls a pattern out across a product catalogue, see <a class="" href="https://developers.filespin.io/guides/responsive-product-images/">Change Product Image Sizes Without Re-Exporting</a>.</p>
<p><em>Every example output below was checked on 26 September 2026 against the public demo asset <code>2e1bc0f4159343779b82923e951a9256</code>, a 4:3 landscape photo whose largest available output is 1024×768.</em></p>
<p><img decoding="async" loading="lazy" alt="Image Transformations" src="https://developers.filespin.io/assets/images/image-transformations-workflow-829b8a4cf009a8dee88283ed16a2bc86.svg" width="900" height="380" class="img_ev3q"></p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="how-odi-works">How ODI works<a href="https://developers.filespin.io/guides/image-transformations/#how-odi-works" class="hash-link" aria-label="Direct link to How ODI works" title="Direct link to How ODI works" translate="no">​</a></h2>
<p>Transformations are URL parameters on the asset's <code>conversions</code> endpoint:</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">https://cdn.filespin.io/api/v1/assets/{ASSET_ID}/conversions?resize=800,600&amp;quality=85</span><br></span></code></pre></div></div>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">Request ──&gt; CDN cache ──(miss)──&gt; FileSpin renders ──&gt; CDN caches + returns</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                │</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                └──(hit)──&gt; CDN returns cached image</span><br></span></code></pre></div></div>
<p>The first request for a particular URL renders the image; later requests for the same URL are served from the CDN cache. If you use a custom FileSpin Enterprise CDN, use that host instead of <code>cdn.filespin.io</code>.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="prerequisites">Prerequisites<a href="https://developers.filespin.io/guides/image-transformations/#prerequisites" class="hash-link" aria-label="Direct link to Prerequisites" title="Direct link to Prerequisites" translate="no">​</a></h3>
<p>ODI needs the asset to be processed. Check the asset with the <a class="" href="https://developers.filespin.io/api-reference/assets/get-data-get/">Get Data API</a>: <code>status</code> should be <code>OK</code> and <code>addons_info</code> should show <code>ON_DEMAND_IMAGE</code> as available.</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token function" style="color:#d73a49">curl</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">-X</span><span class="token plain"> GET </span><span class="token string" style="color:#e3116c">"https://app.filespin.io/api/v1/assets/ASSET_ID/data"</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">\</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token parameter variable" style="color:#36acaa">-H</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"X-FileSpin-Api-Key: YOUR_API_KEY"</span><br></span></code></pre></div></div>
<div class="language-json codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"id"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"ASSET_ID"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"status"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"OK"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"addons_info"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token property" style="color:#36acaa">"ON_DEMAND_IMAGE"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token property" style="color:#36acaa">"available"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">true</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></span></code></pre></div></div>
<p>If <code>ON_DEMAND_IMAGE</code> is not yet available, the asset is still processing. Wait and check again. The <a class="" href="https://developers.filespin.io/image-transformations/">ODI overview</a> covers this and the delivery limits in more detail.</p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="core-transformations">Core transformations<a href="https://developers.filespin.io/guides/image-transformations/#core-transformations" class="hash-link" aria-label="Direct link to Core transformations" title="Direct link to Core transformations" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="resize">Resize<a href="https://developers.filespin.io/guides/image-transformations/#resize" class="hash-link" aria-label="Direct link to Resize" title="Direct link to Resize" translate="no">​</a></h3>
<p>Fit the image inside a box without changing its aspect ratio:</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">?resize=800,600</span><br></span></code></pre></div></div>
<p>Use <code>0</code> for one side to size by the other:</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">?resize=640,0     # 640 wide, height from the aspect ratio  -&gt; 640x480 on the demo asset</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">?resize=0,480     # 480 high, width from the aspect ratio   -&gt; 640x480 on the demo asset</span><br></span></code></pre></div></div>
<p><code>resize</code> fits within the box, so <code>resize=300,300</code> on a 4:3 image returns 300×225, not a square. To get an exact size, pad the gaps with a colour:</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">?resize=300,300,fill:white     # 300x300, image centred on white</span><br></span></code></pre></div></div>
<p>The fill value can be a colour name, a hex code such as <code>ffffff</code>, <code>transparent</code> or <code>auto</code>.</p>
<p><strong>Limits:</strong> the maximum output is 2048×1536 pixels at 72 PPI, and <code>resize</code> does not upscale. Asking for more than the source can give returns the largest available size, with HTTP 200. Always check the dimensions you actually receive. <a class="" href="https://developers.filespin.io/image-transformations/resize/">Resize reference</a>.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="crop">Crop<a href="https://developers.filespin.io/guides/image-transformations/#crop" class="hash-link" aria-label="Direct link to Crop" title="Direct link to Crop" translate="no">​</a></h3>
<p>Two forms:</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">?crop=600,300,center          # width, height, alignment</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">?crop=150,170,200,50          # left, top, width, height (a region of the original)</span><br></span></code></pre></div></div>
<p>Alignment can be <code>center</code>, <code>top</code>, <code>bottom</code>, <code>left</code>, <code>right</code> or <code>face</code>. With only <code>crop=width,height</code>, the crop centres on a detected face or feature. <a class="" href="https://developers.filespin.io/image-transformations/crop/">Crop reference</a>.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="format">Format<a href="https://developers.filespin.io/guides/image-transformations/#format" class="hash-link" aria-label="Direct link to Format" title="Direct link to Format" translate="no">​</a></h3>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">?format=webp</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">?format=avif</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">?format=jpg</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">?format=png</span><br></span></code></pre></div></div>
<p>When you leave <code>format</code> out, FileSpin picks the format from the browser's <code>Accept</code> header. On the demo asset, the same URL returned <code>image/avif</code>, <code>image/webp</code> or <code>image/jpeg</code> depending on what the browser offered, at the same pixel dimensions. Set <code>format</code> explicitly for email, partner feeds and any other consumer that is not a browser. <a class="" href="https://developers.filespin.io/image-transformations/format/">Format reference</a>.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="quality">Quality<a href="https://developers.filespin.io/guides/image-transformations/#quality" class="hash-link" aria-label="Direct link to Quality" title="Direct link to Quality" translate="no">​</a></h3>
<p>Compression level from 1 to 100. The default is 90.</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">?quality=80</span><br></span></code></pre></div></div>
<table><thead><tr><th>Quality</th><th>Typical use</th></tr></thead><tbody><tr><td>85–90</td><td>High-quality web photography</td></tr><tr><td>70–85</td><td>Product photos and general web images</td></tr><tr><td>30–60</td><td>Thumbnails and placeholders</td></tr></tbody></table>
<p><a class="" href="https://developers.filespin.io/image-transformations/quality/">Quality reference</a>.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="background-colour">Background colour<a href="https://developers.filespin.io/guides/image-transformations/#background-colour" class="hash-link" aria-label="Direct link to Background colour" title="Direct link to Background colour" translate="no">​</a></h3>
<p>Set the background for transparent images, for example when converting a PNG cut-out to JPEG:</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">?bgcolor=ffffff&amp;format=jpg</span><br></span></code></pre></div></div>
<p>Hex colour without the <code>#</code>. <a class="" href="https://developers.filespin.io/image-transformations/background-color/">Background colour reference</a>.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="trim">Trim<a href="https://developers.filespin.io/guides/image-transformations/#trim" class="hash-link" aria-label="Direct link to Trim" title="Direct link to Trim" translate="no">​</a></h3>
<p>Remove a uniform border. The value is a colour tolerance:</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">?trim=10</span><br></span></code></pre></div></div>
<p><a class="" href="https://developers.filespin.io/image-transformations/trim/">Trim reference</a>.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="rotate-and-flip">Rotate and flip<a href="https://developers.filespin.io/guides/image-transformations/#rotate-and-flip" class="hash-link" aria-label="Direct link to Rotate and flip" title="Direct link to Rotate and flip" translate="no">​</a></h3>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">?rotate=90        # 90, 180 or 270</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">?flip=h           # mirror horizontally</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">?flip=v           # mirror vertically</span><br></span></code></pre></div></div>
<p><a class="" href="https://developers.filespin.io/image-transformations/rotate/">Rotate reference</a> · <a class="" href="https://developers.filespin.io/image-transformations/flip/">Flip reference</a>.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="effects">Effects<a href="https://developers.filespin.io/guides/image-transformations/#effects" class="hash-link" aria-label="Direct link to Effects" title="Direct link to Effects" translate="no">​</a></h3>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">?effects=grayscale</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">?effects=blur:5</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">?effects=roundcorner:30</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">?effects=grayscale,roundcorner:30     # combine with commas</span><br></span></code></pre></div></div>
<p><a class="" href="https://developers.filespin.io/image-transformations/effects/">Effects reference</a>.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="watermarks">Watermarks<a href="https://developers.filespin.io/guides/image-transformations/#watermarks" class="hash-link" aria-label="Direct link to Watermarks" title="Direct link to Watermarks" translate="no">​</a></h3>
<p>Image and text watermarks (<code>watermark=</code> and <code>text_wm=</code>) take a source and placement values. See the <a class="" href="https://developers.filespin.io/image-transformations/watermark/">Watermark</a> and <a class="" href="https://developers.filespin.io/image-transformations/text-watermark/">Text Watermark</a> references for the syntax, and check the output on your own account before relying on it.</p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="common-recipes">Common recipes<a href="https://developers.filespin.io/guides/image-transformations/#common-recipes" class="hash-link" aria-label="Direct link to Common recipes" title="Direct link to Common recipes" translate="no">​</a></h2>
<p>Replace <code>ASSET_ID</code> with your asset's ID. The output sizes are from the demo asset.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="recipe-1-responsive-hero-image">Recipe 1: Responsive hero image<a href="https://developers.filespin.io/guides/image-transformations/#recipe-1-responsive-hero-image" class="hash-link" aria-label="Direct link to Recipe 1: Responsive hero image" title="Direct link to Recipe 1: Responsive hero image" translate="no">​</a></h3>
<p>Offer several widths and let the browser choose. Leave <code>format</code> out so each browser gets AVIF, WebP or JPEG:</p>
<div class="language-html codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-html codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">img</span><span class="token tag" style="color:#00009f"></span><br></span><span class="token-line" style="color:#393A34"><span class="token tag" style="color:#00009f">  </span><span class="token tag attr-name" style="color:#00a4db">src</span><span class="token tag attr-value punctuation attr-equals" style="color:#393A34">=</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag attr-value" style="color:#e3116c">https://cdn.filespin.io/api/v1/assets/ASSET_ID/conversions?resize=1024,0&amp;quality=80</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag" style="color:#00009f"></span><br></span><span class="token-line" style="color:#393A34"><span class="token tag" style="color:#00009f">  </span><span class="token tag attr-name" style="color:#00a4db">srcset</span><span class="token tag attr-value punctuation attr-equals" style="color:#393A34">=</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag attr-value" style="color:#e3116c"></span><br></span><span class="token-line" style="color:#393A34"><span class="token tag attr-value" style="color:#e3116c">    https://cdn.filespin.io/api/v1/assets/ASSET_ID/conversions?resize=640,0&amp;quality=80 640w,</span><br></span><span class="token-line" style="color:#393A34"><span class="token tag attr-value" style="color:#e3116c">    https://cdn.filespin.io/api/v1/assets/ASSET_ID/conversions?resize=1024,0&amp;quality=80 1024w,</span><br></span><span class="token-line" style="color:#393A34"><span class="token tag attr-value" style="color:#e3116c">    https://cdn.filespin.io/api/v1/assets/ASSET_ID/conversions?resize=1440,0&amp;quality=80 1440w</span><br></span><span class="token-line" style="color:#393A34"><span class="token tag attr-value" style="color:#e3116c">  </span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag" style="color:#00009f"></span><br></span><span class="token-line" style="color:#393A34"><span class="token tag" style="color:#00009f">  </span><span class="token tag attr-name" style="color:#00a4db">sizes</span><span class="token tag attr-value punctuation attr-equals" style="color:#393A34">=</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag attr-value" style="color:#e3116c">100vw</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag" style="color:#00009f"></span><br></span><span class="token-line" style="color:#393A34"><span class="token tag" style="color:#00009f">  </span><span class="token tag attr-name" style="color:#00a4db">alt</span><span class="token tag attr-value punctuation attr-equals" style="color:#393A34">=</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag attr-value" style="color:#e3116c">Describe the image</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag" style="color:#00009f"></span><br></span><span class="token-line" style="color:#393A34"><span class="token tag" style="color:#00009f"></span><span class="token tag punctuation" style="color:#393A34">/&gt;</span><br></span></code></pre></div></div>
<p>The <code>w</code> descriptors must match the widths you actually get back. A source smaller than 1440 pixels wide returns its largest size for the 1440 candidate, so adjust the list to your sources.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="recipe-2-square-thumbnail-grid">Recipe 2: Square thumbnail grid<a href="https://developers.filespin.io/guides/image-transformations/#recipe-2-square-thumbnail-grid" class="hash-link" aria-label="Direct link to Recipe 2: Square thumbnail grid" title="Direct link to Recipe 2: Square thumbnail grid" translate="no">​</a></h3>
<p><code>resize</code> alone does not give squares. Crop, or pad:</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">?crop=300,300,center                    # fills the square, trims the edges</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">?resize=300,300,fill:white              # keeps the whole image, pads to a square</span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="recipe-3-social-media-card">Recipe 3: Social media card<a href="https://developers.filespin.io/guides/image-transformations/#recipe-3-social-media-card" class="hash-link" aria-label="Direct link to Recipe 3: Social media card" title="Direct link to Recipe 3: Social media card" translate="no">​</a></h3>
<p>Open Graph images are usually 1200×630. Pad to the exact size with a fixed format:</p>
<div class="language-html codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-html codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">meta</span><span class="token tag" style="color:#00009f"> </span><span class="token tag attr-name" style="color:#00a4db">property</span><span class="token tag attr-value punctuation attr-equals" style="color:#393A34">=</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag attr-value" style="color:#e3116c">og:image</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag" style="color:#00009f"></span><br></span><span class="token-line" style="color:#393A34"><span class="token tag" style="color:#00009f">  </span><span class="token tag attr-name" style="color:#00a4db">content</span><span class="token tag attr-value punctuation attr-equals" style="color:#393A34">=</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag attr-value" style="color:#e3116c">https://cdn.filespin.io/api/v1/assets/ASSET_ID/conversions?resize=1200,630,fill:white&amp;format=jpg&amp;quality=85</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag" style="color:#00009f"> </span><span class="token tag punctuation" style="color:#393A34">/&gt;</span><br></span></code></pre></div></div>
<p>Returns 1200×630. Use <code>crop=1200,630,center</code> instead if you would rather fill the card and trim the edges.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="recipe-4-e-commerce-product-image">Recipe 4: E-commerce product image<a href="https://developers.filespin.io/guides/image-transformations/#recipe-4-e-commerce-product-image" class="hash-link" aria-label="Direct link to Recipe 4: E-commerce product image" title="Direct link to Recipe 4: E-commerce product image" translate="no">​</a></h3>
<p>White square, whole product visible:</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">?resize=800,800,fill:white&amp;quality=85</span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="recipe-5-low-quality-placeholder-lqip">Recipe 5: Low-quality placeholder (LQIP)<a href="https://developers.filespin.io/guides/image-transformations/#recipe-5-low-quality-placeholder-lqip" class="hash-link" aria-label="Direct link to Recipe 5: Low-quality placeholder (LQIP)" title="Direct link to Recipe 5: Low-quality placeholder (LQIP)" translate="no">​</a></h3>
<p>A tiny, blurred placeholder to show while the full image lazy-loads:</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">?resize=40,0&amp;quality=30&amp;effects=blur:5&amp;format=jpg</span><br></span></code></pre></div></div>
<p>Returns 40×30 on the demo asset.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="recipe-6-download-button">Recipe 6: Download button<a href="https://developers.filespin.io/guides/image-transformations/#recipe-6-download-button" class="hash-link" aria-label="Direct link to Recipe 6: Download button" title="Direct link to Recipe 6: Download button" translate="no">​</a></h3>
<p>Make the browser save the file instead of displaying it:</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">?resize=2048,0&amp;format=jpg&amp;delivery=download&amp;dl_prefix=product</span><br></span></code></pre></div></div>
<p>The response carries <code>Content-Disposition: attachment; filename=product.jpg</code>. <a class="" href="https://developers.filespin.io/image-transformations/downloadable-url/">Downloadable URL reference</a>.</p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="public-and-private-images">Public and private images<a href="https://developers.filespin.io/guides/image-transformations/#public-and-private-images" class="hash-link" aria-label="Direct link to Public and private images" title="Direct link to Public and private images" translate="no">​</a></h2>
<p>ODI URLs are public: anyone with the URL can load the image, and image URLs can't be signed. To keep an image private, use a non-public <a class="" href="https://developers.filespin.io/image-transformations/standard-odi-copy/#using-non-public-custom-image-conversion">custom conversion</a> and request it with an API key (server side) or a JWT. Never put an API key in a browser or in a public image URL.</p>
<ul>
<li class=""><a class="" href="https://developers.filespin.io/api-reference/assets/link-type-object-storage-get/">Get Link API</a>: ask FileSpin for a ready-made link for a given conversion key (<code>key</code>), link type (<code>link_type=cdn</code> or <code>object_storage</code>) and delivery mode (<code>delivery=display</code> or <code>download</code>).</li>
</ul>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="performance-tips">Performance tips<a href="https://developers.filespin.io/guides/image-transformations/#performance-tips" class="hash-link" aria-label="Direct link to Performance tips" title="Direct link to Performance tips" translate="no">​</a></h2>
<ol>
<li class=""><strong>Keep URL patterns consistent.</strong> The CDN caches by URL, so <code>?resize=800,600&amp;quality=80</code> and <code>?quality=80&amp;resize=800,600</code> are separate cache entries even though they return the same image. Build image URLs in one shared helper.</li>
<li class=""><strong>Use a small, fixed set of sizes</strong> (for example 320, 640, 1024 and 1440) rather than arbitrary pixel values. Every distinct URL is another render and another cache entry.</li>
<li class=""><strong>Let format negotiation work.</strong> Leave <code>format</code> out for browser delivery. Set it only for email, feeds and other non-browser consumers.</li>
<li class=""><strong>Prefer resize to crop for responsive layouts.</strong> Resize keeps the whole image; crop discards part of it. Crop when a placement needs a fixed aspect ratio, and check the result, especially with <code>face</code> alignment.</li>
<li class=""><strong>Pre-warm images you know will be popular.</strong> The <a class="" href="https://developers.filespin.io/api-reference/cdn/prefetch-post/">CDN Prefetch API</a> primes the cache before a launch.</li>
</ol>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="quick-reference">Quick reference<a href="https://developers.filespin.io/guides/image-transformations/#quick-reference" class="hash-link" aria-label="Direct link to Quick reference" title="Direct link to Quick reference" translate="no">​</a></h2>
<table><thead><tr><th>Transformation</th><th>Parameter</th><th>Example</th></tr></thead><tbody><tr><td>Resize</td><td><code>resize=w,h</code></td><td><code>resize=800,600</code></td></tr><tr><td>Resize and pad</td><td><code>resize=w,h,fill:colour</code></td><td><code>resize=300,300,fill:white</code></td></tr><tr><td>Crop (aligned)</td><td><code>crop=w,h,align</code></td><td><code>crop=600,300,center</code></td></tr><tr><td>Crop (region)</td><td><code>crop=left,top,w,h</code></td><td><code>crop=150,170,200,50</code></td></tr><tr><td>Format</td><td><code>format=fmt</code></td><td><code>format=webp</code></td></tr><tr><td>Quality</td><td><code>quality=1–100</code></td><td><code>quality=80</code></td></tr><tr><td>Background colour</td><td><code>bgcolor=hex</code></td><td><code>bgcolor=ffffff</code></td></tr><tr><td>Trim</td><td><code>trim=tolerance</code></td><td><code>trim=10</code></td></tr><tr><td>Rotate</td><td><code>rotate=deg</code></td><td><code>rotate=90</code></td></tr><tr><td>Flip</td><td><code>flip=h</code> or <code>flip=v</code></td><td><code>flip=h</code></td></tr><tr><td>Effects</td><td><code>effects=name[:value]</code></td><td><code>effects=blur:5</code></td></tr><tr><td>Download</td><td><code>delivery=download&amp;dl_prefix=name</code></td><td><code>delivery=download&amp;dl_prefix=product</code></td></tr></tbody></table>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="next-steps">Next steps<a href="https://developers.filespin.io/guides/image-transformations/#next-steps" class="hash-link" aria-label="Direct link to Next steps" title="Direct link to Next steps" translate="no">​</a></h2>
<ul>
<li class=""><a class="" href="https://developers.filespin.io/guides/responsive-product-images/">Change Product Image Sizes Without Re-Exporting</a>: the Dashboard-first walkthrough with responsive markup and a catalogue rollout checklist.</li>
<li class=""><a class="" href="https://developers.filespin.io/guides/asset-lifecycle/">Asset lifecycle</a>: make sure image processing has finished before using ODI.</li>
<li class=""><a class="" href="https://developers.filespin.io/guides/sharing-assets/">Sharing assets</a>: share images with people outside your account.</li>
<li class=""><a class="" href="https://developers.filespin.io/image-transformations/">ODI overview and limitations</a>: the full reference.</li>
</ul>]]></content:encoded>
            <category>images</category>
            <category>transformations</category>
            <category>cdn</category>
            <category>odi</category>
        </item>
        <item>
            <title><![CDATA[Reviewing and Replacing Assets with Errors]]></title>
            <link>https://developers.filespin.io/guides/reviewing-assets/</link>
            <guid>https://developers.filespin.io/guides/reviewing-assets/</guid>
            <pubDate>Mon, 06 Jan 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[Steps to resolve upload errors and replace failed assets in the FileSpin Dashboard.]]></description>
            <content:encoded><![CDATA[<p>Steps to resolve upload errors and replace failed assets in the FileSpin Dashboard.</p>
<p>Sometimes an upload fails when internet connection fails midway or invalid image or a video is uploaded that cannot be processed. Follow these steps to resolve such errors.</p>
<ol>
<li class="">Review the asset in the Dashboard to check the possible error.</li>
</ol>
<p><img decoding="async" loading="lazy" alt="image" src="https://developers.filespin.io/assets/images/file-abah1HJeox-3934ffbfd7848a37eb2b0c7d59e82eee.png" width="1335" height="563" class="img_ev3q"></p>
<p>You can also open the asset in Detail view by clicking on the asset thumbnail. The error details are shown in the Core tab.</p>
<p><img decoding="async" loading="lazy" alt="image" src="https://developers.filespin.io/assets/images/file-s1lRXrJ9jK-c4c6c08b3946aa4062aef8cb2d998ebc.png" width="1798" height="1278" class="img_ev3q"></p>
<ol start="2">
<li class="">Click on <strong>Replace Content</strong> option to replace the asset file with a valid file. Once the new file is uploaded, thumbnail and other conversions will be automatically processed.</li>
<li class="">After allowing some time for processing to complete, verify all is well by refreshing the page and checking the asset again.</li>
</ol>]]></content:encoded>
            <category>troubleshooting</category>
            <category>assets</category>
            <category>dashboard</category>
        </item>
        <item>
            <title><![CDATA[Administrator Tools for Asset Links and CDN Cache Management]]></title>
            <link>https://developers.filespin.io/guides/asset-links-cdn/</link>
            <guid>https://developers.filespin.io/guides/asset-links-cdn/</guid>
            <pubDate>Sun, 05 Jan 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[How administrators can use Dashboard tools to get asset links, manage CDN cache, and reprocess assets.]]></description>
            <content:encoded><![CDATA[<p>How administrators can use Dashboard tools to get asset links, manage CDN cache, and reprocess assets.</p>
<p>If you are logged in as an Administrator, you can use the Tools menu option to:-</p>
<ol>
<li class=""><strong>Get Asset Links</strong>: Use this form to get a set of URLs for assets, say, 720p video URLs or originals. You can specify whether the links should be downloadable or for display, set an expiry, etc</li>
<li class=""><strong>CDN Prefetch/Purge</strong>: Use this form to submit a set of URLs for CDN Prefetch (cache warming), or CDN Purge</li>
<li class=""><strong>Reprocess Assets</strong>: Use this form to reprocess assets to create newer conversions or re-generate conversions to apply new watermark, etc</li>
</ol>
<p><img decoding="async" loading="lazy" alt="image" src="https://developers.filespin.io/assets/images/file-K3jatJmc8q-dd3e45c8289f7786b76581dfc92e8e50.png" width="1140" height="536" class="img_ev3q"></p>]]></content:encoded>
            <category>admin</category>
            <category>cdn</category>
            <category>dashboard</category>
            <category>assets</category>
        </item>
        <item>
            <title><![CDATA[Downloading Assets Programmatically]]></title>
            <link>https://developers.filespin.io/guides/downloading-assets/</link>
            <guid>https://developers.filespin.io/guides/downloading-assets/</guid>
            <pubDate>Fri, 03 Jan 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[Best practices for downloading asset content using the get_link endpoint for superior performance and reliability.]]></description>
            <content:encoded><![CDATA[<p>Best practices for downloading asset content using the <code>/get_link</code> endpoint for superior performance and reliability.</p>
<p>For downloading asset content, the <code>/get_link</code> endpoint is the highly recommended and architecturally superior method. It provides significantly better performance and reliability compared to the <code> /download</code> endpoint, especially at scale or during peak traffic times, it allows global delivery optimizations and is secure as the download URL expiry can be set and API Key is not needed for download.</p>
<p>The process is a simple two-step flow:</p>
<ol>
<li class="">
<p>Make a <code>GET</code> request to the <code>/get_link</code> endpoint for a specific asset.</p>
</li>
<li class="">
<p>Receive a secure URL in the JSON response and use this URL to download the file directly.</p>
</li>
</ol>
<p><strong>Why You Should Use</strong> <code>/get_link</code></p>
<p>While it may seem like two steps, this workflow is intentionally designed for resilience and speed.</p>
<ul>
<li class=""><strong>Isolates API from heavy lifting</strong>: Our core API servers are optimized for high-speed metadata transactions (creating assets, search, etc.). Streaming large files via the  <code>/download</code> endpoint is resource-intensive and is <strong>intentionally throttled</strong> during high traffic to protect the platform's overall stability. The <code>/get_link</code> method completely avoids this bottleneck.</li>
<li class=""><strong>Leverages scalable cloud storage</strong>: The generated URL points directly to the asset in a massively scalable cloud object storage service. These systems are designed for high-throughput, resilient file delivery across the globe, which is far more efficient than proxying the download through an application server.</li>
<li class=""><strong>Superior performance</strong>: The total time for the two-request process is consistently lower than a single <code>/download</code> request, especially for larger files.<!-- -->
<ol>
<li class="">The first call (<code>/get_link</code>) is an extremely fast metadata call.</li>
<li class="">The second call (downloading from the URL) is a direct, high-speed transfer from a dedicated file-serving network.</li>
</ol>
</li>
</ul>
<p>In summary, using the <code>/get_link</code> workflow is the industry best practice and the most robust and scalable way to download files from the FileSpin platform.</p>]]></content:encoded>
            <category>assets</category>
            <category>downloads</category>
            <category>api</category>
            <category>best-practices</category>
        </item>
        <item>
            <title><![CDATA[Common Causes for Upload Failures in the Browser]]></title>
            <link>https://developers.filespin.io/guides/upload-failures/</link>
            <guid>https://developers.filespin.io/guides/upload-failures/</guid>
            <pubDate>Thu, 02 Jan 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[Troubleshoot upload failures in the browser when using the FileSpin File Picker.]]></description>
            <content:encoded><![CDATA[<p>Troubleshoot upload failures in the browser when using the FileSpin File Picker.</p>
<p>These are some of common causes and solutions for upload failures in the browser when using File Picker.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="upload-failed-because">Upload failed because:<a href="https://developers.filespin.io/guides/upload-failures/#upload-failed-because" class="hash-link" aria-label="Direct link to Upload failed because:" title="Direct link to Upload failed because:" translate="no">​</a></h3>
<ol>
<li class="">There is no internet!</li>
<li class="">You loaded the html file using<code> file://</code> protocol in the web browser by opening via your file system instead of <code>http://</code></li>
<li class="">You provided incorrect <code>uploadKey</code> when initialising the Picker</li>
<li class="">Your account settings do not allow uploads from the domain you are uploading from</li>
</ol>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="developer-tip">Developer Tip:<a href="https://developers.filespin.io/guides/upload-failures/#developer-tip" class="hash-link" aria-label="Direct link to Developer Tip:" title="Direct link to Developer Tip:" translate="no">​</a></h3>
<p>To test uploads from your computer, you must load the picker via <code>http</code> protocol in a browser. Here's how you can do that if you have python installed in your computer.</p>
<ol>
<li class="">Place the <code>index.html</code> containing the picker embed code in a folder</li>
<li class="">Open a terminal window and change to the folder above</li>
<li class="">Run <code>python -m http.server</code></li>
<li class="">Visit <code>http://localhost:8000/index.html</code></li>
</ol>]]></content:encoded>
            <category>troubleshooting</category>
            <category>uploads</category>
            <category>file-picker</category>
        </item>
        <item>
            <title><![CDATA[Frequently Asked Questions]]></title>
            <link>https://developers.filespin.io/guides/faq/</link>
            <guid>https://developers.filespin.io/guides/faq/</guid>
            <pubDate>Wed, 01 Jan 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[Common questions about FileSpin — file limits, storage, supported formats, browsers and devices.]]></description>
            <content:encoded><![CDATA[<p>Common questions about FileSpin — file limits, storage, supported formats, browsers and devices.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="is-there-a-limit-on-how-many-files-can-be-uploaded-into-my-account">Is there a limit on how many files can be uploaded into my account?<a href="https://developers.filespin.io/guides/faq/#is-there-a-limit-on-how-many-files-can-be-uploaded-into-my-account" class="hash-link" aria-label="Direct link to Is there a limit on how many files can be uploaded into my account?" title="Direct link to Is there a limit on how many files can be uploaded into my account?" translate="no">​</a></h3>
<p>It's unlimited for all accounts. We do not limit the number of files that can be uploaded into your account.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="where-are-the-files-stored-and-how-secure-are-our-files-with-filespinio">Where are the files stored and how secure are our files with FileSpin.io?<a href="https://developers.filespin.io/guides/faq/#where-are-the-files-stored-and-how-secure-are-our-files-with-filespinio" class="hash-link" aria-label="Direct link to Where are the files stored and how secure are our files with FileSpin.io?" title="Direct link to Where are the files stored and how secure are our files with FileSpin.io?" translate="no">​</a></h3>
<p>Once user uploads a file using the FileSpin.io File Picker at your website, FileSpin.io securely stores the file in the Storage you have configured. If we cannot access your storage, we will store the file in our storage which you can access at any time.<br>
<!-- -->All file transfers into and out of our servers are via secure protocols (HTTPS, SFTP).</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="what-are-the-file-formats-that-can-be-uploaded-using-filespinio-file-picker">What are the file formats that can be uploaded using FileSpin.io File Picker?<a href="https://developers.filespin.io/guides/faq/#what-are-the-file-formats-that-can-be-uploaded-using-filespinio-file-picker" class="hash-link" aria-label="Direct link to What are the file formats that can be uploaded using FileSpin.io File Picker?" title="Direct link to What are the file formats that can be uploaded using FileSpin.io File Picker?" translate="no">​</a></h3>
<p>FileSpin.io File Picker by default allows any file to be uploaded. You can configure the File Picker while deploying it to your website to limit uploads to specific formats such as JPG and PNG.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="are-there-any-file-size-limits-for-uploads-image-processing-and-video-conversion">Are there any file size limits for uploads, image processing and video conversion?<a href="https://developers.filespin.io/guides/faq/#are-there-any-file-size-limits-for-uploads-image-processing-and-video-conversion" class="hash-link" aria-label="Direct link to Are there any file size limits for uploads, image processing and video conversion?" title="Direct link to Are there any file size limits for uploads, image processing and video conversion?" translate="no">​</a></h3>
<table><thead><tr><th>File</th><th>Limit</th></tr></thead><tbody><tr><td>File uploads</td><td>No limit</td></tr><tr><td>On-demand images and Custom conversions</td><td>By default FileSpin will handle upto 30 MB Maximum size for source image. For image processing of files larger than 30 MB, please contact us to setup large image handling options.</td></tr><tr><td>Video transcoding</td><td>No limit</td></tr></tbody></table>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="what-are-the-source-image-formats-supported">What are the source image formats supported?<a href="https://developers.filespin.io/guides/faq/#what-are-the-source-image-formats-supported" class="hash-link" aria-label="Direct link to What are the source image formats supported?" title="Direct link to What are the source image formats supported?" translate="no">​</a></h3>
<p>We support most standard and raw formats:-</p>
<table><thead><tr><th>Type</th><th>Formats</th></tr></thead><tbody><tr><td>Standard image formats supported</td><td>jpg, png, bmp, tiff, gif, and many more</td></tr><tr><td>RAW Formats supported</td><td>raf, cr2, iiq, mos, raw, rw2, tif, fff, 3fr, nef and many more</td></tr></tbody></table>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="what-are-the-source-video-formats-supported">What are the source video formats supported?<a href="https://developers.filespin.io/guides/faq/#what-are-the-source-video-formats-supported" class="hash-link" aria-label="Direct link to What are the source video formats supported?" title="Direct link to What are the source video formats supported?" translate="no">​</a></h3>
<table><thead><tr><th>Type</th><th>Format</th></tr></thead><tbody><tr><td>Source file formats supported</td><td>3GP, AAC, AVI, FLV, MOV, MPEG-2, MP4, WMV and many more</td></tr><tr><td>Transcode output formats supported</td><td>H.264/MP4 and HLS formats suitable for Web, iOS and Android devices</td></tr></tbody></table>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="what-are-the-supported-web-browsers-and-devices">What are the supported web browsers and devices?<a href="https://developers.filespin.io/guides/faq/#what-are-the-supported-web-browsers-and-devices" class="hash-link" aria-label="Direct link to What are the supported web browsers and devices?" title="Direct link to What are the supported web browsers and devices?" translate="no">​</a></h3>
<table><thead><tr><th>Type</th><th>Support</th></tr></thead><tbody><tr><td>Supported Web Browsers</td><td>IE8 and above, all versions of Chrome, Firefox, Safari and Opera</td></tr><tr><td>Devices specific support</td><td>Android, iOS, Windows mobile browsers</td></tr></tbody></table>]]></content:encoded>
            <category>faq</category>
            <category>getting-started</category>
        </item>
    </channel>
</rss>