Build on the scheduling engine we run on.
Use our rules engine, scheduler and change record in your own product. Call the REST API, give your agent our MCP server, or connect ChatGPT, Claude or Muse.
Request developer access- REST API, MCP server and AI assistants
- Every change checked against your rules
- Every change in a signed record
Read this week's shifts
import requests
shifts = requests.get(
"https://api.onlinescheduling.com/v1/shifts",
params={"from": "2026-10-19", "to": "2026-10-25"},
headers={"Authorization": "Bearer YOUR_API_KEY"},
).json()curl -G https://api.onlinescheduling.com/v1/shifts \
-d from=2026-10-19 -d to=2026-10-25 \
-H "Authorization: Bearer YOUR_API_KEY"const url = "https://api.onlinescheduling.com/v1/shifts";
const res = await fetch(`${url}?from=2026-10-19&to=2026-10-25`, {
headers: { Authorization: "Bearer YOUR_API_KEY" },
});
const shifts = await res.json();export ONLINESCHEDULING_API_KEY=YOUR_API_KEY
onlinescheduling shifts list --from 2026-10-19 --to 2026-10-25Everything our own app uses, open to your code.
Request developer accessREST API
Your code, our scheduling. A change that breaks a rule is refused, and the answer names the rule.
const url = "https://api.onlinescheduling.com/v1/assignments";
const res = await fetch(url, {
method: "POST",
headers: {
Authorization: "Bearer YOUR_API_KEY",
"Content-Type": "application/json",
"Idempotency-Key": "7f3c9a",
},
body: JSON.stringify({
shift: "shf_fri_oak",
person: "res_maya",
reason: "Theo is out Friday",
}),
});
const answer = await res.json();409 Conflict
{
"error": {
"code": "rule_violation",
"message": "Maya would work 44 hours this week.",
"violations": [
{ "rule": "No one works more than 40 hours a week.", "kind": "must" }
]
}
}Rules in plain words
Send a sentence and get it read back. A person switches it on.
const url = "https://api.onlinescheduling.com/v1/rules";
const res = await fetch(url, {
method: "POST",
headers: {
Authorization: "Bearer YOUR_API_KEY",
"Content-Type": "application/json",
},
body: JSON.stringify({
text: "No one works more than 40 hours a week.",
}),
});
const rule = await res.json();{
"id": "rule_40h",
"status": "draft",
"read_back": "Each person works at most 40 hours in a week, Monday to Sunday."
}Schedule runs
Build up to one year at a time, keeping what's already set.
const url = "https://api.onlinescheduling.com/v1/schedule-runs";
const res = await fetch(url, {
method: "POST",
headers: {
Authorization: "Bearer YOUR_API_KEY",
"Content-Type": "application/json",
},
body: JSON.stringify({
from: "2026-10-19",
to: "2026-10-25",
mode: "preview",
keep_existing: true,
}),
});
const run = await res.json();202 Accepted
{ "id": "run_5Tz", "status": "queued" }Rule checks
Must-have rules refuse a change. Try-to rules bend and say how.
Calendars
Shifts land in each person's own calendar, and busy times are respected.
Partner apps
Build once, pass our review, and any customer can connect it.
MCP server
Give your agent a scheduler that knows the rules. The same tools our own assistant uses, over MCP.
https://mcp.onlinescheduling.com/mcp51 tools in six groups
get_overviewget_shiftscheck_schedulegenerate_schedulefind_eligiblecheck_assignmentassign_workerunassignswap_assignmentsadd_shiftmodify_shiftcancel_shiftget_requestsdecide_droplist_templatespropose_templateactivate_templatemodify_templateretire_templateroll_forwardadd_requirementremove_requirementget_rulespropose_rulesimulate_rulepreview_rule_changeactivate_rulemodify_ruleretire_ruleget_workersget_workeradd_workerupdate_workerdeactivate_workerreactivate_workeradd_positionadd_time_offremove_time_offlist_resourcesadd_resourceupdate_resourceretire_resourcelist_attributesstate_attributeretract_attributeset_relationship_meaninglist_receiptscorrect_groundingget_ledgerverify_ledgerundoEvery tool checks your rules and records the change.
{
"jsonrpc": "2.0",
"id": 7,
"method": "tools/call",
"params": {
"name": "find_eligible",
"arguments": { "slot_id": "s0009" }
}
}Change record and feed
Every change with who, which app and why, signed and in order, and sent on to your webhooks.
const url = "https://api.onlinescheduling.com/v1/changes";
const res = await fetch(`${url}?after=4811`, {
headers: { Authorization: "Bearer YOUR_API_KEY" },
});
const changes = await res.json();{
"seq": 4812,
"type": "assignment.created",
"actor": { "type": "key", "name": "Quickstart" },
"reason": "Theo is out Friday",
"subject": { "shift": "shf_fri_oak", "resource": "res_lena" },
"signature": "b7d0…3c19"
}People, places and things
Any kind of resource, with facts in plain sentences that rules can use.
const url = "https://api.onlinescheduling.com/v1/resources";
const res = await fetch(url, {
method: "POST",
headers: {
Authorization: "Bearer YOUR_API_KEY",
"Content-Type": "application/json",
},
body: JSON.stringify({
kind: "asset",
name: "Mower 1",
tags: ["mower"],
facts: ["Zero-turn riding mower"],
}),
});
const mower = await res.json();AI assistants
Use it from the assistant you already use. ChatGPT, Claude and Muse connect through our MCP server.
- 1Open Settings, then Apps, and add OnlineScheduling.
- 2Sign in with your OnlineScheduling account and approve what it may do.
- 3Ask: “Who's working Saturday morning?”
- 1Open Settings, then Connectors, and choose Add custom connector.
- 2Paste our MCP address and sign in.
https://mcp.onlinescheduling.com/mcp - 3Ask: “Theo's out Friday. Cover his jobs.”
- 1A manager creates an API key in OnlineScheduling, under Settings, then Developers.
- 2Send Muse this message:Message to Muse
Connect to the OnlineScheduling MCP server at https://mcp.onlinescheduling.com/mcp. It uses streamable HTTP and an API key sent as a bearer token. Ask me for the key in your secure credential prompt. - 3Paste the key when Muse asks for it in its secure prompt.
An owner switches on assistant access for the workspace first.
- Kept apart
- Encrypted
- Signed change record
- Not used to train AI
Security and control, built in.
Single sign-on and SCIM
Sign in with SAML 2.0 or OpenID Connect. SCIM 2.0 keeps people in sync.
Owner controls
Every key and connected app in one list. Switch any of them off at once.
Acting as the person
Assistants act within the signed-in person's role. Keys do only what you tick.
Developer questions, answered.
How long does a first integration take?
About ten minutes once your access is approved. The Quickstart creates a key, reads this week's shifts, makes a change and finds it in the change record.
How do I get API access?
Choose Developer access on our Contact page and tell us what you want to build. A person replies within one business day. Approval switches on Settings, then Developers, where an owner or manager creates keys.
Do I need to write code?
Not to use an assistant. Connect ChatGPT, Claude or Muse and ask in plain words.
Which assistants work?
ChatGPT, Claude and Muse, and any app that connects to MCP servers over streamable HTTP.
How does an assistant get access to our workspace?
An owner switches on assistant access. Then each person connects their assistant and approves what it may do. Muse uses a key a manager creates.
Can an assistant change the schedule?
Yes, as the signed-in person and within what they're allowed to do. Every change is checked against your rules and kept in the change record.
What can an API key do?
Only what you tick when you create it, in one workspace. You can change its permissions, roll it or switch it off at any time.
What happens when a change breaks a rule?
A must-have rule refuses it with a 409 that names the rule, and nothing changes. A try-to rule bends, and the answer lists it under bends.
Can I build an app for other businesses?
Yes, as a partner app. Register it and pass our review, and customers connect it themselves.
Is our data used to train AI models?
No. Neither we nor our AI provider train models on customer data. What you send through ChatGPT, Claude or Muse also follows that assistant's own terms.
Bring us what you want to build.
Tell us what you'd like to build. A person replies within one business day.
Request developer access