Build on the platform, not around it.
Everything the fkra apps do goes through the same REST API you get: organizations, paths, modules, progress. Wire it into your stack, not the other way round.
Generated from the same spec the apps consume
Docs/Developers/Introduction
The fkra API
One REST API behind every fkra surface. Same objects, same permissions, same audit trail, whether the call comes from the studio, the player, or your own service.
NoteEvery response body on this page is the real shape the API returns. Copy any snippet, swap in your key, and it runs.
Quickstart
#Three calls to a running academy. Create the org, enroll the team, read the progress. That is the API.
One POST: tenant, locale, and theme. The org exists.
1curl -X POST https://api.fkra.ai/v1/orgs \2 -H "Authorization: Bearer sk_live_…" \3 -d '{ "name": "Acme Academy", "locale": "ar" }'
Authentication
#A bearer key, scoped to one organization. Keys carry scopes, not roles, and every call they make lands in the audit log with the key as actor.
curl https://api.fkra.ai/v1/orgs/org_7f3/progress \ -H "Authorization: Bearer sk_live_…" \ -H "Accept-Language: ar"
CarefulKeys are server-side only. Anything a browser can read is a leaked key; proxy through your backend and rotate from /admin/api-keys.
Define your own module types
#A module type is a pair of JSON schemas: config and body. Ship a new interactive format without waiting on us, because the studio forms and the player read the schema.
{ "type": "scenario", "version": "1.2.0", "properties": { "persona": { "type": "string" }, "branches": { "type": "array", "minItems": 2 }, "endings": { "type": "array", "minItems": 2 }, "scoring": { "enum": ["rubric", "points"] } }, "required": ["persona", "branches", "endings"]}
Tenants and scopes in the core
#Every organization lives in its own tenant, and every admin action needs the right scope. The government tier runs on the same isolation, built into the core.
Speaks your language.
#Every surface ships in Arabic and English with right-to-left layout: content, dashboards, certificates.
Set locale on the org and the API returns rtl: true with localized labels; Accept-Language overrides it per request.
One API for everything
#Create organizations, enroll learners, publish modules, and read progress from the same endpoints the apps call. Open an endpoint to see its scope and response.
{ "id": "org_7f3", "rtl": true, "audit": { "action": "org.created" } }Webhooks
#Subscribe once and let the platform push. Deliveries are signed, retried with exponential backoff for 24 hours, and replayable from the dashboard.
POST /hooks/fkra HTTP/1.1X-Fkra-Event: module.publishedX-Fkra-Delivery: dlv_8241X-Fkra-Signature: t=1755782531,v1=8f3c…
Errors and limits
#Conventional status codes, a machine-readable code, and a message that names the field that failed.
Limits100 requests every 10 seconds, counted per calling address rather than per key. Bursts get a Retry-After header; respect it and nothing else changes.
An audit trail
#Publishes, permission changes, and attestations are recorded with actor, action, and object, and exportable into your compliance tooling.
And everything you’d expect
#The rest of the platform is one sign-in away.
Build on fkra
#Grab a key and hit the API: orgs, enrollments, progress. The response above is real.
Create your API key Rolling out for your company?The same platform as private SaaS, white-label, or on-premise.
See the deployment modelsStraight to the founders, with no sales sequence and no qualification form. hello@fkra.ai