<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
	<channel>
		<title>Platform guides on Stockpilot for developers</title>
		<link>/docs/</link>
		<description>Recent content in Platform guides on Stockpilot for developers</description>
		<generator>Hugo</generator>
		<language>en</language>
		
		
		
		
			<lastBuildDate>Sun, 06 Sep 2026 00:00:00 +0000</lastBuildDate>
		
			<atom:link href="/docs/index.xml" rel="self" type="application/rss+xml" />
			<item>
				<title>Authentication</title>
				<link>/docs/authentication/</link>
				<pubDate>Thu, 03 Sep 2026 00:00:00 +0000</pubDate>
				<guid>/docs/authentication/</guid>
				<description>&lt;p&gt;Stockpilot uses static API key authentication. There is no OAuth flow, no bearer token and no refresh cycle. A merchant generates a credential pair in the app and hands it to you.&lt;/p&gt;&#xA;&lt;h2 id=&#34;the-two-headers&#34;&gt;The two headers&lt;/h2&gt;&#xA;&lt;p&gt;Send both on every request, including reads:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;X-CLIENT-ID: 7c1f4ab93e5d2680&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;X-CLIENT-SECRET: e04b9d7a15c3f8621b0e94d7c5a3f8be&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;curl -s https://api.stockpilot.dev/auth/who-is &lt;span class=&#34;se&#34;&gt;\&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  -H &lt;span class=&#34;s2&#34;&gt;&amp;#34;X-CLIENT-ID: &lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$SP_CLIENT_ID&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt; &lt;span class=&#34;se&#34;&gt;\&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  -H &lt;span class=&#34;s2&#34;&gt;&amp;#34;X-CLIENT-SECRET: &lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$SP_CLIENT_SECRET&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;There is no &lt;code&gt;Authorization&lt;/code&gt; header and no query parameter alternative. Sending a bearer token will get you a &lt;code&gt;401&lt;/code&gt;.&lt;/p&gt;</description>
			</item>
			<item>
				<title>API conventions</title>
				<link>/docs/conventions/</link>
				<pubDate>Thu, 03 Sep 2026 00:00:00 +0000</pubDate>
				<guid>/docs/conventions/</guid>
				<description>&lt;p&gt;These rules hold across the whole API.&lt;/p&gt;&#xA;&lt;h2 id=&#34;pagination&#34;&gt;Pagination&lt;/h2&gt;&#xA;&lt;p&gt;Every list endpoint takes &lt;code&gt;page&lt;/code&gt; and &lt;code&gt;page_size&lt;/code&gt;. &lt;code&gt;page&lt;/code&gt; starts at 1, &lt;code&gt;page_size&lt;/code&gt; defaults to 100.&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;curl -s &lt;span class=&#34;s2&#34;&gt;&amp;#34;https://api.stockpilot.dev/inventory?page=2&amp;amp;page_size=500&amp;#34;&lt;/span&gt; &lt;span class=&#34;se&#34;&gt;\&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  -H &lt;span class=&#34;s2&#34;&gt;&amp;#34;X-CLIENT-ID: &lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$SP_CLIENT_ID&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt; &lt;span class=&#34;se&#34;&gt;\&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  -H &lt;span class=&#34;s2&#34;&gt;&amp;#34;X-CLIENT-SECRET: &lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$SP_CLIENT_SECRET&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class=&#34;callout callout--danger&#34;&gt;&#xA;  &lt;span class=&#34;callout__ico&#34; aria-hidden=&#34;true&#34;&gt;x&lt;/span&gt;&#xA;  &lt;div&gt;&lt;p&gt;&lt;strong&gt;There are two envelopes, and they page differently.&lt;/strong&gt; Write one paginator against the wrong one and it will silently read page one forever.&lt;/p&gt;&#xA;&lt;/div&gt;&#xA;&lt;/div&gt;&#xA;&#xA;&lt;p&gt;&lt;strong&gt;Counted envelope&lt;/strong&gt;, on &lt;code&gt;/inventory&lt;/code&gt;, &lt;code&gt;/assemblies&lt;/code&gt;, &lt;code&gt;/purchase-orders&lt;/code&gt; and &lt;code&gt;/returns&lt;/code&gt;. &lt;code&gt;next&lt;/code&gt; and &lt;code&gt;previous&lt;/code&gt; are &lt;strong&gt;booleans, not URLs&lt;/strong&gt;:&lt;/p&gt;</description>
			</item>
			<item>
				<title>Rate limits and idempotency</title>
				<link>/docs/rate-limits/</link>
				<pubDate>Thu, 03 Sep 2026 00:00:00 +0000</pubDate>
				<guid>/docs/rate-limits/</guid>
				<description>&lt;p&gt;Limits are applied &lt;strong&gt;per API key&lt;/strong&gt;, per &lt;code&gt;X-CLIENT-ID&lt;/code&gt; and &lt;code&gt;X-CLIENT-SECRET&lt;/code&gt; pair, in fixed 60 second windows.&lt;/p&gt;&#xA;&lt;p&gt;Each key gets its own allowance, so give every integration its own pair. One key can then be adjusted without affecting the others.&lt;/p&gt;&#xA;&lt;h2 id=&#34;the-four-buckets&#34;&gt;The four buckets&lt;/h2&gt;&#xA;&lt;p&gt;A request is bucketed by what it costs to serve, not by its HTTP verb alone.&lt;/p&gt;&#xA;&lt;table&gt;&#xA;&#x9;&lt;thead&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;th&gt;Bucket&lt;/th&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;th&gt;Limit per minute&lt;/th&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;th&gt;What lands here&lt;/th&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&lt;/thead&gt;&#xA;&#x9;&lt;tbody&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;code&gt;read-single&lt;/code&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;300&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;Fetching one record by id, sku or barcode&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;code&gt;read-list&lt;/code&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;120&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;Paginated list endpoints&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;code&gt;write&lt;/code&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;60&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;Creates, updates, deletes&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;code&gt;heavy&lt;/code&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;20&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;Anything that reaches a carrier, a marketplace or a mail provider&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&lt;/tbody&gt;&#xA;&lt;/table&gt;&#xA;&lt;p&gt;The heavy routes, specifically:&lt;/p&gt;</description>
			</item>
			<item>
				<title>The inventory model</title>
				<link>/docs/inventory-model/</link>
				<pubDate>Thu, 03 Sep 2026 00:00:00 +0000</pubDate>
				<guid>/docs/inventory-model/</guid>
				<description>&lt;p&gt;An inventory record carries several numbers that all look like &amp;ldquo;how many do we have&amp;rdquo;. They are not interchangeable, and the two surfaces answer different questions.&lt;/p&gt;&#xA;&lt;h2 id=&#34;two-surfaces-two-shapes&#34;&gt;Two surfaces, two shapes&lt;/h2&gt;&#xA;&lt;p&gt;&lt;code&gt;GET /inventory&lt;/code&gt; returns the &lt;strong&gt;stored record&lt;/strong&gt; for an item:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-json&#34; data-lang=&#34;json&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nt&#34;&gt;&amp;#34;id&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;34897&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nt&#34;&gt;&amp;#34;sku&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;201156&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nt&#34;&gt;&amp;#34;item_name&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;Vichy Homme Structure Force 50 ml&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nt&#34;&gt;&amp;#34;quantity&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;150&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nt&#34;&gt;&amp;#34;reserved_quantity&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;3&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nt&#34;&gt;&amp;#34;incoming_quantity&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;50&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nt&#34;&gt;&amp;#34;backorder_amount&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nt&#34;&gt;&amp;#34;bin_location&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;A1-001-01&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;B2-003-05&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;],&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nt&#34;&gt;&amp;#34;threshold&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;5u&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The &lt;code&gt;inventory.stock_changed&lt;/code&gt; webhook sends a &lt;strong&gt;different, purpose built&lt;/strong&gt; payload, because stored fields alone cannot express multi warehouse stock unambiguously:&lt;/p&gt;</description>
			</item>
			<item>
				<title>Assemblies</title>
				<link>/docs/assemblies/</link>
				<pubDate>Sun, 06 Sep 2026 00:00:00 +0000</pubDate>
				<guid>/docs/assemblies/</guid>
				<description>&lt;p&gt;An assembly is an inventory item built from other inventory items. A dive set made of a mask, a snorkel and fins. A light fitting made of a housing, a driver and an LED board.&lt;/p&gt;&#xA;&lt;p&gt;There is no separate &amp;ldquo;create assembly&amp;rdquo; call. &lt;strong&gt;An item becomes an assembly the moment it has its first component&lt;/strong&gt;, and stops being one when you remove the last.&lt;/p&gt;&#xA;&lt;h2 id=&#34;assemblies-are-not-bundles&#34;&gt;Assemblies are not bundles&lt;/h2&gt;&#xA;&lt;p&gt;Both are items made of other items, and they behave nothing alike.&lt;/p&gt;</description>
			</item>
			<item>
				<title>Orders and fulfilment</title>
				<link>/docs/orders/</link>
				<pubDate>Thu, 03 Sep 2026 00:00:00 +0000</pubDate>
				<guid>/docs/orders/</guid>
				<description>&lt;p&gt;What the order states mean, how line items change under you, and which operations are safe to run unattended.&lt;/p&gt;&#xA;&lt;h2 id=&#34;statuses&#34;&gt;Statuses&lt;/h2&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;open · pending · on-hold · completed · cancelled&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Filter with &lt;code&gt;?status=open&lt;/code&gt;, or pass several comma separated. An order arriving from a marketplace can land in any of them: a bol.com import can arrive already &lt;code&gt;completed&lt;/code&gt;, which is why &lt;code&gt;orders.completed&lt;/code&gt; &lt;a href=&#34;/docs/webhooks/&#34;&gt;fires on arrival as well as on transition&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;h2 id=&#34;reading-an-order&#34;&gt;Reading an order&lt;/h2&gt;&#xA;&lt;p&gt;&lt;span class=&#34;ep ep--get&#34;&gt;&lt;b&gt;GET&lt;/b&gt; /orders&lt;/span&gt;&#xA; gives you a page of summaries. &lt;span class=&#34;ep ep--get&#34;&gt;&lt;b&gt;GET&lt;/b&gt; /orders/get-single&lt;/span&gt;&#xA; takes either &lt;code&gt;order_pk&lt;/code&gt; or &lt;code&gt;order_number&lt;/code&gt;, and returns the full record with line items, addresses and channel.&lt;/p&gt;</description>
			</item>
			<item>
				<title>Shipping and labels</title>
				<link>/docs/shipping/</link>
				<pubDate>Thu, 03 Sep 2026 00:00:00 +0000</pubDate>
				<guid>/docs/shipping/</guid>
				<description>&lt;p&gt;Buying a label is the most expensive thing this API does. It reaches a carrier, it costs money, and it cannot be undone by a retry. Everything below is arranged around that.&lt;/p&gt;&#xA;&lt;h2 id=&#34;carriers&#34;&gt;Carriers&lt;/h2&gt;&#xA;&lt;p&gt;&lt;span class=&#34;ep ep--get&#34;&gt;&lt;b&gt;GET&lt;/b&gt; /shipping/integrations&lt;/span&gt;&#xA; lists what the organization has connected. You need the carrier id from here to request anything.&lt;/p&gt;&#xA;&lt;h2 id=&#34;templates&#34;&gt;Templates&lt;/h2&gt;&#xA;&lt;p&gt;&lt;span class=&#34;ep ep--get&#34;&gt;&lt;b&gt;GET&lt;/b&gt; /shipping/label-templates&lt;/span&gt;&#xA; returns the templates available, each with an &lt;code&gt;id&lt;/code&gt;, a &lt;code&gt;name&lt;/code&gt; and a &lt;code&gt;carrier_identifier&lt;/code&gt;.&lt;/p&gt;&#xA;&lt;p&gt;Some templates are &lt;strong&gt;virtual&lt;/strong&gt;: they are generated per connected channel rather than configured by hand.&lt;/p&gt;</description>
			</item>
			<item>
				<title>Purchasing and inbound deliveries</title>
				<link>/docs/purchasing/</link>
				<pubDate>Thu, 03 Sep 2026 00:00:00 +0000</pubDate>
				<guid>/docs/purchasing/</guid>
				<description>&lt;p&gt;Purchase orders track what you asked a supplier for and what has physically turned up. Those two move independently, and reading one as the other is the most common bug here.&lt;/p&gt;&#xA;&lt;h2 id=&#34;suppliers&#34;&gt;Suppliers&lt;/h2&gt;&#xA;&lt;p&gt;&lt;span class=&#34;ep ep--get&#34;&gt;&lt;b&gt;GET&lt;/b&gt; /purchase-orders/suppliers/list&lt;/span&gt;&#xA; lists who you can order from. Recommendations are generated per supplier, because lead time and minimum order quantities are supplier properties.&lt;/p&gt;&#xA;&lt;h2 id=&#34;recommendations&#34;&gt;Recommendations&lt;/h2&gt;&#xA;&lt;p&gt;Stockpilot already knows your sales velocity, lead times and inbound stock, so ask it rather than recomputing:&lt;/p&gt;</description>
			</item>
			<item>
				<title>Sales channels and returns</title>
				<link>/docs/sales-channels/</link>
				<pubDate>Thu, 03 Sep 2026 00:00:00 +0000</pubDate>
				<guid>/docs/sales-channels/</guid>
				<description>&lt;p&gt;Stockpilot sits between a seller&amp;rsquo;s channels and their stock. The API exposes what is connected and lets you trigger a sync, but connecting a channel is not something you can do through it.&lt;/p&gt;&#xA;&lt;h2 id=&#34;what-is-connected&#34;&gt;What is connected&lt;/h2&gt;&#xA;&lt;span class=&#34;ep ep--get&#34;&gt;&lt;b&gt;GET&lt;/b&gt; /sales-channels&lt;/span&gt;&#xA;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-json&#34; data-lang=&#34;json&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nt&#34;&gt;&amp;#34;channels&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;nt&#34;&gt;&amp;#34;id&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;nt&#34;&gt;&amp;#34;name&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;My Shopify Store&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;nt&#34;&gt;&amp;#34;handle&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;shopify&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;nt&#34;&gt;&amp;#34;is_active&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;true&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;nt&#34;&gt;&amp;#34;logo&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;https://…/shopify-icon.png&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;nt&#34;&gt;&amp;#34;channel_is_forwarded&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;false&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;nt&#34;&gt;&amp;#34;is_inventory_source&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;true&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;nt&#34;&gt;&amp;#34;is_synchronized&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;true&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;nt&#34;&gt;&amp;#34;created_at&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;2023-01-15T10:30:00Z&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Supported handles today:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;shopify · woocommerce · amazon · bol · etsy · kaufland · mirakl · b2b-portal&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Four fields decide how a channel behaves, and they are worth reading rather than assuming:&lt;/p&gt;</description>
			</item>
			<item>
				<title>Webhook delivery contract</title>
				<link>/docs/webhooks/</link>
				<pubDate>Thu, 03 Sep 2026 00:00:00 +0000</pubDate>
				<guid>/docs/webhooks/</guid>
				<description>&lt;p&gt;Stockpilot pushes events to an HTTPS endpoint you control. You register an endpoint with &lt;code&gt;POST /webhooks/create&lt;/code&gt;, verify the signature on every request, and respond &lt;code&gt;2xx&lt;/code&gt; quickly. Delivery is &lt;strong&gt;at-least-once&lt;/strong&gt;, so your handler must be idempotent.&lt;/p&gt;&#xA;&lt;h2 id=&#34;available-events&#34;&gt;Available events&lt;/h2&gt;&#xA;&lt;table&gt;&#xA;&#x9;&lt;thead&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;th&gt;Event&lt;/th&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;th&gt;Fires when&lt;/th&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&lt;/thead&gt;&#xA;&#x9;&lt;tbody&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;code&gt;orders.created&lt;/code&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;A new order arrives.&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;code&gt;orders.updated&lt;/code&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;An order changes. Chattier than it looks, see below.&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;code&gt;orders.completed&lt;/code&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;An order reaches the completed state, either by transitioning to it or by arriving already completed, such as a bol.com import. Fires once per order.&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;code&gt;inventory.stock_changed&lt;/code&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;A product&amp;rsquo;s stock quantity changes in any warehouse.&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;code&gt;purchase_orders.status_changed&lt;/code&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;A purchase order moves between &lt;code&gt;DRAFT&lt;/code&gt;, &lt;code&gt;ORDERED&lt;/code&gt;, &lt;code&gt;SHIPPED&lt;/code&gt;, &lt;code&gt;CONFIRMED&lt;/code&gt;, &lt;code&gt;DELIVERED&lt;/code&gt; and &lt;code&gt;COMPLETED&lt;/code&gt;.&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;code&gt;purchase_orders.received&lt;/code&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;A purchase order reaches &lt;code&gt;DELIVERED&lt;/code&gt;.&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;code&gt;purchase_orders.parcel_status_changed&lt;/code&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;A parcel moves between &lt;code&gt;CREATED&lt;/code&gt;, &lt;code&gt;PROCESSING&lt;/code&gt; and &lt;code&gt;COMPLETED&lt;/code&gt;.&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;code&gt;purchase_orders.parcel_received&lt;/code&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;A parcel has been applied to stock.&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&lt;/tbody&gt;&#xA;&lt;/table&gt;&#xA;&lt;p&gt;&lt;strong&gt;One event per webhook.&lt;/strong&gt; Subscribe to each one you want with its own &lt;code&gt;POST /webhooks/create&lt;/code&gt;.&lt;/p&gt;</description>
			</item>
	</channel>
</rss>
