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

# MoonUP Seller API

> List and manage your offers from your own tools.

Everything a seller's integration needs to keep a catalogue of offers up to
date: create an offer, restock it, pause it, archive it.

Each category has its own paths — `/v1/offers/accounts`, `/v1/offers/currency`
and so on — carrying its own fields. You integrate with the categories you
sell in, and a category added to the platform later leaves yours untouched.

This is the public surface. The seller dashboard's own screens — payouts,
disputes, account settings — are not part of it, and an API key does not reach
them.

An *offer* is one listing on the marketplace. The API calls them `offers`, and
so does everything below.

## Base URL

```
https://api.moonup.gg
```

HTTPS only, and every path is versioned: `/v1/...`.

## Your first request

<Steps>
  <Step title="Create a key">
    In the seller dashboard, go to **Seller → API keys** and create one. It is
    shown once — copy it then, there is no way to read it back.
  </Step>

  <Step title="Send it">
    The key goes in the `Authorization` header of every request. There is
    nothing to exchange it for.

    ```bash theme={null}
    curl -H "Authorization: Bearer $MOONUP_API_KEY" \
      https://api.moonup.gg/v1/offers/accounts/my
    ```
  </Step>

  <Step title="Read the category's own fields">
    What a category's create call takes is in its own reference page — an
    accounts offer has a price and pictures, a currency offer has a product
    and a stock. What varies by game is `attributes`, and the schema endpoint
    answers with those: the fields, their types, and which are required.

    ```bash theme={null}
    curl https://api.moonup.gg/v1/offers/games/roblox/categories/accounts/schema
    ```

    This path resolves a game's `slug`. The other catalog paths address a
    game by the `id` that `GET /v1/offers/games` returns — a slug there
    answers `400`.

    Catalog reads are public — you can explore them before you have a key.
  </Step>
</Steps>

## Statuses

A new offer is a `draft`: yours, and nobody else's to see. `publish` makes it
`active`, and buyers can buy it from that moment — nothing reviews it first.
Publishing an offer with nothing left to sell is refused with `409`: add stock
first. Editing changes nothing about where an offer stands — an `active` one
stays live, a `draft` stays a draft.

`paused` is yours too, through pause and unpause. `archived` is the end of the
line: `DELETE` retires an offer for good and keeps it readable to you.
`reserved` and `sold` follow orders, not calls. `removed` is a takedown after
the fact, which no call in this API performs.

## Prices

Every price in this API is an integer in US cents. `price: 4990` is \$49.90.
There are no fractional amounts, and `USD` is the only currency.

## Where to go next

<CardGroup cols={2}>
  <Card title="Authentication" icon="key" href="/en/authentication">
    Keys, address allowlists, rate limits, and what the errors mean.
  </Card>

  <Card title="API Reference" icon="square-terminal" href="/en/api-reference/catalog/list-games">
    Every endpoint, with a playground you can send live requests from.
  </Card>
</CardGroup>
