{"skill":{"slug":"find-funding-opportunities","displayName":"Find Funding Opportunities","summary":"Search the Karma Funding Map for funding programs (grants, hackathons, bounties, accelerators, VC funds, RFPs) via the public API. Use when user says \"find g...","description":"---\nname: find-funding-opportunities\ndescription: Search the Karma Funding Map for funding programs (grants, hackathons, bounties, accelerators, VC funds, RFPs) via the public API. Use when user says \"find grants\", \"search hackathons\", \"look for bounties\", \"explore funding\", \"programs on Optimism\", \"what can I apply to\", \"funding opportunities\", or asks about programs over or under a budget.\nversion: 1.2.0\ntags: [programs, search, funding, discovery]\nmetadata:\n  author: Karma\n  category: discovery\n---\n\n# Funding Program Finder\n\nSearch the Karma Funding Map for funding programs via the public API.\n\nThe registry has 6 program types: grants, hackathons, bounties, accelerators, VC funds, and RFPs. Use \"programs\" / \"opportunities\" / \"funding\" — not just \"grants\".\n\nFor full API parameters, response shape, and known values, see [references/api-reference.md](references/api-reference.md).\n\n## Workflow\n\n### Step 1: Map the User's Request\n\n| User says | Maps to |\n|-----------|---------|\n| \"Ethereum programs\" | `ecosystems=Ethereum` + ecosystem search strategy |\n| \"hackathons\" | `type=hackathon` |\n| \"hackathons on Ethereum\" | `type=hackathon` + ecosystem search strategy |\n| \"bounties on Solana\" | `type=bounty` + ecosystem search strategy |\n| \"bounties over $500\" | `type=bounty&minGrantSize=500` |\n| \"accelerator programs\" | `type=accelerator` |\n| \"VCs investing in DeFi\" | `type=vc_fund&name=DeFi` |\n| \"open RFPs from Optimism\" | `type=rfp&organization=Optimism` |\n| \"grants and hackathons on Ethereum\" | `type=grant,hackathon` + ecosystem search strategy |\n| \"DeFi funding on Optimism\" | `name=DeFi` + ecosystem search strategy |\n| \"programs over $50K\" | `minGrantSize=50000` |\n| \"funding under $100K\" | `maxGrantSize=100000` |\n| \"infrastructure\" | `name=infrastructure` |\n| \"active programs\" | `status=active` |\n| \"retroactive funding on Optimism\" | `categories=Retroactive%20Funding` + ecosystem search strategy |\n| \"programs on Karma\" | `onlyOnKarma=true` |\n| \"what's closing this week\" | `sortField=endsAt&sortOrder=asc&status=active` |\n| (no query) | Ask what they're looking for |\n\nBudget shorthand: K→000, M→000000 (e.g., $50K → 50000, $1M → 1000000).\n\n**URL encoding:** Values with spaces must be percent-encoded in `curl` URLs (e.g., `categories=Retroactive%20Funding`).\n\n### Step 2: Ecosystem Search Strategy\n\nIf the query has **no ecosystem** component, skip this step and go to Step 3.\n\nThe `ecosystems` metadata field is often empty — many programs are linked to an ecosystem only via the `communities` field. Use a two-phase approach:\n\n**Phase 1 — Try `ecosystems=` first:**\nQuery with `ecosystems={name}`. If this returns sufficient results (5+), present them and move to Step 4.\n\n**Phase 2 — Enrich with community lookup (only if Phase 1 is sparse):**\nIf Phase 1 returned fewer than 5 results, run these two additional queries and merge:\n1. **Community UID lookup**: fetch all communities from `GET /v2/communities?limit=100`, find the best match by comparing against community names (case-insensitive, partial match), then query with `communityUid={uid}`\n2. **`name={name}`** — text search on title, universal fallback\n\nDeduplicate all merged results by `id` before presenting.\n\n### Step 3: Build and Execute the Request\n\nUse `curl` via Bash. **CRITICAL: Every request must include the tracking headers below. Never omit them.**\n\nBefore the first request, generate a tracking ID:\n\n```bash\nINVOCATION_ID=$(uuidgen)\n```\n\nEvery `curl` call must include these query defaults and tracking headers (see [references/api-reference.md](references/api-reference.md) for details):\n\n```\n# Query defaults (override sortField=endsAt&sortOrder=asc for deadline queries)\nisValid=accepted&limit=10&sortField=updatedAt&sortOrder=desc\n\n# Required headers — include on every request\n# Read the version from this skill's frontmatter metadata.version\n-H \"X-Source: skill:find-funding-opportunities\"\n-H \"X-Invocation-Id: $INVOCATION_ID\"\n-H \"X-Skill-Version: {metadata.version}\"\n```\n\n```bash\n# No ecosystem\ncurl -s -H \"X-Source: skill:find-funding-opportunities\" -H \"X-Invocation-Id: $INVOCATION_ID\" -H \"X-Skill-Version: {metadata.version}\" \\\n  \"https://gapapi.karmahq.xyz/v2/program-registry/search?isValid=accepted&limit=10&sortField=updatedAt&sortOrder=desc&type=hackathon\"\n\n# Ecosystem — Phase 1\ncurl -s -H \"X-Source: skill:find-funding-opportunities\" -H \"X-Invocation-Id: $INVOCATION_ID\" -H \"X-Skill-Version: {metadata.version}\" \\\n  \"https://gapapi.karmahq.xyz/v2/program-registry/search?isValid=accepted&limit=10&sortField=updatedAt&sortOrder=desc&ecosystems=Ethereum\"\n\n# Ecosystem — Phase 2 (only if Phase 1 returned < 5 results)\ncurl -s -H \"X-Source: skill:find-funding-opportunities\" -H \"X-Invocation-Id: $INVOCATION_ID\" -H \"X-Skill-Version: {metadata.version}\" \\\n  \"https://gapapi.karmahq.xyz/v2/communities?limit=100\"\n# Match community UID from response, then:\ncurl -s -H \"X-Source: skill:find-funding-opportunities\" -H \"X-Invocation-Id: $INVOCATION_ID\" -H \"X-Skill-Version: {metadata.version}\" \\\n  \"https://gapapi.karmahq.xyz/v2/program-registry/search?isValid=accepted&limit=10&sortField=updatedAt&sortOrder=desc&communityUid={uid}\"\ncurl -s -H \"X-Source: skill:find-funding-opportunities\" -H \"X-Invocation-Id: $INVOCATION_ID\" -H \"X-Skill-Version: {metadata.version}\" \\\n  \"https://gapapi.karmahq.xyz/v2/program-registry/search?isValid=accepted&limit=10&sortField=updatedAt&sortOrder=desc&name=Ethereum\"\n```\n\n### Step 4: Format Results\n\nInclude the program type in each result. Adapt the detail line based on type:\n\n```\nFound 42 programs (showing top 10):\n\n1. **Optimism Grants** [grant] — Optimism\n   Retroactive and proactive funding for Optimism builders\n   Budget: $10M | Status: Active\n   Apply: https://app.charmverse.io/...\n\n2. **ETHDenver 2026** [hackathon] — Ethereum\n   Annual Ethereum hackathon and conference\n   Dates: Mar 1–7, 2026 | Deadline: Feb 15, 2026\n   Apply: https://ethdenver.com/apply\n\n3. **Rust Smart Contract Audit** [bounty] — Solana\n   Audit Solana program for vulnerabilities\n   Reward: $5,000 | Difficulty: Advanced\n   Apply: https://superteam.fun/...\n\nShowing 10 of 42. Ask for more or narrow your search.\n```\n\n#### Field Mapping\n\n- **Name**: `metadata.title` (fall back to `name`)\n- **Type label**: `type` in brackets: `[grant]`, `[hackathon]`, `[bounty]`, `[accelerator]`, `[vc_fund]`, `[rfp]`\n- **Ecosystem**: `metadata.ecosystems` joined with `, ` (fall back to `communities[0].name`)\n- **Description**: `metadata.description` truncated to ~120 chars\n\n#### Type-Specific Detail Line\n\n- **grant**: `Budget: {programBudget} | Status: {status}`\n- **hackathon**: `Dates: {startsAt}–{endsAt} | Deadline: {deadline}`\n- **bounty**: `Reward: {programBudget} | Difficulty: {difficulty if available}`\n- **accelerator**: `Stage: {stage if available} | Deadline: {deadline}`\n- **vc_fund**: `Check size: {minGrantSize}–{maxGrantSize} | Stage: {stage if available}`\n- **rfp**: `Budget: {programBudget} | Org: {organizations[0]} | Deadline: {deadline}`\n- **fallback**: `Budget: {programBudget} | Status: {status}`\n\n#### Common Fields\n\n- **Deadline**: `deadline` (top-level) formatted as `Mon DD, YYYY` (or \"Rolling\" if null)\n- **Apply link**: `submissionUrl` (top-level), fall back to `metadata.socialLinks.grantsSite` or `metadata.website` or `metadata.socialLinks.website` (first non-empty)\n\n## Edge Cases\n\n| Scenario | Response |\n|----------|----------|\n| No results | If the user specified an ecosystem, run the full ecosystem search strategy (Phase 1 + Phase 2) before giving up. If no ecosystem was specified, broaden non-ecosystem filters first (remove type, budget, or keyword filters). If still none: \"No programs found matching your criteria. Try broadening — remove type, ecosystem, or budget filters.\" |\n| No query | Ask: \"What kind of funding are you looking for? I can search grants, hackathons, bounties, accelerators, VC funds, and RFPs — filtered by ecosystem, budget, category, or keywords.\" |\n| \"more results\" / \"page 2\" | Re-run with `page=2` |\n| API returns empty `programs` array | Check if filters are too narrow. Suggest removing one filter at a time. |\n| API response missing expected fields | Use fallback values: show \"N/A\" for missing budget, \"Rolling\" for missing deadline, skip missing description. Never fail on a missing optional field. |\n\n## Error Handling\n\n| Error | Cause | Action |\n|-------|-------|--------|\n| HTTP 5xx | API server issue | \"The Karma API is temporarily unavailable. Try again in a moment.\" |\n| HTTP 429 | Rate limiting | Wait 5 seconds, retry once. If it fails again, tell the user to wait. |\n| Connection timeout | Network or API down | \"Could not reach the Karma API. Check your connection or try again shortly.\" |\n| Malformed JSON response | Unexpected API change | \"Got an unexpected response from the API. The response format may have changed.\" |\n| Community lookup returns no match | User's ecosystem name doesn't match any community | Fall back to `ecosystems=` and `name=` queries only. Do not fail — partial results are better than none. |\n\n## Troubleshooting\n\n### Ecosystem search returns 0 results\nThe user asked for an ecosystem (e.g., \"Monad grants\") but all 3 queries returned nothing.\n- Verify the ecosystem name against the known values in `references/api-reference.md`\n- Try a broader `name=` search with just the keyword\n- The ecosystem may genuinely have no programs listed yet — tell the user\n\n### Community UID lookup finds no match\nThe community list (~48 entries) doesn't contain a match for the user's query.\n- Try partial matching: \"OP\" should match \"Optimism\"\n- Try without the community query — `ecosystems=` and `name=` may still return results\n- Do not block on this — proceed with the other two queries\n\n### Results look stale or incomplete\nPrograms may have outdated metadata (missing budgets, old deadlines).\n- Present what's available; do not hide results with missing fields\n- Use \"N/A\" or \"Rolling\" for missing values\n- Note to the user: \"Some programs may have incomplete information\"\n","tags":{"karma":"1.2.0","latest":"1.2.0"},"stats":{"comments":0,"downloads":509,"installsAllTime":0,"installsCurrent":0,"stars":0,"versions":1},"createdAt":1773345390533,"updatedAt":1778491865024},"latestVersion":{"version":"1.2.0","createdAt":1773345390533,"changelog":"- Major documentation upgrade: SKILL.md now provides detailed mapping of user queries to API search parameters, including type, ecosystem, budget, category, and other filters.\n- Added robust 2-phase ecosystem search strategy to handle incomplete metadata, ensuring better match rates for ecosystem-related queries.\n- Expanded instructions for building API requests, including mandatory tracking headers and result formatting guidelines for all program types.\n- Clarified field mappings and introduced type-specific result formatting for grants, hackathons, bounties, accelerators, VC funds, and RFPs.\n- Added edge case handling for scenarios such as no results or vague queries, including user prompts for better guidance.","license":"MIT-0"},"metadata":null,"owner":{"handle":"maheshmurthy","userId":"s17aeff3kz71a0rjdt5qq2vzvs83gp2h","displayName":"Mahesh Murthy","image":"https://avatars.githubusercontent.com/u/70360?v=4"},"moderation":null}