API v1 · Premium

Documentation API

Créez des recherches de missions freelance et récupérez les résultats par programmation — pour brancher FreelanceMention à n8n, Zapier, Make ou vos propres scripts.

Démarrage rapide

  1. Abonnez-vous au plan Premium (l'API est incluse, sans surcoût).
  2. Dans l'app : Automatisation → Espace API → générez votre clé fm_live_… (affichée une seule fois).
  3. Appelez l'API avec le header x-api-key.
# 1. Créer une recherche
curl -X POST https://app.freelancemention.fr/api/v1/searches \
  -H "x-api-key: fm_live_VOTRE_CLE" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "React remote",
    "keywords": ["react", "typescript"],
    "work_mode": "remote",
    "only_direct_client": true
  }'

# 2. Récupérer les missions qui matchent
curl "https://app.freelancemention.fr/api/v1/searches/SEARCH_ID/results?limit=20" \
  -H "x-api-key: fm_live_VOTRE_CLE"

Authentification

Toutes les requêtes exigent votre clé API dans le header x-api-key (ou Authorization: Bearer fm_live_…). Une clé par compte : la régénérer révoque immédiatement l'ancienne. La clé n'est jamais stockée en clair chez nous (hash SHA-256 uniquement) — conservez-la précieusement.

URL de base : https://app.freelancemention.fr/api/v1

Limite : 60 requêtes/minute par clé · statut Premium revérifié à chaque appel · jusqu'à 50 recherches par compte.

POST/searches

Crée une recherche de missions. Les critères sont identiques à ceux des alertes de l'app.

Corps (JSON)

keywordsstring[] · requis

1 à 20 mots-clés — une mission matche si au moins un mot-clé apparaît dans le titre, la description, la ville ou l'entreprise.

excluded_keywordsstring[]

Exclut les missions contenant ces termes.

locationstring

Villes séparées par des virgules, ex. "paris, lyon".

work_modestring

Ex. "remote", "hybride".

min_tjmnumber

TJM minimum en € (les missions sans TJM affiché restent incluses).

only_off_marketboolean

Uniquement les missions absentes des jobboards.

only_direct_clientboolean

Uniquement les clients directs (sans ESN / cabinet).

namestring

Nom libre pour vous y retrouver.

Réponse — 201

{
  "id": "305e40a7-6fcf-41b6-bf0c-982947d26788",
  "name": "React remote",
  "keywords": ["react", "typescript"],
  "only_direct_client": true,
  "created_at": "2026-07-09T14:38:32Z",
  "results_url": "/api/v1/searches/305e40a7-…/results"
}
GET/searches

Liste vos recherches (les vôtres uniquement — isolation stricte par compte).

GET/searches/{id}/results

Renvoie les missions détectées qui matchent la recherche, les plus récentes d'abord (30 derniers jours par défaut).

Paramètres de requête

limitnumber

1 à 100 (défaut 20).

offsetnumber

Pagination (défaut 0).

sinceISO 8601

Ne renvoyer que les missions détectées après cette date — idéal pour du polling : passez le detected_at de votre dernière mission traitée.

Réponse — 200

{
  "search_id": "305e40a7-…",
  "total": 40,
  "limit": 20,
  "offset": 0,
  "data": [
    {
      "id": "…",
      "title": "Développeur fullstack senior — Node.js / React (Paris)",
      "description": "…",
      "company": "…",
      "city": "Paris",
      "work_mode": "Hybride",
      "tjm": "550-600 €",
      "tjm_amount": 550,
      "duration": "6 mois",
      "is_off_market": true,
      "is_direct_client": true,
      "poster_firstname": "…",
      "poster_lastname": "…",
      "poster_linkedin": "https://linkedin.com/in/…",
      "contact_email": "…",
      "linkedin_post_url": "https://linkedin.com/posts/…",
      "detected_at": "2026-07-09T10:34:12Z"
    }
  ]
}

Erreurs

Format uniforme : { "error": { "code", "message" } }

401missing/invalid_api_key

Clé absente, inconnue ou révoquée.

403premium_required

Le compte n'est pas (ou plus) abonné Premium.

400keywords_required, …

Corps ou paramètre invalide — le message précise quoi.

404search_not_found

Recherche inexistante ou appartenant à un autre compte.

429rate_limited

Plus de 60 requêtes/minute — réessayez après quelques secondes.

Recette : polling toutes les 15 min (n8n, Make, cron)

  1. Créez la recherche une fois (POST /searches) et stockez son id.
  2. Toutes les 15 min : GET /searches/{id}/results?since={derniere_date}.
  3. Pour chaque mission reçue : envoyez-la où vous voulez (Slack, Notion, email…) et mémorisez le detected_at le plus récent pour le prochain appel.

Astuce : les abonnés Premium ont aussi des webhooks natifs sur les alertes (push au lieu de polling) — configurables dans l'app, section Automatisation.

Prêt à brancher vos outils ?

L'API est incluse dans le plan Premium, sans surcoût. Générez votre clé dans l'app et lancez votre première requête en 2 minutes.

Ouvrir l'app