{"id":279153,"date":"2026-06-04T16:24:07","date_gmt":"2026-06-04T14:24:07","guid":{"rendered":"https:\/\/www.unipile.com\/?p=279153"},"modified":"2026-06-08T16:59:04","modified_gmt":"2026-06-08T14:59:04","slug":"limites-de-la-api-de-gmail","status":"publish","type":"post","link":"https:\/\/www.unipile.com\/es\/gmail-api-limits\/","title":{"rendered":"L\u00edmites de la API de Gmail en 2026: Cuotas, L\u00edmites de Tasa y C\u00f3mo Gestionarlos"},"content":{"rendered":"\n[et_pb_section fb_built=&#8221;1&#8243; _builder_version=&#8221;4.16&#8243; background_color=&#8221;transparent&#8221; custom_padding=&#8221;0px|0px|0px|0px&#8221; custom_padding_tablet=&#8221;0px|0px|0px|0px&#8221; custom_padding_phone=&#8221;0px|0px|0px|0px&#8221; global_colors_info=&#8221;{}&#8221; theme_builder_area=&#8221;post_content&#8221; da_is_popup=&#8221;off&#8221; da_exit_intent=&#8221;off&#8221; da_has_close=&#8221;on&#8221; da_alt_close=&#8221;off&#8221; da_dark_close=&#8221;off&#8221; da_not_modal=&#8221;on&#8221; da_is_singular=&#8221;off&#8221; da_with_loader=&#8221;off&#8221; da_has_shadow=&#8221;on&#8221; da_disable_devices=&#8221;off|off|off&#8221;][et_pb_row _builder_version=&#8221;4.16&#8243; background_size=&#8221;initial&#8221; background_position=&#8221;top_left&#8221; background_repeat=&#8221;repeat&#8221; custom_padding=&#8221;0px|0px|0px|0px&#8221; global_colors_info=&#8221;{}&#8221; theme_builder_area=&#8221;post_content&#8221;][et_pb_column type=&#8221;4_4&#8243; _builder_version=&#8221;4.16&#8243; custom_padding=&#8221;|||&#8221; global_colors_info=&#8221;{}&#8221; custom_padding__hover=&#8221;|||&#8221; theme_builder_area=&#8221;post_content&#8221;][et_pb_code _builder_version=&#8221;4.27.4&#8243; hover_enabled=&#8221;0&#8243; global_colors_info=&#8221;{}&#8221; theme_builder_area=&#8221;post_content&#8221; sticky_enabled=&#8221;0&#8243;]<link href=\"https:\/\/fonts.googleapis.com\/css2?family=Inter:wght@400;500;600;700&#038;family=Poppins:wght@700;800&#038;display=swap\" rel=\"stylesheet\">\n<style>\n#unipile-toc,\n#unipile-toc *,\n#unipile-toc *::before,\n#unipile-toc *::after {\n  margin: 0 !important;\n  padding: 0 !important;\n  box-sizing: border-box !important;\n  border: none !important;\n  outline: none !important;\n  font-family: 'Inter', -apple-system, BlinkMacSystemFont, sans-serif !important;\n  line-height: normal !important;\n  letter-spacing: normal !important;\n  text-transform: none !important;\n  text-decoration: none !important;\n  list-style: none !important;\n  background: transparent !important;\n  float: none !important;\n}\n#unipile-toc {\n  all: initial !important;\n  display: block !important;\n  max-width: 1100px !important;\n  margin: 0 auto !important;\n  padding: 0 !important;\n  font-family: 'Inter', -apple-system, BlinkMacSystemFont, sans-serif !important;\n}\n#unipile-toc .utc-card {\n  background: #ffffff !important;\n  border-radius: 16px !important;\n  border: 1px solid #e5e7eb !important;\n  padding: 32px !important;\n  box-shadow: 0 2px 12px rgba(15, 39, 54, 0.04) !important;\n}\n#unipile-toc .utc-header {\n  display: flex !important;\n  align-items: center !important;\n  justify-content: space-between !important;\n  gap: 12px !important;\n  margin-bottom: 24px !important;\n  padding-bottom: 20px !important;\n  border-bottom: 1px solid #e5e7eb !important;\n}\n#unipile-toc .utc-header-left {\n  display: flex !important;\n  align-items: center !important;\n  gap: 12px !important;\n}\n#unipile-toc .utc-icon-box {\n  width: 36px !important;\n  height: 36px !important;\n  background: rgba(59, 185, 139, 0.12) !important;\n  border-radius: 8px !important;\n  display: flex !important;\n  align-items: center !important;\n  justify-content: center !important;\n  flex-shrink: 0 !important;\n}\n#unipile-toc .utc-icon-box svg {\n  width: 18px !important;\n  height: 18px !important;\n  stroke: #3BB98B !important;\n  fill: none !important;\n  stroke-width: 2.2 !important;\n  stroke-linecap: round !important;\n  stroke-linejoin: round !important;\n}\n#unipile-toc .utc-title {\n  font-family: 'Poppins', sans-serif !important;\n  font-size: 15px !important;\n  font-weight: 700 !important;\n  color: #0f2736 !important;\n  text-transform: uppercase !important;\n  letter-spacing: 0.5px !important;\n}\n#unipile-toc .utc-toggle {\n  display: none !important;\n  align-items: center !important;\n  gap: 6px !important;\n  background: transparent !important;\n  cursor: pointer !important;\n  font-size: 13px !important;\n  font-weight: 600 !important;\n  color: #3BB98B !important;\n  padding: 6px 10px !important;\n  border-radius: 6px !important;\n  transition: background 0.2s ease !important;\n}\n#unipile-toc .utc-toggle svg {\n  width: 14px !important;\n  height: 14px !important;\n  stroke: #3BB98B !important;\n  fill: none !important;\n  stroke-width: 2.5 !important;\n  stroke-linecap: round !important;\n  stroke-linejoin: round !important;\n  transition: transform 0.3s ease !important;\n}\n#unipile-toc.utc-collapsed .utc-toggle svg {\n  transform: rotate(-90deg) !important;\n}\n#unipile-toc .utc-grid {\n  display: grid !important;\n  grid-template-columns: repeat(4, 1fr) !important;\n  gap: 0 !important;\n}\n#unipile-toc .utc-col {\n  padding: 0 24px !important;\n  border-left: 1px solid #e5e7eb !important;\n}\n#unipile-toc .utc-col:first-child {\n  padding-left: 0 !important;\n  border-left: none !important;\n}\n#unipile-toc .utc-col:last-child {\n  padding-right: 0 !important;\n}\n#unipile-toc .utc-col-label {\n  font-size: 11px !important;\n  font-weight: 700 !important;\n  color: #94a3b8 !important;\n  text-transform: uppercase !important;\n  letter-spacing: 0.8px !important;\n  margin-bottom: 14px !important;\n  display: block !important;\n}\n#unipile-toc .utc-link-list {\n  display: flex !important;\n  flex-direction: column !important;\n  gap: 10px !important;\n}\n#unipile-toc .utc-link {\n  display: flex !important;\n  align-items: flex-start !important;\n  gap: 10px !important;\n  cursor: pointer !important;\n  transition: all 0.2s ease !important;\n  text-decoration: none !important;\n  padding: 4px 0 !important;\n}\n#unipile-toc .utc-num {\n  width: 18px !important;\n  height: 18px !important;\n  flex-shrink: 0 !important;\n  background: #f4f5f7 !important;\n  border-radius: 4px !important;\n  display: flex !important;\n  align-items: center !important;\n  justify-content: center !important;\n  font-size: 10px !important;\n  font-weight: 700 !important;\n  color: #94a3b8 !important;\n  transition: all 0.2s ease !important;\n  margin-top: 1px !important;\n}\n#unipile-toc .utc-num.utc-num-faq {\n  font-size: 8px !important;\n  letter-spacing: 0.2px !important;\n}\n#unipile-toc .utc-link-text {\n  font-size: 13px !important;\n  font-weight: 500 !important;\n  color: #383838 !important;\n  line-height: 1.45 !important;\n  transition: color 0.2s ease !important;\n  flex: 1 !important;\n}\n#unipile-toc .utc-link:hover .utc-num {\n  background: rgba(59, 185, 139, 0.15) !important;\n  color: #3BB98B !important;\n}\n#unipile-toc .utc-link:hover .utc-link-text {\n  color: #0f2736 !important;\n}\n#unipile-toc .utc-link.utc-active .utc-num {\n  background: #3BB98B !important;\n  color: #ffffff !important;\n}\n#unipile-toc .utc-link.utc-active .utc-link-text {\n  color: #0f2736 !important;\n  font-weight: 600 !important;\n}\n#unipile-toc .utc-link.utc-read .utc-num {\n  background: rgba(59, 185, 139, 0.15) !important;\n  color: #3BB98B !important;\n}\n#unipile-toc .utc-tag-best {\n  display: inline-block !important;\n  font-size: 9px !important;\n  font-weight: 700 !important;\n  color: #ffffff !important;\n  background: #3BB98B !important;\n  padding: 2px 6px !important;\n  border-radius: 4px !important;\n  text-transform: uppercase !important;\n  letter-spacing: 0.5px !important;\n  margin-left: 6px !important;\n  vertical-align: middle !important;\n}\n\n@media (max-width: 1000px) {\n  #unipile-toc .utc-grid {\n    grid-template-columns: repeat(2, 1fr) !important;\n    gap: 24px 0 !important;\n  }\n  #unipile-toc .utc-col {\n    padding: 0 20px !important;\n  }\n  #unipile-toc .utc-col:nth-child(2n+1) {\n    padding-left: 0 !important;\n    border-left: none !important;\n  }\n  #unipile-toc .utc-col:nth-child(2n) {\n    padding-right: 0 !important;\n  }\n}\n\n@media (max-width: 700px) {\n  #unipile-toc .utc-card {\n    padding: 22px !important;\n  }\n  #unipile-toc .utc-header {\n    margin-bottom: 0 !important;\n    padding-bottom: 0 !important;\n    border-bottom: none !important;\n  }\n  #unipile-toc .utc-toggle {\n    display: flex !important;\n  }\n  #unipile-toc .utc-grid {\n    grid-template-columns: 1fr !important;\n    gap: 22px !important;\n    max-height: 2000px !important;\n    overflow: hidden !important;\n    transition: max-height 0.4s ease, margin-top 0.3s ease, padding-top 0.3s ease !important;\n    margin-top: 22px !important;\n    padding-top: 22px !important;\n    border-top: 1px solid #e5e7eb !important;\n  }\n  #unipile-toc.utc-collapsed .utc-grid {\n    max-height: 0 !important;\n    margin-top: 0 !important;\n    padding-top: 0 !important;\n    border-top: none !important;\n  }\n  #unipile-toc .utc-col {\n    padding: 0 !important;\n    border-left: none !important;\n    border-top: 1px solid #e5e7eb !important;\n    padding-top: 18px !important;\n  }\n  #unipile-toc .utc-col:first-child {\n    border-top: none !important;\n    padding-top: 0 !important;\n  }\n}\n<\/style>\n\n<div id=\"unipile-toc\">\n  <div class=\"utc-card\">\n    <div class=\"utc-header\">\n      <div class=\"utc-header-left\">\n        <div class=\"utc-icon-box\">\n          <svg viewBox=\"0 0 24 24\">\n            <line x1=\"8\" y1=\"6\" x2=\"21\" y2=\"6\"\/>\n            <line x1=\"8\" y1=\"12\" x2=\"21\" y2=\"12\"\/>\n            <line x1=\"8\" y1=\"18\" x2=\"21\" y2=\"18\"\/>\n            <line x1=\"3\" y1=\"6\" x2=\"3.01\" y2=\"6\"\/>\n            <line x1=\"3\" y1=\"12\" x2=\"3.01\" y2=\"12\"\/>\n            <line x1=\"3\" y1=\"18\" x2=\"3.01\" y2=\"18\"\/>\n          <\/svg>\n        <\/div>\n        <span class=\"utc-title\">Table of Contents<\/span>\n      <\/div>\n      <button type=\"button\" class=\"utc-toggle\" aria-label=\"Toggle table of contents\">\n        <span class=\"utc-toggle-label\">Hide<\/span>\n        <svg viewBox=\"0 0 24 24\"><polyline points=\"6 9 12 15 18 9\"\/><\/svg>\n      <\/button>\n    <\/div>\n\n    <div class=\"utc-grid\">\n      <!-- COLUMN 1 \u2014 Quotas -->\n      <div class=\"utc-col\">\n        <span class=\"utc-col-label\">Quotas<\/span>\n        <div class=\"utc-link-list\">\n          <a class=\"utc-link\" href=\"#gal-glance\">\n            <span class=\"utc-num\">01<\/span>\n            <span class=\"utc-link-text\">At a glance<\/span>\n          <\/a>\n          <a class=\"utc-link\" href=\"#gal-dimensions\">\n            <span class=\"utc-num\">02<\/span>\n            <span class=\"utc-link-text\">Quota dimensions<\/span>\n          <\/a>\n          <a class=\"utc-link\" href=\"#gal-unit-cost\">\n            <span class=\"utc-num\">03<\/span>\n            <span class=\"utc-link-text\">Unit cost<\/span>\n          <\/a>\n        <\/div>\n      <\/div>\n\n      <!-- COLUMN 2 \u2014 Limits -->\n      <div class=\"utc-col\">\n        <span class=\"utc-col-label\">Limits<\/span>\n        <div class=\"utc-link-list\">\n          <a class=\"utc-link\" href=\"#gal-concurrent\">\n            <span class=\"utc-num\">04<\/span>\n            <span class=\"utc-link-text\">50-concurrent<\/span>\n          <\/a>\n          <a class=\"utc-link\" href=\"#gal-errors\">\n            <span class=\"utc-num\">05<\/span>\n            <span class=\"utc-link-text\">Errors 429 vs 403<\/span>\n          <\/a>\n          <a class=\"utc-link\" href=\"#gal-backoff\">\n            <span class=\"utc-num\">06<\/span>\n            <span class=\"utc-link-text\">Backoff code<\/span>\n          <\/a>\n        <\/div>\n      <\/div>\n\n      <!-- COLUMN 3 \u2014 Scaling -->\n      <div class=\"utc-col\">\n        <span class=\"utc-col-label\">Scaling<\/span>\n        <div class=\"utc-link-list\">\n          <a class=\"utc-link\" href=\"#gal-strategies\">\n            <span class=\"utc-num\">07<\/span>\n            <span class=\"utc-link-text\">Strategies<\/span>\n          <\/a>\n          <a class=\"utc-link\" href=\"#gal-multitenant\">\n            <span class=\"utc-num\">08<\/span>\n            <span class=\"utc-link-text\">Multi-tenant<\/span>\n          <\/a>\n        <\/div>\n      <\/div>\n\n      <!-- COLUMN 4 \u2014 Solution + FAQ -->\n      <div class=\"utc-col\">\n        <span class=\"utc-col-label\">Solution<\/span>\n        <div class=\"utc-link-list\">\n          <a class=\"utc-link\" href=\"#gal-unipile\">\n            <span class=\"utc-num\">09<\/span>\n            <span class=\"utc-link-text\">Managed (Unipile)<span class=\"utc-tag-best\">Best<\/span><\/span>\n          <\/a>\n          <a class=\"utc-link\" href=\"#faq-gal\">\n            <span class=\"utc-num utc-num-faq\">FAQ<\/span>\n            <span class=\"utc-link-text\">Frequently Asked Questions<\/span>\n          <\/a>\n        <\/div>\n      <\/div>\n    <\/div>\n  <\/div>\n<\/div>\n\n<script>\n(function(){\n  var toc = document.getElementById('unipile-toc');\n  if (!toc) return;\n\n  var toggleBtn = toc.querySelector('.utc-toggle');\n  var toggleLabel = toc.querySelector('.utc-toggle-label');\n  if (toggleBtn) {\n    toggleBtn.addEventListener('click', function(){\n      var isCollapsed = toc.classList.toggle('utc-collapsed');\n      if (toggleLabel) toggleLabel.textContent = isCollapsed ? 'Show' : 'Hide';\n    });\n    if (window.innerWidth <= 700) {\n      toc.classList.add('utc-collapsed');\n      if (toggleLabel) toggleLabel.textContent = 'Show';\n    }\n  }\n\n  var links = toc.querySelectorAll('.utc-link');\n  links.forEach(function(link){\n    link.addEventListener('click', function(e){\n      var href = link.getAttribute('href');\n      if (!href || href.charAt(0) !== '#') return;\n      var target = document.getElementById(href.substring(1));\n      if (target) {\n        e.preventDefault();\n        var offset = 80;\n        var top = target.getBoundingClientRect().top + window.pageYOffset - offset;\n        window.scrollTo({ top: top, behavior: 'smooth' });\n      }\n    });\n  });\n\n  var sectionIds = [];\n  links.forEach(function(link){\n    var href = link.getAttribute('href');\n    if (href &#038;&#038; href.charAt(0) === '#') sectionIds.push(href.substring(1));\n  });\n\n  function updateActive(){\n    var scrollY = window.pageYOffset + 120;\n    var activeId = null;\n    var readIds = [];\n    sectionIds.forEach(function(id){\n      var el = document.getElementById(id);\n      if (el) {\n        var top = el.getBoundingClientRect().top + window.pageYOffset;\n        if (top <= scrollY) {\n          activeId = id;\n          readIds.push(id);\n        }\n      }\n    });\n    links.forEach(function(link){\n      var href = link.getAttribute('href');\n      var id = href ? href.substring(1) : '';\n      link.classList.remove('utc-active', 'utc-read');\n      if (id === activeId) {\n        link.classList.add('utc-active');\n      } else if (readIds.indexOf(id) !== -1) {\n        link.classList.add('utc-read');\n      }\n    });\n  }\n\n  if ('IntersectionObserver' in window) {\n    var observer = new IntersectionObserver(function(){\n      updateActive();\n    }, { rootMargin: '-120px 0px -60% 0px' });\n    sectionIds.forEach(function(id){\n      var el = document.getElementById(id);\n      if (el) observer.observe(el);\n    });\n  }\n  window.addEventListener('scroll', updateActive, { passive: true });\n  updateActive();\n})();\n<\/script>[\/et_pb_code][\/et_pb_column][\/et_pb_row][\/et_pb_section][et_pb_section fb_built=\"1\" _builder_version=\"4.16\" background_color=\"transparent\" custom_padding=\"0px|0px|0px|0px\" custom_padding_tablet=\"0px|0px|0px|0px\" custom_padding_phone=\"0px|0px|0px|0px\" global_colors_info=\"{}\" theme_builder_area=\"post_content\" da_is_popup=\"off\" da_exit_intent=\"off\" da_has_close=\"on\" da_alt_close=\"off\" da_dark_close=\"off\" da_not_modal=\"on\" da_is_singular=\"off\" da_with_loader=\"off\" da_has_shadow=\"on\" da_disable_devices=\"off|off|off\"][et_pb_row _builder_version=\"4.16\" background_size=\"initial\" background_position=\"top_left\" background_repeat=\"repeat\" custom_padding=\"0px|0px|0px|0px\" global_colors_info=\"{}\" theme_builder_area=\"post_content\"][et_pb_column type=\"4_4\" _builder_version=\"4.16\" custom_padding=\"|||\" global_colors_info=\"{}\" custom_padding__hover=\"|||\" theme_builder_area=\"post_content\"][et_pb_code _builder_version=\"4.16\" global_colors_info=\"{}\" theme_builder_area=\"post_content\"]<link href=\"https:\/\/fonts.googleapis.com\/css2?family=Inter:wght@400;500;600;700&#038;family=Poppins:wght@700;800&#038;display=swap\" rel=\"stylesheet\">\n<style>\n#upl-gal-hero,\n#upl-gal-hero *,\n#upl-gal-hero *::before,\n#upl-gal-hero *::after {\n  margin: 0 !important;\n  padding: 0 !important;\n  box-sizing: border-box !important;\n  border: none !important;\n  outline: none !important;\n  font-family: 'Inter', -apple-system, BlinkMacSystemFont, sans-serif !important;\n  line-height: 1.5 !important;\n  letter-spacing: normal !important;\n  text-transform: none !important;\n  text-decoration: none !important;\n  list-style: none !important;\n}\n#upl-gal-hero {\n  display: block !important;\n  padding: 70px 24px 60px !important;\n  max-width: 1160px !important;\n  margin: 0 auto !important;\n  overflow-x: hidden !important;\n}\n#upl-gal-hero .gal-hero-grid {\n  display: grid !important;\n  grid-template-columns: 1fr 1fr !important;\n  gap: 60px !important;\n  align-items: center !important;\n}\n#upl-gal-hero .gal-hero-left {\n  display: flex !important;\n  flex-direction: column !important;\n  gap: 20px !important;\n}\n#upl-gal-hero .gal-eyebrow {\n  display: inline-flex !important;\n  align-items: center !important;\n  gap: 8px !important;\n  background: rgba(59, 185, 139, 0.12) !important;\n  color: #2aaa7e !important;\n  padding: 6px 14px !important;\n  border-radius: 20px !important;\n  font-size: 12px !important;\n  font-weight: 700 !important;\n  text-transform: uppercase !important;\n  letter-spacing: 0.5px !important;\n  width: fit-content !important;\n}\n#upl-gal-hero .gal-eyebrow .gal-dot {\n  width: 7px !important;\n  height: 7px !important;\n  background: #3BB98B !important;\n  border-radius: 50% !important;\n  flex-shrink: 0 !important;\n  display: inline-block !important;\n}\n#upl-gal-hero .gal-h1 {\n  font-family: 'Poppins', sans-serif !important;\n  font-size: 44px !important;\n  font-weight: 700 !important;\n  color: #0f2736 !important;\n  line-height: 1.18 !important;\n  letter-spacing: -0.5px !important;\n}\n#upl-gal-hero .gal-h1 .gal-accent {\n  color: #3BB98B !important;\n}\n#upl-gal-hero .gal-desc {\n  font-size: 17px !important;\n  color: #383838 !important;\n  line-height: 1.75 !important;\n}\n#upl-gal-hero .gal-cta-row {\n  display: flex !important;\n  align-items: center !important;\n  gap: 14px !important;\n  flex-wrap: wrap !important;\n}\n#upl-gal-hero .gal-cta-primary {\n  display: inline-flex !important;\n  align-items: center !important;\n  gap: 8px !important;\n  background: #DDDF4C !important;\n  color: #0f2736 !important;\n  padding: 14px 28px !important;\n  border-radius: 8px !important;\n  font-size: 0.95rem !important;\n  font-weight: 600 !important;\n  transition: transform 0.3s ease !important;\n  cursor: pointer !important;\n  white-space: nowrap !important;\n  text-decoration: none !important;\n}\n#upl-gal-hero .gal-cta-primary:hover {\n  transform: translateY(-5px) !important;\n}\n#upl-gal-hero .gal-cta-primary svg {\n  width: 16px !important;\n  height: 16px !important;\n  stroke: currentColor !important;\n  fill: none !important;\n  stroke-width: 2.5 !important;\n  stroke-linecap: round !important;\n  stroke-linejoin: round !important;\n  flex-shrink: 0 !important;\n}\n#upl-gal-hero .gal-cta-secondary {\n  display: inline-flex !important;\n  align-items: center !important;\n  gap: 8px !important;\n  background: transparent !important;\n  color: #0f2736 !important;\n  padding: 12px 24px !important;\n  border-radius: 8px !important;\n  border: 2px solid #0f2736 !important;\n  font-size: 0.95rem !important;\n  font-weight: 600 !important;\n  transition: all 0.3s ease !important;\n  cursor: pointer !important;\n  white-space: nowrap !important;\n  text-decoration: none !important;\n}\n#upl-gal-hero .gal-cta-secondary:hover {\n  background: #0f2736 !important;\n  color: #ffffff !important;\n}\n\/* Code mockup *\/\n#upl-gal-hero .gal-code-wrapper {\n  border-radius: 14px !important;\n  overflow: hidden !important;\n  background: #0d1117 !important;\n  box-shadow: 0 20px 60px rgba(15, 39, 54, 0.18) !important;\n}\n#upl-gal-hero .gal-editor-bar {\n  background: #161b22 !important;\n  padding: 12px 18px !important;\n  display: flex !important;\n  align-items: center !important;\n  gap: 8px !important;\n  border-bottom: 1px solid rgba(255,255,255,0.06) !important;\n}\n#upl-gal-hero .gal-dot-r { width: 12px !important; height: 12px !important; border-radius: 50% !important; background: #ff5f57 !important; flex-shrink: 0 !important; display: inline-block !important; }\n#upl-gal-hero .gal-dot-y { width: 12px !important; height: 12px !important; border-radius: 50% !important; background: #febc2e !important; flex-shrink: 0 !important; display: inline-block !important; }\n#upl-gal-hero .gal-dot-g { width: 12px !important; height: 12px !important; border-radius: 50% !important; background: #28c840 !important; flex-shrink: 0 !important; display: inline-block !important; }\n#upl-gal-hero .gal-filename {\n  color: #8b949e !important;\n  font-size: 13px !important;\n  margin-left: 6px !important;\n  font-family: 'Courier New', monospace !important;\n  line-height: 1 !important;\n}\n#upl-gal-hero .gal-pre {\n  padding: 22px 24px !important;\n  font-size: 13px !important;\n  line-height: 1.8 !important;\n  background: #0d1117 !important;\n  overflow-x: auto !important;\n}\n#upl-gal-hero .gal-pre code {\n  font-family: 'Courier New', monospace !important;\n  white-space: pre-wrap !important;\n  word-break: break-word !important;\n  display: block !important;\n  color: #e6edf3 !important;\n}\n#upl-gal-hero .gal-k { color: #ff7b72 !important; }\n#upl-gal-hero .gal-fn { color: #d2a8ff !important; }\n#upl-gal-hero .gal-s { color: #a5d6ff !important; }\n#upl-gal-hero .gal-n { color: #79c0ff !important; }\n#upl-gal-hero .gal-c { color: #8b949e !important; }\n#upl-gal-hero .gal-w { color: #e6edf3 !important; }\n#upl-gal-hero .gal-editor-ok {\n  background: rgba(59, 185, 139, 0.1) !important;\n  border-top: 1px solid rgba(59, 185, 139, 0.25) !important;\n  color: #3BB98B !important;\n  padding: 10px 24px !important;\n  font-size: 12px !important;\n  font-family: 'Courier New', monospace !important;\n  display: flex !important;\n  align-items: center !important;\n  gap: 8px !important;\n}\n#upl-gal-hero .gal-editor-ok svg {\n  width: 14px !important;\n  height: 14px !important;\n  stroke: #3BB98B !important;\n  fill: none !important;\n  stroke-width: 2.5 !important;\n  stroke-linecap: round !important;\n  stroke-linejoin: round !important;\n  flex-shrink: 0 !important;\n}\n\n@media (max-width: 900px) {\n  #upl-gal-hero {\n    padding: 50px 20px 40px !important;\n  }\n  #upl-gal-hero .gal-hero-grid {\n    grid-template-columns: 1fr !important;\n    gap: 40px !important;\n  }\n  #upl-gal-hero .gal-h1 {\n    font-size: 34px !important;\n  }\n}\n@media (max-width: 600px) {\n  #upl-gal-hero {\n    padding: 40px 16px 32px !important;\n  }\n  #upl-gal-hero .gal-h1 {\n    font-size: 28px !important;\n  }\n  #upl-gal-hero .gal-desc {\n    font-size: 16px !important;\n  }\n  #upl-gal-hero .gal-cta-row {\n    flex-direction: column !important;\n    align-items: flex-start !important;\n    width: 100% !important;\n  }\n  #upl-gal-hero .gal-cta-primary,\n  #upl-gal-hero .gal-cta-secondary {\n    width: 100% !important;\n    justify-content: center !important;\n  }\n}\n@media (max-width: 400px) {\n  #upl-gal-hero .gal-h1 {\n    font-size: 26px !important;\n  }\n}\n<\/style>\n\n<div id=\"upl-gal-hero\">\n  <span id=\"gal-top\" style=\"display:block;position:relative;top:-80px;visibility:hidden;\"><\/span>\n  <div class=\"gal-hero-grid\">\n    <div class=\"gal-hero-left\">\n      <div class=\"gal-eyebrow\"><span class=\"gal-dot\"><\/span><span>Gmail API - May 2026<\/span><\/div>\n      <h1 class=\"gal-h1\">Gmail API Limits in 2026: <span class=\"gal-accent\">Quotas, Rate Limits,<\/span> and How to Handle Them<\/h1>\n      <pee class=\"gal-desc\">Complete Gmail API quota reference covering per-minute, per-user, and daily limits, per-method unit costs, 429 error handling, and a production-ready exponential backoff pattern for authenticated users.<\/pee>\n      <div class=\"gal-cta-row\">\n        <a class=\"gal-cta-primary\" href=\"https:\/\/dashboard.unipile.com\/signup\/\" target=\"_blank\" rel=\"noopener\"><span>Build it with Unipile<\/span><svg viewBox=\"0 0 24 24\"><line x1=\"5\" y1=\"12\" x2=\"19\" y2=\"12\"\/><polyline points=\"12 5 19 12 12 19\"\/><\/svg><\/a>\n        <a class=\"gal-cta-secondary\" href=\"https:\/\/developer.unipile.com\/docs\" target=\"_blank\" rel=\"noopener\"><span>View API docs<\/span><\/a>\n      <\/div>\n    <\/div>\n    <div class=\"gal-hero-right\">\n      <div class=\"gal-code-wrapper\">\n        <div class=\"gal-editor-bar\">\n          <span class=\"gal-dot-r\"><\/span><span class=\"gal-dot-y\"><\/span><span class=\"gal-dot-g\"><\/span>\n          <span class=\"gal-filename\">retry-handler.js<\/span>\n        <\/div>\n        <div class=\"gal-pre\"><code><span class=\"gal-k\">async function<\/span> <span class=\"gal-fn\">withBackoff<\/span><span class=\"gal-w\">(fn, maxRetries = <\/span><span class=\"gal-n\">5<\/span><span class=\"gal-w\">) {<\/span>\n<span class=\"gal-k\">  let<\/span><span class=\"gal-w\"> delay = <\/span><span class=\"gal-n\">1000<\/span><span class=\"gal-w\">;<\/span>\n<span class=\"gal-k\">  for<\/span><span class=\"gal-w\"> (<\/span><span class=\"gal-k\">let<\/span><span class=\"gal-w\"> i = <\/span><span class=\"gal-n\">0<\/span><span class=\"gal-w\">; i < maxRetries; i++) {<\/span>\n<span class=\"gal-k\">    try<\/span><span class=\"gal-w\"> {<\/span>\n<span class=\"gal-k\">      return await<\/span> <span class=\"gal-fn\">fn<\/span><span class=\"gal-w\">();<\/span>\n<span class=\"gal-w\">    } <\/span><span class=\"gal-k\">catch<\/span><span class=\"gal-w\"> (err) {<\/span>\n<span class=\"gal-k\">      if<\/span><span class=\"gal-w\"> (err.code !== <\/span><span class=\"gal-n\">429<\/span><span class=\"gal-w\">) <\/span><span class=\"gal-k\">throw<\/span><span class=\"gal-w\"> err;<\/span>\n<span class=\"gal-w\">      <\/span><span class=\"gal-k\">const<\/span><span class=\"gal-w\"> jitter = <\/span><span class=\"gal-fn\">Math.random<\/span><span class=\"gal-w\">() * <\/span><span class=\"gal-n\">500<\/span><span class=\"gal-w\">;<\/span>\n<span class=\"gal-k\">      await<\/span> <span class=\"gal-fn\">sleep<\/span><span class=\"gal-w\">(delay + jitter);<\/span>\n<span class=\"gal-w\">      delay *= <\/span><span class=\"gal-n\">2<\/span><span class=\"gal-w\">;<\/span>\n<span class=\"gal-w\">    }<\/span>\n<span class=\"gal-w\">  }<\/span>\n<span class=\"gal-w\">}<\/span><\/code><\/div>\n        <div class=\"gal-editor-ok\">\n          <svg viewBox=\"0 0 24 24\"><polyline points=\"20 6 9 17 4 12\"\/><\/svg>\n          <span>Handles 429 rateLimitExceeded and userRateLimitExceeded<\/span>\n        <\/div>\n      <\/div>\n    <\/div>\n  <\/div>\n<\/div>[\/et_pb_code][\/et_pb_column][\/et_pb_row][\/et_pb_section][et_pb_section fb_built=\"1\" _builder_version=\"4.16\" background_color=\"transparent\" custom_padding=\"0px|0px|0px|0px\" custom_padding_tablet=\"0px|0px|0px|0px\" custom_padding_phone=\"0px|0px|0px|0px\" global_colors_info=\"{}\" theme_builder_area=\"post_content\" da_is_popup=\"off\" da_exit_intent=\"off\" da_has_close=\"on\" da_alt_close=\"off\" da_dark_close=\"off\" da_not_modal=\"on\" da_is_singular=\"off\" da_with_loader=\"off\" da_has_shadow=\"on\" da_disable_devices=\"off|off|off\"][et_pb_row _builder_version=\"4.16\" background_size=\"initial\" background_position=\"top_left\" background_repeat=\"repeat\" custom_padding=\"0px|0px|0px|0px\" global_colors_info=\"{}\" theme_builder_area=\"post_content\"][et_pb_column type=\"4_4\" _builder_version=\"4.16\" custom_padding=\"|||\" global_colors_info=\"{}\" custom_padding__hover=\"|||\" theme_builder_area=\"post_content\"][et_pb_code _builder_version=\"4.16\" global_colors_info=\"{}\" theme_builder_area=\"post_content\"]<link href=\"https:\/\/fonts.googleapis.com\/css2?family=Inter:wght@400;500;600;700&#038;family=Poppins:wght@700;800&#038;display=swap\" rel=\"stylesheet\">\n<style>\n#upl-gal-compliance,\n#upl-gal-compliance *,\n#upl-gal-compliance *::before,\n#upl-gal-compliance *::after {\n  margin: 0 !important;\n  padding: 0 !important;\n  box-sizing: border-box !important;\n  border: none !important;\n  outline: none !important;\n  font-family: 'Inter', -apple-system, BlinkMacSystemFont, sans-serif !important;\n  line-height: 1.5 !important;\n  letter-spacing: normal !important;\n  text-transform: none !important;\n  text-decoration: none !important;\n  list-style: none !important;\n}\n#upl-gal-compliance {\n  display: block !important;\n  padding: 0 24px 50px !important;\n  max-width: 1100px !important;\n  margin: 0 auto !important;\n  overflow-x: hidden !important;\n}\n#upl-gal-compliance .galc-grid {\n  display: grid !important;\n  grid-template-columns: repeat(3, 1fr) !important;\n  gap: 20px !important;\n}\n#upl-gal-compliance .galc-block {\n  background: #0f2736 !important;\n  border-radius: 16px !important;\n  padding: 24px !important;\n  border-left: 4px solid #3BB98B !important;\n}\n#upl-gal-compliance .galc-eyebrow {\n  display: inline-flex !important;\n  align-items: center !important;\n  gap: 6px !important;\n  background: rgba(59, 185, 139, 0.15) !important;\n  color: #3BB98B !important;\n  padding: 4px 10px !important;\n  border-radius: 20px !important;\n  font-size: 11px !important;\n  font-weight: 700 !important;\n  text-transform: uppercase !important;\n  letter-spacing: 0.5px !important;\n  margin-bottom: 12px !important;\n  width: fit-content !important;\n}\n#upl-gal-compliance .galc-title {\n  font-family: 'Poppins', sans-serif !important;\n  font-size: 14px !important;\n  font-weight: 700 !important;\n  color: #ffffff !important;\n  margin-bottom: 10px !important;\n  line-height: 1.3 !important;\n}\n#upl-gal-compliance .galc-text {\n  font-size: 14px !important;\n  color: rgba(255, 255, 255, 0.75) !important;\n  line-height: 1.65 !important;\n}\n#upl-gal-compliance .galc-text strong {\n  color: rgba(255, 255, 255, 0.95) !important;\n  font-weight: 600 !important;\n}\n\n@media (max-width: 768px) {\n  #upl-gal-compliance {\n    padding: 0 16px 40px !important;\n  }\n  #upl-gal-compliance .galc-grid {\n    grid-template-columns: 1fr !important;\n    gap: 16px !important;\n  }\n}\n<\/style>\n\n<div id=\"upl-gal-compliance\">\n  <div class=\"galc-grid\">\n    <div class=\"galc-block\">\n      <div class=\"galc-eyebrow\"><span>Data Handling Note<\/span><\/div>\n      <pee class=\"galc-title\">Scoped to the authenticated user session<\/pee>\n      <pee class=\"galc-text\">Unipile does not maintain a parallel archive of Gmail mailbox data. All email access is <strong>scoped to the session of the authenticated user<\/strong> who has explicitly granted OAuth consent. No data is stored independently beyond what is required to serve that specific request.<\/pee>\n    <\/div>\n    <div class=\"galc-block\">\n      <div class=\"galc-eyebrow\"><span>How Unipile Operates<\/span><\/div>\n      <pee class=\"galc-title\">Independent technical intermediary<\/pee>\n      <pee class=\"galc-text\">Unipile acts as an <strong>independent technical intermediary<\/strong>, making Gmail API calls on behalf of each individual authenticated user. Unipile is not a Google partner or affiliate. No credentials are shared across users. Each OAuth token belongs exclusively to the user who granted it.<\/pee>\n    <\/div>\n    <div class=\"galc-block\">\n      <div class=\"galc-eyebrow\"><span>Platform Limits<\/span><\/div>\n      <pee class=\"galc-title\">Cadence is a customer-side decision<\/pee>\n      <pee class=\"galc-text\">Unipile relays Gmail API rate limits and quota constraints as defined by Google. The frequency and volume of API calls made <strong>on behalf of<\/strong> each user is a <strong>customer-side decision<\/strong>. Unipile surfaces quota errors and applies backoff logic, but the calling cadence remains under the developer's control.<\/pee>\n    <\/div>\n  <\/div>\n<\/div>[\/et_pb_code][\/et_pb_column][\/et_pb_row][\/et_pb_section][et_pb_section fb_built=\"1\" _builder_version=\"4.16\" background_color=\"transparent\" custom_padding=\"0px|0px|0px|0px\" custom_padding_tablet=\"0px|0px|0px|0px\" custom_padding_phone=\"0px|0px|0px|0px\" global_colors_info=\"{}\" theme_builder_area=\"post_content\" da_is_popup=\"off\" da_exit_intent=\"off\" da_has_close=\"on\" da_alt_close=\"off\" da_dark_close=\"off\" da_not_modal=\"on\" da_is_singular=\"off\" da_with_loader=\"off\" da_has_shadow=\"on\" da_disable_devices=\"off|off|off\"][et_pb_row _builder_version=\"4.16\" background_size=\"initial\" background_position=\"top_left\" background_repeat=\"repeat\" custom_padding=\"0px|0px|0px|0px\" global_colors_info=\"{}\" theme_builder_area=\"post_content\"][et_pb_column type=\"4_4\" _builder_version=\"4.16\" custom_padding=\"|||\" global_colors_info=\"{}\" custom_padding__hover=\"|||\" theme_builder_area=\"post_content\"][et_pb_code _builder_version=\"4.16\" global_colors_info=\"{}\" theme_builder_area=\"post_content\"]<link href=\"https:\/\/fonts.googleapis.com\/css2?family=Inter:wght@400;500;600;700&#038;family=Poppins:wght@700;800&#038;display=swap\" rel=\"stylesheet\">\n<style>\n#upl-gal-glance,\n#upl-gal-glance *,\n#upl-gal-glance *::before,\n#upl-gal-glance *::after {\n  margin: 0 !important;\n  padding: 0 !important;\n  box-sizing: border-box !important;\n  border: none !important;\n  outline: none !important;\n  font-family: 'Inter', -apple-system, BlinkMacSystemFont, sans-serif !important;\n  line-height: 1.5 !important;\n  letter-spacing: normal !important;\n  text-transform: none !important;\n  text-decoration: none !important;\n  list-style: none !important;\n}\n#upl-gal-glance {\n  display: block !important;\n  padding: 70px 24px !important;\n  background: #f4f5f7 !important;\n  overflow-x: hidden !important;\n}\n#upl-gal-glance .galg-inner {\n  max-width: 1100px !important;\n  margin: 0 auto !important;\n}\n#upl-gal-glance .galg-eyebrow {\n  display: inline-flex !important;\n  align-items: center !important;\n  gap: 8px !important;\n  background: rgba(59, 185, 139, 0.12) !important;\n  color: #2aaa7e !important;\n  padding: 6px 14px !important;\n  border-radius: 20px !important;\n  font-size: 12px !important;\n  font-weight: 700 !important;\n  text-transform: uppercase !important;\n  letter-spacing: 0.5px !important;\n  margin-bottom: 16px !important;\n  width: fit-content !important;\n}\n#upl-gal-glance .galg-dot {\n  width: 7px !important;\n  height: 7px !important;\n  background: #3BB98B !important;\n  border-radius: 50% !important;\n  flex-shrink: 0 !important;\n  display: inline-block !important;\n}\n#upl-gal-glance .galg-h2 {\n  font-family: 'Poppins', sans-serif !important;\n  font-size: 35px !important;\n  font-weight: 700 !important;\n  color: #0f2736 !important;\n  line-height: 1.2 !important;\n  margin-bottom: 14px !important;\n}\n#upl-gal-glance .galg-intro {\n  font-size: 17px !important;\n  color: #383838 !important;\n  line-height: 1.75 !important;\n  margin-bottom: 36px !important;\n}\n\/* Snippet bait table *\/\n#upl-gal-glance .galg-table-wrap {\n  background: #ffffff !important;\n  border-radius: 16px !important;\n  border: 1px solid #e5e7eb !important;\n  overflow: hidden !important;\n  margin-bottom: 40px !important;\n}\n#upl-gal-glance .galg-table {\n  width: 100% !important;\n  border-collapse: collapse !important;\n  display: table !important;\n}\n#upl-gal-glance .galg-table thead tr {\n  background: #0f2736 !important;\n}\n#upl-gal-glance .galg-table thead th {\n  padding: 14px 20px !important;\n  font-size: 12px !important;\n  font-weight: 700 !important;\n  color: #ffffff !important;\n  text-transform: uppercase !important;\n  letter-spacing: 0.6px !important;\n  text-align: left !important;\n}\n#upl-gal-glance .galg-table tbody tr {\n  border-bottom: 1px solid #f0f1f3 !important;\n}\n#upl-gal-glance .galg-table tbody tr:last-child {\n  border-bottom: none !important;\n}\n#upl-gal-glance .galg-table tbody tr:hover {\n  background: rgba(59, 185, 139, 0.04) !important;\n}\n#upl-gal-glance .galg-table td {\n  padding: 14px 20px !important;\n  font-size: 14px !important;\n  color: #383838 !important;\n  vertical-align: middle !important;\n}\n#upl-gal-glance .galg-table .galg-td-label {\n  font-weight: 600 !important;\n  color: #0f2736 !important;\n}\n#upl-gal-glance .galg-table .galg-td-val {\n  font-family: 'Courier New', monospace !important;\n  font-weight: 700 !important;\n  color: #2aaa7e !important;\n  font-size: 13px !important;\n}\n#upl-gal-glance .galg-table .galg-td-note {\n  color: #64748b !important;\n  font-size: 13px !important;\n}\n\/* KPI cards row *\/\n#upl-gal-glance .galg-kpi-row {\n  display: grid !important;\n  grid-template-columns: repeat(4, 1fr) !important;\n  gap: 16px !important;\n  margin-bottom: 40px !important;\n}\n#upl-gal-glance .galg-kpi-card {\n  background: #ffffff !important;\n  border: 1px solid #e5e7eb !important;\n  border-radius: 16px !important;\n  padding: 20px !important;\n  text-align: center !important;\n}\n#upl-gal-glance .galg-kpi-num {\n  font-family: 'Poppins', sans-serif !important;\n  font-size: 26px !important;\n  font-weight: 700 !important;\n  color: #3BB98B !important;\n  line-height: 1 !important;\n  margin-bottom: 6px !important;\n  display: block !important;\n}\n#upl-gal-glance .galg-kpi-label {\n  font-size: 12px !important;\n  color: #64748b !important;\n  font-weight: 500 !important;\n  line-height: 1.4 !important;\n  display: block !important;\n}\n\/* CTA inline *\/\n#upl-gal-glance .galg-cta-wrap {\n  display: flex !important;\n  align-items: center !important;\n  gap: 14px !important;\n  flex-wrap: wrap !important;\n}\n#upl-gal-glance .galg-cta {\n  display: inline-flex !important;\n  align-items: center !important;\n  gap: 8px !important;\n  background: #DDDF4C !important;\n  color: #0f2736 !important;\n  padding: 12px 22px !important;\n  border-radius: 8px !important;\n  font-size: 0.9rem !important;\n  font-weight: 600 !important;\n  transition: transform 0.3s ease !important;\n  cursor: pointer !important;\n  white-space: nowrap !important;\n  text-decoration: none !important;\n}\n#upl-gal-glance .galg-cta:hover {\n  transform: translateY(-5px) !important;\n}\n#upl-gal-glance .galg-cta svg {\n  width: 14px !important;\n  height: 14px !important;\n  stroke: currentColor !important;\n  fill: none !important;\n  stroke-width: 2.5 !important;\n  stroke-linecap: round !important;\n  stroke-linejoin: round !important;\n  flex-shrink: 0 !important;\n}\n#upl-gal-glance .galg-source-note {\n  font-size: 12px !important;\n  color: #94a3b8 !important;\n  margin-top: 16px !important;\n  line-height: 1.5 !important;\n}\n\n\/* Mobile: table -> cards *\/\n@media (max-width: 768px) {\n  #upl-gal-glance {\n    padding: 50px 16px !important;\n  }\n  #upl-gal-glance .galg-h2 {\n    font-size: 26px !important;\n  }\n  #upl-gal-glance .galg-intro {\n    font-size: 16px !important;\n  }\n  #upl-gal-glance .galg-kpi-row {\n    grid-template-columns: repeat(2, 1fr) !important;\n  }\n  #upl-gal-glance .galg-table {\n    display: none !important;\n  }\n  #upl-gal-glance .galg-table-mobile {\n    display: flex !important;\n    flex-direction: column !important;\n    gap: 12px !important;\n  }\n  #upl-gal-glance .galg-mobile-row {\n    background: #ffffff !important;\n    border: 1px solid #e5e7eb !important;\n    border-radius: 12px !important;\n    padding: 16px !important;\n  }\n  #upl-gal-glance .galg-mobile-label {\n    font-size: 12px !important;\n    font-weight: 700 !important;\n    color: #64748b !important;\n    text-transform: uppercase !important;\n    letter-spacing: 0.5px !important;\n    margin-bottom: 6px !important;\n    display: block !important;\n  }\n  #upl-gal-glance .galg-mobile-val {\n    font-family: 'Poppins', sans-serif !important;\n    font-size: 18px !important;\n    font-weight: 700 !important;\n    color: #2aaa7e !important;\n    display: block !important;\n    margin-bottom: 4px !important;\n  }\n  #upl-gal-glance .galg-mobile-note {\n    font-size: 13px !important;\n    color: #64748b !important;\n    display: block !important;\n  }\n}\n@media (min-width: 769px) {\n  #upl-gal-glance .galg-table-mobile {\n    display: none !important;\n  }\n}\n@media (max-width: 480px) {\n  #upl-gal-glance .galg-kpi-row {\n    grid-template-columns: 1fr 1fr !important;\n    gap: 12px !important;\n  }\n  #upl-gal-glance .galg-h2 {\n    font-size: 24px !important;\n  }\n}\n<\/style>\n\n<div id=\"upl-gal-glance\">\n  <span id=\"gal-glance\" style=\"display:block;position:relative;top:-80px;visibility:hidden;\"><\/span>\n  <div class=\"galg-inner\">\n    <div class=\"galg-eyebrow\"><span class=\"galg-dot\"><\/span><span>May 2026 Update<\/span><\/div>\n    <h2 class=\"galg-h2\">Gmail API limits at a glance<\/h2>\n    <pee class=\"galg-intro\">Before writing a single line of retry logic, you need a clear picture of all three quota axes Google enforces. The table below is the reference you will bookmark: per-project throughput, per-user caps, and the daily ceiling that resets at midnight Pacific time.<\/pee>\n\n    <div class=\"galg-kpi-row\">\n      <div class=\"galg-kpi-card\">\n        <span class=\"galg-kpi-num\">1.2M<\/span>\n        <span class=\"galg-kpi-label\">Quota units \/ min \/ project<\/span>\n      <\/div>\n      <div class=\"galg-kpi-card\">\n        <span class=\"galg-kpi-num\">6K<\/span>\n        <span class=\"galg-kpi-label\">Quota units \/ min \/ user<\/span>\n      <\/div>\n      <div class=\"galg-kpi-card\">\n        <span class=\"galg-kpi-num\">80M<\/span>\n        <span class=\"galg-kpi-label\">Quota units \/ day \/ project<\/span>\n      <\/div>\n      <div class=\"galg-kpi-card\">\n        <span class=\"galg-kpi-num\">500<\/span>\n        <span class=\"galg-kpi-label\">Emails \/ day send limit (free)<\/span>\n      <\/div>\n    <\/div>\n\n    <div class=\"galg-table-wrap\">\n      <table class=\"galg-table\">\n        <thead>\n          <tr>\n            <th>Limit<\/th>\n            <th>Value<\/th>\n            <th>Dimension<\/th>\n            <th>Notes<\/th>\n          <\/tr>\n        <\/thead>\n        <tbody>\n          <tr>\n            <td class=\"galg-td-label\">Gmail API rate limit (quota units)<\/td>\n            <td class=\"galg-td-val\">1,200,000 \/ min<\/td>\n            <td>Per GCP project<\/td>\n            <td class=\"galg-td-note\">Shared across all users in the project<\/td>\n          <\/tr>\n          <tr>\n            <td class=\"galg-td-label\">Gmail API per user rate limit<\/td>\n            <td class=\"galg-td-val\">6,000 \/ min<\/td>\n            <td>Per user mailbox<\/td>\n            <td class=\"galg-td-note\">Most common trigger for 429 in production<\/td>\n          <\/tr>\n          <tr>\n            <td class=\"galg-td-label\">Daily quota<\/td>\n            <td class=\"galg-td-val\">80,000,000 \/ day<\/td>\n            <td>Per GCP project<\/td>\n            <td class=\"galg-td-note\">Resets at midnight Pacific time<\/td>\n          <\/tr>\n          <tr>\n            <td class=\"galg-td-label\">Gmail send quota (free Gmail)<\/td>\n            <td class=\"galg-td-val\">500 emails \/ day<\/td>\n            <td>Per sender address<\/td>\n            <td class=\"galg-td-note\">2,000 \/ day for Google Workspace<\/td>\n          <\/tr>\n          <tr>\n            <td class=\"galg-td-label\">Concurrent requests per mailbox<\/td>\n            <td class=\"galg-td-val\">50<\/td>\n            <td>Per mailbox<\/td>\n            <td class=\"galg-td-note\">Hidden limit - triggers 429 regardless of quota<\/td>\n          <\/tr>\n          <tr>\n            <td class=\"galg-td-label\">Batch requests per call<\/td>\n            <td class=\"galg-td-val\">100 requests<\/td>\n            <td>Per batch call<\/td>\n            <td class=\"galg-td-note\">Use batch to reduce quota unit consumption<\/td>\n          <\/tr>\n          <tr>\n            <td class=\"galg-td-label\">Max message size (attachments)<\/td>\n            <td class=\"galg-td-val\">25 MB<\/td>\n            <td\">Per message<\/td>\n            <td class=\"galg-td-note\">Including headers and encoded body<\/td>\n          <\/tr>\n        <\/tbody>\n      <\/table>\n    <\/div>\n\n    <!-- Mobile card version -->\n    <div class=\"galg-table-mobile\">\n      <div class=\"galg-mobile-row\">\n        <span class=\"galg-mobile-label\">Project rate limit<\/span>\n        <span class=\"galg-mobile-val\">1,200,000 \/ min<\/span>\n        <span class=\"galg-mobile-note\">Quota units, per GCP project<\/span>\n      <\/div>\n      <div class=\"galg-mobile-row\">\n        <span class=\"galg-mobile-label\">Per-user rate limit<\/span>\n        <span class=\"galg-mobile-val\">6,000 \/ min<\/span>\n        <span class=\"galg-mobile-note\">Per mailbox - most common 429 trigger<\/span>\n      <\/div>\n      <div class=\"galg-mobile-row\">\n        <span class=\"galg-mobile-label\">Daily quota<\/span>\n        <span class=\"galg-mobile-val\">80,000,000 \/ day<\/span>\n        <span class=\"galg-mobile-note\">Per GCP project, resets midnight PT<\/span>\n      <\/div>\n      <div class=\"galg-mobile-row\">\n        <span class=\"galg-mobile-label\">Gmail send quota<\/span>\n        <span class=\"galg-mobile-val\">500 \/ day (free)<\/span>\n        <span class=\"galg-mobile-note\">2,000 \/ day for Google Workspace<\/span>\n      <\/div>\n      <div class=\"galg-mobile-row\">\n        <span class=\"galg-mobile-label\">Concurrent requests<\/span>\n        <span class=\"galg-mobile-val\">50 per mailbox<\/span>\n        <span class=\"galg-mobile-note\">Hidden limit - fires 429 even under quota<\/span>\n      <\/div>\n    <\/div>\n\n    <pee class=\"galg-source-note\">Source: Google Developers documentation, Gmail API - Usage Limits (last verified May 2026). Limits are subject to change; always check your GCP console quotas page for the current values on your project.<\/pee>\n\n    <div class=\"galg-cta-wrap\">\n      <a class=\"galg-cta\" href=\"https:\/\/dashboard.unipile.com\/signup\/\" target=\"_blank\" rel=\"noopener\"><span>Start building - quotas managed for you<\/span><svg viewBox=\"0 0 24 24\"><line x1=\"5\" y1=\"12\" x2=\"19\" y2=\"12\"\/><polyline points=\"12 5 19 12 12 19\"\/><\/svg><\/a>\n    <\/div>\n  <\/div>\n<\/div>[\/et_pb_code][\/et_pb_column][\/et_pb_row][\/et_pb_section][et_pb_section fb_built=\"1\" _builder_version=\"4.16\" background_color=\"transparent\" custom_padding=\"0px|0px|0px|0px\" custom_padding_tablet=\"0px|0px|0px|0px\" custom_padding_phone=\"0px|0px|0px|0px\" global_colors_info=\"{}\" theme_builder_area=\"post_content\" da_is_popup=\"off\" da_exit_intent=\"off\" da_has_close=\"on\" da_alt_close=\"off\" da_dark_close=\"off\" da_not_modal=\"on\" da_is_singular=\"off\" da_with_loader=\"off\" da_has_shadow=\"on\" da_disable_devices=\"off|off|off\"][et_pb_row _builder_version=\"4.16\" background_size=\"initial\" background_position=\"top_left\" background_repeat=\"repeat\" custom_padding=\"0px|0px|0px|0px\" global_colors_info=\"{}\" theme_builder_area=\"post_content\"][et_pb_column type=\"4_4\" _builder_version=\"4.16\" custom_padding=\"|||\" global_colors_info=\"{}\" custom_padding__hover=\"|||\" theme_builder_area=\"post_content\"][et_pb_code _builder_version=\"4.16\" global_colors_info=\"{}\" theme_builder_area=\"post_content\"]<link href=\"https:\/\/fonts.googleapis.com\/css2?family=Inter:wght@400;500;600;700&#038;family=Poppins:wght@700;800&#038;display=swap\" rel=\"stylesheet\">\n<style>\n#upl-gal-dims,\n#upl-gal-dims *,\n#upl-gal-dims *::before,\n#upl-gal-dims *::after {\n  margin: 0 !important;\n  padding: 0 !important;\n  box-sizing: border-box !important;\n  border: none !important;\n  outline: none !important;\n  font-family: 'Inter', -apple-system, BlinkMacSystemFont, sans-serif !important;\n  line-height: 1.5 !important;\n  letter-spacing: normal !important;\n  text-transform: none !important;\n  text-decoration: none !important;\n  list-style: none !important;\n}\n#upl-gal-dims {\n  display: block !important;\n  padding: 70px 24px !important;\n  overflow-x: hidden !important;\n}\n#upl-gal-dims .gald-inner {\n  max-width: 1100px !important;\n  margin: 0 auto !important;\n}\n#upl-gal-dims .gald-eyebrow {\n  display: inline-flex !important;\n  align-items: center !important;\n  gap: 8px !important;\n  background: rgba(59, 185, 139, 0.12) !important;\n  color: #2aaa7e !important;\n  padding: 6px 14px !important;\n  border-radius: 20px !important;\n  font-size: 12px !important;\n  font-weight: 700 !important;\n  text-transform: uppercase !important;\n  letter-spacing: 0.5px !important;\n  margin-bottom: 16px !important;\n  width: fit-content !important;\n}\n#upl-gal-dims .gald-dot {\n  width: 7px !important;\n  height: 7px !important;\n  background: #3BB98B !important;\n  border-radius: 50% !important;\n  flex-shrink: 0 !important;\n  display: inline-block !important;\n}\n#upl-gal-dims .gald-h2 {\n  font-family: 'Poppins', sans-serif !important;\n  font-size: 35px !important;\n  font-weight: 700 !important;\n  color: #0f2736 !important;\n  line-height: 1.2 !important;\n  margin-bottom: 14px !important;\n}\n#upl-gal-dims .gald-intro {\n  font-size: 17px !important;\n  color: #383838 !important;\n  line-height: 1.75 !important;\n  margin-bottom: 40px !important;\n}\n#upl-gal-dims .gald-cards {\n  display: grid !important;\n  grid-template-columns: repeat(3, 1fr) !important;\n  gap: 20px !important;\n  margin-bottom: 40px !important;\n}\n#upl-gal-dims .gald-card {\n  background: #ffffff !important;\n  border: 1px solid #e5e7eb !important;\n  border-radius: 16px !important;\n  padding: 24px !important;\n}\n#upl-gal-dims .gald-card-icon {\n  width: 44px !important;\n  height: 44px !important;\n  background: rgba(59, 185, 139, 0.12) !important;\n  border-radius: 10px !important;\n  display: flex !important;\n  align-items: center !important;\n  justify-content: center !important;\n  margin-bottom: 16px !important;\n  flex-shrink: 0 !important;\n}\n#upl-gal-dims .gald-card-icon svg {\n  width: 22px !important;\n  height: 22px !important;\n  stroke: #3BB98B !important;\n  fill: none !important;\n  stroke-width: 2 !important;\n  stroke-linecap: round !important;\n  stroke-linejoin: round !important;\n}\n#upl-gal-dims .gald-card-title {\n  font-family: 'Poppins', sans-serif !important;\n  font-size: 16px !important;\n  font-weight: 700 !important;\n  color: #0f2736 !important;\n  margin-bottom: 8px !important;\n  line-height: 1.3 !important;\n}\n#upl-gal-dims .gald-card-val {\n  font-family: 'Courier New', monospace !important;\n  font-size: 18px !important;\n  font-weight: 700 !important;\n  color: #2aaa7e !important;\n  margin-bottom: 10px !important;\n  display: block !important;\n  line-height: 1.2 !important;\n}\n#upl-gal-dims .gald-card-text {\n  font-size: 14px !important;\n  color: #383838 !important;\n  line-height: 1.65 !important;\n}\n#upl-gal-dims .gald-card-text strong {\n  color: #0f2736 !important;\n  font-weight: 600 !important;\n}\n#upl-gal-dims .gald-alert {\n  background: rgba(221, 223, 76, 0.12) !important;\n  border: 1px solid rgba(221, 223, 76, 0.35) !important;\n  border-radius: 12px !important;\n  padding: 18px 20px !important;\n  display: flex !important;\n  align-items: flex-start !important;\n  gap: 14px !important;\n  margin-bottom: 32px !important;\n}\n#upl-gal-dims .gald-alert svg {\n  width: 20px !important;\n  height: 20px !important;\n  stroke: #8a8c2e !important;\n  fill: none !important;\n  stroke-width: 2 !important;\n  stroke-linecap: round !important;\n  stroke-linejoin: round !important;\n  flex-shrink: 0 !important;\n  margin-top: 2px !important;\n}\n#upl-gal-dims .gald-alert-text {\n  font-size: 14px !important;\n  color: #383838 !important;\n  line-height: 1.65 !important;\n}\n#upl-gal-dims .gald-alert-text strong {\n  color: #0f2736 !important;\n  font-weight: 700 !important;\n}\n\n@media (max-width: 768px) {\n  #upl-gal-dims {\n    padding: 50px 16px !important;\n  }\n  #upl-gal-dims .gald-h2 {\n    font-size: 26px !important;\n  }\n  #upl-gal-dims .gald-intro {\n    font-size: 16px !important;\n  }\n  #upl-gal-dims .gald-cards {\n    grid-template-columns: 1fr !important;\n  }\n}\n@media (max-width: 480px) {\n  #upl-gal-dims .gald-h2 {\n    font-size: 24px !important;\n  }\n}\n<\/style>\n\n<div id=\"upl-gal-dims\">\n  <span id=\"gal-dimensions\" style=\"display:block;position:relative;top:-80px;visibility:hidden;\"><\/span>\n  <div class=\"gald-inner\">\n    <div class=\"gald-eyebrow\"><span class=\"gald-dot\"><\/span><span>Reference<\/span><\/div>\n    <h2 class=\"gald-h2\">The three quota dimensions<\/h2>\n    <pee class=\"gald-intro\">Gmail API usage limits work across three independent axes simultaneously. A request can be blocked even if two of the three are fine. Understanding the separation between per-project, per-user, and daily limits is the first step to writing resilient code for any authenticated user.<\/pee>\n\n    <div class=\"gald-cards\">\n      <div class=\"gald-card\">\n        <div class=\"gald-card-icon\">\n          <svg viewBox=\"0 0 24 24\"><rect x=\"3\" y=\"3\" width=\"7\" height=\"7\" rx=\"1\"\/><rect x=\"14\" y=\"3\" width=\"7\" height=\"7\" rx=\"1\"\/><rect x=\"3\" y=\"14\" width=\"7\" height=\"7\" rx=\"1\"\/><rect x=\"14\" y=\"14\" width=\"7\" height=\"7\" rx=\"1\"\/><\/svg>\n        <\/div>\n        <pee class=\"gald-card-title\">Per-project (GCP)<\/pee>\n        <span class=\"gald-card-val\">1,200,000 units\/min<\/span>\n        <pee class=\"gald-card-text\">This is the <strong>aggregate ceiling<\/strong> across all users within one GCP project. If you have 500 authenticated users each making Gmail API calls simultaneously, all of their quota consumption counts against this single bucket. Hitting it triggers a <code style=\"background:rgba(0,0,0,0.06);padding:2px 5px;border-radius:4px;font-family:Courier New,monospace;font-size:12px;\">rateLimitExceeded<\/code> 429. The daily equivalent is <strong>80 million units<\/strong>, resetting at midnight Pacific.<\/pee>\n      <\/div>\n      <div class=\"gald-card\">\n        <div class=\"gald-card-icon\">\n          <svg viewBox=\"0 0 24 24\"><path d=\"M20 21v-2a4 4 0 0 0-4-4H8a4 4 0 0 0-4 4v2\"\/><circle cx=\"12\" cy=\"7\" r=\"4\"\/><\/svg>\n        <\/div>\n        <pee class=\"gald-card-title\">Per-user (per mailbox)<\/pee>\n        <span class=\"gald-card-val\">6,000 units\/min<\/span>\n        <pee class=\"gald-card-text\">This cap applies independently to <strong>each authenticated user<\/strong>. Even if your project has quota headroom, a single user hammering their own mailbox with rapid polling will trigger a <code style=\"background:rgba(0,0,0,0.06);padding:2px 5px;border-radius:4px;font-family:Courier New,monospace;font-size:12px;\">userRateLimitExceeded<\/code> 429. In multi-tenant apps this is the limit that fires most often: it is per-user, not shared.<\/pee>\n      <\/div>\n      <div class=\"gald-card\">\n        <div class=\"gald-card-icon\">\n          <svg viewBox=\"0 0 24 24\"><circle cx=\"12\" cy=\"12\" r=\"10\"\/><polyline points=\"12 6 12 12 16 14\"\/><\/svg>\n        <\/div>\n        <pee class=\"gald-card-title\">Daily quota<\/pee>\n        <span class=\"gald-card-val\">80,000,000 units\/day<\/span>\n        <pee class=\"gald-card-text\">The daily limit is also per-project. Unlike the per-minute windows which recover automatically after 60 seconds, hitting the <strong>daily quota<\/strong> means no further API access until midnight Pacific. The error is <code style=\"background:rgba(0,0,0,0.06);padding:2px 5px;border-radius:4px;font-family:Courier New,monospace;font-size:12px;\">dailyLimitExceeded<\/code>. You can request a quota increase via the GCP console - we cover that in the multi-tenant section.<\/pee>\n      <\/div>\n    <\/div>\n\n    <div class=\"gald-alert\">\n      <svg viewBox=\"0 0 24 24\"><circle cx=\"12\" cy=\"12\" r=\"10\"\/><line x1=\"12\" y1=\"8\" x2=\"12\" y2=\"12\"\/><line x1=\"12\" y1=\"16\" x2=\"12.01\" y2=\"16\"\/><\/svg>\n      <pee class=\"gald-alert-text\"><strong>Important:<\/strong> The gmail api rate limits above are measured in \"quota units\", not raw request counts. A <code style=\"background:rgba(0,0,0,0.06);padding:2px 5px;border-radius:4px;font-family:Courier New,monospace;font-size:12px;\">messages.send<\/code> call costs 100 units, while a <code style=\"background:rgba(0,0,0,0.06);padding:2px 5px;border-radius:4px;font-family:Courier New,monospace;font-size:12px;\">messages.list<\/code> costs only 5. This means your practical request budget varies significantly depending on which methods you call. See the unit cost table in the next section. Also note that <a href=\"\/google-oauth-gmail-api-verification\/\" style=\"color:#2aaa7e;text-decoration:underline;\">OAuth scope verification<\/a> errors from the consent flow are completely separate from these runtime quota errors.<\/pee>\n    <\/div>\n  <\/div>\n<\/div>[\/et_pb_code][\/et_pb_column][\/et_pb_row][\/et_pb_section][et_pb_section fb_built=\"1\" _builder_version=\"4.16\" background_color=\"transparent\" custom_padding=\"0px|0px|0px|0px\" custom_padding_tablet=\"0px|0px|0px|0px\" custom_padding_phone=\"0px|0px|0px|0px\" global_colors_info=\"{}\" theme_builder_area=\"post_content\" da_is_popup=\"off\" da_exit_intent=\"off\" da_has_close=\"on\" da_alt_close=\"off\" da_dark_close=\"off\" da_not_modal=\"on\" da_is_singular=\"off\" da_with_loader=\"off\" da_has_shadow=\"on\" da_disable_devices=\"off|off|off\"][et_pb_row _builder_version=\"4.16\" background_size=\"initial\" background_position=\"top_left\" background_repeat=\"repeat\" custom_padding=\"0px|0px|0px|0px\" global_colors_info=\"{}\" theme_builder_area=\"post_content\"][et_pb_column type=\"4_4\" _builder_version=\"4.16\" custom_padding=\"|||\" global_colors_info=\"{}\" custom_padding__hover=\"|||\" theme_builder_area=\"post_content\"][et_pb_code _builder_version=\"4.16\" global_colors_info=\"{}\" theme_builder_area=\"post_content\"]<link href=\"https:\/\/fonts.googleapis.com\/css2?family=Inter:wght@400;500;600;700&#038;family=Poppins:wght@700;800&#038;display=swap\" rel=\"stylesheet\">\n<style>\n#upl-gal-cost,\n#upl-gal-cost *,\n#upl-gal-cost *::before,\n#upl-gal-cost *::after {\n  margin: 0 !important;\n  padding: 0 !important;\n  box-sizing: border-box !important;\n  border: none !important;\n  outline: none !important;\n  font-family: 'Inter', -apple-system, BlinkMacSystemFont, sans-serif !important;\n  line-height: 1.5 !important;\n  letter-spacing: normal !important;\n  text-transform: none !important;\n  text-decoration: none !important;\n  list-style: none !important;\n}\n#upl-gal-cost {\n  display: block !important;\n  padding: 70px 24px !important;\n  background: #f4f5f7 !important;\n  overflow-x: hidden !important;\n}\n#upl-gal-cost .galc-inner {\n  max-width: 1100px !important;\n  margin: 0 auto !important;\n}\n#upl-gal-cost .galuc-eyebrow {\n  display: inline-flex !important;\n  align-items: center !important;\n  gap: 8px !important;\n  background: rgba(221, 223, 76, 0.18) !important;\n  color: #8a8c2e !important;\n  padding: 6px 14px !important;\n  border-radius: 20px !important;\n  font-size: 12px !important;\n  font-weight: 700 !important;\n  text-transform: uppercase !important;\n  letter-spacing: 0.5px !important;\n  margin-bottom: 16px !important;\n  width: fit-content !important;\n}\n#upl-gal-cost .galuc-h2 {\n  font-family: 'Poppins', sans-serif !important;\n  font-size: 35px !important;\n  font-weight: 700 !important;\n  color: #0f2736 !important;\n  line-height: 1.2 !important;\n  margin-bottom: 14px !important;\n}\n#upl-gal-cost .galuc-intro {\n  font-size: 17px !important;\n  color: #383838 !important;\n  line-height: 1.75 !important;\n  margin-bottom: 36px !important;\n}\n#upl-gal-cost .galuc-table-wrap {\n  background: #ffffff !important;\n  border-radius: 16px !important;\n  border: 1px solid #e5e7eb !important;\n  overflow: hidden !important;\n  margin-bottom: 32px !important;\n}\n#upl-gal-cost .galuc-table {\n  width: 100% !important;\n  border-collapse: collapse !important;\n  display: table !important;\n}\n#upl-gal-cost .galuc-table thead tr {\n  background: #0f2736 !important;\n}\n#upl-gal-cost .galuc-table thead th {\n  padding: 14px 20px !important;\n  font-size: 12px !important;\n  font-weight: 700 !important;\n  color: #ffffff !important;\n  text-transform: uppercase !important;\n  letter-spacing: 0.6px !important;\n  text-align: left !important;\n}\n#upl-gal-cost .galuc-table tbody tr {\n  border-bottom: 1px solid #f0f1f3 !important;\n}\n#upl-gal-cost .galuc-table tbody tr:last-child {\n  border-bottom: none !important;\n}\n#upl-gal-cost .galuc-table tbody tr:hover {\n  background: rgba(59, 185, 139, 0.04) !important;\n}\n#upl-gal-cost .galuc-table td {\n  padding: 13px 20px !important;\n  font-size: 14px !important;\n  color: #383838 !important;\n  vertical-align: middle !important;\n}\n#upl-gal-cost .galuc-table .galuc-td-method {\n  font-family: 'Courier New', monospace !important;\n  font-size: 13px !important;\n  font-weight: 600 !important;\n  color: #0f2736 !important;\n}\n#upl-gal-cost .galuc-table .galuc-td-cost {\n  font-family: 'Poppins', sans-serif !important;\n  font-size: 15px !important;\n  font-weight: 700 !important;\n}\n#upl-gal-cost .galuc-table .galuc-cost-high {\n  color: #EA4335 !important;\n}\n#upl-gal-cost .galuc-table .galuc-cost-med {\n  color: #FBBC04 !important;\n}\n#upl-gal-cost .galuc-table .galuc-cost-low {\n  color: #3BB98B !important;\n}\n#upl-gal-cost .galuc-table .galuc-td-tip {\n  color: #64748b !important;\n  font-size: 13px !important;\n}\n#upl-gal-cost .galuc-callout {\n  background: #0f2736 !important;\n  border-radius: 14px !important;\n  padding: 24px 28px !important;\n  display: flex !important;\n  align-items: flex-start !important;\n  gap: 16px !important;\n  margin-bottom: 32px !important;\n}\n#upl-gal-cost .galuc-callout svg {\n  width: 22px !important;\n  height: 22px !important;\n  stroke: #3BB98B !important;\n  fill: none !important;\n  stroke-width: 2 !important;\n  stroke-linecap: round !important;\n  stroke-linejoin: round !important;\n  flex-shrink: 0 !important;\n  margin-top: 2px !important;\n}\n#upl-gal-cost .galuc-callout-text {\n  color: rgba(255, 255, 255, 0.85) !important;\n  font-size: 14px !important;\n  line-height: 1.7 !important;\n}\n#upl-gal-cost .galuc-callout-text strong {\n  color: #ffffff !important;\n  font-weight: 700 !important;\n}\n#upl-gal-cost .galuc-cta {\n  display: inline-flex !important;\n  align-items: center !important;\n  gap: 8px !important;\n  background: #DDDF4C !important;\n  color: #0f2736 !important;\n  padding: 12px 22px !important;\n  border-radius: 8px !important;\n  font-size: 0.9rem !important;\n  font-weight: 600 !important;\n  transition: transform 0.3s ease !important;\n  cursor: pointer !important;\n  white-space: nowrap !important;\n  text-decoration: none !important;\n}\n#upl-gal-cost .galuc-cta:hover {\n  transform: translateY(-5px) !important;\n}\n#upl-gal-cost .galuc-cta svg {\n  width: 14px !important;\n  height: 14px !important;\n  stroke: currentColor !important;\n  fill: none !important;\n  stroke-width: 2.5 !important;\n  stroke-linecap: round !important;\n  stroke-linejoin: round !important;\n  flex-shrink: 0 !important;\n}\n\n\/* Mobile: table -> cards *\/\n@media (max-width: 768px) {\n  #upl-gal-cost {\n    padding: 50px 16px !important;\n  }\n  #upl-gal-cost .galuc-h2 {\n    font-size: 26px !important;\n  }\n  #upl-gal-cost .galuc-intro {\n    font-size: 16px !important;\n  }\n  #upl-gal-cost .galuc-table {\n    display: none !important;\n  }\n  #upl-gal-cost .galuc-table-mobile {\n    display: flex !important;\n    flex-direction: column !important;\n    gap: 10px !important;\n  }\n  #upl-gal-cost .galuc-mob-row {\n    background: #ffffff !important;\n    border: 1px solid #e5e7eb !important;\n    border-radius: 12px !important;\n    padding: 14px 16px !important;\n    display: flex !important;\n    align-items: center !important;\n    justify-content: space-between !important;\n    gap: 12px !important;\n  }\n  #upl-gal-cost .galuc-mob-method {\n    font-family: 'Courier New', monospace !important;\n    font-size: 13px !important;\n    font-weight: 600 !important;\n    color: #0f2736 !important;\n    flex: 1 !important;\n  }\n  #upl-gal-cost .galuc-mob-cost {\n    font-family: 'Poppins', sans-serif !important;\n    font-size: 16px !important;\n    font-weight: 700 !important;\n    white-space: nowrap !important;\n  }\n}\n@media (min-width: 769px) {\n  #upl-gal-cost .galuc-table-mobile {\n    display: none !important;\n  }\n}\n@media (max-width: 480px) {\n  #upl-gal-cost .galuc-h2 {\n    font-size: 24px !important;\n  }\n}\n<\/style>\n\n<div id=\"upl-gal-cost\">\n  <span id=\"gal-unit-cost\" style=\"display:block;position:relative;top:-80px;visibility:hidden;\"><\/span>\n  <div class=\"galc-inner\">\n    <div class=\"galuc-eyebrow\"><span>Technical Reference<\/span><\/div>\n    <h2 class=\"galuc-h2\">Quota unit cost per method<\/h2>\n    <pee class=\"galuc-intro\">Not all Gmail API calls are equal. Google counts quota usage in abstract \"units\", and each method has a different cost. Knowing these costs lets you calculate your real request capacity and optimise which endpoints you call. The gmail api per user rate limit of 6,000 units\/min behaves very differently depending on your call mix.<\/pee>\n\n    <div class=\"galuc-table-wrap\">\n      <table class=\"galuc-table\">\n        <thead>\n          <tr>\n            <th>Method<\/th>\n            <th>Unit Cost<\/th>\n            <th>Requests \/ min (per user)<\/th>\n            <th>Optimization tip<\/th>\n          <\/tr>\n        <\/thead>\n        <tbody>\n          <tr>\n            <td class=\"galuc-td-method\">messages.send<\/td>\n            <td class=\"galuc-td-cost galuc-cost-high\">100<\/td>\n            <td>60 sends\/min max<\/td>\n            <td class=\"galuc-td-tip\">Highest cost - use draft + send only when needed<\/td>\n          <\/tr>\n          <tr>\n            <td class=\"galuc-td-method\">messages.insert<\/td>\n            <td class=\"galuc-td-cost galuc-cost-high\">25<\/td>\n            <td>240\/min max<\/td>\n            <td class=\"galuc-td-tip\">Inserting to mailbox - lower than send<\/td>\n          <\/tr>\n          <tr>\n            <td class=\"galuc-td-method\">threads.get<\/td>\n            <td class=\"galuc-td-cost galuc-cost-med\">10<\/td>\n            <td>600\/min max<\/td>\n            <td class=\"galuc-td-tip\">Prefer threads.get over multiple messages.get<\/td>\n          <\/tr>\n          <tr>\n            <td class=\"galuc-td-method\">messages.get<\/td>\n            <td class=\"galuc-td-cost galuc-cost-med\">5<\/td>\n            <td>1,200\/min max<\/td>\n            <td class=\"galuc-td-tip\">Add fields= partial response to keep cost at 5<\/td>\n          <\/tr>\n          <tr>\n            <td class=\"galuc-td-method\">messages.list<\/td>\n            <td class=\"galuc-td-cost galuc-cost-low\">5<\/td>\n            <td>1,200\/min max<\/td>\n            <td class=\"galuc-td-tip\">Use history.list instead for sync patterns<\/td>\n          <\/tr>\n          <tr>\n            <td class=\"galuc-td-method\">threads.list<\/td>\n            <td class=\"galuc-td-cost galuc-cost-low\">5<\/td>\n            <td>1,200\/min max<\/td>\n            <td class=\"galuc-td-tip\">Paginate with maxResults to reduce calls<\/td>\n          <\/tr>\n          <tr>\n            <td class=\"galuc-td-method\">users.history.list<\/td>\n            <td class=\"galuc-td-cost galuc-cost-low\">2<\/td>\n            <td>3,000\/min max<\/td>\n            <td class=\"galuc-td-tip\">Best for incremental sync - lowest cost polling<\/td>\n          <\/tr>\n          <tr>\n            <td class=\"galuc-td-method\">labels.list<\/td>\n            <td class=\"galuc-td-cost galuc-cost-low\">1<\/td>\n            <td>6,000\/min max<\/td>\n            <td class=\"galuc-td-tip\">Cache the result - labels rarely change<\/td>\n          <\/tr>\n          <tr>\n            <td class=\"galuc-td-method\">messages.modify<\/td>\n            <td class=\"galuc-td-cost galuc-cost-med\">5<\/td>\n            <td>1,200\/min max<\/td>\n            <td class=\"galuc-td-tip\">Use batchModify for bulk label updates<\/td>\n          <\/tr>\n          <tr>\n            <td class=\"galuc-td-method\">messages.attachments.get<\/td>\n            <td class=\"galuc-td-cost galuc-cost-med\">5<\/td>\n            <td>1,200\/min max<\/td>\n            <td class=\"galuc-td-tip\">Fetch attachments only when explicitly needed<\/td>\n          <\/tr>\n        <\/tbody>\n      <\/table>\n    <\/div>\n\n    <!-- Mobile card version -->\n    <div class=\"galuc-table-mobile\">\n      <div class=\"galuc-mob-row\"><span class=\"galuc-mob-method\">messages.send<\/span><span class=\"galuc-mob-cost galuc-cost-high\">100 units<\/span><\/div>\n      <div class=\"galuc-mob-row\"><span class=\"galuc-mob-method\">messages.insert<\/span><span class=\"galuc-mob-cost galuc-cost-high\">25 units<\/span><\/div>\n      <div class=\"galuc-mob-row\"><span class=\"galuc-mob-method\">threads.get<\/span><span class=\"galuc-mob-cost galuc-cost-med\">10 units<\/span><\/div>\n      <div class=\"galuc-mob-row\"><span class=\"galuc-mob-method\">messages.get<\/span><span class=\"galuc-mob-cost galuc-cost-med\">5 units<\/span><\/div>\n      <div class=\"galuc-mob-row\"><span class=\"galuc-mob-method\">messages.list<\/span><span class=\"galuc-mob-cost galuc-cost-low\">5 units<\/span><\/div>\n      <div class=\"galuc-mob-row\"><span class=\"galuc-mob-method\">threads.list<\/span><span class=\"galuc-mob-cost galuc-cost-low\">5 units<\/span><\/div>\n      <div class=\"galuc-mob-row\"><span class=\"galuc-mob-method\">users.history.list<\/span><span class=\"galuc-mob-cost galuc-cost-low\">2 units<\/span><\/div>\n      <div class=\"galuc-mob-row\"><span class=\"galuc-mob-method\">labels.list<\/span><span class=\"galuc-mob-cost galuc-cost-low\">1 unit<\/span><\/div>\n    <\/div>\n\n    <div class=\"galuc-callout\">\n      <svg viewBox=\"0 0 24 24\"><path d=\"M12 2l3.09 6.26L22 9.27l-5 4.87 1.18 6.88L12 17.77l-6.18 3.25L7 14.14 2 9.27l6.91-1.01L12 2z\"\/><\/svg>\n      <pee class=\"galuc-callout-text\"><strong>Pro tip:<\/strong> You can use the <code style=\"background:rgba(255,255,255,0.12);padding:2px 5px;border-radius:4px;font-family:Courier New,monospace;font-size:12px;\">fields=<\/code> query parameter for partial responses on any method. Requesting only the fields your application needs does not reduce the raw unit cost, but it dramatically reduces response payload size and latency - a worthwhile trade when you are near gmail api quota limits. Test your queries interactively using the <a href=\"\/gmail-api-oauth-playground\/\" style=\"color:#3BB98B;text-decoration:underline;\">Gmail OAuth Playground<\/a> before pushing to production.<\/pee>\n    <\/div>\n\n    <a class=\"galuc-cta\" href=\"https:\/\/dashboard.unipile.com\/signup\/\" target=\"_blank\" rel=\"noopener\"><span>Build your Gmail integration<\/span><svg viewBox=\"0 0 24 24\"><line x1=\"5\" y1=\"12\" x2=\"19\" y2=\"12\"\/><polyline points=\"12 5 19 12 12 19\"\/><\/svg><\/a>\n  <\/div>\n<\/div>[\/et_pb_code][\/et_pb_column][\/et_pb_row][\/et_pb_section][et_pb_section fb_built=\"1\" _builder_version=\"4.16\" background_color=\"transparent\" custom_padding=\"0px|0px|0px|0px\" custom_padding_tablet=\"0px|0px|0px|0px\" custom_padding_phone=\"0px|0px|0px|0px\" global_colors_info=\"{}\" theme_builder_area=\"post_content\" da_is_popup=\"off\" da_exit_intent=\"off\" da_has_close=\"on\" da_alt_close=\"off\" da_dark_close=\"off\" da_not_modal=\"on\" da_is_singular=\"off\" da_with_loader=\"off\" da_has_shadow=\"on\" da_disable_devices=\"off|off|off\"][et_pb_row _builder_version=\"4.16\" background_size=\"initial\" background_position=\"top_left\" background_repeat=\"repeat\" custom_padding=\"0px|0px|0px|0px\" global_colors_info=\"{}\" theme_builder_area=\"post_content\"][et_pb_column type=\"4_4\" _builder_version=\"4.16\" custom_padding=\"|||\" global_colors_info=\"{}\" custom_padding__hover=\"|||\" theme_builder_area=\"post_content\"][et_pb_code _builder_version=\"4.16\" global_colors_info=\"{}\" theme_builder_area=\"post_content\"]<link href=\"https:\/\/fonts.googleapis.com\/css2?family=Inter:wght@400;500;600;700&#038;family=Poppins:wght@700;800&#038;display=swap\" rel=\"stylesheet\">\n<style>\n#upl-gal-conc,\n#upl-gal-conc *,\n#upl-gal-conc *::before,\n#upl-gal-conc *::after {\n  margin: 0 !important;\n  padding: 0 !important;\n  box-sizing: border-box !important;\n  border: none !important;\n  outline: none !important;\n  font-family: 'Inter', -apple-system, BlinkMacSystemFont, sans-serif !important;\n  line-height: 1.5 !important;\n  letter-spacing: normal !important;\n  text-transform: none !important;\n  text-decoration: none !important;\n  list-style: none !important;\n}\n#upl-gal-conc {\n  display: block !important;\n  padding: 70px 24px !important;\n  overflow-x: hidden !important;\n}\n#upl-gal-conc .galcon-inner {\n  max-width: 1100px !important;\n  margin: 0 auto !important;\n}\n#upl-gal-conc .galcon-eyebrow {\n  display: inline-flex !important;\n  align-items: center !important;\n  gap: 8px !important;\n  background: rgba(234, 67, 53, 0.10) !important;\n  color: #c0392b !important;\n  padding: 6px 14px !important;\n  border-radius: 20px !important;\n  font-size: 12px !important;\n  font-weight: 700 !important;\n  text-transform: uppercase !important;\n  letter-spacing: 0.5px !important;\n  margin-bottom: 16px !important;\n  width: fit-content !important;\n}\n#upl-gal-conc .galcon-h2 {\n  font-family: 'Poppins', sans-serif !important;\n  font-size: 35px !important;\n  font-weight: 700 !important;\n  color: #0f2736 !important;\n  line-height: 1.2 !important;\n  margin-bottom: 14px !important;\n}\n#upl-gal-conc .galcon-intro {\n  font-size: 17px !important;\n  color: #383838 !important;\n  line-height: 1.75 !important;\n  margin-bottom: 36px !important;\n}\n#upl-gal-conc .galcon-grid {\n  display: grid !important;\n  grid-template-columns: 1fr 1fr !important;\n  gap: 24px !important;\n  margin-bottom: 36px !important;\n}\n#upl-gal-conc .galcon-card {\n  background: #ffffff !important;\n  border: 1px solid #e5e7eb !important;\n  border-radius: 16px !important;\n  padding: 24px !important;\n}\n#upl-gal-conc .galcon-card-title {\n  font-family: 'Poppins', sans-serif !important;\n  font-size: 15px !important;\n  font-weight: 700 !important;\n  color: #0f2736 !important;\n  margin-bottom: 12px !important;\n  display: flex !important;\n  align-items: center !important;\n  gap: 10px !important;\n}\n#upl-gal-conc .galcon-card-title svg {\n  width: 18px !important;\n  height: 18px !important;\n  stroke: #3BB98B !important;\n  fill: none !important;\n  stroke-width: 2 !important;\n  stroke-linecap: round !important;\n  stroke-linejoin: round !important;\n  flex-shrink: 0 !important;\n}\n#upl-gal-conc .galcon-card-text {\n  font-size: 14px !important;\n  color: #383838 !important;\n  line-height: 1.7 !important;\n}\n#upl-gal-conc .galcon-card-text strong {\n  color: #0f2736 !important;\n  font-weight: 600 !important;\n}\n#upl-gal-conc .galcon-highlight {\n  background: rgba(234, 67, 53, 0.06) !important;\n  border: 1px solid rgba(234, 67, 53, 0.20) !important;\n  border-radius: 12px !important;\n  padding: 20px 24px !important;\n  margin-bottom: 36px !important;\n}\n#upl-gal-conc .galcon-highlight-title {\n  font-family: 'Poppins', sans-serif !important;\n  font-size: 15px !important;\n  font-weight: 700 !important;\n  color: #c0392b !important;\n  margin-bottom: 10px !important;\n  display: flex !important;\n  align-items: center !important;\n  gap: 8px !important;\n}\n#upl-gal-conc .galcon-highlight-title svg {\n  width: 18px !important;\n  height: 18px !important;\n  stroke: #c0392b !important;\n  fill: none !important;\n  stroke-width: 2 !important;\n  stroke-linecap: round !important;\n  stroke-linejoin: round !important;\n  flex-shrink: 0 !important;\n}\n#upl-gal-conc .galcon-highlight-text {\n  font-size: 14px !important;\n  color: #383838 !important;\n  line-height: 1.7 !important;\n}\n#upl-gal-conc .galcon-highlight-text strong {\n  color: #0f2736 !important;\n  font-weight: 600 !important;\n}\n#upl-gal-conc .galcon-code-wrap {\n  background: #0d1117 !important;\n  border-radius: 12px !important;\n  overflow: hidden !important;\n  margin-bottom: 24px !important;\n}\n#upl-gal-conc .galcon-code-bar {\n  background: #161b22 !important;\n  padding: 10px 16px !important;\n  display: flex !important;\n  align-items: center !important;\n  gap: 8px !important;\n  border-bottom: 1px solid rgba(255,255,255,0.06) !important;\n}\n#upl-gal-conc .galcon-code-bar span {\n  color: #8b949e !important;\n  font-size: 12px !important;\n  font-family: 'Courier New', monospace !important;\n}\n#upl-gal-conc .galcon-pre {\n  padding: 18px 20px !important;\n  font-size: 13px !important;\n  line-height: 1.75 !important;\n  background: #0d1117 !important;\n  overflow-x: auto !important;\n}\n#upl-gal-conc .galcon-pre code {\n  font-family: 'Courier New', monospace !important;\n  white-space: pre-wrap !important;\n  word-break: break-word !important;\n  display: block !important;\n  color: #e6edf3 !important;\n}\n#upl-gal-conc .gck { color: #ff7b72 !important; }\n#upl-gal-conc .gcfn { color: #d2a8ff !important; }\n#upl-gal-conc .gcs { color: #a5d6ff !important; }\n#upl-gal-conc .gcn { color: #79c0ff !important; }\n#upl-gal-conc .gcc { color: #8b949e !important; }\n#upl-gal-conc .gcw { color: #e6edf3 !important; }\n\n@media (max-width: 768px) {\n  #upl-gal-conc {\n    padding: 50px 16px !important;\n  }\n  #upl-gal-conc .galcon-h2 {\n    font-size: 26px !important;\n  }\n  #upl-gal-conc .galcon-intro {\n    font-size: 16px !important;\n  }\n  #upl-gal-conc .galcon-grid {\n    grid-template-columns: 1fr !important;\n  }\n}\n@media (max-width: 480px) {\n  #upl-gal-conc .galcon-h2 {\n    font-size: 24px !important;\n  }\n}\n<\/style>\n\n<div id=\"upl-gal-conc\">\n  <span id=\"gal-concurrent\" style=\"display:block;position:relative;top:-80px;visibility:hidden;\"><\/span>\n  <div class=\"galcon-inner\">\n    <div class=\"galcon-eyebrow\"><span>Hidden Limit<\/span><\/div>\n    <h2 class=\"galcon-h2\">The hidden 50-concurrent-requests-per-mailbox limit<\/h2>\n    <pee class=\"galcon-intro\">There is a limit most Gmail API tutorials never mention, yet it is the cause of mysterious 429 errors in multi-threaded or async applications: Gmail enforces a maximum of <strong>50 concurrent in-flight requests per mailbox<\/strong>. This limit is completely independent of your quota unit budget. You can be at 500 quota units out of 6,000 available and still receive a 429 if you have 51 requests open simultaneously against the same authenticated user's mailbox.<\/pee>\n\n    <div class=\"galcon-highlight\">\n      <pee class=\"galcon-highlight-title\">\n        <svg viewBox=\"0 0 24 24\"><path d=\"M10.29 3.86L1.82 18a2 2 0 0 0 1.71 3h16.94a2 2 0 0 0 1.71-3L13.71 3.86a2 2 0 0 0-3.42 0z\"\/><line x1=\"12\" y1=\"9\" x2=\"12\" y2=\"13\"\/><line x1=\"12\" y1=\"17\" x2=\"12.01\" y2=\"17\"\/><\/svg>\n        <span>Why this surprises developers<\/span>\n      <\/pee>\n      <pee class=\"galcon-highlight-text\">Async frameworks like Node.js <code style=\"background:rgba(0,0,0,0.06);padding:2px 5px;border-radius:4px;font-family:Courier New,monospace;font-size:12px;\">Promise.all()<\/code> or Python <code style=\"background:rgba(0,0,0,0.06);padding:2px 5px;border-radius:4px;font-family:Courier New,monospace;font-size:12px;\">asyncio.gather()<\/code> make it trivially easy to fire 100+ concurrent requests. When you process a mailbox sync and fan out to fetch 200 messages simultaneously <strong>on behalf of a single authenticated user<\/strong>, Gmail sees 200 open TCP connections against one mailbox and immediately throttles. The quota dashboard in GCP will show plenty of remaining units - the 50-concurrent ceiling is not exposed as a quota metric.<\/pee>\n    <\/div>\n\n    <div class=\"galcon-grid\">\n      <div class=\"galcon-card\">\n        <pee class=\"galcon-card-title\">\n          <svg viewBox=\"0 0 24 24\"><circle cx=\"12\" cy=\"12\" r=\"10\"\/><polyline points=\"12 6 12 12 16 14\"\/><\/svg>\n          <span>When it triggers<\/span>\n        <\/pee>\n        <pee class=\"galcon-card-text\">The 50-concurrent limit fires during bulk mailbox sync operations: fetching large threads, downloading attachments for many messages simultaneously, or paginating through large label counts while also processing results concurrently. Any code that launches more than 50 in-flight requests to the same mailbox will hit this limit.<\/pee>\n      <\/div>\n      <div class=\"galcon-card\">\n        <pee class=\"galcon-card-title\">\n          <svg viewBox=\"0 0 24 24\"><polyline points=\"20 6 9 17 4 12\"\/><\/svg>\n          <span>How to fix it<\/span>\n        <\/pee>\n        <pee class=\"galcon-card-text\">Use a concurrency limiter (semaphore) scoped per authenticated user. In Node.js, libraries like <code style=\"background:rgba(0,0,0,0.06);padding:2px 5px;border-radius:4px;font-family:Courier New,monospace;font-size:12px;\">p-limit<\/code> work well. In Python, an <code style=\"background:rgba(0,0,0,0.06);padding:2px 5px;border-radius:4px;font-family:Courier New,monospace;font-size:12px;\">asyncio.Semaphore(40)<\/code> with a safe margin below 50 prevents the burst. Keep your per-user concurrency at <strong>40 or below<\/strong> for safety margin.<\/pee>\n      <\/div>\n    <\/div>\n\n    <div class=\"galcon-code-wrap\">\n      <div class=\"galcon-code-bar\">\n        <span>concurrency-limiter.js - safe per-user Gmail API calls<\/span>\n      <\/div>\n      <div class=\"galcon-pre\"><code><span class=\"gcc\">\/\/ p-limit keeps per-user concurrency under 40<\/span>\n<span class=\"gck\">import<\/span><span class=\"gcw\"> pLimit <\/span><span class=\"gck\">from<\/span><span class=\"gcs\"> 'p-limit'<\/span><span class=\"gcw\">;<\/span>\n\n<span class=\"gcc\">\/\/ One limiter instance per authenticated user (keyed by userId)<\/span>\n<span class=\"gck\">const<\/span><span class=\"gcw\"> userLimiters = <\/span><span class=\"gck\">new<\/span><span class=\"gcw\"> Map();<\/span>\n\n<span class=\"gck\">function<\/span> <span class=\"gcfn\">getLimiter<\/span><span class=\"gcw\">(userId) {<\/span>\n<span class=\"gck\">  if<\/span><span class=\"gcw\"> (!userLimiters.<\/span><span class=\"gcfn\">has<\/span><span class=\"gcw\">(userId)) {<\/span>\n<span class=\"gcw\">    userLimiters.<\/span><span class=\"gcfn\">set<\/span><span class=\"gcw\">(userId, <\/span><span class=\"gcfn\">pLimit<\/span><span class=\"gcw\">(<\/span><span class=\"gcn\">40<\/span><span class=\"gcw\">));<\/span>\n<span class=\"gcw\">  }<\/span>\n<span class=\"gck\">  return<\/span><span class=\"gcw\"> userLimiters.<\/span><span class=\"gcfn\">get<\/span><span class=\"gcw\">(userId);<\/span>\n<span class=\"gcw\">}<\/span>\n\n<span class=\"gcc\">\/\/ Wrap each Gmail API call with the user's limiter<\/span>\n<span class=\"gck\">async function<\/span> <span class=\"gcfn\">fetchMessage<\/span><span class=\"gcw\">(gmail, userId, messageId) {<\/span>\n<span class=\"gck\">  const<\/span><span class=\"gcw\"> limit = <\/span><span class=\"gcfn\">getLimiter<\/span><span class=\"gcw\">(userId);<\/span>\n<span class=\"gck\">  return<\/span><span class=\"gcw\"> limit(() => gmail.users.messages.<\/span><span class=\"gcfn\">get<\/span><span class=\"gcw\">({<\/span>\n<span class=\"gcw\">    userId: <\/span><span class=\"gcs\">'me'<\/span><span class=\"gcw\">,<\/span>\n<span class=\"gcw\">    id: messageId,<\/span>\n<span class=\"gcw\">    fields: <\/span><span class=\"gcs\">'id,threadId,payload.headers,snippet'<\/span>\n<span class=\"gcw\">  }));<\/span>\n<span class=\"gcw\">}<\/span><\/code><\/div>\n    <\/div>\n  <\/div>\n<\/div>[\/et_pb_code][\/et_pb_column][\/et_pb_row][\/et_pb_section][et_pb_section fb_built=\"1\" _builder_version=\"4.16\" background_color=\"transparent\" custom_padding=\"0px|0px|0px|0px\" custom_padding_tablet=\"0px|0px|0px|0px\" custom_padding_phone=\"0px|0px|0px|0px\" global_colors_info=\"{}\" theme_builder_area=\"post_content\" da_is_popup=\"off\" da_exit_intent=\"off\" da_has_close=\"on\" da_alt_close=\"off\" da_dark_close=\"off\" da_not_modal=\"on\" da_is_singular=\"off\" da_with_loader=\"off\" da_has_shadow=\"on\" da_disable_devices=\"off|off|off\"][et_pb_row _builder_version=\"4.16\" background_size=\"initial\" background_position=\"top_left\" background_repeat=\"repeat\" custom_padding=\"0px|0px|0px|0px\" global_colors_info=\"{}\" theme_builder_area=\"post_content\"][et_pb_column type=\"4_4\" _builder_version=\"4.16\" custom_padding=\"|||\" global_colors_info=\"{}\" custom_padding__hover=\"|||\" theme_builder_area=\"post_content\"][et_pb_code _builder_version=\"4.16\" global_colors_info=\"{}\" theme_builder_area=\"post_content\"]<link href=\"https:\/\/fonts.googleapis.com\/css2?family=Inter:wght@400;500;600;700&#038;family=Poppins:wght@700;800&#038;display=swap\" rel=\"stylesheet\">\n<style>\n#upl-gal-errors,\n#upl-gal-errors *,\n#upl-gal-errors *::before,\n#upl-gal-errors *::after {\n  margin: 0 !important;\n  padding: 0 !important;\n  box-sizing: border-box !important;\n  border: none !important;\n  outline: none !important;\n  font-family: 'Inter', -apple-system, BlinkMacSystemFont, sans-serif !important;\n  line-height: 1.5 !important;\n  letter-spacing: normal !important;\n  text-transform: none !important;\n  text-decoration: none !important;\n  list-style: none !important;\n}\n#upl-gal-errors {\n  display: block !important;\n  padding: 70px 24px !important;\n  background: #f4f5f7 !important;\n  overflow-x: hidden !important;\n}\n#upl-gal-errors .galer-inner {\n  max-width: 1100px !important;\n  margin: 0 auto !important;\n}\n#upl-gal-errors .galer-eyebrow {\n  display: inline-flex !important;\n  align-items: center !important;\n  gap: 8px !important;\n  background: rgba(59, 185, 139, 0.12) !important;\n  color: #2aaa7e !important;\n  padding: 6px 14px !important;\n  border-radius: 20px !important;\n  font-size: 12px !important;\n  font-weight: 700 !important;\n  text-transform: uppercase !important;\n  letter-spacing: 0.5px !important;\n  margin-bottom: 16px !important;\n  width: fit-content !important;\n}\n#upl-gal-errors .galer-dot {\n  width: 7px !important;\n  height: 7px !important;\n  background: #3BB98B !important;\n  border-radius: 50% !important;\n  flex-shrink: 0 !important;\n  display: inline-block !important;\n}\n#upl-gal-errors .galer-h2 {\n  font-family: 'Poppins', sans-serif !important;\n  font-size: 35px !important;\n  font-weight: 700 !important;\n  color: #0f2736 !important;\n  line-height: 1.2 !important;\n  margin-bottom: 14px !important;\n}\n#upl-gal-errors .galer-intro {\n  font-size: 17px !important;\n  color: #383838 !important;\n  line-height: 1.75 !important;\n  margin-bottom: 36px !important;\n}\n#upl-gal-errors .galer-table-wrap {\n  background: #ffffff !important;\n  border-radius: 16px !important;\n  border: 1px solid #e5e7eb !important;\n  overflow: hidden !important;\n  margin-bottom: 36px !important;\n}\n#upl-gal-errors .galer-table {\n  width: 100% !important;\n  border-collapse: collapse !important;\n  display: table !important;\n}\n#upl-gal-errors .galer-table thead tr {\n  background: #0f2736 !important;\n}\n#upl-gal-errors .galer-table thead th {\n  padding: 14px 20px !important;\n  font-size: 12px !important;\n  font-weight: 700 !important;\n  color: #ffffff !important;\n  text-transform: uppercase !important;\n  letter-spacing: 0.6px !important;\n  text-align: left !important;\n}\n#upl-gal-errors .galer-table tbody tr {\n  border-bottom: 1px solid #f0f1f3 !important;\n}\n#upl-gal-errors .galer-table tbody tr:last-child {\n  border-bottom: none !important;\n}\n#upl-gal-errors .galer-table tbody tr:hover {\n  background: rgba(59, 185, 139, 0.04) !important;\n}\n#upl-gal-errors .galer-table td {\n  padding: 16px 20px !important;\n  font-size: 14px !important;\n  color: #383838 !important;\n  vertical-align: top !important;\n}\n#upl-gal-errors .galer-code-badge {\n  display: inline-block !important;\n  font-family: 'Courier New', monospace !important;\n  font-size: 12px !important;\n  font-weight: 700 !important;\n  padding: 3px 8px !important;\n  border-radius: 6px !important;\n  white-space: nowrap !important;\n}\n#upl-gal-errors .galer-badge-429 {\n  background: rgba(234, 67, 53, 0.12) !important;\n  color: #c0392b !important;\n}\n#upl-gal-errors .galer-badge-403 {\n  background: rgba(251, 188, 4, 0.15) !important;\n  color: #8a6200 !important;\n}\n#upl-gal-errors .galer-error-name {\n  font-family: 'Courier New', monospace !important;\n  font-size: 12.5px !important;\n  font-weight: 600 !important;\n  color: #0f2736 !important;\n  display: block !important;\n  margin-bottom: 4px !important;\n}\n#upl-gal-errors .galer-td-cause {\n  color: #383838 !important;\n  font-size: 14px !important;\n  line-height: 1.6 !important;\n}\n#upl-gal-errors .galer-td-fix {\n  color: #383838 !important;\n  font-size: 14px !important;\n  line-height: 1.6 !important;\n}\n#upl-gal-errors .galer-td-fix strong {\n  color: #0f2736 !important;\n  font-weight: 600 !important;\n}\n#upl-gal-errors .galer-note {\n  background: #ffffff !important;\n  border: 1px solid #e5e7eb !important;\n  border-radius: 12px !important;\n  padding: 20px 24px !important;\n  margin-bottom: 24px !important;\n  font-size: 14px !important;\n  color: #383838 !important;\n  line-height: 1.7 !important;\n}\n#upl-gal-errors .galer-note strong {\n  color: #0f2736 !important;\n  font-weight: 700 !important;\n}\n#upl-gal-errors .galer-note a {\n  color: #2aaa7e !important;\n  text-decoration: underline !important;\n}\n\n\/* Mobile: table -> cards *\/\n@media (max-width: 768px) {\n  #upl-gal-errors {\n    padding: 50px 16px !important;\n  }\n  #upl-gal-errors .galer-h2 {\n    font-size: 26px !important;\n  }\n  #upl-gal-errors .galer-intro {\n    font-size: 16px !important;\n  }\n  #upl-gal-errors .galer-table {\n    display: none !important;\n  }\n  #upl-gal-errors .galer-table-mobile {\n    display: flex !important;\n    flex-direction: column !important;\n    gap: 12px !important;\n  }\n  #upl-gal-errors .galer-mob-card {\n    background: #ffffff !important;\n    border: 1px solid #e5e7eb !important;\n    border-radius: 14px !important;\n    padding: 18px !important;\n  }\n  #upl-gal-errors .galer-mob-top {\n    display: flex !important;\n    align-items: center !important;\n    gap: 10px !important;\n    margin-bottom: 10px !important;\n    flex-wrap: wrap !important;\n  }\n  #upl-gal-errors .galer-mob-cause {\n    font-size: 13px !important;\n    color: #383838 !important;\n    margin-bottom: 8px !important;\n    line-height: 1.6 !important;\n  }\n  #upl-gal-errors .galer-mob-fix {\n    font-size: 13px !important;\n    color: #383838 !important;\n    line-height: 1.6 !important;\n    padding-top: 8px !important;\n    border-top: 1px solid #f0f1f3 !important;\n  }\n}\n@media (min-width: 769px) {\n  #upl-gal-errors .galer-table-mobile {\n    display: none !important;\n  }\n}\n@media (max-width: 480px) {\n  #upl-gal-errors .galer-h2 {\n    font-size: 24px !important;\n  }\n}\n<\/style>\n\n<div id=\"upl-gal-errors\">\n  <span id=\"gal-errors\" style=\"display:block;position:relative;top:-80px;visibility:hidden;\"><\/span>\n  <div class=\"galer-inner\">\n    <div class=\"galer-eyebrow\"><span class=\"galer-dot\"><\/span><span>Error Reference<\/span><\/div>\n    <h2 class=\"galer-h2\">Decoding the errors: 429 vs 403<\/h2>\n    <pee class=\"galer-intro\">Gmail API returns two different HTTP status codes for quota and access problems: 429 (Too Many Requests) and 403 (Forbidden). Within those two codes there are four distinct error reasons, each with a different root cause and different resolution. Conflating them wastes debugging time. Note: OAuth flow errors like <code style=\"background:rgba(0,0,0,0.06);padding:2px 5px;border-radius:4px;font-family:Courier New,monospace;font-size:12px;\">invalid_grant<\/code> are <a href=\"\/google-oauth-refresh-token-expiry\/\" style=\"color:#2aaa7e;text-decoration:underline;\">refresh token errors<\/a> - they are completely separate from these runtime gmail api rate limits.<\/pee>\n\n    <div class=\"galer-table-wrap\">\n      <table class=\"galer-table\">\n        <thead>\n          <tr>\n            <th>HTTP Code<\/th>\n            <th>Error Reason<\/th>\n            <th>Cause<\/th>\n            <th>Fix<\/th>\n          <\/tr>\n        <\/thead>\n        <tbody>\n          <tr>\n            <td><span class=\"galer-code-badge galer-badge-429\">429<\/span><\/td>\n            <td><span class=\"galer-error-name\">rateLimitExceeded<\/span><\/td>\n            <td class=\"galer-td-cause\">Exceeded 1.2M quota units\/min at the GCP project level. All authenticated users in the project collectively hit the ceiling.<\/td>\n            <td class=\"galer-td-fix\"><strong>Exponential backoff + jitter.<\/strong> Wait and retry. Long-term: shard into multiple GCP projects or request a quota increase.<\/td>\n          <\/tr>\n          <tr>\n            <td><span class=\"galer-code-badge galer-badge-429\">429<\/span><\/td>\n            <td><span class=\"galer-error-name\">userRateLimitExceeded<\/span><\/td>\n            <td class=\"galer-td-cause\">A single authenticated user exceeded 6,000 quota units\/min, OR exceeded 50 concurrent requests to their mailbox. The most common production 429.<\/td>\n            <td class=\"galer-td-fix\"><strong>Per-user queue with concurrency limiter.<\/strong> Apply the semaphore pattern (max 40 concurrent). Add exponential backoff on 429 retry.<\/td>\n          <\/tr>\n          <tr>\n            <td><span class=\"galer-code-badge galer-badge-403\">403<\/span><\/td>\n            <td><span class=\"galer-error-name\">dailyLimitExceeded<\/span><\/td>\n            <td class=\"galer-td-cause\">The GCP project consumed all 80M daily quota units before midnight Pacific. Cannot be retried until reset. This is a hard stop.<\/td>\n            <td class=\"galer-td-fix\"><strong>Wait for midnight Pacific reset<\/strong> or request a quota increase via GCP console. Implement daily quota budgeting per user in your app.<\/td>\n          <\/tr>\n          <tr>\n            <td><span class=\"galer-code-badge galer-badge-403\">403<\/span><\/td>\n            <td><span class=\"galer-error-name\">quotaExceeded<\/span><\/td>\n            <td class=\"galer-td-cause\">A specific sub-quota was exceeded. Can also indicate the Gmail send quota (500 emails\/day free, 2,000 Workspace) was hit for a specific sender address.<\/td>\n            <td class=\"galer-td-fix\"><strong>Check which quota.<\/strong> For send quota: switch sending address or wait 24h. For other sub-quotas: identify the specific metric in GCP quotas dashboard.<\/td>\n          <\/tr>\n        <\/tbody>\n      <\/table>\n    <\/div>\n\n    <!-- Mobile card version -->\n    <div class=\"galer-table-mobile\">\n      <div class=\"galer-mob-card\">\n        <div class=\"galer-mob-top\">\n          <span class=\"galer-code-badge galer-badge-429\">429<\/span>\n          <span class=\"galer-error-name\">rateLimitExceeded<\/span>\n        <\/div>\n        <pee class=\"galer-mob-cause\">Project-level ceiling hit: 1.2M quota units\/min across all users.<\/pee>\n        <pee class=\"galer-mob-fix\"><strong>Fix:<\/strong> Exponential backoff + jitter. Long-term: multiple GCP projects or quota increase request.<\/pee>\n      <\/div>\n      <div class=\"galer-mob-card\">\n        <div class=\"galer-mob-top\">\n          <span class=\"galer-code-badge galer-badge-429\">429<\/span>\n          <span class=\"galer-error-name\">userRateLimitExceeded<\/span>\n        <\/div>\n        <pee class=\"galer-mob-cause\">Single user exceeded 6,000 units\/min OR 50 concurrent requests. Most common 429.<\/pee>\n        <pee class=\"galer-mob-fix\"><strong>Fix:<\/strong> Per-user queue + semaphore (max 40 concurrent). Add backoff retry.<\/pee>\n      <\/div>\n      <div class=\"galer-mob-card\">\n        <div class=\"galer-mob-top\">\n          <span class=\"galer-code-badge galer-badge-403\">403<\/span>\n          <span class=\"galer-error-name\">dailyLimitExceeded<\/span>\n        <\/div>\n        <pee class=\"galer-mob-cause\">Project consumed all 80M daily quota units. Hard stop until midnight Pacific.<\/pee>\n        <pee class=\"galer-mob-fix\"><strong>Fix:<\/strong> Wait for reset or request quota increase via GCP console.<\/pee>\n      <\/div>\n      <div class=\"galer-mob-card\">\n        <div class=\"galer-mob-top\">\n          <span class=\"galer-code-badge galer-badge-403\">403<\/span>\n          <span class=\"galer-error-name\">quotaExceeded<\/span>\n        <\/div>\n        <pee class=\"galer-mob-cause\">Sub-quota or Gmail send quota (500\/day free, 2,000 Workspace) hit for sender.<\/pee>\n        <pee class=\"galer-mob-fix\"><strong>Fix:<\/strong> Check GCP dashboard for specific sub-quota. For send: switch address or wait 24h.<\/pee>\n      <\/div>\n    <\/div>\n\n    <div class=\"galer-note\">\n      <strong>Do not confuse these with OAuth errors.<\/strong> Errors like <code style=\"background:rgba(0,0,0,0.06);padding:2px 5px;border-radius:4px;font-family:Courier New,monospace;font-size:12px;\">invalid_grant<\/code>, <code style=\"background:rgba(0,0,0,0.06);padding:2px 5px;border-radius:4px;font-family:Courier New,monospace;font-size:12px;\">access_denied<\/code>, and <code style=\"background:rgba(0,0,0,0.06);padding:2px 5px;border-radius:4px;font-family:Courier New,monospace;font-size:12px;\">invalid_client<\/code> come from the OAuth token exchange layer, not from Gmail API quota enforcement. They are covered separately in the <a href=\"\/google-oauth-errors-debugging\/\">Google OAuth errors guide<\/a>. If you see a 401 Unauthorized, that is also an authentication issue - check your <a href=\"\/google-oauth-gmail-api-verification\/\">OAuth app verification<\/a> status and whether the <a href=\"\/google-oauth-refresh-token-expiry\/\">refresh token has expired<\/a>.\n    <\/div>\n  <\/div>\n<\/div>[\/et_pb_code][\/et_pb_column][\/et_pb_row][\/et_pb_section][et_pb_section fb_built=\"1\" _builder_version=\"4.16\" background_color=\"transparent\" custom_padding=\"0px|0px|0px|0px\" custom_padding_tablet=\"0px|0px|0px|0px\" custom_padding_phone=\"0px|0px|0px|0px\" global_colors_info=\"{}\" theme_builder_area=\"post_content\" da_is_popup=\"off\" da_exit_intent=\"off\" da_has_close=\"on\" da_alt_close=\"off\" da_dark_close=\"off\" da_not_modal=\"on\" da_is_singular=\"off\" da_with_loader=\"off\" da_has_shadow=\"on\" da_disable_devices=\"off|off|off\"][et_pb_row _builder_version=\"4.16\" background_size=\"initial\" background_position=\"top_left\" background_repeat=\"repeat\" custom_padding=\"0px|0px|0px|0px\" global_colors_info=\"{}\" theme_builder_area=\"post_content\"][et_pb_column type=\"4_4\" _builder_version=\"4.16\" custom_padding=\"|||\" global_colors_info=\"{}\" custom_padding__hover=\"|||\" theme_builder_area=\"post_content\"][et_pb_code _builder_version=\"4.16\" global_colors_info=\"{}\" theme_builder_area=\"post_content\"]<link href=\"https:\/\/fonts.googleapis.com\/css2?family=Inter:wght@400;500;600;700&#038;family=Poppins:wght@700;800&#038;display=swap\" rel=\"stylesheet\">\n<style>\n#upl-gal-backoff,\n#upl-gal-backoff *,\n#upl-gal-backoff *::before,\n#upl-gal-backoff *::after {\n  margin: 0 !important;\n  padding: 0 !important;\n  box-sizing: border-box !important;\n  border: none !important;\n  outline: none !important;\n  font-family: 'Inter', -apple-system, BlinkMacSystemFont, sans-serif !important;\n  line-height: 1.5 !important;\n  letter-spacing: normal !important;\n  text-transform: none !important;\n  text-decoration: none !important;\n  list-style: none !important;\n}\n#upl-gal-backoff {\n  display: block !important;\n  padding: 70px 24px !important;\n  overflow-x: hidden !important;\n}\n#upl-gal-backoff .galbo-inner {\n  max-width: 1100px !important;\n  margin: 0 auto !important;\n}\n#upl-gal-backoff .galbo-eyebrow {\n  display: inline-flex !important;\n  align-items: center !important;\n  gap: 8px !important;\n  background: rgba(221, 223, 76, 0.18) !important;\n  color: #8a8c2e !important;\n  padding: 6px 14px !important;\n  border-radius: 20px !important;\n  font-size: 12px !important;\n  font-weight: 700 !important;\n  text-transform: uppercase !important;\n  letter-spacing: 0.5px !important;\n  margin-bottom: 16px !important;\n  width: fit-content !important;\n}\n#upl-gal-backoff .galbo-h2 {\n  font-family: 'Poppins', sans-serif !important;\n  font-size: 35px !important;\n  font-weight: 700 !important;\n  color: #0f2736 !important;\n  line-height: 1.2 !important;\n  margin-bottom: 14px !important;\n}\n#upl-gal-backoff .galbo-intro {\n  font-size: 17px !important;\n  color: #383838 !important;\n  line-height: 1.75 !important;\n  margin-bottom: 36px !important;\n}\n#upl-gal-backoff .galbo-code-wrap {\n  background: #0d1117 !important;\n  border-radius: 14px !important;\n  overflow: hidden !important;\n  margin-bottom: 32px !important;\n}\n#upl-gal-backoff .galbo-code-bar {\n  background: #161b22 !important;\n  padding: 12px 18px !important;\n  display: flex !important;\n  align-items: center !important;\n  gap: 8px !important;\n  border-bottom: 1px solid rgba(255,255,255,0.06) !important;\n}\n#upl-gal-backoff .galbo-dot-r { width: 12px !important; height: 12px !important; border-radius: 50% !important; background: #ff5f57 !important; flex-shrink: 0 !important; display: inline-block !important; }\n#upl-gal-backoff .galbo-dot-y { width: 12px !important; height: 12px !important; border-radius: 50% !important; background: #febc2e !important; flex-shrink: 0 !important; display: inline-block !important; }\n#upl-gal-backoff .galbo-dot-g { width: 12px !important; height: 12px !important; border-radius: 50% !important; background: #28c840 !important; flex-shrink: 0 !important; display: inline-block !important; }\n#upl-gal-backoff .galbo-filename {\n  color: #8b949e !important;\n  font-size: 13px !important;\n  margin-left: 6px !important;\n  font-family: 'Courier New', monospace !important;\n  line-height: 1 !important;\n}\n#upl-gal-backoff .galbo-tabs {\n  display: flex !important;\n  background: #161b22 !important;\n  border-bottom: 1px solid rgba(255,255,255,0.06) !important;\n  gap: 0 !important;\n}\n#upl-gal-backoff .galbo-tab {\n  padding: 8px 16px !important;\n  font-size: 12px !important;\n  font-weight: 600 !important;\n  color: #8b949e !important;\n  cursor: pointer !important;\n  transition: all 0.2s ease !important;\n  border-bottom: 2px solid transparent !important;\n  font-family: 'Courier New', monospace !important;\n  background: transparent !important;\n}\n#upl-gal-backoff .galbo-tab.active {\n  color: #3BB98B !important;\n  border-bottom-color: #3BB98B !important;\n}\n#upl-gal-backoff .galbo-code-pane {\n  display: none !important;\n}\n#upl-gal-backoff .galbo-code-pane.active {\n  display: block !important;\n}\n#upl-gal-backoff .galbo-pre {\n  padding: 22px 24px !important;\n  font-size: 13px !important;\n  line-height: 1.8 !important;\n  background: #0d1117 !important;\n  overflow-x: auto !important;\n}\n#upl-gal-backoff .galbo-pre code {\n  font-family: 'Courier New', monospace !important;\n  white-space: pre-wrap !important;\n  word-break: break-word !important;\n  display: block !important;\n  color: #e6edf3 !important;\n}\n#upl-gal-backoff .bk { color: #ff7b72 !important; }\n#upl-gal-backoff .bfn { color: #d2a8ff !important; }\n#upl-gal-backoff .bs { color: #a5d6ff !important; }\n#upl-gal-backoff .bn { color: #79c0ff !important; }\n#upl-gal-backoff .bc { color: #8b949e !important; }\n#upl-gal-backoff .bw { color: #e6edf3 !important; }\n#upl-gal-backoff .galbo-ok-strip {\n  background: rgba(59, 185, 139, 0.1) !important;\n  border-top: 1px solid rgba(59, 185, 139, 0.25) !important;\n  color: #3BB98B !important;\n  padding: 10px 24px !important;\n  font-size: 12px !important;\n  font-family: 'Courier New', monospace !important;\n  display: flex !important;\n  align-items: center !important;\n  gap: 8px !important;\n}\n#upl-gal-backoff .galbo-ok-strip svg {\n  width: 14px !important;\n  height: 14px !important;\n  stroke: #3BB98B !important;\n  fill: none !important;\n  stroke-width: 2.5 !important;\n  stroke-linecap: round !important;\n  stroke-linejoin: round !important;\n  flex-shrink: 0 !important;\n}\n#upl-gal-backoff .galbo-rules {\n  display: grid !important;\n  grid-template-columns: repeat(3, 1fr) !important;\n  gap: 16px !important;\n  margin-bottom: 36px !important;\n}\n#upl-gal-backoff .galbo-rule {\n  background: #f4f5f7 !important;\n  border-radius: 12px !important;\n  padding: 18px !important;\n}\n#upl-gal-backoff .galbo-rule-num {\n  font-family: 'Poppins', sans-serif !important;\n  font-size: 28px !important;\n  font-weight: 700 !important;\n  color: #3BB98B !important;\n  line-height: 1 !important;\n  margin-bottom: 8px !important;\n  display: block !important;\n}\n#upl-gal-backoff .galbo-rule-title {\n  font-size: 14px !important;\n  font-weight: 700 !important;\n  color: #0f2736 !important;\n  margin-bottom: 6px !important;\n}\n#upl-gal-backoff .galbo-rule-text {\n  font-size: 13px !important;\n  color: #64748b !important;\n  line-height: 1.6 !important;\n}\n#upl-gal-backoff .galbo-cta {\n  display: inline-flex !important;\n  align-items: center !important;\n  gap: 8px !important;\n  background: #DDDF4C !important;\n  color: #0f2736 !important;\n  padding: 12px 22px !important;\n  border-radius: 8px !important;\n  font-size: 0.9rem !important;\n  font-weight: 600 !important;\n  transition: transform 0.3s ease !important;\n  cursor: pointer !important;\n  white-space: nowrap !important;\n  text-decoration: none !important;\n}\n#upl-gal-backoff .galbo-cta:hover {\n  transform: translateY(-5px) !important;\n}\n#upl-gal-backoff .galbo-cta svg {\n  width: 14px !important;\n  height: 14px !important;\n  stroke: currentColor !important;\n  fill: none !important;\n  stroke-width: 2.5 !important;\n  stroke-linecap: round !important;\n  stroke-linejoin: round !important;\n  flex-shrink: 0 !important;\n}\n\n@media (max-width: 768px) {\n  #upl-gal-backoff {\n    padding: 50px 16px !important;\n  }\n  #upl-gal-backoff .galbo-h2 {\n    font-size: 26px !important;\n  }\n  #upl-gal-backoff .galbo-intro {\n    font-size: 16px !important;\n  }\n  #upl-gal-backoff .galbo-rules {\n    grid-template-columns: 1fr !important;\n  }\n}\n@media (max-width: 480px) {\n  #upl-gal-backoff .galbo-h2 {\n    font-size: 24px !important;\n  }\n  #upl-gal-backoff .galbo-pre {\n    font-size: 12px !important;\n    padding: 14px 14px !important;\n  }\n}\n<\/style>\n\n<div id=\"upl-gal-backoff\">\n  <span id=\"gal-backoff\" style=\"display:block;position:relative;top:-80px;visibility:hidden;\"><\/span>\n  <div class=\"galbo-inner\">\n    <div class=\"galbo-eyebrow\"><span>Production Code<\/span><\/div>\n    <h2 class=\"galbo-h2\">Production-ready handling: exponential backoff + jitter<\/h2>\n    <pee class=\"galbo-intro\">Exponential backoff is the only correct response to a 429 from the Gmail API. Retrying immediately makes the problem worse: you pile more requests onto an already throttled quota window. Adding random jitter prevents the \"thundering herd\" problem where all clients in a fleet retry at exactly the same moment. Below are complete, production-tested implementations in Node.js and Python.<\/pee>\n\n    <div class=\"galbo-rules\">\n      <div class=\"galbo-rule\">\n        <span class=\"galbo-rule-num\">1s<\/span>\n        <pee class=\"galbo-rule-title\">Initial delay<\/pee>\n        <pee class=\"galbo-rule-text\">Start with 1,000ms on first retry. Never retry immediately after a 429.<\/pee>\n      <\/div>\n      <div class=\"galbo-rule\">\n        <span class=\"galbo-rule-num\">x2<\/span>\n        <pee class=\"galbo-rule-title\">Exponential multiplier<\/pee>\n        <pee class=\"galbo-rule-text\">Double delay each attempt: 1s, 2s, 4s, 8s, 16s. Cap at 32-64 seconds maximum.<\/pee>\n      <\/div>\n      <div class=\"galbo-rule\">\n        <span class=\"galbo-rule-num\">+R<\/span>\n        <pee class=\"galbo-rule-title\">Random jitter<\/pee>\n        <pee class=\"galbo-rule-text\">Add 0-500ms random jitter to prevent synchronized retries across concurrent workers.<\/pee>\n      <\/div>\n    <\/div>\n\n    <div class=\"galbo-code-wrap\">\n      <div class=\"galbo-code-bar\">\n        <span class=\"galbo-dot-r\"><\/span><span class=\"galbo-dot-y\"><\/span><span class=\"galbo-dot-g\"><\/span>\n        <span class=\"galbo-filename\">gmail-backoff<\/span>\n      <\/div>\n      <div class=\"galbo-tabs\">\n        <button class=\"galbo-tab active\" data-pane=\"js\">Node.js<\/button>\n        <button class=\"galbo-tab\" data-pane=\"py\">Python<\/button>\n      <\/div>\n\n      <div class=\"galbo-code-pane active\" id=\"galbo-pane-js\">\n        <div class=\"galbo-pre\"><code><span class=\"bc\">\/\/ gmail-backoff.js - production-ready exponential backoff + jitter<\/span>\n<span class=\"bc\">\/\/ Handles rateLimitExceeded and userRateLimitExceeded (gmail api rate limits)<\/span>\n\n<span class=\"bk\">const<\/span><span class=\"bw\"> sleep = <\/span><span class=\"bfn\">(ms)<\/span><span class=\"bw\"> => <\/span><span class=\"bk\">new<\/span><span class=\"bw\"> Promise(r => setTimeout(r, ms));<\/span>\n\n<span class=\"bk\">async function<\/span> <span class=\"bfn\">withGmailBackoff<\/span><span class=\"bw\">(fn, {<\/span>\n<span class=\"bw\">  maxRetries = <\/span><span class=\"bn\">5<\/span><span class=\"bw\">,<\/span>\n<span class=\"bw\">  initialDelay = <\/span><span class=\"bn\">1000<\/span><span class=\"bw\">,<\/span>\n<span class=\"bw\">  maxDelay = <\/span><span class=\"bn\">32000<\/span><span class=\"bw\">,<\/span>\n<span class=\"bw\">  jitter = <\/span><span class=\"bn\">500<\/span>\n<span class=\"bw\">} = {}) {<\/span>\n<span class=\"bk\">  let<\/span><span class=\"bw\"> delay = initialDelay;<\/span>\n\n<span class=\"bk\">  for<\/span><span class=\"bw\"> (<\/span><span class=\"bk\">let<\/span><span class=\"bw\"> attempt = <\/span><span class=\"bn\">0<\/span><span class=\"bw\">; attempt < maxRetries; attempt++) {<\/span>\n<span class=\"bk\">    try<\/span><span class=\"bw\"> {<\/span>\n<span class=\"bk\">      return await<\/span><span class=\"bw\"> <\/span><span class=\"bfn\">fn<\/span><span class=\"bw\">();<\/span>\n<span class=\"bw\">    } <\/span><span class=\"bk\">catch<\/span><span class=\"bw\"> (err) {<\/span>\n<span class=\"bk\">      const<\/span><span class=\"bw\"> code = err?.code || err?.response?.status;<\/span>\n<span class=\"bk\">      const<\/span><span class=\"bw\"> reason = err?.errors?.[<\/span><span class=\"bn\">0<\/span><span class=\"bw\">]?.reason || <\/span><span class=\"bs\">''<\/span><span class=\"bw\">;<\/span>\n\n<span class=\"bc\">      \/\/ Only retry on quota errors - not on 403 dailyLimitExceeded<\/span>\n<span class=\"bk\">      const<\/span><span class=\"bw\"> isRetryable = code === <\/span><span class=\"bn\">429<\/span><span class=\"bw\"> ||<\/span>\n<span class=\"bw\">        reason === <\/span><span class=\"bs\">'rateLimitExceeded'<\/span><span class=\"bw\"> ||<\/span>\n<span class=\"bw\">        reason === <\/span><span class=\"bs\">'userRateLimitExceeded'<\/span><span class=\"bw\">;<\/span>\n\n<span class=\"bk\">      if<\/span><span class=\"bw\"> (!isRetryable || attempt === maxRetries - <\/span><span class=\"bn\">1<\/span><span class=\"bw\">) <\/span><span class=\"bk\">throw<\/span><span class=\"bw\"> err;<\/span>\n\n<span class=\"bk\">      const<\/span><span class=\"bw\"> wait = Math.<\/span><span class=\"bfn\">min<\/span><span class=\"bw\">(delay + Math.<\/span><span class=\"bfn\">random<\/span><span class=\"bw\">() * jitter, maxDelay);<\/span>\n<span class=\"bw\">      <\/span><span class=\"bk\">await<\/span><span class=\"bw\"> <\/span><span class=\"bfn\">sleep<\/span><span class=\"bw\">(wait);<\/span>\n<span class=\"bw\">      delay *= <\/span><span class=\"bn\">2<\/span><span class=\"bw\">;<\/span>\n<span class=\"bw\">    }<\/span>\n<span class=\"bw\">  }<\/span>\n<span class=\"bw\">}<\/span>\n\n<span class=\"bc\">\/\/ Usage: on behalf of each authenticated user<\/span>\n<span class=\"bk\">const<\/span><span class=\"bw\"> message = <\/span><span class=\"bk\">await<\/span><span class=\"bw\"> <\/span><span class=\"bfn\">withGmailBackoff<\/span><span class=\"bw\">(() =><\/span>\n<span class=\"bw\">  gmail.users.messages.<\/span><span class=\"bfn\">get<\/span><span class=\"bw\">({ userId: <\/span><span class=\"bs\">'me'<\/span><span class=\"bw\">, id: messageId })<\/span>\n<span class=\"bw\">);<\/span><\/code><\/div>\n        <div class=\"galbo-ok-strip\">\n          <svg viewBox=\"0 0 24 24\"><polyline points=\"20 6 9 17 4 12\"\/><\/svg>\n          <span>Retries on 429 only. Does not retry dailyLimitExceeded (403). Caps delay at 32s.<\/span>\n        <\/div>\n      <\/div>\n\n      <div class=\"galbo-code-pane\" id=\"galbo-pane-py\">\n        <div class=\"galbo-pre\"><code><span class=\"bc\"># gmail_backoff.py - exponential backoff + jitter for Gmail API rate limits<\/span>\n<span class=\"bk\">import<\/span><span class=\"bw\"> asyncio, random<\/span>\n<span class=\"bk\">from<\/span><span class=\"bw\"> googleapiclient.errors <\/span><span class=\"bk\">import<\/span><span class=\"bw\"> HttpError<\/span>\n\n<span class=\"bk\">async def<\/span> <span class=\"bfn\">with_gmail_backoff<\/span><span class=\"bw\">(<\/span>\n<span class=\"bw\">    fn,<\/span>\n<span class=\"bw\">    max_retries=<\/span><span class=\"bn\">5<\/span><span class=\"bw\">,<\/span>\n<span class=\"bw\">    initial_delay=<\/span><span class=\"bn\">1.0<\/span><span class=\"bw\">,<\/span>\n<span class=\"bw\">    max_delay=<\/span><span class=\"bn\">32.0<\/span><span class=\"bw\">,<\/span>\n<span class=\"bw\">    jitter=<\/span><span class=\"bn\">0.5<\/span>\n<span class=\"bw\">):<\/span>\n<span class=\"bs\">    \"\"\"Wrap any Gmail API call with exponential backoff + random jitter.<\/span>\n<span class=\"bs\">    Handles gmail api rate limits: rateLimitExceeded and userRateLimitExceeded.<\/span>\n<span class=\"bs\">    \"\"\"<\/span>\n<span class=\"bw\">    delay = initial_delay<\/span>\n\n<span class=\"bk\">    for<\/span><span class=\"bw\"> attempt <\/span><span class=\"bk\">in<\/span><span class=\"bw\"> range(max_retries):<\/span>\n<span class=\"bk\">        try<\/span><span class=\"bw\">:<\/span>\n<span class=\"bk\">            return<\/span><span class=\"bw\"> fn()  <\/span><span class=\"bc\"># fn is synchronous Gmail client call<\/span>\n<span class=\"bk\">        except<\/span><span class=\"bw\"> HttpError <\/span><span class=\"bk\">as<\/span><span class=\"bw\"> e:<\/span>\n<span class=\"bw\">            status = e.resp.status<\/span>\n<span class=\"bw\">            reason = e.error_details[<\/span><span class=\"bn\">0<\/span><span class=\"bw\">].<\/span><span class=\"bfn\">get<\/span><span class=\"bw\">(<\/span><span class=\"bs\">'reason'<\/span><span class=\"bw\">, <\/span><span class=\"bs\">''<\/span><span class=\"bw\">) <\/span><span class=\"bk\">if<\/span><span class=\"bw\"> e.error_details <\/span><span class=\"bk\">else<\/span><span class=\"bw\"> <\/span><span class=\"bs\">''<\/span>\n\n<span class=\"bc\">            # Retry on 429; do NOT retry dailyLimitExceeded<\/span>\n<span class=\"bw\">            retryable = status == <\/span><span class=\"bn\">429<\/span><span class=\"bw\"> <\/span><span class=\"bk\">or<\/span><span class=\"bw\"> reason <\/span><span class=\"bk\">in<\/span><span class=\"bw\"> (<\/span>\n<span class=\"bs\">                'rateLimitExceeded'<\/span><span class=\"bw\">, <\/span><span class=\"bs\">'userRateLimitExceeded'<\/span>\n<span class=\"bw\">            )<\/span>\n\n<span class=\"bk\">            if not<\/span><span class=\"bw\"> retryable <\/span><span class=\"bk\">or<\/span><span class=\"bw\"> attempt == max_retries - <\/span><span class=\"bn\">1<\/span><span class=\"bw\">:<\/span>\n<span class=\"bk\">                raise<\/span>\n\n<span class=\"bw\">            wait = <\/span><span class=\"bfn\">min<\/span><span class=\"bw\">(delay + random.<\/span><span class=\"bfn\">uniform<\/span><span class=\"bw\">(<\/span><span class=\"bn\">0<\/span><span class=\"bw\">, jitter), max_delay)<\/span>\n<span class=\"bk\">            await<\/span><span class=\"bw\"> asyncio.<\/span><span class=\"bfn\">sleep<\/span><span class=\"bw\">(wait)<\/span>\n<span class=\"bw\">            delay *= <\/span><span class=\"bn\">2<\/span><\/code><\/div>\n        <div class=\"galbo-ok-strip\">\n          <svg viewBox=\"0 0 24 24\"><polyline points=\"20 6 9 17 4 12\"\/><\/svg>\n          <span>Compatible with Google API Python Client. Async-ready with asyncio.sleep.<\/span>\n        <\/div>\n      <\/div>\n    <\/div>\n\n    <div style=\"margin-top:28px !important;\">\n      <a class=\"galbo-cta\" href=\"https:\/\/dashboard.unipile.com\/signup\/\" target=\"_blank\" rel=\"noopener\"><span>Build with managed backoff<\/span><svg viewBox=\"0 0 24 24\"><line x1=\"5\" y1=\"12\" x2=\"19\" y2=\"12\"\/><polyline points=\"12 5 19 12 12 19\"\/><\/svg><\/a>\n    <\/div>\n  <\/div>\n<\/div>\n\n<script>\n(function(){\n  var tabs = document.querySelectorAll('#upl-gal-backoff .galbo-tab');\n  tabs.forEach(function(tab){\n    tab.addEventListener('click', function(){\n      tabs.forEach(function(t){ t.classList.remove('active'); });\n      tab.classList.add('active');\n      var pane = tab.getAttribute('data-pane');\n      document.querySelectorAll('#upl-gal-backoff .galbo-code-pane').forEach(function(p){\n        p.classList.remove('active');\n      });\n      var target = document.getElementById('galbo-pane-' + pane);\n      if(target) target.classList.add('active');\n    });\n  });\n})();\n<\/script>[\/et_pb_code][\/et_pb_column][\/et_pb_row][\/et_pb_section][et_pb_section fb_built=\"1\" _builder_version=\"4.16\" background_color=\"transparent\" custom_padding=\"0px|0px|0px|0px\" custom_padding_tablet=\"0px|0px|0px|0px\" custom_padding_phone=\"0px|0px|0px|0px\" global_colors_info=\"{}\" theme_builder_area=\"post_content\" da_is_popup=\"off\" da_exit_intent=\"off\" da_has_close=\"on\" da_alt_close=\"off\" da_dark_close=\"off\" da_not_modal=\"on\" da_is_singular=\"off\" da_with_loader=\"off\" da_has_shadow=\"on\" da_disable_devices=\"off|off|off\"][et_pb_row _builder_version=\"4.16\" background_size=\"initial\" background_position=\"top_left\" background_repeat=\"repeat\" custom_padding=\"0px|0px|0px|0px\" global_colors_info=\"{}\" theme_builder_area=\"post_content\"][et_pb_column type=\"4_4\" _builder_version=\"4.16\" custom_padding=\"|||\" global_colors_info=\"{}\" custom_padding__hover=\"|||\" theme_builder_area=\"post_content\"][et_pb_code _builder_version=\"4.16\" global_colors_info=\"{}\" theme_builder_area=\"post_content\"]<link href=\"https:\/\/fonts.googleapis.com\/css2?family=Inter:wght@400;500;600;700&#038;family=Poppins:wght@700;800&#038;display=swap\" rel=\"stylesheet\">\n<style>\n#upl-gal-strat,\n#upl-gal-strat *,\n#upl-gal-strat *::before,\n#upl-gal-strat *::after {\n  margin: 0 !important;\n  padding: 0 !important;\n  box-sizing: border-box !important;\n  border: none !important;\n  outline: none !important;\n  font-family: 'Inter', -apple-system, BlinkMacSystemFont, sans-serif !important;\n  line-height: 1.5 !important;\n  letter-spacing: normal !important;\n  text-transform: none !important;\n  text-decoration: none !important;\n  list-style: none !important;\n}\n#upl-gal-strat {\n  display: block !important;\n  padding: 70px 24px !important;\n  background: #f4f5f7 !important;\n  overflow-x: hidden !important;\n}\n#upl-gal-strat .galst-inner {\n  max-width: 1100px !important;\n  margin: 0 auto !important;\n}\n#upl-gal-strat .galst-eyebrow {\n  display: inline-flex !important;\n  align-items: center !important;\n  gap: 8px !important;\n  background: rgba(59, 185, 139, 0.12) !important;\n  color: #2aaa7e !important;\n  padding: 6px 14px !important;\n  border-radius: 20px !important;\n  font-size: 12px !important;\n  font-weight: 700 !important;\n  text-transform: uppercase !important;\n  letter-spacing: 0.5px !important;\n  margin-bottom: 16px !important;\n  width: fit-content !important;\n}\n#upl-gal-strat .galst-dot {\n  width: 7px !important;\n  height: 7px !important;\n  background: #3BB98B !important;\n  border-radius: 50% !important;\n  flex-shrink: 0 !important;\n  display: inline-block !important;\n}\n#upl-gal-strat .galst-h2 {\n  font-family: 'Poppins', sans-serif !important;\n  font-size: 35px !important;\n  font-weight: 700 !important;\n  color: #0f2736 !important;\n  line-height: 1.2 !important;\n  margin-bottom: 14px !important;\n}\n#upl-gal-strat .galst-intro {\n  font-size: 17px !important;\n  color: #383838 !important;\n  line-height: 1.75 !important;\n  margin-bottom: 40px !important;\n}\n#upl-gal-strat .galst-grid {\n  display: grid !important;\n  grid-template-columns: repeat(2, 1fr) !important;\n  gap: 20px !important;\n  margin-bottom: 36px !important;\n}\n#upl-gal-strat .galst-card {\n  background: #ffffff !important;\n  border: 1px solid #e5e7eb !important;\n  border-radius: 16px !important;\n  padding: 24px !important;\n}\n#upl-gal-strat .galst-card-header {\n  display: flex !important;\n  align-items: flex-start !important;\n  gap: 14px !important;\n  margin-bottom: 14px !important;\n}\n#upl-gal-strat .galst-card-icon {\n  width: 40px !important;\n  height: 40px !important;\n  background: rgba(59, 185, 139, 0.12) !important;\n  border-radius: 10px !important;\n  display: flex !important;\n  align-items: center !important;\n  justify-content: center !important;\n  flex-shrink: 0 !important;\n}\n#upl-gal-strat .galst-card-icon svg {\n  width: 20px !important;\n  height: 20px !important;\n  stroke: #3BB98B !important;\n  fill: none !important;\n  stroke-width: 2 !important;\n  stroke-linecap: round !important;\n  stroke-linejoin: round !important;\n}\n#upl-gal-strat .galst-card-title {\n  font-family: 'Poppins', sans-serif !important;\n  font-size: 15px !important;\n  font-weight: 700 !important;\n  color: #0f2736 !important;\n  line-height: 1.3 !important;\n  padding-top: 8px !important;\n}\n#upl-gal-strat .galst-card-text {\n  font-size: 14px !important;\n  color: #383838 !important;\n  line-height: 1.7 !important;\n}\n#upl-gal-strat .galst-card-text strong {\n  color: #0f2736 !important;\n  font-weight: 600 !important;\n}\n#upl-gal-strat .galst-card-text code {\n  background: rgba(0,0,0,0.06) !important;\n  padding: 2px 5px !important;\n  border-radius: 4px !important;\n  font-family: 'Courier New', monospace !important;\n  font-size: 12px !important;\n}\n#upl-gal-strat .galst-compare {\n  background: #ffffff !important;\n  border: 1px solid #e5e7eb !important;\n  border-radius: 16px !important;\n  padding: 24px !important;\n  margin-bottom: 36px !important;\n}\n#upl-gal-strat .galst-compare-title {\n  font-family: 'Poppins', sans-serif !important;\n  font-size: 16px !important;\n  font-weight: 700 !important;\n  color: #0f2736 !important;\n  margin-bottom: 18px !important;\n}\n#upl-gal-strat .galst-compare-row {\n  display: flex !important;\n  align-items: flex-start !important;\n  gap: 20px !important;\n  padding: 14px 0 !important;\n  border-bottom: 1px solid #f0f1f3 !important;\n}\n#upl-gal-strat .galst-compare-row:last-child {\n  border-bottom: none !important;\n  padding-bottom: 0 !important;\n}\n#upl-gal-strat .galst-compare-left {\n  flex: 1 !important;\n}\n#upl-gal-strat .galst-compare-label {\n  font-size: 11px !important;\n  font-weight: 700 !important;\n  color: #94a3b8 !important;\n  text-transform: uppercase !important;\n  letter-spacing: 0.5px !important;\n  margin-bottom: 4px !important;\n  display: block !important;\n}\n#upl-gal-strat .galst-compare-code {\n  font-family: 'Courier New', monospace !important;\n  font-size: 13px !important;\n  color: #EA4335 !important;\n  font-weight: 600 !important;\n  display: block !important;\n}\n#upl-gal-strat .galst-compare-better {\n  font-family: 'Courier New', monospace !important;\n  font-size: 13px !important;\n  color: #3BB98B !important;\n  font-weight: 600 !important;\n  display: block !important;\n}\n#upl-gal-strat .galst-compare-note {\n  font-size: 13px !important;\n  color: #64748b !important;\n  line-height: 1.5 !important;\n  flex: 1.2 !important;\n}\n#upl-gal-strat .galst-cta {\n  display: inline-flex !important;\n  align-items: center !important;\n  gap: 8px !important;\n  background: #DDDF4C !important;\n  color: #0f2736 !important;\n  padding: 12px 22px !important;\n  border-radius: 8px !important;\n  font-size: 0.9rem !important;\n  font-weight: 600 !important;\n  transition: transform 0.3s ease !important;\n  cursor: pointer !important;\n  white-space: nowrap !important;\n  text-decoration: none !important;\n}\n#upl-gal-strat .galst-cta:hover {\n  transform: translateY(-5px) !important;\n}\n#upl-gal-strat .galst-cta svg {\n  width: 14px !important;\n  height: 14px !important;\n  stroke: currentColor !important;\n  fill: none !important;\n  stroke-width: 2.5 !important;\n  stroke-linecap: round !important;\n  stroke-linejoin: round !important;\n  flex-shrink: 0 !important;\n}\n\n@media (max-width: 768px) {\n  #upl-gal-strat {\n    padding: 50px 16px !important;\n  }\n  #upl-gal-strat .galst-h2 {\n    font-size: 26px !important;\n  }\n  #upl-gal-strat .galst-intro {\n    font-size: 16px !important;\n  }\n  #upl-gal-strat .galst-grid {\n    grid-template-columns: 1fr !important;\n  }\n  #upl-gal-strat .galst-compare-row {\n    flex-direction: column !important;\n    gap: 10px !important;\n  }\n}\n@media (max-width: 480px) {\n  #upl-gal-strat .galst-h2 {\n    font-size: 24px !important;\n  }\n}\n<\/style>\n\n<div id=\"upl-gal-strat\">\n  <span id=\"gal-strategies\" style=\"display:block;position:relative;top:-80px;visibility:hidden;\"><\/span>\n  <div class=\"galst-inner\">\n    <div class=\"galst-eyebrow\"><span class=\"galst-dot\"><\/span><span>Best Practices<\/span><\/div>\n    <h2 class=\"galst-h2\">Strategies to stay under the limit<\/h2>\n    <pee class=\"galst-intro\">Backoff handles the emergency. These proactive strategies prevent you from hitting gmail api quota limits in the first place. They are listed from highest to lowest impact on your quota consumption. Combining two or three of them can reduce your unit spend by 80% on typical read-heavy workloads.<\/pee>\n\n    <div class=\"galst-grid\">\n      <div class=\"galst-card\">\n        <div class=\"galst-card-header\">\n          <div class=\"galst-card-icon\">\n            <svg viewBox=\"0 0 24 24\"><path d=\"M17 21v-2a4 4 0 0 0-4-4H5a4 4 0 0 0-4 4v2\"\/><circle cx=\"9\" cy=\"7\" r=\"4\"\/><path d=\"M23 21v-2a4 4 0 0 0-3-3.87\"\/><path d=\"M16 3.13a4 4 0 0 1 0 7.75\"\/><\/svg>\n          <\/div>\n          <pee class=\"galst-card-title\">Queue per authenticated user<\/pee>\n        <\/div>\n        <pee class=\"galst-card-text\">Maintain a separate request queue per <strong>authenticated user<\/strong>. Never mix requests from different users into a shared pool. This isolates per-user rate limit exposure and allows fair queuing: if one user triggers a 429, only their queue pauses - others continue at full speed. Use Redis or an in-memory queue with a per-user token bucket.<\/pee>\n      <\/div>\n      <div class=\"galst-card\">\n        <div class=\"galst-card-header\">\n          <div class=\"galst-card-icon\">\n            <svg viewBox=\"0 0 24 24\"><polyline points=\"17 1 21 5 17 9\"\/><path d=\"M3 11V9a4 4 0 0 1 4-4h14\"\/><polyline points=\"7 23 3 19 7 15\"\/><path d=\"M21 13v2a4 4 0 0 1-4 4H3\"\/><\/svg>\n          <\/div>\n          <pee class=\"galst-card-title\">Use history.list instead of messages.list for sync<\/pee>\n        <\/div>\n        <pee class=\"galst-card-text\">Polling <code>messages.list<\/code> on a timer is the most common gmail api usage limits mistake. <code>users.history.list<\/code> costs only <strong>2 units<\/strong> (vs 5 for messages.list) and returns only the delta since your last sync point. For read-heavy applications syncing large mailboxes, this switch alone can reduce quota consumption by 60%. Store the <code>historyId<\/code> from each response as your cursor. Pair with Gmail Push Notifications (Pub\/Sub) for near-real-time sync.<\/pee>\n      <\/div>\n      <div class=\"galst-card\">\n        <div class=\"galst-card-header\">\n          <div class=\"galst-card-icon\">\n            <svg viewBox=\"0 0 24 24\"><rect x=\"3\" y=\"3\" width=\"7\" height=\"7\" rx=\"1\"\/><rect x=\"14\" y=\"3\" width=\"7\" height=\"7\" rx=\"1\"\/><rect x=\"3\" y=\"14\" width=\"7\" height=\"7\" rx=\"1\"\/><rect x=\"14\" y=\"14\" width=\"7\" height=\"7\" rx=\"1\"\/><\/svg>\n          <\/div>\n          <pee class=\"galst-card-title\">Batch API calls<\/pee>\n        <\/div>\n        <pee class=\"galst-card-text\">The Gmail API supports batch requests: combine up to <strong>100 individual requests<\/strong> into one HTTP call. Each sub-request still counts its normal unit cost, but you reduce TCP overhead and rate limit \"slots\" consumed. This is particularly effective for <code>messages.get<\/code> operations where you need to fetch many messages from a sync delta. Check the <a href=\"https:\/\/developers.google.com\/gmail\/api\/guides\/batch\" target=\"_blank\" rel=\"noopener\" style=\"color:#2aaa7e;text-decoration:underline;\">Gmail Batch guide<\/a> for implementation details.<\/pee>\n      <\/div>\n      <div class=\"galst-card\">\n        <div class=\"galst-card-header\">\n          <div class=\"galst-card-icon\">\n            <svg viewBox=\"0 0 24 24\"><path d=\"M4 15s1-1 4-1 5 2 8 2 4-1 4-1V3s-1 1-4 1-5-2-8-2-4 1-4 1z\"\/><line x1=\"4\" y1=\"22\" x2=\"4\" y2=\"15\"\/><\/svg>\n          <\/div>\n          <pee class=\"galst-card-title\">Use partial responses (fields=)<\/pee>\n        <\/div>\n        <pee class=\"galst-card-text\">Every Gmail API method supports the <code>fields=<\/code> parameter to request only the properties you need. While it does not reduce the unit cost of the request, it cuts response payload by 60-90% and improves latency. For a <code>messages.get<\/code> returning only <code>id,threadId,payload.headers,snippet<\/code>, the payload drops from 40KB+ to under 2KB. Less network = faster iteration = more headroom before hitting the gmail api daily quota ceiling.<\/pee>\n      <\/div>\n    <\/div>\n\n    <div class=\"galst-compare\">\n      <pee class=\"galst-compare-title\">Push vs Poll: the right sync model<\/pee>\n      <div class=\"galst-compare-row\">\n        <div class=\"galst-compare-left\">\n          <span class=\"galst-compare-label\">Avoid<\/span>\n          <span class=\"galst-compare-code\">messages.list every 30s<\/span>\n        <\/div>\n        <pee class=\"galst-compare-note\">5 units per poll + N x 5 units to fetch each new message. For 100 users x 30s interval = 1M units\/hour just in polling overhead.<\/pee>\n      <\/div>\n      <div class=\"galst-compare-row\">\n        <div class=\"galst-compare-left\">\n          <span class=\"galst-compare-label\">Better<\/span>\n          <span class=\"galst-compare-better\">history.list on timer<\/span>\n        <\/div>\n        <pee class=\"galst-compare-note\">2 units per poll, returns only changes since last sync. 60% cheaper than messages.list polling for the same result.<\/pee>\n      <\/div>\n      <div class=\"galst-compare-row\">\n        <div class=\"galst-compare-left\">\n          <span class=\"galst-compare-label\">Best<\/span>\n          <span class=\"galst-compare-better\">Gmail Push Notifications (Pub\/Sub)<\/span>\n        <\/div>\n        <pee class=\"galst-compare-note\">Zero quota cost for delivery. Google pushes a notification when a mailbox changes - you fetch only the delta. Requires a public webhook endpoint. Ideal for near-real-time applications.<\/pee>\n      <\/div>\n    <\/div>\n\n    <a class=\"galst-cta\" href=\"https:\/\/dashboard.unipile.com\/signup\/\" target=\"_blank\" rel=\"noopener\"><span>Build your Gmail sync integration<\/span><svg viewBox=\"0 0 24 24\"><line x1=\"5\" y1=\"12\" x2=\"19\" y2=\"12\"\/><polyline points=\"12 5 19 12 12 19\"\/><\/svg><\/a>\n  <\/div>\n<\/div>[\/et_pb_code][\/et_pb_column][\/et_pb_row][\/et_pb_section][et_pb_section fb_built=\"1\" _builder_version=\"4.16\" background_color=\"transparent\" custom_padding=\"0px|0px|0px|0px\" custom_padding_tablet=\"0px|0px|0px|0px\" custom_padding_phone=\"0px|0px|0px|0px\" global_colors_info=\"{}\" theme_builder_area=\"post_content\" da_is_popup=\"off\" da_exit_intent=\"off\" da_has_close=\"on\" da_alt_close=\"off\" da_dark_close=\"off\" da_not_modal=\"on\" da_is_singular=\"off\" da_with_loader=\"off\" da_has_shadow=\"on\" da_disable_devices=\"off|off|off\"][et_pb_row _builder_version=\"4.16\" background_size=\"initial\" background_position=\"top_left\" background_repeat=\"repeat\" custom_padding=\"0px|0px|0px|0px\" global_colors_info=\"{}\" theme_builder_area=\"post_content\"][et_pb_column type=\"4_4\" _builder_version=\"4.16\" custom_padding=\"|||\" global_colors_info=\"{}\" custom_padding__hover=\"|||\" theme_builder_area=\"post_content\"][et_pb_code _builder_version=\"4.16\" global_colors_info=\"{}\" theme_builder_area=\"post_content\"]<link href=\"https:\/\/fonts.googleapis.com\/css2?family=Inter:wght@400;500;600;700&#038;family=Poppins:wght@700;800&#038;display=swap\" rel=\"stylesheet\">\n<style>\n#upl-gal-multi,\n#upl-gal-multi *,\n#upl-gal-multi *::before,\n#upl-gal-multi *::after {\n  margin: 0 !important;\n  padding: 0 !important;\n  box-sizing: border-box !important;\n  border: none !important;\n  outline: none !important;\n  font-family: 'Inter', -apple-system, BlinkMacSystemFont, sans-serif !important;\n  line-height: 1.5 !important;\n  letter-spacing: normal !important;\n  text-transform: none !important;\n  text-decoration: none !important;\n  list-style: none !important;\n}\n#upl-gal-multi {\n  display: block !important;\n  padding: 70px 24px !important;\n  overflow-x: hidden !important;\n}\n#upl-gal-multi .galmt-inner {\n  max-width: 1100px !important;\n  margin: 0 auto !important;\n}\n#upl-gal-multi .galmt-eyebrow {\n  display: inline-flex !important;\n  align-items: center !important;\n  gap: 8px !important;\n  background: rgba(221, 223, 76, 0.18) !important;\n  color: #8a8c2e !important;\n  padding: 6px 14px !important;\n  border-radius: 20px !important;\n  font-size: 12px !important;\n  font-weight: 700 !important;\n  text-transform: uppercase !important;\n  letter-spacing: 0.5px !important;\n  margin-bottom: 16px !important;\n  width: fit-content !important;\n}\n#upl-gal-multi .galmt-h2 {\n  font-family: 'Poppins', sans-serif !important;\n  font-size: 35px !important;\n  font-weight: 700 !important;\n  color: #0f2736 !important;\n  line-height: 1.2 !important;\n  margin-bottom: 14px !important;\n}\n#upl-gal-multi .galmt-intro {\n  font-size: 17px !important;\n  color: #383838 !important;\n  line-height: 1.75 !important;\n  margin-bottom: 40px !important;\n}\n#upl-gal-multi .galmt-steps {\n  display: flex !important;\n  flex-direction: column !important;\n  gap: 16px !important;\n  margin-bottom: 40px !important;\n}\n#upl-gal-multi .galmt-step {\n  background: #ffffff !important;\n  border: 1px solid #e5e7eb !important;\n  border-radius: 16px !important;\n  padding: 24px !important;\n  display: flex !important;\n  align-items: flex-start !important;\n  gap: 20px !important;\n}\n#upl-gal-multi .galmt-step-num {\n  width: 40px !important;\n  height: 40px !important;\n  background: rgba(59, 185, 139, 0.12) !important;\n  border-radius: 10px !important;\n  display: flex !important;\n  align-items: center !important;\n  justify-content: center !important;\n  flex-shrink: 0 !important;\n  font-family: 'Poppins', sans-serif !important;\n  font-size: 15px !important;\n  font-weight: 700 !important;\n  color: #2aaa7e !important;\n}\n#upl-gal-multi .galmt-step-content {}\n#upl-gal-multi .galmt-step-title {\n  font-family: 'Poppins', sans-serif !important;\n  font-size: 15px !important;\n  font-weight: 700 !important;\n  color: #0f2736 !important;\n  margin-bottom: 8px !important;\n  line-height: 1.3 !important;\n}\n#upl-gal-multi .galmt-step-text {\n  font-size: 14px !important;\n  color: #383838 !important;\n  line-height: 1.7 !important;\n}\n#upl-gal-multi .galmt-step-text strong {\n  color: #0f2736 !important;\n  font-weight: 600 !important;\n}\n#upl-gal-multi .galmt-step-text code {\n  background: rgba(0,0,0,0.06) !important;\n  padding: 2px 5px !important;\n  border-radius: 4px !important;\n  font-family: 'Courier New', monospace !important;\n  font-size: 12px !important;\n}\n#upl-gal-multi .galmt-quota-form {\n  background: #f4f5f7 !important;\n  border-radius: 14px !important;\n  padding: 24px !important;\n  margin-bottom: 36px !important;\n}\n#upl-gal-multi .galmt-qf-title {\n  font-family: 'Poppins', sans-serif !important;\n  font-size: 15px !important;\n  font-weight: 700 !important;\n  color: #0f2736 !important;\n  margin-bottom: 16px !important;\n}\n#upl-gal-multi .galmt-qf-rows {\n  display: flex !important;\n  flex-direction: column !important;\n  gap: 12px !important;\n}\n#upl-gal-multi .galmt-qf-row {\n  display: flex !important;\n  align-items: flex-start !important;\n  gap: 12px !important;\n}\n#upl-gal-multi .galmt-qf-icon {\n  width: 20px !important;\n  height: 20px !important;\n  flex-shrink: 0 !important;\n  margin-top: 1px !important;\n}\n#upl-gal-multi .galmt-qf-icon svg {\n  width: 20px !important;\n  height: 20px !important;\n  stroke: #3BB98B !important;\n  fill: none !important;\n  stroke-width: 2 !important;\n  stroke-linecap: round !important;\n  stroke-linejoin: round !important;\n}\n#upl-gal-multi .galmt-qf-text {\n  font-size: 14px !important;\n  color: #383838 !important;\n  line-height: 1.6 !important;\n}\n#upl-gal-multi .galmt-qf-text strong {\n  color: #0f2736 !important;\n  font-weight: 600 !important;\n}\n#upl-gal-multi .galmt-testing-note {\n  background: rgba(59, 185, 139, 0.08) !important;\n  border: 1px solid rgba(59, 185, 139, 0.20) !important;\n  border-radius: 12px !important;\n  padding: 18px 20px !important;\n  margin-bottom: 36px !important;\n  font-size: 14px !important;\n  color: #383838 !important;\n  line-height: 1.7 !important;\n}\n#upl-gal-multi .galmt-testing-note strong {\n  color: #0f2736 !important;\n  font-weight: 700 !important;\n}\n#upl-gal-multi .galmt-testing-note a {\n  color: #2aaa7e !important;\n  text-decoration: underline !important;\n}\n#upl-gal-multi .galmt-cta {\n  display: inline-flex !important;\n  align-items: center !important;\n  gap: 8px !important;\n  background: #DDDF4C !important;\n  color: #0f2736 !important;\n  padding: 12px 22px !important;\n  border-radius: 8px !important;\n  font-size: 0.9rem !important;\n  font-weight: 600 !important;\n  transition: transform 0.3s ease !important;\n  cursor: pointer !important;\n  white-space: nowrap !important;\n  text-decoration: none !important;\n}\n#upl-gal-multi .galmt-cta:hover {\n  transform: translateY(-5px) !important;\n}\n#upl-gal-multi .galmt-cta svg {\n  width: 14px !important;\n  height: 14px !important;\n  stroke: currentColor !important;\n  fill: none !important;\n  stroke-width: 2.5 !important;\n  stroke-linecap: round !important;\n  stroke-linejoin: round !important;\n  flex-shrink: 0 !important;\n}\n\n@media (max-width: 768px) {\n  #upl-gal-multi {\n    padding: 50px 16px !important;\n  }\n  #upl-gal-multi .galmt-h2 {\n    font-size: 26px !important;\n  }\n  #upl-gal-multi .galmt-intro {\n    font-size: 16px !important;\n  }\n  #upl-gal-multi .galmt-step {\n    flex-direction: column !important;\n    gap: 14px !important;\n  }\n}\n@media (max-width: 480px) {\n  #upl-gal-multi .galmt-h2 {\n    font-size: 24px !important;\n  }\n}\n<\/style>\n\n<div id=\"upl-gal-multi\">\n  <span id=\"gal-multitenant\" style=\"display:block;position:relative;top:-80px;visibility:hidden;\"><\/span>\n  <div class=\"galmt-inner\">\n    <div class=\"galmt-eyebrow\"><span>Advanced<\/span><\/div>\n    <h2 class=\"galmt-h2\">Multi-tenant scaling and requesting a quota increase<\/h2>\n    <pee class=\"galmt-intro\">Once you move beyond a handful of linked accounts, gmail api quotas become an architecture concern. This section covers GCP project sharding for large-scale deployments and the step-by-step process to request a gmail api quota increase from Google.<\/pee>\n\n    <div class=\"galmt-testing-note\">\n      <strong>Note on the 100-user testing limit:<\/strong> Apps in development mode (not yet published through Google's OAuth verification) are capped at <strong>100 test users<\/strong>. This is a completely separate limit from the API quotas. If you are hitting the 100-user ceiling, your app needs to be verified and published. See the <a href=\"\/google-oauth-100-user-limit-unverified-app\/\">100-user limit guide<\/a> for the full verification workflow. The gmail api rate limits discussed here apply only to verified, published apps with real authenticated users.\n    <\/div>\n\n    <div class=\"galmt-steps\">\n      <div class=\"galmt-step\">\n        <div class=\"galmt-step-num\">01<\/div>\n        <div class=\"galmt-step-content\">\n          <pee class=\"galmt-step-title\">GCP project sharding<\/pee>\n          <pee class=\"galmt-step-text\">The 1.2M quota units\/min limit is <strong>per GCP project<\/strong>. If you have 1,000 authenticated users all actively syncing, you can split them across two GCP projects to double your effective project-level capacity. Each project needs its own OAuth client credentials and consent screen. Users linked to project A cannot use project B's quota. This is particularly useful for high-volume email sync scenarios where the gmail api daily quota ceiling is a concern. <a href=\"https:\/\/console.cloud.google.com\/apis\/api\/gmail.googleapis.com\/quotas\" target=\"_blank\" rel=\"noopener\" style=\"color:#2aaa7e;text-decoration:underline;\">Monitor your quota usage<\/a> in the GCP console to know when sharding is needed.<\/pee>\n        <\/div>\n      <\/div>\n      <div class=\"galmt-step\">\n        <div class=\"galmt-step-num\">02<\/div>\n        <div class=\"galmt-step-content\">\n          <pee class=\"galmt-step-title\">Requesting a quota increase<\/pee>\n          <pee class=\"galmt-step-text\">Google grants quota increases on request, but they take time (typically 3-5 business days for initial review, up to 2 weeks for large increases). Submit via GCP Console: <strong>APIs & Services > Gmail API > Quotas > \"Request higher quota\"<\/strong>. Google requires a detailed justification. Key items to include: estimated daily active users, average requests per user per day, breakdown by method (<code>messages.send<\/code> vs <code>messages.list<\/code> etc.), and the production use case. Vague requests are denied. Provide concrete numbers from your staging telemetry.<\/pee>\n        <\/div>\n      <\/div>\n      <div class=\"galmt-step\">\n        <div class=\"galmt-step-num\">03<\/div>\n        <div class=\"galmt-step-content\">\n          <pee class=\"galmt-step-title\">Monitor and budget daily quota<\/pee>\n          <pee class=\"galmt-step-text\">Implement quota budget tracking per authenticated user in your own data layer. Track <code>quotaUnitsUsed<\/code> for each user daily. When a user approaches 70-80% of their per-user daily budget, switch from active sync to push-only mode for that user for the remainder of the day. This prevents one high-volume user from burning disproportionate project-level daily quota. The cadence of how much quota you allocate per user is a <strong>customer-side decision<\/strong> in terms of your application design.<\/pee>\n        <\/div>\n      <\/div>\n    <\/div>\n\n    <div class=\"galmt-quota-form\">\n      <pee class=\"galmt-qf-title\">What to include in your quota increase request<\/pee>\n      <div class=\"galmt-qf-rows\">\n        <div class=\"galmt-qf-row\">\n          <div class=\"galmt-qf-icon\"><svg viewBox=\"0 0 24 24\"><polyline points=\"20 6 9 17 4 12\"\/><\/svg><\/div>\n          <pee class=\"galmt-qf-text\"><strong>Current usage baseline:<\/strong> \"We currently use X million units\/day across Y active users.\"<\/pee>\n        <\/div>\n        <div class=\"galmt-qf-row\">\n          <div class=\"galmt-qf-icon\"><svg viewBox=\"0 0 24 24\"><polyline points=\"20 6 9 17 4 12\"\/><\/svg><\/div>\n          <pee class=\"galmt-qf-text\"><strong>Growth projection:<\/strong> \"In 6 months we expect Z users, requiring approximately W million units\/day.\"<\/pee>\n        <\/div>\n        <div class=\"galmt-qf-row\">\n          <div class=\"galmt-qf-icon\"><svg viewBox=\"0 0 24 24\"><polyline points=\"20 6 9 17 4 12\"\/><\/svg><\/div>\n          <pee class=\"galmt-qf-text\"><strong>Use case:<\/strong> \"Our product reads Gmail to power [CRM sync \/ ATS inbox \/ email analytics]. Users authenticate individually via OAuth.\"<\/pee>\n        <\/div>\n        <div class=\"galmt-qf-row\">\n          <div class=\"galmt-qf-icon\"><svg viewBox=\"0 0 24 24\"><polyline points=\"20 6 9 17 4 12\"\/><\/svg><\/div>\n          <pee class=\"galmt-qf-text\"><strong>Method breakdown:<\/strong> \"Primary methods: messages.list (40%), messages.get (35%), history.list (20%), messages.send (5%).\"<\/pee>\n        <\/div>\n      <\/div>\n    <\/div>\n\n    <a class=\"galmt-cta\" href=\"https:\/\/dashboard.unipile.com\/signup\/\" target=\"_blank\" rel=\"noopener\"><span>Start building at scale<\/span><svg viewBox=\"0 0 24 24\"><line x1=\"5\" y1=\"12\" x2=\"19\" y2=\"12\"\/><polyline points=\"12 5 19 12 12 19\"\/><\/svg><\/a>\n  <\/div>\n<\/div>[\/et_pb_code][\/et_pb_column][\/et_pb_row][\/et_pb_section][et_pb_section fb_built=\"1\" _builder_version=\"4.16\" background_color=\"transparent\" custom_padding=\"0px|0px|0px|0px\" custom_padding_tablet=\"0px|0px|0px|0px\" custom_padding_phone=\"0px|0px|0px|0px\" global_colors_info=\"{}\" theme_builder_area=\"post_content\" da_is_popup=\"off\" da_exit_intent=\"off\" da_has_close=\"on\" da_alt_close=\"off\" da_dark_close=\"off\" da_not_modal=\"on\" da_is_singular=\"off\" da_with_loader=\"off\" da_has_shadow=\"on\" da_disable_devices=\"off|off|off\"][et_pb_row _builder_version=\"4.16\" background_size=\"initial\" background_position=\"top_left\" background_repeat=\"repeat\" custom_padding=\"0px|0px|0px|0px\" global_colors_info=\"{}\" theme_builder_area=\"post_content\"][et_pb_column type=\"4_4\" _builder_version=\"4.16\" custom_padding=\"|||\" global_colors_info=\"{}\" custom_padding__hover=\"|||\" theme_builder_area=\"post_content\"][et_pb_code _builder_version=\"4.16\" global_colors_info=\"{}\" theme_builder_area=\"post_content\"]<link href=\"https:\/\/fonts.googleapis.com\/css2?family=Inter:wght@400;500;600;700&#038;family=Poppins:wght@700;800&#038;display=swap\" rel=\"stylesheet\">\n<style>\n#upl-gal-unipile,\n#upl-gal-unipile *,\n#upl-gal-unipile *::before,\n#upl-gal-unipile *::after {\n  margin: 0 !important;\n  padding: 0 !important;\n  box-sizing: border-box !important;\n  border: none !important;\n  outline: none !important;\n  font-family: 'Inter', -apple-system, BlinkMacSystemFont, sans-serif !important;\n  line-height: 1.5 !important;\n  letter-spacing: normal !important;\n  text-transform: none !important;\n  text-decoration: none !important;\n  list-style: none !important;\n}\n#upl-gal-unipile {\n  display: block !important;\n  padding: 70px 24px !important;\n  background: #0f2736 !important;\n  overflow-x: hidden !important;\n}\n#upl-gal-unipile .galup-inner {\n  max-width: 1100px !important;\n  margin: 0 auto !important;\n}\n#upl-gal-unipile .galup-eyebrow {\n  display: inline-flex !important;\n  align-items: center !important;\n  gap: 8px !important;\n  background: rgba(221, 223, 76, 0.18) !important;\n  color: #DDDF4C !important;\n  padding: 6px 14px !important;\n  border-radius: 20px !important;\n  font-size: 12px !important;\n  font-weight: 700 !important;\n  text-transform: uppercase !important;\n  letter-spacing: 0.5px !important;\n  margin-bottom: 20px !important;\n  width: fit-content !important;\n}\n#upl-gal-unipile .galup-h2 {\n  font-family: 'Poppins', sans-serif !important;\n  font-size: 35px !important;\n  font-weight: 700 !important;\n  color: #ffffff !important;\n  line-height: 1.2 !important;\n  margin-bottom: 16px !important;\n}\n#upl-gal-unipile .galup-intro {\n  font-size: 17px !important;\n  color: rgba(255, 255, 255, 0.82) !important;\n  line-height: 1.75 !important;\n  margin-bottom: 44px !important;\n}\n#upl-gal-unipile .galup-intro strong {\n  color: #ffffff !important;\n}\n#upl-gal-unipile .galup-grid {\n  display: grid !important;\n  grid-template-columns: 1fr 1fr !important;\n  gap: 24px !important;\n  margin-bottom: 44px !important;\n}\n#upl-gal-unipile .galup-feature {\n  background: rgba(255, 255, 255, 0.06) !important;\n  border: 1px solid rgba(255, 255, 255, 0.12) !important;\n  border-radius: 14px !important;\n  padding: 22px !important;\n}\n#upl-gal-unipile .galup-feature-icon {\n  width: 40px !important;\n  height: 40px !important;\n  background: rgba(59, 185, 139, 0.15) !important;\n  border-radius: 10px !important;\n  display: flex !important;\n  align-items: center !important;\n  justify-content: center !important;\n  margin-bottom: 14px !important;\n  flex-shrink: 0 !important;\n}\n#upl-gal-unipile .galup-feature-icon svg {\n  width: 20px !important;\n  height: 20px !important;\n  stroke: #3BB98B !important;\n  fill: none !important;\n  stroke-width: 2 !important;\n  stroke-linecap: round !important;\n  stroke-linejoin: round !important;\n}\n#upl-gal-unipile .galup-feature-title {\n  font-family: 'Poppins', sans-serif !important;\n  font-size: 15px !important;\n  font-weight: 700 !important;\n  color: #ffffff !important;\n  margin-bottom: 8px !important;\n  line-height: 1.3 !important;\n}\n#upl-gal-unipile .galup-feature-text {\n  font-size: 14px !important;\n  color: rgba(255, 255, 255, 0.72) !important;\n  line-height: 1.65 !important;\n}\n#upl-gal-unipile .galup-feature-text strong {\n  color: rgba(255, 255, 255, 0.95) !important;\n  font-weight: 600 !important;\n}\n\/* Code mockup on dark bg *\/\n#upl-gal-unipile .galup-code-wrap {\n  background: rgba(0, 0, 0, 0.35) !important;\n  border-radius: 14px !important;\n  overflow: hidden !important;\n  border: 1px solid rgba(255, 255, 255, 0.08) !important;\n  margin-bottom: 40px !important;\n}\n#upl-gal-unipile .galup-code-bar {\n  background: rgba(0, 0, 0, 0.4) !important;\n  padding: 12px 18px !important;\n  display: flex !important;\n  align-items: center !important;\n  gap: 8px !important;\n  border-bottom: 1px solid rgba(255,255,255,0.06) !important;\n}\n#upl-gal-unipile .galup-dot-r { width: 12px !important; height: 12px !important; border-radius: 50% !important; background: #ff5f57 !important; flex-shrink: 0 !important; display: inline-block !important; }\n#upl-gal-unipile .galup-dot-y { width: 12px !important; height: 12px !important; border-radius: 50% !important; background: #febc2e !important; flex-shrink: 0 !important; display: inline-block !important; }\n#upl-gal-unipile .galup-dot-g { width: 12px !important; height: 12px !important; border-radius: 50% !important; background: #28c840 !important; flex-shrink: 0 !important; display: inline-block !important; }\n#upl-gal-unipile .galup-filename {\n  color: #8b949e !important;\n  font-size: 13px !important;\n  margin-left: 6px !important;\n  font-family: 'Courier New', monospace !important;\n  line-height: 1 !important;\n}\n#upl-gal-unipile .galup-pre {\n  padding: 22px 24px !important;\n  font-size: 13px !important;\n  line-height: 1.8 !important;\n  overflow-x: auto !important;\n}\n#upl-gal-unipile .galup-pre code {\n  font-family: 'Courier New', monospace !important;\n  white-space: pre-wrap !important;\n  word-break: break-word !important;\n  display: block !important;\n  color: #e6edf3 !important;\n}\n#upl-gal-unipile .uk { color: #ff7b72 !important; }\n#upl-gal-unipile .ufn { color: #d2a8ff !important; }\n#upl-gal-unipile .us { color: #a5d6ff !important; }\n#upl-gal-unipile .un { color: #79c0ff !important; }\n#upl-gal-unipile .uc { color: #8b949e !important; }\n#upl-gal-unipile .uw { color: #e6edf3 !important; }\n#upl-gal-unipile .galup-ok-strip {\n  background: rgba(59, 185, 139, 0.1) !important;\n  border-top: 1px solid rgba(59, 185, 139, 0.25) !important;\n  color: #3BB98B !important;\n  padding: 10px 24px !important;\n  font-size: 12px !important;\n  font-family: 'Courier New', monospace !important;\n  display: flex !important;\n  align-items: center !important;\n  gap: 8px !important;\n}\n#upl-gal-unipile .galup-ok-strip svg {\n  width: 14px !important;\n  height: 14px !important;\n  stroke: #3BB98B !important;\n  fill: none !important;\n  stroke-width: 2.5 !important;\n  stroke-linecap: round !important;\n  stroke-linejoin: round !important;\n  flex-shrink: 0 !important;\n}\n#upl-gal-unipile .galup-disclaimer {\n  background: rgba(255, 255, 255, 0.06) !important;\n  border: 1px solid rgba(255, 255, 255, 0.10) !important;\n  border-radius: 10px !important;\n  padding: 16px 20px !important;\n  margin-bottom: 36px !important;\n  font-size: 13px !important;\n  color: rgba(255, 255, 255, 0.60) !important;\n  line-height: 1.6 !important;\n}\n#upl-gal-unipile .galup-cta-row {\n  display: flex !important;\n  gap: 14px !important;\n  flex-wrap: wrap !important;\n}\n#upl-gal-unipile .galup-cta-primary {\n  display: inline-flex !important;\n  align-items: center !important;\n  gap: 8px !important;\n  background: #DDDF4C !important;\n  color: #0f2736 !important;\n  padding: 14px 28px !important;\n  border-radius: 8px !important;\n  font-size: 0.95rem !important;\n  font-weight: 600 !important;\n  transition: transform 0.3s ease !important;\n  cursor: pointer !important;\n  white-space: nowrap !important;\n  text-decoration: none !important;\n}\n#upl-gal-unipile .galup-cta-primary:hover {\n  transform: translateY(-5px) !important;\n}\n#upl-gal-unipile .galup-cta-primary svg {\n  width: 16px !important;\n  height: 16px !important;\n  stroke: currentColor !important;\n  fill: none !important;\n  stroke-width: 2.5 !important;\n  stroke-linecap: round !important;\n  stroke-linejoin: round !important;\n  flex-shrink: 0 !important;\n}\n#upl-gal-unipile .galup-cta-secondary {\n  display: inline-flex !important;\n  align-items: center !important;\n  gap: 8px !important;\n  background: transparent !important;\n  color: #ffffff !important;\n  padding: 14px 24px !important;\n  border-radius: 8px !important;\n  border: 2px solid rgba(255, 255, 255, 0.4) !important;\n  font-size: 0.95rem !important;\n  font-weight: 600 !important;\n  transition: all 0.3s ease !important;\n  cursor: pointer !important;\n  white-space: nowrap !important;\n  text-decoration: none !important;\n}\n#upl-gal-unipile .galup-cta-secondary:hover {\n  border-color: #ffffff !important;\n  background: rgba(255,255,255,0.08) !important;\n}\n\n@media (max-width: 768px) {\n  #upl-gal-unipile {\n    padding: 50px 16px !important;\n  }\n  #upl-gal-unipile .galup-h2 {\n    font-size: 26px !important;\n  }\n  #upl-gal-unipile .galup-intro {\n    font-size: 16px !important;\n  }\n  #upl-gal-unipile .galup-grid {\n    grid-template-columns: 1fr !important;\n  }\n  #upl-gal-unipile .galup-cta-row {\n    flex-direction: column !important;\n    align-items: flex-start !important;\n  }\n  #upl-gal-unipile .galup-cta-primary,\n  #upl-gal-unipile .galup-cta-secondary {\n    width: 100% !important;\n    justify-content: center !important;\n  }\n}\n@media (max-width: 480px) {\n  #upl-gal-unipile .galup-h2 {\n    font-size: 24px !important;\n  }\n}\n<\/style>\n\n<div id=\"upl-gal-unipile\">\n  <span id=\"gal-unipile\" style=\"display:block;position:relative;top:-80px;visibility:hidden;\"><\/span>\n  <div class=\"galup-inner\">\n    <div class=\"galup-eyebrow\"><span>Managed Solution<\/span><\/div>\n    <h2 class=\"galup-h2\">How Unipile manages Gmail throttling on behalf of the authenticated user<\/h2>\n    <pee class=\"galup-intro\">Building all the throttling infrastructure described in this guide - per-user queues, semaphores, exponential backoff, daily quota budgeting, GCP project management - takes weeks and requires ongoing maintenance. <strong>Unipile handles all of this as an independent technical intermediary<\/strong>, so your team focuses on product logic, not quota plumbing. The Gmail API access via Unipile is not affiliated with, endorsed by, or sponsored by Google.<\/pee>\n\n    <div class=\"galup-grid\">\n      <div class=\"galup-feature\">\n        <div class=\"galup-feature-icon\">\n          <svg viewBox=\"0 0 24 24\"><polyline points=\"22 12 18 12 15 21 9 3 6 12 2 12\"\/><\/svg>\n        <\/div>\n        <pee class=\"galup-feature-title\">Managed exponential backoff + jitter<\/pee>\n        <pee class=\"galup-feature-text\">Every Gmail API call made <strong>on behalf of<\/strong> each authenticated user passes through Unipile's backoff layer. 429 errors are transparent to your code: Unipile retries automatically with full exponential backoff and jitter, surfacing only the eventual success or a clean error after max retries.<\/pee>\n      <\/div>\n      <div class=\"galup-feature\">\n        <div class=\"galup-feature-icon\">\n          <svg viewBox=\"0 0 24 24\"><path d=\"M17 21v-2a4 4 0 0 0-4-4H5a4 4 0 0 0-4 4v2\"\/><circle cx=\"9\" cy=\"7\" r=\"4\"\/><path d=\"M23 21v-2a4 4 0 0 0-3-3.87\"\/><path d=\"M16 3.13a4 4 0 0 1 0 7.75\"\/><\/svg>\n        <\/div>\n        <pee class=\"galup-feature-title\">Per-user queue isolation<\/pee>\n        <pee class=\"galup-feature-text\">Unipile maintains strict per-user isolation. A throttled authenticated user never impacts another user's throughput. Each <strong>linked account<\/strong> has its own queue with individual concurrency limits, ensuring fair resource allocation across your entire user base.<\/pee>\n      <\/div>\n      <div class=\"galup-feature\">\n        <div class=\"galup-feature-icon\">\n          <svg viewBox=\"0 0 24 24\"><rect x=\"3\" y=\"3\" width=\"18\" height=\"18\" rx=\"2\" ry=\"2\"\/><line x1=\"3\" y1=\"9\" x2=\"21\" y2=\"9\"\/><line x1=\"3\" y1=\"15\" x2=\"21\" y2=\"15\"\/><line x1=\"9\" y1=\"3\" x2=\"9\" y2=\"21\"\/><line x1=\"15\" y1=\"3\" x2=\"15\" y2=\"21\"\/><\/svg>\n        <\/div>\n        <pee class=\"galup-feature-title\">Unified model: Gmail + Outlook + IMAP<\/pee>\n        <pee class=\"galup-feature-text\">The same throttling logic applies uniformly across <strong>Gmail<\/strong>, <strong>Outlook<\/strong> (Microsoft 365 and Exchange Online), and <strong>IMAP<\/strong>. Your application uses one standardized API regardless of which email provider the authenticated user has linked. No provider-specific rate limit code to maintain.<\/pee>\n      <\/div>\n      <div class=\"galup-feature\">\n        <div class=\"galup-feature-icon\">\n          <svg viewBox=\"0 0 24 24\"><path d=\"M12 22s8-4 8-10V5l-8-3-8 3v7c0 6 8 10 8 10z\"\/><\/svg>\n        <\/div>\n        <pee class=\"galup-feature-title\">GDPR compliant, SOC2 aligned<\/pee>\n        <pee class=\"galup-feature-text\">Data accessed through Unipile is <strong>scoped to the session of the authenticated user<\/strong> who granted OAuth consent. No parallel archive, no long-term storage of mailbox data beyond session requirements. GDPR and SOC2 alignment built in.<\/pee>\n      <\/div>\n    <\/div>\n\n    <div class=\"galup-code-wrap\">\n      <div class=\"galup-code-bar\">\n        <span class=\"galup-dot-r\"><\/span><span class=\"galup-dot-y\"><\/span><span class=\"galup-dot-g\"><\/span>\n        <span class=\"galup-filename\">unipile-gmail-messages.js - no quota code needed<\/span>\n      <\/div>\n      <div class=\"galup-pre\"><code><span class=\"uc\">\/\/ With Unipile: no backoff, no semaphores, no quota tracking<\/span>\n<span class=\"uc\">\/\/ Unipile handles all gmail api rate limits as an independent technical intermediary<\/span>\n\n<span class=\"uk\">import<\/span><span class=\"uw\"> UnipileClient <\/span><span class=\"uk\">from<\/span><span class=\"us\"> '@unipile\/node-sdk'<\/span><span class=\"uw\">;<\/span>\n\n<span class=\"uk\">const<\/span><span class=\"uw\"> client = <\/span><span class=\"uk\">new<\/span><span class=\"uw\"> UnipileClient({<\/span>\n<span class=\"uw\">  apiKey: process.env.UNIPILE_API_KEY,<\/span>\n<span class=\"uw\">  baseUrl: <\/span><span class=\"us\">'https:\/\/api3.unipile.com:13613'<\/span>\n<span class=\"uw\">});<\/span>\n\n<span class=\"uc\">\/\/ List messages for an authenticated user's linked Gmail account<\/span>\n<span class=\"uc\">\/\/ Throttling, backoff, and per-user isolation handled server-side by Unipile<\/span>\n<span class=\"uk\">async function<\/span> <span class=\"ufn\">getRecentEmails<\/span><span class=\"uw\">(accountId) {<\/span>\n<span class=\"uk\">  const<\/span><span class=\"uw\"> messages = <\/span><span class=\"uk\">await<\/span><span class=\"uw\"> client.messaging.listMessages({<\/span>\n<span class=\"uw\">    account_id: accountId,  <\/span><span class=\"uc\">\/\/ authenticated user's linked account<\/span>\n<span class=\"uw\">    limit: <\/span><span class=\"un\">25<\/span>\n<span class=\"uw\">  });<\/span>\n<span class=\"uk\">  return<\/span><span class=\"uw\"> messages;<\/span>\n<span class=\"uw\">}<\/span>\n\n<span class=\"uc\">\/\/ Works identically for Gmail, Outlook, and IMAP linked accounts<\/span>\n<span class=\"uc\">\/\/ Same code, zero provider-specific rate limit handling<\/span><\/code><\/div>\n      <div class=\"galup-ok-strip\">\n        <svg viewBox=\"0 0 24 24\"><polyline points=\"20 6 9 17 4 12\"\/><\/svg>\n        <span>Unipile manages exponential backoff and per-user queuing server-side. Zero quota code in your app.<\/span>\n      <\/div>\n    <\/div>\n\n    <div class=\"galup-disclaimer\">\n      Unipile is not affiliated with, endorsed by, or sponsored by Google. Gmail is a trademark of Google LLC. All Gmail API quota limits are defined by Google and are subject to change. Unipile relays and manages these limits on behalf of authenticated users as an independent technical intermediary.\n    <\/div>\n\n    <div class=\"galup-cta-row\">\n      <a class=\"galup-cta-primary\" href=\"https:\/\/dashboard.unipile.com\/signup\/\" target=\"_blank\" rel=\"noopener\"><span>Build it with Unipile<\/span><svg viewBox=\"0 0 24 24\"><line x1=\"5\" y1=\"12\" x2=\"19\" y2=\"12\"\/><polyline points=\"12 5 19 12 12 19\"\/><\/svg><\/a>\n      <a class=\"galup-cta-secondary\" href=\"https:\/\/developer.unipile.com\/docs\" target=\"_blank\" rel=\"noopener\"><span>Read the docs<\/span><\/a>\n    <\/div>\n  <\/div>\n<\/div>[\/et_pb_code][\/et_pb_column][\/et_pb_row][\/et_pb_section][et_pb_section fb_built=\"1\" _builder_version=\"4.16\" background_color=\"transparent\" custom_padding=\"0px|0px|0px|0px\" custom_padding_tablet=\"0px|0px|0px|0px\" custom_padding_phone=\"0px|0px|0px|0px\" global_colors_info=\"{}\" theme_builder_area=\"post_content\" da_is_popup=\"off\" da_exit_intent=\"off\" da_has_close=\"on\" da_alt_close=\"off\" da_dark_close=\"off\" da_not_modal=\"on\" da_is_singular=\"off\" da_with_loader=\"off\" da_has_shadow=\"on\" da_disable_devices=\"off|off|off\"][et_pb_row _builder_version=\"4.16\" background_size=\"initial\" background_position=\"top_left\" background_repeat=\"repeat\" custom_padding=\"0px|0px|0px|0px\" global_colors_info=\"{}\" theme_builder_area=\"post_content\"][et_pb_column type=\"4_4\" _builder_version=\"4.16\" custom_padding=\"|||\" global_colors_info=\"{}\" custom_padding__hover=\"|||\" theme_builder_area=\"post_content\"][et_pb_code _builder_version=\"4.27.4\" hover_enabled=\"0\" global_colors_info=\"{}\" theme_builder_area=\"post_content\" sticky_enabled=\"0\"]<link href=\"https:\/\/fonts.googleapis.com\/css2?family=Inter:wght@400;500;600;700&#038;family=Poppins:wght@600;700&#038;display=swap\" rel=\"stylesheet\">\n\n<script type=\"application\/ld+json\">\n{\n  \"@context\": \"https:\/\/schema.org\",\n  \"@type\": \"FAQPage\",\n  \"mainEntity\": [\n    {\n      \"@type\": \"Question\",\n      \"name\": \"What is the rate limit for Gmail API?\",\n      \"acceptedAnswer\": {\n        \"@type\": \"Answer\",\n        \"text\": \"Gmail API has three rate limit dimensions: 1,200,000 quota units per minute per GCP project, 6,000 quota units per minute per user (mailbox), and 80,000,000 quota units per day per project. There is also a hidden limit of 50 concurrent requests per mailbox. Each API method costs a different number of quota units - messages.send costs 100 units while messages.list costs only 5.\"\n      }\n    },\n    {\n      \"@type\": \"Question\",\n      \"name\": \"How do I fix Gmail API 429 quota exceeded?\",\n      \"acceptedAnswer\": {\n        \"@type\": \"Answer\",\n        \"text\": \"To fix Gmail API 429 errors: implement exponential backoff with jitter (start at 1s, double each retry, add 0-500ms random jitter, cap at 32s). Limit concurrent requests per user to 40 or fewer using a semaphore. Use a per-user request queue to isolate throttling. Switch from messages.list polling to history.list for sync workloads - it costs only 2 units vs 5.\"\n      }\n    },\n    {\n      \"@type\": \"Question\",\n      \"name\": \"What is the daily quota for Gmail API?\",\n      \"acceptedAnswer\": {\n        \"@type\": \"Answer\",\n        \"text\": \"The Gmail API daily quota is 80,000,000 quota units per GCP project per day. This resets at midnight Pacific time. Hitting the daily limit returns a 403 dailyLimitExceeded error that cannot be retried until the reset. You can request a quota increase via the GCP Console under APIs & Services > Gmail API > Quotas.\"\n      }\n    },\n    {\n      \"@type\": \"Question\",\n      \"name\": \"How many emails can I send per day with Gmail API?\",\n      \"acceptedAnswer\": {\n        \"@type\": \"Answer\",\n        \"text\": \"The Gmail send quota is 500 emails per day for free Gmail accounts and 2,000 emails per day for Google Workspace accounts. This is per sender address, separate from the API quota unit limit. The messages.send method costs 100 quota units per call and counts against both the send quota and the API unit quota.\"\n      }\n    },\n    {\n      \"@type\": \"Question\",\n      \"name\": \"What is the difference between userRateLimitExceeded and rateLimitExceeded?\",\n      \"acceptedAnswer\": {\n        \"@type\": \"Answer\",\n        \"text\": \"rateLimitExceeded (HTTP 429) means the entire GCP project exceeded 1,200,000 quota units per minute across all users. userRateLimitExceeded (also HTTP 429) means a single user exceeded 6,000 quota units per minute OR sent more than 50 concurrent requests to their mailbox. userRateLimitExceeded is far more common in production multi-tenant applications.\"\n      }\n    },\n    {\n      \"@type\": \"Question\",\n      \"name\": \"How do I increase Gmail API quota?\",\n      \"acceptedAnswer\": {\n        \"@type\": \"Answer\",\n        \"text\": \"To increase Gmail API quota: go to GCP Console > APIs & Services > Gmail API > Quotas, click Request higher quota. Include in your request: current daily usage baseline, projected growth in 6 months, use case description with individual user OAuth authentication details, and a breakdown of which API methods you use and their proportion. Responses typically take 3-5 business days.\"\n      }\n    },\n    {\n      \"@type\": \"Question\",\n      \"name\": \"How much does messages.send cost in quota units?\",\n      \"acceptedAnswer\": {\n        \"@type\": \"Answer\",\n        \"text\": \"messages.send costs 100 quota units per call. This is the most expensive Gmail API method. With a per-user limit of 6,000 units per minute, you can send a maximum of 60 emails per minute per authenticated user before hitting the rate limit. Lower-cost alternatives for read operations: messages.list costs 5 units, history.list costs 2 units, and labels.list costs 1 unit.\"\n      }\n    },\n    {\n      \"@type\": \"Question\",\n      \"name\": \"Does Unipile handle Gmail API rate limits automatically?\",\n      \"acceptedAnswer\": {\n        \"@type\": \"Answer\",\n        \"text\": \"Yes. Unipile acts as an independent technical intermediary and manages Gmail API rate limits automatically on behalf of each authenticated user. This includes exponential backoff with jitter on 429 errors, per-user queue isolation (so one throttled user does not affect others), and a concurrency limiter per mailbox. The same throttling logic applies uniformly to Gmail, Outlook, and IMAP linked accounts.\"\n      }\n    },\n    {\n      \"@type\": \"Question\",\n      \"name\": \"Is Gmail API rate limiting per project or per user?\",\n      \"acceptedAnswer\": {\n        \"@type\": \"Answer\",\n        \"text\": \"Both. Gmail API enforces rate limits at two levels simultaneously: per GCP project (1,200,000 units\/min shared across all users) and per individual user (6,000 units\/min per mailbox). A request is rejected if either ceiling is exceeded. For multi-tenant applications, the per-user limit is typically the one that triggers first since different users hit their individual caps independently.\"\n      }\n    }\n  ]\n}\n<\/script>\n\n<span id=\"faq-gal\" style=\"display:block;position:relative;top:-80px;visibility:hidden;\"><\/span>\n<style>\n#upl-gal-faq { font-family:'Inter',sans-serif; padding:80px 20px; max-width:900px; margin:0 auto; background:transparent!important; }\n#upl-gal-faq *, #upl-gal-faq *::before, #upl-gal-faq *::after { margin:0!important; padding:0!important; box-sizing:border-box!important; }\n#upl-gal-faq .upl-faq-header { text-align:center!important; margin-bottom:60px!important; }\n#upl-gal-faq .upl-faq-title { font-family:'Poppins',sans-serif!important; font-size:clamp(32px,5vw,38px)!important; font-weight:700!important; color:#0f2736!important; margin-bottom:16px!important; line-height:1.2!important; }\n#upl-gal-faq .upl-faq-subtitle { font-size:17px!important; color:#383838!important; max-width:700px!important; margin:0 auto!important; line-height:1.6!important; }\n#upl-gal-faq .upl-faq-list { display:flex!important; flex-direction:column!important; gap:12px!important; }\n#upl-gal-faq .upl-faq-item { background:#ffffff!important; border:1px solid #e5e7eb!important; border-radius:16px!important; overflow:hidden!important; transition:all 0.3s ease!important; }\n#upl-gal-faq .upl-faq-item:hover { border-color:#3BB98B!important; box-shadow:0 4px 20px rgba(59,185,139,0.08)!important; }\n#upl-gal-faq .upl-faq-item.active { border-color:#3BB98B!important; box-shadow:0 8px 30px rgba(59,185,139,0.12)!important; }\n#upl-gal-faq .upl-faq-question { width:100%!important; display:flex!important; align-items:flex-start!important; justify-content:space-between!important; gap:20px!important; padding:24px 28px!important; background:transparent!important; border:none!important; cursor:pointer!important; text-align:left!important; }\n#upl-gal-faq .upl-faq-question-content { display:flex!important; align-items:flex-start!important; gap:16px!important; flex:1!important; }\n#upl-gal-faq .upl-faq-number { flex-shrink:0!important; padding:6px 12px!important; background:rgba(59,185,139,0.12)!important; color:#3BB98B!important; border-radius:20px!important; font-size:0.8rem!important; font-weight:600!important; }\n#upl-gal-faq .upl-faq-item.active .upl-faq-number { background:rgba(59,185,139,0.2)!important; color:#2a9d6e!important; }\n#upl-gal-faq .upl-faq-question-text { font-family:'Poppins',sans-serif!important; font-size:1.1rem!important; font-weight:600!important; color:#0f2736!important; line-height:1.4!important; padding-top:4px!important; }\n#upl-gal-faq .upl-faq-icon { flex-shrink:0!important; width:36px!important; height:36px!important; background:#f4f5f7!important; border-radius:50%!important; display:flex!important; align-items:center!important; justify-content:center!important; transition:all 0.3s ease!important; margin-top:2px!important; }\n#upl-gal-faq .upl-faq-icon svg { width:18px!important; height:18px!important; color:#64748b!important; transition:all 0.3s ease!important; }\n#upl-gal-faq .upl-faq-item:hover .upl-faq-icon { background:rgba(59,185,139,0.1)!important; }\n#upl-gal-faq .upl-faq-item:hover .upl-faq-icon svg { color:#3BB98B!important; }\n#upl-gal-faq .upl-faq-item.active .upl-faq-icon { background:#3BB98B!important; transform:rotate(45deg)!important; }\n#upl-gal-faq .upl-faq-item.active .upl-faq-icon svg { color:#ffffff!important; }\n#upl-gal-faq .upl-faq-answer { max-height:0!important; overflow:hidden!important; transition:max-height 0.4s ease!important; }\n#upl-gal-faq .upl-faq-item.active .upl-faq-answer { max-height:600px!important; }\n#upl-gal-faq .upl-faq-answer-content { padding:0 28px 28px 76px!important; color:#475569!important; font-size:1rem!important; line-height:1.7!important; }\n#upl-gal-faq .upl-faq-answer-content strong { color:#0f2736!important; font-weight:600!important; }\n#upl-gal-faq .upl-faq-answer-content a { color:#3BB98B!important; text-decoration:underline!important; }\n#upl-gal-faq .upl-faq-answer-content code { font-family:monospace!important; background:#f1f5f9!important; padding:2px 6px!important; border-radius:3px!important; font-size:0.85em!important; }\n#upl-gal-faq .upl-faq-cta { margin-top:50px!important; display:flex!important; align-items:center!important; justify-content:space-between!important; gap:20px!important; padding:20px 28px!important; background:#ffffff!important; border:1px solid #e5e7eb!important; border-radius:12px!important; }\n#upl-gal-faq .upl-faq-cta-text { color:#475569!important; font-size:1rem!important; }\n#upl-gal-faq .upl-faq-cta-button { display:inline-flex!important; align-items:center!important; gap:10px!important; background:#DDDF4C!important; color:#0F2836!important; padding:13px 20px!important; border-radius:8px!important; text-decoration:none!important; font-weight:700!important; font-size:1rem!important; border:none!important; cursor:pointer!important; white-space:nowrap!important; }\n#upl-gal-faq .upl-faq-cta-button:hover { transform:translateY(-2px)!important; }\n@media (max-width:768px) {\n  #upl-gal-faq { padding:60px 16px!important; }\n  #upl-gal-faq .upl-faq-answer-content { padding:0 20px 20px 20px!important; }\n  #upl-gal-faq .upl-faq-question { padding:18px 20px!important; }\n  #upl-gal-faq .upl-faq-cta { flex-direction:column!important; align-items:flex-start!important; }\n  #upl-gal-faq .upl-faq-title { font-size:26px!important; }\n}\n<\/style>\n\n<section id=\"upl-gal-faq\">\n  <div class=\"upl-faq-header\">\n    <h2 class=\"upl-faq-title\">Gmail API Rate Limits - FAQ<\/h2>\n    <pee class=\"upl-faq-subtitle\">Answers to the most common questions about gmail api rate limits, quota units, 429 errors, and scaling your integration.<\/pee>\n  <\/div>\n  <div class=\"upl-faq-list\">\n\n    <div class=\"upl-faq-item active\">\n      <button class=\"upl-faq-question\" aria-expanded=\"true\">\n        <div class=\"upl-faq-question-content\">\n          <span class=\"upl-faq-number\">01<\/span>\n          <span class=\"upl-faq-question-text\">What is the rate limit for Gmail API?<\/span>\n        <\/div>\n        <div class=\"upl-faq-icon\">\n          <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\"><line x1=\"12\" y1=\"5\" x2=\"12\" y2=\"19\"\/><line x1=\"5\" y1=\"12\" x2=\"19\" y2=\"12\"\/><\/svg>\n        <\/div>\n      <\/button>\n      <div class=\"upl-faq-answer\">\n        <div class=\"upl-faq-answer-content\"><pee>The Gmail API enforces limits across three dimensions simultaneously. At the project level: <strong>1,200,000 quota units per minute<\/strong> shared across all users, and <strong>80,000,000 quota units per day<\/strong>. At the user level: <strong>6,000 quota units per minute per mailbox<\/strong>. There is also a hidden limit of <strong>50 concurrent requests per mailbox<\/strong> which can trigger a 429 even when you are well under the quota unit ceiling. Each method has a different unit cost - <code>messages.send<\/code> costs 100 units while <code>messages.list<\/code> costs only 5.<\/pee><\/div>\n      <\/div>\n    <\/div>\n\n    <div class=\"upl-faq-item\">\n      <button class=\"upl-faq-question\" aria-expanded=\"false\">\n        <div class=\"upl-faq-question-content\">\n          <span class=\"upl-faq-number\">02<\/span>\n          <span class=\"upl-faq-question-text\">How do I fix Gmail API 429 quota exceeded?<\/span>\n        <\/div>\n        <div class=\"upl-faq-icon\">\n          <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\"><line x1=\"12\" y1=\"5\" x2=\"12\" y2=\"19\"\/><line x1=\"5\" y1=\"12\" x2=\"19\" y2=\"12\"\/><\/svg>\n        <\/div>\n      <\/button>\n      <div class=\"upl-faq-answer\">\n        <div class=\"upl-faq-answer-content\"><pee>Implement <strong>exponential backoff with jitter<\/strong>: start at 1,000ms on first retry, double each attempt, add 0-500ms random jitter, cap at 32,000ms. Never retry immediately. Add a <strong>concurrency limiter<\/strong> scoped per authenticated user, keeping in-flight requests below 40 per mailbox. Use a <strong>per-user queue<\/strong> so one throttled user does not impact others. Longer term, switch polling from <code>messages.list<\/code> (5 units) to <code>history.list<\/code> (2 units) and consider Gmail Push Notifications to eliminate polling entirely.<\/pee><\/div>\n      <\/div>\n    <\/div>\n\n    <div class=\"upl-faq-item\">\n      <button class=\"upl-faq-question\" aria-expanded=\"false\">\n        <div class=\"upl-faq-question-content\">\n          <span class=\"upl-faq-number\">03<\/span>\n          <span class=\"upl-faq-question-text\">What is the daily quota for Gmail API?<\/span>\n        <\/div>\n        <div class=\"upl-faq-icon\">\n          <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\"><line x1=\"12\" y1=\"5\" x2=\"12\" y2=\"19\"\/><line x1=\"5\" y1=\"12\" x2=\"19\" y2=\"12\"\/><\/svg>\n        <\/div>\n      <\/button>\n      <div class=\"upl-faq-answer\">\n        <div class=\"upl-faq-answer-content\"><pee>The Gmail API <strong>daily quota is 80,000,000 quota units per GCP project<\/strong>, resetting at midnight Pacific time. This limit returns a <code>403 dailyLimitExceeded<\/code> error - unlike per-minute 429 errors, this cannot be retried until the daily reset. To increase it: GCP Console > APIs & Services > Gmail API > Quotas > Request higher quota. Include current usage, growth projections, and your use case. Approval typically takes 3-5 business days.<\/pee><\/div>\n      <\/div>\n    <\/div>\n\n    <div class=\"upl-faq-item\">\n      <button class=\"upl-faq-question\" aria-expanded=\"false\">\n        <div class=\"upl-faq-question-content\">\n          <span class=\"upl-faq-number\">04<\/span>\n          <span class=\"upl-faq-question-text\">How many emails can I send per day with Gmail API?<\/span>\n        <\/div>\n        <div class=\"upl-faq-icon\">\n          <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\"><line x1=\"12\" y1=\"5\" x2=\"12\" y2=\"19\"\/><line x1=\"5\" y1=\"12\" x2=\"19\" y2=\"12\"\/><\/svg>\n        <\/div>\n      <\/button>\n      <div class=\"upl-faq-answer\">\n        <div class=\"upl-faq-answer-content\"><pee>The Gmail <strong>send quota is 500 emails per day<\/strong> for free Gmail accounts and <strong>2,000 emails per day<\/strong> for Google Workspace accounts. This limit is per sender address and is separate from the API quota unit budget. Each <code>messages.send<\/code> call also costs 100 quota units, so at 6,000 units\/min per-user limit you can send at most 60 emails per minute before hitting the per-user gmail api rate limit - but the daily 500\/2,000 cap will likely be reached first for typical use cases.<\/pee><\/div>\n      <\/div>\n    <\/div>\n\n    <div class=\"upl-faq-item\">\n      <button class=\"upl-faq-question\" aria-expanded=\"false\">\n        <div class=\"upl-faq-question-content\">\n          <span class=\"upl-faq-number\">05<\/span>\n          <span class=\"upl-faq-question-text\">What is the difference between userRateLimitExceeded and rateLimitExceeded?<\/span>\n        <\/div>\n        <div class=\"upl-faq-icon\">\n          <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\"><line x1=\"12\" y1=\"5\" x2=\"12\" y2=\"19\"\/><line x1=\"5\" y1=\"12\" x2=\"19\" y2=\"12\"\/><\/svg>\n        <\/div>\n      <\/button>\n      <div class=\"upl-faq-answer\">\n        <div class=\"upl-faq-answer-content\"><pee><strong>rateLimitExceeded<\/strong> means the entire GCP project crossed 1,200,000 quota units\/min - all authenticated users together. <strong>userRateLimitExceeded<\/strong> means a single user exceeded 6,000 quota units\/min <em>or<\/em> sent more than 50 concurrent requests to their mailbox. In production multi-tenant apps, <code>userRateLimitExceeded<\/code> is far more common because individual users can independently hit their caps regardless of overall project-level headroom. Both return HTTP 429 and both respond to exponential backoff.<\/pee><\/div>\n      <\/div>\n    <\/div>\n\n    <div class=\"upl-faq-item\">\n      <button class=\"upl-faq-question\" aria-expanded=\"false\">\n        <div class=\"upl-faq-question-content\">\n          <span class=\"upl-faq-number\">06<\/span>\n          <span class=\"upl-faq-question-text\">How do I increase Gmail API quota?<\/span>\n        <\/div>\n        <div class=\"upl-faq-icon\">\n          <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\"><line x1=\"12\" y1=\"5\" x2=\"12\" y2=\"19\"\/><line x1=\"5\" y1=\"12\" x2=\"19\" y2=\"12\"\/><\/svg>\n        <\/div>\n      <\/button>\n      <div class=\"upl-faq-answer\">\n        <div class=\"upl-faq-answer-content\"><pee>Navigate to <strong>GCP Console > APIs & Services > Gmail API > Quotas<\/strong> and click \"Request higher quota\". Your request must include a concrete justification: current daily usage baseline, 6-month user growth projection, description of how users individually authenticate via OAuth, and a breakdown of API methods by proportion. Vague requests are denied. Also ensure your app is <a href=\"\/google-oauth-gmail-api-verification\/\">OAuth verified<\/a> - unverified apps are limited to 100 test users regardless of quota. Review typically takes 3-5 business days for initial response.<\/pee><\/div>\n      <\/div>\n    <\/div>\n\n    <div class=\"upl-faq-item\">\n      <button class=\"upl-faq-question\" aria-expanded=\"false\">\n        <div class=\"upl-faq-question-content\">\n          <span class=\"upl-faq-number\">07<\/span>\n          <span class=\"upl-faq-question-text\">How much does messages.send cost in quota units?<\/span>\n        <\/div>\n        <div class=\"upl-faq-icon\">\n          <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\"><line x1=\"12\" y1=\"5\" x2=\"12\" y2=\"19\"\/><line x1=\"5\" y1=\"12\" x2=\"19\" y2=\"12\"\/><\/svg>\n        <\/div>\n      <\/button>\n      <div class=\"upl-faq-answer\">\n        <div class=\"upl-faq-answer-content\"><pee><code>messages.send<\/code> costs <strong>100 quota units<\/strong> per call - the most expensive Gmail API method. With the per-user limit of 6,000 units\/min, you can send at most 60 emails per minute per authenticated user. For comparison: <code>messages.get<\/code> costs 5 units (1,200 calls\/min), <code>history.list<\/code> costs 2 units (3,000 calls\/min), and <code>labels.list<\/code> costs 1 unit (6,000 calls\/min). For high-volume outreach, consider whether your use case truly requires calling <code>messages.send<\/code> or whether creating drafts and sending in batches is more efficient.<\/pee><\/div>\n      <\/div>\n    <\/div>\n\n    <!-- 3 Compliance FAQ items -->\n    <div class=\"upl-faq-item\">\n      <button class=\"upl-faq-question\" aria-expanded=\"false\">\n        <div class=\"upl-faq-question-content\">\n          <span class=\"upl-faq-number\">08<\/span>\n          <span class=\"upl-faq-question-text\">What data does Unipile access in a user's Gmail mailbox?<\/span>\n        <\/div>\n        <div class=\"upl-faq-icon\">\n          <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\"><line x1=\"12\" y1=\"5\" x2=\"12\" y2=\"19\"\/><line x1=\"5\" y1=\"12\" x2=\"19\" y2=\"12\"\/><\/svg>\n        <\/div>\n      <\/button>\n      <div class=\"upl-faq-answer\">\n        <div class=\"upl-faq-answer-content\"><pee>Unipile accesses only the data explicitly requested by your application, <strong>scoped to the session of the authenticated user<\/strong> who has granted OAuth consent. There is no parallel archive, no independent long-term storage of mailbox data beyond what is required to serve the current API request. Each authenticated user's data is isolated: Unipile acts as an independent technical intermediary on behalf of that specific user only.<\/pee><\/div>\n      <\/div>\n    <\/div>\n\n    <div class=\"upl-faq-item\">\n      <button class=\"upl-faq-question\" aria-expanded=\"false\">\n        <div class=\"upl-faq-question-content\">\n          <span class=\"upl-faq-number\">09<\/span>\n          <span class=\"upl-faq-question-text\">Who controls the calling cadence when using Unipile?<\/span>\n        <\/div>\n        <div class=\"upl-faq-icon\">\n          <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\"><line x1=\"12\" y1=\"5\" x2=\"12\" y2=\"19\"\/><line x1=\"5\" y1=\"12\" x2=\"19\" y2=\"12\"\/><\/svg>\n        <\/div>\n      <\/button>\n      <div class=\"upl-faq-answer\">\n        <div class=\"upl-faq-answer-content\"><pee>The frequency and volume of API calls made on behalf of each authenticated user is a <strong>customer-side decision<\/strong>. Unipile manages the backoff and queuing infrastructure, but your application determines how often to request data. Unipile surfaces quota errors transparently and applies retry logic, but the overall calling cadence - including how many users sync simultaneously and how frequently - remains under your control as the developer building on top of Unipile.<\/pee><\/div>\n      <\/div>\n    <\/div>\n\n    <div class=\"upl-faq-item\">\n      <button class=\"upl-faq-question\" aria-expanded=\"false\">\n        <div class=\"upl-faq-question-content\">\n          <span class=\"upl-faq-number\">10<\/span>\n          <span class=\"upl-faq-question-text\">Is Unipile affiliated with Google or Gmail?<\/span>\n        <\/div>\n        <div class=\"upl-faq-icon\">\n          <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\"><line x1=\"12\" y1=\"5\" x2=\"12\" y2=\"19\"\/><line x1=\"5\" y1=\"12\" x2=\"19\" y2=\"12\"\/><\/svg>\n        <\/div>\n      <\/button>\n      <div class=\"upl-faq-answer\">\n        <div class=\"upl-faq-answer-content\"><pee>No. Unipile is <strong>not affiliated with, endorsed by, or sponsored by Google<\/strong>. Unipile is an independent technical intermediary that makes Gmail API calls on behalf of authenticated users who have individually granted OAuth consent through their own Google accounts. Gmail is a trademark of Google LLC. All Gmail API quotas, rate limits, and policies are defined by Google and subject to change independently of Unipile.<\/pee><\/div>\n      <\/div>\n    <\/div>\n\n  <\/div>\n  <div class=\"upl-faq-cta\">\n    <pee class=\"upl-faq-cta-text\">Questions about Gmail API limits and Unipile integration? Our team is here to help.<\/pee>\n    <span class=\"upl-faq-cta-button\" onclick=\"if(window.$crisp){$crisp.push(['do','chat:open'])}\"><span>Talk to an expert<\/span><svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><line x1=\"5\" y1=\"12\" x2=\"19\" y2=\"12\"\/><polyline points=\"12 5 19 12 12 19\"\/><\/svg><\/span>\n  <\/div>\n<\/section>\n\n<script>\n(function(){\n  function initFaq(){\n    var faq=document.getElementById('upl-gal-faq');\n    if(!faq)return;\n    faq.querySelectorAll('.upl-faq-question').forEach(function(btn){\n      btn.addEventListener('click',function(){\n        var item=btn.closest('.upl-faq-item');\n        var isActive=item.classList.contains('active');\n        faq.querySelectorAll('.upl-faq-item').forEach(function(i){i.classList.remove('active');i.querySelector('.upl-faq-question').setAttribute('aria-expanded','false');});\n        if(!isActive){item.classList.add('active');btn.setAttribute('aria-expanded','true');}\n      });\n    });\n  }\n  if(document.readyState==='loading'){document.addEventListener('DOMContentLoaded',initFaq);}else{initFaq();}\n})();\n<\/script>[\/et_pb_code][\/et_pb_column][\/et_pb_row][\/et_pb_section][et_pb_section fb_built=\"1\" _builder_version=\"4.16\" background_color=\"transparent\" custom_padding=\"0px|0px|0px|0px\" custom_padding_tablet=\"0px|0px|0px|0px\" custom_padding_phone=\"0px|0px|0px|0px\" global_colors_info=\"{}\" theme_builder_area=\"post_content\" da_is_popup=\"off\" da_exit_intent=\"off\" da_has_close=\"on\" da_alt_close=\"off\" da_dark_close=\"off\" da_not_modal=\"on\" da_is_singular=\"off\" da_with_loader=\"off\" da_has_shadow=\"on\" da_disable_devices=\"off|off|off\"][et_pb_row _builder_version=\"4.16\" background_size=\"initial\" background_position=\"top_left\" background_repeat=\"repeat\" custom_padding=\"0px|0px|0px|0px\" global_colors_info=\"{}\" theme_builder_area=\"post_content\"][et_pb_column type=\"4_4\" _builder_version=\"4.16\" custom_padding=\"|||\" global_colors_info=\"{}\" custom_padding__hover=\"|||\" theme_builder_area=\"post_content\"][et_pb_code _builder_version=\"4.16\" global_colors_info=\"{}\" theme_builder_area=\"post_content\"]<link href=\"https:\/\/fonts.googleapis.com\/css2?family=Inter:wght@400;500;600;700&#038;family=Poppins:wght@700;800&#038;display=swap\" rel=\"stylesheet\">\n<style>\n#upl-gal-related,\n#upl-gal-related *,\n#upl-gal-related *::before,\n#upl-gal-related *::after {\n  margin: 0 !important;\n  padding: 0 !important;\n  box-sizing: border-box !important;\n  border: none !important;\n  outline: none !important;\n  font-family: 'Inter', -apple-system, BlinkMacSystemFont, sans-serif !important;\n  line-height: 1.5 !important;\n  letter-spacing: normal !important;\n  text-transform: none !important;\n  text-decoration: none !important;\n  list-style: none !important;\n}\n#upl-gal-related {\n  display: block !important;\n  padding: 70px 0 !important;\n  overflow-x: hidden !important;\n}\n#upl-gal-related .galrel-inner {\n  max-width: 1100px !important;\n  margin: 0 auto !important;\n  padding: 0 24px !important;\n}\n#upl-gal-related .galrel-eyebrow {\n  display: inline-flex !important;\n  align-items: center !important;\n  gap: 8px !important;\n  background: rgba(59, 185, 139, 0.12) !important;\n  color: #2aaa7e !important;\n  padding: 6px 14px !important;\n  border-radius: 20px !important;\n  font-size: 12px !important;\n  font-weight: 700 !important;\n  text-transform: uppercase !important;\n  letter-spacing: 0.5px !important;\n  margin-bottom: 16px !important;\n  width: fit-content !important;\n}\n#upl-gal-related .galrel-dot {\n  width: 7px !important;\n  height: 7px !important;\n  background: #3BB98B !important;\n  border-radius: 50% !important;\n  flex-shrink: 0 !important;\n  display: inline-block !important;\n}\n#upl-gal-related .galrel-h2 {\n  font-family: 'Poppins', sans-serif !important;\n  font-size: 28px !important;\n  font-weight: 700 !important;\n  color: #0f2736 !important;\n  line-height: 1.2 !important;\n  margin-bottom: 32px !important;\n}\n#upl-gal-related .galrel-grid {\n  display: grid !important;\n  grid-template-columns: repeat(3, 1fr) !important;\n  gap: 24px !important;\n}\n#upl-gal-related .galrel-card {\n  background: #ffffff !important;\n  border: 1px solid #e5e7eb !important;\n  border-radius: 16px !important;\n  padding: 24px !important;\n  display: flex !important;\n  flex-direction: column !important;\n  gap: 12px !important;\n  height: 100% !important;\n  transition: border-color 0.2s ease, box-shadow 0.2s ease !important;\n  text-decoration: none !important;\n}\n#upl-gal-related .galrel-card:hover {\n  border-color: #3BB98B !important;\n  box-shadow: 0 4px 16px rgba(59, 185, 139, 0.10) !important;\n}\n#upl-gal-related .galrel-card-cat {\n  font-size: 11px !important;\n  font-weight: 700 !important;\n  color: #3BB98B !important;\n  text-transform: uppercase !important;\n  letter-spacing: 0.6px !important;\n}\n#upl-gal-related .galrel-card-title {\n  font-family: 'Poppins', sans-serif !important;\n  font-size: 15px !important;\n  font-weight: 700 !important;\n  color: #0f2736 !important;\n  line-height: 1.35 !important;\n  flex: 1 !important;\n}\n#upl-gal-related .galrel-card-desc {\n  font-size: 13px !important;\n  color: #64748b !important;\n  line-height: 1.6 !important;\n}\n#upl-gal-related .galrel-card-arrow {\n  display: flex !important;\n  align-items: center !important;\n  gap: 6px !important;\n  font-size: 13px !important;\n  font-weight: 600 !important;\n  color: #3BB98B !important;\n  margin-top: 4px !important;\n}\n#upl-gal-related .galrel-card-arrow svg {\n  width: 14px !important;\n  height: 14px !important;\n  stroke: #3BB98B !important;\n  fill: none !important;\n  stroke-width: 2.5 !important;\n  stroke-linecap: round !important;\n  stroke-linejoin: round !important;\n  flex-shrink: 0 !important;\n}\n\n@media (max-width: 900px) {\n  #upl-gal-related .galrel-grid {\n    grid-template-columns: repeat(2, 1fr) !important;\n  }\n}\n@media (max-width: 600px) {\n  #upl-gal-related {\n    padding: 50px 0 !important;\n  }\n  #upl-gal-related .galrel-grid {\n    grid-template-columns: 1fr !important;\n    gap: 16px !important;\n  }\n  #upl-gal-related .galrel-h2 {\n    font-size: 22px !important;\n  }\n}\n<\/style>\n\n<div id=\"upl-gal-related\">\n  <div class=\"galrel-inner\">\n    <div class=\"galrel-eyebrow\"><span class=\"galrel-dot\"><\/span><span>Continue reading<\/span><\/div>\n    <h2 class=\"galrel-h2\">Related articles<\/h2>\n    <div class=\"galrel-grid\">\n      <a class=\"galrel-card\" href=\"\/google-oauth-gmail-api-verification\/\" data-upl-link=\"\/google-oauth-gmail-api-verification\/\">\n        <span class=\"galrel-card-cat\">OAuth Verification<\/span>\n        <span class=\"galrel-card-title\">Google OAuth App Verification: Complete 2026 Guide<\/span>\n        <pee class=\"galrel-card-desc\">How to verify your app, pass CASA Tier 2, and move past the 100-user testing limit to production.<\/pee>\n        <span class=\"galrel-card-arrow\"><span>Read more<\/span><svg viewBox=\"0 0 24 24\"><line x1=\"5\" y1=\"12\" x2=\"19\" y2=\"12\"\/><polyline points=\"12 5 19 12 12 19\"\/><\/svg><\/span>\n      <\/a>\n      <a class=\"galrel-card\" href=\"\/google-oauth-errors-debugging\/\" data-upl-link=\"\/google-oauth-errors-debugging\/\">\n        <span class=\"galrel-card-cat\">Error Handling<\/span>\n        <span class=\"galrel-card-title\">Google OAuth Errors: Debugging access_denied, invalid_client and More<\/span>\n        <pee class=\"galrel-card-desc\">OAuth flow errors are different from API rate limit errors. This guide covers every OAuth error code and fix.<\/pee>\n        <span class=\"galrel-card-arrow\"><span>Read more<\/span><svg viewBox=\"0 0 24 24\"><line x1=\"5\" y1=\"12\" x2=\"19\" y2=\"12\"\/><polyline points=\"12 5 19 12 12 19\"\/><\/svg><\/span>\n      <\/a>\n      <a class=\"galrel-card\" href=\"\/google-oauth-refresh-token-expiry\/\" data-upl-link=\"\/google-oauth-refresh-token-expiry\/\">\n        <span class=\"galrel-card-cat\">Token Management<\/span>\n        <span class=\"galrel-card-title\">Gmail Refresh Token Expiry: Why invalid_grant Happens and How to Handle It<\/span>\n        <pee class=\"galrel-card-desc\">invalid_grant is not a quota error. Learn when refresh tokens expire and how to handle re-authentication gracefully.<\/pee>\n        <span class=\"galrel-card-arrow\"><span>Read more<\/span><svg viewBox=\"0 0 24 24\"><line x1=\"5\" y1=\"12\" x2=\"19\" y2=\"12\"\/><polyline points=\"12 5 19 12 12 19\"\/><\/svg><\/span>\n      <\/a>\n      <a class=\"galrel-card\" href=\"\/gmail-api-oauth-playground\/\" data-upl-link=\"\/gmail-api-oauth-playground\/\">\n        <span class=\"galrel-card-cat\">Testing<\/span>\n        <span class=\"galrel-card-title\">Gmail OAuth Playground: Test API Calls Before Pushing to Production<\/span>\n        <pee class=\"galrel-card-desc\">How to use the Google OAuth Playground to test quota costs and method behavior without writing code.<\/pee>\n        <span class=\"galrel-card-arrow\"><span>Read more<\/span><svg viewBox=\"0 0 24 24\"><line x1=\"5\" y1=\"12\" x2=\"19\" y2=\"12\"\/><polyline points=\"12 5 19 12 12 19\"\/><\/svg><\/span>\n      <\/a>\n      <a class=\"galrel-card\" href=\"\/google-oauth-100-user-limit-unverified-app\/\" data-upl-link=\"\/google-oauth-100-user-limit-unverified-app\/\">\n        <span class=\"galrel-card-cat\">Testing Limits<\/span>\n        <span class=\"galrel-card-title\">Gmail API 100 User Limit: Why It Happens and How to Go Beyond It<\/span>\n        <pee class=\"galrel-card-desc\">The 100-user cap is a verification limit, not a quota limit. Here is how to remove it for production apps.<\/pee>\n        <span class=\"galrel-card-arrow\"><span>Read more<\/span><svg viewBox=\"0 0 24 24\"><line x1=\"5\" y1=\"12\" x2=\"19\" y2=\"12\"\/><polyline points=\"12 5 19 12 12 19\"\/><\/svg><\/span>\n      <\/a>\n      <a class=\"galrel-card\" href=\"\/gmail-api-scopes\/\" data-upl-link=\"\/gmail-api-scopes\/\">\n        <span class=\"galrel-card-cat\">OAuth Scopes<\/span>\n        <span class=\"galrel-card-title\">Gmail API Scopes: Choose the Right Permission Level for Your App<\/span>\n        <pee class=\"galrel-card-desc\">A complete reference of Gmail OAuth scopes, from read-only to full access, with recommendations for each use case.<\/pee>\n        <span class=\"galrel-card-arrow\"><span>Read more<\/span><svg viewBox=\"0 0 24 24\"><line x1=\"5\" y1=\"12\" x2=\"19\" y2=\"12\"\/><polyline points=\"12 5 19 12 12 19\"\/><\/svg><\/span>\n      <\/a>\n    <\/div>\n  <\/div>\n<\/div>\n\n<script>\n(function(){\n  document.querySelectorAll('#upl-gal-related [data-upl-link]').forEach(function(el){\n    el.addEventListener('click', function(e){\n      var href = el.getAttribute('data-upl-link');\n      if(href){ e.preventDefault(); window.location.href = href; }\n    });\n  });\n})();\n<\/script>[\/et_pb_code][\/et_pb_column][\/et_pb_row][\/et_pb_section][et_pb_section fb_built=\"1\" _builder_version=\"4.16\" background_color=\"transparent\" custom_padding=\"0px|0px|0px|0px\" custom_padding_tablet=\"0px|0px|0px|0px\" custom_padding_phone=\"0px|0px|0px|0px\" global_colors_info=\"{}\" theme_builder_area=\"post_content\" da_is_popup=\"off\" da_exit_intent=\"off\" da_has_close=\"on\" da_alt_close=\"off\" da_dark_close=\"off\" da_not_modal=\"on\" da_is_singular=\"off\" da_with_loader=\"off\" da_has_shadow=\"on\" da_disable_devices=\"off|off|off\"][et_pb_row _builder_version=\"4.16\" background_size=\"initial\" background_position=\"top_left\" background_repeat=\"repeat\" custom_padding=\"0px|0px|0px|0px\" global_colors_info=\"{}\" theme_builder_area=\"post_content\"][et_pb_column type=\"4_4\" _builder_version=\"4.16\" custom_padding=\"|||\" global_colors_info=\"{}\" custom_padding__hover=\"|||\" theme_builder_area=\"post_content\"][et_pb_code _builder_version=\"4.16\" global_colors_info=\"{}\" theme_builder_area=\"post_content\"]<link href=\"https:\/\/fonts.googleapis.com\/css2?family=Inter:wght@400;500;600;700&#038;family=Poppins:wght@700;800&#038;display=swap\" rel=\"stylesheet\">\n<style>\n#upl-gal-pillar,\n#upl-gal-pillar *,\n#upl-gal-pillar *::before,\n#upl-gal-pillar *::after {\n  margin: 0 !important;\n  padding: 0 !important;\n  box-sizing: border-box !important;\n  border: none !important;\n  outline: none !important;\n  font-family: 'Inter', -apple-system, BlinkMacSystemFont, sans-serif !important;\n  line-height: 1.5 !important;\n  letter-spacing: normal !important;\n  text-transform: none !important;\n  text-decoration: none !important;\n  list-style: none !important;\n}\n#upl-gal-pillar {\n  display: block !important;\n  padding: 50px 24px !important;\n  overflow-x: hidden !important;\n}\n#upl-gal-pillar .galpl-inner {\n  max-width: 1100px !important;\n  margin: 0 auto !important;\n}\n#upl-gal-pillar .galpl-strip {\n  background: #f4f5f7 !important;\n  border-radius: 16px !important;\n  border: 1px solid #e5e7eb !important;\n  padding: 32px 40px !important;\n  display: flex !important;\n  align-items: center !important;\n  justify-content: space-between !important;\n  gap: 24px !important;\n  flex-wrap: wrap !important;\n}\n#upl-gal-pillar .galpl-text-block {}\n#upl-gal-pillar .galpl-label {\n  font-size: 12px !important;\n  font-weight: 700 !important;\n  color: #3BB98B !important;\n  text-transform: uppercase !important;\n  letter-spacing: 0.6px !important;\n  margin-bottom: 6px !important;\n  display: block !important;\n}\n#upl-gal-pillar .galpl-title {\n  font-family: 'Poppins', sans-serif !important;\n  font-size: 20px !important;\n  font-weight: 700 !important;\n  color: #0f2736 !important;\n  line-height: 1.3 !important;\n  margin-bottom: 8px !important;\n}\n#upl-gal-pillar .galpl-desc {\n  font-size: 14px !important;\n  color: #64748b !important;\n  line-height: 1.6 !important;\n}\n#upl-gal-pillar .galpl-cta {\n  display: inline-flex !important;\n  align-items: center !important;\n  gap: 8px !important;\n  background: #DDDF4C !important;\n  color: #0f2736 !important;\n  padding: 14px 24px !important;\n  border-radius: 8px !important;\n  font-size: 0.9rem !important;\n  font-weight: 600 !important;\n  transition: transform 0.3s ease !important;\n  cursor: pointer !important;\n  white-space: nowrap !important;\n  text-decoration: none !important;\n  flex-shrink: 0 !important;\n}\n#upl-gal-pillar .galpl-cta:hover {\n  transform: translateY(-5px) !important;\n}\n#upl-gal-pillar .galpl-cta svg {\n  width: 14px !important;\n  height: 14px !important;\n  stroke: currentColor !important;\n  fill: none !important;\n  stroke-width: 2.5 !important;\n  stroke-linecap: round !important;\n  stroke-linejoin: round !important;\n  flex-shrink: 0 !important;\n}\n\n@media (max-width: 768px) {\n  #upl-gal-pillar {\n    padding: 40px 16px !important;\n  }\n  #upl-gal-pillar .galpl-strip {\n    padding: 24px !important;\n    flex-direction: column !important;\n    align-items: flex-start !important;\n  }\n  #upl-gal-pillar .galpl-cta {\n    width: 100% !important;\n    justify-content: center !important;\n  }\n}\n<\/style>\n\n<div id=\"upl-gal-pillar\">\n  <div class=\"galpl-inner\">\n    <div class=\"galpl-strip\">\n      <div class=\"galpl-text-block\">\n        <span class=\"galpl-label\">Pillar guide<\/span>\n        <pee class=\"galpl-title\">The Complete Email API Guide for Developers<\/pee>\n        <pee class=\"galpl-desc\">Gmail limits are one piece of the email API picture. The pillar guide covers Gmail, Outlook, and IMAP integration patterns end-to-end.<\/pee>\n      <\/div>\n      <a class=\"galpl-cta\" href=\"\/email-api\/\" data-upl-link=\"\/email-api\/\"><span>Read the Email API guide<\/span><svg viewBox=\"0 0 24 24\"><line x1=\"5\" y1=\"12\" x2=\"19\" y2=\"12\"\/><polyline points=\"12 5 19 12 12 19\"\/><\/svg><\/a>\n    <\/div>\n  <\/div>\n<\/div>\n\n<script>\n(function(){\n  document.querySelectorAll('#upl-gal-pillar [data-upl-link]').forEach(function(el){\n    el.addEventListener('click', function(e){\n      var href = el.getAttribute('data-upl-link');\n      if(href){ e.preventDefault(); window.location.href = href; }\n    });\n  });\n})();\n<\/script>[\/et_pb_code][\/et_pb_column][\/et_pb_row][\/et_pb_section]\n","protected":false},"excerpt":{"rendered":"<p>May 2026 Update Gmail API limits at a glance Before writing a single line of retry logic, you need a clear picture of all three quota axes Google enforces. The table below is the reference you will bookmark: per-project throughput, per-user caps, and the daily ceiling that resets at midnight Pacific time. 1.2M Quota units [&hellip;]<\/p>\n","protected":false},"author":4,"featured_media":279160,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_et_pb_use_builder":"on","_et_pb_old_content":"","_et_gb_content_width":"","inline_featured_image":false,"footnotes":""},"categories":[69],"tags":[],"post_folder":[],"class_list":["post-279153","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-api-guidelines"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.6 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Gmail API Limits in 2026: Quotas, Rate Limits, and How to Handle Them - Unipile<\/title>\n<meta name=\"description\" content=\"Complete Gmail API quota reference: per-minute, per-user, daily limits, per-method costs, 429 handling, and a production-ready backoff pattern.\" \/>\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.unipile.com\/es\/limites-de-la-api-de-gmail\/\" \/>\n<meta property=\"og:locale\" content=\"es_ES\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Gmail API Limits in 2026: Quotas, Rate Limits, and How to Handle Them - Unipile\" \/>\n<meta property=\"og:description\" content=\"Complete Gmail API quota reference: per-minute, per-user, daily limits, per-method costs, 429 handling, and a production-ready backoff pattern.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.unipile.com\/es\/limites-de-la-api-de-gmail\/\" \/>\n<meta property=\"og:site_name\" content=\"Unipile\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/unipilefr\" \/>\n<meta property=\"article:published_time\" content=\"2026-06-04T14:24:07+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2026-06-08T14:59:04+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.unipile.com\/wp-content\/uploads\/2026\/06\/gmail-api-limits.png\" \/>\n\t<meta property=\"og:image:width\" content=\"2400\" \/>\n\t<meta property=\"og:image:height\" content=\"1600\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Damien Girardeau\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@UnipileAPI\" \/>\n<meta name=\"twitter:site\" content=\"@UnipileAPI\" \/>\n<meta name=\"twitter:label1\" content=\"Escrito por\" \/>\n\t<meta name=\"twitter:data1\" content=\"Damien Girardeau\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tiempo de lectura\" \/>\n\t<meta name=\"twitter:data2\" content=\"19 minutos\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/www.unipile.com\\\/gmail-api-limits\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.unipile.com\\\/gmail-api-limits\\\/\"},\"author\":{\"name\":\"Damien Girardeau\",\"@id\":\"https:\\\/\\\/www.unipile.com\\\/#\\\/schema\\\/person\\\/a2ac44e22bdc27d497ce8b58716a673e\"},\"headline\":\"Gmail API Limits in 2026: Quotas, Rate Limits, and How to Handle Them\",\"datePublished\":\"2026-06-04T14:24:07+00:00\",\"dateModified\":\"2026-06-08T14:59:04+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.unipile.com\\\/gmail-api-limits\\\/\"},\"wordCount\":1020,\"publisher\":{\"@id\":\"https:\\\/\\\/www.unipile.com\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/www.unipile.com\\\/gmail-api-limits\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.unipile.com\\\/wp-content\\\/uploads\\\/2026\\\/06\\\/gmail-api-limits.png\",\"articleSection\":[\"API Guidelines\"],\"inLanguage\":\"es\"},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.unipile.com\\\/gmail-api-limits\\\/\",\"url\":\"https:\\\/\\\/www.unipile.com\\\/gmail-api-limits\\\/\",\"name\":\"Gmail API Limits in 2026: Quotas, Rate Limits, and How to Handle Them - Unipile\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.unipile.com\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/www.unipile.com\\\/gmail-api-limits\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/www.unipile.com\\\/gmail-api-limits\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.unipile.com\\\/wp-content\\\/uploads\\\/2026\\\/06\\\/gmail-api-limits.png\",\"datePublished\":\"2026-06-04T14:24:07+00:00\",\"dateModified\":\"2026-06-08T14:59:04+00:00\",\"description\":\"Complete Gmail API quota reference: per-minute, per-user, daily limits, per-method costs, 429 handling, and a production-ready backoff pattern.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.unipile.com\\\/gmail-api-limits\\\/#breadcrumb\"},\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.unipile.com\\\/gmail-api-limits\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\\\/\\\/www.unipile.com\\\/gmail-api-limits\\\/#primaryimage\",\"url\":\"https:\\\/\\\/www.unipile.com\\\/wp-content\\\/uploads\\\/2026\\\/06\\\/gmail-api-limits.png\",\"contentUrl\":\"https:\\\/\\\/www.unipile.com\\\/wp-content\\\/uploads\\\/2026\\\/06\\\/gmail-api-limits.png\",\"width\":2400,\"height\":1600,\"caption\":\"Gmail API quotas, rate limits, 429 errors and managed throttling with Unipile.\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.unipile.com\\\/gmail-api-limits\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Accueil\",\"item\":\"https:\\\/\\\/www.unipile.com\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Gmail API Limits in 2026: Quotas, Rate Limits, and How to Handle Them\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.unipile.com\\\/#website\",\"url\":\"https:\\\/\\\/www.unipile.com\\\/\",\"name\":\"Unipile\",\"description\":\"Integrate Messaging &amp; Email, Connect with Ease via API\",\"publisher\":{\"@id\":\"https:\\\/\\\/www.unipile.com\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.unipile.com\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"es\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/www.unipile.com\\\/#organization\",\"name\":\"Unipile\",\"url\":\"https:\\\/\\\/www.unipile.com\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\\\/\\\/www.unipile.com\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/www.unipile.com\\\/wp-content\\\/uploads\\\/2021\\\/05\\\/logo-unipile.png\",\"contentUrl\":\"https:\\\/\\\/www.unipile.com\\\/wp-content\\\/uploads\\\/2021\\\/05\\\/logo-unipile.png\",\"width\":200,\"height\":49,\"caption\":\"Unipile\"},\"image\":{\"@id\":\"https:\\\/\\\/www.unipile.com\\\/#\\\/schema\\\/logo\\\/image\\\/\"},\"sameAs\":[\"https:\\\/\\\/www.facebook.com\\\/unipilefr\",\"https:\\\/\\\/x.com\\\/UnipileAPI\",\"https:\\\/\\\/www.linkedin.com\\\/company\\\/unipile\\\/\"]},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/www.unipile.com\\\/#\\\/schema\\\/person\\\/a2ac44e22bdc27d497ce8b58716a673e\",\"name\":\"Damien Girardeau\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/12dd140720736a8db29f540c42a17d2680cd54a04fb26bb7b55423c179b065a9?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/12dd140720736a8db29f540c42a17d2680cd54a04fb26bb7b55423c179b065a9?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/12dd140720736a8db29f540c42a17d2680cd54a04fb26bb7b55423c179b065a9?s=96&d=mm&r=g\",\"caption\":\"Damien Girardeau\"}}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"L\u00edmites de la API de Gmail en 2026: cuotas, l\u00edmites de frecuencia y c\u00f3mo gestionarlos - Unipile","description":"Referencia de cuotas de la API de Gmail: por minuto, por usuario, l\u00edmites diarios, costos por m\u00e9todo, manejo de 429 y un patr\u00f3n de retroceso listo para producci\u00f3n.","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.unipile.com\/es\/limites-de-la-api-de-gmail\/","og_locale":"es_ES","og_type":"article","og_title":"Gmail API Limits in 2026: Quotas, Rate Limits, and How to Handle Them - Unipile","og_description":"Complete Gmail API quota reference: per-minute, per-user, daily limits, per-method costs, 429 handling, and a production-ready backoff pattern.","og_url":"https:\/\/www.unipile.com\/es\/limites-de-la-api-de-gmail\/","og_site_name":"Unipile","article_publisher":"https:\/\/www.facebook.com\/unipilefr","article_published_time":"2026-06-04T14:24:07+00:00","article_modified_time":"2026-06-08T14:59:04+00:00","og_image":[{"width":2400,"height":1600,"url":"https:\/\/www.unipile.com\/wp-content\/uploads\/2026\/06\/gmail-api-limits.png","type":"image\/png"}],"author":"Damien Girardeau","twitter_card":"summary_large_image","twitter_creator":"@UnipileAPI","twitter_site":"@UnipileAPI","twitter_misc":{"Escrito por":"Damien Girardeau","Tiempo de lectura":"19 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.unipile.com\/gmail-api-limits\/#article","isPartOf":{"@id":"https:\/\/www.unipile.com\/gmail-api-limits\/"},"author":{"name":"Damien Girardeau","@id":"https:\/\/www.unipile.com\/#\/schema\/person\/a2ac44e22bdc27d497ce8b58716a673e"},"headline":"Gmail API Limits in 2026: Quotas, Rate Limits, and How to Handle Them","datePublished":"2026-06-04T14:24:07+00:00","dateModified":"2026-06-08T14:59:04+00:00","mainEntityOfPage":{"@id":"https:\/\/www.unipile.com\/gmail-api-limits\/"},"wordCount":1020,"publisher":{"@id":"https:\/\/www.unipile.com\/#organization"},"image":{"@id":"https:\/\/www.unipile.com\/gmail-api-limits\/#primaryimage"},"thumbnailUrl":"https:\/\/www.unipile.com\/wp-content\/uploads\/2026\/06\/gmail-api-limits.png","articleSection":["API Guidelines"],"inLanguage":"es"},{"@type":"WebPage","@id":"https:\/\/www.unipile.com\/gmail-api-limits\/","url":"https:\/\/www.unipile.com\/gmail-api-limits\/","name":"L\u00edmites de la API de Gmail en 2026: cuotas, l\u00edmites de frecuencia y c\u00f3mo gestionarlos - Unipile","isPartOf":{"@id":"https:\/\/www.unipile.com\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.unipile.com\/gmail-api-limits\/#primaryimage"},"image":{"@id":"https:\/\/www.unipile.com\/gmail-api-limits\/#primaryimage"},"thumbnailUrl":"https:\/\/www.unipile.com\/wp-content\/uploads\/2026\/06\/gmail-api-limits.png","datePublished":"2026-06-04T14:24:07+00:00","dateModified":"2026-06-08T14:59:04+00:00","description":"Referencia de cuotas de la API de Gmail: por minuto, por usuario, l\u00edmites diarios, costos por m\u00e9todo, manejo de 429 y un patr\u00f3n de retroceso listo para producci\u00f3n.","breadcrumb":{"@id":"https:\/\/www.unipile.com\/gmail-api-limits\/#breadcrumb"},"inLanguage":"es","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.unipile.com\/gmail-api-limits\/"]}]},{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/www.unipile.com\/gmail-api-limits\/#primaryimage","url":"https:\/\/www.unipile.com\/wp-content\/uploads\/2026\/06\/gmail-api-limits.png","contentUrl":"https:\/\/www.unipile.com\/wp-content\/uploads\/2026\/06\/gmail-api-limits.png","width":2400,"height":1600,"caption":"Gmail API quotas, rate limits, 429 errors and managed throttling with Unipile."},{"@type":"BreadcrumbList","@id":"https:\/\/www.unipile.com\/gmail-api-limits\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Accueil","item":"https:\/\/www.unipile.com\/"},{"@type":"ListItem","position":2,"name":"Gmail API Limits in 2026: Quotas, Rate Limits, and How to Handle Them"}]},{"@type":"WebSite","@id":"https:\/\/www.unipile.com\/#website","url":"https:\/\/www.unipile.com\/","name":"Unipile","description":"Integre la mensajer\u00eda y el correo electr\u00f3nico, con\u00e9ctese f\u00e1cilmente mediante API","publisher":{"@id":"https:\/\/www.unipile.com\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.unipile.com\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"es"},{"@type":"Organization","@id":"https:\/\/www.unipile.com\/#organization","name":"Unipile","url":"https:\/\/www.unipile.com\/","logo":{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/www.unipile.com\/#\/schema\/logo\/image\/","url":"https:\/\/www.unipile.com\/wp-content\/uploads\/2021\/05\/logo-unipile.png","contentUrl":"https:\/\/www.unipile.com\/wp-content\/uploads\/2021\/05\/logo-unipile.png","width":200,"height":49,"caption":"Unipile"},"image":{"@id":"https:\/\/www.unipile.com\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/unipilefr","https:\/\/x.com\/UnipileAPI","https:\/\/www.linkedin.com\/company\/unipile\/"]},{"@type":"Person","@id":"https:\/\/www.unipile.com\/#\/schema\/person\/a2ac44e22bdc27d497ce8b58716a673e","name":"Damien Girardeau","image":{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/secure.gravatar.com\/avatar\/12dd140720736a8db29f540c42a17d2680cd54a04fb26bb7b55423c179b065a9?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/12dd140720736a8db29f540c42a17d2680cd54a04fb26bb7b55423c179b065a9?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/12dd140720736a8db29f540c42a17d2680cd54a04fb26bb7b55423c179b065a9?s=96&d=mm&r=g","caption":"Damien Girardeau"}}]}},"_links":{"self":[{"href":"https:\/\/www.unipile.com\/es\/wp-json\/wp\/v2\/posts\/279153","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.unipile.com\/es\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.unipile.com\/es\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.unipile.com\/es\/wp-json\/wp\/v2\/users\/4"}],"replies":[{"embeddable":true,"href":"https:\/\/www.unipile.com\/es\/wp-json\/wp\/v2\/comments?post=279153"}],"version-history":[{"count":5,"href":"https:\/\/www.unipile.com\/es\/wp-json\/wp\/v2\/posts\/279153\/revisions"}],"predecessor-version":[{"id":279159,"href":"https:\/\/www.unipile.com\/es\/wp-json\/wp\/v2\/posts\/279153\/revisions\/279159"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.unipile.com\/es\/wp-json\/wp\/v2\/media\/279160"}],"wp:attachment":[{"href":"https:\/\/www.unipile.com\/es\/wp-json\/wp\/v2\/media?parent=279153"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.unipile.com\/es\/wp-json\/wp\/v2\/categories?post=279153"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.unipile.com\/es\/wp-json\/wp\/v2\/tags?post=279153"},{"taxonomy":"post_folder","embeddable":true,"href":"https:\/\/www.unipile.com\/es\/wp-json\/wp\/v2\/post_folder?post=279153"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}