API and command line
Your own scripts and AI agents can do what you do in Erlangly, with your role. Make a personal token under Your account (your name, bottom left); it's shown once and you can revoke it any time. A token only reads unless you make it able to change things, and it expires after 30 days, 90 days or a year (30 days at most when you must sign in with SSO). It leaves out other people's email addresses, ACD IDs and time-off notes unless an admin makes it to include them, for scripts like an HR sync: what an AI assistant reads goes to the company that makes it. Admins see everyone's tokens, and can revoke any, under Settings → AI agents.
curl -H "Authorization: Bearer erl_…" https://wfm.example.com/api/v1/me
AI assistants (MCP)
Claude, ChatGPT, Copilot and other AI assistants that speak MCP can connect to Erlangly and answer questions like “are we short on Billing tomorrow morning?”, “who's out of adherence right now?” or “what's waiting for my approval?”. An admin turns it on under Settings → AI agents, which shows the address to use (your Erlangly's address with /mcp on the end). In Claude, ChatGPT and others, add a connector with that address: the assistant sends you to sign in to Erlangly (with your password, or with SSO), then asks what it may do: only read, or also ask for, approve and turn down time off. Publishing a schedule stays with a person in Erlangly. You can disconnect it any time under Your account. Developer tools can use a personal token instead:
claude mcp add --transport http erlangly https://wfm.example.com/mcp --header "Authorization: Bearer erl_…"
Assistants that run in a vendor's cloud (claude.ai, ChatGPT) can only reach an Erlangly that's on the internet; desktop and command-line assistants only need to reach it from your computer.
Endpoints
GET /api/v1/me: who the token acts as.GET /api/v1/shifts?from=2026-10-06&to=2026-10-12: published shifts with their breaks, up to 31 days. Agents see their own; staff can addperson_idorlob.GET /api/v1/people: the roster, with lines of business and ACD IDs (staff only).GET /api/v1/people/:id: one person's contracts, availability, lines of business and time off coming up (staff, or the person themselves).GET /api/v1/forecasts?lob=BILLING&date=2026-10-06: forecasts;GET /api/v1/forecasts/:id?date=2026-10-06: a day's intervals with contacts, handle time and the agents needed, on the phone and with shrinkage (staff).GET /api/v1/schedule_periods?date=2026-10-06: schedule periods, whether they're published, and each draft's coverage (staff).GET /api/v1/coverage?date=2026-10-06&lob=BILLING: agents needed and scheduled every 15 minutes from 06:00 to 22:00, for the schedule or adraft_id(staff).GET /api/v1/adherence?from=2026-10-05&to=2026-10-11&by=team: adherence by person, team or line of business, lowest first, up to 62 days (staff).GET /api/v1/floor?lob=BILLING: the wallboard now: who's in which state, for how long, and who's out of adherence (staff).GET /api/v1/time_off_requests?status=submitted: time off. Agents see their own.POST /api/v1/time_off_requestswithtype,first_day, and optionallylast_day,from,to,note: ask for time off. Supervisors can addperson_idto enter it for someone else, approved at once.POST /api/v1/time_off_requests/:id/approvaland/rejection, with an optionalnote(supervisors; never your own).POST /api/v1/volume_intervals: import volumes (planners, or an ACD connection's token).
Errors come back as { "error": "…" } with an HTTP status that says what went wrong.
On the server
erlangly schedule [DATE] [--lob CODE] [--json]
erlangly volumes import FILE.csv
erlangly timeoff [--all]
erlangly timeoff approve|decline ID [NOTE]
These act as your first admin, and what they change is in the audit trail.