CRCA requires 300% short maintenance margin on E*TRADE. On Robinhood, the long maintenance number I pulled was 60%.
Same stock, same day, completely different cost to hold.
I didn't know that until tonight. I'd been running my trading workstation off stale end-of-day data for weeks, watching prices that were hours old and having no visibility into what each broker actually charges to hold a position. So I sat down and wired up live data from E*TRADE, margin requirements from E*TRADE and Robinhood, and a side-by-side rate comparison for the three brokers I use.
Getting live quotes from E*TRADE
The workstation already had an E*TRADE OAuth adapter sitting dormant. My etrade-trade-placer project on the build server refreshes access tokens every morning via cron. The tokens were right there. I just wasn't using them.
The fix was plumbing. The sidecar, a Node process that sits between the Tauri app and external APIs, needed to read the borrowed tokens, sign requests with OAuth 1.0a, and poll E*TRADE's market data endpoint every 10 seconds. The front end needed to subscribe to symbols over WebSocket and use the quotes that came back instead of falling through to cached EOD data every time.
Two bugs hid in the plumbing for a while.
First, the SidecarAdapter was subscribing to a symbol, waiting 2 seconds for a response, then unsubscribing and falling back to EOD. E*TRADE polls every 10 seconds. The math doesn't work. I switched to persistent subscriptions: the first call returns EOD, the subscription stays alive, and by the second call the live quote is cached.
Second, the borrowed-tokens file on the build server was stale because the borrow script was SSHing to the wrong machine. The tokens lived on alienware, where the morning cron runs, not on ryansoldmac. A one-liner to re-export the local .env to the expected JSON path fixed it.
LLY went from showing $934.60, yesterday's close, to $963.33, the actual price. That felt good.
Reverse-engineering margin requirements
Here's the thing about margin that most trading apps ignore: the cost of holding a position isn't just the stock price. It's the maintenance requirement, meaning how much equity you need to keep the position open, times the margin interest rate, meaning what the broker charges you to borrow.
And those numbers vary wildly between brokers.
E*TRADE has a public margin tools page that accepts a POST with a list of symbols and returns firm-level requirements. No auth needed. The endpoint I found in the HAR was:
POST https://us.etrade.com/app/margin-tools/requirements-search-help.json
I wrote a scraper that hits it, batches symbols in groups of 10, and parses fields like longReq, shortReq, and nakedOptionPct. The response format is a little odd. longReqType of 1 means the value is a percentage. Type 3 means dollars per share. Type 0 means N/A. But once you know the encoding, it's manageable.
Robinhood's basic instrument metadata is simpler. GET /instruments/?symbol=CRCA returns a maintenance_ratio field. 0.6000 means 60%. No auth required for that basic instrument data.
The more interesting Robinhood data needs auth. The private shorting endpoint I found is shaped like this:
GET /instruments/{instrument_id}/shorting/
That endpoint is where the broker-specific short availability and borrow-rate story gets interesting. I don't want to silently replace Robinhood's borrow rate with FINRA short interest or some third-party estimate. Those are different things. If the app can't get Robinhood's broker-specific number, it should say so.
The comparison that matters
With requirements from both brokers, I built a comparison panel in the app's sidebar. For any symbol I'm looking at, it can show something like:
CRCA Margin Comparison
Long maintenance: RH 60% | ET 100%
Short maintenance: RH -- | ET 300%
Below that sits the margin interest rate comparison. Those rates come from public pricing pages for Robinhood, E*TRADE, and Schwab. The plan is boring on purpose: fetch the public pages once per day, parse the margin-rate section, normalize the schedule, hash it, and only save a new snapshot when the normalized data changes.
Margin interest (<$10k, Gold):
Robinhood Gold 5.75% $0.56/day
Schwab 11.83% $1.64/day
E*TRADE 12.45% $1.73/day
Robinhood is meaningfully cheaper for margin. That's not a secret, but seeing the daily cost difference for a specific position makes it concrete. For a $10k margin balance, you're paying about $3.45/day on E*TRADE versus about $1.60/day on Robinhood Gold. Over a year, that's roughly $675 in interest spread.
Now I can see that inside the workstation instead of doing napkin math after the fact.
The documentation capture
All of this started with HAR files. I opened Chrome DevTools on each broker's site, clicked around the margin tools and API docs, and saved the network traffic. Then I built redacted documentation from the captures instead of committing raw secrets.
The unredacted local inventory is huge. Robinhood alone had 61,000+ sensitive fields across 1,691 HTTP entries. Cookies, tokens, account identifiers, the usual mess. None of that belongs in git.
So I kept redacted versions instead: Robinhood market and margin notes, E*TRADE margin tool extraction notes, Schwab API documentation, a broker margin-rate file, and a sensitive-data inventory that explains what existed without exposing the values.
That matters because the next time I need to check an endpoint signature, I don't have to re-capture a HAR or trust some stale forum post. I can read the redacted docs and then go back to the live broker session only when I need fresh data.
Where Schwab fits
Schwab is the most official of the three. The Trader API has real documentation for market data, account data, positions, orders, and the usual OAuth flow. That's cleaner than scraping a public margin tool or using private app endpoints.
But the exact thing I wanted, broker-specific margin and shorting fields for a symbol in the same shape Robinhood and E*TRADE expose, is less direct. Some hard-to-borrow fields show up where Schwab exposes them in schemas, but the coverage isn't the same as "give me the short maintenance and current borrow situation for this symbol right now."
That's the funny split: Schwab has the strongest official API story, E*TRADE has a useful public web margin endpoint, and Robinhood exposes extremely useful private app data if you're authenticated and careful about what you're asking for.
What's next
The Schwab adapter is scaffolded but dormant while I finish the developer app registration. Robinhood's authenticated endpoints for short inventory, borrow rates, and instrument-specific buying power need token wiring. And the margin rate scraper should run on a daily cron instead of relying on hard-coded baseline values.
But tonight's work already changed how I think about positions. The numbers are real now, and they're different for every broker.
Disclaimer: This is not financial advice, trading advice, tax advice, or legal advice. Margin trading and short selling can amplify losses, and broker requirements can change without warning. Check the live broker data and talk to a qualified professional before making decisions with real money.
Enjoyed this post?
Get notified when I publish something new. No spam, unsubscribe anytime.