4. API Reference
4. API Reference
API Reference
All paths below are relative toto:
https://api.sirgiving.orghttps://devapi.sirgiving.orgAuth column legend:
pk_https://api.sirgiving.org@RequiresSecretKeypk_.../auth/loginEvery authenticated response carries X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Reset.
Partner Auth (portal)legend
These endpoints back the partner-user web portal, not server-to-server integration.
POST /v1/partner/auth/login
Email/password login for partner-portal users. Returns JWT pair + partner info + active publishable key.
GET /v1/partner/auth/meย ๐ชช
Returns the authenticated partner user, their partner record, and active publishable key.
Partner Config ๐
GET /v1/partner/config
Returns enabled features, rate limit, webhook URL, tip configuration. Used by widgets to bootstrap.
{
"id": "...",
"name": "Acme Inc",
"slug": "acme",
"enabledFeatures": ["DONATIONS", "ACTIONS"],
"rateLimit": 5000,
"isActive": true,
"webhookUrl": "https://acme.com/webhooks/sir",
"tipConfig": { "enabled": true, "defaultPercent": 10 }
}
Organizations ๐
GET /v1/partner/organizations/:slug
Look up a nonprofit by slug (e.g. american-red-cross). Returns id, name, logo, EIN, status. Used by donation widgets.
Donations ๐
POST /v1/partner/donations/create-link
Creates a payment link (Every.org or Stripe) attributed to your partner ID. Returns the URL plus a partnerDonationIdย to poll status with.
Request body:
{
"nonprofitSlug": "american-red-cross",
"amount": 1000, // cents
"currency": "USD",
"frequency": "once", // "once" | "monthly"
"provider": "every.org", // or "stripe"
"donorEmail": "donor@example.com",
"firstName": "Jane",
"lastName": "Doe",
"tipAmount": 100, // optional, Stripe path
"tipPercent": 10, // optional
"referralCode": "REFER123", // optional
"organizationId": "..." // optional, resolves from slug if omitted
}
Response:
{
"donationLink": "https://every.org/donate/american-red-cross?...",
"partnerDonationId": "550e8400-e29b-41d4-a716-446655440000",
"estimatedSirReward": 70
}
GET /v1/partner/donations/status/:partnerDonationId
Poll-able status: PENDINGย | PROCESSINGย | COMPLETEDย | FAILEDย plus tokensDistributed.
Actions ๐ / ๐
The core write API. An action is a unit of value (a donation made, hours volunteered, an advocacy email sent) that distributes SIR tokens to one or more stakeholders per the configured campaign.
POST /v1/partner/actions/submitย ๐
Submit a single action. Idempotent on idempotencyKey. Returns synchronously after token distribution.
Body fields:
idempotencyKeyJWT
actionTypeWidget
X-Partner-Key: pk_...ย only
HMAC
DONATIONX-Partner-Key, VOLUNTEERX-Timestamp, and ADVOCACYX-Signature
amountHMAC, secret key
>=sk_...; currencyUSDstakeholders[]campaignIdtokenPoolIdautoCreateUserstrueuserEmailmetadataPartner key management
StakeholderThese shape:endpoints are for signed-in users managing their own partner credentials.
{/v1/partner/keys
/v1/partner/keys
JWT
List your API keys
GET
/v1/partner/keys/partner-info
JWT
Get your Partner record
GET
/v1/partner/keys/:id
/v1/partner/keys/:id
/v1/partner/keys/:id
JWT
Delete/revoke a key
Partner auth
These endpoints support the partner portal.
/v1/partner/auth/login
Email/password
Login to partner portal
GET
/v1/partner/auth/me
JWT
Get current partner user and publishable key
Widget/config endpoints
/v1/partner/config
Widget
Get partner widget config
GET
/v1/partner/organizations/:slug
Widget
Look up nonprofit details
POST
/v1/partner/donations/create-link
Widget
Create a donation checkout link
GET
/v1/partner/donations/status/:partnerDonationId
Widget
Check donation reward status
Users
/v1/partner/users
HMAC
List partner users
POST
/v1/partner/users
HMAC, secret key
Create a partner user
GET
/v1/partner/users/:externalId
HMAC
Get a user by your external ID
/v1/partner/users/:externalId
//v1/partner/users/:externalId/balance
Status codes:
200actionIdstatustokensDistributedtransactionIds[]400402409/v1/partner/users/:externalId/transactions
Actions
/v1/partner/actions/submit
HMAC, secret key
200/v1/partner/actions429GET /v1/partner/actions/:id
Action
POST /v1/partner/actions/:actionId/reverse
๐
HMAC, Triggersecret fullkey
actions:reverse{
"reversalPercentage": 100, // 0โ100; 100 = full
"reason": "Refunded by customer service",
"refundIdempotencyKey": "rev_donation_2024_..."
}
Response includes tokensClawedBack, debtsCreatedย (when stakeholder balance is insufficient), and
breakdownGET /v1/partner/actionsย ๐
List with page, limitย (max 100), status, actionType, fromDate, toDate.
POST /v1/partner/actions/bulk
secret key
Submit up to 100 actions{
"successful": 8,
"failed": 2,
"results": [
{ "idempotencyKey": "k1", "status": "COMPLETED", "actionId": "..." },
{ "idempotencyKey": "k2", "status": "FAILED", "error": "..." }
]
}
GET /v1/partner/actions/bulk/:jobId ๐is
Deprecated.ย Returns 410 Gone.deprecated. Bulk is synchronous now โ read the POST response.
Users ๐
Usersactions are keyedprocessed bysynchronously yourand externalUserId.return Wetheir mirrorresult themfrom with a SIR account/wallet.
GET /v1/partner/usersย ๐
Paginate (page, limit, search).
POST /v1/partner/usersย ๐
Create. Idempotent on externalUserIdย โ returns existing user if already created.
{
"externalUserId": "user_123",
"email": "user@example.com",
"firstName": "Jane",
"lastName": "Doe",
"metadata": {}
}
Response includes partnerUserId, accountId, walletCreated, .upgradeEligiblebulk
GET /v1/partner/users/:externalIdย ๐
PATCH /v1/partner/users/:externalIdย ๐ โ update email/name/metadata
GET /v1/partner/users/:externalId/balanceย ๐
Returns totalBalance, availableBalance, restrictedBalance, and balanceByRestriction[]ย (with availableAtย for vested chunks).
GET /v1/partner/users/:externalId/transactionsย ๐
The user's action history scoped to your partner. Supports page, limit, status, actionType, fromDate, toDate.
Token Pools ๐pools
GET /v1/partner/token-poolsย ๐
Lists allocated pools. Filter by status.
GET /v1/partner/token-pools/:id/balanceย ๐
Pool balance breakdown: allocated, available, reserved, distributed, percent available.
POST /v1/partner/token-pools/requestย ๐
Submit a request for additional allocation (admin-reviewed).
{ "amount": 100000, "reason": "Q3 campaign launch" }
GET /v1/partner/token-pools/requestsย ๐
List your past allocation requests.
Campaigns ๐
GET /v1/partner/campaignsย ๐ โ list with statusย filter
GET /v1/partner/campaigns/activeย ๐ โ currently-running campaign for widget banners
GET /v1/partner/campaigns/:idย ๐
GET /v1/partner/campaigns/:id/analyticsย ๐ โ full analytics (stakeholder + tier breakdown, daily trends)
POST /v1/partner/campaignsย ๐ โ create from template
{
"tokenPoolId": "...",
"name": "Holiday 2X",
"description": "Double rewards for Q4",
"templateId": "REWARD_MULTIPLIER",
"actionTypes": ["DONATION"],
"distribution": {
"baseMultiplier": 2.0,
"stakeholderSplits": [
{ "stakeholderTypeId": "DONOR", "percentage": 70, "isRequired": true, "splitMode": "EQUAL" },
{ "stakeholderTypeId": "ORGANIZATION", "percentage": 30, "isRequired": true, "splitMode": "EQUAL" }
],
"tiers": [
{ "minAmount": 0, "maxAmount": 50, "multiplier": 1.0 },
{ "minAmount": 50, "maxAmount": null, "multiplier": 2.0 }
]
},
"limits": { "maxDistributionPerAction": 1000, "dailyDistributionLimit": 50000, "totalBudget": 1000000 },
"schedule": { "startDate": "2024-11-01T00:00:00Z", "endDate": "2024-12-31T23:59:59Z" }
}
PATCH /v1/partner/campaigns/:idย ๐
Only DRAFTย and ACTIVEย are mutable. Completed campaigns return 400 CAMPAIGN_NOT_ACTIVE.
Transactions ๐
A transaction is the double-entry ledger record produced by an action's token distribution.
GET /v1/partner/transactionsย ๐
Filter by status, actionId, tokenPoolId, fromDate, toDate.
GET /v1/partner/transactions/:idย ๐
Returns full ledger detail: per-stakeholder entries[]ย with debit/credit/restrictionType, totalDebits, totalCredits, isBalanced, failureReason.
Webhooks ๐ / ๐
See the Webhooksย page for delivery format and verification.
POST /v1/partner/webhooksย ๐ โ register
{
"url": "https://your-app.example.com/webhooks/sir",
"description": "prod webhook",
"eventTypes": ["action.completed", "action.failed", "transaction.completed"],
"receiveAllEvents": false,
"headers": { "X-My-Tenant": "prod" }
}
Response includes the signing secretย โ store it; you'll need it to verify deliveries.
GET /v1/partner/webhooksย ๐ โ list
DELETE /v1/partner/webhooks/:idย ๐ โ unregister
GET /v1/partner/webhooks/:id/deliveriesย ๐
Filter by statusย (PENDING/DELIVERED/FAILED/RETRYING), eventType, paginate with limit/offset.
POST /v1/partner/webhooks/:id/deliveries/:deliveryId/retryย ๐
Manually re-queue a failed delivery for immediate redispatch.
POST /v1/partner/webhooks/:id/testย ๐
Sends a partner.status_changedย ping with { type: 'ping', message, webhookId, timestamp }ย body.
Dashboard ๐
Read-only analytics for partner-side dashboards.
/v1/partner/token-pools
HMAC
List allocated token pools
GET
/v1/partner/token-pools/:id/balance
HMAC
Get pool balance
POST
/v1/partner/token-pools/request
HMAC, secret key
Request more allocation
GET
/v1/partner/token-pools/requests
HMAC
List allocation requests
Campaigns
/v1/partner/campaigns
HMAC
List campaigns
GET
/v1/partner/campaigns/active
HMAC
Get active campaign
GET
/v1/partner/campaigns/:id
HMAC
Get campaign details
GET
/v1/partner/campaigns/:id/analytics
HMAC
Get campaign analytics
POST
/v1/partner/campaigns
HMAC, secret key
Create campaign
PATCH
/v1/partner/campaigns/:id
HMAC, secret key
Update campaign
Transactions
/v1/partner/transactions
HMAC
List partner transactions
GET
/v1/partner/transactions/:id
HMAC
Get transaction details
Dashboard
/v1/partner/dashboard/summary
GET /v1/partner/dashboard/trends?days=30trends
HMAC
Daily GET /v1/partner/dashboard/top-earners?limit=10earners
HMAC
Top rewarded usersGET /v1/partner/dashboard/webhooks/health
GET /v1/partner/dashboard/api-usage?days=7usage
GET /v1/partner/dashboard/recent-activity
GET /v1/partner/dashboard/integration-health
GET /v1/partner/dashboard/campaigns/:id/analytics
HMAC
Campaign performanceError envelopeWebhooks
All
Method Path Auth PurposePOST
{/v1/partner/webhooks
/v1/partner/webhooks
HMAC
List webhooks
DELETE
/v1/partner/webhooks/:id
/v1/partner/webhooks/:id/deliveries
/v1/partner/webhooks/:id/deliveries/:deliveryId/retry
/v1/partner/webhooks/:id/test
Common
INVALID_API_KEYINVALID_SIGNATURETIMESTAMP_EXPIREDPARTNER_NOT_ACTIVEPARTNER_SUSPENDEDRATE_LIMIT_EXCEEDEDINVALID_REQUESTINSUFFICIENT_SCOPEUSER_NOT_FOUNDACTION_NOT_FOUNDCAMPAIGN_NOT_FOUNDPOOL_NOT_FOUNDTRANSACTION_NOT_FOUNDWEBHOOK_NOT_FOUNDCAMPAIGN_NOT_ACTIVEENDPOINT_GONEINTERNAL_ERROR