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

# Seller workflow

> Poll for opportunities, decline what you cannot serve, and follow an introduction after accepting.

A typical seller integration keeps GPU Outlet in sync with an inventory or fleet-management tool. It needs `opportunities:read`, and `opportunities:write` for declines. Add `introductions:read` and `introductions:write` to follow through after a reveal.

<Steps>
  <Step title="Poll for new opportunities">
    `GET /opportunities` with `opportunities:read` lists demand offered to your company. It carries no buyer name, company or ID until you accept:

    ```bash theme={null}
    curl "https://api.gpuoutlet.ai/v1/opportunities?status=offered&limit=50" \
      -H "Authorization: Bearer gpk_..."
    ```

    ```json Response theme={null}
    {
      "data": [
        {
          "id": "7c1a2b3d-4e5f-6789-a0b1-c2d3e4f56789",
          "status": "offered",
          "listingId": "1a2b3c4d-5e6f-7890-ab12-cd34ef567890",
          "demand": {
            "gpuModel": "H100",
            "gpusPerNode": 8,
            "nodes": 4,
            "region": "us-east",
            "startsAt": "2026-10-01T00:00:00.000Z",
            "endsAt": null,
            "durationMonths": 6,
            "budgetMonthlyCents": 1200000,
            "currency": "USD"
          },
          "offeredAt": "2026-09-17T15:00:00.000Z",
          "decidedAt": null
        }
      ],
      "meta": { "nextCursor": null }
    }
    ```

    `GET /opportunities/{id}` reads a single one. An `offered` opportunity is waiting for your answer. Without a `status` filter, the list also includes `expired` and `withdrawn` opportunities, which the dashboard does not show on any tab. See [Statuses](/reference/statuses#opportunities).
  </Step>

  <Step title="Decline what you cannot serve">
    `POST /opportunities/{id}/decline` with `opportunities:write`, if the demand does not fit your available capacity:

    ```bash theme={null}
    curl -X POST https://api.gpuoutlet.ai/v1/opportunities/7c1a2b3d-4e5f-6789-a0b1-c2d3e4f56789/decline \
      -H "Authorization: Bearer gpk_..." \
      -H "Idempotency-Key: 4d5e6f7a-8b9c-4d0e-1f2a-3b4c5d6e7f8a"
    ```

    A key of a trader, an authorized signatory or an owner can decline. A viewer's key cannot. If the opportunity was already accepted, declined, expired or withdrawn, the call fails with [`opportunity_not_pending`](/api/errors#opportunity_not_pending). `current` in the error carries its actual status.
  </Step>

  <Step title="Accept and reveal in the dashboard">
    Accepting an opportunity reveals the buyer's company and starts the success fee. The reveal is what commits your company to that fee, so it stays a decision a person makes in the dashboard. Sign in and act on the opportunity there. See [Opportunities](/selling/opportunities).
  </Step>

  <Step title="Read the introduction after accepting">
    Once you accept in the dashboard, poll with `introductions:read` and `side=seller`:

    ```bash theme={null}
    curl "https://api.gpuoutlet.ai/v1/introductions?side=seller&limit=50" \
      -H "Authorization: Bearer gpk_..."
    ```

    The introduction now carries the buyer's `legalName`, `country` and `buyerContacts`. `buyerContacts` lists the emails and roles of the buyer's owners and authorized signatories, so you can reach out directly.
  </Step>

  <Step title="Confirm you are ready">
    `POST /introductions/{id}/ready` with `introductions:write`:

    ```bash theme={null}
    curl -X POST https://api.gpuoutlet.ai/v1/introductions/9d8c7b6a-5f4e-3d2c-1b0a-9f8e7d6c5b4a/ready \
      -H "Authorization: Bearer gpk_..." \
      -H "Idempotency-Key: 6e7f8a9b-0c1d-4e2f-3a4b-5c6d7e8f9a0b"
    ```
  </Step>

  <Step title="What continues in the dashboard">
    Invoicing the buyer, confirming the money received and the success fee invoice GPU Outlet issues on it all happen in the dashboard. Sign in to send and track them. See [Seller introductions](/selling/introductions) and [Success fee](/selling/success-fee).
  </Step>
</Steps>

## Radar node submissions

The submission endpoints let you propose a whole node for Radar with `radar:read` and `radar:write`: `GET /radar/submissions`, `POST /radar/submissions`, and the update, withdraw and republish endpoints. They exist only in the partner API. The dashboard has no screen for submitting a node.

A submission is not a listing on **My Listings**. It belongs to the user whose key created it, and it does not appear on **My Listings**. A listing you publish on **My Listings** goes on the market at once. A submission is reviewed by the GPU Outlet team before it appears on Radar.

On your own submissions, `status` is `pending`, `approved` or `rejected`, and `listed` tells you whether buyers can see it right now. Updating a submission sends it back for review.

## Related

<CardGroup cols={2}>
  <Card title="Buyer workflow" icon="cart-shopping" href="/api/workflows/buyers">
    What happens on the other side of the same introduction.
  </Card>

  <Card title="Idempotency" icon="rotate" href="/api/idempotency">
    Safe retries for the writes in this workflow.
  </Card>

  <Card title="Errors" icon="triangle-exclamation" href="/api/errors">
    `opportunity_not_pending`, `introduction_not_active`.
  </Card>

  <Card title="Authentication" icon="key" href="/api/authentication">
    Scopes and company context this workflow relies on.
  </Card>
</CardGroup>


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.