Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Search EU-funded research outputs via the OpenAIRE Graph API
.claude/skills/brycewang-stanford-openaire-api/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-01 | ✗→✓ | ▲ Improved | -3% | 0% |
| case-02 | ✗→✓ | ▲ Improved | 8% | 0% |
| case-03 | ✗→✓ | ▲ Improved | 54% | 0% |
| case-06 | ✗→✓ | ▲ Improved | 19% | 0% |
| case-07 | ✗→✓ | ▲ Improved | 27% | 0% |
OpenAIRE is the European Open Science infrastructure providing programmatic access to millions of research outputs — publications, datasets, software, and other research products — linked to EU-funded projects, organizations, and researchers. The Graph API is free, requires no authentication, and returns JSON or XML. Uniquely valuable for discovering EU/Horizon-funded research and tracing connections between research outputs, projects, and institutions.
https://api.openaire.eubash# Search by keywords curl "https://api.openaire.eu/search/publications?keywords=climate+change+adaptation&format=json&size=10" # Filter by open access curl "https://api.openaire.eu/search/publications?keywords=machine+learning&openaccessonly=true&format=json" # Filter by date curl "https://api.openaire.eu/search/publications?keywords=CRISPR&fromDateAccepted=2023-01-01&toDateAccepted=2026-12-31&format=json" # Filter by EU project curl "https://api.openaire.eu/search/publications?projectID=corda__h2020::123456&format=json" # Search by DOI curl "https://api.openaire.eu/search/publications?doi=10.1038/s41586-023-05881-4&format=json"
bash# Find research datasets curl "https://api.openaire.eu/search/datasets?keywords=genomics+sequencing&format=json&size=20" # Open access datasets only curl "https://api.openaire.eu/search/datasets?keywords=ocean+temperature&openaccessonly=true&format=json"
bash# Search EU-funded projects curl "https://api.openaire.eu/search/projects?keywords=artificial+intelligence&funder=EC&format=json" # Horizon 2020 projects curl "https://api.openaire.eu/search/projects?keywords=renewable+energy&fundingStream=H2020&format=json" # Horizon Europe projects curl "https://api.openaire.eu/search/projects?keywords=quantum+computing&fundingStream=HE&format=json"
| Parameter | Description | Example | |-----------|-------------|---------| | keywords | Free-text search | keywords=deep+learning | | doi | Search by DOI | doi=10.1234/example | | openaccessonly | Open access filter | openaccessonly=true | | fromDateAccepted | Start date | fromDateAccepted=2023-01-01 | | toDateAccepted | End date | toDateAccepted=2026-12-31 | | funder | Funding agency | funder=EC (European Commission) | | fundingStream | Funding program | fundingStream=H2020 | | format | Response format | format=json or format=xml | | size | Results per page | size=50 (max 100) | | page | Page number | page=2 | | sortBy | Sort order | sortBy=resultdateofacceptance,descending |
pythonimport requests BASE_URL = "https://api.openaire.eu" def search_publications(keywords: str, open_access: bool = False, from_date: str = None, size: int = 20) -> list: """Search OpenAIRE publications.""" params = { "keywords": keywords, "format": "json", "size": size } if open_access: params["openaccessonly"] = "true" if from_date: params["fromDateAccepted"] = from_date resp = requests.get(f"{BASE_URL}/search/publications", params=params) resp.raise_for_status() data = resp.json() results = [] for item in data.get("response", {}).get("results", {}).get("result", []): metadata = item.get("metadata", {}).get("oaf:entity", {}).get("oaf:result", {}) title = metadata.get("title", {}) if isinstance(title, dict): title = title.get("$", "") results.append({ "title": title, "doi": metadata.get("pid", [{}])[0].get("$", "") if metadata.get("pid") else None, "date": metadata.get("dateofacceptance", {}).get("$", ""), "description": metadata.get("description", {}).get("$", "")[:300] if metadata.get("description") else None }) return results # Example: find recent open access papers on climate pubs = search_publications("climate resilience urban", open_access=True, from_date="2024-01-01") for p in pubs: print(f"[{p['date']}] {p['title']}")
| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-10 | pass→pass | 6,617 | 2,599 | -61% | 1 | 1 | 0% | 1,263 | 1,887 | +49% | 0 | 0 | — |
case-05 | fail→fail | 9,471 | 3,086 | -67% | 1 | 1 | 0% | 1,532 | 1,948 | +27% | 0 | 0 | — |
case-01 | fail→pass | 16,161 | 12,524 | -23% | 1 | 1 | 0% | 2,542 | 2,466 | -3% | 0 | 0 | — |
case-02 | fail→pass | 17,232 | 10,934 | -37% | 1 | 1 | 0% | 3,566 | 3,850 | +8% | 0 | 0 | — |
case-03 | fail→pass | 8,714 | 3,376 | -61% | 1 | 1 | 0% | 1,336 | 2,055 | +54% | 0 | 0 | — |
case-04 | pass→pass | 10,332 | 2,284 | -78% | 1 | 1 | 0% | 1,494 | 1,872 | +25% | 0 | 0 | — |
case-06 | fail→pass | 8,438 | 2,377 | -72% | 1 | 1 | 0% | 1,564 | 1,854 | +19% | 0 | 0 | — |
case-07 | fail→pass | 7,437 | 2,813 | -62% | 1 | 1 | 0% | 1,371 | 1,739 | +27% | 0 | 0 | — |
case-08 | pass→pass | 8,151 | 2,869 | -65% | 1 | 1 | 0% | 1,295 | 2,020 | +56% | 0 | 0 | — |
case-09 | pass→pass | 11,436 | 4,372 | -62% | 1 | 1 | 0% | 1,830 | 2,299 | +26% | 0 | 0 | — |
case-11 | pass→pass | 9,674 | 6,459 | -33% | 1 | 1 | 0% | 1,810 | 2,640 | +46% | 0 | 0 | — |
case-12 | pass→pass | 8,623 | 7,211 | -16% | 1 | 1 | 0% | 1,407 | 2,582 | +84% | 0 | 0 | — |
case-13 | pass→pass | 9,889 | 3,617 | -63% | 1 | 1 | 0% | 1,464 | 2,038 | +39% | 0 | 0 | — |
case-14 | pass→pass | 5,784 | 1,919 | -67% | 1 | 1 | 0% | 804 | 1,640 | +104% | 0 | 0 | — |
case-15 | pass→pass | 10,238 | 3,537 | -65% | 1 | 1 | 0% | 1,596 | 2,016 | +26% | 0 | 0 | — |
case-16 | pass→pass | 6,256 | 2,321 | -63% | 1 | 1 | 0% | 985 | 1,774 | +80% | 0 | 0 | — |
case-17 | fail→pass | 20,309 | 10,634 | -48% | 1 | 1 | 0% | 4,066 | 3,795 | -7% | 0 | 0 | — |
case-18 | pass→pass | 12,571 | 8,295 | -34% | 1 | 1 | 0% | 2,417 | 3,065 | +27% | 0 | 0 | — |
case-19 | fail→pass | 9,116 | 2,212 | -76% | 1 | 1 | 0% | 1,317 | 1,763 | +34% | 0 | 0 | — |
case-20 | pass→pass | 17,840 | 16,111 | -10% | 1 | 1 | 0% | 2,824 | 4,059 | +44% | 0 | 0 | — |
case-21 | pass→pass | 24,830 | 4,492 | -82% | 1 | 1 | 0% | 2,177 | 2,035 | -7% | 0 | 0 | — |
case-22 | fail→pass | 9,238 | 8,904 | -4% | 1 | 1 | 0% | 1,924 | 3,048 | +58% | 0 | 0 | — |
case-23 | pass→pass | 10,773 | 6,297 | -42% | 1 | 1 | 0% | 2,074 | 2,254 | +9% | 0 | 0 | — |
case-24 | pass→pass | 6,310 | 6,624 | +5% | 1 | 1 | 0% | 895 | 2,334 | +161% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 24 cases were attempted. The headline lift of +33 percentage points is the difference between those two pass rates over the 24 comparable cases.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
Other measured skills in the registry, with their headline benchmark lift.