{
  "schemaVersion": "1.0",
  "item": {
    "slug": "fundraiseup",
    "name": "Fundraise Up",
    "source": "tencent",
    "type": "skill",
    "category": "开发工具",
    "sourceUrl": "https://clawhub.ai/Aamish99/fundraiseup",
    "canonicalUrl": "https://clawhub.ai/Aamish99/fundraiseup",
    "targetPlatform": "OpenClaw"
  },
  "install": {
    "downloadMode": "redirect",
    "downloadUrl": "/downloads/fundraiseup",
    "sourceDownloadUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=fundraiseup",
    "sourcePlatform": "tencent",
    "targetPlatform": "OpenClaw",
    "installMethod": "Manual import",
    "extraction": "Extract archive",
    "prerequisites": [
      "OpenClaw"
    ],
    "packageFormat": "ZIP package",
    "includedAssets": [
      "SKILL.md",
      "LICENSE.txt"
    ],
    "primaryDoc": "SKILL.md",
    "quickSetup": [
      "Download the package from Yavira.",
      "Extract the archive and review SKILL.md first.",
      "Import or place the package into your OpenClaw setup."
    ],
    "agentAssist": {
      "summary": "Hand the extracted package to your coding agent with a concrete install brief instead of figuring it out manually.",
      "steps": [
        "Download the package from Yavira.",
        "Extract it into a folder your agent can access.",
        "Paste one of the prompts below and point your agent at the extracted folder."
      ],
      "prompts": [
        {
          "label": "New install",
          "body": "I downloaded a skill package from Yavira. Read SKILL.md from the extracted folder and install it by following the included instructions. Tell me what you changed and call out any manual steps you could not complete."
        },
        {
          "label": "Upgrade existing",
          "body": "I downloaded an updated skill package from Yavira. Read SKILL.md from the extracted folder, compare it with my current installation, and upgrade it while preserving any custom configuration unless the package docs explicitly say otherwise. Summarize what changed and any follow-up checks I should run."
        }
      ]
    },
    "sourceHealth": {
      "source": "tencent",
      "status": "healthy",
      "reason": "direct_download_ok",
      "recommendedAction": "download",
      "checkedAt": "2026-04-30T16:55:25.780Z",
      "expiresAt": "2026-05-07T16:55:25.780Z",
      "httpStatus": 200,
      "finalUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=network",
      "contentType": "application/zip",
      "probeMethod": "head",
      "details": {
        "probeUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=network",
        "contentDisposition": "attachment; filename=\"network-1.0.0.zip\"",
        "redirectLocation": null,
        "bodySnippet": null
      },
      "scope": "source",
      "summary": "Source download looks usable.",
      "detail": "Yavira can redirect you to the upstream package for this source.",
      "primaryActionLabel": "Download for OpenClaw",
      "primaryActionHref": "/downloads/fundraiseup"
    },
    "validation": {
      "installChecklist": [
        "Use the Yavira download entry.",
        "Review SKILL.md after the package is downloaded.",
        "Confirm the extracted package contains the expected setup assets."
      ],
      "postInstallChecks": [
        "Confirm the extracted package includes the expected docs or setup files.",
        "Validate the skill or prompts are available in your target agent workspace.",
        "Capture any manual follow-up steps the agent could not complete."
      ]
    },
    "downloadPageUrl": "https://openagent3.xyz/downloads/fundraiseup",
    "agentPageUrl": "https://openagent3.xyz/skills/fundraiseup/agent",
    "manifestUrl": "https://openagent3.xyz/skills/fundraiseup/agent.json",
    "briefUrl": "https://openagent3.xyz/skills/fundraiseup/agent.md"
  },
  "agentAssist": {
    "summary": "Hand the extracted package to your coding agent with a concrete install brief instead of figuring it out manually.",
    "steps": [
      "Download the package from Yavira.",
      "Extract it into a folder your agent can access.",
      "Paste one of the prompts below and point your agent at the extracted folder."
    ],
    "prompts": [
      {
        "label": "New install",
        "body": "I downloaded a skill package from Yavira. Read SKILL.md from the extracted folder and install it by following the included instructions. Tell me what you changed and call out any manual steps you could not complete."
      },
      {
        "label": "Upgrade existing",
        "body": "I downloaded an updated skill package from Yavira. Read SKILL.md from the extracted folder, compare it with my current installation, and upgrade it while preserving any custom configuration unless the package docs explicitly say otherwise. Summarize what changed and any follow-up checks I should run."
      }
    ]
  },
  "documentation": {
    "source": "clawhub",
    "primaryDoc": "SKILL.md",
    "sections": [
      {
        "title": "Overview",
        "body": "This skill enables Claude to interact with the FundraiseUp REST API for processing donations, managing recurring plans, retrieving supporter data, and accessing fundraising analytics. FundraiseUp is a digital fundraising platform that allows nonprofits to process donations from various channels."
      },
      {
        "title": "Configuration",
        "body": "Required environment variables:\n\nFUNDRAISEUP_API_KEY - API Key (e.g., ABEDDDD_XSSSHwzZc98KR53CWQeWeclA)"
      },
      {
        "title": "Base URL",
        "body": "https://api.fundraiseup.com/v1"
      },
      {
        "title": "API Key Generation",
        "body": "Go to Dashboard > Settings > API keys\nClick \"Create API key\"\nEnter a descriptive name\nSelect data mode:\n\nLive data: For production use\nTest data: For testing (keys have test_ prefix)\n\n\nSelect permissions:\n\nRetrieve donation data\nCreate new donations\nGenerate Donor Portal access links\n\n\nSave the API key securely (shown only once)"
      },
      {
        "title": "Authentication Header",
        "body": "All API requests must include the Authorization header with Bearer token:\n\nAuthorization: Bearer YOUR_API_KEY"
      },
      {
        "title": "Important Notes",
        "body": "API keys are scoped to specific accounts/subaccounts\nParent account API keys cannot create donations for subaccounts\nOnly Organization Administrators can create API keys\nNever expose API keys publicly"
      },
      {
        "title": "Rate Limits",
        "body": "8 requests per second\n128 requests per minute\nImplement retry logic with exponential backoff for rate limit handling"
      },
      {
        "title": "Required Headers",
        "body": "Content-Type: application/json\nAccept: application/json\nAuthorization: Bearer YOUR_API_KEY"
      },
      {
        "title": "1. Donations",
        "body": "List Donations\n\nEndpoint: GET /donations\n\nDescription: Retrieve all donations with cursor-based pagination.\n\nQuery Parameters:\n\nlimit (optional): Number of records per page (1-100, default: 10)\nstarting_after (optional): Cursor for pagination (donation ID)\nending_before (optional): Cursor for backward pagination (donation ID)\nNote: starting_after and ending_before are mutually exclusive\n\nExample Request:\n\ncurl --request GET \\\n  --url 'https://api.fundraiseup.com/v1/donations?limit=50' \\\n  --header 'Accept: application/json' \\\n  --header 'Authorization: Bearer {{FUNDRAISEUP_API_KEY}}'\n\nResponse Fields:\n\nid: Donation identifier\ncreated_at: ISO 8601 timestamp\nlivemode: Boolean (true for live, false for test)\namount: Donation amount in selected currency\namount_in_default_currency: Amount in organization's default currency\ncurrency: Three-letter ISO code (lowercase)\nstatus: Donation status (e.g., succeeded, pending, failed)\ncampaign: Campaign details (id, code, name)\nsupporter: Supporter information\nrecurring_plan: Recurring plan details (if applicable)\ndesignation: Fund/program designation\ntribute: Tribute information (if provided)\ncustom_fields: Array of custom field values\nprocessing_fee: Processing fee details\nplatform_fee: Platform fee details\nfees_covered: Amount of fees covered by donor\n\nGet Single Donation\n\nEndpoint: GET /donations/{id}\n\nDescription: Retrieve details of a specific donation.\n\nPath Parameters:\n\nid (required): Donation ID\n\nExample Request:\n\ncurl --request GET \\\n  --url 'https://api.fundraiseup.com/v1/donations/DFQLCFEP' \\\n  --header 'Accept: application/json' \\\n  --header 'Authorization: Bearer {{FUNDRAISEUP_API_KEY}}'\n\nCreate Donation\n\nEndpoint: POST /donations\n\nDescription: Create a one-time or recurring donation. API-created donations will have \"API\" as the donation source.\n\nPrerequisites:\n\nStripe account connected to FundraiseUp and activated\nActive campaign with money-based payment method\nAPI key with \"create new donations\" permission\nStripe Payment Method ID (created via Stripe API)\nPCI compliance requirements met\n\nRequest Body:\n\n{\n  \"campaign_id\": \"FUNCPJTZZQR\",\n  \"amount\": \"25.00\",\n  \"currency\": \"usd\",\n  \"payment_method_id\": \"pm_1234567890abcdef\",\n  \"supporter\": {\n    \"first_name\": \"John\",\n    \"last_name\": \"Doe\",\n    \"email\": \"john.doe@example.com\",\n    \"phone\": \"+1234567890\",\n    \"mailing_address\": {\n      \"line1\": \"123 Main St\",\n      \"line2\": \"Apt 4B\",\n      \"city\": \"New York\",\n      \"region\": \"NY\",\n      \"postal_code\": \"10001\",\n      \"country\": \"us\"\n    }\n  },\n  \"recurring_plan\": {\n    \"frequency\": \"monthly\"\n  },\n  \"designation\": [\n    {\n      \"id\": \"EHHJ9R36\"\n    }\n  ],\n  \"tribute\": {\n    \"type\": \"in_honor_of\",\n    \"honoree\": \"Jane Smith\"\n  },\n  \"comment\": \"Monthly donation for general fund\",\n  \"anonymous\": false,\n  \"custom_fields\": [\n    {\n      \"name\": \"referral_source\",\n      \"value\": \"Email Campaign\"\n    }\n  ]\n}\n\nRequired Fields:\n\ncampaign_id: Must belong to the account and be active\namount: Decimal string (e.g., \"9.99\" for USD, \"200\" for JPY), minimum $1 or equivalent\ncurrency: Three-letter ISO code (lowercase)\npayment_method_id: Stripe Payment Method ID\nsupporter.first_name: Up to 256 characters\nsupporter.last_name: Up to 256 characters\nsupporter.email: Valid email address (not verified by API)\nsupporter.phone: Up to 20 characters (required if campaign requires it)\nsupporter.mailing_address: Required if campaign requires it\n\nOptional Fields:\n\nrecurring_plan.frequency: Creates recurring plan (\"monthly\", \"weekly\", \"quarterly\", \"yearly\", \"daily\")\ndesignation: Array of designation IDs\ntribute.type: \"in_honor_of\" or \"in_memory_of\"\ntribute.honoree: Name of person being honored\ncomment: Donation comment\nanonymous: Boolean (default: false)\ncustom_fields: Array of custom field objects\n\nExample Request:\n\ncurl --request POST \\\n  --url 'https://api.fundraiseup.com/v1/donations' \\\n  --header 'Accept: application/json' \\\n  --header 'Authorization: Bearer {{FUNDRAISEUP_API_KEY}}' \\\n  --header 'Content-Type: application/json' \\\n  --data '{\n    \"campaign_id\": \"FUNCPJTZZQR\",\n    \"amount\": \"50.00\",\n    \"currency\": \"usd\",\n    \"payment_method_id\": \"pm_1234567890\",\n    \"supporter\": {\n      \"first_name\": \"Jane\",\n      \"last_name\": \"Smith\",\n      \"email\": \"jane@example.com\"\n    }\n  }'\n\nImportant Notes:\n\nAll string parameters are trimmed; empty strings converted to null\nAddresses and emails are not formatted or verified\nOnly credit card payments are currently supported\nFees may show as 0 initially until Stripe finalizes (use Events endpoint for finalized fees)\n\nUpdate Donation\n\nEndpoint: PATCH /donations/{id}\n\nDescription: Update a donation. Updates only allowed within 24 hours of creation and only for API-created donations.\n\nPath Parameters:\n\nid (required): Donation ID\n\nLimitations:\n\nOnly API-created donations can be updated\nUpdates must occur within 24 hours of creation\nNo bulk updates supported"
      },
      {
        "title": "2. Recurring Plans",
        "body": "List Recurring Plans\n\nEndpoint: GET /recurring_plans\n\nDescription: Retrieve all recurring donation plans.\n\nQuery Parameters:\n\nlimit (optional): Number of records per page (1-100)\nstarting_after (optional): Cursor for pagination\nending_before (optional): Cursor for backward pagination\n\nExample Request:\n\ncurl --request GET \\\n  --url 'https://api.fundraiseup.com/v1/recurring_plans?limit=50' \\\n  --header 'Accept: application/json' \\\n  --header 'Authorization: Bearer {{FUNDRAISEUP_API_KEY}}'\n\nResponse Fields:\n\nid: Recurring plan identifier\ncreated_at: ISO 8601 timestamp\nfrequency: \"monthly\", \"weekly\", \"quarterly\", \"yearly\", or \"daily\"\namount: Recurring donation amount\ncurrency: Three-letter ISO code\nstatus: Plan status (active, paused, canceled)\nnext_installment_at: Next scheduled donation date\nended_at: End date (if set)\ncampaign: Associated campaign details\nsupporter: Supporter information\n\nGet Single Recurring Plan\n\nEndpoint: GET /recurring_plans/{id}\n\nDescription: Retrieve details of a specific recurring plan.\n\nPath Parameters:\n\nid (required): Recurring plan ID\n\nExample Request:\n\ncurl --request GET \\\n  --url 'https://api.fundraiseup.com/v1/recurring_plans/RVSHJNPJ' \\\n  --header 'Accept: application/json' \\\n  --header 'Authorization: Bearer {{FUNDRAISEUP_API_KEY}}'\n\nUpdate Recurring Plan\n\nEndpoint: PATCH /recurring_plans/{id}\n\nDescription: Update a recurring plan. Updates only allowed within 24 hours of creation and only for API-created plans."
      },
      {
        "title": "3. Supporters",
        "body": "List Supporters\n\nEndpoint: GET /supporters\n\nDescription: Retrieve all supporters/donors.\n\nQuery Parameters:\n\nlimit (optional): Number of records per page (1-100)\nstarting_after (optional): Cursor for pagination\nending_before (optional): Cursor for backward pagination\n\nExample Request:\n\ncurl --request GET \\\n  --url 'https://api.fundraiseup.com/v1/supporters?limit=50' \\\n  --header 'Accept: application/json' \\\n  --header 'Authorization: Bearer {{FUNDRAISEUP_API_KEY}}'\n\nResponse Fields:\n\nid: Supporter identifier\ncreated_at: ISO 8601 timestamp\nemail: Email address\nfirst_name: First name\nlast_name: Last name\nphone: Phone number\nmailing_address: Address details\nmailing_list_subscribed: Boolean\nanonymous: Boolean\nemployer: Employer name (if provided)\n\nGet Single Supporter\n\nEndpoint: GET /supporters/{id}\n\nDescription: Retrieve details of a specific supporter.\n\nPath Parameters:\n\nid (required): Supporter ID\n\nExample Request:\n\ncurl --request GET \\\n  --url 'https://api.fundraiseup.com/v1/supporters/SXXXXXXX' \\\n  --header 'Accept: application/json' \\\n  --header 'Authorization: Bearer {{FUNDRAISEUP_API_KEY}}'"
      },
      {
        "title": "4. Events",
        "body": "List Events\n\nEndpoint: GET /events\n\nDescription: Retrieve audit log events for donations, recurring plans, and supporters.\n\nQuery Parameters:\n\nlimit (optional): Number of records per page (1-100)\nstarting_after (optional): Cursor for pagination\nending_before (optional): Cursor for backward pagination\n\nExample Request:\n\ncurl --request GET \\\n  --url 'https://api.fundraiseup.com/v1/events?limit=50' \\\n  --header 'Accept: application/json' \\\n  --header 'Authorization: Bearer {{FUNDRAISEUP_API_KEY}}'\n\nUse Cases:\n\nTrack when fees are finalized (look for donation.success event)\nMonitor status changes\nAudit trail for compliance\nIntegration debugging"
      },
      {
        "title": "5. Campaigns",
        "body": "List Campaigns\n\nEndpoint: GET /campaigns\n\nDescription: Retrieve all campaigns.\n\nQuery Parameters:\n\nlimit (optional): Number of records per page (1-100)\nstarting_after (optional): Cursor for pagination\nending_before (optional): Cursor for backward pagination\n\nExample Request:\n\ncurl --request GET \\\n  --url 'https://api.fundraiseup.com/v1/campaigns' \\\n  --header 'Accept: application/json' \\\n  --header 'Authorization: Bearer {{FUNDRAISEUP_API_KEY}}'\n\nResponse Fields:\n\nid: Campaign identifier\ncode: Campaign code\nname: Campaign name\nstatus: Campaign status\n\nGet Single Campaign\n\nEndpoint: GET /campaigns/{id}\n\nPath Parameters:\n\nid (required): Campaign ID"
      },
      {
        "title": "6. Designations",
        "body": "List Designations\n\nEndpoint: GET /designations\n\nDescription: Retrieve all fund/program designations.\n\nExample Request:\n\ncurl --request GET \\\n  --url 'https://api.fundraiseup.com/v1/designations' \\\n  --header 'Accept: application/json' \\\n  --header 'Authorization: Bearer {{FUNDRAISEUP_API_KEY}}'"
      },
      {
        "title": "7. Donor Portal Access",
        "body": "Generate Supporter Portal Link\n\nEndpoint: POST /donor_portal/access_links/supporters/{id}\n\nDescription: Generate a secure link for a supporter to access their Donor Portal without logging in.\n\nPath Parameters:\n\nid (required): Supporter ID\n\nPrerequisites:\n\nAPI key with \"Generate Donor Portal access links\" permission enabled\n\nExample Request:\n\ncurl --request POST \\\n  --url 'https://api.fundraiseup.com/v1/donor_portal/access_links/supporters/64b0ba9d9a19ea001fa3516a' \\\n  --header 'Accept: application/json' \\\n  --header 'Authorization: Bearer {{FUNDRAISEUP_API_KEY}}'\n\nResponse:\n\n{\n  \"url\": \"https://yourorg.org/login/?auth=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...\"\n}\n\nImportant Security Notes:\n\nLinks are valid for 1 minute only\nShould only be used within Donor Portal context\nNever share via email, SMS, or public channels\nProvides access to sensitive data (payment methods, donation history, receipts)\nValidate supporter ownership before generating links\nImplement automatic redirect (do not require manual action)\n\nGenerate Recurring Plan Portal Link\n\nEndpoint: POST /donor_portal/access_links/recurring_plans/{id}\n\nDescription: Generate a link for a supporter to access a specific recurring plan in the Donor Portal.\n\nPath Parameters:\n\nid (required): Recurring plan ID\n\nOptional Query Parameters:\n\nreturn_url (optional): URL to return to after managing the recurring plan\n\nExample Request:\n\ncurl --request POST \\\n  --url 'https://api.fundraiseup.com/v1/donor_portal/access_links/recurring_plans/RVSHJNPJ' \\\n  --header 'Accept: application/json' \\\n  --header 'Authorization: Bearer {{FUNDRAISEUP_API_KEY}}'\n\nResponse:\n\n{\n  \"url\": \"https://yourorg.org/login/?auth=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...\"\n}"
      },
      {
        "title": "Pagination Best Practices",
        "body": "All list endpoints use cursor-based pagination:\n\nInitial Request: Set limit parameter (1-100)\nNext Page: Use the last item's id in starting_after\nPrevious Page: Use the first item's id in ending_before\nSorting: Records sorted by creation date (newest first), then by ID (Z to A)\n\nExample Pagination Flow:\n\n# Page 1\nGET /donations?limit=50\n\n# Page 2 (use last donation ID from page 1)\nGET /donations?limit=50&starting_after=LAST_DONATION_ID\n\n# Previous page\nGET /donations?limit=50&ending_before=FIRST_DONATION_ID"
      },
      {
        "title": "Standard HTTP Response Codes",
        "body": "200 OK: Successful GET request\n201 Created: Successful POST request\n400 Bad Request: Invalid request parameters\n401 Unauthorized: Missing or invalid API key\n403 Forbidden: Insufficient permissions\n404 Not Found: Resource not found\n429 Too Many Requests: Rate limit exceeded\n500 Internal Server Error: Server error"
      },
      {
        "title": "Best Practices",
        "body": "Implement exponential backoff for rate limits\nLog all API errors with request details\nValidate data before sending to API\nHandle null values gracefully\nCheck for finalized fees using Events endpoint"
      },
      {
        "title": "Python Example",
        "body": "import requests\nimport os\n\nAPI_KEY = os.environ.get('FUNDRAISEUP_API_KEY')\nBASE_URL = 'https://api.fundraiseup.com/v1'\n\nheaders = {\n    'Authorization': f'Bearer {API_KEY}',\n    'Accept': 'application/json',\n    'Content-Type': 'application/json'\n}\n\n# List donations\ndef get_donations(limit=50):\n    url = f'{BASE_URL}/donations'\n    params = {'limit': limit}\n    response = requests.get(url, headers=headers, params=params)\n    response.raise_for_status()\n    return response.json()\n\n# Create donation\ndef create_donation(campaign_id, amount, currency, payment_method_id, supporter):\n    url = f'{BASE_URL}/donations'\n    data = {\n        'campaign_id': campaign_id,\n        'amount': str(amount),\n        'currency': currency,\n        'payment_method_id': payment_method_id,\n        'supporter': supporter\n    }\n    response = requests.post(url, headers=headers, json=data)\n    response.raise_for_status()\n    return response.json()\n\n# Get single donation\ndef get_donation(donation_id):\n    url = f'{BASE_URL}/donations/{donation_id}'\n    response = requests.get(url, headers=headers)\n    response.raise_for_status()\n    return response.json()"
      },
      {
        "title": "Node.js Example",
        "body": "const axios = require('axios');\n\nconst API_KEY = process.env.FUNDRAISEUP_API_KEY;\nconst BASE_URL = 'https://api.fundraiseup.com/v1';\n\nconst headers = {\n  'Authorization': `Bearer ${API_KEY}`,\n  'Accept': 'application/json',\n  'Content-Type': 'application/json'\n};\n\n// List donations\nasync function getDonations(limit = 50) {\n  const response = await axios.get(`${BASE_URL}/donations`, {\n    headers,\n    params: { limit }\n  });\n  return response.data;\n}\n\n// Create donation\nasync function createDonation(campaignId, amount, currency, paymentMethodId, supporter) {\n  const response = await axios.post(`${BASE_URL}/donations`, {\n    campaign_id: campaignId,\n    amount: amount.toString(),\n    currency,\n    payment_method_id: paymentMethodId,\n    supporter\n  }, { headers });\n  return response.data;\n}\n\n// Get single donation\nasync function getDonation(donationId) {\n  const response = await axios.get(`${BASE_URL}/donations/${donationId}`, { headers });\n  return response.data;\n}"
      },
      {
        "title": "cURL Example with Environment Variable",
        "body": "# Set your API key as environment variable\nexport FUNDRAISEUP_API_KEY=\"your_api_key_here\"\n\n# List donations\ncurl --request GET \\\n  --url 'https://api.fundraiseup.com/v1/donations?limit=50' \\\n  --header \"Accept: application/json\" \\\n  --header \"Authorization: Bearer $FUNDRAISEUP_API_KEY\"\n\n# Create donation\ncurl --request POST \\\n  --url 'https://api.fundraiseup.com/v1/donations' \\\n  --header \"Accept: application/json\" \\\n  --header \"Authorization: Bearer $FUNDRAISEUP_API_KEY\" \\\n  --header \"Content-Type: application/json\" \\\n  --data '{\n    \"campaign_id\": \"FUNCPJTZZQR\",\n    \"amount\": \"25.00\",\n    \"currency\": \"usd\",\n    \"payment_method_id\": \"pm_1234567890\",\n    \"supporter\": {\n      \"first_name\": \"John\",\n      \"last_name\": \"Doe\",\n      \"email\": \"john@example.com\"\n    }\n  }'\n\n# Get single donation\ncurl --request GET \\\n  --url \"https://api.fundraiseup.com/v1/donations/DFQLCFEP\" \\\n  --header \"Accept: application/json\" \\\n  --header \"Authorization: Bearer $FUNDRAISEUP_API_KEY\""
      },
      {
        "title": "Test Mode",
        "body": "Generate API keys with \"Test data\" mode\nTest keys have test_ prefix\nTest mode data doesn't affect live data or banking networks\nUse test Stripe Payment Methods for creating test donations"
      },
      {
        "title": "URL Parameter for Testing",
        "body": "Add fundraiseupLivemode=no to any URL for testing without processing real donations"
      },
      {
        "title": "Historical Data Sync",
        "body": "Use limit parameter to fetch batches (recommended: 50-100)\nUse starting_after with last record ID for next batch\nProcess batches sequentially\nImplement error handling and retry logic"
      },
      {
        "title": "Real-time Polling",
        "body": "Poll API at regular intervals (respect rate limits)\nUse Events endpoint to track changes\nStore last processed record ID\nUse starting_after to get only new records"
      },
      {
        "title": "Event-Based Integration",
        "body": "Use Zapier for event triggers (FundraiseUp doesn't support direct webhooks)\nConfigure Zapier to trigger on FundraiseUp events\nTrigger sync jobs in your system based on events"
      },
      {
        "title": "Common Use Cases",
        "body": "Processing Offline Donations\n\nFace-to-face fundraising\nDirect mail donations\nTelethon pledges\nEvent registrations\n\n\n\nCRM Integration\n\nSync donation data to CRM (Salesforce, HubSpot, etc.)\nUpdate supporter records\nTrack recurring plans\nGenerate reports\n\n\n\nAnalytics and Reporting\n\nExport donation data for BI tools\nTrack campaign performance\nAnalyze donor behavior\nCalculate lifetime value\n\n\n\nDonor Portal Integration\n\nSeamless authentication from custom portals\nDirect access to recurring plan management\nSingle sign-on experience"
      },
      {
        "title": "Security Best Practices",
        "body": "API Key Management\n\nStore API keys in environment variables (never hardcode)\nUse separate keys for different integrations\nRotate keys periodically\nRevoke compromised keys immediately\n\n\n\nHTTPS Only\n\nAll requests must use HTTPS\nHTTP requests are rejected\n\n\n\nData Validation\n\nValidate all input before sending to API\nSanitize user-provided data\nCheck response data before processing\n\n\n\nPCI Compliance\n\nNever handle raw card data in your application\nUse Stripe Payment Methods API for card processing\nMeet PCI DSS requirements (SAQ D for direct API integration)\nConsider using Stripe Elements to reduce PCI scope\n\n\n\nDonor Portal Security\n\nValidate supporter ownership before generating access links\nUse automatic redirects (never manual links)\nNever share access links via email or public channels\nAccess links expire in 1 minute"
      },
      {
        "title": "Limitations and Considerations",
        "body": "Payment Methods: Currently only credit cards are supported\nUpdates: Only allowed within 24 hours of creation, only for API-created records\nBulk Operations: No bulk update support\nWebhooks: Direct webhooks not supported (use Zapier for events)\nSubaccounts: Parent API keys cannot create donations for subaccounts\nFee Calculations: Fees may be 0 initially; use Events endpoint for finalized fees\nAddress Validation: API does not format or verify addresses\nEmail Validation: API does not verify email addresses\nMigration: REST API is not a migration mechanism (use Migration service)"
      },
      {
        "title": "Additional Resources",
        "body": "Official Documentation: https://fundraiseup.com/docs/rest-api/\nAPI Resources: https://fundraiseup.com/docs/rest-api-resources/\nDonor Portal Integration: https://fundraiseup.com/docs/seamless-donor-portal/\nSupport: https://fundraiseup.com/support/"
      },
      {
        "title": "Common Issues",
        "body": "401 Unauthorized\n\nCheck API key is correct and active\nVerify Authorization header format\nEnsure API key has required permissions\n\n429 Rate Limit Exceeded\n\nImplement exponential backoff\nReduce request frequency\nBatch operations where possible\n\n400 Bad Request\n\nValidate all required fields are present\nCheck data types and formats\nEnsure currency codes are lowercase\nVerify amount format (decimal string)\n\nFees Showing as 0\n\nFees are finalized asynchronously\nUse Events endpoint to get finalized fees\nLook for donation.success event\n\nCannot Update Donation\n\nVerify donation was created via API\nEnsure update is within 24 hours\nCheck API key permissions"
      },
      {
        "title": "Version Information",
        "body": "API Version: v1\nLast Updated: February 2026\nSupported Payment Methods: Credit Card only"
      }
    ],
    "body": "FundraiseUp API Skill\nOverview\n\nThis skill enables Claude to interact with the FundraiseUp REST API for processing donations, managing recurring plans, retrieving supporter data, and accessing fundraising analytics. FundraiseUp is a digital fundraising platform that allows nonprofits to process donations from various channels.\n\nConfiguration\n\nRequired environment variables:\n\nFUNDRAISEUP_API_KEY - API Key (e.g., ABEDDDD_XSSSHwzZc98KR53CWQeWeclA)\n\nBase URL\nhttps://api.fundraiseup.com/v1\n\nAuthentication\nAPI Key Generation\nGo to Dashboard > Settings > API keys\nClick \"Create API key\"\nEnter a descriptive name\nSelect data mode:\nLive data: For production use\nTest data: For testing (keys have test_ prefix)\nSelect permissions:\nRetrieve donation data\nCreate new donations\nGenerate Donor Portal access links\nSave the API key securely (shown only once)\nAuthentication Header\n\nAll API requests must include the Authorization header with Bearer token:\n\nAuthorization: Bearer YOUR_API_KEY\n\nImportant Notes\nAPI keys are scoped to specific accounts/subaccounts\nParent account API keys cannot create donations for subaccounts\nOnly Organization Administrators can create API keys\nNever expose API keys publicly\nRate Limits\n8 requests per second\n128 requests per minute\nImplement retry logic with exponential backoff for rate limit handling\nRequired Headers\nContent-Type: application/json\nAccept: application/json\nAuthorization: Bearer YOUR_API_KEY\n\nAPI Endpoints\n1. Donations\nList Donations\n\nEndpoint: GET /donations\n\nDescription: Retrieve all donations with cursor-based pagination.\n\nQuery Parameters:\n\nlimit (optional): Number of records per page (1-100, default: 10)\nstarting_after (optional): Cursor for pagination (donation ID)\nending_before (optional): Cursor for backward pagination (donation ID)\nNote: starting_after and ending_before are mutually exclusive\n\nExample Request:\n\ncurl --request GET \\\n  --url 'https://api.fundraiseup.com/v1/donations?limit=50' \\\n  --header 'Accept: application/json' \\\n  --header 'Authorization: Bearer {{FUNDRAISEUP_API_KEY}}'\n\n\nResponse Fields:\n\nid: Donation identifier\ncreated_at: ISO 8601 timestamp\nlivemode: Boolean (true for live, false for test)\namount: Donation amount in selected currency\namount_in_default_currency: Amount in organization's default currency\ncurrency: Three-letter ISO code (lowercase)\nstatus: Donation status (e.g., succeeded, pending, failed)\ncampaign: Campaign details (id, code, name)\nsupporter: Supporter information\nrecurring_plan: Recurring plan details (if applicable)\ndesignation: Fund/program designation\ntribute: Tribute information (if provided)\ncustom_fields: Array of custom field values\nprocessing_fee: Processing fee details\nplatform_fee: Platform fee details\nfees_covered: Amount of fees covered by donor\nGet Single Donation\n\nEndpoint: GET /donations/{id}\n\nDescription: Retrieve details of a specific donation.\n\nPath Parameters:\n\nid (required): Donation ID\n\nExample Request:\n\ncurl --request GET \\\n  --url 'https://api.fundraiseup.com/v1/donations/DFQLCFEP' \\\n  --header 'Accept: application/json' \\\n  --header 'Authorization: Bearer {{FUNDRAISEUP_API_KEY}}'\n\nCreate Donation\n\nEndpoint: POST /donations\n\nDescription: Create a one-time or recurring donation. API-created donations will have \"API\" as the donation source.\n\nPrerequisites:\n\nStripe account connected to FundraiseUp and activated\nActive campaign with money-based payment method\nAPI key with \"create new donations\" permission\nStripe Payment Method ID (created via Stripe API)\nPCI compliance requirements met\n\nRequest Body:\n\n{\n  \"campaign_id\": \"FUNCPJTZZQR\",\n  \"amount\": \"25.00\",\n  \"currency\": \"usd\",\n  \"payment_method_id\": \"pm_1234567890abcdef\",\n  \"supporter\": {\n    \"first_name\": \"John\",\n    \"last_name\": \"Doe\",\n    \"email\": \"john.doe@example.com\",\n    \"phone\": \"+1234567890\",\n    \"mailing_address\": {\n      \"line1\": \"123 Main St\",\n      \"line2\": \"Apt 4B\",\n      \"city\": \"New York\",\n      \"region\": \"NY\",\n      \"postal_code\": \"10001\",\n      \"country\": \"us\"\n    }\n  },\n  \"recurring_plan\": {\n    \"frequency\": \"monthly\"\n  },\n  \"designation\": [\n    {\n      \"id\": \"EHHJ9R36\"\n    }\n  ],\n  \"tribute\": {\n    \"type\": \"in_honor_of\",\n    \"honoree\": \"Jane Smith\"\n  },\n  \"comment\": \"Monthly donation for general fund\",\n  \"anonymous\": false,\n  \"custom_fields\": [\n    {\n      \"name\": \"referral_source\",\n      \"value\": \"Email Campaign\"\n    }\n  ]\n}\n\n\nRequired Fields:\n\ncampaign_id: Must belong to the account and be active\namount: Decimal string (e.g., \"9.99\" for USD, \"200\" for JPY), minimum $1 or equivalent\ncurrency: Three-letter ISO code (lowercase)\npayment_method_id: Stripe Payment Method ID\nsupporter.first_name: Up to 256 characters\nsupporter.last_name: Up to 256 characters\nsupporter.email: Valid email address (not verified by API)\nsupporter.phone: Up to 20 characters (required if campaign requires it)\nsupporter.mailing_address: Required if campaign requires it\n\nOptional Fields:\n\nrecurring_plan.frequency: Creates recurring plan (\"monthly\", \"weekly\", \"quarterly\", \"yearly\", \"daily\")\ndesignation: Array of designation IDs\ntribute.type: \"in_honor_of\" or \"in_memory_of\"\ntribute.honoree: Name of person being honored\ncomment: Donation comment\nanonymous: Boolean (default: false)\ncustom_fields: Array of custom field objects\n\nExample Request:\n\ncurl --request POST \\\n  --url 'https://api.fundraiseup.com/v1/donations' \\\n  --header 'Accept: application/json' \\\n  --header 'Authorization: Bearer {{FUNDRAISEUP_API_KEY}}' \\\n  --header 'Content-Type: application/json' \\\n  --data '{\n    \"campaign_id\": \"FUNCPJTZZQR\",\n    \"amount\": \"50.00\",\n    \"currency\": \"usd\",\n    \"payment_method_id\": \"pm_1234567890\",\n    \"supporter\": {\n      \"first_name\": \"Jane\",\n      \"last_name\": \"Smith\",\n      \"email\": \"jane@example.com\"\n    }\n  }'\n\n\nImportant Notes:\n\nAll string parameters are trimmed; empty strings converted to null\nAddresses and emails are not formatted or verified\nOnly credit card payments are currently supported\nFees may show as 0 initially until Stripe finalizes (use Events endpoint for finalized fees)\nUpdate Donation\n\nEndpoint: PATCH /donations/{id}\n\nDescription: Update a donation. Updates only allowed within 24 hours of creation and only for API-created donations.\n\nPath Parameters:\n\nid (required): Donation ID\n\nLimitations:\n\nOnly API-created donations can be updated\nUpdates must occur within 24 hours of creation\nNo bulk updates supported\n2. Recurring Plans\nList Recurring Plans\n\nEndpoint: GET /recurring_plans\n\nDescription: Retrieve all recurring donation plans.\n\nQuery Parameters:\n\nlimit (optional): Number of records per page (1-100)\nstarting_after (optional): Cursor for pagination\nending_before (optional): Cursor for backward pagination\n\nExample Request:\n\ncurl --request GET \\\n  --url 'https://api.fundraiseup.com/v1/recurring_plans?limit=50' \\\n  --header 'Accept: application/json' \\\n  --header 'Authorization: Bearer {{FUNDRAISEUP_API_KEY}}'\n\n\nResponse Fields:\n\nid: Recurring plan identifier\ncreated_at: ISO 8601 timestamp\nfrequency: \"monthly\", \"weekly\", \"quarterly\", \"yearly\", or \"daily\"\namount: Recurring donation amount\ncurrency: Three-letter ISO code\nstatus: Plan status (active, paused, canceled)\nnext_installment_at: Next scheduled donation date\nended_at: End date (if set)\ncampaign: Associated campaign details\nsupporter: Supporter information\nGet Single Recurring Plan\n\nEndpoint: GET /recurring_plans/{id}\n\nDescription: Retrieve details of a specific recurring plan.\n\nPath Parameters:\n\nid (required): Recurring plan ID\n\nExample Request:\n\ncurl --request GET \\\n  --url 'https://api.fundraiseup.com/v1/recurring_plans/RVSHJNPJ' \\\n  --header 'Accept: application/json' \\\n  --header 'Authorization: Bearer {{FUNDRAISEUP_API_KEY}}'\n\nUpdate Recurring Plan\n\nEndpoint: PATCH /recurring_plans/{id}\n\nDescription: Update a recurring plan. Updates only allowed within 24 hours of creation and only for API-created plans.\n\n3. Supporters\nList Supporters\n\nEndpoint: GET /supporters\n\nDescription: Retrieve all supporters/donors.\n\nQuery Parameters:\n\nlimit (optional): Number of records per page (1-100)\nstarting_after (optional): Cursor for pagination\nending_before (optional): Cursor for backward pagination\n\nExample Request:\n\ncurl --request GET \\\n  --url 'https://api.fundraiseup.com/v1/supporters?limit=50' \\\n  --header 'Accept: application/json' \\\n  --header 'Authorization: Bearer {{FUNDRAISEUP_API_KEY}}'\n\n\nResponse Fields:\n\nid: Supporter identifier\ncreated_at: ISO 8601 timestamp\nemail: Email address\nfirst_name: First name\nlast_name: Last name\nphone: Phone number\nmailing_address: Address details\nmailing_list_subscribed: Boolean\nanonymous: Boolean\nemployer: Employer name (if provided)\nGet Single Supporter\n\nEndpoint: GET /supporters/{id}\n\nDescription: Retrieve details of a specific supporter.\n\nPath Parameters:\n\nid (required): Supporter ID\n\nExample Request:\n\ncurl --request GET \\\n  --url 'https://api.fundraiseup.com/v1/supporters/SXXXXXXX' \\\n  --header 'Accept: application/json' \\\n  --header 'Authorization: Bearer {{FUNDRAISEUP_API_KEY}}'\n\n4. Events\nList Events\n\nEndpoint: GET /events\n\nDescription: Retrieve audit log events for donations, recurring plans, and supporters.\n\nQuery Parameters:\n\nlimit (optional): Number of records per page (1-100)\nstarting_after (optional): Cursor for pagination\nending_before (optional): Cursor for backward pagination\n\nExample Request:\n\ncurl --request GET \\\n  --url 'https://api.fundraiseup.com/v1/events?limit=50' \\\n  --header 'Accept: application/json' \\\n  --header 'Authorization: Bearer {{FUNDRAISEUP_API_KEY}}'\n\n\nUse Cases:\n\nTrack when fees are finalized (look for donation.success event)\nMonitor status changes\nAudit trail for compliance\nIntegration debugging\n5. Campaigns\nList Campaigns\n\nEndpoint: GET /campaigns\n\nDescription: Retrieve all campaigns.\n\nQuery Parameters:\n\nlimit (optional): Number of records per page (1-100)\nstarting_after (optional): Cursor for pagination\nending_before (optional): Cursor for backward pagination\n\nExample Request:\n\ncurl --request GET \\\n  --url 'https://api.fundraiseup.com/v1/campaigns' \\\n  --header 'Accept: application/json' \\\n  --header 'Authorization: Bearer {{FUNDRAISEUP_API_KEY}}'\n\n\nResponse Fields:\n\nid: Campaign identifier\ncode: Campaign code\nname: Campaign name\nstatus: Campaign status\nGet Single Campaign\n\nEndpoint: GET /campaigns/{id}\n\nPath Parameters:\n\nid (required): Campaign ID\n6. Designations\nList Designations\n\nEndpoint: GET /designations\n\nDescription: Retrieve all fund/program designations.\n\nExample Request:\n\ncurl --request GET \\\n  --url 'https://api.fundraiseup.com/v1/designations' \\\n  --header 'Accept: application/json' \\\n  --header 'Authorization: Bearer {{FUNDRAISEUP_API_KEY}}'\n\n7. Donor Portal Access\nGenerate Supporter Portal Link\n\nEndpoint: POST /donor_portal/access_links/supporters/{id}\n\nDescription: Generate a secure link for a supporter to access their Donor Portal without logging in.\n\nPath Parameters:\n\nid (required): Supporter ID\n\nPrerequisites:\n\nAPI key with \"Generate Donor Portal access links\" permission enabled\n\nExample Request:\n\ncurl --request POST \\\n  --url 'https://api.fundraiseup.com/v1/donor_portal/access_links/supporters/64b0ba9d9a19ea001fa3516a' \\\n  --header 'Accept: application/json' \\\n  --header 'Authorization: Bearer {{FUNDRAISEUP_API_KEY}}'\n\n\nResponse:\n\n{\n  \"url\": \"https://yourorg.org/login/?auth=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...\"\n}\n\n\nImportant Security Notes:\n\nLinks are valid for 1 minute only\nShould only be used within Donor Portal context\nNever share via email, SMS, or public channels\nProvides access to sensitive data (payment methods, donation history, receipts)\nValidate supporter ownership before generating links\nImplement automatic redirect (do not require manual action)\nGenerate Recurring Plan Portal Link\n\nEndpoint: POST /donor_portal/access_links/recurring_plans/{id}\n\nDescription: Generate a link for a supporter to access a specific recurring plan in the Donor Portal.\n\nPath Parameters:\n\nid (required): Recurring plan ID\n\nOptional Query Parameters:\n\nreturn_url (optional): URL to return to after managing the recurring plan\n\nExample Request:\n\ncurl --request POST \\\n  --url 'https://api.fundraiseup.com/v1/donor_portal/access_links/recurring_plans/RVSHJNPJ' \\\n  --header 'Accept: application/json' \\\n  --header 'Authorization: Bearer {{FUNDRAISEUP_API_KEY}}'\n\n\nResponse:\n\n{\n  \"url\": \"https://yourorg.org/login/?auth=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...\"\n}\n\nPagination Best Practices\n\nAll list endpoints use cursor-based pagination:\n\nInitial Request: Set limit parameter (1-100)\nNext Page: Use the last item's id in starting_after\nPrevious Page: Use the first item's id in ending_before\nSorting: Records sorted by creation date (newest first), then by ID (Z to A)\n\nExample Pagination Flow:\n\n# Page 1\nGET /donations?limit=50\n\n# Page 2 (use last donation ID from page 1)\nGET /donations?limit=50&starting_after=LAST_DONATION_ID\n\n# Previous page\nGET /donations?limit=50&ending_before=FIRST_DONATION_ID\n\nError Handling\nStandard HTTP Response Codes\n200 OK: Successful GET request\n201 Created: Successful POST request\n400 Bad Request: Invalid request parameters\n401 Unauthorized: Missing or invalid API key\n403 Forbidden: Insufficient permissions\n404 Not Found: Resource not found\n429 Too Many Requests: Rate limit exceeded\n500 Internal Server Error: Server error\nBest Practices\nImplement exponential backoff for rate limits\nLog all API errors with request details\nValidate data before sending to API\nHandle null values gracefully\nCheck for finalized fees using Events endpoint\nCode Examples\nPython Example\nimport requests\nimport os\n\nAPI_KEY = os.environ.get('FUNDRAISEUP_API_KEY')\nBASE_URL = 'https://api.fundraiseup.com/v1'\n\nheaders = {\n    'Authorization': f'Bearer {API_KEY}',\n    'Accept': 'application/json',\n    'Content-Type': 'application/json'\n}\n\n# List donations\ndef get_donations(limit=50):\n    url = f'{BASE_URL}/donations'\n    params = {'limit': limit}\n    response = requests.get(url, headers=headers, params=params)\n    response.raise_for_status()\n    return response.json()\n\n# Create donation\ndef create_donation(campaign_id, amount, currency, payment_method_id, supporter):\n    url = f'{BASE_URL}/donations'\n    data = {\n        'campaign_id': campaign_id,\n        'amount': str(amount),\n        'currency': currency,\n        'payment_method_id': payment_method_id,\n        'supporter': supporter\n    }\n    response = requests.post(url, headers=headers, json=data)\n    response.raise_for_status()\n    return response.json()\n\n# Get single donation\ndef get_donation(donation_id):\n    url = f'{BASE_URL}/donations/{donation_id}'\n    response = requests.get(url, headers=headers)\n    response.raise_for_status()\n    return response.json()\n\nNode.js Example\nconst axios = require('axios');\n\nconst API_KEY = process.env.FUNDRAISEUP_API_KEY;\nconst BASE_URL = 'https://api.fundraiseup.com/v1';\n\nconst headers = {\n  'Authorization': `Bearer ${API_KEY}`,\n  'Accept': 'application/json',\n  'Content-Type': 'application/json'\n};\n\n// List donations\nasync function getDonations(limit = 50) {\n  const response = await axios.get(`${BASE_URL}/donations`, {\n    headers,\n    params: { limit }\n  });\n  return response.data;\n}\n\n// Create donation\nasync function createDonation(campaignId, amount, currency, paymentMethodId, supporter) {\n  const response = await axios.post(`${BASE_URL}/donations`, {\n    campaign_id: campaignId,\n    amount: amount.toString(),\n    currency,\n    payment_method_id: paymentMethodId,\n    supporter\n  }, { headers });\n  return response.data;\n}\n\n// Get single donation\nasync function getDonation(donationId) {\n  const response = await axios.get(`${BASE_URL}/donations/${donationId}`, { headers });\n  return response.data;\n}\n\ncURL Example with Environment Variable\n# Set your API key as environment variable\nexport FUNDRAISEUP_API_KEY=\"your_api_key_here\"\n\n# List donations\ncurl --request GET \\\n  --url 'https://api.fundraiseup.com/v1/donations?limit=50' \\\n  --header \"Accept: application/json\" \\\n  --header \"Authorization: Bearer $FUNDRAISEUP_API_KEY\"\n\n# Create donation\ncurl --request POST \\\n  --url 'https://api.fundraiseup.com/v1/donations' \\\n  --header \"Accept: application/json\" \\\n  --header \"Authorization: Bearer $FUNDRAISEUP_API_KEY\" \\\n  --header \"Content-Type: application/json\" \\\n  --data '{\n    \"campaign_id\": \"FUNCPJTZZQR\",\n    \"amount\": \"25.00\",\n    \"currency\": \"usd\",\n    \"payment_method_id\": \"pm_1234567890\",\n    \"supporter\": {\n      \"first_name\": \"John\",\n      \"last_name\": \"Doe\",\n      \"email\": \"john@example.com\"\n    }\n  }'\n\n# Get single donation\ncurl --request GET \\\n  --url \"https://api.fundraiseup.com/v1/donations/DFQLCFEP\" \\\n  --header \"Accept: application/json\" \\\n  --header \"Authorization: Bearer $FUNDRAISEUP_API_KEY\"\n\nTesting\nTest Mode\nGenerate API keys with \"Test data\" mode\nTest keys have test_ prefix\nTest mode data doesn't affect live data or banking networks\nUse test Stripe Payment Methods for creating test donations\nURL Parameter for Testing\n\nAdd fundraiseupLivemode=no to any URL for testing without processing real donations\n\nIntegration Patterns\nHistorical Data Sync\nUse limit parameter to fetch batches (recommended: 50-100)\nUse starting_after with last record ID for next batch\nProcess batches sequentially\nImplement error handling and retry logic\nReal-time Polling\nPoll API at regular intervals (respect rate limits)\nUse Events endpoint to track changes\nStore last processed record ID\nUse starting_after to get only new records\nEvent-Based Integration\nUse Zapier for event triggers (FundraiseUp doesn't support direct webhooks)\nConfigure Zapier to trigger on FundraiseUp events\nTrigger sync jobs in your system based on events\nCommon Use Cases\n\nProcessing Offline Donations\n\nFace-to-face fundraising\nDirect mail donations\nTelethon pledges\nEvent registrations\n\nCRM Integration\n\nSync donation data to CRM (Salesforce, HubSpot, etc.)\nUpdate supporter records\nTrack recurring plans\nGenerate reports\n\nAnalytics and Reporting\n\nExport donation data for BI tools\nTrack campaign performance\nAnalyze donor behavior\nCalculate lifetime value\n\nDonor Portal Integration\n\nSeamless authentication from custom portals\nDirect access to recurring plan management\nSingle sign-on experience\nSecurity Best Practices\n\nAPI Key Management\n\nStore API keys in environment variables (never hardcode)\nUse separate keys for different integrations\nRotate keys periodically\nRevoke compromised keys immediately\n\nHTTPS Only\n\nAll requests must use HTTPS\nHTTP requests are rejected\n\nData Validation\n\nValidate all input before sending to API\nSanitize user-provided data\nCheck response data before processing\n\nPCI Compliance\n\nNever handle raw card data in your application\nUse Stripe Payment Methods API for card processing\nMeet PCI DSS requirements (SAQ D for direct API integration)\nConsider using Stripe Elements to reduce PCI scope\n\nDonor Portal Security\n\nValidate supporter ownership before generating access links\nUse automatic redirects (never manual links)\nNever share access links via email or public channels\nAccess links expire in 1 minute\nLimitations and Considerations\nPayment Methods: Currently only credit cards are supported\nUpdates: Only allowed within 24 hours of creation, only for API-created records\nBulk Operations: No bulk update support\nWebhooks: Direct webhooks not supported (use Zapier for events)\nSubaccounts: Parent API keys cannot create donations for subaccounts\nFee Calculations: Fees may be 0 initially; use Events endpoint for finalized fees\nAddress Validation: API does not format or verify addresses\nEmail Validation: API does not verify email addresses\nMigration: REST API is not a migration mechanism (use Migration service)\nAdditional Resources\nOfficial Documentation: https://fundraiseup.com/docs/rest-api/\nAPI Resources: https://fundraiseup.com/docs/rest-api-resources/\nDonor Portal Integration: https://fundraiseup.com/docs/seamless-donor-portal/\nSupport: https://fundraiseup.com/support/\nTroubleshooting\nCommon Issues\n\n401 Unauthorized\n\nCheck API key is correct and active\nVerify Authorization header format\nEnsure API key has required permissions\n\n429 Rate Limit Exceeded\n\nImplement exponential backoff\nReduce request frequency\nBatch operations where possible\n\n400 Bad Request\n\nValidate all required fields are present\nCheck data types and formats\nEnsure currency codes are lowercase\nVerify amount format (decimal string)\n\nFees Showing as 0\n\nFees are finalized asynchronously\nUse Events endpoint to get finalized fees\nLook for donation.success event\n\nCannot Update Donation\n\nVerify donation was created via API\nEnsure update is within 24 hours\nCheck API key permissions\nVersion Information\nAPI Version: v1\nLast Updated: February 2026\nSupported Payment Methods: Credit Card only"
  },
  "trust": {
    "sourceLabel": "tencent",
    "provenanceUrl": "https://clawhub.ai/Aamish99/fundraiseup",
    "publisherUrl": "https://clawhub.ai/Aamish99/fundraiseup",
    "owner": "Aamish99",
    "version": "1.0.1",
    "license": null,
    "verificationStatus": "Indexed source record"
  },
  "links": {
    "detailUrl": "https://openagent3.xyz/skills/fundraiseup",
    "downloadUrl": "https://openagent3.xyz/downloads/fundraiseup",
    "agentUrl": "https://openagent3.xyz/skills/fundraiseup/agent",
    "manifestUrl": "https://openagent3.xyz/skills/fundraiseup/agent.json",
    "briefUrl": "https://openagent3.xyz/skills/fundraiseup/agent.md"
  }
}