CrowdFundWith API Reference
CrowdFundWith is an API-first subscription crowdfunding platform. Every action available in the dashboard is also available via the REST API — create projects, manage backers, post updates, and handle payments entirely programmatically.
Content-Type: application/json. All responses are JSON.
Dates are returned as ISO 8601 strings. Amounts are integers in cents (CAD).
Rate Limits
- General API endpoints: 100 requests / 15 minutes per API key
- Auth endpoints (register, connect): 10 requests / 15 minutes per IP
- Rate limit headers are returned on every response:
X-RateLimit-Limit,X-RateLimit-Remaining
Errors
All errors follow the same shape. Use the error field for human-readable messages
and HTTP status codes for programmatic handling.
{
"error": "Project not found",
"status": 404
}
| Status | Meaning |
|---|---|
| 200 | OK — request succeeded |
| 201 | Created — resource was created |
| 400 | Bad Request — missing or invalid parameters |
| 401 | Unauthorized — missing or invalid API key |
| 403 | Forbidden — you do not own this resource |
| 404 | Not Found — resource does not exist |
Authenticating Requests
After registering you receive a single API key prefixed cfw_.
Pass it in the x-api-key request header on every call that requires authentication.
.env file. If lost, you will need to contact support to rotate it.
Never commit your key to version control.
Register and get your API key
Creates a new creator account and returns a one-time API key. No password required — the API key is your credential.
Request body
| Field | Type | Required | Description |
|---|---|---|---|
| string | required | Your email address. Used for Stripe payouts and notifications. | |
| name | string | required | Your creator display name shown on project pages. |
curl https://api.crowdfundwith.com/api/auth/register \
-H "Content-Type: application/json" \
-d '{"email":"you@example.com","name":"Your Name"}'
const res = await fetch('https://api.crowdfundwith.com/api/auth/register', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
email: 'you@example.com',
name: 'Your Name'
})
});
const { creator_id, api_key } = await res.json();
// Store api_key immediately — it won't be shown again
import requests
resp = requests.post(
"https://api.crowdfundwith.com/api/auth/register",
json={"email": "you@example.com", "name": "Your Name"}
)
data = resp.json()
print(data["api_key"]) # store this!
201 Created
{
"creator_id": "crt_a1b2c3d4",
"api_key": "cfw_live_xxxxxxxxxxxxxxxxxxxx",
"message": "Account created. Save your API key — it won't be shown again."
}
Start Stripe Connect onboarding
Returns a Stripe-hosted onboarding URL. Redirect your user there to connect their bank account. Payouts are only possible after onboarding is complete.
x-api-key header.
200 OK
{
"onboarding_url": "https://connect.stripe.com/setup/e/acct_xxx/..."
}
Check Stripe Connect onboarding status
Returns whether the creator's Stripe account is fully onboarded and capable of receiving payouts.
200 OK
{
"connected": true,
"payouts_enabled": true,
"details_submitted": true
}
Projects
A project is the core resource — it represents your campaign. Backers commit monthly to support a project. All project endpoints require authentication.
Create a project
| Field | Type | Required | Description |
|---|---|---|---|
| title | string | required | Project name (max 120 characters). |
| description | string | required | Full project description. Markdown is supported. |
| category | string | required | One of: technology, arts, music, film, games, food, health, education, community, environment, publishing, fashion. |
| goal_amount | integer | optional | Monthly revenue goal in CAD cents (e.g. 50000 = $500). If omitted, no public goal is displayed. |
curl https://api.crowdfundwith.com/api/projects \
-H "x-api-key: cfw_your_key" \
-H "Content-Type: application/json" \
-d '{"title":"My Indie Game","description":"A pixel RPG...","category":"games","goal_amount":100000}'
const project = await fetch('https://api.crowdfundwith.com/api/projects', {
method: 'POST',
headers: { 'x-api-key': API_KEY, 'Content-Type': 'application/json' },
body: JSON.stringify({
title: 'My Indie Game',
description: 'A pixel RPG built with love.',
category: 'games',
goal_amount: 100000 // $1,000 CAD/month
})
}).then(r => r.json());
201 Created
{
"project_id": "prj_x7k2m9",
"title": "My Indie Game",
"category": "games",
"goal_amount": 100000,
"status": "draft",
"created_at": "2025-03-20T14:00:00.000Z"
}
List your projects
Returns all projects belonging to the authenticated creator, newest first.
curl https://api.crowdfundwith.com/api/projects \
-H "x-api-key: cfw_your_key"
Get a single project
Returns full project details including milestone list and backer count.
curl https://api.crowdfundwith.com/api/projects/prj_x7k2m9 \
-H "x-api-key: cfw_your_key"
Update a project
Partial update — send only the fields you want to change. All fields are optional.
| Field | Type | Required | Description |
|---|---|---|---|
| title | string | optional | New project title. |
| description | string | optional | Updated description. |
| category | string | optional | Updated category. |
| goal_amount | integer | optional | Updated monthly goal in CAD cents. |
| status | string | optional | draft or published. Setting to published makes the project publicly discoverable. |
Delete a project
200 OK
{ "deleted": true }
Add a milestone
Milestones are public goals shown on your project page — e.g. "At $500/mo I will release a monthly podcast."
| Field | Type | Required | Description |
|---|---|---|---|
| title | string | required | Short milestone name. |
| description | string | optional | What you will deliver when this milestone is reached. |
| target_amount | integer | required | Monthly revenue target in CAD cents that unlocks this milestone. |
Updates
Updates are creator posts visible to backers. Think of them as a private blog attached to your project. All update endpoints require authentication.
Create an update
| Field | Type | Required | Description |
|---|---|---|---|
| project_id | string | required | The project this update belongs to. |
| title | string | required | Update headline. |
| content | string | required | Full update body. Markdown supported. |
curl https://api.crowdfundwith.com/api/updates \
-H "x-api-key: cfw_your_key" \
-H "Content-Type: application/json" \
-d '{"project_id":"prj_x7k2m9","title":"Week 1 Update","content":"We shipped the alpha!"}'
List updates for a project
Returns all updates for the given project, newest first.
Edit an update
Update title and/or content. Partial update — send only changed fields.
Delete an update
200 OK
{ "deleted": true }
Tiers
Tiers are the monthly commitment levels backers can choose. You set the amount and what backers receive at each level. A project can have multiple tiers.
Create a tier
| Field | Type | Required | Description |
|---|---|---|---|
| project_id | string | required | Project this tier belongs to. |
| name | string | required | Tier display name, e.g. "Supporter". |
| amount | integer | required | Monthly amount in CAD cents. Must match a platform tier ($7, $14, $21, or custom $50+). |
| description | string | required | What backers receive at this tier. |
curl https://api.crowdfundwith.com/api/tiers \
-H "x-api-key: cfw_your_key" \
-H "Content-Type: application/json" \
-d '{"project_id":"prj_x7k2m9","name":"Supporter","amount":700,"description":"Early access to updates"}'
List tiers for a project
Returns all tiers for the given project, sorted by amount ascending.
Update a tier
Update name, description, or amount. Changing the amount will not affect existing active subscriptions.
Delete a tier
Archived tiers are no longer available for new backers. Existing backers on this tier are not affected.
Messages
Send messages to your backers — either broadcast to everyone on a project, or directly to a single backer. Messages are delivered in-app and optionally by email.
Broadcast to all backers
Sends a message to every active backer on the project. Use for announcements, delays, or milestone celebrations.
| Field | Type | Required | Description |
|---|---|---|---|
| project_id | string | required | Project whose backers will receive the message. |
| content | string | required | Message body. Markdown supported. Max 4,000 characters. |
curl https://api.crowdfundwith.com/api/messages/broadcast \
-H "x-api-key: cfw_your_key" \
-H "Content-Type: application/json" \
-d '{"project_id":"prj_x7k2m9","content":"We just hit our first milestone!"}'
200 OK
{
"sent": true,
"recipients": 47
}
Send a direct message
Send a private message to a single backer. The backer must be an active supporter of the specified project.
| Field | Type | Required | Description |
|---|---|---|---|
| project_id | string | required | Project context for this message. |
| recipient_id | string | required | The backer's user ID. |
| content | string | required | Message body. Max 4,000 characters. |
List messages for a project
Returns sent messages (broadcast and direct) for the given project. Newest first.
Stats
Stats endpoints give you a real-time view into your campaign performance — backer counts, monthly revenue, and churn.
Dashboard overview
Aggregated stats across all your projects.
200 OK
{
"total_projects": 3,
"total_backers": 142,
"monthly_revenue_cad": 318500, // in cents = $3,185
"active_subscriptions": 138,
"churn_last_30d": 4
}
Single project stats
Detailed stats for one project including per-tier breakdown.
200 OK
{
"project_id": "prj_x7k2m9",
"backers": 47,
"monthly_revenue_cad": 98700,
"goal_amount": 100000,
"goal_progress_pct": 98.7,
"tiers": [
{ "name": "Supporter", "amount": 700, "backers": 31 },
{ "name": "Patron", "amount": 1400, "backers": 12 },
{ "name": "Champion", "amount": 2100, "backers": 4 }
]
}
Commitment Tiers & Fee Structure
CrowdFundWith uses a tiered commitment model. Creators choose a monthly subscription tier — the higher the commitment, the lower the platform fee. All amounts are in Canadian dollars (CAD).
Example
A creator on the $21/mo plan earns $1,000 in backer revenue this month. CrowdFundWith takes $125 (12.5%). Stripe takes approximately $29 + transaction fees. The creator receives roughly $846 CAD.
The same creator upgrades to the $50/mo plan. CrowdFundWith takes $0. Stripe takes approximately $29. The creator receives roughly $971 CAD.
Using with Claude Code
CrowdFundWith is designed to be managed entirely from the terminal. The API is clean enough that you can run a full campaign through Claude Code — no dashboard required. Below is a starter workflow you can paste directly into a Claude Code session.
Paste this into Claude Code to get started
Set your API key as an environment variable first: export CFW_KEY=cfw_your_key
# Step 1 — Register and save your API key
curl -X POST https://api.crowdfundwith.com/api/auth/register \
-H "Content-Type: application/json" \
-d '{"email":"you@example.com","name":"Your Name"}'
# Step 2 — Create your project
curl -X POST https://api.crowdfundwith.com/api/projects \
-H "x-api-key: $CFW_KEY" \
-H "Content-Type: application/json" \
-d '{"title":"My Project","description":"What I am building...","category":"technology"}'
# Step 3 — Add commitment tiers
curl -X POST https://api.crowdfundwith.com/api/tiers \
-H "x-api-key: $CFW_KEY" \
-H "Content-Type: application/json" \
-d '{"project_id":"prj_xxx","name":"Supporter","amount":700,"description":"Access to updates"}'
# Step 4 — Publish the project
curl -X PUT https://api.crowdfundwith.com/api/projects/prj_xxx \
-H "x-api-key: $CFW_KEY" \
-H "Content-Type: application/json" \
-d '{"status":"published"}'
# Step 5 — Post a Week 1 update
curl -X POST https://api.crowdfundwith.com/api/updates \
-H "x-api-key: $CFW_KEY" \
-H "Content-Type: application/json" \
-d '{"project_id":"prj_xxx","title":"Week 1 Update","content":"Here is what we shipped..."}'
# Step 6 — Check your dashboard stats
curl https://api.crowdfundwith.com/api/stats/dashboard \
-H "x-api-key: $CFW_KEY"
# Step 7 — Broadcast a message to all backers
curl -X POST https://api.crowdfundwith.com/api/messages/broadcast \
-H "x-api-key: $CFW_KEY" \
-H "Content-Type: application/json" \
-d '{"project_id":"prj_xxx","content":"Thank you for your support this month!"}'
export CFW_PROJECT=prj_xxx — so you can reuse it across commands without
copy-pasting.
Webhooks
CrowdFundWith handles Stripe webhook events automatically at POST /webhooks/stripe.
You do not need to build your own Stripe integration — the platform handles subscription
lifecycle events on your behalf.
STRIPE_WEBHOOK_SECRET using Stripe's signature header.
Requests with invalid signatures are rejected with 400.
Handled Stripe Events
customer.subscription.deleted event will follow.
The creator is not charged and the backer is notified by email.
Stripe Webhook Setup
Configure your Stripe dashboard to send events to
https://api.crowdfundwith.com/webhooks/stripe.
Set your STRIPE_WEBHOOK_SECRET environment variable to the
signing secret provided by Stripe.
stripe listen \
--forward-to http://localhost:3000/webhooks/stripe \
--events checkout.session.completed,customer.subscription.deleted,invoice.payment_failed
AI Campaign Builder
Not sure how to describe your project? The AI Campaign Builder takes a short brief from you and generates everything — project title, description, tiers, milestones, and a launch update — ready to publish.
What the AI generates for you
You describe your idea in plain language ("I make hand-thrown ceramics and want to fund a studio kiln"). The AI writes a compelling project description, names and prices three tiers, sets two milestones, and drafts a launch post — all calibrated to your category and audience.
POST /api/ai/generate-campaign)
is planned for a future release. Watch the changelog for updates.
How to access it today
- Log into the creator dashboard
- Click New Project and choose AI-Assisted Setup
- Describe your project in 2-3 sentences
- Review, edit, and publish — usually under 5 minutes