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.

Base URL https://api.crowdfundwith.com
JSON everywhere. All request bodies must be sent as 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 Response
{
  "error": "Project not found",
  "status": 404
}
StatusMeaning
200OK — request succeeded
201Created — resource was created
400Bad Request — missing or invalid parameters
401Unauthorized — missing or invalid API key
403Forbidden — you do not own this resource
404Not 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.

x-api-key : cfw_your_api_key_here
Your API key is shown exactly once at registration. Store it immediately in a secrets manager or .env file. If lost, you will need to contact support to rotate it. Never commit your key to version control.
POST /api/auth/register

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

FieldTypeRequiredDescription
email 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

Response
{
  "creator_id": "crt_a1b2c3d4",
  "api_key":    "cfw_live_xxxxxxxxxxxxxxxxxxxx",
  "message":   "Account created. Save your API key — it won't be shown again."
}
POST /api/auth/stripe-connect

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.

Requires authentication via x-api-key header.

200 OK

Response
{
  "onboarding_url": "https://connect.stripe.com/setup/e/acct_xxx/..."
}
GET /api/auth/stripe-connect/status

Check Stripe Connect onboarding status

Returns whether the creator's Stripe account is fully onboarded and capable of receiving payouts.

200 OK

Response
{
  "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.

POST /api/projects

Create a project

FieldTypeRequiredDescription
titlestringrequiredProject name (max 120 characters).
descriptionstringrequiredFull project description. Markdown is supported.
categorystringrequiredOne of: technology, arts, music, film, games, food, health, education, community, environment, publishing, fashion.
goal_amountintegeroptionalMonthly 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

Response
{
  "project_id":   "prj_x7k2m9",
  "title":        "My Indie Game",
  "category":     "games",
  "goal_amount":  100000,
  "status":       "draft",
  "created_at":   "2025-03-20T14:00:00.000Z"
}
GET /api/projects

List your projects

Returns all projects belonging to the authenticated creator, newest first.

cURL
curl https://api.crowdfundwith.com/api/projects \
  -H "x-api-key: cfw_your_key"
GET /api/projects/:id

Get a single project

Returns full project details including milestone list and backer count.

cURL
curl https://api.crowdfundwith.com/api/projects/prj_x7k2m9 \
  -H "x-api-key: cfw_your_key"
PUT /api/projects/:id

Update a project

Partial update — send only the fields you want to change. All fields are optional.

FieldTypeRequiredDescription
titlestringoptionalNew project title.
descriptionstringoptionalUpdated description.
categorystringoptionalUpdated category.
goal_amountintegeroptionalUpdated monthly goal in CAD cents.
statusstringoptionaldraft or published. Setting to published makes the project publicly discoverable.
DELETE /api/projects/:id

Delete a project

Irreversible. Active backers will lose access and their subscriptions will be cancelled. Make sure to notify your community before deleting a live project.

200 OK

Response
{ "deleted": true }
POST /api/projects/:id/milestones

Add a milestone

Milestones are public goals shown on your project page — e.g. "At $500/mo I will release a monthly podcast."

FieldTypeRequiredDescription
titlestringrequiredShort milestone name.
descriptionstringoptionalWhat you will deliver when this milestone is reached.
target_amountintegerrequiredMonthly 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.

POST /api/updates

Create an update

FieldTypeRequiredDescription
project_idstringrequiredThe project this update belongs to.
titlestringrequiredUpdate headline.
contentstringrequiredFull update body. Markdown supported.
cURL
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!"}'
GET /api/updates/project/:id

List updates for a project

Returns all updates for the given project, newest first.

PUT /api/updates/:id

Edit an update

Update title and/or content. Partial update — send only changed fields.

DELETE /api/updates/:id

Delete an update

200 OK

Response
{ "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.

POST /api/tiers

Create a tier

FieldTypeRequiredDescription
project_idstringrequiredProject this tier belongs to.
namestringrequiredTier display name, e.g. "Supporter".
amountintegerrequiredMonthly amount in CAD cents. Must match a platform tier ($7, $14, $21, or custom $50+).
descriptionstringrequiredWhat backers receive at this tier.
cURL
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"}'
GET /api/tiers/project/:id

List tiers for a project

Returns all tiers for the given project, sorted by amount ascending.

PUT /api/tiers/:id

Update a tier

Update name, description, or amount. Changing the amount will not affect existing active subscriptions.

DELETE /api/tiers/:id

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.

POST /api/messages/broadcast

Broadcast to all backers

Sends a message to every active backer on the project. Use for announcements, delays, or milestone celebrations.

FieldTypeRequiredDescription
project_idstringrequiredProject whose backers will receive the message.
contentstringrequiredMessage body. Markdown supported. Max 4,000 characters.
cURL
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

Response
{
  "sent":       true,
  "recipients": 47
}
POST /api/messages/direct

Send a direct message

Send a private message to a single backer. The backer must be an active supporter of the specified project.

FieldTypeRequiredDescription
project_idstringrequiredProject context for this message.
recipient_idstringrequiredThe backer's user ID.
contentstringrequiredMessage body. Max 4,000 characters.
GET /api/messages/project/:id

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.

GET /api/stats/dashboard

Dashboard overview

Aggregated stats across all your projects.

200 OK

Response
{
  "total_projects":       3,
  "total_backers":        142,
  "monthly_revenue_cad":  318500,  // in cents = $3,185
  "active_subscriptions": 138,
  "churn_last_30d":       4
}
GET /api/stats/project/:id

Single project stats

Detailed stats for one project including per-tier breakdown.

200 OK

Response
{
  "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).

$7 / mo
12.5%
Platform fee on backer revenue
$14 / mo
12.5%
Platform fee on backer revenue
$21 / mo
12.5%
Platform fee on backer revenue
Stripe fees always apply separately. The platform fee above is CrowdFundWith's cut only. Standard Stripe processing fees (~2.9% + $0.30 CAD per transaction) are charged on top by Stripe.

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.

C

Paste this into Claude Code to get started

Set your API key as an environment variable first: export CFW_KEY=cfw_your_key

bash — full workflow
# 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!"}'
Pro tip: Store your project ID in a variable too — 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.

Webhook signatures are verified. Every incoming Stripe event is validated against the STRIPE_WEBHOOK_SECRET using Stripe's signature header. Requests with invalid signatures are rejected with 400.

Handled Stripe Events

checkout.session.completed
A backer has successfully completed checkout. Their commitment is activated and they gain access to the creator's project updates and messages.
customer.subscription.deleted
A backer's subscription was cancelled — either by the backer or due to payment failure. Their access is revoked and the creator's backer count decreases.
invoice.payment_failed
Monthly renewal failed. Stripe will retry automatically. If all retries fail, a 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 CLI — local testing
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.

$100 CAD
One-time fee per campaign
25%
Platform fee (first month) instead of upfront payment
API access coming soon. The AI Campaign Builder is currently available through the dashboard only. An API endpoint (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