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

# Explorer Operations

> A walkthrough of every metric on your Livepeer Explorer orchestrator page – what each number means, what healthy looks like, and what to do when something is wrong.

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

Use the Livepeer Explorer to read the public state of your Orchestrator: stake, cuts, reward calls, fee earnings, and service URI. Every number here comes from on-chain data indexed from Arbitrum, so the page is best used to confirm protocol state, compare your settings with peers, and spot drift between what you intended and what the network sees.

**Your Orchestrator profile:**

```text icon="terminal" title="Explorer orchestrator profile URL" theme={"theme":{"light":"github-light","dark":"dark-plus"}}
https://explorer.livepeer.org/accounts/<your-address>/orchestrating
```

<CustomDivider />

## Explorer scope

Before diving into metrics, understanding the Explorer's scope avoids confusion.

**What it shows:**

* On-chain state as written to Arbitrum – stake, cuts, reward calls, fee earnings
* Protocol-level data: your registered service URI, your active/inactive status
* Your Delegators and their individual stake amounts

**What it leaves out:**

* Live node health or uptime (use Prometheus for this)
* Off-chain pool worker contributions (pool workers are invisible to the protocol)
* AI model warm status or per-pipeline job counts (use [tools.Livepeer.cloud](https://tools.livepeer.cloud/ai/network-capabilities))
* Which Gateways are currently routing work to you (use the Loki Gateway API)

<CustomDivider />

## Active Set status

<Frame>
  The Active Set is the top 100 Orchestrators by total stake at each round boundary. Only Active Set members receive transcoding work.
</Frame>

**What to watch:**

* Your rank among all Orchestrators
* Whether you are currently active or inactive
* Your trend over the past 30 days

**Outside the Active Set:**

Your stake (self-stake plus delegated stake) is insufficient to rank in the top 100. The gap between your stake and the 100th-place Orchestrator is the amount you need to close. Your options are to increase your self-stake directly, or to attract more Delegators.

<CustomDivider />

## Total stake

This is the sum of your self-stake and all delegated stake. It is the single most important variable for your Active Set ranking, and for the proportion of video transcoding work routed to you by stake-weighted Gateways.

<AccordionGroup>
  <Accordion title="Self-stake vs delegated stake" icon="coins">
    Your self-stake is the LPT you bonded to yourself. Delegated stake comes from LPT holders who chose to delegate to you.

    Increase your self-stake directly by bonding more LPT. Attracting Delegators requires competitive Reward Cut and fee share settings plus a strong performance track record – see [Getting Delegates](/v2/Orchestrators/guides/staking-and-rewards/delegate-operations).
  </Accordion>

  <Accordion title="How stake affects job routing" icon="coins">
    For video transcoding, stake weighting affects selection probability. Higher stake means you are more likely to be selected by stake-weighted Gateways. For AI inference, routing is primarily capability-based (does your node support the requested model?) and price-based (is your price within the Gateway's limit?). Stake plays a smaller role in AI job routing.
  </Accordion>

  <Accordion title="Pending stake vs current stake" icon="coins">
    Pending stake refers to delegations and undelegations that have been submitted but have not yet taken effect. Changes to stake take effect at the next round boundary.
  </Accordion>
</AccordionGroup>

<CustomDivider />

## Reward Cut and fee share

These two parameters are your public service terms, visible to any potential Delegator evaluating your Orchestrator.

<StyledTable variant="bordered">
  <TableRow header>
    <TableCell header>Parameter</TableCell>
    <TableCell header>What it means</TableCell>
    <TableCell header>Who it affects</TableCell>
  </TableRow>

  <TableRow>
    <TableCell>**Reward Cut**</TableCell>
    <TableCell>Percentage of LPT inflation you keep. The rest goes to Delegators proportional to their stake.</TableCell>
    <TableCell>Your income + Delegator attraction</TableCell>
  </TableRow>

  <TableRow>
    <TableCell>**Fee share**</TableCell>
    <TableCell>Percentage of ETH transcoding fees you share with Delegators.</TableCell>
    <TableCell>Delegator yield</TableCell>
  </TableRow>
</StyledTable>

**What competitive looks like:**

Check the top 20 active Orchestrators on the Explorer and compare your settings. Reward Cut of 5–15% and fee share of 0–10% is typical for competitive operators. Very high reward cuts (above 30%) make delegation unattractive; Delegators earn less per LPT staked than they would on a lower-cut Orchestrator.

**Changing these parameters** requires an on-chain transaction and takes effect at the next round boundary. You can update them via `livepeer_cli` or directly in the Explorer interface if your wallet is connected.

<Warning>
  Changes to Reward Cut and fee share are publicly visible to Delegators and affect their yield. Frequent large changes can reduce Delegator confidence. Communicate changes in advance if your Delegator base is large.
</Warning>

<CustomDivider />

## Reward call history

This is the most operationally important metric to monitor regularly.

Each round (\~22 hours on Arbitrum), your node must call `reward()` to claim that round's LPT inflation. The Explorer shows your call history round by round.

```icon="terminal" theme={"theme":{"light":"github-light","dark":"dark-plus"}}
Round 4021 ✓ reward called
Round 4022 ✓ reward called
Round 4023 ✗ missed
Round 4024 ✓ reward called
```

**What a missed round costs:**

When you miss a round, that round's LPT inflation that would have been minted to your address is permanently lost. You and your Delegators both miss their share. This compounds over time – Delegators whose yield is consistently reduced by missed rounds will unbond and move their stake elsewhere.

**Target: 100% call rate.**

**Diagnosing missed rounds:**

<AccordionGroup>
  <Accordion title="Reward calling disabled" icon="coins">
    `-reward=false` disables reward calling. In split setups where the Orchestrator and transcoder run as separate processes, keep the flag state consistent across every launch command. A common mistake is disabling reward on the Orchestrator while a second process still owns the wallet.
  </Accordion>

  <Accordion title="Check your ETH balance for gas" icon="circle-question">
    Reward calls require ETH on Arbitrum for gas. A dry wallet causes reward calls to fail silently. Check your Orchestrator address ETH balance on Arbiscan and keep at least 0.02–0.05 ETH in the wallet as a buffer.
  </Accordion>

  <Accordion title="Check node uptime at round boundaries" icon="server">
    A node offline at the round boundary misses the reward call. The Arbitrum round length is approximately 22 hours. Compare regular maintenance windows against round boundaries before you dismiss the gap as random.
  </Accordion>

  <Accordion title="Using OrchestratorSiphon" icon="circle-question">
    If missed rewards are a recurrent problem, consider the [split setup](/v2/Orchestrators/guides/deployment-details/siphon-setup). OrchestratorSiphon runs reward calling on a separate, stable machine independently of your GPU workload machine.
  </Accordion>
</AccordionGroup>

<CustomDivider />

## Fees earned

Cumulative ETH earned from video transcoding and AI inference fees. This is separate from LPT inflation rewards.

**How to read it:**

A low or zero fee balance despite being in the Active Set usually means one of three things:

1. **Price is too high** – your `-pricePerUnit` exceeds what Gateways are willing to pay. Check [Livepeer Explorer](https://explorer.livepeer.org/orchestrators) to compare your price to other active Orchestrators. Most Gateways have a maximum price they will pay, and any Orchestrator above that ceiling receives no work.

2. **Node is unreachable** – Gateways cannot connect to your service URI. Test reachability from outside your network: `curl -v https://<your-service-uri>:8935/status`. Port 8935 must be accessible from the public internet.

3. **Capabilities not registered** – for AI workloads, your `aiModels.json` configuration must match what Gateways are requesting. Check [tools.Livepeer.cloud/ai/network-capabilities](https://tools.livepeer.cloud/ai/network-capabilities) to confirm your pipelines appear.

<CustomDivider />

## Delegator list

Your Delegators are LPT holders who have staked to your Orchestrator. Their stake contributes to your total and increases your routing probability.

**What to watch:**

* Delegators with unbonding status – they are in the process of leaving. This reduces your stake at the next round.
* New delegations – incoming stake increasing your rank.
* Large single-Delegator dependence can destabilise your Active Set position. One Delegator holding most of your stake can move you sharply when they leave.

**Why Delegators leave:**

Delegators evaluate your Orchestrator on Reward Cut, fee share, reward call rate, and general reputation. Missed reward calls reduce their yield directly and are the most common reason for unbonding.

<CustomDivider />

## Service URI

Your registered service URI is what Gateways use to connect to your node. It must:

* Resolve to your current node's IP or hostname
* Have port 8935 publicly accessible
* Match what your node is actually serving on

If there is a mismatch between what is on-chain and where your node is actually running, you will see this error at startup:

```icon="terminal" theme={"theme":{"light":"github-light","dark":"dark-plus"}}
Service address https://127.0.0.1:4433 did not match discovered address https://121.5.10.8:8935;
set the correct address in livepeer_cli or use -serviceAddr
```

Fix by setting `-serviceAddr <public-ip>:8935` to match what is on-chain, or update the on-chain service URI via `livepeer_cli`.

<CustomDivider />

## Rounds active

A simple counter of how long your Orchestrator has been registered. This is a soft trust signal for Delegators – longer operation with consistent reward calling suggests stability.

<CustomDivider />

## Common patterns to act on

<StyledTable variant="bordered">
  <TableRow header>
    <TableCell header>What you see</TableCell>
    <TableCell header>What it means</TableCell>
    <TableCell header>What to do</TableCell>
  </TableRow>

  <TableRow>
    <TableCell>Active Set rank dropping week-over-week</TableCell>
    <TableCell>Relative stake declining vs competitors</TableCell>
    <TableCell>Attract Delegators or increase self-stake</TableCell>
  </TableRow>

  <TableRow>
    <TableCell>Missed reward rounds</TableCell>
    <TableCell>Reward calling failing</TableCell>
    <TableCell>Check ETH balance, `-reward` flag, consider Siphon</TableCell>
  </TableRow>

  <TableRow>
    <TableCell>Zero fee earnings despite active status</TableCell>
    <TableCell>Not receiving work</TableCell>
    <TableCell>Check pricing, reachability, capabilities</TableCell>
  </TableRow>

  <TableRow>
    <TableCell>Delegator count falling</TableCell>
    <TableCell>Delegators unbonding</TableCell>
    <TableCell>Check reward call rate, review Reward Cut competitiveness</TableCell>
  </TableRow>

  <TableRow>
    <TableCell>Service URI mismatch warning at startup</TableCell>
    <TableCell>On-chain URI doesn't match node IP</TableCell>
    <TableCell>Update `-serviceAddr` or update on-chain URI</TableCell>
  </TableRow>
</StyledTable>

<CustomDivider />

<CardGroup cols={2}>
  <Card title="Metrics and Monitoring" icon="gauge" href="/v2/orchestrators/guides/monitoring-and-tooling/metrics-and-alerting">
    Set up Prometheus and Grafana for live node health monitoring.
  </Card>

  <Card title="Getting Delegates" icon="users" href="/v2/orchestrators/guides/staking-and-rewards/delegate-operations">
    How to attract LPT Delegators and grow your stake.
  </Card>

  <Card title="Reward Calling Guide" icon="clock" href="/v2/orchestrators/guides/staking-and-rewards/reward-mechanics">
    Reward calling mechanics, gas costs, and automation.
  </Card>

  <Card title="Troubleshooting" icon="triangle-exclamation" href="/v2/orchestrators/guides/monitoring-and-tooling/troubleshooting">
    Common errors and how to resolve them.
  </Card>
</CardGroup>
