reports

Project Cdn Timeseries

Per-day CDN egress + storage (GB) for THIS project, last days days (billing-grade from cdn_usage_daily) + the project's last CDN publish. Powers the project dashboard 'Diffusion & stockage (30j)' card.

POINT SEMANTICS — the two fields do NOT aggregate the same way:

  • bytes_egress is the traffic OF THAT DAY, not a running total. SUM the points for a window total. This holds on BOTH egress paths below, but the two are established differently, and the distinction matters if you ever re-verify it:
    • shared-zone path — by CONTRACT: cdn_metrics.sync_for_date(d) writes $set (never $inc) of a value derived from that single day's log, keyed (org, project, date), so a re-sync overwrites instead of adding and accumulation is structurally impossible.
    • dedicated-zone path — by MEASUREMENT: the values come from Bunny's BandwidthUsedChart and are passed through untransformed, so our code cannot guarantee their semantics. Verified 2026-07-28 on four dedicated-zone projects with multi-day traffic: every one of them DECREASES between consecutive days, which a cumulative series cannot do. Re-check on a project with several non-zero days — one with a single day of traffic cannot tell the two readings apart.
  • storage_bytes is a LEVEL (current state), snapshotted daily and overwritten each run by sync_storage_snapshot(). Take the LAST point; summing it would add N photographs of the same stock.

EGRESS HAS TWO SOURCES BEHIND ONE FIELD NAME — know this before comparing two projects on this endpoint:

  • shared-zone project: parsed from the Bunny pull-zone LOG (per request).
  • dedicated-zone project (projects.bunny_zone_id set): Bunny's per-zone AGGREGATE (BandwidthUsedChart), because its traffic never appears in the shared log. That aggregate has no per-request dimension, so anything that filters requests (e.g. excluding our own integrity re-reads) can apply to the shared-log path only. Storage has no such split: it always comes from the shared storage walk.

Egress therefore includes the platform's OWN post-publish integrity fetch (cdn_bunny._verify_edge_fresh re-downloads each bundle through the edge to recompute its sha256). A freshly published project with zero consumers still reports egress; it is real traffic, but it is ours, not the customer's.

get/v1/projects/{project_id}/usage/cdn/timeseries

Request

  • Base URL: https://api.sonenta.dev
  • URL: https://api.sonenta.dev/v1/projects/{project_id}/usage/cdn/timeseries
  • Auth: none declared

Path parameters

project_idstring required

Query parameters

daysinteger

Response

Successful Response

project_uuidstring required
daysinteger required
last_published_atstring date-time nullable
consumedboolean nullable

Changes

No recorded changes to this operation across all 1 revision of this API.