infinitecampus-api
Query an Infinite Campus (Campus Parent portal) district directly with curl instead of running the infinitecampus-mcp server — log in with a real username/password, capture the session cookie + XSRF token, and curl grades, attendance, assignments, schedule, messages, documents, and fees. Use when you want IC data without the MCP, in a script, or on a machine where the MCP isn't installed. Infinite Campus is per-district: the base URL and district app name are configurable, not hardcoded. Skill: infinitecampus-api Owner: chrischall Summary: Query an Infinite Campus (Campus Parent portal) district directly with curl instead of running the infinitecampus-mcp server — log in with a real username/password, capture the session cookie + XSRF token, and curl grades, attendance, assignments, schedule, messages, documents, and fees. Use when you want IC data without the MCP, in a script, or on a machine where
Rank
62
Safety
84
Downloads
1.7k
Updated
Oct 10, 2026
Version
3.1.9
Source
CLAWHUB
About
What it does, and when to use it.
Capability contract not published. No trust telemetry is available yet. 1.7K downloads reported by the source. Last updated 10/10/2026.
Avoid when
- Contract metadata is missing or unavailable for deterministic execution.
Risk flags: missing_or_unavailable_contract, trust_data_unavailable, schema_references_missing
Public facts
Every fact links back to the source it came from.
- Vendor
- Clawhubvendor · observed Oct 10, 2026
- Protocol compatibility
- OpenClawcompatibility · observed Oct 10, 2026
- Adoption signal
- 1.7K downloadsadoption · observed Oct 10, 2026
- Latest release
- 3.1.9release · observed Oct 9, 2026
- Handshake status
- UNKNOWNsecurity
Install and run
Setup complexity: low.
clawhub skill install s17cjx1a349nz5apaqp02vgz4h85728z:infinitecampus-api- Setup complexity is classified as HIGH. You must provision dedicated cloud infrastructure or an isolated VM. Do not run this directly on your local workstation.
- Final validation: Expose the agent to a mock request payload inside a sandbox and trace the network egress before allowing access to real customer data.
Contract: missing
curl -s "https://www.xpersona.co/api/v1/agents/clawhub-chrischall-infinitecampus-api/snapshot"
Documentation
CLAWHUB
147,712 characters of source documentation, loaded on request.
Extracted files
4 files captured from the source.
SKILL.md
---
name: infinitecampus-api
description: >-
Query an Infinite Campus (Campus Parent portal) district directly with curl
instead of running the infinitecampus-mcp server — log in with a real
username/password, capture the session cookie + XSRF token, and curl grades,
attendance, assignments, schedule, messages, documents, and fees. Use when
you want IC data without the MCP, in a script, or on a machine where the MCP
isn't installed. Infinite Campus is per-district: the base URL and district
app name are configurable, not hardcoded.
---
# Infinite Campus via curl (no MCP)
Infinite Campus's Campus Parent portal is a classic server-rendered site
(no public API, no bot wall). A plain form POST to `verify.jsp` logs a
parent in and hands back a session cookie — no browser bridge needed. This
is the same login `infinitecampus-mcp`'s `src/client.ts`/`src/auth.ts` do;
this skill reproduces it with `curl` + a cookie jar.
**Infinite Campus is per-district.** Every parent's portal lives at their
own district's host (`https://campus.<district>.k12.example.us` or similar)
under an `appName` path segment. There is no shared IC endpoint — carry the
base URL and district from the same config the MCP uses:
```sh
: "${IC_BASE_URL:?set to your district's portal URL, e.g. https://campus.yourdistrict.org}"
: "${IC_DISTRICT:?set to the appName path segment, e.g. yourdistrict}"
: "${IC_USERNAME:?parent portal username}"
: "${IC_PASSWORD:?parent portal password}"
```
(Same 4 env vars the MCP reads — reuse the repo's `.env` or the host's
secret store; don't hardcode a district.)
## One-time setup
None — `curl` and `jq` are the only tools needed (`brew install jq` if
missing). No profile/pairing step, no extension.
## Login (capture cookies + XSRF token)
`verify.jsp` accepts a urlencoded form POST and returns 200 with an
`<AUTHENTICATION>state</AUTHENTICATION>` marker in the body — **not**
via HTTP status — plus ~20 `Set-Cookie` headers. Use a cookie jar so curl
does the Set-Cookie parsing/deduping for you:
```sh
JAR=$(mktemp)
BODY=$(curl -sS -c "$JAR" \
"$IC_BASE_URL/campus/verify.jsp?nonBrowser=true" \
--data-urlencode "username=$IC_USERNAME" \
--data-urlencode "password=$IC_PASSWORD" \
--data-urlencode "appName=$IC_DISTRICT" \
--data-urlencode "portalLoginPage=parents")
echo "$BODY" | grep -o '<AUTHENTICATION>[^<]*' # AUTHENTICATIONsuccess = good
```
`password-error` / `account-locked` / any non-`success` state means the
login failed — check that string before doing anything else. Credentials
go in the form body (never the query string — it lands in access logs).
Pull the XSRF token out of the jar (IC's JS reads it back and echoes it on
every request as `X-XSRF-TOKEN`; `JSESSIONID` alone is not enough):
```sh
XSRF=$(awk -F'\t' '$6=="XSRF-TOKEN"{print $7}' "$JAR")
```
## Core call pattern
Every subsequent request rides the jar + the XSRF header:
```sh
ic_get() { # ic_get <path-with-query>
curl -sS -b "$JAR" -H "X-XSRF-TOKEN: $XS_meta.json
{
"ownerId": "kn700jq4sjtf2anb0rk3ft4p7n856872",
"slug": "infinitecampus-api",
"version": "3.1.9",
"publishedAt": 1791588394808
}references/endpoints.md
# Infinite Campus endpoints for curl
Assumes the Login block from `../SKILL.md` has already run (`$JAR`, `$XSRF`,
`$IC_BASE_URL` set) and the `ic_get` helper is defined:
```sh
ic_get() { curl -sS -b "$JAR" -H "X-XSRF-TOKEN: $XSRF" -H 'Accept: application/json' "$IC_BASE_URL$1"; }
```
All paths are transcribed from `infinitecampus-mcp`'s `src/tools/*.ts` and
`docs/endpoints.md` — the same requests the `ic_*` MCP tools make. `$PID` =
a student's `personID` from the resolve-first step.
Some IC/prism responses serialize a 1-item collection as a bare object
instead of a 1-element array — pipe through `jq 'if type=="array" then . else [.] end'`
if a recipe below assumes an array and you get an object back.
---
## Students (resolve-first — always start here)
```sh
ic_get '/campus/api/portal/students' \
| jq '.[] | {personID, firstName, lastName, enrollments}'
```
Each `enrollments[]` entry carries `enrollmentID`, `calendarID`,
`structureID`, `schoolName`, `endDate` — needed by several endpoints below.
## Schedule
```sh
ic_get "/campus/resources/portal/roster?personID=$PID" | jq .
```
(Only `personID` is honored server-side — there is no date/term filter, so
the MCP tool takes none.)
## Assignments
```sh
# all assignments (full term history, ~hundreds of rows)
ic_get "/campus/api/portal/assignment/listView?personID=$PID" | jq .
# scoped to one course (sectionID from the schedule call above)
ic_get "/campus/api/portal/assignment/listView?personID=$PID§ionID=$SECTION_ID" | jq .
# client-side filters (server ignores date/missing params entirely):
ic_get "/campus/api/portal/assignment/listView?personID=$PID" \
| jq --arg since 2026-01-01 '[.[] | select(.dueDate >= $since)]'
```
## Recent (recently-graded) assignments
Server-side filtered by `modifiedDate` (defaults to 14 days ago in the MCP;
reproduce with `date -u -v-14d '+%Y-%m-%dT00:00:00'` on macOS):
```sh
SINCE=$(date -u -v-14d '+%Y-%m-%dT00:00:00')
ic_get "/campus/api/portal/assignment/recentlyScored?modifiedDate=$SINCE&personID=$PID" | jq .
```
## Grades
```sh
ic_get "/campus/resources/portal/grades?personID=$PID" | jq .
# scoped to one term:
ic_get "/campus/resources/portal/grades?personID=$PID&termID=$TERM_ID" | jq .
```
## Attendance (per-course summary, loop over each enrollment)
```sh
ic_get "/campus/resources/portal/attendance/$ENROLLMENT_ID?courseSummary=true&personID=$PID" \
| jq '.terms[]?.courses[]? | {absentList, tardyList, presentList, earlyReleaseList}'
```
Feature-gated: check `displayOptions.attendance` first (see Feature flags,
below) — a 404 here on a district with attendance disabled is expected, not
a bug.
## Attendance events (individual absences/tardies, loop over each enrollment)
```sh
ic_get "/campus/resources/portal/attendance/events?enrollmentID=$ENROLLMENT_ID&personID=$PID" \
| jq '.events[]? | {date: .localDate, code, description, excuse, comments}'
# excused-only, since a date (client-side filter):
ic_get "/campus/resources/portal/attenskill-card.md
## Description: Guides authorized Campus Parent users through district-specific sign-in and read-only queries for grades, attendance, assignments, schedules, messages, documents, and fees using curl. This skill is ready for commercial/non-commercial use. ## Publisher: [chrischall](https://clawhub.ai/user/chrischall) ### License/Terms of Use: MIT-0 ## Use Case: Authorized parents, guardians, and developers use this skill to retrieve student portal information from their own district without installing the MCP server. ### Deployment Geography for Use: Global ## Known Risks and Mitigations: Risk: Portal credentials and session tokens can expose a student's account if disclosed. Mitigation: Use only an account you are authorized to access on a trusted private machine; keep credentials and cookie jars out of logs and shared or synced folders, and delete temporary cookies after use. Risk: Downloaded documents and query results can contain sensitive student records. Mitigation: Limit access to authorized users, avoid logging record contents, and remove saved documents when finished. ## Reference(s): - [Infinite Campus endpoint recipes](references/endpoints.md) - [ClawHub skill listing](https://clawhub.ai/chrischall/skills/infinitecampus-api) ## Skill Output: **Output Type(s):** [Shell commands, Configuration guidance, Text] **Output Format:** [Markdown with curl and jq command examples] **Output Parameters:** [1D] **Other Properties Related to Output:** [Responses depend on the district's enabled portal modules; some example endpoints are unconfirmed.] ## Skill Version(s): 3.1.9 (source: ClawHub release evidence) ## Ethical Considerations: Users should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment.
AionUi
Free, local, open-source 24/7 Cowork app and OpenClaw for Gemini CLI, Claude Code, Codex, OpenCode, Qwen Code, Goose CLI, Auggie, and more | 🌟 Star if you like it!
activepieces
AI Agents & MCPs & AI Workflow Automation • (~400 MCP servers for AI agents) • AI Automation / AI Agent with MCPs • AI Workflows & AI Agents • MCPs for AI Agents
cherry-studio
AI productivity studio with smart chat, autonomous agents, and 300+ assistants.
CopilotKit
The Frontend for Agents & Generative UI. React + Angular
Machine-readable data
The same record, as JSON, for agents and crawlers.
{
"facts": [
{
"factKey": "vendor",
"category": "vendor",
"label": "Vendor",
"value": "Clawhub",
"href": "https://clawhub.ai/chrischall/skills/infinitecampus-api",
"sourceUrl": "https://clawhub.ai/chrischall/skills/infinitecampus-api",
"sourceType": "profile",
"confidence": "medium",
"observedAt": "2026-10-10T05:17:49.076Z",
"isPublic": true
},
{
"factKey": "protocols",
"category": "compatibility",
"label": "Protocol compatibility",
"value": "OpenClaw",
"href": "https://www.xpersona.co/api/v1/agents/clawhub-chrischall-infinitecampus-api/contract",
"sourceUrl": "https://www.xpersona.co/api/v1/agents/clawhub-chrischall-infinitecampus-api/contract",
"sourceType": "contract",
"confidence": "medium",
"observedAt": "2026-10-10T05:17:49.076Z",
"isPublic": true
},
{
"factKey": "traction",
"category": "adoption",
"label": "Adoption signal",
"value": "1.7K downloads",
"href": "https://clawhub.ai/chrischall/infinitecampus-api",
"sourceUrl": "https://clawhub.ai/chrischall/infinitecampus-api",
"sourceType": "profile",
"confidence": "medium",
"observedAt": "2026-10-10T05:17:49.076Z",
"isPublic": true
},
{
"factKey": "latest_release",
"category": "release",
"label": "Latest release",
"value": "3.1.9",
"href": "https://clawhub.ai/chrischall/infinitecampus-api",
"sourceUrl": "https://clawhub.ai/chrischall/infinitecampus-api",
"sourceType": "release",
"confidence": "medium",
"observedAt": "2026-10-09T23:26:34.808Z",
"isPublic": true
},
{
"factKey": "handshake_status",
"category": "security",
"label": "Handshake status",
"value": "UNKNOWN",
"href": "https://www.xpersona.co/api/v1/agents/clawhub-chrischall-infinitecampus-api/trust",
"sourceUrl": "https://www.xpersona.co/api/v1/agents/clawhub-chrischall-infinitecampus-api/trust",
"sourceType": "trust",
"confidence": "medium",
"observedAt": null,
"isPublic": true
}
],
"events": [
{
"eventType": "release",
"title": "Release 3.1.9",
"description": "- Removed the sample file skill-card.md. - No functional or documentation changes to the skill itself.",
"href": "https://clawhub.ai/chrischall/infinitecampus-api",
"sourceUrl": "https://clawhub.ai/chrischall/infinitecampus-api",
"sourceType": "release",
"confidence": "medium",
"observedAt": "2026-10-09T23:26:34.808Z",
"isPublic": true
}
]
}Record generated Oct 10, 2026.
