Developers · Your account
Projects API
Create, edit and delete your own project records, drafts and milestone proof with a Read + manage projects token.
| Endpoint | Does |
|---|---|
GET /me | Your wallet, token scope and sign-in method. |
GET /drafts/me · POST /drafts · DELETE /drafts/me | Read, save ({"formState":{…}}) or delete your form draft. |
POST /projects | Create a project owned by your wallet. It is not on-chain until you launch it in the app. |
PATCH /projects/{id} | Edit your project. Before its launch starts: any field POST /projects takes. After: description, tagline, links, logo, tags, about, team and status notes only. |
DELETE /projects/{id} | Delete your project, only before its launch starts. |
POST /uploads/image | Upload an image (field file): JPEG, PNG, GIF, WebP or AVIF, up to 8 MiB. |
POST /projects/{projectId}/milestones/{index}/proof-uploads | Attach proof files (field files): up to 5, 10 MiB each. index starts at 0. |
POST /projects/{projectId}/milestones/{index}/submit-proof | Save proof text and attachments. The vote starts when you submit the proof on-chain in the app. |
Create a project#
Milestone amounts must follow the fixed pattern: the first is 10% of the vault (85% of the target), the rest split equally. Dates must be in the future.
# Example only: review every term before creating a real project.
node - <<'JS' > project.json
const inDays = (d) => new Date(Date.now() + d * 86400000).toISOString();
console.log(JSON.stringify({
name: "My project", ticker: "DEMO", chain: "bsc", paymentToken: "USDC",
description: "Describe the product and what you will deliver.",
raiseTarget: 1000000000, // $1,000 in micro-USD
raiseDeadline: inDays(30),
milestones: [
{ name: "Prototype", description: "A working prototype", fundingAmount: 85000000, deadline: inDays(60) },
{ name: "Beta", description: "A testable beta", fundingAmount: 382500000, deadline: inDays(90) },
{ name: "Release", description: "The public release", fundingAmount: 382500000, deadline: inDays(120) }
]
}, null, 2));
JS
curl --fail-with-body -X POST "https://zash.xyz/api/v1/projects" \
-H "Authorization: Bearer $ZASH_API_TOKEN" \
-H "Content-Type: application/json" \
--data-binary @project.jsonEdit a project#
Send only the fields you change. Until you start the launch in the app, every field you can create with can change, and milestones replaces the whole list: when you change raiseTarget, send milestones again with amounts that follow the pattern above. Once a launch has started its terms are fixed: a changed name, ticker, chain, raise token, target, deadline, contribution limit, vesting, team wallet or milestone is refused with a 409, and only the description, tagline, links, logo, tags, about, team, launch phase, current status and initial fundraise can change. A field the API does not know, also inside teamMembers or milestones, is refused with a 400 that names it.
curl --fail-with-body -X PATCH "https://zash.xyz/api/v1/projects/$PROJECT_ID" \
-H "Authorization: Bearer $ZASH_API_TOKEN" \
-H "Content-Type: application/json" \
--data '{"tagline":"A clearer description of our product"}'Delete a project#
You can delete a project until you start its launch in the app. After that the request is refused with a 409.
curl --fail-with-body -X DELETE "https://zash.xyz/api/v1/projects/$PROJECT_ID" \
-H "Authorization: Bearer $ZASH_API_TOKEN"Note: Launching, contributing and voting always happen in the app, signed in the user's own wallet. The API never signs transactions.