{"id":9361,"date":"2026-08-11T07:15:00","date_gmt":"2026-08-11T05:15:00","guid":{"rendered":"https:\/\/www.lukaswojcik.com\/blog\/?p=9361"},"modified":"2026-10-09T23:30:13","modified_gmt":"2026-10-09T21:30:13","slug":"amazon-ads-refresh-tokens-365-day-expiry-since-july-30-no-reminder","status":"publish","type":"post","link":"https:\/\/www.lukaswojcik.com\/blog\/en\/digital-marketing\/amazon-ads-refresh-tokens-365-day-expiry-since-july-30-no-reminder\/","title":{"rendered":"Amazon Ads Refresh Tokens: 365-Day Expiry Since July 30, No Reminder"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">Eleven days ago Amazon changed how long a refresh token for the Advertising API stays valid. If an integration authorised an advertiser on 1 August, that token stops working on 1 August 2027, no matter how often it is used in between. There is no email, no deprecation header, no warning in the console. The only party who will notice is whoever runs the integration, at the moment a nightly export returns nothing. This article corrects a widely repeated wrong date and then builds the one thing that actually protects against it: a token ledger with a cron job.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">1. What changed, and the date everyone gets wrong<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Amazon announced the change on 26 May 2026. It took effect on <strong>30 July 2026<\/strong>. Refresh tokens issued on or after that date expire 365 days after the date the advertiser gave consent, not 365 days after the token was minted, and not 365 days after last use.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">A wrong date is circulating persistently: 30 June. It shows up in forum posts, in vendor changelogs, and in search engine summaries that confidently answer &#8220;June 30&#8221; when asked when Amazon refresh tokens started expiring. That is a full month off. Anyone who planned a migration window around the end of June, or told a client their tokens were already covered, should re-check those assumptions. The correct cut-off is 30 July 2026, and the first mass expiries will therefore land from 30 July 2027 onward.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Announced:<\/strong> 26 May 2026.<\/li>\n<li><strong>Effective:<\/strong> 30 July 2026, not 30 June.<\/li>\n<li><strong>Lifetime:<\/strong> 365 days from the advertiser&#8217;s consent date.<\/li>\n<li><strong>Recovery after expiry:<\/strong> a fresh advertiser consent, through an interactive dialog. There is no silent path back.<\/li>\n<li><strong>Notification from Amazon:<\/strong> none.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">2. Why using the token does not help<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">This is the part that catches experienced teams. In almost every other OAuth deployment, a refresh token has either no expiry or a sliding one: each exchange for a new access token resets the idle timer, so an integration that runs every hour effectively never expires. Amazon&#8217;s clock does not slide. It is anchored to the consent date and runs to zero regardless of traffic. A pipeline that has refreshed successfully every 55 minutes for a year will fail on day 366 exactly like one that has been idle since day one.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The failure mode is therefore quiet and delayed. Monitoring sees a healthy integration right up to the boundary, then a refresh call that no longer returns an access token, and the fix is not a retry or a redeploy. Someone at the advertiser has to click through a consent dialog again. On a Saturday, for a client in another timezone, that is not a five-minute recovery.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Worth noting in the same breath, since it hits the same codebases: six legacy account management endpoints have been closed to new use since July 2026 and will return HTTP 404 from July 2027. Their replacements have been generally available since 18 June 2026. That migration belongs in the same quarter as the consent renewals.<\/p>\n\n\n\n<figure class=\"lw-diagram\">\n<img decoding=\"async\" src=\"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/diagrams\/hand-amztoken-en.png\" width=\"1120\" height=\"670\" loading=\"lazy\" alt=\"A 365-day bar starting at the consent date and ending at token death, with API calls bouncing off it because use does not extend the lifetime, and a ledger table below\">\n<figcaption>Every other refresh token is renewed by being used. This one is not: the clock starts at the advertiser consent date and runs out 365 days later regardless, which is why the expiry date belongs in a locally controlled table.<\/figcaption>\n<\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">3. A token ledger on the integrator&#8217;s side<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Amazon gives no warning when a token dies, so the only fact that matters, the consent date, has to be stored locally, with everything else derived from it. One table per environment is enough. The expiry column is generated, so it can never drift out of sync with the consent date.<\/p>\n\n\n<figure style=\"--cbb-digits:2\" class=\"cbb cbb--wrap cbb--numbers wp-block-code-beautifier-block-code\" data-lang=\"sql\"><figcaption class=\"cbb-head\"><span class=\"cbb-lang\">SQL<\/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-sql\" style=\"counter-reset:cbb-line 0;\"><span class=\"cbb-line\"><span class=\"cbb-keyword\">CREATE<\/span> <span class=\"cbb-keyword\">TABLE<\/span> <span class=\"cbb-function\">amazon_ads_token_ledger<\/span> (\n<\/span><span class=\"cbb-line\">    advertiser_id   <span class=\"cbb-type\">text<\/span> <span class=\"cbb-keyword\">PRIMARY<\/span> <span class=\"cbb-keyword\">KEY<\/span>,\n<\/span><span class=\"cbb-line\">    account_name    <span class=\"cbb-type\">text<\/span> <span class=\"cbb-keyword\">NOT<\/span> <span class=\"cbb-constant\">NULL<\/span>,\n<\/span><span class=\"cbb-line\">    region          <span class=\"cbb-type\">text<\/span> <span class=\"cbb-keyword\">NOT<\/span> <span class=\"cbb-constant\">NULL<\/span> <span class=\"cbb-keyword\">CHECK<\/span> (region <span class=\"cbb-keyword\">IN<\/span> (<span class=\"cbb-string\">'na'<\/span>, <span class=\"cbb-string\">'eu'<\/span>, <span class=\"cbb-string\">'fe'<\/span>)),\n<\/span><span class=\"cbb-line\">    consent_date    <span class=\"cbb-type\">date<\/span> <span class=\"cbb-keyword\">NOT<\/span> <span class=\"cbb-constant\">NULL<\/span>,\n<\/span><span class=\"cbb-line\">    token_issued_at timestamptz <span class=\"cbb-keyword\">NOT<\/span> <span class=\"cbb-constant\">NULL<\/span>,\n<\/span><span class=\"cbb-line\">    expires_on      <span class=\"cbb-type\">date<\/span> GENERATED ALWAYS <span class=\"cbb-keyword\">AS<\/span> (consent_date + <span class=\"cbb-number\">365<\/span>) STORED,\n<\/span><span class=\"cbb-line\">    last_refresh_ok timestamptz,\n<\/span><span class=\"cbb-line\">    owner_email     <span class=\"cbb-type\">text<\/span> <span class=\"cbb-keyword\">NOT<\/span> <span class=\"cbb-constant\">NULL<\/span>,\n<\/span><span class=\"cbb-line\">    status          <span class=\"cbb-type\">text<\/span> <span class=\"cbb-keyword\">NOT<\/span> <span class=\"cbb-constant\">NULL<\/span> <span class=\"cbb-keyword\">DEFAULT<\/span> <span class=\"cbb-string\">'active'<\/span>\n<\/span><span class=\"cbb-line\">);\n<\/span><span class=\"cbb-line\">\n<\/span><span class=\"cbb-line\"><span class=\"cbb-keyword\">CREATE<\/span> <span class=\"cbb-keyword\">INDEX<\/span> <span class=\"cbb-keyword\">ON<\/span> <span class=\"cbb-function\">amazon_ads_token_ledger<\/span> (expires_on) <span class=\"cbb-keyword\">WHERE<\/span> status = <span class=\"cbb-string\">'active'<\/span>;<\/span><\/code><\/pre><\/figure>\n\n\n<p class=\"wp-block-paragraph\">Backfill it once, by hand if necessary. For every advertiser onboarded on or after 30 July 2026, the consent date comes from the onboarding records. For older tokens, record the date anyway and set <code>status = 'legacy'<\/code>: the moment such an advertiser re-consents for any reason, the new rule applies to the replacement token, and the row should already be in place.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">4. The check script and the crontab line<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">The script prints nothing when everything is fine, which means cron stays silent. At 60 days it starts sending mail, and it exits non-zero once something has actually expired, so a wrapper or the monitoring stack can page on it.<\/p>\n\n\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-comment\">#!\/usr\/bin\/env python3<\/span>\n<\/span><span class=\"cbb-line\"><span class=\"cbb-string\">\"\"\"Warn about Amazon Ads consents approaching their 365-day limit.\"\"\"<\/span>\n<\/span><span class=\"cbb-line\"><span class=\"cbb-keyword\">import<\/span> sys\n<\/span><span class=\"cbb-line\"><span class=\"cbb-keyword\">from<\/span> datetime <span class=\"cbb-keyword\">import<\/span> date\n<\/span><span class=\"cbb-line\"><span class=\"cbb-keyword\">import<\/span> psycopg\n<\/span><span class=\"cbb-line\">\n<\/span><span class=\"cbb-line\">DSN = <span class=\"cbb-string\">\"postgresql:\/\/\/ops\"<\/span>\n<\/span><span class=\"cbb-line\">WARN_DAYS = <span class=\"cbb-number\">60<\/span>\n<\/span><span class=\"cbb-line\">\n<\/span><span class=\"cbb-line\">QUERY = <span class=\"cbb-string\">\"\"\"<\/span>\n<\/span><span class=\"cbb-line\"><span class=\"cbb-string\">SELECT advertiser_id, account_name, region, consent_date, expires_on,<\/span>\n<\/span><span class=\"cbb-line\"><span class=\"cbb-string\">       expires_on - CURRENT_DATE AS days_left, owner_email<\/span>\n<\/span><span class=\"cbb-line\"><span class=\"cbb-string\">FROM amazon_ads_token_ledger<\/span>\n<\/span><span class=\"cbb-line\"><span class=\"cbb-string\">WHERE status = 'active'<\/span>\n<\/span><span class=\"cbb-line\"><span class=\"cbb-string\">  AND expires_on - CURRENT_DATE &lt;= %s<\/span>\n<\/span><span class=\"cbb-line\"><span class=\"cbb-string\">ORDER BY days_left<\/span>\n<\/span><span class=\"cbb-line\"><span class=\"cbb-string\">\"\"\"<\/span>\n<\/span><span class=\"cbb-line\">\n<\/span><span class=\"cbb-line\"><span class=\"cbb-keyword\">def<\/span> <span class=\"cbb-function\">main<\/span>() -&gt; int:\n<\/span><span class=\"cbb-line\">    <span class=\"cbb-keyword\">with<\/span> psycopg.<span class=\"cbb-function\">connect<\/span>(DSN) <span class=\"cbb-keyword\">as<\/span> conn:\n<\/span><span class=\"cbb-line\">        rows = conn.<span class=\"cbb-function\">execute<\/span>(QUERY, (WARN_DAYS,)).<span class=\"cbb-function\">fetchall<\/span>()\n<\/span><span class=\"cbb-line\">    <span class=\"cbb-keyword\">if<\/span> <span class=\"cbb-keyword\">not<\/span> rows:\n<\/span><span class=\"cbb-line\">        <span class=\"cbb-keyword\">return<\/span> <span class=\"cbb-number\">0<\/span>\n<\/span><span class=\"cbb-line\">    <span class=\"cbb-function\">print<\/span>(<span class=\"cbb-string\">f\"Amazon Ads re-consent needed, checked {date.today()}:\"<\/span>)\n<\/span><span class=\"cbb-line\">    <span class=\"cbb-keyword\">for<\/span> aid, name, region, consent, expires, days, owner <span class=\"cbb-keyword\">in<\/span> rows:\n<\/span><span class=\"cbb-line\">        state = <span class=\"cbb-string\">\"EXPIRED\"<\/span> <span class=\"cbb-keyword\">if<\/span> days &lt; <span class=\"cbb-number\">0<\/span> <span class=\"cbb-keyword\">else<\/span> <span class=\"cbb-string\">f\"{days} days left\"<\/span>\n<\/span><span class=\"cbb-line\">        <span class=\"cbb-function\">print<\/span>(<span class=\"cbb-string\">f\"  {aid}  {name}  &#91;{region}&#93;  consent={consent}  \"<\/span>\n<\/span><span class=\"cbb-line\">              <span class=\"cbb-string\">f\"expires={expires}  {state}  owner={owner}\"<\/span>)\n<\/span><span class=\"cbb-line\">    <span class=\"cbb-keyword\">return<\/span> <span class=\"cbb-number\">1<\/span> <span class=\"cbb-keyword\">if<\/span> <span class=\"cbb-function\">any<\/span>(r&#91;<span class=\"cbb-number\">5<\/span>&#93; &lt; <span class=\"cbb-number\">0<\/span> <span class=\"cbb-keyword\">for<\/span> r <span class=\"cbb-keyword\">in<\/span> rows) <span class=\"cbb-keyword\">else<\/span> <span class=\"cbb-number\">0<\/span>\n<\/span><span class=\"cbb-line\">\n<\/span><span class=\"cbb-line\"><span class=\"cbb-keyword\">if<\/span> __name__ == <span class=\"cbb-string\">\"__main__\"<\/span>:\n<\/span><span class=\"cbb-line\">    sys.<span class=\"cbb-function\">exit<\/span>(<span class=\"cbb-function\">main<\/span>())<\/span><\/code><\/pre><\/figure>\n\n<figure style=\"--cbb-digits:1\" class=\"cbb cbb--wrap cbb--numbers wp-block-code-beautifier-block-code\" data-lang=\"bash\"><figcaption class=\"cbb-head\"><span class=\"cbb-lang\">Shell<\/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-bash\" style=\"counter-reset:cbb-line 0;\"><span class=\"cbb-line\"><span class=\"cbb-comment\"># crontab -e  (run as the service user that owns the ops database role)<\/span>\n<\/span><span class=\"cbb-line\">MAILTO=ads-ops@example.com\n<\/span><span class=\"cbb-line\"><span class=\"cbb-number\">17<\/span> <span class=\"cbb-number\">6<\/span> * * * \/usr\/bin\/<span class=\"cbb-function\">python3<\/span> \/opt\/ads\/token_ledger_check.py<\/span><\/code><\/pre><\/figure>\n\n\n<p class=\"wp-block-paragraph\">Sixty days is not arbitrary. Re-consent is a human process: it means reaching the right person at the advertiser, who then has to find someone with the authority to approve, and that chain routinely takes four to six weeks. Update <code>last_refresh_ok<\/code> from the refresh job as well, so an unrelated breakage shows up in the same table.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">5. Summary<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">The result is a ledger that records each advertiser&#8217;s consent date, derives the expiry as consent plus 365 days in the database rather than in application code, and a cron job that starts sending mail two months before anything breaks. Total footprint: one table, one index, forty lines of Python, one crontab entry. It replaces a class of outage that has no error budget, because the recovery path is a phone call rather than a deployment.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Two things to carry away. The cut-off is 30 July 2026, not 30 June, whatever a search summary claims, so tokens issued from that day onward begin expiring on 30 July 2027. And usage does not extend the lifetime, which is why an integration that looks perfectly healthy today can be eleven months from a hard stop. Amazon documents the behaviour under <a href=\"https:\/\/advertising.amazon.com\/API\/docs\/en-us\/guides\/account-management\/authorization\/refresh-tokens\">refresh tokens in the Amazon Advertising API guides<\/a>; that page is the source of truth, and the ledger is the alarm clock Amazon does not provide.<\/p>\n\n\n<div class=\"lw-faq\">\n<h2>Questions and answers<\/h2>\n\n<h3>The ledger&#8217;s expiry column is generated from the consent date. What does it show for legacy tokens that the 365-day rule does not cover?<\/h3>\n<p>A plausible date that means nothing: the column computes for every row, including the ones the rule never covered. That is worth knowing before someone reads the table without the status column next to it.<\/p>\n<p>The alert query filters for active status, so legacy rows do not trigger these alerts. The ledger can retain the known information while the query selects the rows that need action. If people also read the table directly, a view that leaves the expiry blank for legacy rows can prevent them from mistaking the calculated date for a real deadline.<\/p>\n<p>The reason those rows belong in the table at all is the interesting half. A legacy authorisation is outside the 365-day rule, but the moment it is renewed for any reason, such as a revoked consent, a scope change or an agency handover, the replacement token falls under it. Having the row already there means the consent date gets written on the day it happens, rather than being reconstructed a year later from an onboarding document nobody kept.<\/p>\n<\/div>\n\n<div class=\"lw-quellen\">\n<h2>Sources<\/h2>\n<ul>\n<li><a href=\"https:\/\/advertising.amazon.com\/API\/docs\/en-us\/guides\/account-management\/authorization\/overview\" target=\"_blank\" rel=\"noopener noreferrer\">Amazon Ads API authorization<\/a><\/li>\n<\/ul>\n<\/div>","protected":false},"excerpt":{"rendered":"<p>Amazon Ads refresh tokens issued since 30 July 2026 die 365 days after advertiser consent, using them changes nothing, and no reminder is sent.<\/p>\n","protected":false},"author":1,"featured_media":13794,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[6],"tags":[91106,91386,91294,91392],"class_list":["post-9361","post","type-post","status-publish","format-standard","hentry","category-digital-marketing","tag-automation","tag-marketing-cyfrowy-pl","tag-monitoring","tag-rest-api"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v28.1 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Amazon Ads Refresh Tokens: 365-Day Expiry Since July 30, No Reminder | Lukas Wojcik<\/title>\n<meta name=\"description\" content=\"Manage Amazon Ads refresh tokens: record authorization dates, check expiry and monitor integrations with a token ledger and cron.\" \/>\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\/amazon-ads-refresh-tokens-365-day-expiry-since-july-30-no-reminder\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Amazon Ads Refresh Tokens: 365-Day Expiry Since July 30, No Reminder | Lukas Wojcik\" \/>\n<meta property=\"og:description\" content=\"Manage Amazon Ads refresh tokens: record authorization dates, check expiry and monitor integrations with a token ledger and cron.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.lukaswojcik.com\/blog\/en\/digital-marketing\/amazon-ads-refresh-tokens-365-day-expiry-since-july-30-no-reminder\/\" \/>\n<meta property=\"og:site_name\" content=\"Lukas Wojcik - Blog\" \/>\n<meta property=\"article:published_time\" content=\"2026-08-11T05:15:00+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2026-10-09T21:30:13+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/09\/hero-9361-amazon-ads-refresh-token-expiry-ledg-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\\\/amazon-ads-refresh-tokens-365-day-expiry-since-july-30-no-reminder\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/digital-marketing\\\/amazon-ads-refresh-tokens-365-day-expiry-since-july-30-no-reminder\\\/\"},\"author\":{\"name\":\"Lukas Wojcik\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#\\\/schema\\\/person\\\/895f7604f9b6b71aad9bba33af28d0f9\"},\"headline\":\"Amazon Ads Refresh Tokens: 365-Day Expiry Since July 30, No Reminder\",\"datePublished\":\"2026-08-11T05:15:00+00:00\",\"dateModified\":\"2026-10-09T21:30:13+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/digital-marketing\\\/amazon-ads-refresh-tokens-365-day-expiry-since-july-30-no-reminder\\\/\"},\"wordCount\":1106,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#\\\/schema\\\/person\\\/895f7604f9b6b71aad9bba33af28d0f9\"},\"image\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/digital-marketing\\\/amazon-ads-refresh-tokens-365-day-expiry-since-july-30-no-reminder\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/09\\\/hero-9361-amazon-ads-refresh-token-expiry-ledg-g.png\",\"keywords\":[\"Automation\",\"Digital Marketing\",\"Monitoring\",\"REST API\"],\"articleSection\":[\"Digital Marketing\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/digital-marketing\\\/amazon-ads-refresh-tokens-365-day-expiry-since-july-30-no-reminder\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/digital-marketing\\\/amazon-ads-refresh-tokens-365-day-expiry-since-july-30-no-reminder\\\/\",\"url\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/digital-marketing\\\/amazon-ads-refresh-tokens-365-day-expiry-since-july-30-no-reminder\\\/\",\"name\":\"Amazon Ads Refresh Tokens: 365-Day Expiry Since July 30, No Reminder | Lukas Wojcik\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/digital-marketing\\\/amazon-ads-refresh-tokens-365-day-expiry-since-july-30-no-reminder\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/digital-marketing\\\/amazon-ads-refresh-tokens-365-day-expiry-since-july-30-no-reminder\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/09\\\/hero-9361-amazon-ads-refresh-token-expiry-ledg-g.png\",\"datePublished\":\"2026-08-11T05:15:00+00:00\",\"dateModified\":\"2026-10-09T21:30:13+00:00\",\"description\":\"Manage Amazon Ads refresh tokens: record authorization dates, check expiry and monitor integrations with a token ledger and cron.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/digital-marketing\\\/amazon-ads-refresh-tokens-365-day-expiry-since-july-30-no-reminder\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/digital-marketing\\\/amazon-ads-refresh-tokens-365-day-expiry-since-july-30-no-reminder\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/digital-marketing\\\/amazon-ads-refresh-tokens-365-day-expiry-since-july-30-no-reminder\\\/#primaryimage\",\"url\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/09\\\/hero-9361-amazon-ads-refresh-token-expiry-ledg-g.png\",\"contentUrl\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/09\\\/hero-9361-amazon-ads-refresh-token-expiry-ledg-g.png\",\"width\":1200,\"height\":630,\"caption\":\"Amazon Ads Refresh Tokens: 365-Day Expiry Since July 30, No Reminder\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/digital-marketing\\\/amazon-ads-refresh-tokens-365-day-expiry-since-july-30-no-reminder\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Amazon Ads Refresh Tokens: 365-Day Expiry Since July 30, No Reminder\"}]},{\"@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":"Amazon Ads Refresh Tokens: 365-Day Expiry Since July 30, No Reminder | Lukas Wojcik","description":"Manage Amazon Ads refresh tokens: record authorization dates, check expiry and monitor integrations with a token ledger and cron.","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\/amazon-ads-refresh-tokens-365-day-expiry-since-july-30-no-reminder\/","og_locale":"en_US","og_type":"article","og_title":"Amazon Ads Refresh Tokens: 365-Day Expiry Since July 30, No Reminder | Lukas Wojcik","og_description":"Manage Amazon Ads refresh tokens: record authorization dates, check expiry and monitor integrations with a token ledger and cron.","og_url":"https:\/\/www.lukaswojcik.com\/blog\/en\/digital-marketing\/amazon-ads-refresh-tokens-365-day-expiry-since-july-30-no-reminder\/","og_site_name":"Lukas Wojcik - Blog","article_published_time":"2026-08-11T05:15:00+00:00","article_modified_time":"2026-10-09T21:30:13+00:00","og_image":[{"width":1200,"height":630,"url":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/09\/hero-9361-amazon-ads-refresh-token-expiry-ledg-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\/amazon-ads-refresh-tokens-365-day-expiry-since-july-30-no-reminder\/#article","isPartOf":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/en\/digital-marketing\/amazon-ads-refresh-tokens-365-day-expiry-since-july-30-no-reminder\/"},"author":{"name":"Lukas Wojcik","@id":"https:\/\/www.lukaswojcik.com\/blog\/#\/schema\/person\/895f7604f9b6b71aad9bba33af28d0f9"},"headline":"Amazon Ads Refresh Tokens: 365-Day Expiry Since July 30, No Reminder","datePublished":"2026-08-11T05:15:00+00:00","dateModified":"2026-10-09T21:30:13+00:00","mainEntityOfPage":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/en\/digital-marketing\/amazon-ads-refresh-tokens-365-day-expiry-since-july-30-no-reminder\/"},"wordCount":1106,"commentCount":0,"publisher":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/#\/schema\/person\/895f7604f9b6b71aad9bba33af28d0f9"},"image":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/en\/digital-marketing\/amazon-ads-refresh-tokens-365-day-expiry-since-july-30-no-reminder\/#primaryimage"},"thumbnailUrl":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/09\/hero-9361-amazon-ads-refresh-token-expiry-ledg-g.png","keywords":["Automation","Digital Marketing","Monitoring","REST API"],"articleSection":["Digital Marketing"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.lukaswojcik.com\/blog\/en\/digital-marketing\/amazon-ads-refresh-tokens-365-day-expiry-since-july-30-no-reminder\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.lukaswojcik.com\/blog\/en\/digital-marketing\/amazon-ads-refresh-tokens-365-day-expiry-since-july-30-no-reminder\/","url":"https:\/\/www.lukaswojcik.com\/blog\/en\/digital-marketing\/amazon-ads-refresh-tokens-365-day-expiry-since-july-30-no-reminder\/","name":"Amazon Ads Refresh Tokens: 365-Day Expiry Since July 30, No Reminder | Lukas Wojcik","isPartOf":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/en\/digital-marketing\/amazon-ads-refresh-tokens-365-day-expiry-since-july-30-no-reminder\/#primaryimage"},"image":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/en\/digital-marketing\/amazon-ads-refresh-tokens-365-day-expiry-since-july-30-no-reminder\/#primaryimage"},"thumbnailUrl":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/09\/hero-9361-amazon-ads-refresh-token-expiry-ledg-g.png","datePublished":"2026-08-11T05:15:00+00:00","dateModified":"2026-10-09T21:30:13+00:00","description":"Manage Amazon Ads refresh tokens: record authorization dates, check expiry and monitor integrations with a token ledger and cron.","breadcrumb":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/en\/digital-marketing\/amazon-ads-refresh-tokens-365-day-expiry-since-july-30-no-reminder\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.lukaswojcik.com\/blog\/en\/digital-marketing\/amazon-ads-refresh-tokens-365-day-expiry-since-july-30-no-reminder\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.lukaswojcik.com\/blog\/en\/digital-marketing\/amazon-ads-refresh-tokens-365-day-expiry-since-july-30-no-reminder\/#primaryimage","url":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/09\/hero-9361-amazon-ads-refresh-token-expiry-ledg-g.png","contentUrl":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/09\/hero-9361-amazon-ads-refresh-token-expiry-ledg-g.png","width":1200,"height":630,"caption":"Amazon Ads Refresh Tokens: 365-Day Expiry Since July 30, No Reminder"},{"@type":"BreadcrumbList","@id":"https:\/\/www.lukaswojcik.com\/blog\/en\/digital-marketing\/amazon-ads-refresh-tokens-365-day-expiry-since-july-30-no-reminder\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.lukaswojcik.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Amazon Ads Refresh Tokens: 365-Day Expiry Since July 30, No Reminder"}]},{"@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\/9361","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=9361"}],"version-history":[{"count":5,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/posts\/9361\/revisions"}],"predecessor-version":[{"id":22381,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/posts\/9361\/revisions\/22381"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/media\/13794"}],"wp:attachment":[{"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/media?parent=9361"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/categories?post=9361"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/tags?post=9361"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}