cookuf APIcookuf.net ↗
Extract structured internship, job, scholarship, and fellowship details from cookuf.net articles — deadline, stipend, eligibility, and application links.
What is the cookuf API?
The cookuf.net API exposes 1 endpoint, get_opportunity_details, that returns 9 structured fields from a single opportunity article on cookuf.net — including deadline, stipend, eligibility criteria, age requirements, and a direct application URL. Supply the article's URL slug and get back a parsed, label-keyed summary object alongside full section-by-section body content, covering internships, jobs, scholarships, and fellowships listed on the site.
curl -X GET 'https://api.parse.bot/scraper/6180ae62-3f2e-4afa-9725-6bc11e06eb65/get_opportunity_details?article_slug=social-media-content-creator-internship-2026-at-wunti-al-khair-foundation-in-northern-nigeria' \ -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 cookuf-net-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: fetch and inspect a cookuf.net opportunity listing."""
from parse_apis.cookuf_net_api import Cookuf, OpportunityNotFound
client = Cookuf()
# Look up a specific opportunity by its URL slug.
slug = "youth-policy-and-advocacy-workshop-2026-in-northern-nigeria-apply-now"
try:
opp = client.opportunities.get(article_slug=slug)
except OpportunityNotFound:
print("Opportunity not found for slug:", slug)
else:
print(opp.title)
print("Deadline:", opp.deadline)
print("Stipend:", opp.stipend)
print("Published:", opp.published_at.isoformat())
print("Apply at:", opp.application_url)
# Walk the summary key/value pairs extracted from the article.
for label, value in opp.summary.items():
print(f" {label}: {value}")
# Show eligibility requirements.
for line in opp.eligibility:
print(" -", line)
# Iterate article sections for additional context.
for section in opp.sections:
print(f"\n## {section.heading}")
for item in section.items:
print(" ", item)
print("\nexercised: opportunities.get")
Returns the structured details of one opportunity article on cookuf.net, identified by its URL slug (the last path segment of the article URL). One page fetch per call. The response carries the article title, publish timestamp, a key/value `summary` parsed from the article's 'Summary' bullet list when present (keys are lowercased snake_case labels as written by the author, one shape being position/location/work_mode/stipend/duration/deadline), and best-effort extracted fields: `deadline`, `stipend` and `age_eligibility` are strings copied verbatim from the article (not normalised) and are null when the article does not state them; `eligibility` lists the bullet items under the article's qualifications/eligibility/who-can-apply heading (empty array when no such heading exists); `application_instructions` lists the text under the article's apply heading (often just the heading label when the article only provides a link); `application_url` is the first external link in that apply section (null when none) and `application_emails` lists every email address found in the article body (usually empty). `sections` returns every heading of the article with its paragraph/bullet items and external links, so anything not captured by the extracted fields can still be read. A slug the site does not know is answered with a not-found input error (the site itself serves an unrelated fallback article for unknown slugs, which is detected and rejected).
| Param | Type | Description |
|---|---|---|
| article_slugrequired | string | URL slug of the cookuf.net article: the lowercase hyphenated last path segment of the article URL, e.g. social-media-content-creator-internship-2026-at-wunti-al-khair-foundation-in-northern-nigeria. |
{
"type": "object",
"fields": {
"url": "canonical article URL on cookuf.net",
"title": "article headline",
"stipend": "stipend/salary as written in the article (currency as written), or null",
"summary": "object of label -> value pairs parsed from the article's summary bullet list; empty object when the article has no summary list",
"deadline": "application deadline as written in the article, or null",
"sections": "array of {heading, items[], links[]} covering every heading of the article body",
"eligibility": "array of eligibility/qualification bullet strings; empty when the article has no such section",
"published_at": "ISO-8601 publish timestamp with offset, from the article metadata",
"age_eligibility": "the article sentence stating an age requirement, or null when none is stated",
"application_url": "first external application link in the apply section, or null",
"application_emails": "array of email addresses found in the article body",
"application_instructions": "array of text items under the article's apply heading"
},
"sample": {
"data": {
"url": "https://cookuf.net/social-media-content-creator-internship-2026-at-wunti-al-khair-foundation-in-northern-nigeria/",
"title": "Social Media Content Creator Internship 2026 at Wunti Al-Khair Foundation in Northern Nigeria",
"stipend": "₦70,000 – ₦90,000",
"summary": {
"stipend": "₦70,000 – ₦90,000",
"deadline": "September 27, 2026",
"duration": "3–6 Months",
"location": "Bauchi State",
"position": "Social Media and Content Creator Intern",
"work_mode": "Onsite"
},
"deadline": "September 27, 2026",
"sections": [
{
"items": [
"Position: Social Media and Content Creator Intern",
"Deadline: September 27, 2026"
],
"links": [],
"heading": "Internship Summary"
},
{
"items": [],
"links": [
"https://docs.google.com/forms/d/e/1FAIpQLSc7w-cVQeyCO2UdNxkHmRl4Bdyy1DiEkg9Iug5yC6pKJo1vUg/viewform"
],
"heading": "Apply here"
}
],
"eligibility": [
"Applicants should have:",
"A minimum of a Diploma or Bachelor’s degree in a relevant field. Professional experience or demonstrated skills in content creation will be an added advantage.",
"Fluency in Hausa and English."
],
"published_at": "2026-09-25T08:32:58+00:00",
"age_eligibility": null,
"application_url": "https://docs.google.com/forms/d/e/1FAIpQLSc7w-cVQeyCO2UdNxkHmRl4Bdyy1DiEkg9Iug5yC6pKJo1vUg/viewform",
"application_emails": [],
"application_instructions": [
"Apply here"
]
},
"status": "success"
}
}About the cookuf API
What the API Returns
The get_opportunity_details endpoint accepts one required parameter, article_slug — the lowercase hyphenated last path segment of a cookuf.net article URL. It returns a title, a canonical url, and a published_at ISO-8601 timestamp so you can track freshness. The summary field is a key/value object built from the article's bullet summary list (e.g. "Organization", "Location", "Duration"), giving you machine-readable metadata without parsing prose.
Deadline, Stipend, and Eligibility Fields
Three fields target the most commonly queried data points for opportunity aggregators: deadline (the application closing date as written in the article), stipend (the stated compensation with currency preserved as written, or null when unpaid or unstated), and eligibility (an array of qualification bullet strings). A separate age_eligibility field isolates any sentence stating an age cap or range, returned as a plain string or null.
Sections and Application Links
The sections array covers every heading in the article body, each entry carrying a heading string, an items array of bullet content under that heading, and a links array of URLs found within that section. The application_url field returns the first external link found in the apply section — useful when you need to send a user directly to the host organization's application form or contact email without parsing the full sections array.
The cookuf API is a managed, monitored endpoint for cookuf.net — not a raw scraper you maintain. Every endpoint is automatically health-checked on a schedule, and when cookuf.net 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 cookuf.net 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?+
- Aggregate fellowship and internship deadlines from cookuf.net into a unified calendar app using the
deadlinefield - Build a stipend comparison tool for African opportunity listings using the
stipendandsummaryfields - Filter opportunities by age requirement using the
age_eligibilityfield to surface youth-targeted programs - Populate a job board with structured eligibility criteria by mapping the
eligibilityarray to filterable tags - Monitor newly published opportunities by polling
published_attimestamps across multiple article slugs - Route applicants directly to host organization forms by extracting
application_urlwithout manual link hunting - Classify opportunities by location or sector using label/value pairs in the
summaryobject
| Tier | Price | Credits/month | Rate limit |
|---|---|---|---|
| Free | $0/mo | 200 | 5 req/min |
| Hobby | $30/mo | 1,000 | 20 req/min |
| Developer | $100/mo | 5,000 | 100 req/min |
| Team | $300/mo | 20,000 | 300 req/min |
| Company | $1,000/mo | 100,000 | 500 req/min |
Each endpoint has a fixed posted price per successful call — most fall between 1 and 10 credits — shown on this API's page before you run it. Exceeding the rate limit returns a 429 response. Authenticate with the X-API-Key header.
Does cookuf.net have an official developer API?+
What does `get_opportunity_details` return for articles that have no summary bullet list?+
summary field is returned as an empty object. Similarly, eligibility returns an empty array when no eligibility section is present, and stipend, deadline, age_eligibility, and application_url each return null when the article does not state them.Can I search or list multiple opportunities in a single call?+
article_slug. There is no search, listing, or batch endpoint. You can fork this API on Parse and revise it to add a listing or search endpoint that returns multiple slugs or article summaries.Does the API cover opportunities from sites other than cookuf.net?+
How current is the data returned by `get_opportunity_details`?+
published_at field reflects the publish timestamp from the article metadata. Articles that have been updated or removed on cookuf.net will reflect those changes on the next call — there is no cached snapshot stored by the API.