curl --request POST \
--url https://api.moonup.gg/v1/offers/top-up \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"game": "<string>",
"title": "<string>",
"price": 123,
"delivery_method": "<string>",
"delivery_instructions": "<string>",
"description": "<string>",
"images": [
"<string>"
],
"tags": [
"<string>"
],
"attributes": {},
"units": [
{}
],
"manual_delivery_value": 123
}
'import requests
url = "https://api.moonup.gg/v1/offers/top-up"
payload = {
"game": "<string>",
"title": "<string>",
"price": 123,
"delivery_method": "<string>",
"delivery_instructions": "<string>",
"description": "<string>",
"images": ["<string>"],
"tags": ["<string>"],
"attributes": {},
"units": [{}],
"manual_delivery_value": 123
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
game: '<string>',
title: '<string>',
price: 123,
delivery_method: '<string>',
delivery_instructions: '<string>',
description: '<string>',
images: ['<string>'],
tags: ['<string>'],
attributes: {},
units: [{}],
manual_delivery_value: 123
})
};
fetch('https://api.moonup.gg/v1/offers/top-up', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.moonup.gg/v1/offers/top-up",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'game' => '<string>',
'title' => '<string>',
'price' => 123,
'delivery_method' => '<string>',
'delivery_instructions' => '<string>',
'description' => '<string>',
'images' => [
'<string>'
],
'tags' => [
'<string>'
],
'attributes' => [
],
'units' => [
[
]
],
'manual_delivery_value' => 123
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.moonup.gg/v1/offers/top-up"
payload := strings.NewReader("{\n \"game\": \"<string>\",\n \"title\": \"<string>\",\n \"price\": 123,\n \"delivery_method\": \"<string>\",\n \"delivery_instructions\": \"<string>\",\n \"description\": \"<string>\",\n \"images\": [\n \"<string>\"\n ],\n \"tags\": [\n \"<string>\"\n ],\n \"attributes\": {},\n \"units\": [\n {}\n ],\n \"manual_delivery_value\": 123\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.moonup.gg/v1/offers/top-up")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"game\": \"<string>\",\n \"title\": \"<string>\",\n \"price\": 123,\n \"delivery_method\": \"<string>\",\n \"delivery_instructions\": \"<string>\",\n \"description\": \"<string>\",\n \"images\": [\n \"<string>\"\n ],\n \"tags\": [\n \"<string>\"\n ],\n \"attributes\": {},\n \"units\": [\n {}\n ],\n \"manual_delivery_value\": 123\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.moonup.gg/v1/offers/top-up")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"game\": \"<string>\",\n \"title\": \"<string>\",\n \"price\": 123,\n \"delivery_method\": \"<string>\",\n \"delivery_instructions\": \"<string>\",\n \"description\": \"<string>\",\n \"images\": [\n \"<string>\"\n ],\n \"tags\": [\n \"<string>\"\n ],\n \"attributes\": {},\n \"units\": [\n {}\n ],\n \"manual_delivery_value\": 123\n}"
response = http.request(request)
puts response.read_body{
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"title": "<string>",
"description": "<string>",
"attributes": {},
"tags": [
"<string>"
],
"status": "draft",
"created_at": "2023-11-07T05:31:56Z",
"updated_at": "2023-11-07T05:31:56Z",
"published_at": "2023-11-07T05:31:56Z",
"manual_delivery_value": 123,
"manual_delivery_unit": "minutes",
"price": 123,
"currency": "USD",
"images": [
"<string>"
],
"delivery_type": "instant",
"delivery_method": "<string>",
"delivery_instructions": "<string>"
}{
"error": "delivery_instructions_required"
}{
"error": "unauthorized"
}{
"error": "delivery_instructions_required"
}{
"error": "rate_limited"
}Create a top-up pack listing
Created as a draft — nobody but you can see it until you publish it.
curl --request POST \
--url https://api.moonup.gg/v1/offers/top-up \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"game": "<string>",
"title": "<string>",
"price": 123,
"delivery_method": "<string>",
"delivery_instructions": "<string>",
"description": "<string>",
"images": [
"<string>"
],
"tags": [
"<string>"
],
"attributes": {},
"units": [
{}
],
"manual_delivery_value": 123
}
'import requests
url = "https://api.moonup.gg/v1/offers/top-up"
payload = {
"game": "<string>",
"title": "<string>",
"price": 123,
"delivery_method": "<string>",
"delivery_instructions": "<string>",
"description": "<string>",
"images": ["<string>"],
"tags": ["<string>"],
"attributes": {},
"units": [{}],
"manual_delivery_value": 123
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
game: '<string>',
title: '<string>',
price: 123,
delivery_method: '<string>',
delivery_instructions: '<string>',
description: '<string>',
images: ['<string>'],
tags: ['<string>'],
attributes: {},
units: [{}],
manual_delivery_value: 123
})
};
fetch('https://api.moonup.gg/v1/offers/top-up', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.moonup.gg/v1/offers/top-up",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'game' => '<string>',
'title' => '<string>',
'price' => 123,
'delivery_method' => '<string>',
'delivery_instructions' => '<string>',
'description' => '<string>',
'images' => [
'<string>'
],
'tags' => [
'<string>'
],
'attributes' => [
],
'units' => [
[
]
],
'manual_delivery_value' => 123
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.moonup.gg/v1/offers/top-up"
payload := strings.NewReader("{\n \"game\": \"<string>\",\n \"title\": \"<string>\",\n \"price\": 123,\n \"delivery_method\": \"<string>\",\n \"delivery_instructions\": \"<string>\",\n \"description\": \"<string>\",\n \"images\": [\n \"<string>\"\n ],\n \"tags\": [\n \"<string>\"\n ],\n \"attributes\": {},\n \"units\": [\n {}\n ],\n \"manual_delivery_value\": 123\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.moonup.gg/v1/offers/top-up")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"game\": \"<string>\",\n \"title\": \"<string>\",\n \"price\": 123,\n \"delivery_method\": \"<string>\",\n \"delivery_instructions\": \"<string>\",\n \"description\": \"<string>\",\n \"images\": [\n \"<string>\"\n ],\n \"tags\": [\n \"<string>\"\n ],\n \"attributes\": {},\n \"units\": [\n {}\n ],\n \"manual_delivery_value\": 123\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.moonup.gg/v1/offers/top-up")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"game\": \"<string>\",\n \"title\": \"<string>\",\n \"price\": 123,\n \"delivery_method\": \"<string>\",\n \"delivery_instructions\": \"<string>\",\n \"description\": \"<string>\",\n \"images\": [\n \"<string>\"\n ],\n \"tags\": [\n \"<string>\"\n ],\n \"attributes\": {},\n \"units\": [\n {}\n ],\n \"manual_delivery_value\": 123\n}"
response = http.request(request)
puts response.read_body{
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"title": "<string>",
"description": "<string>",
"attributes": {},
"tags": [
"<string>"
],
"status": "draft",
"created_at": "2023-11-07T05:31:56Z",
"updated_at": "2023-11-07T05:31:56Z",
"published_at": "2023-11-07T05:31:56Z",
"manual_delivery_value": 123,
"manual_delivery_unit": "minutes",
"price": 123,
"currency": "USD",
"images": [
"<string>"
],
"delivery_type": "instant",
"delivery_method": "<string>",
"delivery_instructions": "<string>"
}{
"error": "delivery_instructions_required"
}{
"error": "unauthorized"
}{
"error": "delivery_instructions_required"
}{
"error": "rate_limited"
}Авторизации
Your API key, from the cabinet under Seller → API keys.
Тело
A top-up's pictures are optional — the marketplace renders the pack tile, not an offer gallery.
The game's slug.
8 - 128US cents — 4990 is $49.90. USD is the only currency the platform prices in.
instant hands a unit from the pool over the moment an order is
paid. manual is you handing over yourself, within the time below.
instant, manual A key from GET /v1/offers/delivery-methods. Instant delivery
is only possible with activation_code.
What the buyer is told to do at handover, in your words.
20484096image_urls returned by POST /v1/offers/images. At
least one: it is the cover the marketplace renders. A URL from
anywhere else is refused (invalid_image).
1 - 10 elementsUp to 500 characters in all, counted as the tags joined with ", ". No commas inside a tag. Stored trimmed, lower-cased and deduplicated.
The category's own fields — read them from its schema.
delivery_type: instant only — one opaque JSON payload per unit,
the goods themselves. Encrypted at rest; never read back.
delivery_type: manual only — the handover time you promise.
What manual_delivery_value counts.
minutes, hours, days Ответ
Created
How a listing sold by hand promises to hand over.
The category's own fields, keyed by the schema's key.
draft on create, then active once you publish it. paused and
archived are yours too, through pause and DELETE. reserved
and sold follow an order. removed is a takedown after
publishing, which no call in this API performs.
draft, active, paused, reserved, sold, removed, archived When publish put it on the marketplace. null while it is a
draft, and written once — pausing and unpausing leave it alone.
The handover time promised, read together with the unit — 2 and hours.
What the value counts. Both are null on a listing delivered instantly.
minutes, hours, days, null US cents.
Always USD.
"USD"
instant sells out of the unit pool; manual you hand over yourself.
instant, manual The key this listing hands over by.
What the buyer is told to do at handover.
