8.1 KiB
summary, read_when
| summary | read_when | ||||
|---|---|---|---|---|---|
| Sakana AI provider: manual Cookie header, billing page parser, 5-hour/weekly quota windows, and pay-as-you-go credit balance. |
|
Sakana AI
Sakana AI is a research lab focusing on foundation models and nature-inspired AI. CodexBar reads the billing page to surface 5-hour and weekly quota windows for subscribers.
Setup
- Sign in at console.sakana.ai.
- Open your browser's developer tools, navigate to the Network tab, and reload the billing page
(
console.sakana.ai/billing). - Copy the full
Cookie:request header value from any billing-page request. - In CodexBar, paste the header in Settings → Providers → Sakana AI → Cookie header.
The value is stored unencrypted in the resolved config file. CodexBar sets that file's
permissions to
0600whenever it writes the file on macOS or Linux.
Alternatively, set the environment variable SAKANA_COOKIE to the raw cookie header value.
Data source
- Auth method: manual
Cookie:header; no automatic browser cookie import. - Target page:
https://console.sakana.ai/billing(HTML scrape; no JSON API). - Source label:
web.
Usage details
- The primary row shows the 5-hour quota as a 300-minute session window and uses the reset timestamp shown on the billing page when one is present.
- The secondary row shows the weekly quota as a seven-day window and uses its billing-page reset timestamp when one is present.
usedPercentfor each window is parsed from the billing page's adjacent% usedtext.- Reset dates are parsed as UTC, not the device's local time zone. The billing page always server-renders
"Resets on " in UTC — the browser only corrects it to the viewer's local time client-side, after JS
hydration, which this HTML-only fetcher never runs. (Parsing with
TimeZone.currentinstead shifted every reset by the device's UTC offset; see #1826.) The fetcher detects"MMMM d, yyyy 'at' h:mm a"format strings. - Plan name and price label (e.g.
Standard $20/mo) are joined and surfaced as theloginMethodidentity field for plan display in the menu. - Token cost tracking (
supportsTokenCost: false): not supported; cost summary is unavailable. Sakana has no organization-level usage/cost API to query historically, only the per-requestusageobject returned by chat completions calls (which CodexBar never makes), so there is no local-log source to scan the way Claude/Codex are. - Credits row (
supportsCredits: false): not shown. The shared credits-card UI path (MenuCardView+Costs.swift) has no Sakana branch and would just render the staticcreditsHintstring instead of the fetched balance, sosupportsCreditsstays off; the balance is surfaced explicitly instead (see below). - Widget support: not currently available for Sakana AI.
Pay-as-you-go credits
Sakana also sells prepaid credit for pay-as-you-go API usage (the model IDs fugu and fugu-ultra), separate from
the subscription quota windows above. console.sakana.ai/billing renders this data server-side under its
"Pay as you go" tab, but that tab's markup is only present in the HTML response when the request URL includes
?tab=payAsYouGo — the default /billing response (used for the subscription quota fetch above) does not include
it. CodexBar issues a second, best-effort GET to https://console.sakana.ai/billing?tab=payAsYouGo with the same
cookie header alongside the subscription request — skipped entirely (no request made) when
context.includeOptionalUsage is false, i.e. Settings → Advanced → "Show optional credits and extra usage" is
disabled.
- Credit balance: parsed from the
<h2>Credit balance</h2>card's adjacenttabular-numsamount. - Recent usage total: parsed from the
Usagechart header'sTotal: $…text, covering whatever date range is currently selected on the console (defaults to the last 30 days). React renders this text with<!-- -->hydration-boundary comments splitting the label from the amount; the parser strips those before reading the value. - Date range label: the raw text of the "Usage date range" picker button (e.g.
Jun 02, 2026 - Jul 01, 2026), kept only as context — CodexBar does not currently interpret it as start/end dates.
This second fetch never throws and never blocks the primary result: if it fails (network error, non-200, wrong
origin, empty body, or the expected markup isn't found), the pay-as-you-go fields are simply absent from that
refresh and the subscription quota windows are returned exactly as before. An account with no pay-as-you-go credit
purchased still returns a $0.00 balance (the card is always rendered), so absence here almost always means the
request itself failed rather than "no credit."
The optional request runs concurrently with the required subscription request and has its own five-second bound. It is cancelled when the required request fails or the caller cancels, so it cannot add a second full request timeout or outlive the refresh that started it.
- Menu: an
Extra usagecard showsBalance: $X.XXand, when available,Usage: $X.XXalongside the quota windows. The values are gated on Settings → Advanced → "Show optional credits and extra usage" at both the fetch and the render layer: turning the setting off only rebuilds the menu without an immediate refetch, so a previously-fetched balance would otherwise linger in the cached snapshot until the next refresh. Both the live menu-card model and the text descriptor hide the values whenever the setting is off, independent of cached data. - Not shown in the menu bar text: unlike some other credits-only providers, Sakana already has real 5-hour/weekly rate windows, and the "secondary metric" preference that would otherwise select an alternate menu bar display is the legitimate way to show the weekly window there. Reusing it for the PAYG balance would silently replace the weekly percentage for anyone who picks that preference, so the balance is menu-only for now.
CLI usage
codexbar usage --provider sakana
codexbar usage --provider sakana-ai # alias
Set the cookie via the environment variable or Settings UI:
- Environment variable:
SAKANA_COOKIE=<cookie-header-value> codexbar usage --provider sakana - Settings UI: Settings → Providers → Sakana AI → Cookie header
There is no codexbar config set command for cookieHeader; use one of the paths above.
Errors
| Error | Meaning |
|---|---|
missingCookie |
No Cookie: header is configured and SAKANA_COOKIE is unset. |
loginRequired |
The request was unauthorized/forbidden, redirected, or ended on a different origin. |
apiError(Int) |
The billing page returned a non-200 status not classified as a login failure. |
parseFailed(String) |
The billing response was empty or its quota data could not be parsed. |
Related files
Sources/CodexBarCore/Providers/Sakana/SakanaProviderDescriptor.swift— provider metadata, fetch plan, CLI configSakanaSettingsReader.swift—SAKANA_COOKIEenv key, cookie normalizerSakanaUsageFetcher.swift— billing-page HTML fetch and quota parser; also definesSakanaPayAsYouGoSnapshotand the pay-as-you-go tab fetch/parser
Sources/CodexBar/Providers/Sakana/SakanaProviderImplementation.swift— settings UI, availability checkSakanaSettingsStore.swift—sakanaCookieHeadersettings binding
Sources/CodexBar/MenuCardView+Costs.swift— live menu-card balance and usage sectionSources/CodexBar/MenuDescriptor.swift— text-descriptor balance and usage rowsTests/CodexBarTests/SakanaUsageFetcherTests.swift— parser regression tests- Dashboard:
https://console.sakana.ai/billing(subscription tab),https://console.sakana.ai/billing?tab=payAsYouGo(pay-as-you-go tab)