Create Bounty
curl --request POST \
--url https://api.example.com/api/projects/{id}/bounties \
--header 'Content-Type: application/json' \
--data '
{
"title": "<string>",
"description": "<string>",
"reward_amount": 123,
"difficulty": "<string>"
}
'import requests
url = "https://api.example.com/api/projects/{id}/bounties"
payload = {
"title": "<string>",
"description": "<string>",
"reward_amount": 123,
"difficulty": "<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>',
reward_amount: 123,
difficulty: '<string>'
})
};
fetch('https://api.example.com/api/projects/{id}/bounties', 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.example.com/api/projects/{id}/bounties",
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>',
'reward_amount' => 123,
'difficulty' => '<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.example.com/api/projects/{id}/bounties"
payload := strings.NewReader("{\n \"title\": \"<string>\",\n \"description\": \"<string>\",\n \"reward_amount\": 123,\n \"difficulty\": \"<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.example.com/api/projects/{id}/bounties")
.header("Content-Type", "application/json")
.body("{\n \"title\": \"<string>\",\n \"description\": \"<string>\",\n \"reward_amount\": 123,\n \"difficulty\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.example.com/api/projects/{id}/bounties")
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 \"reward_amount\": 123,\n \"difficulty\": \"<string>\"\n}"
response = http.request(request)
puts response.read_bodyProjects
Create Bounty
Create a bounty on a project. Requires sufficient on-chain token balance and allowance.
POST
/
api
/
projects
/
{id}
/
bounties
Create Bounty
curl --request POST \
--url https://api.example.com/api/projects/{id}/bounties \
--header 'Content-Type: application/json' \
--data '
{
"title": "<string>",
"description": "<string>",
"reward_amount": 123,
"difficulty": "<string>"
}
'import requests
url = "https://api.example.com/api/projects/{id}/bounties"
payload = {
"title": "<string>",
"description": "<string>",
"reward_amount": 123,
"difficulty": "<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>',
reward_amount: 123,
difficulty: '<string>'
})
};
fetch('https://api.example.com/api/projects/{id}/bounties', 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.example.com/api/projects/{id}/bounties",
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>',
'reward_amount' => 123,
'difficulty' => '<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.example.com/api/projects/{id}/bounties"
payload := strings.NewReader("{\n \"title\": \"<string>\",\n \"description\": \"<string>\",\n \"reward_amount\": 123,\n \"difficulty\": \"<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.example.com/api/projects/{id}/bounties")
.header("Content-Type", "application/json")
.body("{\n \"title\": \"<string>\",\n \"description\": \"<string>\",\n \"reward_amount\": 123,\n \"difficulty\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.example.com/api/projects/{id}/bounties")
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 \"reward_amount\": 123,\n \"difficulty\": \"<string>\"\n}"
response = http.request(request)
puts response.read_bodyRequires authentication. Founder only.
string
required
Project ID.
Request
string
required
Bounty title (max 200 characters).
string
required
What needs to be built (max 2000 characters).
number
required
Token reward as a positive integer. The founder must have sufficient token balance and ERC-20 allowance to cover this reward plus all existing active bounties.
string
Difficulty level:
easy, medium, hard, or extreme. Defaults to medium.Example
curl -X POST https://api.shipyardprotocol.com/api/projects/proj_m1n2o3/bounties \
-H "Content-Type: application/json" \
-H "Authorization: Bearer YOUR_API_KEY" \
-d '{
"title": "Add CSV export endpoint",
"description": "Add a GET /export endpoint that returns pipeline data as CSV",
"reward_amount": 500,
"difficulty": "easy"
}'
Response
201
{
"bounty": {
"id": "bnt_x1y2z3",
"project_id": "proj_m1n2o3",
"title": "Add CSV export endpoint",
"description": "Add a GET /export endpoint that returns pipeline data as CSV",
"reward_amount": 500,
"difficulty": "easy",
"status": "open",
"created_at": "2026-03-29T15:00:00.000Z"
}
}
The platform checks the founder’s on-chain token balance and ERC-20 allowance before creating the bounty. If
min(balance, allowance) < committedRewards + newReward, the request returns 400. This is a soft check — the hard enforcement happens at payout time when transferFrom is called.⌘I

