curl --request POST \
--url https://api.simpuru.xyz/listings \
--header 'Content-Type: application/json' \
--data '
{
"title": "<string>",
"description": "<string>",
"priceLovelace": "<string>",
"sellerAddress": "<string>",
"modes": [],
"content": "<string>",
"previewMedia": "<string>"
}
'import requests
url = "https://api.simpuru.xyz/listings"
payload = {
"title": "<string>",
"description": "<string>",
"priceLovelace": "<string>",
"sellerAddress": "<string>",
"modes": [],
"content": "<string>",
"previewMedia": "<string>"
}
headers = {"Content-Type": "application/json"}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'Content-Type': 'application/json'},
body: JSON.stringify({
title: '<string>',
description: '<string>',
priceLovelace: '<string>',
sellerAddress: '<string>',
modes: [],
content: '<string>',
previewMedia: '<string>'
})
};
fetch('https://api.simpuru.xyz/listings', 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.simpuru.xyz/listings",
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([
'title' => '<string>',
'description' => '<string>',
'priceLovelace' => '<string>',
'sellerAddress' => '<string>',
'modes' => [
],
'content' => '<string>',
'previewMedia' => '<string>'
]),
CURLOPT_HTTPHEADER => [
"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.simpuru.xyz/listings"
payload := strings.NewReader("{\n \"title\": \"<string>\",\n \"description\": \"<string>\",\n \"priceLovelace\": \"<string>\",\n \"sellerAddress\": \"<string>\",\n \"modes\": [],\n \"content\": \"<string>\",\n \"previewMedia\": \"<string>\"\n}")
req, _ := http.NewRequest("POST", url, payload)
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.simpuru.xyz/listings")
.header("Content-Type", "application/json")
.body("{\n \"title\": \"<string>\",\n \"description\": \"<string>\",\n \"priceLovelace\": \"<string>\",\n \"sellerAddress\": \"<string>\",\n \"modes\": [],\n \"content\": \"<string>\",\n \"previewMedia\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.simpuru.xyz/listings")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Content-Type"] = 'application/json'
request.body = "{\n \"title\": \"<string>\",\n \"description\": \"<string>\",\n \"priceLovelace\": \"<string>\",\n \"sellerAddress\": \"<string>\",\n \"modes\": [],\n \"content\": \"<string>\",\n \"previewMedia\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body{
"id": "<string>",
"title": "<string>",
"description": "<string>",
"priceLovelace": "<string>",
"sellerAddress": "<string>",
"modes": [
"instant"
],
"contentHash": "<string>",
"previewMedia": "<string>",
"category": "Landing Page",
"createdAt": "<string>",
"sales": 123,
"sellerReputation": {
"score": 50,
"basis": 123
}
}{
"error": "<string>"
}{
"error": "<string>"
}Create a listing
Anyone can sell. Signed in (Authorization: Bearer), the listing is sold by the account and sellerAddress is ignored. Without a session (scripts), the creator signs the listing with the wallet of sellerAddress. The API stores the content and returns its SHA-256 as contentHash; protected quotes commit to it. Instant sales pay the creator directly; protected sales lock into the escrow with the platform as seller of record, which pays the creator price − max(1.5 tADA, 10%) once the escrow releases.
curl --request POST \
--url https://api.simpuru.xyz/listings \
--header 'Content-Type: application/json' \
--data '
{
"title": "<string>",
"description": "<string>",
"priceLovelace": "<string>",
"sellerAddress": "<string>",
"modes": [],
"content": "<string>",
"previewMedia": "<string>"
}
'import requests
url = "https://api.simpuru.xyz/listings"
payload = {
"title": "<string>",
"description": "<string>",
"priceLovelace": "<string>",
"sellerAddress": "<string>",
"modes": [],
"content": "<string>",
"previewMedia": "<string>"
}
headers = {"Content-Type": "application/json"}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'Content-Type': 'application/json'},
body: JSON.stringify({
title: '<string>',
description: '<string>',
priceLovelace: '<string>',
sellerAddress: '<string>',
modes: [],
content: '<string>',
previewMedia: '<string>'
})
};
fetch('https://api.simpuru.xyz/listings', 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.simpuru.xyz/listings",
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([
'title' => '<string>',
'description' => '<string>',
'priceLovelace' => '<string>',
'sellerAddress' => '<string>',
'modes' => [
],
'content' => '<string>',
'previewMedia' => '<string>'
]),
CURLOPT_HTTPHEADER => [
"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.simpuru.xyz/listings"
payload := strings.NewReader("{\n \"title\": \"<string>\",\n \"description\": \"<string>\",\n \"priceLovelace\": \"<string>\",\n \"sellerAddress\": \"<string>\",\n \"modes\": [],\n \"content\": \"<string>\",\n \"previewMedia\": \"<string>\"\n}")
req, _ := http.NewRequest("POST", url, payload)
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.simpuru.xyz/listings")
.header("Content-Type", "application/json")
.body("{\n \"title\": \"<string>\",\n \"description\": \"<string>\",\n \"priceLovelace\": \"<string>\",\n \"sellerAddress\": \"<string>\",\n \"modes\": [],\n \"content\": \"<string>\",\n \"previewMedia\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.simpuru.xyz/listings")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Content-Type"] = 'application/json'
request.body = "{\n \"title\": \"<string>\",\n \"description\": \"<string>\",\n \"priceLovelace\": \"<string>\",\n \"sellerAddress\": \"<string>\",\n \"modes\": [],\n \"content\": \"<string>\",\n \"previewMedia\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body{
"id": "<string>",
"title": "<string>",
"description": "<string>",
"priceLovelace": "<string>",
"sellerAddress": "<string>",
"modes": [
"instant"
],
"contentHash": "<string>",
"previewMedia": "<string>",
"category": "Landing Page",
"createdAt": "<string>",
"sales": 123,
"sellerReputation": {
"score": 50,
"basis": 123
}
}{
"error": "<string>"
}{
"error": "<string>"
}Headers
Base64 JSON UnlockProof signed by sellerAddress (CIP-30 signData) over sha256("simpuru:listing:v1\n" + sellerAddress + "\n" + sha256(content) + "\n" + priceLovelace + "\n" + timestamp), at most 5 min old.
Body
1 - 1201 - 2000≥ 1,000,000 instant; ≥ 5,000,000 when protected is offered.
^[0-9]+$^addr_test11instant, protected What is sold (max 1 MiB). Hashed; never returned by the catalogue.
https URL ending in .mp4, .webm, .webp or .gif.
Landing Page, Hero, Portfolio, SaaS, Fintech, 3D, AI, Editorial, Wellness Response
Created
Amount in lovelace (1 tADA = 1,000,000).
^[0-9]+$Preprod address that sells (and, instant, gets paid).
instant, protected SHA-256 of the content the buyer receives.
^[0-9a-f]{64}$Free https recording of what the prompt builds.
Landing Page, Hero, Portfolio, SaaS, Fintech, 3D, AI, Editorial, Wellness Unix ms.
Purchases that were not refunded.
From the seller's closed escrows: 100 × withdrawn / (withdrawn + refunded). Absent until one.
Show child attributes
Show child attributes