Skip to main content
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>"
}
'
Requires authentication. Founder only.
id
string
required
Project ID.

Request

title
string
required
Bounty title (max 200 characters).
description
string
required
What needs to be built (max 2000 characters).
reward_amount
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.
difficulty
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.