{"id":5475,"date":"2026-06-26T08:00:07","date_gmt":"2026-06-26T08:00:07","guid":{"rendered":"https:\/\/ranaghazzi.com\/?p=5475"},"modified":"2026-06-26T08:00:09","modified_gmt":"2026-06-26T08:00:09","slug":"handling-duplicates-in-spark-streaming-pipelines-3-practical-approaches","status":"publish","type":"post","link":"https:\/\/ranaghazzi.com\/?p=5475","title":{"rendered":"Handling Duplicates in Spark Streaming Pipelines: 3 Practical Approaches"},"content":{"rendered":"<p><style>\n    .light-font-container, .light-font-container p, .light-font-container h2, .light-font-container li {<br \/>\n        font-weight: #FFFFFF !important;<br \/>\n    }<br \/>\n<\/style>\n<\/p>\n<div class=\"light-font-container\" style=\"background-color: #FFFFFF; padding: 40px; border-radius: 15px;\">\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Handling Duplicates in Spark Streaming Pipelines: <\/h2>\n\n\n\n<h2 class=\"wp-block-heading\">3 Practical Approaches<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Duplicate records are one of the most common and frustrating problems in data engineering. Whether you&#8217;re pulling from an API, a message queue, or a CDC feed, duplicates will eventually appear. Here&#8217;s a breakdown of three practical approaches to deal with them \u2014 and when to use each.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">The Problem<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">In streaming or periodic ingestion pipelines, duplicates can sneak in through:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Retried API calls<\/strong> after a timeout<\/li>\n\n\n\n<li><strong>At-least-once delivery<\/strong> guarantees in message brokers like Kafka<\/li>\n\n\n\n<li><strong>Overlapping watermark windows<\/strong> during micro-batch processing<\/li>\n\n\n\n<li><strong>Pipeline restarts<\/strong> replaying already-processed records<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Left unchecked, duplicates silently corrupt aggregations, inflate metrics, and break downstream consumers.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Option 1: dropDuplicates() Before Writing<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">The simplest fix \u2014 deduplicate the DataFrame before it hits the sink.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>def process_batch(df, epoch_id):\n    df_deduped = df.dropDuplicates(&#91;\"id\", \"event_timestamp\"])\n    df_deduped.write \\\n        .format(\"delta\") \\\n        .mode(\"append\") \\\n        .save(\"\/mnt\/delta\/events\")\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>How it works:<\/strong> Spark compares rows within a single micro-batch and drops exact duplicates based on the columns you specify.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Pros:<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Simple, one-liner fix<\/li>\n\n\n\n<li>No external state needed<\/li>\n\n\n\n<li>Works well when duplicates appear within the same batch<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Cons:<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Does not catch cross-batch duplicates \u2014 if the same record arrives in two different micro-batches, it still gets written twice<\/li>\n\n\n\n<li>On large streams, deduplication across a wide key space can be memory-intensive<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Use when:<\/strong> Duplicates are caused by source-side fan-out within a single batch and cross-batch duplication is not a concern.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Option 2: MERGE with foreachBatch (Recommended for Streaming)<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Instead of appending blindly, use a MERGE (upsert) statement inside foreachBatch. This compares incoming records against what already exists in the Delta table and only inserts records that aren&#8217;t already there.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>from delta.tables import DeltaTable\n\ndef upsert_to_delta(micro_batch_df, epoch_id):\n    target = DeltaTable.forPath(spark, \"\/mnt\/delta\/events\")\n    \n    target.alias(\"target\").merge(\n        micro_batch_df.alias(\"source\"),\n        \"target.id = source.id AND target.event_timestamp = source.event_timestamp\"\n    ) \\\n    .whenNotMatchedInsertAll() \\\n    .execute()\n\nstream_query = (\n    df_stream\n    .writeStream\n    .foreachBatch(upsert_to_delta)\n    .outputMode(\"update\")\n    .start()\n)\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>How it works:<\/strong> For each micro-batch, Delta Lake checks if the incoming row already exists in the target table. If it does, it skips it (or updates it, your choice). If it doesn&#8217;t, it inserts it.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Pros:<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Catches duplicates <strong>across batches<\/strong> \u2014 the most robust streaming option<\/li>\n\n\n\n<li>Idempotent: re-running the same batch won&#8217;t create duplicates<\/li>\n\n\n\n<li>Leverages Delta Lake&#8217;s ACID guarantees<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Cons:<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Slightly more complex to set up<\/li>\n\n\n\n<li>MERGE on large tables can be expensive without proper partitioning and Z-ordering on the merge keys<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Use when:<\/strong> You&#8217;re running a true streaming pipeline with continuous micro-batches and need cross-batch duplicate protection.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Option 3: Batch MERGE (Most Appropriate for Periodic API Pulls)<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">If your data source is a periodic API call \u2014 say, every 15 minutes or once an hour \u2014 you&#8217;re not really import logging<br>from delta.tables import DeltaTable<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">def load_to_delta(df_new, table_path, merge_keys):<br># Merge new data into delta table using merge keys<br>target = DeltaTable.forPath(spark, table_path)<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code><em>import logging\nfrom delta.tables import DeltaTable<\/em>\n\n<strong>def  load_to_delta(df_new, table_path, merge_keys):<\/strong>\n    # Merge new data into delta table using merge keys\n    \ntarget = DeltaTable.forPath(spark, table_path)\n    \n    merge_condition = \" AND \".join(&#91;f\"target.{k} = source.{k}\" for k in merge_keys])\n    \n    (\n        target.alias(\"target\")\n        .merge(df_new.alias(\"source\"), merge_condition)\n        .whenMatchedUpdateAll()\n        .whenNotMatchedInsertAll()\n        .execute()\n    )\n    \n    print(f\"&#91;load] merge complete on keys: {merge_keys}\")\n    logging.info(f\"MERGE complete \u2014 keys: {merge_keys}\")\n\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Usage:<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>df_new = extract_from_api()          # pull latest batch\ndf_new = transform(df_new)           # clean, cast, normalize\nload_to_delta(df_new, \"\/mnt\/delta\/events\", merge_keys=&#91;\"id\"])\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Pros:<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>No stream state, no watermarks<\/li>\n\n\n\n<li>Fully idempotent: running the same pull twice produces the same result<\/li>\n\n\n\n<li>Easier to test, debug, and backfill<\/li>\n\n\n\n<li>Your watermark filter already eliminates most duplicates; MERGE is just the safety net<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Cons:<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Not suitable for low-latency, sub-second ingestion<\/li>\n\n\n\n<li>Requires Delta Lake (or similar ACID-capable format)<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Use when:<\/strong> Your pipeline is driven by a scheduler (Airflow, cron, Databricks Jobs) and pulls from an API, flat file, or REST endpoint on a schedule.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Comparison at a Glance<\/h2>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Approach<\/th><th>Cross-Batch Safe<\/th><th>Complexity<\/th><th>Best For<\/th><\/tr><\/thead><tbody><tr><td>dropDuplicates()<\/td><td>No<\/td><td>Low<\/td><td>Within-batch deduplication<\/td><\/tr><tr><td>foreachBatch MERGE<\/td><td>Yes<\/td><td>Medium<\/td><td>True streaming pipelines<\/td><\/tr><tr><td>Batch MERGE<\/td><td>Yes<\/td><td>Low<\/td><td>Periodic \/ scheduled API pulls<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Key Takeaway<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Match your deduplication strategy to your ingestion pattern:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Continuous stream \u2192 foreachBatch with MERGE<\/li>\n\n\n\n<li>Scheduled batch pull \u2192 batch MERGE (simplest, most reliable)<\/li>\n\n\n\n<li>Quick in-batch cleanup \u2192 dropDuplicates() as a first pass<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">The watermark filter handles the bulk of stale data. MERGE is the idempotency guarantee that makes your pipeline safe to retry, backfill, or re-run without consequence \u2014 and in production pipelines, that safety net is worth having.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n","protected":false},"excerpt":{"rendered":"<p>Handling Duplicates in Spark Streaming Pipelines: 3 Practical Approaches Duplicate records are one of the most common and frustrating problems in data engineering. Whether you&#8217;re pulling from an API, a message queue, or a CDC feed, duplicates will eventually appear. Here&#8217;s a breakdown of three practical approaches to deal with them \u2014 and when to [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":["post-5475","post","type-post","status-publish","format-standard","hentry","category-uncategorized"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v28.0 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Handling Duplicates in Spark Streaming Pipelines: 3 Practical Approaches - Rana Nasri Ghazzi<\/title>\n<meta name=\"description\" content=\"Explore Rana Ghazzi&#039;s data analytics portfolio \u2014 dashboards, visualizations, and insights built with Tableau, Power BI &amp; Python.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/ranaghazzi.com\/?p=5475\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Handling Duplicates in Spark Streaming Pipelines: 3 Practical Approaches - Rana Nasri Ghazzi\" \/>\n<meta property=\"og:description\" content=\"Explore Rana Ghazzi&#039;s data analytics portfolio \u2014 dashboards, visualizations, and insights built with Tableau, Power BI &amp; Python.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/ranaghazzi.com\/?p=5475\" \/>\n<meta property=\"og:site_name\" content=\"Rana Nasri Ghazzi\" \/>\n<meta property=\"article:published_time\" content=\"2026-06-26T08:00:07+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2026-06-26T08:00:09+00:00\" \/>\n<meta name=\"author\" content=\"Rana Ghazzi\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Rana Ghazzi\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"4 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/ranaghazzi.com\\\/?p=5475#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/ranaghazzi.com\\\/?p=5475\"},\"author\":{\"name\":\"Rana Ghazzi\",\"@id\":\"https:\\\/\\\/ranaghazzi.com\\\/#\\\/schema\\\/person\\\/d8ee34f53cb0df9faaf816fb5363a4cc\"},\"headline\":\"Handling Duplicates in Spark Streaming Pipelines: 3 Practical Approaches\",\"datePublished\":\"2026-06-26T08:00:07+00:00\",\"dateModified\":\"2026-06-26T08:00:09+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/ranaghazzi.com\\\/?p=5475\"},\"wordCount\":592,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/ranaghazzi.com\\\/#\\\/schema\\\/person\\\/d8ee34f53cb0df9faaf816fb5363a4cc\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/ranaghazzi.com\\\/?p=5475#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/ranaghazzi.com\\\/?p=5475\",\"url\":\"https:\\\/\\\/ranaghazzi.com\\\/?p=5475\",\"name\":\"Handling Duplicates in Spark Streaming Pipelines: 3 Practical Approaches - Rana Nasri Ghazzi\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/ranaghazzi.com\\\/#website\"},\"datePublished\":\"2026-06-26T08:00:07+00:00\",\"dateModified\":\"2026-06-26T08:00:09+00:00\",\"description\":\"Explore Rana Ghazzi's data analytics portfolio \u2014 dashboards, visualizations, and insights built with Tableau, Power BI & Python.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/ranaghazzi.com\\\/?p=5475#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/ranaghazzi.com\\\/?p=5475\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/ranaghazzi.com\\\/?p=5475#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/ranaghazzi.com\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Handling Duplicates in Spark Streaming Pipelines: 3 Practical Approaches\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/ranaghazzi.com\\\/#website\",\"url\":\"https:\\\/\\\/ranaghazzi.com\\\/\",\"name\":\"Rana Nasri Ghazzi\",\"description\":\"Turning Data into Decisions\",\"publisher\":{\"@id\":\"https:\\\/\\\/ranaghazzi.com\\\/#\\\/schema\\\/person\\\/d8ee34f53cb0df9faaf816fb5363a4cc\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/ranaghazzi.com\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\\\/\\\/ranaghazzi.com\\\/#\\\/schema\\\/person\\\/d8ee34f53cb0df9faaf816fb5363a4cc\",\"name\":\"Rana Ghazzi\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/ranaghazzi.com\\\/wp-content\\\/uploads\\\/2025\\\/11\\\/logo.png\",\"url\":\"https:\\\/\\\/ranaghazzi.com\\\/wp-content\\\/uploads\\\/2025\\\/11\\\/logo.png\",\"contentUrl\":\"https:\\\/\\\/ranaghazzi.com\\\/wp-content\\\/uploads\\\/2025\\\/11\\\/logo.png\",\"width\":1024,\"height\":1024,\"caption\":\"Rana Ghazzi\"},\"logo\":{\"@id\":\"https:\\\/\\\/ranaghazzi.com\\\/wp-content\\\/uploads\\\/2025\\\/11\\\/logo.png\"},\"url\":\"https:\\\/\\\/ranaghazzi.com\\\/?author=2\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Handling Duplicates in Spark Streaming Pipelines: 3 Practical Approaches - Rana Nasri Ghazzi","description":"Explore Rana Ghazzi's data analytics portfolio \u2014 dashboards, visualizations, and insights built with Tableau, Power BI & Python.","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:\/\/ranaghazzi.com\/?p=5475","og_locale":"en_US","og_type":"article","og_title":"Handling Duplicates in Spark Streaming Pipelines: 3 Practical Approaches - Rana Nasri Ghazzi","og_description":"Explore Rana Ghazzi's data analytics portfolio \u2014 dashboards, visualizations, and insights built with Tableau, Power BI & Python.","og_url":"https:\/\/ranaghazzi.com\/?p=5475","og_site_name":"Rana Nasri Ghazzi","article_published_time":"2026-06-26T08:00:07+00:00","article_modified_time":"2026-06-26T08:00:09+00:00","author":"Rana Ghazzi","twitter_card":"summary_large_image","twitter_misc":{"Written by":"Rana Ghazzi","Est. reading time":"4 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/ranaghazzi.com\/?p=5475#article","isPartOf":{"@id":"https:\/\/ranaghazzi.com\/?p=5475"},"author":{"name":"Rana Ghazzi","@id":"https:\/\/ranaghazzi.com\/#\/schema\/person\/d8ee34f53cb0df9faaf816fb5363a4cc"},"headline":"Handling Duplicates in Spark Streaming Pipelines: 3 Practical Approaches","datePublished":"2026-06-26T08:00:07+00:00","dateModified":"2026-06-26T08:00:09+00:00","mainEntityOfPage":{"@id":"https:\/\/ranaghazzi.com\/?p=5475"},"wordCount":592,"commentCount":0,"publisher":{"@id":"https:\/\/ranaghazzi.com\/#\/schema\/person\/d8ee34f53cb0df9faaf816fb5363a4cc"},"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/ranaghazzi.com\/?p=5475#respond"]}]},{"@type":"WebPage","@id":"https:\/\/ranaghazzi.com\/?p=5475","url":"https:\/\/ranaghazzi.com\/?p=5475","name":"Handling Duplicates in Spark Streaming Pipelines: 3 Practical Approaches - Rana Nasri Ghazzi","isPartOf":{"@id":"https:\/\/ranaghazzi.com\/#website"},"datePublished":"2026-06-26T08:00:07+00:00","dateModified":"2026-06-26T08:00:09+00:00","description":"Explore Rana Ghazzi's data analytics portfolio \u2014 dashboards, visualizations, and insights built with Tableau, Power BI & Python.","breadcrumb":{"@id":"https:\/\/ranaghazzi.com\/?p=5475#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/ranaghazzi.com\/?p=5475"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/ranaghazzi.com\/?p=5475#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/ranaghazzi.com\/"},{"@type":"ListItem","position":2,"name":"Handling Duplicates in Spark Streaming Pipelines: 3 Practical Approaches"}]},{"@type":"WebSite","@id":"https:\/\/ranaghazzi.com\/#website","url":"https:\/\/ranaghazzi.com\/","name":"Rana Nasri Ghazzi","description":"Turning Data into Decisions","publisher":{"@id":"https:\/\/ranaghazzi.com\/#\/schema\/person\/d8ee34f53cb0df9faaf816fb5363a4cc"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/ranaghazzi.com\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":["Person","Organization"],"@id":"https:\/\/ranaghazzi.com\/#\/schema\/person\/d8ee34f53cb0df9faaf816fb5363a4cc","name":"Rana Ghazzi","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/ranaghazzi.com\/wp-content\/uploads\/2025\/11\/logo.png","url":"https:\/\/ranaghazzi.com\/wp-content\/uploads\/2025\/11\/logo.png","contentUrl":"https:\/\/ranaghazzi.com\/wp-content\/uploads\/2025\/11\/logo.png","width":1024,"height":1024,"caption":"Rana Ghazzi"},"logo":{"@id":"https:\/\/ranaghazzi.com\/wp-content\/uploads\/2025\/11\/logo.png"},"url":"https:\/\/ranaghazzi.com\/?author=2"}]}},"_links":{"self":[{"href":"https:\/\/ranaghazzi.com\/index.php?rest_route=\/wp\/v2\/posts\/5475","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/ranaghazzi.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/ranaghazzi.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/ranaghazzi.com\/index.php?rest_route=\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/ranaghazzi.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=5475"}],"version-history":[{"count":14,"href":"https:\/\/ranaghazzi.com\/index.php?rest_route=\/wp\/v2\/posts\/5475\/revisions"}],"predecessor-version":[{"id":5564,"href":"https:\/\/ranaghazzi.com\/index.php?rest_route=\/wp\/v2\/posts\/5475\/revisions\/5564"}],"wp:attachment":[{"href":"https:\/\/ranaghazzi.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=5475"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/ranaghazzi.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=5475"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/ranaghazzi.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=5475"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}