Aircall is the phone system. Your agent pulls call logs, transcripts and summaries, then writes them onto the candidate record in your CRM, so the call is recorded somewhere other than someone's memory. It can dial out and send SMS as well.
Aircall reads and writes. Calls flow in; notes flow out to the CRM.
the record the call notes belong on
the direct dials worth calling in the first place
the recorded interviews Aircall does not cover
call activity onto the candidate
Ask for the outcome and your agent composes the run itself. Or start from a skill, a whole pipeline it already knows end to end.
browse all skills →Every tool ships with a written playbook, and the agent loads it before the first call. Auth, rate limits, what each call costs, which actions need your approval, and the mistakes worth avoiding. It is the difference between an agent that knows the tool and one that guesses at it.
Read the Aircall docs →HOW in lib/aircall.py. Docs: developer.aircall.io/api-references.
https://api.aircall.io/v1 · Auth: HTTP Basic — username=AIRCALL_API_ID, password=AIRCALL_API_TOKEN (Company Settings > API Keys; never hardcode). (Multi-company partner apps use OAuth bearer — not in this adapter.)page / per_page (max 50); iter_calls/iter_contacts auto-walk via meta.next_page_link. Calls & Contacts capped at 10,000 items total; history is 6 months.X-AircallApi-Remaining).Calls: list_calls/iter_calls, get_call, search_calls, tag_call, comment_call, get_transcription, get_call_summary. Contacts: list/iter/search/get/create/update/delete (phone_numbers & emails are [{label,value}]). Also list_users, dial, list_numbers, list_tags, webhooks, send_message (SMS). request() covers the rest.
dial, send_message, tag_call, comment_call are write/outbound actions on a live phone system — confirm before bulk; pilot one.
Read source: pull call logs + transcripts/summaries → write as candidate activity into the ATS. Write target: comment_call to log recruiter notes; dial for click-to-call.
lib/aircall.pyImport: from lib.aircall import Aircall → instantiate Aircall() (reads key from env). Base: https://api.aircall.io/v1. Generic passthrough: request(method, path, *, params, json).
comment_call(call_id: int, content: str) -> Any — POST /calls/{id}/comments — add a note to a call.create_contact(payload: dict) -> Any — POST /contacts — phone_numbers/emails are lists of {label,value}.create_webhook(url: str, *, events: list[str] | None = None, **params) -> Any — POST /webhooks — subscribe to events (e.g. call.created, call.ended).delete_contact(contact_id: int) -> Anydial(user_id: int, number: str) -> Any — POST /users/{id}/dial — push a number to a user's phone.get_call(call_id: int) -> Anyget_call_summary(call_id: int) -> Anyget_contact(contact_id: int) -> Anyget_transcription(call_id: int) -> Any — GET /calls/{id}/transcription — Conversation Intelligence transcript.iter_calls(**params) -> Iterator[dict]iter_contacts(**params) -> Iterator[dict]list_calls(**params) -> Any — GET /calls — historical calls (page/per_page; from/to UNIX, direction, etc.).list_contacts(**params) -> Anylist_numbers(**params) -> Anylist_tags(**params) -> Anylist_users(**params) -> Anylist_webhooks(**params) -> Anysearch_calls(**params) -> Any — GET /calls/search — filter calls (phone_number, user_id, tags, from/to...).search_contacts(**params) -> Any — GET /contacts/search — by phone_number / email.send_message(number_id: int, to: str, body: str) -> Any — POST /messages — send an SMS from a registered number.tag_call(call_id: int, tags: list[str]) -> Any — POST /calls/{id}/tags — apply tags to a call.update_contact(contact_id: int, payload: dict) -> Any