For developers

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()

Everything our own app uses, open to your code.

Request developer access

REST API

Your code, our scheduling. A change that breaks a rule is refused, and the answer names the rule.

Make a change the rules refuse
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.

Propose a rule
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.

Preview next week
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/mcp

51 tools in six groups

Schedule(14)get_overviewget_shiftscheck_schedulegenerate_schedulefind_eligiblecheck_assignmentassign_workerunassignswap_assignmentsadd_shiftmodify_shiftcancel_shiftget_requestsdecide_drop
Shift patterns(8)list_templatespropose_templateactivate_templatemodify_templateretire_templateroll_forwardadd_requirementremove_requirement
Rules(7)get_rulespropose_rulesimulate_rulepreview_rule_changeactivate_rulemodify_ruleretire_rule
People(9)get_workersget_workeradd_workerupdate_workerdeactivate_workerreactivate_workeradd_positionadd_time_offremove_time_off
Places, things and facts(10)list_resourcesadd_resourceupdate_resourceretire_resourcelist_attributesstate_attributeretract_attributeset_relationship_meaninglist_receiptscorrect_grounding
Change record(3)get_ledgerverify_ledgerundo

Every tool checks your rules and records the change.

An agent asks who can cover a shift
{
  "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.

Read the change record
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.

Add a mower with a fact
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.

  1. 1Open Settings, then Apps, and add OnlineScheduling.
  2. 2Sign in with your OnlineScheduling account and approve what it may do.
  3. 3Ask: “Who's working Saturday morning?”

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