Iblai api feature
Agent skills + a chat MCP server to operate the ibl.ai platform via its REST API. Install: npx skills add iblai/api
npx -y skills add iblai/api --skill iblai-api-featureAssembled from the repository path, not quoted from the project. Check it against their README if it does not work.
One thing to look at
- 15 stars15 stars. Stars are a popularity signal and not a quality one, but at this level it is likely that nobody has read this closely except its author, and you would be relying on your own review.
What its author says it does
Copied from the file, not written here
Manage an ibl.ai organization's per-user feature configuration and app/onboarding state via the Data Manager (DM) API — read and write a user's feature config (single feature or bulk inline object), bulk-update a feature's values across an entire platform, list the apps a user can access, mark onboarding complete, activate an app free trial, and (when enabled) run an admin platform-provisioning config. Use when toggling feature flags/values for a user or a whole org, reading which apps a user has, updating onboarding status, activating a free trial, or provisioning a platform.
SKILL.md
9.8 KB, ~2.5k tokens by cl100k_base, as published. Nobody here has run it
iblai-api-feature
Manage per-user feature configuration and app / onboarding state from
the Data Manager (DM) API: read and write a user's feature config (one feature,
or a bulk inline config object), bulk-apply a feature's values across every
user on a platform, list the apps a user has access to, mark onboarding
complete, activate an app free trial, and — only when the platform enables it —
run an admin platform-provisioning config. Use when flipping feature
flags/values for a user or an org, inspecting a user's apps, recording
onboarding, granting a trial, or provisioning a platform.
Auth & conventions
- Base URL:
https://api.iblai.app/dm— these are Data Manager (DM) endpoints, so the/dmprefix is required; the/api/features/...(and/api/provision/...) paths below are appended to it (e.g.https://api.iblai.app/dm/api/features/config/)./dmis the gateway prefix and does not appear in the app'surls.py. - Header:
Authorization: Api-Token $IBLAI_API_KEYon every request. - Path / scope vars:
{org}=$IBLAI_ORG(a.k.a.platform_keyon the wire). The org/platform is always passed as a query param or body field (platform_key), never baked into the path. The user is resolved flexibly fromuser_idorusernameoremail(in that precedence) — passed as query params on GET, body fields on POST. - Most feature/app endpoints are open (
AllowAny— see Notes); the provisioning endpoint is platform-admin only. Destructive / outward-facing actions (trial activation) say "Confirm with the user first." - Not connected yet? Run
/iblai-api-loginfirst to populateIBLAI_ORG,IBLAI_USERNAME, andIBLAI_API_KEY.
Reads
Feature config
A user's feature config is a set of per-platform {feature: values} records.
Reads return the whole map; writes accept either a bulk inline config
object or a single feature + values pair (these two body shapes are
mutually exclusive — config wins if both are present, otherwise feature is
used; sending neither returns 400).
- GET
/api/features/config/— read a user's feature config. Resolve the user withuser_id/username/email(required —404if unresolved); scope withplatform_key(query params). Returns the{feature: values, ...}map (empty{}if none).
Apps & onboarding
- GET
/api/features/apps/— list the apps the authenticated user has access to (derived from the request token's user — not auser_idparam). Paginated (page,page_size; default page size 100). Filterable query params:app(matches app name or url, icontains),platform(platform key, icontains),has_active_subscription(bool),free_trial_started(bool),free_trial_expired(bool),onboarding_completed(bool),created_at/updated_at(datetime range,*_after/*_before). Each result includes the app, the resolvedplatform,provider,subscription(entitlements/purchase info),is_admin,is_active, and the trial/ onboarding flags.
Writes
Feature config
- POST
/api/features/config/— create or update a user's feature config (update_or_create, so it creates missing records). Resolve the user withuser_id/username/email(required —404if unresolved). Two body shapes:// (a) bulk inline — set several features at once { "user_id": "number | (username | email)", "platform_key": "string", "config": { "feature_a": { "...": "any" }, "feature_b": true } }// (b) single feature — set one feature's values { "username": "string | (user_id | email)", "platform_key": "string", "feature": "string", "values": "any (object/bool/etc.)" }200on success;400if neitherconfignor (feature+values) is given;500if the platform key doesn't resolve or the write fails. (valuesmust be present in the body for shape (b), even ifnull.)
Bulk config
Apply a feature's values to every existing UserFeatureConfig record for
a feature across one platform — a platform-wide overwrite. Note: this will
not create configs, it only updates records that already exist.
- POST
/api/features/bulk-config/— bulk-update feature config across a platform. Scope withplatform_key. Same two mutually-exclusive body shapes as above, minus the user (no user is resolved — it acts on all matching records):// (a) bulk inline { "platform_key": "string", "config": { "feature_a": { "...": "any" } } }// (b) single feature { "platform_key": "string", "feature": "string", "values": "any" }200on success;400if neither shape is given;500on failure. Confirm with the user first (this rewrites values for every user on the platform).
Apps & onboarding
- POST
/api/features/apps/update/— set the authenticated user's onboarding status for one app. The user must already have access to the app (400otherwise).
Returns the serializer data ({ "onboarding_completed": "boolean (required)", "app": "string (required — app url, name, or id)" }200), or400with validation errors.
Trial
- POST
/api/features/apps/update-trial-status/— activate (or set) the authenticated user's free trial for an app. Only supported on the main / default platform (400otherwise), and the user must have a platform link for that platform (400otherwise; aUserAppis auto-created if missing).
When{ "app": "string (required — app url, name, or id)", "platform": "string (required — the platform key)", "free_trial_started": "boolean (default true)" }free_trial_startedistrue, the trial is started and marked expired for non-expired user-apps (one-shot activation).200on success. Confirm with the user first (this consumes the user's free trial).
Provisioning
Gated by the ENABLE_PLATFORM_PROVISIONING setting — when it is off (the
default in some environments), this route is not registered and returns
404. Platform-admin only (it uses the project's default DM-admin
permission, unlike the open feature/app endpoints).
- POST
/api/provision/{config_name}/— run a storedPlatformProvisioningConfigby itsname(the{config_name}path slug;404if no config with that name exists). The JSON request body is passed through to the config's provisioning snippet asrequest_data. The snippet is executed server-side and must produce aresultmapping ({success, status_code, error_message?, data?}), which becomes the response; the config's status is recorded assuccess/failed. Confirm with the user first (it executes a server-side provisioning routine with side effects). Snippets defining the config are authored in Django admin, not via this API.
Example
Set a single feature's value for a user on your org's platform:
curl -X POST \
"https://api.iblai.app/dm/api/features/config/" \
-H "Authorization: Api-Token $IBLAI_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"username": "'"$IBLAI_USERNAME"'",
"platform_key": "'"$IBLAI_ORG"'",
"feature": "chat_ui",
"values": { "enabled": true, "theme": "dark" }
}'
Read it back:
curl -G \
"https://api.iblai.app/dm/api/features/config/" \
-H "Authorization: Api-Token $IBLAI_API_KEY" \
--data-urlencode "username=$IBLAI_USERNAME" \
--data-urlencode "platform_key=$IBLAI_ORG"
Notes
- All endpoints are DM endpoints under
https://api.iblai.app/dm(/dm+/api/features/...or/api/provision/...). Omitting/dmwill not resolve. - Registered routes (exhaustive):
GET|POST /api/features/config/,POST /api/features/bulk-config/,GET /api/features/apps/,POST /api/features/apps/update/,POST /api/features/apps/update-trial-status/, and (only whenENABLE_PLATFORM_PROVISIONINGis true)POST /api/provision/{config_name}/. Theconfigandbulk-configpaths accept an optional trailing slash. - Permissions. The feature-config, bulk-config, apps, onboarding, and trial
views all set
permission_classes = [](effectively AllowAny — the token is still read for the apps/onboarding/trial views to identify the user). The provisioning view sets no override, so it inherits the project default (DM/platform-admin). - Two body shapes (
configinline object vsfeature+values) apply to bothconfig/andbulk-config/POSTs;config/additionally resolves and requires a user, whilebulk-config/operates platform-wide and creates nothing. apps/,apps/update/, andupdate-trial-status/act on the authenticated token's user — there is nouser_idparameter to target another user. Use a token for the user you intend to modify.appis resolved flexibly by url, name, or numeric id (400"App does not exist" if none match) for the onboarding and trial endpoints.- The app also ships Django management commands (
seed_apps,setup_features_tasks) and an admin UI for authoring provisioning snippets; those are server-side, not REST endpoints, and are out of scope here.