跳到主要内容

Diagnostics

Conditions observed while integrating, grouped by task.

Sessions

ConditionCauseResolution
POST /auth/verify returns 200 and no cookie is setThe response carried approved: falseRead the field. A refusal is not an error status
Cookie is set but never sent backThe request omitted credentials, or the origin is outside the allowlistSend credentials with the request, from an allowed origin
Every call answers 401 after two weeksThe session reached its 14-day limitSign in again and call POST /auth/verify
POST /auth/session/refresh answers 401 immediately after a successful verifyThe cookie was not stored, or is being sent to a host outside .akn.me.ukCall from an akn subdomain over https
Sessions end sooner than 14 days in one browser onlyThe cookie was cleared locally, or POST /auth/logout was called thereSign in again. Logout affects only the browser that called it
An approved person is refused on one endpoint and accepted on anotherThe refusing endpoint requires a project grantRequest the grant named on the endpoint's page
503 Authorization unavailableThe account lookup failed. The credential is intactRetry with backoff. Do not sign the person out

Sign-in

ConditionCauseResolution
A person who signed in before now has a second, pending accountThey signed in by a method proving an identifier nobody had claimedLink the identity to the existing person, then remove the duplicate's grants
Phone sign-in answers 403 phone_not_linkedThe number is on no account. Phone signs in an existing person onlySign in another way, add the number to the account, then retry
Email code never arrivesThe address holds no account and the purpose was signinSend with purpose: request-access, or sign in another way
POST /auth/otp/send answers 200 repeatedly with no mailSign-in requests for unknown addresses answer identically to a sendConfirm the address is on the account
429 on a code requestA code was sent within 60 seconds, or five were sent within the hourWait for the interval stated in the message
A correct code is rejectedFive wrong attempts destroyed it, or 10 minutes passedRequest a new code
POST /auth/otp/sign-in answers 400 after verify answered valid: trueThe code was consumed, or expired between the two callsRequest a new code and call sign-in directly
Bridge sign-in answers 400 Sign-in expiredThe state cookie is missing, altered, or more than 10 minutes oldStart again from /auth/bridge/:provider/start
Bridge start answers 400 Bad redirectThe redirect value is not https on an akn hostnameUse an allowed destination
Bridge errors fail to parseBridge errors are HTML pagesBranch on the status code rather than parsing the body

Relying party integration

ConditionCauseResolution
Discovery answers 404The client fetched the well-known path under the issuer host and the request did not reach the root pathUse https://api.akn.me.uk/.well-known/openid-configuration
invalid_client at the authorise requestThe client id is not registeredHave the client registered by the site operator
invalid_request naming the redirect URIThe URI does not match the registered allowlist exactlyRegister the exact URI, including scheme, host, path and trailing characters
Nothing arrives at the callback and no error appearsThe authorise request was refused, and refusals are returned to the caller rather than redirectedInspect the response to /auth/oidc/authorize
The person reaches an HTML page saying they have no accessThe client requires a project grant the person does not holdGrant the named project
invalid_grant on a code issued moments earlierThe code is older than two minutes, already redeemed, or the redirect URI differs from the authorise requestRedeem immediately, with an identical redirect URI
invalid_grant naming PKCEA challenge was sent without a matching verifierSend code_verifier, or stop sending a challenge
/auth/oidc/userinfo answers 401 with a token issued minutes agoAccess tokens do not survive a service restartRepeat the authorisation code flow
Sign-ins in flight fail together, then recoverPending requests are held for the life of the processRetry the sign-in
An account is matched to the wrong person by emailemail_verified was false and the client keyed on the addressKey on sub, and treat an unverified address as unproven
The claims target answers 403 invalid_signatureThe signature is missing, wrong, or the timestamp is more than 300 seconds outCorrect the shared secret, and the clock
A token arrives with no urn:akn: claimsNo person resolved, or the lookup failed. The two are indistinguishableTreat missing claims as no access

Administration

ConditionCauseResolution
A person is missing from GET /auth/peopleThe list returns the 200 most recently created onlyRead the person directly by personId
PATCH answers 200 but the person still cannot sign inAn identity update failed. Failures are listed in the responseRead firebaseSyncErrors and retry
Linking answers 409The identity already belongs to another personUnlink it from that person first
An unlinked identity reappears after the person signs inUnlinking leaves the identifiers that resolve themExpect re-linking. There is no endpoint to remove an identifier
A sync run stops with no responseRuns are sequential per account and exceed the proxy timeout on large directoriesTreat partial results as final and rerun
A sync attaches accounts to the wrong peopleSync matches by email address alone, unlike sign-in, which requires a proved identifierRun only against a directory whose addresses are trusted
Grants changed but the person still passes the old checkA grant applies from the next request. Tokens already issued carry the old valuesWait for the token to expire, or have the person sign in again
An admin is refused by the /status endpointsThose endpoints read a legacy account record rather than the person recordAsk the operator to add the legacy record, or use another administrator account

Feeds

ConditionCauseResolution
GET /calendar/events returns an empty array on a busy weekUpstream failure and an empty week are reported identicallyRetry. Escalate if it persists across a known-busy period
Notifications repeat on every pollThe poll sent no since, so the latest 20 are returned each timeSend since set to the newest created_at already held
Older notifications cannot be reachedEach request returns at most 20 entries and no pagination is offeredPoll continuously rather than backfilling
POST /startpage/notify answers 401The key is absent or wrongConfirm the key. It is sent in x-api-key, not Authorization
A notification arrives with source otherThe submitted source was not a recognised valueSend android or openclaw
A status change is lostIncident and URL edits are read-modify-write against one revisionReload before each change, and avoid concurrent editing
A resolved incident cannot be reopenedResolution moves it out of the active list with no reverse actionCreate a new incident

Location

ConditionCauseResolution
location reads Location unavailableNo position could be obtained and nothing is cachedRetry later. There is no error status to trap
The same body is returned for 30 minutesThe cached value is served while a refresh runs behind itCall /location/live when the newest fix is required
stale: true with a plausible cityThe position is more than 24 hours oldPresent it as a last known place, not a current one
confidence is unknownA place is known and its time is notShow the place without a time
historyPast is short or emptyPositions without a place name are resolved against a geocoder under a per-request budget, and skipped beyond itExpect gaps
An expected trip is missing from historyFuturePlaces are inferred from calendar text against a fixed list of citiesExpect coverage only for known cities
/location/last-visit reports UnknownNo visit has been recorded, or the stored record was unavailableRecord a visit, then retry
A visitor city cannot be removedOne record is retained and overwritten by the next visit. No removal endpoint existsRecord another visit to displace it

Escalation

Report unresolved conditions to the site operator with the method, the path, the status code, the response body, and the time.

Service availability is published at https://status.akn.me.uk.