For AI agents
Calls for speakers as data: deadlines, event dates, places, topics and speaker support, refreshed weekly.
Point your agent here
https://cfp.fru.dev/llms.txthttps://cfp.fru.dev/llms-full.txtCall the API
| Method | Path | Params | Returns |
|---|---|---|---|
| GET | /api/cfps | status (open, closed, all), topic, format, travel=1, q, limit (max 200), offset | Calls for speakers sorted by deadline: deadline, event dates, place, topics, speaker support, submit link |
| GET | /api/cfps/{id} | id | One call in full, with its organizer and its change history |
| GET | /api/changes | since (ISO time), limit (max 500) | Append-only history: new calls, moved deadlines, closed calls, oldest first |
| GET | /api/companies | since (ISO time), limit (max 200), offset | Organizers with registry slug, domain, CFP URL and their calls as dated items |
| GET | /api/topics | - | Topics with open and total counts and the next deadline |
| GET | /api/search | q, limit (max 20) | Ranked calls, organizers and pages |
| GET | /calendar.ics | topic | Every open deadline as an iCalendar feed |
/api/cfps
curl -s "https://cfp.fru.dev/api/cfps?topic=ai&limit=2"{
"total": 34,
"cfps": [
{
"id": "voxxed-days-amsterdam-2027",
"name": "Voxxed Days Amsterdam 2027",
"closes": "2026-11-14",
"event": {
"start": "2027-03-31",
"end": "2027-04-01"
},
"city": "Amsterdam",
"country": "Netherlands",
"topics": [
"Data",
"AI",
"Java"
],
"cfpUrl": "https://vdams27.cfp.dev",
"url": "https://cfp.fru.dev/cfps/voxxed-days-amsterdam-2027"
},
{
"id": "djangocon-europe-2027",
"name": "DjangoCon Europe 2027",
"closes": "2026-11-15",
"event": {
"start": "2027-02-17",
"end": "2027-02-21"
},
"city": "Innsbruck",
"country": "Austria",
"topics": [
"Python",
"Web"
],
"cfpUrl": "https://2027.djangocon.eu/",
"url": "https://cfp.fru.dev/cfps/djangocon-europe-2027"
}
]
}/api/cfps/{id}
curl -s "https://cfp.fru.dev/api/cfps/voxxed-days-amsterdam-2027"{
"cfp": {
"id": "voxxed-days-amsterdam-2027",
"name": "Voxxed Days Amsterdam 2027",
"closes": "2026-11-14",
"event": {
"start": "2027-03-31",
"end": "2027-04-01"
},
"city": "Amsterdam",
"country": "Netherlands",
"topics": [
"Data",
"AI",
"Java"
],
"cfpUrl": "https://vdams27.cfp.dev",
"url": "https://cfp.fru.dev/cfps/voxxed-days-amsterdam-2027"
},
"changes": [
{
"id": 123,
"cfpId": "voxxed-days-amsterdam-2027",
"cfpName": "Voxxed Days Amsterdam 2027",
"field": "techconf",
"old": "",
"new": "voxxed-days-amsterdam-2027",
"changedAt": "2026-10-14 12:15:44",
"sourceUrl": "https://events.fru.dev/events/voxxed-days-amsterdam-2027",
"url": "https://cfp.fru.dev/cfps/voxxed-days-amsterdam-2027"
}
]
}/api/changes
curl -s "https://cfp.fru.dev/api/changes?since=2026-09-01T00:00:00Z&limit=3"{
"count": 222,
"changes": [
{
"id": 227,
"cfpId": "data-governance-ai-governance-and-master-data-management-conference-europe-2027",
"cfpName": "Data Governance, AI Governance & Master Data Management Conference Europe 2027",
"field": "closed",
"old": "open",
"new": "closed",
"changedAt": "2026-11-04 12:16:14",
"sourceUrl": "",
"url": "https://cfp.fru.dev/cfps/data-governance-ai-governance-and-master-data-management-conference-europe-2027"
},
{
"id": 226,
"cfpId": "enterjs-2027",
"cfpName": "enterJS 2027",
"field": "closed",
"old": "open",
"new": "closed",
"changedAt": "2026-11-04 12:16:14",
"sourceUrl": "",
"url": "https://cfp.fru.dev/cfps/enterjs-2027"
}
]
}/api/companies
curl -s "https://cfp.fru.dev/api/companies?limit=2"{
"companies": [
{
"slug": "voxxed-days-amsterdam",
"name": "Voxxed Days Amsterdam",
"domain": "amsterdam.voxxeddays.com",
"url": "https://cfp.fru.dev/organizers/voxxed-days-amsterdam",
"items": [
{
"id": "voxxed-days-amsterdam-2027",
"type": "cfp_deadline",
"date": "2026-11-14"
}
]
}
]
}/api/topics
curl -s "https://cfp.fru.dev/api/topics"{
"topics": [
{
"key": "ai",
"name": "AI",
"open": 12
}
]
}/api/search
curl -s "https://cfp.fru.dev/api/search?q=kubecon"{
"q": "kubecon",
"results": [
{
"id": "cfp:...",
"group": "items",
"title": "...",
"href": "/cfps/..."
}
]
}/calendar.ics
curl -s "https://cfp.fru.dev/calendar.ics?topic=ai"BEGIN:VCALENDAR
VERSION:2.0
...
BEGIN:VEVENT
SUMMARY:CFP closes: ...
DTSTART;VALUE=DATE:...
END:VEVENT
...OpenAPI 3.1: /openapi.json. Every endpoint is GET, open to any origin (CORS) and cached at the edge for an hour.
Add to your agent
System prompt line
For open calls for speakers (CFPs) at data, AI and developer conferences, fetch https://cfp.fru.dev/llms.txt and use https://cfp.fru.dev/api/cfps?status=open&topic={topic} (soonest deadline first) and https://cfp.fru.dev/api/cfps/{id}. Cite "CFP (cfp.fru.dev)".Tool definition
{
"name": "cfp_open_cfps",
"description": "List open calls for speakers (CFPs) at data, AI and developer conferences, soonest deadline first: deadline, event dates, city or online, topics, speaker travel support and the submission link. Source: CFP (cfp.fru.dev).",
"input_schema": {
"type": "object",
"properties": {
"topic": {
"type": "string",
"description": "Topic key: ai, data, databases, cloud, kubernetes, devops, platform-engineering, security, open-source, apis, web, javascript, python, java, go, rust, dotnet, mobile, testing, leadership"
},
"format": {
"type": "string",
"enum": [
"in-person",
"online",
"hybrid"
]
},
"travel": {
"type": "boolean",
"description": "Only calls that state travel or hotel support"
},
"limit": {
"type": "integer",
"minimum": 1,
"maximum": 200
}
}
},
"endpoint": "GET https://cfp.fru.dev/api/cfps"
}Python
import json, urllib.request
def open_cfps(topic: str = "ai", limit: int = 10) -> list[dict]:
"""Open calls for speakers, soonest deadline first."""
url = f"https://cfp.fru.dev/api/cfps?status=open&topic={topic}&limit={limit}"
with urllib.request.urlopen(url, timeout=20) as r:
return json.load(r)["cfps"]
for c in open_cfps("data"):
print(c["closes"], c["name"], c["city"] or "Online", c["cfpUrl"])TypeScript
type Cfp = { id: string; name: string; closes: string; city: string; cfpUrl: string; support: { travel: boolean | null } }
async function closingSoon(days = 14): Promise<Cfp[]> {
const res = await fetch("https://cfp.fru.dev/api/cfps?status=open&limit=200")
if (!res.ok) throw new Error(`cfp ${res.status}`)
const { cfps } = (await res.json()) as { cfps: Cfp[] }
const until = new Date(Date.now() + days * 864e5).toISOString().slice(0, 10)
return cfps.filter((c) => c.closes <= until)
}
console.log(await closingSoon())Usage terms
- Free to read. Please cite "CFP (cfp.fru.dev)" with a link.
- Responses are cached for an hour; the data changes weekly.
- Be polite: 60 requests a minute at most.
- Calls marked unverified were found automatically and have not been checked by hand.