{"id":474,"date":"2026-09-17T10:00:00","date_gmt":"2026-09-17T08:00:00","guid":{"rendered":"https:\/\/www.lukaswojcik.com\/?p=474"},"modified":"2026-10-26T12:09:31","modified_gmt":"2026-10-26T11:09:31","slug":"automated-price-and-inventory-monitoring-for-meta-ads-via-python-scripts","status":"publish","type":"post","link":"https:\/\/www.lukaswojcik.com\/blog\/en\/digital-marketing\/tutorials-en-digital-marketing\/automated-price-and-inventory-monitoring-for-meta-ads-via-python-scripts\/","title":{"rendered":"Automated Price and Inventory Monitoring for Meta Ads via Python &amp; Scripts"},"content":{"rendered":"<p>A price and inventory monitor can identify ads for unavailable products and prepare changes. It needs current product data, an unambiguous ad mapping and explicit rules for existing pauses. An hourly run is neither real-time nor instantaneous; improved returns or complete elimination of wasted spend cannot be guaranteed.<\/p>\n<h2>1. Identification of the correct object<\/h2>\n<p>A single-product ad can map to one SKU, the shop\u2019s identifier for a specific product variant. An ad set can contain several ads and products, so pausing the entire set because of one SKU can also stop available offers. For catalog ads, product availability belongs in the catalog, for example through <code>availability<\/code>; data acceptance, processing and actual delivery require separate checks.<\/p>\n<p>A reviewed mapping of ad account, ad ID and SKU is more reliable than a name fragment. Names can change or be duplicated. Catalog ads and multi-product ads remain outside the single-product rule shown below.<\/p>\n<figure class=\"lw-diagram\"><img decoding=\"async\" src=\"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/diagrams\/dia-474-admonitor-20261024-en.png\" width=\"1120\" height=\"580\" loading=\"lazy\" alt=\"Data validation, proposals and actual status changes are separate steps.\"><figcaption>Data validation, proposals and actual status changes are separate steps.<\/figcaption><\/figure>\n<h2>2. Rules without false certainty<\/h2>\n<ul><li><strong>Stock:<\/strong> Available sellable inventory must account for reservations and the intended treatment of preorders. Missing or stale data do not mean zero stock. Negative values require an explicit policy.<\/li><li><strong>Price:<\/strong> Variant, pack size, currency, tax, shipping and availability must be comparable. A scraped number alone is insufficient.<\/li><li><strong>Threshold:<\/strong> Eight percent is an example business choice, not an established universal conversion-loss threshold. Relative to the shop&#8217;s own price, the formula is <code>(own price \u2212 competitor price) \/ own price<\/code>. \u20ac100 and \u20ac92 give exactly 8%; dividing by the competitor price instead gives about 8.70%.<\/li><li><strong>Reactivation:<\/strong> Healthy stock must not override a manual pause. Even a monitor-owned pause needs evidence that no other restriction has been added.<\/li><\/ul>\n<h2>3. An isolated decision function<\/h2>\n<p>The following Python example returns proposals only. It does not fetch a product feed, read an ad account or modify an ad. Upstream preparation supplies a reviewed single-product mapping, the current configured ad status and an explicit manual-hold state. <code>manual_hold=False<\/code> is a deliberately maintained input, not a Meta API field.<\/p>\n<p>Prices are decimal strings such as <code>&quot;19.95&quot;<\/code>, stock is a non-negative integer and timestamps include a timezone. The example bounds price magnitudes to decimal exponents from \u22126 to 12 (values from 0.000001 up to, but not including, 10,000,000,000,000) and checks a three-letter uppercase currency format; upstream preparation must validate the actual ISO currency and business comparability. A maximum data age of one hour is also an example policy.<\/p>\n<figure style=\"--cbb-digits:2\" class=\"cbb cbb--wrap cbb--numbers wp-block-code-beautifier-block-code\" data-lang=\"python\"><figcaption class=\"cbb-head\"><span class=\"cbb-lang\">Python<\/span><span class=\"cbb-actions\"><button type=\"button\" class=\"cbb-button cbb-button--wrap\" data-cbb-action=\"wrap\" aria-pressed=\"true\" title=\"Wrap long lines\"><svg aria-hidden=\"true\" focusable=\"false\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\"><path d=\"M2 4h12M2 8h9.5a2.5 2.5 0 0 1 0 5H8m0 0 1.5-1.5M8 13l1.5 1.5M2 12h3\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\/><\/svg><span class=\"cbb-sr\">Wrap long lines<\/span><\/button><button type=\"button\" class=\"cbb-button cbb-button--copy\" data-cbb-action=\"copy\" data-cbb-done=\"Copied\" data-cbb-failed=\"Press Ctrl+C to copy\"><svg aria-hidden=\"true\" focusable=\"false\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\"><rect x=\"5.5\" y=\"5.5\" width=\"8\" height=\"8.5\" rx=\"1.5\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\"\/><path d=\"M10.5 3.5V3A1.5 1.5 0 0 0 9 1.5H4A1.5 1.5 0 0 0 2.5 3v6.5A1.5 1.5 0 0 0 4 11h.5\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\"\/><\/svg><span class=\"cbb-button-label\" aria-live=\"polite\">Copy<\/span><\/button><\/span><\/figcaption><pre class=\"cbb-pre\" tabindex=\"0\"><code class=\"cbb-code language-python\" style=\"counter-reset:cbb-line 0;\"><span class=\"cbb-line\"><span class=\"cbb-keyword\">from<\/span> datetime <span class=\"cbb-keyword\">import<\/span> datetime, timezone\n<\/span><span class=\"cbb-line\"><span class=\"cbb-keyword\">from<\/span> decimal <span class=\"cbb-keyword\">import<\/span> Decimal, InvalidOperation\n<\/span><span class=\"cbb-line\">\n<\/span><span class=\"cbb-line\">MAX_AGE_SECONDS = <span class=\"cbb-number\">3600<\/span>  <span class=\"cbb-comment\"># Example policy, not a Meta requirement.<\/span>\n<\/span><span class=\"cbb-line\">PRICE_GAP = <span class=\"cbb-function\">Decimal<\/span>(<span class=\"cbb-string\">\"0.08\"<\/span>)\n<\/span><span class=\"cbb-line\">\n<\/span><span class=\"cbb-line\">\n<\/span><span class=\"cbb-line\"><span class=\"cbb-keyword\">def<\/span> <span class=\"cbb-function\">fresh<\/span>(value, now):\n<\/span><span class=\"cbb-line\">    <span class=\"cbb-keyword\">try<\/span>:\n<\/span><span class=\"cbb-line\">        stamp = datetime.<span class=\"cbb-function\">fromisoformat<\/span>(value.<span class=\"cbb-function\">replace<\/span>(<span class=\"cbb-string\">\"Z\"<\/span>, <span class=\"cbb-string\">\"+00:00\"<\/span>))\n<\/span><span class=\"cbb-line\">        <span class=\"cbb-keyword\">if<\/span> stamp.tzinfo <span class=\"cbb-keyword\">is<\/span> <span class=\"cbb-constant\">None<\/span>:\n<\/span><span class=\"cbb-line\">            <span class=\"cbb-keyword\">return<\/span> <span class=\"cbb-constant\">False<\/span>\n<\/span><span class=\"cbb-line\">        <span class=\"cbb-keyword\">return<\/span> <span class=\"cbb-number\">0<\/span> &lt;= (now - stamp).<span class=\"cbb-function\">total_seconds<\/span>() &lt;= MAX_AGE_SECONDS\n<\/span><span class=\"cbb-line\">    <span class=\"cbb-keyword\">except<\/span> (AttributeError, TypeError, ValueError):\n<\/span><span class=\"cbb-line\">        <span class=\"cbb-keyword\">return<\/span> <span class=\"cbb-constant\">False<\/span>\n<\/span><span class=\"cbb-line\">\n<\/span><span class=\"cbb-line\">\n<\/span><span class=\"cbb-line\"><span class=\"cbb-keyword\">def<\/span> <span class=\"cbb-function\">positive_money<\/span>(value):\n<\/span><span class=\"cbb-line\">    <span class=\"cbb-keyword\">if<\/span> <span class=\"cbb-keyword\">not<\/span> <span class=\"cbb-function\">isinstance<\/span>(value, str) <span class=\"cbb-keyword\">or<\/span> <span class=\"cbb-function\">len<\/span>(value) &gt; <span class=\"cbb-number\">40<\/span>:\n<\/span><span class=\"cbb-line\">        <span class=\"cbb-keyword\">raise<\/span> <span class=\"cbb-function\">ValueError<\/span>(<span class=\"cbb-string\">\"Money must be a decimal string\"<\/span>)\n<\/span><span class=\"cbb-line\">    amount = <span class=\"cbb-function\">Decimal<\/span>(value)\n<\/span><span class=\"cbb-line\">    <span class=\"cbb-keyword\">if<\/span> <span class=\"cbb-keyword\">not<\/span> amount.<span class=\"cbb-function\">is_finite<\/span>() <span class=\"cbb-keyword\">or<\/span> amount &lt;= <span class=\"cbb-number\">0<\/span> <span class=\"cbb-keyword\">or<\/span> <span class=\"cbb-keyword\">not<\/span> <span class=\"cbb-number\">-6<\/span> &lt;= amount.<span class=\"cbb-function\">adjusted<\/span>() &lt;= <span class=\"cbb-number\">12<\/span>:\n<\/span><span class=\"cbb-line\">        <span class=\"cbb-keyword\">raise<\/span> <span class=\"cbb-function\">ValueError<\/span>(<span class=\"cbb-string\">\"Invalid price\"<\/span>)\n<\/span><span class=\"cbb-line\">    <span class=\"cbb-keyword\">return<\/span> amount\n<\/span><span class=\"cbb-line\">\n<\/span><span class=\"cbb-line\">\n<\/span><span class=\"cbb-line\"><span class=\"cbb-keyword\">def<\/span> <span class=\"cbb-function\">propose<\/span>(item, ad, now):\n<\/span><span class=\"cbb-line\">    <span class=\"cbb-string\">\"\"\"Pure decision function: no API calls and no status writes.\"\"\"<\/span>\n<\/span><span class=\"cbb-line\">    <span class=\"cbb-keyword\">if<\/span> now.tzinfo <span class=\"cbb-keyword\">is<\/span> <span class=\"cbb-constant\">None<\/span>:\n<\/span><span class=\"cbb-line\">        <span class=\"cbb-keyword\">raise<\/span> <span class=\"cbb-function\">ValueError<\/span>(<span class=\"cbb-string\">\"now must include a timezone\"<\/span>)\n<\/span><span class=\"cbb-line\">    <span class=\"cbb-keyword\">if<\/span> (ad.<span class=\"cbb-function\">get<\/span>(<span class=\"cbb-string\">\"kind\"<\/span>) != <span class=\"cbb-string\">\"single_product\"<\/span>\n<\/span><span class=\"cbb-line\">            <span class=\"cbb-keyword\">or<\/span> ad.<span class=\"cbb-function\">get<\/span>(<span class=\"cbb-string\">\"sku\"<\/span>) != item.<span class=\"cbb-function\">get<\/span>(<span class=\"cbb-string\">\"sku\"<\/span>)\n<\/span><span class=\"cbb-line\">            <span class=\"cbb-keyword\">or<\/span> <span class=\"cbb-keyword\">not<\/span> <span class=\"cbb-function\">isinstance<\/span>(item.<span class=\"cbb-function\">get<\/span>(<span class=\"cbb-string\">\"sku\"<\/span>), str) <span class=\"cbb-keyword\">or<\/span> <span class=\"cbb-keyword\">not<\/span> item&#91;<span class=\"cbb-string\">\"sku\"<\/span>&#93;\n<\/span><span class=\"cbb-line\">            <span class=\"cbb-keyword\">or<\/span> <span class=\"cbb-keyword\">not<\/span> <span class=\"cbb-function\">isinstance<\/span>(ad.<span class=\"cbb-function\">get<\/span>(<span class=\"cbb-string\">\"id\"<\/span>), str) <span class=\"cbb-keyword\">or<\/span> <span class=\"cbb-keyword\">not<\/span> ad&#91;<span class=\"cbb-string\">\"id\"<\/span>&#93;.<span class=\"cbb-function\">isascii<\/span>()\n<\/span><span class=\"cbb-line\">            <span class=\"cbb-keyword\">or<\/span> <span class=\"cbb-keyword\">not<\/span> ad&#91;<span class=\"cbb-string\">\"id\"<\/span>&#93;.<span class=\"cbb-function\">isdigit<\/span>()):\n<\/span><span class=\"cbb-line\">        <span class=\"cbb-keyword\">return<\/span> <span class=\"cbb-string\">\"REVIEW\"<\/span>, <span class=\"cbb-string\">\"mapping\"<\/span>\n<\/span><span class=\"cbb-line\">    <span class=\"cbb-keyword\">if<\/span> ad.<span class=\"cbb-function\">get<\/span>(<span class=\"cbb-string\">\"manual_hold\"<\/span>) <span class=\"cbb-keyword\">is<\/span> <span class=\"cbb-keyword\">not<\/span> <span class=\"cbb-constant\">False<\/span>:\n<\/span><span class=\"cbb-line\">        <span class=\"cbb-keyword\">return<\/span> <span class=\"cbb-string\">\"REVIEW\"<\/span>, <span class=\"cbb-string\">\"manual_or_unknown_hold\"<\/span>\n<\/span><span class=\"cbb-line\">    status = ad.<span class=\"cbb-function\">get<\/span>(<span class=\"cbb-string\">\"status\"<\/span>)\n<\/span><span class=\"cbb-line\">    <span class=\"cbb-keyword\">if<\/span> status <span class=\"cbb-keyword\">not<\/span> <span class=\"cbb-keyword\">in<\/span> {<span class=\"cbb-string\">\"ACTIVE\"<\/span>, <span class=\"cbb-string\">\"PAUSED\"<\/span>}:\n<\/span><span class=\"cbb-line\">        <span class=\"cbb-keyword\">return<\/span> <span class=\"cbb-string\">\"REVIEW\"<\/span>, <span class=\"cbb-string\">\"unsupported_status\"<\/span>\n<\/span><span class=\"cbb-line\">    stock = item.<span class=\"cbb-function\">get<\/span>(<span class=\"cbb-string\">\"stock\"<\/span>)\n<\/span><span class=\"cbb-line\">    <span class=\"cbb-keyword\">if<\/span> <span class=\"cbb-function\">type<\/span>(stock) <span class=\"cbb-keyword\">is<\/span> <span class=\"cbb-keyword\">not<\/span> int <span class=\"cbb-keyword\">or<\/span> stock &lt; <span class=\"cbb-number\">0<\/span>:\n<\/span><span class=\"cbb-line\">        <span class=\"cbb-keyword\">return<\/span> <span class=\"cbb-string\">\"REVIEW\"<\/span>, <span class=\"cbb-string\">\"invalid_stock\"<\/span>\n<\/span><span class=\"cbb-line\">    <span class=\"cbb-keyword\">if<\/span> <span class=\"cbb-keyword\">not<\/span> <span class=\"cbb-function\">fresh<\/span>(item.<span class=\"cbb-function\">get<\/span>(<span class=\"cbb-string\">\"stock_at\"<\/span>), now):\n<\/span><span class=\"cbb-line\">        <span class=\"cbb-keyword\">return<\/span> <span class=\"cbb-string\">\"REVIEW\"<\/span>, <span class=\"cbb-string\">\"stale_stock\"<\/span>\n<\/span><span class=\"cbb-line\">    reason = <span class=\"cbb-constant\">None<\/span>\n<\/span><span class=\"cbb-line\">    <span class=\"cbb-keyword\">if<\/span> stock == <span class=\"cbb-number\">0<\/span>:\n<\/span><span class=\"cbb-line\">        reason = <span class=\"cbb-string\">\"out_of_stock\"<\/span>\n<\/span><span class=\"cbb-line\">    <span class=\"cbb-keyword\">else<\/span>:\n<\/span><span class=\"cbb-line\">        <span class=\"cbb-keyword\">if<\/span> (item.<span class=\"cbb-function\">get<\/span>(<span class=\"cbb-string\">\"comparable\"<\/span>) <span class=\"cbb-keyword\">is<\/span> <span class=\"cbb-keyword\">not<\/span> <span class=\"cbb-constant\">True<\/span>\n<\/span><span class=\"cbb-line\">                <span class=\"cbb-keyword\">or<\/span> item.<span class=\"cbb-function\">get<\/span>(<span class=\"cbb-string\">\"currency\"<\/span>) != item.<span class=\"cbb-function\">get<\/span>(<span class=\"cbb-string\">\"competitor_currency\"<\/span>)\n<\/span><span class=\"cbb-line\">                <span class=\"cbb-keyword\">or<\/span> <span class=\"cbb-keyword\">not<\/span> <span class=\"cbb-function\">isinstance<\/span>(item.<span class=\"cbb-function\">get<\/span>(<span class=\"cbb-string\">\"currency\"<\/span>), str)\n<\/span><span class=\"cbb-line\">                <span class=\"cbb-keyword\">or<\/span> <span class=\"cbb-function\">len<\/span>(item&#91;<span class=\"cbb-string\">\"currency\"<\/span>&#93;) != <span class=\"cbb-number\">3<\/span>\n<\/span><span class=\"cbb-line\">                <span class=\"cbb-keyword\">or<\/span> <span class=\"cbb-keyword\">not<\/span> item&#91;<span class=\"cbb-string\">\"currency\"<\/span>&#93;.<span class=\"cbb-function\">isascii<\/span>()\n<\/span><span class=\"cbb-line\">                <span class=\"cbb-keyword\">or<\/span> <span class=\"cbb-keyword\">not<\/span> item&#91;<span class=\"cbb-string\">\"currency\"<\/span>&#93;.<span class=\"cbb-function\">isalpha<\/span>()\n<\/span><span class=\"cbb-line\">                <span class=\"cbb-keyword\">or<\/span> item&#91;<span class=\"cbb-string\">\"currency\"<\/span>&#93; != item&#91;<span class=\"cbb-string\">\"currency\"<\/span>&#93;.<span class=\"cbb-function\">upper<\/span>()\n<\/span><span class=\"cbb-line\">                <span class=\"cbb-keyword\">or<\/span> <span class=\"cbb-keyword\">not<\/span> <span class=\"cbb-function\">fresh<\/span>(item.<span class=\"cbb-function\">get<\/span>(<span class=\"cbb-string\">\"price_at\"<\/span>), now)\n<\/span><span class=\"cbb-line\">                <span class=\"cbb-keyword\">or<\/span> <span class=\"cbb-keyword\">not<\/span> <span class=\"cbb-function\">fresh<\/span>(item.<span class=\"cbb-function\">get<\/span>(<span class=\"cbb-string\">\"competitor_at\"<\/span>), now)):\n<\/span><span class=\"cbb-line\">            <span class=\"cbb-keyword\">return<\/span> <span class=\"cbb-string\">\"REVIEW\"<\/span>, <span class=\"cbb-string\">\"incomparable_or_stale_prices\"<\/span>\n<\/span><span class=\"cbb-line\">        <span class=\"cbb-keyword\">try<\/span>:\n<\/span><span class=\"cbb-line\">            own = <span class=\"cbb-function\">positive_money<\/span>(item.<span class=\"cbb-function\">get<\/span>(<span class=\"cbb-string\">\"price\"<\/span>))\n<\/span><span class=\"cbb-line\">            other = <span class=\"cbb-function\">positive_money<\/span>(item.<span class=\"cbb-function\">get<\/span>(<span class=\"cbb-string\">\"competitor_price\"<\/span>))\n<\/span><span class=\"cbb-line\">        <span class=\"cbb-keyword\">except<\/span> (ValueError, InvalidOperation):\n<\/span><span class=\"cbb-line\">            <span class=\"cbb-keyword\">return<\/span> <span class=\"cbb-string\">\"REVIEW\"<\/span>, <span class=\"cbb-string\">\"invalid_price\"<\/span>\n<\/span><span class=\"cbb-line\">        <span class=\"cbb-comment\"># Competitor discount relative to the shop's own price.<\/span>\n<\/span><span class=\"cbb-line\">        <span class=\"cbb-keyword\">if<\/span> (own - other) \/ own &gt; PRICE_GAP:\n<\/span><span class=\"cbb-line\">            reason = <span class=\"cbb-string\">\"price_gap\"<\/span>\n<\/span><span class=\"cbb-line\">    <span class=\"cbb-keyword\">if<\/span> reason:\n<\/span><span class=\"cbb-line\">        <span class=\"cbb-keyword\">return<\/span> (<span class=\"cbb-string\">\"PAUSE_REVIEW\"<\/span> <span class=\"cbb-keyword\">if<\/span> status == <span class=\"cbb-string\">\"ACTIVE\"<\/span> <span class=\"cbb-keyword\">else<\/span> <span class=\"cbb-string\">\"NO_CHANGE\"<\/span>), reason\n<\/span><span class=\"cbb-line\">    <span class=\"cbb-keyword\">if<\/span> status == <span class=\"cbb-string\">\"PAUSED\"<\/span>:\n<\/span><span class=\"cbb-line\">        <span class=\"cbb-keyword\">if<\/span> ad.<span class=\"cbb-function\">get<\/span>(<span class=\"cbb-string\">\"pause_owner\"<\/span>) == <span class=\"cbb-string\">\"inventory_monitor\"<\/span>:\n<\/span><span class=\"cbb-line\">            <span class=\"cbb-keyword\">return<\/span> <span class=\"cbb-string\">\"RESUME_REVIEW\"<\/span>, <span class=\"cbb-string\">\"conditions_recovered\"<\/span>\n<\/span><span class=\"cbb-line\">        <span class=\"cbb-keyword\">return<\/span> <span class=\"cbb-string\">\"NO_CHANGE\"<\/span>, <span class=\"cbb-string\">\"pause_not_owned\"<\/span>\n<\/span><span class=\"cbb-line\">    <span class=\"cbb-keyword\">return<\/span> <span class=\"cbb-string\">\"NO_CHANGE\"<\/span>, <span class=\"cbb-string\">\"conditions_ok\"<\/span><\/span><\/code><\/pre><\/figure>\n<p><code>PAUSE_REVIEW<\/code> indicates a reasoned proposal to pause. <code>RESUME_REVIEW<\/code> requests a review of possible resumption; it is not the status <code>ACTIVE<\/code>. <code>REVIEW<\/code> identifies invalid or uncertain inputs, while <code>NO_CHANGE<\/code> causes no change. Valid zero stock is evaluated independently of missing competitor prices. With positive stock, a missing price comparison prevents a resumption proposal.<\/p>\n<h2>4. Separate API integration and execution<\/h2>\n<p>A production adapter needs suitable application permissions and assigned ad-account assets. A blanket recommendation for an admin system user is unnecessary. Read and write access require separate planning; <code>ads_management<\/code> permits changes. Even a token without a fixed expiration date can become invalid. Credentials do not belong in source code, example defaults or logs.<\/p>\n<p>The Marketing API version must be explicit and updated before retirement. The reference checked on 24 October 2026 identifies v26.0; an old hard-coded v20.0 is not a dependable basis. Loading an ad list requires processing all result pages. Increasing <code>limit<\/code> does not replace pagination. A failed page must not turn a partial result into an apparently complete successful run.<\/p>\n<ol><li>Immediately before a change, the approved ad ID, account mapping, fresh product data, manual holds and current status need another check. A proposal file may already be stale.<\/li><li>Only the explicitly selected status is written. API errors, invalid JSON, timeouts and rate limits count as failures. After an uncertain outcome, the current status is read before another attempt.<\/li><li>The successful change and the following status comparison are recorded. HTTP 200 alone does not prove delivery. <code>effective_status<\/code> can differ from the configured status because of parent pauses, review or other issues.<\/li><li>A durable journal records monitor-owned pauses, including time, previous status, rule and product-data evidence. Resumption needs an additional authorization step; concurrent manual changes must not be overwritten.<\/li><\/ol>\n<p>Automatic reactivation also requires controlled writers, explicit ownership and a concurrency strategy. A <code>pause_owner<\/code> field alone cannot establish those conditions. The example therefore returns only a resumption proposal even for a monitor-owned pause.<\/p>\n<h2>5. Monitoring the monitor<\/h2>\n<p>A schedule is not operational monitoring. Each run needs a start, end, pages read, data age, count of reviewed mappings, proposals and errors. Empty feeds and missing mappings need an explicit policy. An external check must detect missing successful runs; alerts only for status transitions miss a crashed monitor.<\/p>\n<p>A run lock permits only one monitor run at a time. The operational integration also needs a limited number of retries with increasing waits, secure rotation of log files to limit their size, and tested notifications. Those components and actual Meta access are outside the pure decision function.<\/p>\n<div class=\"lw-faq\"><h2>Questions and answers<\/h2><h3>Why is a manually paused offer not activated automatically?<\/h3><p>The reason can lie outside stock and price, such as an ongoing review or campaign decision. Available stock does not invalidate that reason. Authorization and the change journal must account for the current situation.<\/p><h3>Does a successful run prevent all unnecessary spend?<\/h3><p>No. Inventory changes, feed transfer, processing, API requests and actual delivery introduce delays. A monitor can reduce that gap, but cannot eliminate it or guarantee a particular return on ad spend (ROAS), the attributed revenue divided by advertising cost. Effectiveness and false positives need measurement for the actual account.<\/p><\/div><div class=\"lw-quellen\"><h2>Sources<\/h2><ul><li><a href=\"https:\/\/developers.facebook.com\/documentation\/ads-commerce\/marketing-api\/reference\/adgroup\">Meta: Ad reference<\/a><\/li><li><a href=\"https:\/\/developers.facebook.com\/documentation\/ads-commerce\/marketing-api\/overview\/versioning\">Meta: Marketing API versioning<\/a><\/li><li><a href=\"https:\/\/developers.facebook.com\/documentation\/ads-commerce\/marketing-api\/best-practices\/manage-your-ad-object-status\">Meta: Ad object status<\/a><\/li><li><a href=\"https:\/\/developers.facebook.com\/docs\/marketing-api\/reference\/product-item\/\">Meta: Product item<\/a><\/li><li><a href=\"https:\/\/developers.facebook.com\/docs\/graph-api\/results\/\">Meta: Pagination<\/a><\/li><li><a href=\"https:\/\/developers.facebook.com\/docs\/business-management-apis\/system-users\">Meta: System users<\/a><\/li><\/ul><\/div>","protected":false},"excerpt":{"rendered":"<p>A Python design for monitoring stock and prices before changing Meta Ads status. The article separates data validation, pause decisions, safe recovery and API errors; sample code requires account-specific integration.<\/p>\n","protected":false},"author":1,"featured_media":28035,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[127],"tags":[91106,91386,91339,91389,91392,91219],"class_list":["post-474","post","type-post","status-publish","format-standard","hentry","category-tutorials-en-digital-marketing","tag-automation","tag-marketing-cyfrowy-pl","tag-e-commerce","tag-python","tag-rest-api","tag-tutorial"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v28.1 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Automated Price and Inventory Monitoring for Meta Ads via Python &amp; Scripts | Lukas Wojcik<\/title>\n<meta name=\"description\" content=\"Monitor Meta ads with Python: evaluate inventory and prices, pause or resume ads and check scheduled cron runs.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.lukaswojcik.com\/blog\/en\/digital-marketing\/tutorials-en-digital-marketing\/automated-price-and-inventory-monitoring-for-meta-ads-via-python-scripts\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Automated Price and Inventory Monitoring for Meta Ads via Python &amp; Scripts | Lukas Wojcik\" \/>\n<meta property=\"og:description\" content=\"Monitor Meta ads with Python: evaluate inventory and prices, pause or resume ads and check scheduled cron runs.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.lukaswojcik.com\/blog\/en\/digital-marketing\/tutorials-en-digital-marketing\/automated-price-and-inventory-monitoring-for-meta-ads-via-python-scripts\/\" \/>\n<meta property=\"og:site_name\" content=\"Lukas Wojcik - Blog\" \/>\n<meta property=\"article:published_time\" content=\"2026-09-17T08:00:00+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2026-10-26T11:09:31+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/09\/hero-474-automated-price-inventory-monitoring-g.png\" \/>\n\t<meta property=\"og:image:width\" content=\"1200\" \/>\n\t<meta property=\"og:image:height\" content=\"630\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Lukas Wojcik\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Lukas Wojcik\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"7 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/digital-marketing\\\/tutorials-en-digital-marketing\\\/automated-price-and-inventory-monitoring-for-meta-ads-via-python-scripts\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/digital-marketing\\\/tutorials-en-digital-marketing\\\/automated-price-and-inventory-monitoring-for-meta-ads-via-python-scripts\\\/\"},\"author\":{\"name\":\"Lukas Wojcik\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#\\\/schema\\\/person\\\/895f7604f9b6b71aad9bba33af28d0f9\"},\"headline\":\"Automated Price and Inventory Monitoring for Meta Ads via Python &amp; Scripts\",\"datePublished\":\"2026-09-17T08:00:00+00:00\",\"dateModified\":\"2026-10-26T11:09:31+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/digital-marketing\\\/tutorials-en-digital-marketing\\\/automated-price-and-inventory-monitoring-for-meta-ads-via-python-scripts\\\/\"},\"wordCount\":925,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#\\\/schema\\\/person\\\/895f7604f9b6b71aad9bba33af28d0f9\"},\"image\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/digital-marketing\\\/tutorials-en-digital-marketing\\\/automated-price-and-inventory-monitoring-for-meta-ads-via-python-scripts\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/lw-flux3-20261031\\\/hero-474.png\",\"keywords\":[\"Automation\",\"Digital Marketing\",\"E-Commerce\",\"Python\",\"REST API\",\"Tutorial\"],\"articleSection\":[\"Tutorials\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/digital-marketing\\\/tutorials-en-digital-marketing\\\/automated-price-and-inventory-monitoring-for-meta-ads-via-python-scripts\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/digital-marketing\\\/tutorials-en-digital-marketing\\\/automated-price-and-inventory-monitoring-for-meta-ads-via-python-scripts\\\/\",\"url\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/digital-marketing\\\/tutorials-en-digital-marketing\\\/automated-price-and-inventory-monitoring-for-meta-ads-via-python-scripts\\\/\",\"name\":\"Automated Price and Inventory Monitoring for Meta Ads via Python &amp; Scripts | Lukas Wojcik\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/digital-marketing\\\/tutorials-en-digital-marketing\\\/automated-price-and-inventory-monitoring-for-meta-ads-via-python-scripts\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/digital-marketing\\\/tutorials-en-digital-marketing\\\/automated-price-and-inventory-monitoring-for-meta-ads-via-python-scripts\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/lw-flux3-20261031\\\/hero-474.png\",\"datePublished\":\"2026-09-17T08:00:00+00:00\",\"dateModified\":\"2026-10-26T11:09:31+00:00\",\"description\":\"Monitor Meta ads with Python: evaluate inventory and prices, pause or resume ads and check scheduled cron runs.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/digital-marketing\\\/tutorials-en-digital-marketing\\\/automated-price-and-inventory-monitoring-for-meta-ads-via-python-scripts\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/digital-marketing\\\/tutorials-en-digital-marketing\\\/automated-price-and-inventory-monitoring-for-meta-ads-via-python-scripts\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/digital-marketing\\\/tutorials-en-digital-marketing\\\/automated-price-and-inventory-monitoring-for-meta-ads-via-python-scripts\\\/#primaryimage\",\"url\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/lw-flux3-20261031\\\/hero-474.png\",\"contentUrl\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/lw-flux3-20261031\\\/hero-474.png\",\"width\":1200,\"height\":630,\"caption\":\"Automated Price and Inventory Monitoring for Meta Ads via Python & Scripts\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/digital-marketing\\\/tutorials-en-digital-marketing\\\/automated-price-and-inventory-monitoring-for-meta-ads-via-python-scripts\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Automated Price and Inventory Monitoring for Meta Ads via Python &amp; Scripts\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#website\",\"url\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/\",\"name\":\"Lukas Wojcik - Blog\",\"description\":\"\",\"publisher\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#\\\/schema\\\/person\\\/895f7604f9b6b71aad9bba33af28d0f9\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#\\\/schema\\\/person\\\/895f7604f9b6b71aad9bba33af28d0f9\",\"name\":\"Lukas Wojcik\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/lw-x2.jpg\",\"url\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/lw-x2.jpg\",\"contentUrl\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/lw-x2.jpg\",\"width\":424,\"height\":636,\"caption\":\"Lukas Wojcik\"},\"logo\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/lw-x2.jpg\"},\"sameAs\":[\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\"]}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Automated Price and Inventory Monitoring for Meta Ads via Python &amp; Scripts | Lukas Wojcik","description":"Monitor Meta ads with Python: evaluate inventory and prices, pause or resume ads and check scheduled cron runs.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.lukaswojcik.com\/blog\/en\/digital-marketing\/tutorials-en-digital-marketing\/automated-price-and-inventory-monitoring-for-meta-ads-via-python-scripts\/","og_locale":"en_US","og_type":"article","og_title":"Automated Price and Inventory Monitoring for Meta Ads via Python &amp; Scripts | Lukas Wojcik","og_description":"Monitor Meta ads with Python: evaluate inventory and prices, pause or resume ads and check scheduled cron runs.","og_url":"https:\/\/www.lukaswojcik.com\/blog\/en\/digital-marketing\/tutorials-en-digital-marketing\/automated-price-and-inventory-monitoring-for-meta-ads-via-python-scripts\/","og_site_name":"Lukas Wojcik - Blog","article_published_time":"2026-09-17T08:00:00+00:00","article_modified_time":"2026-10-26T11:09:31+00:00","og_image":[{"width":1200,"height":630,"url":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/09\/hero-474-automated-price-inventory-monitoring-g.png","type":"image\/png"}],"author":"Lukas Wojcik","twitter_card":"summary_large_image","twitter_misc":{"Written by":"Lukas Wojcik","Est. reading time":"7 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.lukaswojcik.com\/blog\/en\/digital-marketing\/tutorials-en-digital-marketing\/automated-price-and-inventory-monitoring-for-meta-ads-via-python-scripts\/#article","isPartOf":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/en\/digital-marketing\/tutorials-en-digital-marketing\/automated-price-and-inventory-monitoring-for-meta-ads-via-python-scripts\/"},"author":{"name":"Lukas Wojcik","@id":"https:\/\/www.lukaswojcik.com\/blog\/#\/schema\/person\/895f7604f9b6b71aad9bba33af28d0f9"},"headline":"Automated Price and Inventory Monitoring for Meta Ads via Python &amp; Scripts","datePublished":"2026-09-17T08:00:00+00:00","dateModified":"2026-10-26T11:09:31+00:00","mainEntityOfPage":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/en\/digital-marketing\/tutorials-en-digital-marketing\/automated-price-and-inventory-monitoring-for-meta-ads-via-python-scripts\/"},"wordCount":925,"commentCount":0,"publisher":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/#\/schema\/person\/895f7604f9b6b71aad9bba33af28d0f9"},"image":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/en\/digital-marketing\/tutorials-en-digital-marketing\/automated-price-and-inventory-monitoring-for-meta-ads-via-python-scripts\/#primaryimage"},"thumbnailUrl":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/lw-flux3-20261031\/hero-474.png","keywords":["Automation","Digital Marketing","E-Commerce","Python","REST API","Tutorial"],"articleSection":["Tutorials"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.lukaswojcik.com\/blog\/en\/digital-marketing\/tutorials-en-digital-marketing\/automated-price-and-inventory-monitoring-for-meta-ads-via-python-scripts\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.lukaswojcik.com\/blog\/en\/digital-marketing\/tutorials-en-digital-marketing\/automated-price-and-inventory-monitoring-for-meta-ads-via-python-scripts\/","url":"https:\/\/www.lukaswojcik.com\/blog\/en\/digital-marketing\/tutorials-en-digital-marketing\/automated-price-and-inventory-monitoring-for-meta-ads-via-python-scripts\/","name":"Automated Price and Inventory Monitoring for Meta Ads via Python &amp; Scripts | Lukas Wojcik","isPartOf":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/en\/digital-marketing\/tutorials-en-digital-marketing\/automated-price-and-inventory-monitoring-for-meta-ads-via-python-scripts\/#primaryimage"},"image":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/en\/digital-marketing\/tutorials-en-digital-marketing\/automated-price-and-inventory-monitoring-for-meta-ads-via-python-scripts\/#primaryimage"},"thumbnailUrl":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/lw-flux3-20261031\/hero-474.png","datePublished":"2026-09-17T08:00:00+00:00","dateModified":"2026-10-26T11:09:31+00:00","description":"Monitor Meta ads with Python: evaluate inventory and prices, pause or resume ads and check scheduled cron runs.","breadcrumb":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/en\/digital-marketing\/tutorials-en-digital-marketing\/automated-price-and-inventory-monitoring-for-meta-ads-via-python-scripts\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.lukaswojcik.com\/blog\/en\/digital-marketing\/tutorials-en-digital-marketing\/automated-price-and-inventory-monitoring-for-meta-ads-via-python-scripts\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.lukaswojcik.com\/blog\/en\/digital-marketing\/tutorials-en-digital-marketing\/automated-price-and-inventory-monitoring-for-meta-ads-via-python-scripts\/#primaryimage","url":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/lw-flux3-20261031\/hero-474.png","contentUrl":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/lw-flux3-20261031\/hero-474.png","width":1200,"height":630,"caption":"Automated Price and Inventory Monitoring for Meta Ads via Python & Scripts"},{"@type":"BreadcrumbList","@id":"https:\/\/www.lukaswojcik.com\/blog\/en\/digital-marketing\/tutorials-en-digital-marketing\/automated-price-and-inventory-monitoring-for-meta-ads-via-python-scripts\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.lukaswojcik.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Automated Price and Inventory Monitoring for Meta Ads via Python &amp; Scripts"}]},{"@type":"WebSite","@id":"https:\/\/www.lukaswojcik.com\/blog\/#website","url":"https:\/\/www.lukaswojcik.com\/blog\/","name":"Lukas Wojcik - Blog","description":"","publisher":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/#\/schema\/person\/895f7604f9b6b71aad9bba33af28d0f9"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.lukaswojcik.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":["Person","Organization"],"@id":"https:\/\/www.lukaswojcik.com\/blog\/#\/schema\/person\/895f7604f9b6b71aad9bba33af28d0f9","name":"Lukas Wojcik","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/07\/lw-x2.jpg","url":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/07\/lw-x2.jpg","contentUrl":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/07\/lw-x2.jpg","width":424,"height":636,"caption":"Lukas Wojcik"},"logo":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/07\/lw-x2.jpg"},"sameAs":["https:\/\/www.lukaswojcik.com\/blog"]}]}},"_links":{"self":[{"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/posts\/474","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/comments?post=474"}],"version-history":[{"count":8,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/posts\/474\/revisions"}],"predecessor-version":[{"id":26781,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/posts\/474\/revisions\/26781"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/media\/28035"}],"wp:attachment":[{"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/media?parent=474"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/categories?post=474"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/tags?post=474"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}