Skip to main content
Light

How access works

Anyone can create an IntelliPlan account, so being signed in is not a meaningful bar for a student's coursework. Keys are applied for, scoped to what an app actually needs, and revocable one at a time.

1

Describe what you're building

App name, where it lives, and what it does with the data. A person reads this.

2

Pick the narrowest scopes

Read-only applications are approved automatically. Anything that writes into a student's account is reviewed.

3

Copy the key once

We store a hash, never the secret. Lose it and you roll it — we can't send it again.

Apply for a key

Sign in or create an account to apply. Keys are issued against an account so they can be scoped and revoked.

Authentication

Send your key in the X-API-Key header on every request.

curl -H "X-API-Key: $INTELLIPLAN_KEY" \
  https://intelliplan.tech/api/v1/assignments

There is a second scheme — POST /api/v1/auth/token exchanges an email and password for a Bearer token that carries every scope. It exists for first-party clients (our MCP server, the browser extension) where you are handing your own password to your own tool. It cannot be revoked individually, so it is not the right credential for an app other people use.

Endpoints

The machine-readable index lives at /api/v1/docs.

GET /api/v1/health Liveness. No credential — so you can tell "the API is down" from "my key is wrong" without spending your rate limit.
GET /api/v1/me The authenticated account, plus which key you are using and what it can do. read:profile
GET /api/v1/assignments The unified assignment list from Canvas, StudentVUE, Google Classroom, Notion, and manual tasks. read:assignments
POST /api/v1/tasks Create a manual task. {title, due_date?, priority?, course?, estimated_time?, notes?} write:tasks
POST /api/v1/assignments/dismiss Mark an assignment done. {title} write:tasks
POST /api/v1/assignments/restore Bring a dismissed assignment back. {title} write:tasks
GET /api/v1/tests Assignments the student marked as tests. read:tests
POST · DELETE /api/v1/tests Mark or unmark an assignment as a test. {title} write:tests
POST /api/v1/schedule/generate Build a study plan. {hours_per_day?, preferred_time?, custom_tasks?, assignments?} write:schedule
GET /api/v1/streak Sparks, streak length, freezes, level, weekly quests. read:streak
GET · PATCH /api/v1/identity The student's learning profile — grade level, focus areas, goals, availability. read:identity · write:identity

Errors and limits

Every failure uses one shape, and every response carries an X-Request-Id. Quote that id and we can find the exact request.

{
  "status": "error",
  "error": "insufficient_scope",
  "message": "This key is not authorized for that. Missing scope(s): write:tasks.",
  "request_id": "9f2c41ab77e0c318"
}

invalid_request · unauthorized · insufficient_scope · not_found · method_not_allowed · rate_limited · upstream_failed · server_error

Limits are counted per key, not per IP — a shared school network is not one bucket for the whole building. Your ceiling is on every response as X-RateLimit-Limit. A 429 means back off; it does not mean the key is in trouble.

Model Context Protocol

An official MCP server ships in the repository at intelliplan_mcp.py, so an AI assistant can read a student's assignments and build a plan through the same scoped credential.

IndexNow

IntelliPlan hosts an IndexNow verification key and notifies participating search engines when public URLs change. Protocol guide: /indexnow.

GET /<INDEXNOW_KEY>.txtOwnership verification key file, hosted at the site root.
POST /api/admin/indexnow/submitAdmin only — bulk submit from {"urls":[…]}, or the whole sitemap when omitted.
GET /api/admin/indexnow/statusAdmin only — key, host, endpoint, and sitemap URL count.