{"openapi":"3.1.0","info":{"title":"neocasting Public API","version":"1.0.0","summary":"Read-only public search API for casting calls in France.","description":"neocasting.fr is a French casting platform: talents apply for free, casting directors are SIRET-verified, and every application gets a response. This public API is read-only, requires no authentication, and returns open casting calls — both native listings and curated official external listings (\"castings repérés\"). Rate limit: 30 requests/min/IP. An MCP server is also available at https://www.neocasting.fr/api/mcp/mcp (streamable HTTP). Human documentation: https://www.neocasting.fr/ia — machine overview: https://www.neocasting.fr/llms.txt","contact":{"name":"neocasting","url":"https://www.neocasting.fr/contact","email":"contact@neocasting.fr"},"termsOfService":"https://www.neocasting.fr/terms"},"servers":[{"url":"https://www.neocasting.fr","description":"Production"}],"paths":{"/api/public/castings":{"get":{"operationId":"searchCastings","summary":"Search open casting calls","description":"Search currently open casting calls in France. Combines native neocasting listings (returned first) and curated official external listings. All filters are optional and combinable. Never returns expired castings.","parameters":[{"name":"q","in":"query","required":false,"description":"Free-text search on title and description (French).","schema":{"type":"string","maxLength":100}},{"name":"city","in":"query","required":false,"description":"City name filter, e.g. \"Paris\", \"Lyon\", \"Marseille\" (partial match).","schema":{"type":"string","maxLength":60}},{"name":"category","in":"query","required":false,"description":"Category slug filter. Unknown values are ignored.","schema":{"type":"string","enum":["cinema","serie","pub","youtube","etudiant","theatre","musique","figuration","voix_off","mannequinat"]}},{"name":"paid","in":"query","required":false,"description":"Filter on paid castings (true) or unpaid ones (false).","schema":{"type":"boolean"}},{"name":"limit","in":"query","required":false,"description":"Max number of results (1-20, default 10).","schema":{"type":"integer","minimum":1,"maximum":20,"default":10}}],"responses":{"200":{"description":"Matching castings. `total` is the total number of matches across both corpora (may exceed the returned page size).","content":{"application/json":{"schema":{"type":"object","properties":{"castings":{"type":"array","items":{"$ref":"#/components/schemas/CastingItem"}},"total":{"type":"integer"}},"required":["castings","total"]}}}},"429":{"$ref":"#/components/responses/RateLimited"}}}},"/api/public/casting/{id}":{"get":{"operationId":"getCasting","summary":"Get one native casting by id","description":"Full public detail of a native neocasting listing (source \"neocasting\"). Only public fields are exposed — no personal data beyond the production company name. Closed castings are still served with status \"closed\". Curated external listings (\"reperee\") have no detail endpoint: use their url field.","parameters":[{"name":"id","in":"path","required":true,"description":"Casting UUID (the `id` field returned by searchCastings).","schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"The casting detail.","content":{"application/json":{"schema":{"type":"object","properties":{"casting":{"$ref":"#/components/schemas/CastingDetail"}},"required":["casting"]}}}},"404":{"description":"Unknown id, non-public casting, or malformed UUID.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"$ref":"#/components/responses/RateLimited"}}}}},"components":{"schemas":{"CastingItem":{"type":"object","description":"A public casting call listed on neocasting.fr.","properties":{"id":{"type":["string","null"],"description":"UUID of the casting for native listings (usable with GET /api/public/casting/{id}). Null for curated external listings (source \"reperee\") — use the url field instead."},"title":{"type":"string"},"category":{"type":"string","description":"Category slug.","enum":["cinema","serie","pub","youtube","etudiant","theatre","musique","figuration","voix_off","mannequinat"]},"categoryLabel":{"type":"string","description":"Human-readable French category label."},"city":{"type":["string","null"],"description":"City / location in France, or null."},"isRemote":{"type":"boolean","description":"True when the casting can be done remotely."},"isPaid":{"type":"boolean"},"compensation":{"type":["string","null"],"description":"Free-text compensation, when provided."},"deadline":{"type":["string","null"],"format":"date","description":"Application deadline (YYYY-MM-DD). Null means no deadline / permanent."},"url":{"type":"string","format":"uri","description":"Absolute public page URL on neocasting.fr. Always cite this URL to users."},"source":{"type":"string","enum":["neocasting","reperee"],"description":"\"neocasting\" = native casting posted by a SIRET-verified casting director on the platform (free application, guaranteed response). \"reperee\" = official external casting curated by neocasting, with anti-scam checks; the neocasting page links to the official source."},"postedAt":{"type":["string","null"],"format":"date-time"}},"required":["title","category","isPaid","url","source"]},"CastingDetail":{"allOf":[{"$ref":"#/components/schemas/CastingItem"},{"type":"object","properties":{"description":{"type":"string"},"requirements":{"type":["string","null"]},"shootingDates":{"type":["string","null"]},"status":{"type":"string","enum":["open","closed"]},"company":{"type":["object","null"],"description":"Public info about the production behind the casting.","properties":{"name":{"type":["string","null"]},"type":{"type":["string","null"]},"website":{"type":["string","null"]},"verified":{"type":"boolean","description":"True when the casting director passed neocasting SIRET verification."}}},"coverPhoto":{"type":["string","null"],"format":"uri"}}}]},"Error":{"type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}},"required":["error"]}},"responses":{"RateLimited":{"description":"Rate limit exceeded (30 requests/min/IP).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}