Skip to content

Success Stories​

Fundlies that reached the finish line and what the money did (#2061): the public index and story pages, and the organizer's own edits and approval.


List success stories​

GET
/success-stories

Every Fundly that has ended (status ended, or live with its end date passed), raised more than $0 and passes the safety gates: not deleted, public, its organization not deleted or suspended and under no legal hold, its owner not suspended or banned, not under review, no pending report and no open dispute. There is no opt-in. A story staff hid is left out.

featured is the staff pick, else the newest published story; it is left out of data and of pagination.total. counts count every story, the featured one included. stats are the live platform figures (the same cached numbers as GET /platform/numbers), null when they cannot be read.

Parameters​

Query Parameters

filter
Type
string
Valid values
"all""fully_funded""ended""closed"
Default
"all"
sort

recent orders by finished_at, newest first; raised by raised, most first.

Type
string
Valid values
"recent""raised"
Default
"recent"
limit
Type
integer
Minimum
1
Maximum
48
Default
24
offset
Type
integer
Minimum
0
Default
0
lang

Titles in this language where a translation exists. Falls back to the language cookie, then Accept-Language.

Type
string
Valid values
"en""ru""uk""es"

Responses​

One page of stories

application/json
JSON
{
"data": [
],
"pagination": {
"total": 0,
"limit": 0,
"offset": 0
},
"counts": {
"all": 0,
"fully_funded": 0,
"ended": 0,
"closed": 0
},
"featured": {
"fundraiser_id": "string",
"slug": "string",
"title": "string",
"organizer": {
"name": "string",
"avatar_url": "string",
"city": "string"
},
"cover_image": "string",
"images": [
"string"
],
"kind": "string",
"raised_cents": 0,
"finished_at": "string",
"accepting_gifts": true,
"has_story": true,
"headline": "string",
"dek": "string",
"is_project": true,
"fundraising": "string"
},
"stats": {
"raised_cents": 0,
"donations": 0,
"fundlies": 0,
"cities": 0,
"as_of": "string"
}
}

Playground​

Server
Variables
Key
Value

Samples​


Get one success story​

GET
/success-stories/{slug}

One Fundly's success story page. 404 unless the Fundly is a success story right now (the same gates as the list) and staff have not hidden it. The Fundly's own slug is accepted too; card.slug is the canonical one. story is null until the organizer-approved story is published; the record is always there, computed live. Anonymous donors are shown as Anonymous.

Parameters​

Path Parameters

slug*
Type
string
Required

Query Parameters

lang
Type
string
Valid values
"en""ru""uk""es"

Responses​

The story

application/json
JSON
"string"

Playground​

Server
Variables
Key
Value

Samples​


Get my Fundly's success story, any status​

GET
/fundraisers/{id}/success-story

The owner's view of their Fundly's success story: the whole row in any status, draft text included, and what they may do. Creates the draft row on first read when the Fundly is eligible and the pipeline has not made it yet. Owner only: anyone else gets 403 with code: NOT_OWNER, no session 401 UNAUTHORIZED, no story 404 NOT_FOUND. Every refusal on these three operations is { error, code }.

Authorizations​

BearerAuth

In the browser, authentication rides on the httpOnly session cookies set by /cognito/signin or the Google / Apple sign-in at /cognito/oauth/{provider}. For scripts and for Swagger UI testing, paste an API key (fh_live_…, created with POST /api-keys); a Cognito JWT is accepted too. Sign-in does not return a token in its body.

Type
HTTP (bearer)

Parameters​

Path Parameters

id*

The Fundly (fundraiser) id.

Type
string
Required
Format
"uuid"

Responses​

The story

application/json
JSON
"string"

Playground​

Server
Authorization
Variables
Key
Value

Samples​


Edit my Fundly's success story​

PATCH
/fundraisers/{id}/success-story

The owner edits their story directly, in every status but hidden (409 INVALID_STATUS). headline, dek and ask_excerpt may change only before publish (409 PUBLISHED_FIELD_LOCKED after; sending the unchanged value is fine). Before publish, any change clears organizer_approved_at (an approved story goes back to organizer_review). On a published story the edit is live at once, audit-logged with the old and new values, and staff are notified.

photo_url must be an image uploaded through POST /storage/upload (bucket fundraiser-images), the same check the campaign media uses. ask_excerpt must be quoted word for word from the Fundly's own story (400 VALIDATION_ERROR). Send only the fields that change; null or an empty string clears a text field.

Authorizations​

BearerAuth

In the browser, authentication rides on the httpOnly session cookies set by /cognito/signin or the Google / Apple sign-in at /cognito/oauth/{provider}. For scripts and for Swagger UI testing, paste an API key (fh_live_…, created with POST /api-keys); a Cognito JWT is accepted too. Sign-in does not return a token in its body.

Type
HTTP (bearer)

Parameters​

Path Parameters

id*
Type
string
Required
Format
"uuid"

Request Body​

application/json
JSON
{
"headline": "string",
"dek": "string",
"ask_excerpt": "string",
"money_text": "string",
"breakdown": [
],
"photo_url": "string",
"photo_caption": "string",
"now_text": "string",
"gifts_purpose": "string"
}

Responses​

The story after the edit

application/json
JSON
"string"

Playground​

Server
Authorization
Variables
Key
Value
Body

Samples​


Approve my Fundly's success story​

POST
/fundraisers/{id}/success-story/approve

The organizer approves the words: sets organizer_approved_at and written_with_user_id, the status becomes approved, and staff are notified. Allowed from draft and organizer_review; approving an approved story again is a no-op; 409 NOT_IN_REVIEW once published or hidden. Nothing is published without this approval. Owner only.

Authorizations​

BearerAuth

In the browser, authentication rides on the httpOnly session cookies set by /cognito/signin or the Google / Apple sign-in at /cognito/oauth/{provider}. For scripts and for Swagger UI testing, paste an API key (fh_live_…, created with POST /api-keys); a Cognito JWT is accepted too. Sign-in does not return a token in its body.

Type
HTTP (bearer)

Parameters​

Path Parameters

id*
Type
string
Required
Format
"uuid"

Responses​

The approved story

application/json
JSON
"string"

Playground​

Server
Authorization
Variables
Key
Value

Samples​


Powered by VitePress OpenAPI

Built with VitePress