> ## Documentation Index
> Fetch the complete documentation index at: https://docs.livepeer.org/llms.txt
> Use this file to discover all available pages before exploring further.

# Earning Model

> How orchestrators earn on Livepeer – ETH service fees, LPT inflationary rewards, commission parameters, what wins jobs, and how AI changes the fee landscape.

export const CustomDivider = ({color = "var(--lp-color-border-default)", middleText = "", spacing = "default", style = {}, className = "", ...rest}) => {
  const spacingPresets = {
    default: {
      margin: "24px 0"
    },
    overlap: {
      margin: "-1rem 0 -1rem 0"
    },
    tight: {
      margin: "0 0 -1rem 0"
    },
    section: {
      margin: "0 0 -2rem 0"
    },
    sectionOverlap: {
      margin: "-1rem 0 -2rem 0"
    },
    deepOverlap: {
      margin: "-1rem 0 -1.5rem 0"
    }
  };
  const spacingStyle = spacingPresets[spacing] || spacingPresets.default;
  return <div role="separator" aria-orientation="horizontal" className={className} style={{
    display: "flex",
    alignItems: "center",
    ...spacingStyle,
    fontSize: style?.fontSize || "16px",
    height: "fit-content",
    ...style
  }} {...rest}>
      <span style={{
    marginRight: "var(--lp-spacing-px-8)",
    opacity: 0.2
  }}>
        <Icon icon="/snippets/assets/logos/Livepeer-Logo-Symbol-Theme.svg" />
      </span>
      <div style={{
    flex: 1,
    height: "1px",
    background: "var(--lp-color-border-default)",
    opacity: 0.4
  }}></div>
      {middleText && <>
          <Icon icon="circle" size={2} />
          <span style={{
    margin: "0 8px",
    fontWeight: "bold",
    color: color,
    opacity: 0.7
  }}>
            {middleText}
          </span>
          <Icon icon="circle" size={2} />
        </>}
      <div style={{
    flex: 1,
    height: "1px",
    background: "var(--lp-color-border-default)",
    opacity: 0.4
  }}></div>
      <span style={{
    marginLeft: "var(--lp-spacing-px-8)",
    opacity: 0.2
  }}>
        <span style={{
    display: "inline-block",
    transform: "scaleX(-1)"
  }}>
          <Icon icon="/snippets/assets/logos/Livepeer-Logo-Symbol-Theme.svg" />
        </span>
      </span>
    </div>;
};

export const TableCell = ({children, align = "left", header = false, style = {}, className = "", ...rest}) => {
  const Component = header ? "th" : "td";
  return <Component className={className} style={{
    padding: "0.75rem 1rem",
    textAlign: align,
    border: header ? "none" : "1px solid var(--lp-color-border-default)",
    ...style
  }} {...rest}>
      {children}
    </Component>;
};

export const TableRow = ({children, header = false, hover = false, style = {}, className = "", ...rest}) => {
  const rowId = `table-row-${Math.random().toString(36).substr(2, 9)}`;
  return <>
      {hover && <style>{`
          #${rowId}:hover {
            background-color: var(--lp-color-bg-card);
          }
        `}</style>}
      <tr id={rowId} className={className} style={{
    ...header && ({
      backgroundColor: "var(--lp-color-accent-strong)",
      color: "var(--lp-color-on-accent)",
      fontWeight: "bold"
    }),
    ...style
  }} {...rest}>
        {children}
      </tr>
    </>;
};

export const StyledTable = ({children, variant = "default", style = {}, className = "", ...rest}) => {
  const wrapperVariants = {
    default: {
      border: "1px solid var(--lp-color-border-default)",
      backgroundColor: "var(--lp-color-bg-card)",
      overflow: "hidden"
    },
    bordered: {
      border: "2px solid var(--lp-color-accent)",
      backgroundColor: "var(--lp-color-bg-page)",
      overflow: "hidden"
    },
    minimal: {
      border: "none",
      backgroundColor: "transparent",
      overflow: "visible"
    }
  };
  return <div data-docs-styled-table-shell className={className} style={{
    width: "100%",
    padding: 0,
    margin: 0,
    ...wrapperVariants[variant],
    ...style
  }} {...rest}>
      <table data-docs-styled-table style={{
    width: "100%",
    borderCollapse: "collapse",
    borderSpacing: 0,
    margin: 0,
    backgroundColor: "transparent"
  }}>
        {children}
      </table>
    </div>;
};

Running a Livepeer Orchestrator pays through two distinct revenue streams with different mechanics. Know both before you decide how to configure the node, grow stake, or price work.

<Note>
  **New here?** Start here for the mechanics. For what those mechanics mean in practice for your specific hardware and situation, see [Feasibility and Economics](/v2/Orchestrators/guides/operator-considerations/operator-rationale). For the step-by-step operations of reward calling and commission setting, continue to [Rewards and Fees](/v2/Orchestrators/guides/staking-and-rewards/reward-mechanics).
</Note>

<CustomDivider />

## The two revenue streams

<CardGroup cols={2}>
  <Card title="ETH Service Fees" icon="ethereum">
    Gateways pay you in ETH for every transcoding or AI inference job you complete. Demand-driven: you only earn when you win jobs.
  </Card>

  <Card title="LPT Inflationary Rewards" icon="coins">
    The protocol mints new LPT every round and distributes it to active staked Orchestrators. You must call `Reward()` each round to claim your share.
  </Card>
</CardGroup>

These streams behave very differently. ETH fees depend on market demand and your competitiveness. LPT rewards depend on your stake, the current inflation rate, and whether you call `Reward()` every round without missing one. Both matter for total income.

<CustomDivider />

## ETH service fees

Every time a Gateway routes a job to your Orchestrator and you complete it successfully, you earn ETH. The Gateway sends payment via Livepeer's **probabilistic micropayment** system – a series of signed tickets that represent ETH obligations. When you receive a winning ticket, you submit it on-chain to redeem the ETH.

Fees exist for two workload types:

<StyledTable variant="bordered">
  <TableRow header>
    <TableCell header>Workload</TableCell>
    <TableCell header>Pricing unit</TableCell>
    <TableCell header>Typical fee level</TableCell>
    <TableCell header>GPU required?</TableCell>
  </TableRow>

  <TableRow>
    <TableCell>Video transcoding</TableCell>
    <TableCell>Per segment (\~2s of video)</TableCell>
    <TableCell>Low (commoditised)</TableCell>
    <TableCell>Recommended for throughput</TableCell>
  </TableRow>

  <TableRow>
    <TableCell>AI inference</TableCell>
    <TableCell>Per inference job (pixel, ms, token)</TableCell>
    <TableCell>Higher (GPU-intensive)</TableCell>
    <TableCell>Required</TableCell>
  </TableRow>
</StyledTable>

AI inference commands higher fees per job because the work is more GPU-intensive. An Orchestrator running popular AI models warm on a high-VRAM GPU is positioned very differently in the fee market than one doing transcoding alone.

### What determines how much work you win

Gateways route jobs through a competitive filter across multiple factors at once:

```icon="terminal" theme={"theme":{"light":"github-light","dark":"dark-plus"}}
Stake weight         → higher stake = larger active set position = more segments
Capability match     → do you support the requested pipeline or resolution?
Performance history  → transcoding success rate, AI inference latency, uptime
Pricing              → are your fees below the gateway's maxPricePerUnit?
Model warmth (AI)    → warm models win over cold ones for latency-sensitive jobs
```

None of these factors alone is decisive. A high-stake Orchestrator with uncompetitive pricing wins fewer jobs than a moderate-stake node priced correctly. A well-priced node without warm models loses AI jobs to one that has them.

<CustomDivider />

## LPT inflationary rewards

Each round (approximately every 22 hours on Arbitrum), the Livepeer Protocol mints new LPT and distributes it to active Orchestrators proportional to their **total stake** – that is, their own self-bonded LPT plus all delegated stake from third parties.

Three things must be true for you to receive that round's rewards:

1. You are in the **Active Set** (top Orchestrators by stake weight)
2. You successfully call `Reward()` on-chain that round
3. Your node has LPT bonded (self-stake)

**Inflation rate dynamics:** The rate is dynamic. It rises when less than \~50% of total LPT supply is bonded, and falls when more than \~50% is bonded. The protocol targets 50% participation. As of early 2026, approximately 61% of LPT supply was bonded, so the inflation rate was gradually declining towards its floor.

**Treasury allocation:** As of LIP-89 (March 2026), 10% of each round's newly minted LPT goes to the [Livepeer Treasury](https://explorer.livepeer.org/treasury) before distribution to Orchestrators. The remaining 90% is distributed as before.

<Warning>
  Missing a round's `Reward()` call means that round's inflation allocation is permanently lost. For a well-staked Orchestrator, a single missed round forfeits a noticeable amount of LPT. Automate this.
</Warning>

<CustomDivider />

## Commission parameters

When you register you set two commission parameters that determine how you split earnings with Delegators. Both update on-chain immediately, and frequent changes damage Delegator trust.

### Reward Cut

The percentage of LPT inflationary rewards **you keep as the operator**. Delegators receive the rest, split proportionally by their stake.

```icon="terminal" theme={"theme":{"light":"github-light","dark":"dark-plus"}}
Your LPT = Round issuance share × rewardCut
Delegator LPT = Round issuance share × (1 − rewardCut) × (their stake / total stake)
```

**Example:** Your Orchestrator earns 100 LPT this round. Your `rewardCut` is 20%.

* You keep: 20 LPT
* Delegators split: 80 LPT (in proportion to their individual stakes)

### Fee share

The percentage of ETH job fee revenue that is **shared with your Delegators**. The remainder you keep.

```icon="terminal" theme={"theme":{"light":"github-light","dark":"dark-plus"}}
Delegator ETH = Job fees × feeShare × (their stake / total stake)
Your ETH = Job fees × (1 − feeShare)
```

**Example:** You earn 0.1 ETH in fees this round. Your `feeShare` is 50%.

* You keep: 0.05 ETH
* Delegators split: 0.05 ETH

<Note>
  Commission rates directly affect Delegator yield calculations on the [Livepeer Explorer](https://explorer.livepeer.org). Delegators compare Orchestrators by ROI. Setting competitive rates attracts more stake, which increases your inflation share and job routing weight – a compounding dynamic. See [Getting Delegates](/v2/Orchestrators/guides/staking-and-rewards/delegate-operations) for the full strategy.
</Note>

<CustomDivider />

## Transcoding vs AI fees in practice

The fee landscape is shifting. AI inference jobs now represent a growing share of total network fee revenue.

<StyledTable variant="bordered">
  <TableRow header>
    <TableCell header />

    <TableCell header>Video Transcoding</TableCell>
    <TableCell header>AI Inference</TableCell>
  </TableRow>

  <TableRow>
    <TableCell>**Fee source**</TableCell>
    <TableCell>Live stream demand</TableCell>
    <TableCell>Application API calls</TableCell>
  </TableRow>

  <TableRow>
    <TableCell>**Pricing unit**</TableCell>
    <TableCell>Per segment</TableCell>
    <TableCell>Per pixel / ms / token</TableCell>
  </TableRow>

  <TableRow>
    <TableCell>**Revenue characteristic**</TableCell>
    <TableCell>Continuous, lower margin</TableCell>
    <TableCell>Per-request, higher margin</TableCell>
  </TableRow>

  <TableRow>
    <TableCell>**Competitiveness factor**</TableCell>
    <TableCell>Stake + price</TableCell>
    <TableCell>Capability + model warmth + price</TableCell>
  </TableRow>

  <TableRow>
    <TableCell>**GPU dependency**</TableCell>
    <TableCell>Recommended</TableCell>
    <TableCell>Required</TableCell>
  </TableRow>

  <TableRow>
    <TableCell>**Stake affects routing?**</TableCell>
    <TableCell>Yes (stake-weighted)</TableCell>
    <TableCell>Partially (capability first, price second)</TableCell>
  </TableRow>
</StyledTable>

A key distinction: for video transcoding, stake weight directly determines your position in the routing queue. For AI inference, the Gateway first filters by capability and price – your stake matters less than having the right pipeline running at a competitive price.

This supports two parallel strategies on a single node:

* **Transcoding income:** grow stake to capture more segments
* **AI inference income:** run popular models warm at competitive prices

<CustomDivider />

## Payment flow summary

```icon="terminal" theme={"theme":{"light":"github-light","dark":"dark-plus"}}
Gateway routes job → you complete it
       ↓
Gateway sends payment ticket (signed ETH obligation)
       ↓
You receive winning tickets (probabilistic  -  not every ticket wins)
       ↓
Redeemer submits winning tickets on-chain (Arbitrum)
       ↓
ETH arrives in your orchestrator wallet
```

For the full mechanics of how Probabilistic Micropayments work, ticket face values, and on-chain redemption, see [Payments](/v2/Orchestrators/guides/payments-and-pricing/payment-receipts).

<CustomDivider />

## Monitoring your earnings

<StyledTable variant="bordered">
  <TableRow header>
    <TableCell header>Tool</TableCell>
    <TableCell header>What it shows</TableCell>
  </TableRow>

  <TableRow>
    <TableCell>[explorer.livepeer.org](https://explorer.livepeer.org)</TableCell>
    <TableCell>Stake composition, Delegator list, reward call history, fee revenue, Active Set status</TableCell>
  </TableRow>

  <TableRow>
    <TableCell>[tools.Livepeer.cloud](https://tools.livepeer.cloud)</TableCell>
    <TableCell>AI pipeline capability coverage, per-Orchestrator network data</TableCell>
  </TableRow>

  <TableRow>
    <TableCell>go-livepeer Prometheus metrics</TableCell>
    <TableCell>Current job counts, success rates, ticket values</TableCell>
  </TableRow>
</StyledTable>

Check your reward call history on Explorer regularly. A gap in the reward history means missed rounds and lost LPT. For monitoring setup, see [Metrics and Monitoring](/v2/Orchestrators/guides/monitoring-and-tooling/metrics-and-alerting).

<CustomDivider />

## Watch: Orchestrator economics overview

<Frame>
  <iframe width="100%" height="400" src="https://www.youtube.com/embed/OVMjzJKMJnI" title="Livepeer Orchestrator Economics  -  How to Earn LPT and ETH" frameBorder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowFullScreen />
</Frame>

<CustomDivider />

## Continue in this section

<CardGroup cols={2}>
  <Card title="Rewards and Fees" icon="hand-holding-dollar" href="/v2/orchestrators/guides/staking-and-rewards/reward-mechanics">
    Reward call mechanics, automation, gas thresholds, and fee redemption operations.
  </Card>

  <Card title="Getting Delegates" icon="people-group" href="/v2/orchestrators/guides/staking-and-rewards/delegate-operations">
    How to attract Delegators, what the Explorer ROI calculation shows them, and how to build reputation.
  </Card>

  <Card title="Payments" icon="receipt" href="/v2/orchestrators/guides/payments-and-pricing/payment-receipts">
    How ETH moves from Gateway to your wallet – Probabilistic Micropayments, ticket redemption, and the Redeemer.
  </Card>

  <Card title="Governance and Voting" icon="check-to-slot" href="/v2/orchestrators/guides/staking-and-rewards/network-participation">
    Voting on Livepeer Improvement Proposals using livepeer\_cli.
  </Card>
</CardGroup>
