Partner API Documentation
Everything you need to integrate Fund My Squad fundraising into your platform. Machine-readable version available at /llms.txt
Implementation Overview
Fund My Squad (FMS) is a fundraising platform for youth sports. The Partner API lets external platforms (league management, team apps, registration software) offer built-in fundraising to their users. Partners earn commission on every donation processed through fundraisers created via their integration.
Integration Flow:
┌─────────────────────────────────────────────────────────────────┐
│ PARTNER INTEGRATION FLOW │
└─────────────────────────────────────────────────────────────────┘1. SETUP
Apply at /partners → Get staging API key → Build & test in sandbox
2. CREATE FUNDRAISER (your platform → FMS API)
Your user wants to fundraise
→ POST /partner/v1/fundraisers {title, goalAmount, externalId}
→ FMS returns id, publicUrl, donateUrl
3. COLLECT DONATIONS (donors → FMS hosted page)
Share the donateUrl or embed link
→ Donor visits FMS donation page
→ FMS processes payment via Stripe
4. ENABLE PAYOUTS (fundraiser creator → Stripe Connect)
POST /partner/v1/fundraisers/:id/connect/onboard
→ Redirect user to Stripe onboarding
→ User completes KYC/banking setup
5. TRACK & DISPLAY (FMS API → your platform)
GET /partner/v1/fundraisers/:id → Show progress
GET /partner/v1/fundraisers/:id/donations → Show donors
6. COMMISSION PAYOUT (automatic on each donation)
Donor pays $100 → Stripe fee ~$3.20
→ Platform fee (10%): $10.00
→ Partner commission (e.g. 4%): $4.00
→ FMS keeps: $6.00
→ Fundraiser creator receives: $86.80
Quick Start: 1. Apply at https://fundmysquad.com/partners 2. Once approved, log in to the Partner Portal 3. Generate a staging API key from the API Keys tab 4. Test all endpoints in the Sandbox tab 5. Request a production API key 6. Integrate into your platform and go live
Full machine-readable docs: https://fundmysquad.com/llms.txt
Authentication
All API requests require your partner API key in the x-partner-api-key header:
curl https://api.fundmysquad.com/partner/v1/fundraisers \
-H "x-partner-api-key: fms_partner_abc123..."
Base URL: Always use https://api.fundmysquad.com for all requests.
Environments:
| Key Type | Behavior |
|---|---|
| Staging keys | Requests are automatically routed to the sandbox environment. No real data is created. Response includes x-fms-environment: sandbox header. |
| Production keys | Requests hit the production environment. Real fundraisers, real donations. |
Partners always use the same base URL. The API detects whether your key is staging or production and routes accordingly. Staging key requests never touch the production database.
Create a Fundraiser
POST /partner/v1/fundraisers
Required fields:
title (string) — Fundraiser titlegoalAmount (number) — Goal in dollars (e.g. 5000)externalId (string) — Your platform's unique ID for the team/userOptional fields:
description (string), goalType ("team" or "individual"), category, sportheroImageUrl (string), startsAt, endsAt (ISO 8601)metadata (object) — Arbitrary JSON for your own trackingExample:
curl -X POST https://api.fundmysquad.com/partner/v1/fundraisers \
-H "x-partner-api-key: fms_partner_abc123..." \
-H "Content-Type: application/json" \
-d '{
"title": "Tigers Spring Travel Fund",
"goalAmount": 5000,
"goalType": "team",
"externalId": "team_8472",
"sport": "baseball",
"endsAt": "2026-06-01T00:00:00Z"
}'
Returns the created fundraiser with its id, publicUrl, and donateUrl.
List Fundraisers
GET /partner/v1/fundraisers
Query parameters:
externalId — Filter by your team/user IDstatus — Filter: active, closed, draftsort — newest, oldest, most_raised, ending_soonlimit (max 100), offset — PaginationExample:
curl "https://api.fundmysquad.com/partner/v1/fundraisers?externalId=team_8472&status=active" \
-H "x-partner-api-key: fms_partner_abc123..."
Get Fundraiser Details
GET /partner/v1/fundraisers/:id
Returns full details including current stats (raised amount, donation count, supporter count, progress %) and the 10 most recent donations.
Lookup by external ID:
GET /partner/v1/fundraisers/by-external-id/:externalId
Update a Fundraiser
PATCH /partner/v1/fundraisers/:id
Updatable fields: title, description, goalAmount, startsAt, endsAt, category, sport, heroImageUrl, externalId, metadata
Only include the fields you want to change. Omitted fields are left unchanged.
curl -X PATCH https://api.fundmysquad.com/partner/v1/fundraisers/abc123... \
-H "x-partner-api-key: fms_partner_abc123..." \
-H "Content-Type: application/json" \
-d '{ "goalAmount": 7500 }'
Close & Reopen
Close a fundraiser:
POST /partner/v1/fundraisers/:id/close
Reopen a closed fundraiser:
POST /partner/v1/fundraisers/:id/reopen
Optionally pass { "endsAt": "2026-08-01T00:00:00Z" } to set a new end date.Donations & Stats
List donations:
GET /partner/v1/fundraisers/:id/donations?limit=50&offset=0
Fundraiser stats (with 14-day trend):
GET /partner/v1/fundraisers/:id/stats
Portfolio summary:
GET /partner/v1/summary
Returns aggregate stats across all your fundraisers: total raised, active/closed counts, unique teams, total donors.Stripe Connect (Payouts)
Onboard a fundraiser creator for payouts:
POST /partner/v1/fundraisers/:id/connect/onboard
Required fields:
returnUrl (string) — Where to redirect after Stripe onboardingOptional fields:
refreshUrl (string) — Where to redirect if the link expiresResponse:
{
"onboardingUrl": "https://connect.stripe.com/...",
"stripeAccountId": "acct_...",
"message": "Redirect the fundraiser creator to onboardingUrl..."
}
Redirect your user to onboardingUrl. After completing Stripe's KYC/banking setup, they'll be redirected to your returnUrl.
Check Connect status:
GET /partner/v1/fundraisers/:id/connect/status
Returns connected (boolean), chargesEnabled, payoutsEnabled, detailsSubmitted.
Commission splits: When a donation is made to a partner-created fundraiser with a connected payout account:
Endpoint Reference
| Method | Endpoint | Scope | Description |
|---|---|---|---|
| POST | /partner/v1/fundraisers | fundraisers:write | Create a fundraiser |
| GET | /partner/v1/fundraisers | fundraisers:read | List all fundraisers |
| GET | /partner/v1/fundraisers/:id | fundraisers:read | Get fundraiser details |
| GET | /partner/v1/fundraisers/by-external-id/:externalId | fundraisers:read | Lookup by external ID |
| PATCH | /partner/v1/fundraisers/:id | fundraisers:write | Update a fundraiser |
| POST | /partner/v1/fundraisers/:id/close | fundraisers:write | Close a fundraiser |
| POST | /partner/v1/fundraisers/:id/reopen | fundraisers:write | Reopen a fundraiser |
| GET | /partner/v1/fundraisers/:id/donations | donations:read | List donations |
| GET | /partner/v1/fundraisers/:id/stats | fundraisers:read | Get fundraiser stats |
| GET | /partner/v1/summary | fundraisers:read | Partner portfolio summary |
| POST | /partner/v1/fundraisers/:id/connect/onboard | fundraisers:write | Start Stripe Connect |
| GET | /partner/v1/fundraisers/:id/connect/status | fundraisers:read | Check Connect status |
Errors & Rate Limits
Error format:
{ "error": "description of what went wrong" }
| Status | Meaning | |||
|---|---|---|---|---|
| 400 | Bad request — missing or invalid fields | |||
| 401 | Auth failed — bad or expired API key | |||
| 404 | Not found (or not owned by your partner) | |||
| 409 | Conflict — e.g. closing an already-closed fundraiser | |||
| 429 | Rate limit exceeded | |||
| 500 | Server error | Rate limits: 120 requests/minute and 10,000 requests/day per API key. Rate limit headers on every response: | Header | Description |
| -------- | ------------- | |||
| X-RateLimit-Limit | Requests allowed per minute | |||
| X-RateLimit-Remaining | Requests remaining in current window | |||
| X-RateLimit-Reset | Unix timestamp when the window resets | |||
| Retry-After | Seconds until retry (only on 429) |
Key Concepts
External IDs:
The externalId field bridges your platform and FMS. Pass your unique identifier for teams or users. Create multiple fundraisers for the same team and look them all up with one call.
Partner Metadata:
The metadata field is a free-form JSON object. Store league info, coach contacts, season details — FMS preserves it as-is.
Scopes:
| Scope | Grants |
|---|---|
| fundraisers:read | List and view fundraisers |
| fundraisers:write | Create, update, close, reopen |
| donations:read | View donations |
| * | All permissions |
Sandbox vs Production: Staging API keys create sandbox fundraisers (not public, no real donations). Production keys create real fundraisers that accept real donations.
