ProfilCulture APIprofilculture.com ↗
Access job listings from ProfilCulture, France's cultural and media job board. Filter by sector, region, contract type, and job family via 10 endpoints.
What is the ProfilCulture API?
The ProfilCulture API exposes 10 endpoints covering job listings and full offer details from France's dedicated cultural and media sector job board. The search_offers_combined endpoint lets you apply up to four filter dimensions simultaneously — keyword, region, sector, and contract type — while get_offer_detail returns per-offer fields including salary, application deadline, employer logo URL, and job sector.
curl -X GET 'https://api.parse.bot/scraper/98a9023f-6e90-46dd-98a0-3c3d81d5aab3/list_all_offers?page=1' \ -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 profilculture-com-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.
"""
ProfilCulture Job Board API - Usage Example
Get your API key from: https://parse.bot/settings
"""
from parse_apis.profilculture_job_board_api import ProfilCulture, Sector, Region, ContractType, JobFamily
client = ProfilCulture()
# Search for communication jobs in Île-de-France
for offer in client.offers.search_by_region(region_ids=Region.ILE_DE_FRANCE, limit=5):
print(offer.title, offer.employer, offer.location, offer.contract_type)
# Filter by sector using enum
for offer in client.offers.search_by_sector(sector_ids=Sector.SPECTACLE_VIVANT, limit=3):
print(offer.title, offer.date_posted, offer.is_urgent)
# Get full details of an offer
detail = offer.details()
print(detail.title, detail.employer, detail.contract_type, detail.salary)
Retrieve all job offers with pagination. Returns approximately 20 offers per page across all categories (employment, internships, apprenticeships). Results are ordered by posting date descending.
| Param | Type | Description |
|---|---|---|
| page | integer | Page number for pagination. |
{
"type": "object",
"fields": {
"jobs": "array of job listing objects with title, employer, location, date_posted, is_urgent, contract_type, start_date, url, and id",
"page": "integer indicating the current page number"
},
"sample": {
"data": {
"jobs": [
{
"id": "490524",
"url": "https://www.profilculture.com/annonce/chef-comptable-490524.html",
"title": "Chef.fe comptable",
"employer": "Le Cratère - Scène Nationale d'Alès",
"location": "Alès (30)",
"is_urgent": true,
"start_date": "20 août 2026",
"date_posted": "10/06/26",
"contract_type": "CDI"
}
],
"page": 1
},
"status": "success"
}
}About the ProfilCulture API
Listing and Filtering Endpoints
The API provides three listing endpoints for broad retrieval: list_all_offers returns all active offers across employment, internship, and apprenticeship categories; list_employment_offers limits results to CDI and CDD contracts; and list_internship_offers covers stages, alternance, and civic service positions. All three accept an optional page integer for pagination, and each page returns approximately 20 job objects containing title, employer, location, date_posted, is_urgent, contract_type, start_date, url, and id.
Dimension-Specific Search Endpoints
Four endpoints narrow results by a single dimension. search_offers_by_sector accepts a comma-separated sector_ids string covering six sectors (e.g., 1 for Audiovisuel, 6 for Art/Architecture/Design). search_offers_by_contract_type maps eight contract types including CDI (1), Stage (7), and Alternance (8). search_offers_by_region supports all 18 metropolitan and overseas French regions via region_ids. search_offers_by_job_family filters by 13 professional families such as Communication/Promotion/Marketing (3) and Production/Réalisation/Programmation (4). All return the same jobs array shape plus the url string showing the constructed filter applied.
Keyword Search and Combined Filters
search_offers_by_keyword accepts a required keyword param and echoes it back in the response as keyword alongside the matching jobs array. For multi-dimensional queries, search_offers_combined accepts any combination of keyword, region_ids, sector_ids, contract_ids, and job_family_ids in a single call, making it the most flexible endpoint for building search or aggregation workflows.
Offer Detail
get_offer_detail accepts either a full listing url or a slug_id extracted from the URL path after /annonce/. It returns the most complete record: title, employer, location, contract_type, start_date, deadline, salary, sector, website, logo_url, and is_urgent. Fields like salary, deadline, and website are conditionally present depending on what the employer published.
The ProfilCulture API is a managed, monitored endpoint for profilculture.com — not a raw scraper you maintain. Every endpoint is automatically health-checked on a schedule, and when profilculture.com 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 profilculture.com 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 CDI and CDD openings in the French audiovisual sector filtered by Île-de-France region for a job alert service.
- Monitor
is_urgentlistings daily across all categories to surface time-sensitive cultural sector roles. - Build a bilingual job board aggregating ProfilCulture internship offers filtered by
job_family_idsfor communication and marketing roles. - Extract
employer,website, andlogo_urlfromget_offer_detailto enrich a directory of French cultural organisations. - Track
date_postedanddeadlinefields across sectors to analyse hiring seasonality in France's live performance industry. - Pipe
search_offers_combinedresults into a candidate-matching tool using keyword, contract type, and region filters simultaneously. - Collect salary data from
get_offer_detailresponses to benchmark compensation in the French cultural and media job market.
| Tier | Price | Credits/month | Rate limit |
|---|---|---|---|
| Free | $0/mo | 100 | 5 req/min |
| Hobby | $30/mo | 1,000 | 20 req/min |
| Developer | $100/mo | 5,000 | 100 req/min |
One credit = one API call regardless of which marketplace API you call. Exceeding the rate limit returns a 429 response. Authenticate with the X-API-Key header.
Does ProfilCulture offer an official developer API?+
What is the difference between the single-dimension filter endpoints and `search_offers_combined`?+
search_offers_by_sector, search_offers_by_region, search_offers_by_contract_type, and search_offers_by_job_family each accept one filter dimension. search_offers_combined accepts all four dimensions plus a keyword in a single request, which is useful when you need to intersect multiple criteria — for example, Stage contracts in Bretagne within the Spectacle vivant sector.Which fields in `get_offer_detail` are not always present?+
salary, deadline, website, logo_url, sector, and start_date are conditionally returned only when the employer has included them in the listing. Fields like title, employer, location, and is_urgent are consistently present.Does the API expose the full job description text for each offer?+
get_offer_detail returns structured metadata fields such as title, employer, salary, sector, and deadline, but does not include the free-text job description body. You can fork this API on Parse and revise it to add a description field from the offer detail page.Are job listings from French overseas territories (DOM-TOM) included in region filtering?+
search_offers_by_region endpoint covers 18 region IDs including overseas regions; however, coverage depends on what employers have posted on ProfilCulture for those territories. Listings outside metropolitan France may be sparse. You can fork this API on Parse and revise it to add a dedicated overseas-only filter endpoint if needed.