Daily usage and per-key totals in this billing period
using System.Net.Http.Headers;var client = new HttpClient();var request = new HttpRequestMessage{ Method = HttpMethod.Get, RequestUri = new Uri("https://oddslink.app/v1/account/usage/history/session"), Headers = { { "Authorization", "Bearer <token>" }, },};using (var response = await client.SendAsync(request)){ response.EnsureSuccessStatusCode(); var body = await response.Content.ReadAsStringAsync(); Console.WriteLine(body);}package main
import ( "fmt" "net/http" "io")
func main() {
url := "https://oddslink.app/v1/account/usage/history/session"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close() body, _ := io.ReadAll(res.Body)
fmt.Println(res) fmt.Println(string(body))
}OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder() .url("https://oddslink.app/v1/account/usage/history/session") .get() .addHeader("Authorization", "Bearer <token>") .build();
Response response = client.newCall(request).execute();const url = 'https://oddslink.app/v1/account/usage/history/session';const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
try { const response = await fetch(url, options); const data = await response.json(); console.log(data);} catch (error) { console.error(error);}curl --request GET \ --url https://oddslink.app/v1/account/usage/history/session \ --header 'Authorization: Bearer <token>'Signed-in website session only; API keys are refused. Returns one UTC calendar-day row for each day touched by the current billing period. A null request count means daily tracking did not yet cover that day, or the day is in the future; zero means tracking covered the day and no priced calls were charged. If tracking began during a day, that first day’s count covers only the time after coverage_start. Per-key counts are whole-period totals from the existing monthly ledger, including revoked live keys. Test keys never spend the monthly allowance and report zero. This account read is free and uses the dedicated usage-read speed bucket.
Authorizations
Section titled “Authorizations”Responses
Section titled “ Responses ”Current-period daily coverage and key totals for the signed-in account.
object
Inclusive current billing-period start.
Exclusive current billing-period end.
Earliest instant from which daily counts are complete. If the existing monthly total was zero when daily tracking began, this is the period start (or the tracking instant if a concurrently healed anchor is briefly in the future); otherwise it is the instant tracking began. During a rolling API release, a monthly write from an older worker without a daily write advances coverage to the detection instant and discards that day’s incomplete bar. The containing UTC day can be partial. A call accepted just before a concurrently healed anchor is attributed to the first UTC day of its new billing period.
object
UTC calendar day.
Successful priced calls, or null outside known coverage.
Keys owned by this account, including revoked keys; newest first.
object
Whole-period charged calls for this key; always zero for test keys.
Examplegenerated
{ "period_start": "2026-04-15T12:00:00Z", "period_end": "2026-04-15T12:00:00Z", "coverage_start": "2026-04-15T12:00:00Z", "days": [ { "date": "2026-04-15", "requests": 1 } ], "by_key": [ { "id": "2489E9AD-2EE2-8E00-8EC9-32D5F69181C0", "label": "example", "prefix": "example", "last_four": "example", "test": true, "revoked_at": "2026-04-15T12:00:00Z", "requests": 1, "last_used_at": "2026-04-15T12:00:00Z" } ]}Headers
Section titled “Headers”Requests used this billing period.
Requests remaining this billing period.
What this one call cost against the allowance (0 for a free call).
This plan’s speed limit, in requests per second.
Requests left in the current one-second window.
Seconds until the speed-limit window resets.
This request’s id, for support and for matching against error.request_id.
The Authorization bearer session is missing or invalid.
object
object
Stored Unix-second choices on AMBIGUOUS_EVENT or INVALID_STORED_COMMENCE_TIME; independent of dateFormat.
Valid case-sensitive book keys on INVALID_BOOKMAKER.
403 only: the plan on the presented key.
403 only: the lowest plan that includes this request. For history, that depends on how long ago the fixture started as well as on the endpoint.
Examples
No Authorization: Bearer header sent
{ "error": { "code": "MISSING_SESSION", "message": "Sign in and try again.", "docs_url": "https://oddslink.app/docs/errors/#missing-session", "request_id": "req_01hz8k4b9h5y0z1a" }}Session is expired or invalid
{ "error": { "code": "INVALID_SESSION", "message": "Your session has expired. Sign in again.", "docs_url": "https://oddslink.app/docs/errors/#invalid-session", "request_id": "req_01hz8k4c0j6z1a2b" }}Headers
Section titled “Headers”Requests used this billing period.
Requests remaining this billing period.
What this one call cost against the allowance (0 for a free call).
This plan’s speed limit, in requests per second.
Requests left in the current one-second window.
Seconds until the speed-limit window resets.
This request’s id, for support and for matching against error.request_id.
The plan’s speed limit was exceeded; wait Retry-After seconds. A call that does not count against the allowance is never refused for a spent allowance.
object
object
Stored Unix-second choices on AMBIGUOUS_EVENT or INVALID_STORED_COMMENCE_TIME; independent of dateFormat.
Valid case-sensitive book keys on INVALID_BOOKMAKER.
403 only: the plan on the presented key.
403 only: the lowest plan that includes this request. For history, that depends on how long ago the fixture started as well as on the endpoint.
Example
{ "error": { "code": "SPEED_LIMIT", "message": "Speed limit exceeded: 10 requests/second on the Growth plan.", "docs_url": "https://oddslink.app/docs/errors/#speed-limit", "request_id": "req_01hz8k4f7m9c3d8f" }}Headers
Section titled “Headers”Requests used this billing period.
Requests remaining this billing period.
What this one call cost against the allowance (0 for a free call).
This plan’s speed limit, in requests per second.
Requests left in the current one-second window.
Seconds until the speed-limit window resets.
This request’s id, for support and for matching against error.request_id.
Seconds to wait before retrying on 429 SPEED_LIMIT or 503 ODDS_UNAVAILABLE.
Something failed on our side.
object
object
Stored Unix-second choices on AMBIGUOUS_EVENT or INVALID_STORED_COMMENCE_TIME; independent of dateFormat.
Valid case-sensitive book keys on INVALID_BOOKMAKER.
403 only: the plan on the presented key.
403 only: the lowest plan that includes this request. For history, that depends on how long ago the fixture started as well as on the endpoint.
Example
{ "error": { "code": "INTERNAL_ERROR", "message": "Something went wrong on our side. It has been logged.", "docs_url": "https://oddslink.app/docs/errors/#internal-error", "request_id": "req_01hz8k4h8n0d4e9f" }}Headers
Section titled “Headers”Requests used this billing period.
Requests remaining this billing period.
What this one call cost against the allowance (0 for a free call).
This plan’s speed limit, in requests per second.
Requests left in the current one-second window.
Seconds until the speed-limit window resets.
This request’s id, for support and for matching against error.request_id.