---
title: "Provider earnings from usage records (+ payout history)"
method: GET
path: "/v1/orgs/{orgId}/provider/earnings"
tags: ["Provider"]
---

# Provider earnings from usage records (+ payout history)

`GET /v1/orgs/{orgId}/provider/earnings`

## Path parameters

- `orgId` string, required

## Response `200`

OK

- ProviderEarnings
  - `activeRentals` integer — Currently-running rentals on this provider's nodes (open usage records).
  - `availableForPayoutCents` integer, required
  - `billableGrossCents` integer — Total paid-band gross (Σ billableHours × rate) — exactly what commission applies to: totalEarningsCents ≈ billableGrossCents × commission%. Render the gross→net reconciliation from THIS, not grossEarningsCents.
  - `billableHours` number — Hours that earned (fell in customers' paid band). Diverges from totalHours when you host free-credit-funded usage.
  - `byGpuModel` EarningsBreakdownGpu[], required
    - `billableGrossCents` integer — Paid-band gross (billableHours × rate) — what commission applies to; earningsCents = billableGrossCents × commission%.
    - `billableHours` number — Hours that fell in the paid band.
    - `earningsCents` integer, required
    - `gpuModelId` string, required
    - `grossEarningsCents` integer — Gross hosted value before commission/free-credit waterfall (hosted hours × rate).
    - `hours` number, required — Total hours hosted.
    - `name` string, required
  - `byNode` EarningsBreakdownNode[], required
    - `billableGrossCents` integer — Paid-band gross (billableHours × rate) — exactly what commission applies to: earningsCents = billableGrossCents × commission%. Use THIS for the gross→net reconciliation, not grossEarningsCents.
    - `billableHours` number — Hours that fell in the paid band (i.e. that earned).
    - `earningsCents` integer, required
    - `gpuCount` integer — GPU count on this node for the utilization denominator: sellable catalog inventory (Σ NodeGpu.Quantity, excluding unrecognised hardware), falling back to raw detected accelerators (Σ DetectedGpusRaw.Count) when no sellable rows exist. 0 only for a genuine CPU-only node.
    - `grossEarningsCents` integer — Gross hosted value before commission/free-credit waterfall (hosted hours × rate). earningsCents is what's actually earned.
    - `hostname` string, required
    - `hours` number, required — Total hours hosted (paid + free-credit + unpaid).
    - `nodeId` string, required
    - `rentedGpuHoursMonth` number — GPU-hours rented on this node so far this calendar month (Σ over GPU records of month-clamped hours × the record's gpuCount). The utilizationPercent numerator. NOTE: usage records written before per-record gpuCount was stamped count as 1 GPU (a conservative floor).
    - `utilizationPercent` number, nullable — Month-to-date utilization: rentedGpuHoursMonth / (gpuCount × hours elapsed this month) × 100, clamped to [0,100]. Null when gpuCount is 0 (CPU node) or the month just started (no elapsed time to measure against). CAVEAT: the denominator uses the node's CURRENT gpuCount, so a node whose GPU inventory changed mid-month is exact only from the change onward (added GPUs understate; removed GPUs can saturate at 100).
  - `byStream` EarningsBreakdownStream[] — CPU vs GPU income streams.
    - `billableGrossCents` integer — Paid-band gross for this stream (billableHours × rate) — what commission applies to.
    - `billableHours` number — Hours in this stream that fell in the paid band.
    - `earningsCents` integer, required — Net earned for this stream (paid band × commission).
    - `grossEarningsCents` integer — Gross hosted value for this stream before commission/waterfall.
    - `hours` number, required — Total hours hosted in this stream.
    - `stream` string, required — Income stream: 'gpu' (GPU rentals) or 'cpu' (CPU-only rentals).
  - `commissionPercent` integer, required
  - `currentMonthEarningsCents` integer, required
  - `currentMonthHours` number, required
  - `daily` EarningsDailyPoint[] — Last-30-UTC-day earnings series, oldest first, one point per day (zero-filled). A record's band hours/earnings are prorated onto each day by its share of the record's hosted hours (band placement itself is whole-of-life, so a day's split is an attribution, not a re-run of the waterfall per day).
    - `billableGrossCents` integer — Paid-band gross this day (what commission applies to).
    - `billableHours` number, required — Hours in the paid band this day (earned).
    - `date` string, required — UTC day, YYYY-MM-DD.
    - `earningsCents` integer, required — Net earned this day (paid-band × commission). Prorated across day boundaries for records spanning days.
    - `freeHours` number, required — Hours funded by customer free credits this day (earn $0).
    - `hostedHours` number, required — Total hours hosted this day (all bands).
    - `unpaidHours` number, required — Hours beyond the customer's free+paid funding this day (debt, earn $0).
  - `freeCreditHours` number — Hours funded by customer free credits (not paid out, per the provider agreement).
  - `grossEarningsCents` integer — Total gross hosted value before commission and the free-credit waterfall (Σ hosted hours × rate). totalEarningsCents is the net actually earned; the gap is commission + free/unpaid-band usage.
  - `pendingEarningsCents` integer, required
  - `recentPayouts` PayoutItem[], required
    - `amountCents` integer, required
    - `createdAt` string, required
    - `description` string, nullable
    - `id` string, required
    - `type` string, required
  - `totalEarningsCents` integer, required
  - `totalHours` number, required — Total hours hosted across all of this provider's usage.
  - `totalPaidOutCents` integer, required
  - `unpaidHours` number — Hours the customer ran beyond their free credit + paid balance (uncollected debt, so not paid out).

## Other responses

- `401` — Missing or invalid API key
- `403` — API key lacks the required scope

---

[API](https://skmtc.net/openrelay/apis/openrelay-api.md) · [All operations](https://skmtc.net/openrelay/apis/openrelay-api/llms.txt) · [OpenAPI document](https://skmtc-service-staging.skmtc.workers.dev/v1/apis/openrelay/openrelay-api/versions/4c42fd61ed41/schema)
