Stage APIstage.ma ↗
Search and discover internship opportunities across Morocco's job market by accessing detailed listings from Stage.ma, including position details, requirements, and company information. Find the perfect internship match by filtering through available opportunities on the platform.
curl -X GET 'https://api.parse.bot/scraper/f6d6378b-fce9-41d8-86e6-6cd0de4e0708/search_internships?page=1&salary=true&search=marketing&location=5&specialty=8&remote_type=onsite' \ -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 stage-ma-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: Stage.ma SDK — search and inspect Moroccan internships."""
from parse_apis.stage_ma_api import StageMa, Specialty, RemoteType, InternshipNotFound
client = StageMa()
# Search internships filtered by specialty (Marketing)
for internship in client.internship_summaries.search(specialty=Specialty.MARKETING, limit=3):
print(internship.title, "|", internship.location, "|", internship.duration)
# Drill into the first IT internship for full details
it_result = client.internship_summaries.search(
specialty=Specialty.INFORMATIQUE, limit=1
).first()
if it_result:
detail = it_result.details()
print(detail.title, detail.city, detail.salary, detail.availability)
print(detail.description[:120])
# Search with remote type filter and paid only
for internship in client.internship_summaries.search(
remote_type=RemoteType.ONSITE, salary="true", limit=3
):
print(internship.title, internship.company, internship.tags)
# Typed error handling: attempt to get a non-existent internship
if it_result:
try:
detail = it_result.details()
print(detail.title, detail.published_date)
except InternshipNotFound as exc:
print(f"Not found: {exc.slug}")
print("exercised: search (specialty/remote_type/salary filters) / details / error handling")
Search internship listings on Stage.ma with optional filters for specialty, location, remote type, and salary. Returns paginated results with 10 items per page. Each result includes title, company, location, duration, start date, and tags.
| Param | Type | Description |
|---|---|---|
| page | integer | Page number for pagination. |
| salary | string | Set to 'true' to filter only paid internships, 'false' or omit for all. |
| search | string | Free-text search query to filter internships by title or keywords. |
| location | string | City ID to filter by location. |
| specialty | string | Specialty ID to filter by field of study. |
| remote_type | string | Presence type filter. |
{
"type": "object",
"fields": {
"count": "integer",
"internships": "array of internship summary objects",
"current_page": "integer",
"has_next_page": "boolean"
},
"sample": {
"data": {
"count": 10,
"internships": [
{
"id": "9312",
"slug": "9312-offre-de-stage-photographer-videographer",
"tags": [
"Marketing",
"Stage Opérationnel"
],
"title": "Offre de Stage – Photographer / Videographer",
"company": "Billionnaire Invest",
"duration": "1 - 3 mois",
"location": "Casablanca",
"positions": 2,
"start_date": "19/04/2026",
"company_url": "https://www.stage.ma/organismes/16972-billionnaire-invest",
"free_submissions_left": 15
}
],
"current_page": 1,
"has_next_page": true
},
"status": "success"
}
}About the Stage API
The Stage API on Parse exposes 2 endpoints for the publicly available data on stage.ma. Calls return JSON over HTTPS and are billed per successful response.
Pin a release with the API-Snapshot-Version header so canonical updates don't silently change your contract.