Skip to content
Back to skills

Iblai Api Login

BSecurity

Connect an ibl.ai organization for API access. Gets the user signed in (ibl.ai/join if new, login.iblai.app/me if returning), captures their org key and username, mints a Platform API Token, and writes IBLAI_ORG / IBLAI_USERNAME / IBLAI_API_KEY to .env and PLATFORM / TOKEN / IBLAI_USERNAME to iblai.env (the same values under the names each skill family uses). If you already hold org credentials (key + secret), the secret works directly as the Api-Token — no browser needed. Run this first befo...

  • 15 stars
  • 0 votes
  • 0 copies
  • 0 views
  • Added September 20, 2026
ai-agentspythongoshellbashgitapi

Works with

  • claude code
  • cli
  • api

Security analysis

B88/100
  • criticalDownloads and executes remote scripts — classic supply chain attack

Pro shows the line behind each finding and how to fix it

Scanned September 20, 2026

npx -y skills add iblai/vibe --skill iblai-api-login --agent claude-code

Installs into .claude/skills of the current project.

Are you the author of Iblai Api Login?

Add the live security badge to your README. It updates with every re-scan.

Security grade badge for Iblai Api Login
[![Security: B — Skills Directory](https://www.skillsdirectory.com/api/skills/iblai-iblai-api-login/badge)](https://www.skillsdirectory.com/skills/iblai-iblai-api-login)

More formats (shields.io, HTML) on the badges page. Keep it an A: scan every change in CI with Pro.

Download with Pro
SKILL.md
---
name: iblai-api-login
description: Connect an ibl.ai organization for API access. Gets the user signed in (ibl.ai/join if new, login.iblai.app/me if returning), captures their org key and username, mints a Platform API Token, and writes IBLAI_ORG / IBLAI_USERNAME / IBLAI_API_KEY to .env and PLATFORM / TOKEN / IBLAI_USERNAME to iblai.env (the same values under the names each skill family uses). If you already hold org credentials (key + secret), the secret works directly as the Api-Token — no browser needed. Run this first before any other iblai-* skill.
metadata:
  kind: api
---

# iblai-api-login

> **First time here?** If `iblai.env` has no `ARCHITECTURE=`, run `/iblai-vibe-start` first (four questions; two minutes) — it decides single-org / multi-org / headless and who signs in, and every skill reads the answer.

Connect an organization so the other `iblai-*` skills can call the ibl.ai platform.
Every API call needs three things — your **org key**, your **username**, and a
**Platform API Token** — and this skill collects all three and writes them to
`.env`. Run it once per organization.

## What you are collecting

| Value              | Goes in `.env` as | Where it comes from                                  |
| ------------------ | ----------------- | ---------------------------------------------------- |
| Org key            | `IBLAI_ORG`       | `login.iblai.app/me` → the **key** of the chosen org |
| Username           | `IBLAI_USERNAME`  | `login.iblai.app/me` → account / profile             |
| Platform API Token | `IBLAI_API_KEY`   | An Api-Token minted from the session — see step 2    |

The base URL is fixed: `https://api.iblai.app`. Auth header on every request is
`Authorization: Api-Token <IBLAI_API_KEY>`.

## Fastest path — the connect flow

Try `/iblai-vibe-connect` first. It opens `login.iblai.app/connect` in the
browser, the user picks their organization and clicks **Connect**, and the
script mints the Platform API Token and writes all three values into `.env`
(and `iblai.env`, and `.env.local` when a `package.json` is present) — nothing
is typed into the chat and the token is never printed. It ends with one line:
`connected: <org name> (<org key>) as <username> · token ****abcd`, and this
skill is done. If it prints `HOSTED_PAGE_UNAVAILABLE` (exit code 3), the hosted
page is not deployed yet — continue with the paths below.

## Fastest path — org credentials (key + secret)

If you already hold **organization credentials** — an **org key** and an **org
secret** (issued for the org for automation/CI; the same pair the ibl.ai
quickstarts use) — you can skip the browser entirely. The **org secret works
directly as the Platform API Token**; there is nothing to mint:

```dotenv
IBLAI_ORG=<org key>          # e.g. acme
IBLAI_API_KEY=<org secret>   # used verbatim as: Authorization: Api-Token <secret>
```

The only value left is `IBLAI_USERNAME`. Read an admin username straight from the
API with the two values above — no `/me` page needed:

```bash
set -a; . ./.env; set +a
curl -s "https://api.iblai.app/dm/api/core/platform/users/?platform_key=$IBLAI_ORG&platform_org=$IBLAI_ORG&page=1&page_size=5" \
  -H "Authorization: Api-Token $IBLAI_API_KEY" \
  | python3 -c "import sys,json;[print(u['username'], u.get('is_admin')) for u in json.load(sys.stdin)['results']]"
# pick an is_admin=True username → IBLAI_USERNAME
```

Then skip to **step 3** (save to `.env`) and **step 4** (verify). The
browser-session flow below is only for when you *don't* have org credentials and
must mint a token from a signed-in session.

## Get the user signed in

This skill needs a signed-in `login.iblai.app/me` session. Two paths:

- **No account, or no org of their own?** Send them to **https://ibl.ai/join**.
  Signing up creates their account **and** their organization and leaves them
  logged in — that's everything this skill needs. (This also covers the user who
  only sees the shared **`main`** org: `main` is the default everyone lands in,
  not their own workspace, so they still need to join/create one.)
- **Already have an account?** Have them sign in at **https://login.iblai.app/me**.

Never enter the user's credentials for them — let them complete the login, then
read the values off the page.

> **Tip — use browser automation.** This skill is smoothest when the agent can
> drive a browser (e.g. the user launches **`claude --chrome`**): it can read the
> signed-in session and **mint the API token automatically** (step 2). Without a
> browser, the user pastes a token instead — recommend they relaunch with
> `claude --chrome` for the automated path.

## Steps

1. **Read the org key and username off `/me`.**

   Navigate to **https://login.iblai.app/me**. If it redirects to a sign-in
   screen, the user isn't logged in — point them at the paths above and wait for
   them to confirm. **After login the platform redirects elsewhere (the
   destination varies), not back to `/me`** — so always **re-navigate explicitly
   to `https://login.iblai.app/me`** before reading.

   `/me` is server-rendered (no JSON API), so read the values off the **rendered
   page content**. It shows the account (username/email) and the list of
   organizations the user belongs to; each org block is the display name followed
   by its **key** — e.g. `enterprise`, a company slug, or a UUID like
   `3b42a400a2fc4ec9…`. Accounts can belong to many orgs (40+ is normal), so
   **always ask the user which org to target** → `IBLAI_ORG`, and capture the
   account username → `IBLAI_USERNAME`.

2. **Mint a Platform API Token from the session.**

   API calls authenticate with an **Api-Token**, not the browser login.

   - **With browser automation (recommended):** the signed-in `login.iblai.app`
     session carries a short-lived auth token in `localStorage` as **`dm_token`**.
     Use it with the **`Token`** scheme (**not** `Bearer` — `Bearer` returns
     `401`) to create a Platform API Token (the same `POST …/platform/api-tokens/`
     call documented in **`/iblai-api-token`**):

     ```http
     POST https://api.iblai.app/dm/api/core/platform/api-tokens/
     Authorization: Token <dm_token from login.iblai.app localStorage>
     Content-Type: application/json

     { "username": "<username>", "name": "iblai-cli", "key": "",
       "platform_key": "<org>", "created": "<ISO-now>", "expires": "" }
     ```

     Capture the returned secret (shown once) → `IBLAI_API_KEY`.

     > **Token uniqueness:** `(platform_key, name)` must be unique. Re-running with
     > the same `name` for an org returns `400 … must make a unique set` — use a
     > fresh `name` (e.g. `iblai-cli-<org>`) or reuse the existing token.

     > **Which org the token targets.** The **`platform_key` in the request body**
     > scopes the resulting token — an admin's `dm_token` can mint a token for any
     > org they administer. The `dm_token` itself is organization-scoped, though, so if
     > minting fails with `401`/`403`, switch the active organization and re-read it:
     > open **os.ibl.ai**, use the **org dropdown (top-right)**, select the target
     > org (URL becomes `os.ibl.ai/platform/<org>/…`), then read the refreshed
     > `dm_token` from that page's `localStorage`.

   - **Without a browser:** if you have **org credentials (key + secret)**, skip
     this step entirely — the org secret *is* the `IBLAI_API_KEY` (see
     [Fastest path — org credentials](#fastest-path--org-credentials-key--secret)
     above). Otherwise, have the user create a token in the platform admin (or at
     `login.iblai.app`) and paste the secret; recommend `claude --chrome` to
     automate it.

3. **Save to `.env` and `iblai.env` (and make sure both are gitignored).**

   ```dotenv
   # .env — what the iblai-api-* skills read (source it: set -a; . ./.env; set +a)
   IBLAI_ORG=<org key>
   IBLAI_USERNAME=<username>
   IBLAI_API_KEY=<token>
   ```

   ```dotenv
   # iblai.env — what the iblai-vibe-* skills and vibe-starter read (same values)
   DOMAIN=iblai.app
   PLATFORM=<org key>
   TOKEN=<token>
   IBLAI_USERNAME=<username>
   ```

   The two files hold the **same three values** under the names each family
   uses (`IBLAI_ORG` = `PLATFORM`; `IBLAI_API_KEY` = `TOKEN`). Write both so a
   project can use either family without re-running this skill; if one already
   exists with real values, update it in place rather than overwriting.

   **Before writing, guarantee `.env` and `iblai.env` are ignored by git** —
   check `.gitignore` and add the lines if missing (create `.gitignore` if the
   project has none), so the token can never be committed.

   Every other `iblai-*` skill reads these values. To make them live in shell
   commands, `source .env` (`set -a; . ./.env; set +a`) before API calls — or, in
   Claude Code, mirror them into `.claude/settings.local.json` `env` (also
   gitignored) for automatic injection.

4. **Verify the connection.**

   Confirm the token authenticates against a real data endpoint. Do **not** use
   the `…/platform/api-tokens/` management endpoint — it only accepts the session
   `Token <dm_token>` scheme and returns `401` for *any* `Api-Token`, valid or
   not, so it cannot confirm a minted token works:

   ```bash
   curl -s -o /dev/null -w '%{http_code}\n' \
     "https://api.iblai.app/dm/api/core/platform/users/?platform_key=$IBLAI_ORG&platform_org=$IBLAI_ORG&page=1&page_size=1" \
     -H "Authorization: Api-Token $IBLAI_API_KEY"
   ```

   A `200` means you are connected. Report the active org and username back to the
   user.

## Notes

- `{org}` (a.k.a. `platform_key`), `{username}`, and `{mentor}` (agent unique id,
  e.g. `d17dc729-60fd-4363-81a0-f67d9318b03e`) are the path variables every other
  skill substitutes.
- One organization = one org key + one Api-Token. To switch organizations, re-run
  this skill and pick a different org on `/me`.

Attribution

Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.

Comments

Loading comments…

Newsletter

Get the weekly list of safe new skills, and the ones we pulled.