… visits today
ONLINE
Guide

Workspaces, projects, single sign-on and SCIM

How to put your team on one plan, watch the models you depend on together, run each client or product as a project with its own Smart Router keys, rules and budget, see what each project and person spent, and connect your identity provider and directory.

What a workspace is

A workspace puts a team under one plan and gives it things to share. The owner holds the plan; the editors they invite get the same plan on their own accounts — its watched-model limit, history, Smart Router allowance and monitoring — without paying separately.

What the team shares: a team watchlist that alerts everyone, and projects — one per client or product — each with its own people, watchlist, Smart Router keys, routing rules, provider keys, budget, spend report and activity log. On Teams and Enterprise the workspace also adds webhooks, single sign-on, directory provisioning (SCIM) and an audit trail.

What stays personal: each person's own watchlist, alert settings, personal Smart Router keys and provider keys. Only project keys are shared rules and shared reporting.

Plans

DeveloperTeamsEnterprise
Editor seats, owner included15Unlimited
ViewersUnlimitedUnlimitedUnlimited
Projects13Unlimited
Models on the team watchlist, and on each project's20UnlimitedUnlimited
Project keys, routing rules, budgets, reportsYesYesYes
Webhooks, single sign-on, SCIM, audit trail—YesYes

Free and Pro accounts cannot create a workspace, but can be invited to one. If the owner's plan lapses below Developer, projects become read-only and project keys pause until it is renewed.

Inviting people

  1. Open Account → Team and create the workspace.
  2. On the People tab, enter the person's email address, choose Viewer or Editor, and send the invitation. They receive an email from AI Stupid Level with an Accept invitation button.
  3. They sign in — or create an account — with that same address and accept. An invitation only works for the address it was sent to, so a forwarded link is no use to anyone else.
  4. Add them to the projects they work on, from each project's People tab.
Link lifetime
14 days. Resend makes a new link, which restarts the 14 days and stops the old one working.
Email did not arrive
Ask them to check spam, or use Copy link on the People tab and send the link yourself.
Seats
An invitation for an editor holds a seat until it is accepted or withdrawn.
Leaving and removing
A member can leave from the People tab. The owner can remove anyone except themselves. Either way, the person leaves every project and their project keys are revoked.
One workspace per account
Someone who owns a workspace, or is in one, has to leave it before accepting an invitation to another.

Roles

In the workspace:

Owner
One per workspace: the person whose plan it is. Invites and removes people, shares provider keys with every project, sets team alerts, manages webhooks and security, reads the audit trail, and manages every project without being added to it. Uses a seat.
Editor
Uses a seat and gets the workspace’s plan on their own account. Can change the team watchlist and create projects (and manages the ones they create).
Viewer
Free: no seat, and no plan from the workspace. Reads the team watchlist and the projects they are added to, and gets their alerts — the role for clients and stakeholders. Sees the owner and the people they share a project with, not everyone in the workspace.

In a project:

Manager
Runs the project: its people, routing rules, provider keys, budget and caps, alert settings and webhooks; can rename or delete it. Needs an editor seat.
Member (editor)
Holds their own project keys and edits the project watchlist. Reads the rules, budget, report and activity.
Member (viewer)
Reads everything above and gets the project’s alerts. Holds no keys.

Team watchlist

The models the whole team depends on, on the workspace page's Team watchlist tab. Everyone in the workspace sees each model's latest real score, its change over seven days, any open drift alert or task-level regression, and a note on why it is watched. Editors and the owner add, annotate and remove models; viewers read.

When a model on it drops by the team's threshold (5 points unless the owner changes it) or a benchmark task starts failing, everyone in the workspace is emailed — the owner can narrow that to the owner and editors, or to webhooks only — and each person can mute the team list for themselves. See Alerts.

Projects

One per client or product. Created by the owner or an editor from the workspace page; whoever creates it manages it.

People
Who works on it, as managers or members. Only the people in a project (and the owner) can open it.
Watchlist
The models this project depends on, with its own alert threshold and recipients.
Smart Router
Project keys, the routing rules every key follows, and which provider keys pay. See below.
Budget
A monthly budget for the project and a monthly cap per person. See below.
Overview
What the project spent, who spent it, on which models, how reliably and how efficiently.
Activity
Who changed what, and every request its keys made.
Settings
Name and description, who sees per-person spend, the project’s own webhooks, deletion.

Deleting a project revokes its keys and removes its provider keys, budget, watchlist and webhooks. Its request history stays in the workspace's records, and the deletion is in the audit trail.

Project keys and routing rules

A project key is a Smart Router key that follows the project’s rules and counts against its budget.

Each person with an editor seat in the project makes their own keys on its Smart Router tab, so the report can say who spent what. A key is shown once; it can expire after 7, 30, 90, 180 or 365 days, and its holder or a manager can revoke it. Use it anywhere a Smart Router key works:

curl https://aistupidlevel.info/v1/chat/completions \
  -H "Authorization: Bearer aism_…" \
  -H "Content-Type: application/json" \
  -d '{"model": "auto", "messages": [{"role": "user", "content": "Hello"}]}'

The rules a manager sets, which every key in the project follows:

Strategy
What “auto” means: best overall, best for coding, reasoning or tool use, best value, most consistent, fastest good model, cheapest, fastest, matched to each request, or your own weighted traffic split.
Use it for every routed request
Requests asking for auto-coding, auto-cheapest and so on get the project’s strategy too.
Naming a model
Allowed or not. When not, requests that name a model — and /v1/messages, which always does — are refused, and everything is routed.
Allowed models
Only these models, routed or named. Empty means any model we benchmark.
Providers not used
Never route to, or accept requests for, these providers.
Price and speed limits
Leave out models above a price per 1,000 tokens or slower than a measured latency.
Tool calling
Only models that support it.
Fallback
Try other models when one fails, optionally in an order you choose.
Drifting models
Pass over models with an open drift alert (they are tried after the others).
Output per request
A cap on output tokens for every request. Reasoning models count their thinking in it, so a low cap can leave them no room to answer.
Rate limit
Requests per minute, per key.
Prompt logging
Each key’s own setting, off for every key, or on for every key (encrypted, with secrets scrubbed first).

The Preview button shows where “auto” would go right now under unsaved rules, without sending anything.

Who pays the providers

A provider bills whoever's key is used. For each provider a project request uses, in order: the project's own key for that provider (a client's account, say), the workspace's shared key (added by the owner on the workspace page), and — if the project allows it — the requester's own key from their Providers page. Shared keys are stored encrypted and shown by their last four characters; Check asks the provider whether it still accepts one.

Budgets and caps

Monthly budget
For the whole project, in dollars, from the 1st of each month (UTC).
Alert only
Requests continue past the budget.
Switch to the cheapest models
Past the budget, routed requests go to the cheapest models and requests that name a model are refused, so work continues at the lowest cost.
Stop at the budget
A request that could take the month past the budget is refused with HTTP 429 and the reason, until the 1st or until the budget is raised.
Thresholds
The owner and the project’s managers are emailed when spend reaches each threshold you choose (25–90%) and 100%, once per month for each — raising the budget re-arms them.
Caps per person
A monthly cap for everyone in the project, with a different one per person if needed. A person at their cap is refused, whatever the budget mode, and is emailed along with the managers.

Spend is the provider's list price for the tokens each request used — the same figure as the report. A request reserves its most expensive possible cost before it is sent and settles to the actual cost after, so many requests at once cannot run past a budget that stops at its limit. Your provider's invoice is the final word: discounts and caching are not included.

Reports and activity

A project's Overview covers the last 7, 30 or 90 days, this month or last month: spend (and the change on the period before), requests and how many were answered, response times, cost per 1,000 tokens, requests saved by fallback, spend by day, and tables by person and by model — plus what the requests were for, whose provider keys paid, and why any failed. The workspace page adds it all up across projects, with a table of who works on what and what they spent in each project.

Who was most efficient

Comparing spend per request would punish whoever does the long tasks. So each person gets a cost index: their spend divided by what the same input and output tokens would have cost at the project's average price per input token and per output token. 1.00× is the project average; 0.60× means 40% cheaper model choices for the same amount of work. It needs 20 answered requests, and the “most efficient” highlight needs two people who have them.

Activity

The Activity tab lists who changed what in the project — people, rules, budget, keys, provider keys, watchlist, webhooks — along with budget notices and change alerts, and every request its keys made (time, person, key, model asked for and used, tokens, cost, response time, outcome), filterable by person and downloadable as CSV. Prompt text is never shown there.

By default everyone in a project sees each person's spend. A manager can limit that to managers, so that members — clients who are viewers, say — see the project's totals and their own requests only.

Alerts

Once a day (08:00, Berlin time) every watched model is checked against real measurements only: a model we could not measure that week is never reported as having changed. A model alerts when its score dropped by at least the list's threshold over seven days, or when a benchmark task started failing while the overall score held.

One email per finding
A model on your own watchlist, the team watchlist and a project gets you one email, naming every list it is on.
Who is emailed
Team list: everyone in the workspace, the owner and editors, or nobody. Project list: everyone in the project, its managers and the owner, or nobody. Your own alert settings still apply: if you turned alert emails off, team lists do not override that.
Muting
Anyone can mute the team list or a project’s list for themselves, on its page.
Weekly summary
The Monday summary covers your own watchlist, the team’s and your projects’, grouped by list.
Activity
Each alert is recorded in the project’s activity log (or the workspace trail, for the team list).

Webhooks

Teams and Enterprise. Alerts and budget notices as signed JSON, so they reach your own tooling without anyone reading an email.

The owner adds a workspace-wide endpoint on the workspace page; a project's managers can add endpoints for that project only, in its Settings. Each is shown its signing secret once, and can be limited to the events you choose (none chosen means all). A workspace-wide endpoint hears about the team list, every project and members' own watchlists; a project's endpoint hears about that project only.

model.regression
A watched model alerted. data: modelId, model, currentScore, deltaOver7d, openTaskRegressions, measuredAt, reason, and lists — every list carrying the model ({"type":"team"}, {"type":"project"} with its id and name, or {"type":"member"} for a member's own watchlist, never naming them). Sent once per finding per endpoint.
budget.threshold
A project crossed one of its budget thresholds this month.
budget.exceeded
A project reached its budget, or a request was refused at it.
member.cap_warning
Someone used 80% of their monthly cap in a project.
member.cap_reached
Someone reached their cap; their requests in the project are refused.
Budget payload
{ "project": {id, name}, "workspace": {id, name}, "month", "spendUsd", "limitUsd", "threshold", "budgetMode", "refused", "member"? }
Headers
X-ASL-Event, X-ASL-Timestamp (Unix seconds), X-ASL-Signature
Signature
sha256= plus the hex HMAC-SHA256 of the timestamp, a full stop and the raw body, keyed with the endpoint's secret.
Delivery
One attempt with a five-second timeout and no retries; the last result is shown next to each endpoint. Up to 20 endpoints per workspace and 5 per project, HTTPS only, never to private or loopback addresses.

Checking a delivery in Node.js:

const crypto = require('crypto');

// rawBody: the request body exactly as received, before JSON parsing.
function isFromAiStupidLevel(headers, rawBody, secret) {
  const ts = String(headers['x-asl-timestamp'] || '');      // Unix seconds
  const sig = String(headers['x-asl-signature'] || '');
  const expected = 'sha256=' +
    crypto.createHmac('sha256', secret).update(ts + '.' + rawBody).digest('hex');
  const fresh = Math.abs(Date.now() / 1000 - Number(ts)) < 300;   // reject replays
  return fresh && sig.length === expected.length &&
    crypto.timingSafeEqual(Buffer.from(sig), Buffer.from(expected));
}

Single sign-on

Teams and Enterprise, set up by the workspace owner. Works with any OIDC or SAML 2.0 identity provider.

  1. In your identity provider, create an application:
    • OIDC: sign-in redirect URI https://aistupidlevel.info/api/sso/callback/oidc, scopesopenid, email and profile. Copy its issuer URL, client ID and client secret.
    • SAML 2.0: assertion consumer service (reply) URL https://aistupidlevel.info/api/sso/callback/saml, entity ID (audience) https://aistupidlevel.info/saml/metadata — providers that import metadata can use that URL — and the email address as the Name ID. Sign the assertion. Copy the sign-on URL and the signing certificate.
  2. Open Account → Security, choose the protocol, enter your email domain (for example acme.com), paste the values, choose the role new people get, and save.
  3. Verify the domain: add the TXT record the page shows — name _asl-verification.acme.com, value asl-verification=… — at your DNS host, then click Verify domain. A new record can take a few minutes to an hour to appear. If your DNS host adds the domain for you, enter just _asl-verification as the name.
  4. Switch Connection enabled on and save.
  5. Test it: sign out, choose Continue with SSO on the sign-in page and enter your work email.

Where the values are

Okta
An OIDC web app. The issuer is your authorization server, for example https://acme.okta.com/oauth2/default.
Microsoft Entra ID
Register an app with a Web redirect URI and add a client secret. The issuer is https://login.microsoftonline.com/<tenant-id>/v2.0. Add the optional email claim to the ID token (Token configuration).
Google Workspace
An OAuth client of type Web application in Google Cloud. The issuer is https://accounts.google.com.

What changes once it is on

Signing in
People whose email is in your domain sign in through your identity provider; password and Google/GitHub sign-ins are refused for them. The owner keeps password sign-in, so a broken provider cannot lock out the one person who can fix it.
New people
With “Create accounts on first sign-in” on, someone without an account gets one at first sign-in and joins with the role you chose. With it off, only existing accounts can sign in.
Existing accounts
An account with the same email is used as it is, and joins the workspace at its first SSO sign-in.
Domain already claimed
If another workspace saved your domain without verifying it, publish your record and save again: the domain moves to you. A verified domain stays with its workspace.

Directory sync (SCIM)

Teams and Enterprise. Lets your directory add people and, more importantly, remove them the moment they leave.

  1. On the Security page, create a SCIM token. It is shown once.
  2. In your identity provider's provisioning settings, enter the base URLhttps://aistupidlevel.info/api/scim/v2 and the token as an HTTP bearer token.
  3. Map the user name to the person's email address.
Supported
Users: create, read, list (filtered by userName eq "…"), update and deactivate — PUT, PATCH of active, and DELETE.
New people
Join as viewers. Change their role on the Team page.
Deactivating
Switches the membership off: the person loses access to the workspace and its plan, and cannot sign in through single sign-on. Nothing is deleted, so reactivating restores them.
Groups
Not supported, and the service-provider configuration says so.
Tokens
Revoke one at any time on the Security page.

Audit trail

On Teams and Enterprise the owner can read the workspace's audit trail on the Security page and download the latest 200 entries as CSV. Each entry records the time, who acted, what changed, and the IP address and browser it came from. It covers the workspace, invitations and members, the team watchlist and alert settings, projects and their people, watchlists, keys, routing rules, provider keys, budgets and caps, webhooks, budget notices and change alerts, the single sign-on connection and its domain verification, SSO sign-ins and the accounts they create, SCIM tokens and SCIM changes. A project's own entries also appear on its Activity tab, without addresses.

Entries recorded before 6 October 2026 show our own server's address and agent instead of the person's.

Current limits

  • An account belongs to one workspace at a time.
  • Viewers do not get the workspace's plan and cannot hold project keys.
  • Ten active keys per person per project, two hundred per project.
  • Spend is estimated from list prices and token counts, not read from your provider's invoice.
  • When a directory deactivates someone, their project keys stop working within 30 seconds.
  • Webhooks are sent once, without retries.
  • SCIM covers users, not groups.
  • SAML: we do not sign authentication requests, assertions must be signed, and sign-in starts from our sign-in page (not from your provider's app launcher).