The KIDUART REST API, without the guesswork
Versioned endpoints under a stable base path, scoped API keys instead of a shared staff login, signature-verified provider webhooks and a predictable error contract. This page is the overview your IT team needs before asking for access; the full endpoint reference is issued with your key.
curl -X GET \
'https://api.kiduart.com/api/v1/students?classId=8A' \
-H 'x-api-key: kd_live_•••••••••' \
-H 'Content-Type: application/json'
{
"success": true,
"data": [ { "id": "stu_...", "class": "8", "section": "A" } ],
"meta": { "page": 1, "limit": 50, "total": 42 }
}Scoped API keys
Keys are issued per integration with named scopes, can be limited by IP, and can be rotated or revoked without touching a single staff account.
Tenant boundary first
Every request is resolved inside your school before any query runs, so a key cannot reach another school's records even by accident.
Rate limited and logged
Calls are rate limited under fair use and recorded, so unusual traffic is visible and a stuck job is diagnosable rather than mysterious.
Authentication
Two ways in, and they are not interchangeable
Machine-to-machine integrations use an API key issued to your school. Anything acting on behalf of a signed-in person uses that person's session token, so their role decides what they can see. Do not build a server integration on a staff login it breaks the moment that person leaves.
API key server to server
Issued per integration with named scopes. Send it as a header on every request, keep it on your server, and rotate it when the person who owns the integration changes.
x-api-key: kd_live_••••••••• Content-Type: application/json
Bearer token on behalf of a user
Used by the web and mobile apps after sign-in. Access tokens are short-lived and refreshed, and every call is still filtered by that user's role and school.
Authorization: Bearer <access_token> Content-Type: application/json
All traffic is HTTPS only. Keys are shown once when issued and stored hashed on our side, so if it is lost we reissue rather than retrieve which is exactly what you want from anything that can read student data.
Endpoint groups
What your developer can reach, by scope
Representative endpoints for the integrations schools ask for most. Paths, payloads and the full field list arrive with your key as a reference document, so your developer builds against the current contract rather than a marketing page that drifted.
Read and maintain the student record your website, admission funnel or reporting warehouse needs to stay in step with the office.
- GET
/api/v1/studentsList students with class, section and status filters.
Scope required: students:read
- GET
/api/v1/students/{id}Fetch one student with the fields your key is allowed to see.
Scope required: students:read
- POST
/api/v1/studentsCreate a student record from an external admission form.
Scope required: students:write
- PATCH
/api/v1/students/{id}Update contact or guardian details without touching academic history.
Scope required: students:write
Push punches from gate hardware and pull the register for dashboards. This is the group most schools connect first, because the device is already on the wall.
- POST
/api/v1/attendance/biometricSubmit device punches using a device key rather than a staff login.
Scope required: attendance:write
- GET
/api/v1/attendanceRead the register for a class, section or date range.
Scope required: attendance:read
- POST
/api/v1/attendanceMark or correct attendance from an approved external system.
Scope required: attendance:write
Pull dues and collection data for your accountant's system. Writes are deliberately narrow here, because the fee ledger is the record you least want a script to guess at.
- GET
/api/v1/fees/duesOutstanding dues by student, class or fee head.
Scope required: fees:read
- GET
/api/v1/fees/transactionsCollection history for reconciliation and reporting.
Scope required: fees:read
- POST
/api/v1/fees/collectRecord a payment collected in an approved external channel.
Scope required: fees:write
Class structure, subjects and assessment data for LMS bridges and analytics, so the class list your other tools use is the one the school actually maintains.
- GET
/api/v1/classesClasses and sections for the current academic session.
Scope required: academics:read
- GET
/api/v1/subjectsSubject master with class mapping.
Scope required: academics:read
- GET
/api/v1/exams/resultsPublished assessment results for reporting use.
Scope required: academics:read
Directory and staff attendance data for payroll bridges and access-control systems.
- GET
/api/v1/staffStaff directory with department and designation.
Scope required: staff:read
- GET
/api/v1/staff/attendanceStaff attendance for a period, for payroll input.
Scope required: staff:read
Generate and pull the same reports the dashboard shows, so a board pack is not rebuilt by hand every quarter.
- GET
/api/v1/reports/{type}Fetch a generated report with the filters you pass.
Scope required: reports:read
- POST
/api/v1/reports/exportQueue a large export and collect it when it is ready.
Scope required: reports:read
Pagination and filtering
List endpoints are paged. Pass page and limit, read the totals from meta, and filter with the query parameters documented for that resource. Large exports are queued rather than streamed, so a full-year report never times out mid-request.
Rate limits
Requests are rate limited per key under a fair-use policy, with stricter limits on authentication routes. A limited response returns 429 with headers telling you when to retry. If a genuine workload needs more headroom, tell us the pattern and we will size it with you rather than making you discover the ceiling in production.
Webhooks
Provider callbacks we verify and act on
Incoming webhooks are how a payment gets confirmed and a message gets marked delivered. Each one is signature-verified against the provider's secret before anything is written, and a repeated callback updates the existing record instead of duplicating it.
Razorpay
payment.captured, payment.failed, refund.processed, order.paid, dispute.created
Stripe
payment_intent.succeeded, charge.failed, charge.refunded
Twilio and MSG91
SMS delivery and failure callbacks
SendGrid and Mailgun
delivered, bounced, complaint
WhatsApp Business
message status callbacks and inbound message events
Not available yet: subscribing your own endpoint to KIDUART events. Outbound webhooks are on the roadmap. Until they ship, poll the relevant endpoint on a schedule that suits your workload.
Errors
One error shape, every endpoint
Failures come back in the same envelope as successes, so your client handles one shape rather than guessing per route.
{
"success": false,
"error": {
"code": "VALIDATION_ERROR",
"message": "admissionNumber is already in use",
"field": "admissionNumber"
}
}- 400
- The request body or query failed validation. The response names the field.
- 401
- Missing, expired or revoked credentials.
- 403
- Authenticated, but the key's scope does not cover this action.
- 404
- The record does not exist, or does not belong to your school.
- 409
- The action conflicts with the current state, such as a duplicate receipt.
- 429
- Rate limit hit. Back off and retry using the returned headers.
- 500
- Something failed on our side. It is logged with a reference you can quote to support.
Getting access
Developer questions, answered
How do we get an API key?
Ask your onboarding contact or write to support with the use case and what the integration needs to read or write. Keys are issued per integration with only the scopes that use case requires, so a reporting job never gets write access.
Can one key reach another school's data?
No. A key is issued against your school and every query is resolved inside that boundary. Multi-campus groups get keys scoped to the campuses they are meant to cover.
Is there a public sandbox?
There is no open sandbox you can self-register for. During onboarding you test against your own instance with non-production data before go-live, which is closer to your real configuration than a shared demo environment would be.
Can our systems subscribe to KIDUART events?
Not yet. We handle incoming webhooks from payment and messaging providers today; outbound webhooks your systems can subscribe to are on the roadmap. Until then, poll the relevant endpoint on a schedule.
What happens if a key leaks?
Revoke it and issue a new one. Because keys are managed objects with their own scopes and can be limited by IP, a leaked key is a contained incident rather than a shared staff password loose in the wild.
Bring your developer to the demo
Walk through the scopes your integration needs, what your key will be allowed to touch, and how it gets rotated when your team changes.
30-minute walkthrough
Booked around your school hours
Run on your own data
Your fee heads, classes and staff roles
No card, no lock-in
Nothing is charged to see the product
