Ethereum APIesp.ethereum.foundation ↗
Access Ethereum Foundation ESP grant rounds, RFPs, wishlist items, blog posts, and application form fields via 12 structured endpoints.
What is the Ethereum API?
The Ethereum Foundation ESP API exposes 12 endpoints covering the full Ecosystem Support Program surface: active grant rounds, RFPs, wishlist items, blog posts, and application form metadata. The get_rfps endpoint returns Salesforce-backed RFP objects with fields like Name, Description__c, Tags__c, and Resources__c, while get_round_details fetches compiled MDX content and associated RFP items for any round by slug. Developers monitoring ESP funding opportunities or building grant-discovery tools get structured data without screen-scraping HTML.
No input parameters required.
curl -X GET 'https://api.parse.bot/scraper/08f63c73-ce3b-42cd-b2f4-ad7c81056ed7/get_office_hours_form_fields' \ -H 'X-API-Key: $PARSE_API_KEY'
Typed, relational, agent-ready
A generated client with real types, enums, and the links between objects — the structure a flat JSON response can't carry. Autocompletes in your editor and reads cleanly to coding agents.
- Fully typed · autocompletes
- Objects link to objects
- Typed errors & pagination
Typed Python client. Set up the SDK in your uv project, then pull this API’s typed client:
uv add parse-sdk uv run parse init uv run parse add --marketplace esp-ethereum-foundation-api
uv run parse add --marketplace pulls a pinned snapshot of this canonical API — it won’t change underneath you. To customize it, subscribe and swap to your own copy.
"""Walkthrough: Ethereum Foundation ESP SDK — bounded, re-runnable; every call capped."""
from parse_apis.ethereum_foundation_esp_api import ESP, RFP, BlogPost, WishlistItem, FormField, RoundDetail, RoundSummary, RoundNotFound
esp = ESP()
# List all RFPs — inspect funding opportunities with requirements and deadlines
for rfp in esp.rfps.list(limit=5):
print(rfp.name, rfp.tags, rfp.close_date)
# Browse wishlist items ESP is actively seeking proposals for
for item in esp.wishlistitems.list(limit=3):
print(item.name, item.description[:80])
# List blog posts and drill into the first one for full content
post = esp.blogposts.list(limit=1).first()
if post:
print(post.frontmatter.title, post.frontmatter.date, post.frontmatter.author)
detail = esp.blogposts.get(url_path=post.url)
print(detail.frontmatter.title, detail.content[:100])
# Get a specific grant round's full details, with typed error handling
try:
round_detail = esp.rounddetails.get(slug="phdfp26")
print(round_detail.details.name, round_detail.details.start_date, round_detail.content_mdx[:80])
except RoundNotFound as exc:
print(f"Round not found: {exc}")
# List currently open rounds (may be empty when no rounds are active)
for r in esp.roundsummaries.list_open(limit=5):
print(r.slug, r.name, r.start_date)
# List form fields for the Office Hours application
for field in esp.formfields.list(limit=5):
print(field.name, field.label, field.required)
print("exercised: rfps.list / wishlistitems.list / blogposts.list / blogposts.get / rounddetails.get / roundsummaries.list_open / formfields.list")
Returns all form fields with their metadata for the Office Hours application form, including field names, types, labels, required status, help text, and options for dropdowns/radios. Each field object describes one input in the form; dropdown fields include their full options array.
No input parameters required.
{
"type": "object",
"fields": {
"fields": "array of FormField objects with name, type, label, required, placeholder, options, help, and default properties"
},
"sample": {
"data": {
"fields": [
{
"name": "firstName",
"type": "text",
"label": "First name",
"required": true,
"placeholder": ""
},
{
"name": "domain",
"type": "dropdown",
"label": "Domain",
"options": [
"Application layer",
"Cryptography",
"DeFi",
"Other"
],
"required": true
}
]
},
"status": "success"
}
}About the Ethereum API
Grant Rounds and RFPs
get_open_rounds returns an array of currently active grant round objects — or an empty array when no rounds are open, so your app can handle the off-cycle state cleanly. To drill into a specific round, call get_round_details with a slug parameter (e.g. phdfp26); the response includes frontmatter fields (name, description, tags, startDate, endDate), an rfp_items array of associated proposals, and a content_mdx string of the full compiled page content. get_rfps lists all Requests for Proposals with their Salesforce-native field names (Id, Name, Description__c, Tags__c, Resources__c), and get_wishlist returns the same shape for project types ESP is actively seeking.
Blog and Informational Content
get_blog_posts fetches all posts from the Ecosystem Support Program category on the Ethereum blog, returning each post's frontmatter (title, date, author, category, image), a content string, and a url. Individual posts can be fetched with get_blog_post_detail using a url_path in YYYY/MM/DD/slug format; the endpoint accepts paths with or without the /en/ prefix and trailing slash, returning the canonical URL, full markdown content, and frontmatter. get_applicants_overview returns the How to Apply page broken into mission_and_scope, process steps, and faq items — useful for surfacing eligibility context alongside listing data.
Application Form Metadata
get_office_hours_form_fields returns every field in the Office Hours application form as structured objects with name, type, label, required, placeholder, options, help, and default properties — enough to render the form programmatically or validate user input before submission. Two focused endpoints — get_domain_dropdown_options and get_profile_type_options — return the option arrays for those specific dropdowns independently, useful when you only need to populate a single select element. get_office_hours_info returns section strings for Summary, Eligibility, Process, What we offer, and FAQ.
Scope and Data Shape
All endpoints are GET requests with no required authentication. get_rfps and get_wishlist return Salesforce-style field names (__c suffix) reflecting the upstream data model. The get_round_details endpoint returns a stale_input error with kind: input_not_found when the provided slug doesn't match any known round, so callers should handle that case explicitly.
The Ethereum API is a managed, monitored endpoint for esp.ethereum.foundation — not a raw scraper you maintain. Every endpoint is automatically health-checked on a schedule, and when esp.ethereum.foundation changes and a check fails, the API is automatically queued for repair and re-verified. It is built to keep working as the site underneath it changes.
This isn't an official esp.ethereum.foundation API — it's an independent, maintained REST wrapper over public data. Where the source has no official API (or only a limited one), Parse gives you a stable contract over a source that never promised one, and keeps it current. Need a new endpoint or field? You can revise it yourself in plain English and the agent rebuilds it against the live site in minutes — contributing the change back to the shared API is free.
Will this API break when the source site changes?+
Is this an official API from the source site?+
Can I fix or extend this API myself if I need a new endpoint or field?+
What happens if I call an endpoint that has an issue?+
- Build a grant-discovery dashboard that surfaces open ESP rounds via
get_open_roundsand their full details viaget_round_details. - Aggregate all ESP RFPs and wishlist items into a searchable database using the
Tags__candDescription__cfields fromget_rfpsandget_wishlist. - Render a programmatic application form by consuming the field metadata from
get_office_hours_form_fields, including dropdown options and required-field flags. - Sync ESP blog posts into a content feed or newsletter by polling
get_blog_postsfor new entries by date fromfrontmatter. - Embed eligibility and process copy from
get_applicants_overviewinto a grant-matching tool so users see ESP scope before applying. - Track ESP team and mission changes over time by periodically calling
get_about_espand diffing thesummaryandteam_sectionsfields. - Populate domain and profile type dropdowns in an external intake form using
get_domain_dropdown_optionsandget_profile_type_options.
| Tier | Price | Credits/month | Rate limit |
|---|---|---|---|
| Free | $0/mo | 100 | 5 req/min |
| Hobby | $30/mo | 1,000 | 20 req/min |
| Developer | $100/mo | 5,000 | 100 req/min |
One credit = one API call regardless of which marketplace API you call. Exceeding the rate limit returns a 429 response. Authenticate with the X-API-Key header.
Does the Ethereum Foundation ESP website have an official developer API?+
What does `get_round_details` return when a slug doesn't exist?+
slug parameter doesn't match any known grant round, the endpoint returns a stale_input error object with kind: input_not_found. Your client code should check for this before trying to access details, rfp_items, or content_mdx.Does the API expose grant application submission or status-checking functionality?+
get_office_hours_form_fields), informational content, and listing data. You can fork this API on Parse and revise it to add an endpoint targeting the submission flow or any status-check surface.Are past or archived grant rounds accessible, not just currently open ones?+
get_open_rounds only returns currently active rounds and returns an empty array during off-cycles. get_round_details accepts a slug for any round, including past ones, if you know the slug — but there is no endpoint that lists all historical rounds. You can fork this API on Parse and revise it to add a round-index or archive endpoint.