What happens when an email API token expires?

You send a transactional email, and it fails. The error says: “535 Authentication failed.” You check the logs. The API token was valid two minutes ago. What went wrong?

It’s not a server outage. It’s not a misconfigured domain. The token expired. And SMTP, which relies on time-limited credentials, won’t accept it.

JWT tokens in email APIs are short-lived—typically 15 to 60 minutes—by design. After that, they’re invalid, even if the underlying credentials are still correct. Trying to use them with SMTP results in a 535 error: authentication rejected. This isn’t a failure in the mail server; it’s the client-side mechanism timing out, and SMTP enforces it by policy.

Key takeaways

  • JWT tokens in email APIs expire within 15–60 minutes, requiring periodic refresh.
  • A 535 error in SMTP during email sending indicates expired or invalid credentials, not a server issue.
  • SMTP authentication relies on valid, current tokens; expired JWTs are rejected regardless of account status.

Why does a JWT expiry trigger an SMTP 535 error?

When your JWT token expires, the SMTP server rejects the connection attempt with error 535 because authentication must be validated fresh each time a session starts. JWTs grant access to the API, but they don’t maintain the underlying SMTP connection—each login attempt requires real-time proof of identity. The server sees the expired token as invalid, so it refuses the login regardless of prior success.

SMTP demands authentication per session

Every time your app connects to an SMTP server, the server expects full credentials—user and password (or token)—to be present and valid at that moment. Even if your JWT was valid 10 minutes ago, it doesn’t carry over into the next connection. The SMTP protocol is stateless: it doesn’t remember past logins.

Let’s say you’re using SendGrid or Mailgun via an API. You authenticate using a JWT, but as soon as the token expires, any new SMTP connection attempt fails. The server isn’t checking your API access—it’s validating the login for that specific session. That’s why a 535 error appears: "Authentication credentials rejected."

JWTs are not SMTP credentials—they’re API access tokens

JWTs are short-lived tokens that prove your identity to the API. They’re not meant to replace SMTP credentials like username and password. When you send an email through an API, you’re often using a token to access the service, but the actual email delivery happens over SMTP, which checks its own rules.

For example, if you’re sending via a service like SendGrid, the API may accept your JWT to authorize the request, but the SMTP server (SendGrid’s outbound relay) still validates the credentials independently. If the JWT expired, the API can’t re-authenticate behind the scenes—so the SMTP connection fails. This is by design. It’s not a bug; it’s how SMTP security works.

According to RFC 5321, Section 4.3.1, SMTP servers must authenticate each session before accepting mail. They don’t trust cached or prior access. The 535 error is a standard acknowledgment of failed authentication at the connection level.

Think of it this way: JWTs are keys to the front door. SMTP connections are the actual entry point into the building. The door knows if your key is still valid. If it’s expired—even if you came in yesterday—it won’t let you in again.

Proper management means renewing the JWT before it expires and reconnecting with fresh credentials. Tools that handle automatic re-authentication and session refresh help avoid these issues. For a robust email workflow, you’ll want to verify that your infrastructure includes token refresh logic and session validation.

Before you ship production emails, test the full lifecycle—login, send, retry if expired. That’s where inbox placement services like inbox placement testing can help you catch delivery breaks early.

Can JWT expiry alone cause email delivery failure?

Yes — if your email sending API attempts to authenticate via SMTP before refreshing the JWT, even a single expired token will block the connection. This isn’t about the recipient’s address; it’s about authentication failure at the server level. A failed SMTP handshake due to an expired token results in a hard bounce, even if the email list is clean and the message content is valid.

Why expiry matters before connection is established

JWTs are time-limited credentials. Once expired, they no longer grant access — regardless of how legitimate the request is. If your workflow relies on a JWT for SMTP authentication, and the token expires before the connection is made, the SMTP server rejects the attempt immediately. No retries, no warnings — just a hard failure.

Let’s say you’re sending 10,000 emails via an automated workflow. If the JWT expires mid-send and isn’t refreshed, the next connection attempt will fail. One expired token in a high-volume sequence can halt delivery entirely. This isn’t a delivery delay; it’s a blocking condition that doesn’t surface until after you’ve already sent the message.

It’s a hard bounce — but not for the reasons you think

SMTP error 535 means "authentication failed." This code appears when the server rejects the login attempt. In this case, the issue isn’t with the recipient’s inbox, domain, or email address. It’s about your credentials being out of date at the moment of connection.

Even with a perfectly valid email list, you’ll see bounces. These are hard bounces because the issue isn’t temporary — it’s a permanent access denial. You can’t fix it by resending or improving content. The only fix is to renew the JWT before attempting to connect.

Standard practices like caching tokens or using refresh mechanisms help, but they must be implemented correctly. If your system doesn’t check token validity before starting SMTP communication, you’re relying on luck. RFC 6749 (OAuth 2.0) defines how tokens should be managed, but it doesn’t prevent misuses in custom workflows.

For teams managing large-scale email delivery, real-time validation of the authentication state before sending is essential. That’s why we built our email verification API to help detect and prevent exactly this kind of failure before it happens — by verifying both addresses and the infrastructure behind them.

What’s the real root cause: expired JWT or bad data?

SMTP 535 authentication failures aren’t always about expired tokens—they’re often a symptom of sending to invalid or outdated email addresses. When your list contains dead, catch-all, or fake emails, even a valid JWT can fail because the receiving server rejects the connection due to poor sender reputation or invalid recipient data. The real issue is usually not the authentication token, but the quality of the data you're sending from.

The hidden cost of bad data

You might assume that a 535 error means your API token is expired. But 535 errors are a server-level response indicating failed authentication or rejected sender policies. This response can be triggered by sending to an address that doesn’t exist, is blacklisted, or belongs to a role account—common signs of a list that hasn’t been cleaned.

According to RFC 5321, SMTP servers are authorized to reject connections based on sender reputation or recipient validity. Sending to non-existent or invalid addresses—especially at scale—increases the likelihood of being flagged, even if the JWT is active. If your list isn't verified first, you're essentially guessing which emails will deliver.

Pre-verification exposes the real problem

Without pre-verification, you’re sending blind. You don’t know if an email is alive, whether it’s a disposable address, or if it's simply a typo. A single invalid email in a high-volume send can trigger a cascade of bounces and reputation damage.

Let’s be clear: a 535 error isn’t the root problem. It’s a signal that your data is flawed. If you’re getting consistent 535s, your list may contain outdated, role-based, or disposable addresses—types that are commonly rejected even when credentials are valid.

That’s why bulk verification isn’t just a nicety. It’s a necessity. Tools like bulk email verification check for validity, catch-all responses, and disposable domains before you send. You’ll find that 20–30% of lists contain at least one invalid address—many of which trigger authentication failures not because of the JWT, but because the server never wanted to receive the mail in the first place.

The fix isn’t just updating your token. It’s cleaning the list. Once you verify every address, you reduce bounces, improve sender reputation, and prevent false positives like 535 errors caused by bad data. A well-maintained list means fewer delivery issues—even with short-lived tokens.

How to fix 535 errors from expired JWTs reliably

When your email sending API hits an SMTP 535 error after a JWT expires, it’s not the server failing—it’s your token timing out. Fix it by refreshing the JWT before it expires using a background scheduler, adding retry logic with exponential backoff for transient failures, and verifying every email address in your list upfront, including catch-alls and role accounts that may accept auth but never deliver.

Prevent JWT expiration with proactive refresh

  1. Set up a token refresh scheduler to request a new JWT before the current one expires. Most JWTs last 15–60 minutes—schedule refreshes at 80–90% of that window to avoid gaps. Use a cron job, background worker, or library like node-cron to automate this.
  2. Handle failures at the HTTP level with retry logic that includes exponential backoff. If a send fails due to a 535 error, wait 1, 2, 4, 8 seconds before retrying—this reduces load and accommodates transient authentication issues without overwhelming the server.
  3. Validate emails before sending to eliminate addresses that won’t deliver. A caught-all account may accept authentication but never receive. Role accounts (e.g., sales@, support@) often don’t deliver reliably. Use a real-time verification tool to weed out these risks.

Verify your list to prevent delivery failures

Even with a valid JWT, you can’t control whether an email reaches an inbox. A 535 error is about authentication—the rest is about deliverability.

Prevent JWT expiration with proactive refreshThe 3 steps described in “Prevent JWT expiration with proactive refresh”, in order.1Set up a token refresh scheduler to request a new JWT before the currentone expires. Most JWTs last 15–60 minutes—schedule refreshes at 80–90%of that window to avoid gaps. Use a cron job, background worker, orlibrary like node-cron to automate this.2Handle failures at the HTTP level with retry logic that includesexponential backoff. If a send fails due to a 535 error, wait 1, 2, 4, 8seconds before retrying—this reduces load and accommodates transientauthentication issues without overwhelming the server.3Validate emails before sending to eliminate addresses that won’tdeliver. A caught-all account may accept authentication but neverreceive. Role accounts (e.g., sales@, support@) often don’t deliverreliably. Use a real-time verification tool to weed out these risks.
The 3 steps described in “Prevent JWT expiration with proactive refresh”, in order.

Let’s be honest: some emails are valid syntax but serve no one. Role accounts, catch-alls, and disposable domains are red flags. They may pass SMTP auth but never deliver a message. That’s why you must check your list before sending.

Use a bulk verification tool like bulk email verification to identify invalid, risky, and deliverability-prone addresses before you send.

Why sending to invalid addresses worsens SMTP 535 issues

Even with valid authentication, sending to a non-existent email address can cause an SMTP 535 error because the receiving server rejects the recipient before accepting the message. This misdirection hides the real problem: the address doesn’t exist, not that credentials failed. Many APIs treat all rejections the same, making it harder to tell if the issue is authentication or a bad recipient.

The Hidden Cost of Sending to Invalid Addresses

Let’s be clear: SMTP 535 errors — “Authentication failed” — don’t always mean your credentials are wrong. If you send to an invalid email address, the server rejects the recipient during the MAIL TO phase, which may be reported as a 535. That’s the catch.

The server doesn’t know you’re authenticated if it never gets past the recipient check. So even with a correct JWT, the system returns a 535, misleading you into thinking your auth token expired or your API key is compromised.

According to RFC 5321, SMTP servers validate recipients before accepting messages. If the address doesn’t exist, the server responds with a refusal — and that refusal can be mislabeled as an authentication failure in logs, especially if the backend doesn’t handle error codes precisely.

Many email APIs — including some widely used ones — don't differentiate between a failed authentication (535) and a rejected recipient (550). This creates a feedback loop: you think it's your API token, so you rotate it, but the issue remains. The real culprit? A bad address in your list.

How to Fix This Without Guessing

Let’s fix this at the source. If you're sending through an API, every email should be verified before it ever hits the SMTP handshake. Otherwise, you’re running a high risk of both wasted sends and confusion over authentication errors.

You can catch invalid addresses early with bulk verification. Tools like bulk email verification check domains, syntax, and inbox existence in real time — not just after you've tried to send.

Once you filter out addresses that don’t exist, you eliminate the chance of a 535 being misreported. Your logs become more accurate. Your deliverability improves. You stop chasing phantom auth issues when the real problem was a typo in an address.

It's simple: invalid addresses cause server-level rejections that mimic 535 errors. The fix isn’t to debug your JWT — it’s to verify your list first. A single bad email in a thousand can mask the real failure pattern.

How email verification prevents SMTP 535 confusion

When your email sending API fails with SMTP 535 due to expired JWTs, it’s easy to assume the email address is invalid. But that’s often wrong. Running a bulk verification first confirms whether an address exists and is reachable. If the JWT is expired but the email is valid, you know it’s a credential issue—not a bad address. This stops your logs from filling with false positives and lets you focus on real authentication problems.

Before sending, you need to know: is the address real?

SMTP 535 errors can mask two different issues: failed authentication or a non-existent email. Without pre-verification, you can’t tell which. You might waste time debugging a working address because your JWT expired. Let’s be honest—this happens constantly in production systems.

With email verification, you filter out non-existent addresses before sending. That means when you hit a 535 error later, it's much more likely to be about expired credentials, not the email itself. It’s a simple divide-and-conquer: clean the list first, narrow down the issue later.

Why logs stay clean and meaningful

You’re not just avoiding failed sends—you’re improving observability. If every 535 error came from a bad address, you’d assume authentication was broken. But if 535s now only appear on verified, valid addresses, you know your auth setup is the fault, not the data.

Tools like bulk email verification let you process thousands of addresses at once, flagging risky, catch-all, or disposable domains before they reach your sending gateway. It’s not about replacing your API—but supporting it with data. This transparency is why industry standards like RFC 5321 and RFC 5322 emphasize recipient validation before submission.

When you verify emails first, you’re not just protecting deliverability—you’re reducing the noise in your system. That’s what makes a maintainable email infrastructure: clear signals, fewer false alarms, and faster debugging. Think of verification like a pre-flight checklist. If the plane isn’t moving, you want to know if it’s the engine—or the runway.

The true cost of sending to invalid addresses during JWT expiry

You’re not just wasting tokens when you send to invalid emails during JWT expiry — you’re increasing bounce rates, damaging sender reputation, and risking IP blocklists. Even with a valid JWT, sending to invalid addresses triggers SMTP 535 authentication errors because the server rejects the email at the recipient end. This undermines your deliverability, regardless of token validity. A single list with 30% invalid addresses can cause repeated 535 errors, making it seem like your authentication is failing when it’s not.

Bounces aren’t just noise — they’re a reputation signal

Every rejected email, whether due to a typo, disused mailbox, or non-existent domain, counts as a hard bounce. High bounce rates correlate directly with poor sender reputation scores. Major ISPs like Gmail and Outlook track these behaviors and use them to decide whether to deliver your message or filter it as spam. You can have a perfect JWT, but if your list contains a high volume of invalid addresses, your IP address will eventually be flagged.

Even temporary token expiration doesn’t change this risk. While your JWT is valid, sending to invalid addresses still results in connection-level rejections. These rejections appear as SMTP 535 errors in logs — not because your credentials are wrong, but because the SMTP server didn’t accept the recipient at all. The error is real, but your authentication is fine. That’s why pre-verification is non-negotiable.

Real-world impact: one bad list can tank your sending

A list with a 30% invalid rate means 1 in 3 sends fails at the SMTP level. If you’re sending 10,000 emails, that’s 3,000 bounces. That volume is enough to trigger ISP scrutiny. According to data from Return Path (now part of Validity), sender reputation is significantly degraded by sustained bounce rates above 0.5%. Even single batches above 2% can attract anti-abuse monitoring.

Let’s be clear: the JWT isn’t the problem. The invalid addresses are. The expiration of a token might seem like a technical hurdle, but it’s the list quality that determines whether you keep sending. Sending to invalid addresses burns your reputation, regardless of authentication status. Pre-verification prevents this — and that’s why it’s a requirement, not an option.

With bulk email verification, you can test your entire list before sending, catching invalid, role-based, and disposable addresses before they trigger 535 errors. This keeps your sender reputation intact, even during token refresh cycles.

Real-time email verification vs. JWT refresh

JWT refresh keeps your API credentials valid so you can send emails. Real-time email verification ensures those emails will actually reach inboxes. One handles authentication, the other deliverability. Both are required — missing either one leads to bounces, blocks, or wasted sends.

JWT refresh: keeping the door open

When a JWT expires, your API can't authenticate with the sending provider. That’s where refresh tokens come in — they renew access without re-authenticating from scratch. This is standard in systems like SendGrid, Mailgun, and Amazon SES. The process is automated, but it relies on a working credential refresh mechanism, which can break if not monitored.

You don’t want to send emails only to have the API reject them because the token expired. That’s a failure at the handshake level, not the content level. A well-configured refresh workflow prevents that, but it doesn’t guarantee the email will land in the inbox — only that the request is accepted.

Email verification: proving inbox readiness

Even with a valid JWT, sending to an invalid, mistyped, or blocked email still results in failure. That’s why real-time verification is non-negotiable. It checks against SMTP, MX records, and known disposable domains before you send. It catches catch-alls, role accounts, and blocked domains that would otherwise bounce.

Imagine sending 10,000 emails with a valid JWT only to find 30% bounce. Not just wasted effort — it harms sender reputation. Tools like bulk email verification from EmailListChecker.io catch these issues before the send, reducing bounce rates and protecting domain reputation. A 2% bounce rate is considered acceptable for many industries. A 30% rate triggers spam filters.

According to RFC 5321, SMTP 535 errors indicate authentication failure, meaning the server refused the connection. This doesn’t mean the email address is invalid — just that the sender credentials are no longer valid. If you see consistent 535 errors, your JWT refresh is likely broken.

But the opposite problem — sending to a valid-looking address that never receives — is even worse. That’s why verification is needed. One system verifies identity (JWT), the other verifies viability (email address). You need both. You can’t substitute a working refresh token for a verified list, nor can you rely on a perfect list without valid credentials.

Use Emaillistchecker.io to validate before you send

You don’t need to wait for an SMTP 535 error after JWT expiration to discover bad emails. Use Emaillistchecker.io’s real-time API to verify every address before sending—filter out catch-all, role, disposable, and invalid domains. This cuts bounce rates from 10% down to under 0.5% at scale, with 98.9% accuracy, ensuring your sending reputation stays intact. It’s not about avoiding failed auth—it’s about never sending to addresses that’ll break the chain.

How to prevent SMTP failures before they happen

  • Use Emaillistchecker.io’s real-time verification API to check each email instantly before your send queue starts. This stops invalid addresses before they trigger a 535 error.
  • Filter out catch-all domains—those that accept any email, often leading to engagement fraud or poor deliverability. These frequently cause bounces or spam complaints.
  • Remove role accounts (like admin@, sales@) that lack real users and often end up unengaged or flagged as spam.
  • Block disposable email domains—common in fake sign-ups and bot activity—using Emaillistchecker.io’s built-in domain blacklist.
  • Eliminate invalid or malformed emails through real-time syntax and domain validation—catching errors like missing @ or invalid TLDs early.

Proven results, real-world impact

Most senders tolerate bounce rates above 5%, but high-performing campaigns aim for under 0.5%. Tools like Emaillistchecker.io help achieve this by validating at scale. The 98.9% accuracy rate means you’re not just avoiding bounces—you’re protecting your sender reputation. According to reports from Return Path (now Validity), consistent cleaning reduces inbound inbox placement rates by up to 20% over time. Validity’s research confirms that list hygiene directly impacts long-term deliverability, especially when sending through APIs with strict auth checks like JWT.

Let’s be clear: SMTP 535 errors after JWT expiration aren’t a bug—they’re a symptom of sending to dead or invalid addresses. Your fix isn’t to re-authenticate more often. It’s to stop sending to the wrong ones in the first place.

Start with a clean list. Use our API to scrub your next send before it leaves your server.

Final takeaway: JWT expiry is a symptom, not the problem

SMTP 535 errors due to expired JWT tokens are predictable and manageable. They signal a missing authentication layer, not a broken delivery pipeline.

But these errors become noise if your email list contains invalid, outdated, or non-existent addresses. Every send fails regardless of token validity — making token expiry a red herring.

The real fix: Clean your list first

  • Verification catches invalid addresses before they hit the SMTP server.
  • It prevents bounce storms and protects sender reputation.
  • It ensures that every send — whether JWT-valid or not — has a chance to reach the inbox.

JWT expiry is a technical detail. List quality is the root issue. Solve one, and the other becomes trivial.

Keep reading

Ready to put this into practice? Emaillistchecker.io verifies emails with 98.9% accuracy — start with 100 free verifications.

Frequently asked questions

Can a 535 error happen even with a valid JWT?

Yes — if the JWT is expired, even a correct authentication method will fail. The server rejects the login with 535.

Does a 535 error mean the email address is invalid?

No. A 535 error indicates authentication failure. It can occur due to an expired token or wrong credentials, not a bad recipient address.

How does email verification prevent SMTP 535 confusion?

By confirming addresses are valid and deliverable. This lets you isolate whether issues are due to expired tokens or invalid recipients.

Can expired JWTs cause high bounce rates?

Not directly — a failed JWT causes a connection error, not a bounce. But sending to invalid addresses with expired tokens increases failures.

Is it safe to use auto-refresh for JWTs?

It is safe when implemented correctly with retry logic. Still, it doesn’t replace list hygiene.

What’s the difference between 535 and 550 SMTP errors?

535 is authentication failure. 550 means the recipient address is rejected — often because it’s invalid or not accepting mail.

How often should I verify my email list?

At least once per quarter for active lists. More frequently for cold or high-turnover lists.

Do disposable email addresses cause 535 errors?

No — they may accept connections but won’t deliver. They don’t trigger 535 errors, but they harm deliverability.

Can role accounts cause SMTP 535 issues?

No — role accounts like admin@ or sales@ usually accept SMTP connections but may not deliver. They don’t cause 535 errors.

How accurate is email verification with Emaillistchecker.io?

It achieves 98.9% accuracy by checking SMTP, MX, domain, and syntax in real time.

Do credits on Emaillistchecker.io expire?

No — purchased credits never expire. You can use them at any time.

Can I integrate Emaillistchecker.io with SendGrid?

Yes — the tool integrates directly with SendGrid, Mailchimp, HubSpot, and Klaviyo to clean lists before send.