curl --request PATCH \
--url https://api.moonup.gg/v1/offers/accounts/{id} \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"title": "<string>",
"description": "<string>",
"price": 123,
"images": [
"<string>"
],
"tags": [
"<string>"
],
"attributes": {},
"units": [
{}
],
"manual_delivery_value": 123
}
'import requests
url = "https://api.moonup.gg/v1/offers/accounts/{id}"
payload = {
"title": "<string>",
"description": "<string>",
"price": 123,
"images": ["<string>"],
"tags": ["<string>"],
"attributes": {},
"units": [{}],
"manual_delivery_value": 123
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.patch(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PATCH',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
title: '<string>',
description: '<string>',
price: 123,
images: ['<string>'],
tags: ['<string>'],
attributes: {},
units: [{}],
manual_delivery_value: 123
})
};
fetch('https://api.moonup.gg/v1/offers/accounts/{id}', 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/accounts/{id}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "PATCH",
CURLOPT_POSTFIELDS => json_encode([
'title' => '<string>',
'description' => '<string>',
'price' => 123,
'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/accounts/{id}"
payload := strings.NewReader("{\n \"title\": \"<string>\",\n \"description\": \"<string>\",\n \"price\": 123,\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("PATCH", 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.patch("https://api.moonup.gg/v1/offers/accounts/{id}")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"title\": \"<string>\",\n \"description\": \"<string>\",\n \"price\": 123,\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/accounts/{id}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Patch.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"title\": \"<string>\",\n \"description\": \"<string>\",\n \"price\": 123,\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",
"moderation_reason_code": "prohibited_item",
"moderation_note": "<string>",
"manual_delivery_value": 123,
"manual_delivery_unit": "minutes",
"price": 123,
"currency": "USD",
"images": [
"<string>"
],
"delivery_type": "instant"
}{
"error": "delivery_instructions_required"
}{
"error": "unauthorized"
}{
"error": "delivery_instructions_required"
}{
"error": "not_found"
}{
"error": "delivery_instructions_required"
}{
"error": "rate_limited"
}Edit one of your accounts listings
Every field is optional and means “leave this alone” when absent.
Sending images or tags replaces the whole list rather than adding
to it.
Editing leaves the listing where it stands: an active one stays
live, a draft stays a draft.
curl --request PATCH \
--url https://api.moonup.gg/v1/offers/accounts/{id} \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"title": "<string>",
"description": "<string>",
"price": 123,
"images": [
"<string>"
],
"tags": [
"<string>"
],
"attributes": {},
"units": [
{}
],
"manual_delivery_value": 123
}
'import requests
url = "https://api.moonup.gg/v1/offers/accounts/{id}"
payload = {
"title": "<string>",
"description": "<string>",
"price": 123,
"images": ["<string>"],
"tags": ["<string>"],
"attributes": {},
"units": [{}],
"manual_delivery_value": 123
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.patch(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PATCH',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
title: '<string>',
description: '<string>',
price: 123,
images: ['<string>'],
tags: ['<string>'],
attributes: {},
units: [{}],
manual_delivery_value: 123
})
};
fetch('https://api.moonup.gg/v1/offers/accounts/{id}', 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/accounts/{id}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "PATCH",
CURLOPT_POSTFIELDS => json_encode([
'title' => '<string>',
'description' => '<string>',
'price' => 123,
'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/accounts/{id}"
payload := strings.NewReader("{\n \"title\": \"<string>\",\n \"description\": \"<string>\",\n \"price\": 123,\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("PATCH", 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.patch("https://api.moonup.gg/v1/offers/accounts/{id}")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"title\": \"<string>\",\n \"description\": \"<string>\",\n \"price\": 123,\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/accounts/{id}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Patch.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"title\": \"<string>\",\n \"description\": \"<string>\",\n \"price\": 123,\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",
"moderation_reason_code": "prohibited_item",
"moderation_note": "<string>",
"manual_delivery_value": 123,
"manual_delivery_unit": "minutes",
"price": 123,
"currency": "USD",
"images": [
"<string>"
],
"delivery_type": "instant"
}{
"error": "delivery_instructions_required"
}{
"error": "unauthorized"
}{
"error": "delivery_instructions_required"
}{
"error": "not_found"
}{
"error": "delivery_instructions_required"
}{
"error": "rate_limited"
}Autorizaciones
Your API key, from the cabinet under Seller → API keys.
Parámetros de ruta
Cuerpo
Every field optional; absent means "leave unchanged".
8 - 1284096US cents.
Replaces the whole gallery.
10Replaces the whole list. Same limits as on create.
Replaces the whole map — send every field the category asks for, not only the one that changed.
Changing it replaces the listing's unit pool.
instant, manual Read only when delivery_type switches to instant, as the pool
the listing starts over with. Ignored otherwise: stock is added
through POST .../units.
The handover time you promise.
What the value counts.
minutes, hours, days Respuesta
OK
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; unpublish
takes it back to draft. archived is yours too, through DELETE. sold
follows an order: the last unit went to a closed one.
changes_requested is moderation sending a live listing back:
it is off the marketplace, moderation_reason_code says why, and
your next PATCH makes it a draft to publish again.
draft, active, changes_requested, sold, archived When publish put it on the marketplace. null while it is a
draft, and written once — pausing and unpausing leave it alone.
Why moderation asked for changes. Kept through the PATCH that
makes the listing a draft, null once it is published again.
prohibited_item, misleading_description, stolen_images, invalid_price, insufficient_details, other, null What moderation wrote to you along with the reason, if anything.
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 