For AI agents
Calls for speakers as data: 36 open of 40 on file, with 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": 36,
"cfps": [
{
"id": "conf42-prompt-engineering-2026",
"name": "Conf42 Prompt Engineering 2026",
"closes": "2026-09-28",
"event": {
"start": "2026-10-29",
"end": "2026-10-29"
},
"city": "",
"country": "",
"topics": [
"AI"
],
"cfpUrl": "https://www.papercall.io/conf42-prompt-engineering-2026",
"url": "https://cfp.fru.dev/cfps/conf42-prompt-engineering-2026"
},
{
"id": "vector-in-databases-2026",
"name": "Vector in Databases 2026",
"closes": "2026-09-28",
"event": {
"start": "2026-10-24",
"end": "2026-10-24"
},
"city": "",
"country": "",
"topics": [
"Databases"
],
"cfpUrl": "https://buildevcon.com/SpeakersApply",
"url": "https://cfp.fru.dev/cfps/vector-in-databases-2026"
}
]
}/api/cfps/{id}
curl -s "https://cfp.fru.dev/api/cfps/conf42-prompt-engineering-2026"{
"cfp": {
"id": "conf42-prompt-engineering-2026",
"name": "Conf42 Prompt Engineering 2026",
"closes": "2026-09-28",
"event": {
"start": "2026-10-29",
"end": "2026-10-29"
},
"city": "",
"country": "",
"topics": [
"AI"
],
"cfpUrl": "https://www.papercall.io/conf42-prompt-engineering-2026",
"url": "https://cfp.fru.dev/cfps/conf42-prompt-engineering-2026"
},
"changes": [
{
"id": 5,
"cfpId": "conf42-prompt-engineering-2026",
"cfpName": "Conf42 Prompt Engineering 2026",
"field": "created",
"old": "",
"new": "2026-09-28",
"changedAt": "2026-09-24 10:24:00",
"sourceUrl": "https://www.papercall.io/conf42-prompt-engineering-2026",
"url": "https://cfp.fru.dev/cfps/conf42-prompt-engineering-2026"
}
]
}/api/changes
curl -s "https://cfp.fru.dev/api/changes?since=2026-09-01T00:00:00Z&limit=3"{
"count": 46,
"changes": [
{
"id": 46,
"cfpId": "build-it-summit-2026",
"cfpName": "Build It Summit 2026",
"field": "topics",
"old": "[\"Data\",\"AI\",\"DevOps\",\"Open source\"]",
"new": "[\"DevOps\",\"Data\",\"AI\",\"Open source\"]",
"changedAt": "2026-09-24 14:31:08",
"sourceUrl": "https://github.com/tech-conferences/conference-data/blob/main/conferences/2026/devops.json",
"url": "https://cfp.fru.dev/cfps/build-it-summit-2026"
},
{
"id": 45,
"cfpId": "all-day-ai-2026",
"cfpName": "All Day AI 2026",
"field": "topics",
"old": "[\"Data\",\"AI\",\"DevOps\",\"Security\"]",
"new": "[\"DevOps\",\"AI\",\"Data\",\"Security\"]",
"changedAt": "2026-09-24 14:31:08",
"sourceUrl": "https://github.com/tech-conferences/conference-data/blob/main/conferences/2026/devops.json",
"url": "https://cfp.fru.dev/cfps/all-day-ai-2026"
}
]
}/api/companies
curl -s "https://cfp.fru.dev/api/companies?limit=2"{
"companies": [
{
"slug": "conf42",
"name": "Conf42",
"domain": "conf42.com",
"url": "https://cfp.fru.dev/organizers/conf42",
"items": [
{
"id": "conf42-prompt-engineering-2026",
"type": "cfp_deadline",
"date": "2026-09-28"
}
]
}
]
}/api/topics
curl -s "https://cfp.fru.dev/api/topics"{
"topics": [
{
"key": "ai",
"name": "AI",
"open": 16
}
]
}/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.
Sources: each event's own call for speakers page, read weekly. Deadlines as the organizers state them; check the call before you submit.