Repository Structure:
- Move files from cluttered root directory into organized structure
- Create archive/ for archived data and scraper results
- Create bugulma/ for the complete application (frontend + backend)
- Create data/ for sample datasets and reference materials
- Create docs/ for comprehensive documentation structure
- Create scripts/ for utility scripts and API tools
Backend Implementation:
- Implement 3 missing backend endpoints identified in gap analysis:
* GET /api/v1/organizations/{id}/matching/direct - Direct symbiosis matches
* GET /api/v1/users/me/organizations - User organizations
* POST /api/v1/proposals/{id}/status - Update proposal status
- Add complete proposal domain model, repository, and service layers
- Create database migration for proposals table
- Fix CLI server command registration issue
API Documentation:
- Add comprehensive proposals.md API documentation
- Update README.md with Users and Proposals API sections
- Document all request/response formats, error codes, and business rules
Code Quality:
- Follow existing Go backend architecture patterns
- Add proper error handling and validation
- Match frontend expected response schemas
- Maintain clean separation of concerns (handler -> service -> repository)
8.0 KiB
EU Funding & Tenders Portal API Clients
This repository contains Python and Go clients for accessing the EU Funding & Tenders Portal APIs. These clients allow you to programmatically search for funding opportunities, track grant updates, and access various EU funding-related data.
Features
- Grants & Tenders Search: Find calls for proposals and tenders
- Topic Details: Get detailed information about specific funding topics
- Grant Updates: Monitor funding opportunity updates
- FAQ Search: Access frequently asked questions
- Organization Data: Retrieve public organization information
- Partner Search: Find potential partners for consortia
- Project Results: Browse EU-funded projects
API Endpoints
The clients access the following EU Funding & Tenders Portal APIs:
- Search API:
https://api.tech.ec.europa.eu/search-api/prod/rest/search - Facet API:
https://api.tech.ec.europa.eu/search-api/prod/rest/facet - Document API:
https://api.tech.ec.europa.eu/search-api/prod/rest/document
Python Client (eu_funding_api.py)
Requirements
pip install requests
Usage
Basic Usage
from eu_funding_api import EUFundingAPI
# Initialize the API client
api = EUFundingAPI()
# Search for all grants and tenders
results = api.search_grants_tenders()
processed_results = results.get('processed_results', [])
print(f"Found {len(processed_results)} opportunities")
# Access processed data (metadata fields extracted)
for opportunity in processed_results[:3]:
print(f"- {opportunity['title']} (Status: {opportunity['status']})")
Search for EIC Accelerator Opportunities
# Search specifically for EIC Accelerator
eic_query = {
"bool": {
"must": [
{
"terms": {
"type": ["1", "2", "8"] # Grants
}
},
{
"terms": {
"status": ["31094501", "31094502", "31094503"] # All statuses
}
},
{
"term": {
"callIdentifier": "HORIZON-EIC-2026-ACCELERATOR-01"
}
}
]
}
}
results = api.search_grants_tenders(eic_query)
processed_results = results.get('processed_results', [])
for opportunity in processed_results:
print(f"Title: {opportunity['title']}")
print(f"Identifier: {opportunity['identifier']}")
print(f"Status: {opportunity['status']}")
print(f"Deadline: {opportunity['deadline']}")
print("---")
Get Topic Details
# Get detailed information about a specific topic
topic_details = api.get_topic_details("HORIZON-EIC-2026-ACCELERATOR-01")
processed_topics = topic_details.get('processed_results', [])
if processed_topics:
topic = processed_topics[0]
print(f"Title: {topic['title']}")
print(f"Status: {topic['status']}")
print(f"Call Identifier: {topic['callIdentifier']}")
print(f"Deadline: {topic['deadline']}")
print(f"Description: {topic['description']}")
Monitor EIC Accelerator (Command Line)
python eu_funding_api.py monitor
Data Structure
The EU Funding APIs return data in a specific structure:
- Raw Results: Available in
resultsfield (contains nested metadata) - Processed Results: Available in
processed_resultsfield (metadata fields extracted)
Processed Result Fields
Each processed result contains:
title: The opportunity titleidentifier: Unique identifiercallIdentifier: Call/topic identifierstatus: Status code (see reference codes)deadline: Application deadlinedescription: Detailed descriptiontype: Opportunity typeframeworkProgramme: Framework programme coderaw_data: Original API response for debugging
Example Processed Result
{
"title": "EIC Accelerator",
"identifier": "HORIZON-EIC-2026-ACCELERATOR-01",
"callIdentifier": "HORIZON-EIC-2026-ACCELERATOR-01",
"status": "31094501",
"deadline": "2026-03-15",
"description": "Support for innovative SMEs...",
"type": "1",
"frameworkProgramme": "43108390",
"raw_data": {...} # Original API response
}
Go Client (eu_funding_api.go)
Requirements
go mod init eu-funding-api
go mod tidy
Usage
Basic Usage
package main
import (
"fmt"
"log"
)
func main() {
api := NewEUFundingAPI()
// Search for grants and tenders
results, err := api.SearchGrantsTenders(nil)
if err != nil {
log.Fatal(err)
}
fmt.Printf("Found %d opportunities\n", len(results.Results))
}
Search for EIC Accelerator
eicQuery := &SearchQuery{}
eicQuery.Bool.Must = []interface{}{
map[string]interface{}{
"terms": map[string][]string{
"type": {"1", "2", "8"},
},
},
map[string]interface{}{
"terms": map[string][]string{
"status": {"31094501", "31094502", "31094503"},
},
},
map[string]interface{}{
"term": map[string]string{
"callIdentifier": "HORIZON-EIC-2026-ACCELERATOR-01",
},
},
}
results, err := api.SearchGrantsTenders(eicQuery)
Get Topic Details
topicDetails, err := api.GetTopicDetails("HORIZON-EIC-2026-ACCELERATOR-01")
Available Methods
SearchGrantsTenders(query *SearchQuery)- Search for grants and tendersGetTopicDetails(topicIdentifier string)- Get topic detailsSearchGrantUpdates(frameworkProgramme string)- Search grant updatesSearchFAQs(programme string)- Search FAQsGetOrganizationData(picCode string)- Get organization dataSearchPartners(topic string)- Search for partnersSearchProjects(programmeID, missionGroup string)- Search projects
API Keys and Authentication
The APIs use the following keys:
- Search API:
SEDIA - FAQ API:
SEDIA_FAQ - Person/Organization API:
SEDIA_PERSON
No additional authentication is required for public data access.
Query Examples
Search for Open Grants
{
"bool": {
"must": [
{
"terms": {
"type": ["1", "2", "8"]
}
},
{
"terms": {
"status": ["31094501"]
}
}
]
}
}
Search by Framework Programme (Horizon Europe)
{
"bool": {
"must": [
{
"terms": {
"frameworkProgramme": ["43108390"]
}
}
]
}
}
Search by Topic
{
"bool": {
"must": [
{
"term": {
"callIdentifier": "HORIZON-EIC-2026-ACCELERATOR-01"
}
}
]
}
}
Reference Data Codes
Use the Facet API to understand reference codes:
-
Status Codes:
31094501: Open31094502: Forthcoming31094503: Closed
-
Type Codes:
0: Call for tenders1: Call for proposals2: Prize8: Cascade funding
-
Framework Programmes:
43108390: Horizon Europe
Integration with City Resource Graph
These API clients are designed to support the City Resource Graph project by:
- Automated Monitoring: Track new funding opportunities
- Data Collection: Gather comprehensive funding data
- Application Preparation: Access detailed topic information
- Partner Finding: Discover potential consortium partners
- Project Research: Study successful EU-funded projects
Error Handling
Both clients include proper error handling:
- Network timeouts (30 seconds default)
- HTTP status code validation
- JSON parsing error handling
- User-friendly error messages
Rate Limiting
The EU APIs may have rate limits. Consider implementing:
- Request throttling
- Caching mechanisms
- Retry logic with exponential backoff
License
This code is provided for the City Resource Graph project and EU funding application purposes.
Support
For API-related issues, refer to the EU Funding & Tenders Portal API documentation. /Users/damirmukimov/city_resource_graph/EU_FUNDING_API_README.md