llm11

Identity federation

Your workloads already have an identity. Let them use it, and there is no llm11 key to store, rotate or leak.

Step 1

Trust your identity provider

In /app/keys, add a workload identity. Give it the issuer URL and the subject your workload presents, with a trailing * if a prefix is enough. A rule has to name a subject or a claim, because one that names neither would trust everything the issuer signs.

We fetch the issuer's discovery document and signing keys when you save, so a typo shows up there and not as a 401 later. Anything that serves /.well-known/openid-configuration on public https works.

Step 2

Ask for a token with the rule's audience

Each rule has its own audience, https://www.llm11.com/identity/<rule id>. A token carries it in aud, which is how we know which rule it is for. A token minted for another rule or project cannot be used on this one, even from the same issuer.

.github/workflows/call-llm11.yml

permissions:
  id-token: write
steps:
  - name: Ask llm11
    env:
      LLM11_AUDIENCE: ${{ vars.LLM11_AUDIENCE }}
    run: |
      TOKEN=$(curl -sS -G -H "Authorization: bearer $ACTIONS_ID_TOKEN_REQUEST_TOKEN" \
        --data-urlencode "audience=$LLM11_AUDIENCE" "$ACTIONS_ID_TOKEN_REQUEST_URL" | jq -r .value)
      curl https://www.llm11.com/v1/chat/completions \
        -H "Authorization: Bearer $TOKEN" \
        -H "Content-Type: application/json" \
        -d '{"messages":[{"role":"user","content":"Hello"}]}'

GitHub Actions is the example, and the same shape holds for the others: get a token for the audience from your provider, send it where the API key would go.

Step 3

Use it like a key

The token goes in Authorization: Bearer on /v1/chat/completions and /v1/messages, or in x-api-keyon the Anthropic wire. Requests run in the rule's project and bill to its workspace exactly as a live key would. Mint a new token before the old one expires; they are checked on every request.

Step 4

What gets checked

  • The signature, against the issuer's published keys. RSA and ECDSA only; HMAC and unsigned tokens are refused.
  • iss equals the rule's issuer exactly, aud names this rule, and sub, iat and exp are present and current (30 seconds of skew).
  • The subject pattern and every claim you set.
  • Lifetime: exp minus iat is within the rule's limit (60 minutes by default, up to 24 hours).

Removing an identity stops it immediately. API keys keep working alongside, so you can move one workload at a time.