Asterisk / FreePBX Engineer + Voice AI Integration (Full-Time)

Please login or register as jobseeker to apply for this job.

TYPE OF WORK

Full Time

SALARY

2500-4000

HOURS PER WEEK

40

DATE UPDATED

Aug 22, 2026

JOB OVERVIEW

Start your application with the word TRUNK so I know you read this post.

I run two production Asterisk/FreePBX servers handling live inbound calls for US businesses. Several thousand DIDs across both. This is real traffic - when the PBX is down, revenue stops.

There are two halves to this job.

FIRST: fix what's broken. I have already completed a full technical audit of both systems. The findings are written up as issues in a private GitHub repo. You pick them up, diagnose, fix, test, push, and document what changed.

SECOND: build the after-hours voice AI. I want an AI agent answering calls on nights and weekends - capturing the caller's details, handling common requests, and escalating or taking a message when it can't. You'll design and build that integration into the existing PBX.

This role is telephony only. You will not touch my websites, CRM, or other applications. Your entire focus is the two PBX servers, the voice AI layer, and the backend code around them.

PART ONE - PBX ISSUE BACKLOG

- Working through an existing backlog of audited issues
- Inbound call routing: DIDs, inbound routes, IVRs, queues, time conditions, failover destinations
- Custom dialplan work where the FreePBX GUI cannot express the logic
- SIP trunk configuration and carrier troubleshooting
- Debugging call failures end to end - carrier SIP trace, Asterisk logs, AstDB, dialplan, database state, backend workers
- Blocking, rate limiting, and spam-protection logic
- CDR reporting and call-data queries

PART TWO - AFTER-HOURS VOICE AI AGENT

- Time-condition routing so calls go to the AI outside business hours and on weekends, and to the normal destinations during the day
- Getting call audio in and out of Asterisk to the AI service - AudioSocket, ARI externalMedia, or equivalent - with acceptable latency
- Handling interruption and barge-in so the caller can speak over the agent
- Warm transfer and escalation: the agent hands off to a human, a queue, or voicemail when it can't handle the call
- A fallback path so that if the AI service is slow or down, the call still gets answered. Callers must never hit dead air.
- Capturing what happened on the call - transcript, caller details, outcome - and pushing it somewhere useful
- Tuning the agent based on real call recordings, not assumptions

TECHNICAL ENVIRONMENT

- Asterisk / FreePBX on Ubuntu
- chan_pjsip, SIP trunks (registration-based and IP-authenticated)
- Custom dialplan in extensions_custom.conf, AGI hand-offs
- Node.js backend services, PM2, Nginx
- PostgreSQL / MySQL, Redis
- Git / GitHub - issues, branches, pull requests
- Several thousand DIDs under management

REQUIRED

- You have administered a production Asterisk or FreePBX system with real inbound traffic. Not a lab, not a course, not a Twilio/Vapi integration on its own.
- Shell access comfort: asterisk -rvvvvv, pjsip set logger on, reading the full log, querying the CDR database
- You can write and debug dialplan by hand, not only through the GUI
- Comfortable on Ubuntu: systemd, Nginx, log files, firewall
- Node.js well enough to read, fix, and build backend services around the PBX
- Git workflow: branch, commit with a clear message, pull request
- You trace a problem to root cause before changing anything, and you can say which segment of the call path owns the fault
- Strong written English - every fix needs a written explanation

STRONG PLUS

- You have already connected an AI voice agent to a real phone system - Vapi, Retell, ElevenLabs, Deepgram, OpenAI Realtime, or a custom STT/LLM/TTS pipeline
- Real-time media streaming from Asterisk (AudioSocket, ARI externalMedia, EAGI)
- Carrier-side troubleshooting (codec negotiation, NAT/RTP, session timers)
- fail2ban and SIP security hardening
- AI coding tools (Claude Code, Cursor) used with judgment on real code
- Experience being the only telephony person in an organization

NOT A FIT IF

- Your VoIP experience is only Twilio, Vapi, or Retell rather than running a PBX yourself
- You have only used the FreePBX web interface and never edited a config file or read an Asterisk log
- You need task-by-task supervision
- You would test a change on a production system carrying live calls

PROCESS

Short call, then a PAID technical assessment on an isolated staging PBX (4-6 hours, paid at your rate). Long-term full-time position. References checked before any production access is granted. You will need 3-4 hours of daily overlap with US Central time.

TO APPLY - ANSWER THESE SIX QUESTIONS

Applications without answers will not be reviewed. Attach your resume and any GitHub or work I can look at - but an application with a resume and no answers will be ignored. Short and specific beats long and general.

Q1. Describe one real call-path problem you traced end to end. Where exactly did the call die, how did you prove it, and what did you change?

Q2. Inbound calls from one carrier have one-way audio. Every other trunk is fine. What are the first three things you check?

Q3. Calls are dropping at the same duration every time - always around 15 or 30 minutes. What is your first hypothesis and why?

Q4. How do you make a dialplan change on a PBX carrying live calls without dropping any of them?

Q5. What tables would you query in the CDR database to answer "how many calls hit this DID between these two timestamps, and how many were answered?"

Q6. How would you get live call audio out of Asterisk and into an AI voice service, and back to the caller? If you have built this before, tell me how. If you have not, tell me how you would approach it - I would rather have an honest plan than a bluff.

VIEW OTHER JOB POSTS FROM:
SHARE THIS POST
facebook linkedin
  BENCHMARKS  
Loading Time: Base Classes  0.0007
Controller Execution Time ( Jobseekers / Job )  0.0102
Total Execution Time  0.0114
  GET DATA  
No GET data exists
  MEMORY USAGE  
1,510,576 bytes
  POST DATA  
No POST data exists
  URI STRING  
jobseekers/job/Asterisk-FreePBX-Engineer-Voice-AI-Integration-Full-Time-1714597
  CLASS/METHOD  
jobseekers/job
  DATABASE:  onlinejobs (Jobseekers:$db)   QUERIES: 13 (0.0053 seconds)  (Hide)
0.0004   SELECT *
                                
FROM exrates
                                WHERE rate_name 
'USD-PHP' 
0.0003   SELECT *
FROM `employer_jobs`
WHERE `job_id` = 1714597
 LIMIT 1 
0.0004   SELECT *
FROM `employers`
WHERE `employer_id` = 883009
 LIMIT 1 
0.0003   SELECT COUNT(*) AS `numrows`
FROM `t_thread` `t`
LEFT JOIN `t_thread_misc` `miscON `t`.`id` = `misc`.`thread_id`
WHERE `t`.`job_id` = 1714597
AND `misc`.`idIS NULL 
0.0005   SELECT e.business_namee.logoe.websitee.rebill_datee.date_added member_datehitsDATEDIFF('2026-08-23',ej.date_added) duration_daysDATEDIFF('2026-08-23',e.rebill_date) duration_rebillej.*, e.deactivate FROM employers eemployer_jobs ej WHERE e.employer_id ej.employer_id AND
                                   ((
e.user_level >= '500' AND ej.date_added <= e.rebill_date)
                                   OR 
e.employer_id '' OR (ej.date_approved <> '2000-01-01' and DATEDIFF('2026-08-23',ej.date_added) <= 14 ))
                                   AND 
e.deactivate != AND ej.deleted AND job_id '1714597' 
0.0004   SELECT *
FROM `employer_jobs_skills` `ejs`
LEFT JOIN `skills_categories` `scON `ejs`.`skill_id` = `sc`.`id`
WHERE `job_id` = 1714597 
0.0007   UPDATE employer_jobs SET hit_counts '***Aug-22-2026=930***Aug-23-2026=4' WHERE job_id'1714597'  
0.0006   UPDATE employer_jobs SET monthly_hits '***Aug-2026=934' WHERE job_id'1714597'  
0.0004   SELECT date_sent FROM jobseeker_sent_emails WHERE jobseeker_id '' AND job_id '1714597' AND status LIKE 'sent%' ORDER BY id DESC  
0.0004   SELECT *
FROM `employer_jobs_skills` `ejs`
LEFT JOIN `skills_categories` `scON `ejs`.`skill_id` = `sc`.`id`
WHERE `job_id` = 1714597 
0.0004   SELECT COUNT(*) AS `numrows`
FROM `employer_jobs`
WHERE `employer_id` = '883009'
AND `date_added` >= '2022-06-08' 
0.0003   select from teasers 
0.0003   SELECT FROM skill_categories WHERE skill_cat_id='' 
  HTTP HEADERS  (Show)
  SESSION DATA  (Show)
  CONFIG VARIABLES  (Show)