ResumeForAI pages don't publish email addresses. Every page carries a Contact endpoint instead, and messages sent to it are relayed to the candidate.
An address is a black hole. You cannot tell a live one from a dead one, nothing comes back, and the same string is equally available to anyone scraping the page.
An endpoint answers. It confirms the message was accepted, it tells you when you have been rate limited rather than dropping the note in silence, and it is attributed — the candidate sees which company wrote, not an anonymous string.
Every published page exposes the same path. A person can use the form there without anything else; an automated sender needs a key.
curl -X POST https://alice.resume4.ai/contact \
-H "Authorization: Bearer lgb_your_key" \
-H "Content-Type: application/json" \
-d '{
"name": "Dana Reyes",
"email": "dana@acme.example",
"org": "Acme",
"body": "We are hiring a staff engineer ..."
}'
A success returns 201 with a receipt:
{"id": 4821, "status": "delivered"}
Without a key you get 401 and a pointer back to this page. The
email you send is where the candidate's reply arrives, so it must be one
you read.
Each page publishes machine-readable versions of itself, and both name the same contact endpoint:
/llms.txt — the page as prose, for language models/profile.json — the structured profile, with a contact descriptorOnly candidates who have opted in appear in ResumeForAI's own search. Bulk retrieval across the corpus is a separate interface and is not open yet.
The second limit is not about you. One inbox drowning is enough to make candidates stop reading the ones that matter, and the relay is worth nothing after that.
Getting a key. Email admin@resume4.ai with the name of your company and an address to reach you at. Keys are issued by hand at the moment, so expect a person rather than a form.
Bugs, ideas, things that felt clumsy — all welcome.
We read every one of these.