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
| Developer | Teams | Enterprise | |
|---|---|---|---|
| Editor seats, owner included | 1 | 5 | Unlimited |
| Viewers | Unlimited | Unlimited | Unlimited |
| Projects | 1 | 3 | Unlimited |
| Models on the team watchlist, and on each project's | 20 | Unlimited | Unlimited |
| Project keys, routing rules, budgets, reports | Yes | Yes | Yes |
| Webhooks, single sign-on, SCIM, audit trail | — | Yes | Yes |
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
- Open Account → Team and create the workspace.
- 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.
- 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.
- 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, andlists— 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.
- In your identity provider, create an application:
- OIDC: sign-in redirect URI
https://aistupidlevel.info/api/sso/callback/oidc, scopesopenid,emailandprofile. 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.
- OIDC: sign-in redirect URI
- 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. - Verify the domain: add the TXT record the page shows — name
_asl-verification.acme.com, valueasl-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-verificationas the name. - Switch Connection enabled on and save.
- 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 optionalemailclaim 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.
- On the Security page, create a SCIM token. It is shown once.
- In your identity provider's provisioning settings, enter the base URL
https://aistupidlevel.info/api/scim/v2and the token as an HTTP bearer token. - Map the user name to the person's email address.
- Supported
- Users: create, read, list (filtered by
userName eq "…"), update and deactivate — PUT, PATCH ofactive, 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).

