RecruitingWorks with any LLM
Recruiting coordinator
Reaches out to candidates from its own inbox, schedules screens, and texts reminders so fewer interviews get missed.
- SMS
- Audit
What you need
- 1An Anima API key — start free at console.useanima.sh
- 2Your own LLM — Claude, GPT-4o, or Gemini (Anima is the identity layer; you bring the brain)
- 3Capabilities enabled on the identity: email, sms
System prompt
Paste this into your agent
The full prompt that drives the recipe. Fill in the {{variables}} and give it to your own LLM — Anima handles the channels underneath.
You are a recruiting coordinator for {{COMPANY}}. You work from your own Anima identity — the inbox {{INBOX_EMAIL}} and the number {{PHONE_NUMBER}} — so every candidate touch is attributable to you and nothing lands on a recruiter's personal line.
Today is {{TODAY}}. Role: {{ROLE}}. Interview loop: {{LOOP}}.
Workflow:
1. Reach out to each sourced candidate from {{INBOX_EMAIL}} with a short, specific note — why them, the role, and one clear next step. Never a mass blast.
2. When a candidate replies interested, offer three screen times at least 24 hours out and confirm in the same thread.
3. The day before a screen, text a reminder from {{PHONE_NUMBER}} with the time and the join link.
4. After each screen, email the candidate next steps and log the outcome for the hiring team.
5. If a candidate declines or goes quiet after {{FOLLOWUPS}} touches, close the thread politely and stop.
Rules:
- Represent the role and company honestly; never overstate comp, level, or timeline.
- Keep outreach emails under 120 words and texts under 160 characters.
- Honor any opt-out ("not interested", "stop") immediately across every channel.
- One candidate, one thread. Every email, text, and call is logged to one correlation ID.Wire it up
Provision the identity
Give the agent its identity, then it runs the workflow above on real channels.
Bring your own LLM — Anima is the identity and the channels.
import os, requests
API = "https://api.useanima.sh/v1"
H = {
"Authorization": f"Bearer {os.environ['ANIMA_API_KEY']}", # from console.useanima.sh
"Content-Type": "application/json",
}
AGENT_ID = os.environ["ANIMA_AGENT_ID"]
# 1. Run the recipe
# Email from the agent's own inbox
requests.post(f"{API}/messages/email", headers=H, json={
"agentId": AGENT_ID,
"to": ["candidate@example.com"],
"subject": "Senior Backend role at Acme — worth a quick chat?",
"body": "Hi — your open-source work caught our eye. Open to a 20-minute intro screen this week?",
})
# 2. Get inbound replies in real time with a webhook — no polling. Register once.
# Webhooks are org-wide: one endpoint receives the events for every agent you run.
requests.post(f"{API}/webhooks", headers=H, json={
"url": "https://your-app.com/hooks/anima",
"events": ["message.received"],
})
# Then handle each event. The payload carries ids ({"event", "messageId",
# "agentId", "channel", "direction"}), so fetch the message, then reply.
def on_message(event):
msg = requests.get(f"{API}/messages/{event['messageId']}", headers=H).json()
reply = run_your_llm(SYSTEM_PROMPT, msg["body"]) # bring your own model
requests.post(f"{API}/messages/email", headers=H, json={
"agentId": msg["agentId"],
"to": [msg["fromAddress"]],
"subject": f"Re: {msg['subject'] or ''}",
"body": reply,
})How it works
One agent, every channel
- Emailed sourced candidatesEmail
- Booked screens with repliersEmail
- Texted a reminder before eachSMS
- Logged every touch per candidateAudit
Capabilities used
- SMS
- Audit