Production keyset created. RuName registered. Marketplace Account Deletion exemption approved. Environment variables set. Everything by the book.
401 Unauthorized.
I checked the obvious things first. Regenerated the keyset. Rechecked the RuName. Compared sandbox and production configs line by line. Read eBay's OAuth docs until I could recite them. Still 401.
What I eventually found: my browser's auto-translate was on, and it had translated part of my App ID into Korean characters when I copied it from the developer dashboard. The string looked correct at a glance because the length and structure were similar enough. It just wasn't the same string anymore.
Two things I took from this:
Credentials should never be copied from a rendered page. Copy from a plain text view, or paste into a plain editor first and verify character by character. Anything that renders can transform what you're looking at.
When a working config fails for no reason, stop debugging the logic and start verifying the inputs. I lost days assuming the problem was in my OAuth flow. The flow was fine. The input was corrupted before it ever got there.
Has anyone else hit something like this? Not a bug in your code, but something in the environment silently changing your data before your code even saw it?