> ## 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.

# Pricing and Rate Limits

> Pricing model for Livepeer AI inference and transcoding: per-unit billing, network pricing vs managed pricing, and rate limit behaviour.

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>;
};

export const CenteredContainer = ({children, maxWidth = "800px", padding = "0", preset = "default", width = "", minWidth = "", marginRight = "", marginBottom = "", textAlign = "", style = {}, className = "", ...rest}) => {
  const presets = {
    default: {},
    fitContent: {
      width: "fit-content",
      minWidth: "fit-content"
    },
    readable70: {
      width: "70%",
      minWidth: "fit-content"
    },
    readable80: {
      width: "80%",
      minWidth: "fit-content"
    },
    readable90: {
      width: "90%"
    },
    wide900: {
      maxWidth: "900px"
    }
  };
  const presetStyle = presets[preset] || presets.default;
  return <div className={className} style={{
    maxWidth: presetStyle.maxWidth || maxWidth,
    margin: "0 auto",
    padding: padding,
    ...presetStyle.width ? {
      width: presetStyle.width
    } : {},
    ...presetStyle.minWidth ? {
      minWidth: presetStyle.minWidth
    } : {},
    ...width ? {
      width
    } : {},
    ...minWidth ? {
      minWidth
    } : {},
    ...marginRight ? {
      marginRight
    } : {},
    ...marginBottom ? {
      marginBottom
    } : {},
    ...textAlign ? {
      textAlign
    } : {},
    ...style
  }} {...rest}>
      {children}
    </div>;
};

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 LinkArrow = ({href, label, description, newline = true, borderColor, className = '', style = {}, ...rest}) => {
  const linkArrowStyle = {
    display: 'inline-flex',
    alignItems: 'center',
    justifyContent: 'center',
    gap: "var(--lp-spacing-1)",
    width: 'fit-content',
    ...borderColor && ({
      borderColor
    })
  };
  return <span className={className} style={style} {...rest}>
      {newline && <br />}
      <span style={linkArrowStyle}>
        <a href={href} target="_blank" rel="noopener noreferrer">
          {label}
        </a>
        <Icon icon="arrow-up-right" size={14} color="var(--lp-color-accent)" />
      </span>
      {description && description}
      {description && <div style={{
    height: "var(--lp-spacing-3)"
  }} />}
    </span>;
};

<CenteredContainer preset="readable90">
  <Tip>Livepeer network pricing is set by orchestrators and discovered at session time. There is no fixed price list. Check tools.livepeer.cloud/ai/network-capabilities for current warm capabilities and the community gateway's accepted price range.</Tip>
</CenteredContainer>

***

Livepeer pricing is decentralised: orchestrators advertise prices per pipeline type and model, and gateways filter by their configured maximum. There is no central price list. The prices below reflect community gateway defaults and typical orchestrator ranges as of May 2026.

<CustomDivider />

## Billing Units

<StyledTable variant="bordered">
  <thead>
    <TableRow header>
      <TableCell header>Workload</TableCell>
      <TableCell header>Billing unit</TableCell>
      <TableCell header>Unit definition</TableCell>
    </TableRow>
  </thead>

  <tbody>
    <TableRow>
      <TableCell>Transcoding</TableCell>
      <TableCell>Wei per pixel</TableCell>
      <TableCell>Total output pixels across all renditions per segment</TableCell>
    </TableRow>

    <TableRow>
      <TableCell>Batch AI inference (all pipelines except live-video-to-video)</TableCell>
      <TableCell>Orchestrator-defined per request or per output</TableCell>
      <TableCell>Varies by pipeline type and orchestrator configuration</TableCell>
    </TableRow>

    <TableRow>
      <TableCell>Live AI (`live-video-to-video`)</TableCell>
      <TableCell>Wei per second</TableCell>
      <TableCell>Wall-clock seconds of active inference session</TableCell>
    </TableRow>
  </tbody>
</StyledTable>

All prices are denominated in wei (ETH on Arbitrum One). The `TicketBroker` contract settles winning tickets; the expected payment per ticket equals `faceVal × winProb`.

<CustomDivider />

## Community Gateway

The community gateway at `dream-gateway.livepeer.cloud` is operated by the Livepeer Foundation for development access. It routes to whichever orchestrators in the active set are warm for the requested pipeline.

The community gateway does not publish a fixed price schedule. It accepts jobs within the orchestrator price range active on the network at request time. For development and low-volume testing this is adequate; for production workloads with cost predictability requirements, operate a self-hosted gateway with `-maxPricePerUnit` configured.

**Rate limiting:** The community gateway applies rate limiting to unauthenticated requests. Sustained high-volume traffic will be throttled. There is no published rate limit figure; if requests begin returning `429` responses, reduce request frequency or move to a dedicated gateway.

<CustomDivider />

## Discovering Current Prices

Orchestrators advertise AI pipeline pricing in `aiModels.json` and register this data via the AI Service Registry on Arbitrum One. Gateways query this at session establishment.

To find current prices:

1. **Network capability dashboard:** `tools.livepeer.cloud/ai/network-capabilities` shows warm pipelines and model IDs across the active orchestrator set, but does not display per-orchestrator pricing
2. **GetOrchestratorInfo RPC:** gateways call this to retrieve price and capability data directly from orchestrators during session setup
3. **Livepeer Explorer:** `explorer.livepeer.org` shows historical per-unit prices for transcoding orchestrators

<CustomDivider />

## Orchestrator Pricing Reference

Orchestrators configure pricing per pipeline in `aiModels.json`. The `price_per_unit` field is in wei and its meaning varies by pipeline:

<StyledTable variant="bordered">
  <thead>
    <TableRow header>
      <TableCell header>Pipeline</TableCell>
      <TableCell header>Recommended unit interpretation</TableCell>
      <TableCell header>Notes</TableCell>
    </TableRow>
  </thead>

  <tbody>
    <TableRow>
      <TableCell>`text-to-image`</TableCell>
      <TableCell>Wei per image generated</TableCell>
      <TableCell>Set to 0 to offer free access during development</TableCell>
    </TableRow>

    <TableRow>
      <TableCell>`image-to-image`</TableCell>
      <TableCell>Wei per image output</TableCell>
      <TableCell>Same as text-to-image</TableCell>
    </TableRow>

    <TableRow>
      <TableCell>`audio-to-text`</TableCell>
      <TableCell>Wei per second of audio transcribed</TableCell>
      <TableCell>Longer audio = higher expected fee</TableCell>
    </TableRow>

    <TableRow>
      <TableCell>`llm`</TableCell>
      <TableCell>Wei per completion</TableCell>
      <TableCell>No token-count billing; flat per-call pricing</TableCell>
    </TableRow>

    <TableRow>
      <TableCell>`live-video-to-video`</TableCell>
      <TableCell>Wei per second of inference</TableCell>
      <TableCell>Billed by elapsed session time, not frame count</TableCell>
    </TableRow>
  </tbody>
</StyledTable>

For transcoding, `-pricePerUnit` is set in wei per pixel at node startup, not in `aiModels.json`.

<Note>
  Setting `price_per_unit: 0` makes the orchestrator accessible at any gateway's configured maximum price. Use `0` for development and test environments; set a positive value in production to recover infrastructure costs.
</Note>

<CustomDivider />

## Related Pages

<CardGroup cols={2}>
  <Card title="Probabilistic Micropayments" icon="coin" href="/v2/developers/guides/payments/probabilistic-micropayments" arrow horizontal>
    How prices translate to PM ticket face values and win probabilities.
  </Card>

  <Card title="Per-Second Compute" icon="clock" href="/v2/developers/guides/payments/per-second-compute" arrow horizontal>
    Per-second billing model for the live-video-to-video pipeline.
  </Card>

  <Card title="Orchestrator Selection" icon="server" href="/v2/developers/guides/payments/orchestrator-selection-and-pricing" arrow horizontal>
    How gateways filter orchestrators by price and capability.
  </Card>

  <Card title="ETH Escrow" icon="lock" href="/v2/developers/guides/payments/eth-escrow-and-deposits" arrow horizontal>
    TicketBroker deposits that cover expected payment for jobs submitted.
  </Card>
</CardGroup>
