Combinez Surfer SEO avec une API de recherche pour extraire des données SERP en temps réel tout en bénéficiant des recommandations de contenu de Surfer. Surfer SEO fournit des conseils sur la structure du contenu et la densité des mots-clés, mais il ne montre pas le paysage SERP en direct pendant que vous écrivez. En interrogeant l'API de recherche pour votre mot-clé cible, vous pouvez voir les featured snippets actuels, les questions « Les gens demandent aussi » et les titres des concurrents en temps réel. Cela vous permet d'aligner votre contenu à la fois sur les recommandations basées sur le NLP de Surfer et sur la page de résultats de recherche réelle.
Prérequis
- Python 3.8+ installé
- bibliothèque requests installée
- Une clé API Scavio provenant de scavio.dev
- Un compte Surfer SEO (Essential $99/mo ou supérieur)
Parcours
Étape 1: Interroger le SERP pour le mot-clé cible
Récupérer le SERP Google actuel pour le mot-clé que vous optimisez dans Surfer SEO.
import os, requests, json
API_KEY = os.environ['SCAVIO_API_KEY']
def get_serp(keyword: str) -> dict:
resp = requests.post('https://api.scavio.dev/api/v1/search',
headers={'x-api-key': API_KEY},
json={'platform': 'google', 'query': keyword}, timeout=15)
return resp.json()
serp = get_serp('best project management tools 2026')
print(f"Organic results: {len(serp.get('organic_results', []))}")
print(f"People Also Ask: {len(serp.get('people_also_ask', []))}")Étape 2: Extraire les signaux de contenu des concurrents
Analyser les pages les mieux classées pour comprendre leurs modèles de titres, les signaux de nombre de mots et les angles de contenu.
def analyze_competitors(serp: dict) -> list:
competitors = []
for r in serp.get('organic_results', [])[:10]:
competitors.append({
'position': r.get('position', 0),
'title': r.get('title', ''),
'url': r.get('link', ''),
'snippet_length': len(r.get('snippet', '')),
'has_date': any(str(y) in r.get('title', '') for y in [2025, 2026]),
'has_number': any(c.isdigit() for c in r.get('title', '')),
})
return competitors
comps = analyze_competitors(serp)
for c in comps[:5]:
print(f"#{c['position']}: {c['title'][:55]} (date={c['has_date']})")Étape 3: Capturer les questions « Les gens demandent aussi »
Récupérer les questions PAA à intégrer dans votre contenu Surfer en tant que sous-titres H2 ou H3.
def get_paa(serp: dict) -> list:
paa = serp.get('people_also_ask', [])
questions = []
for item in paa:
if isinstance(item, dict):
questions.append(item.get('question', ''))
elif isinstance(item, str):
questions.append(item)
return questions
questions = get_paa(serp)
print('People Also Ask questions to address in your content:')
for q in questions:
print(f' - {q}')Étape 4: Extraire le format du featured snippet
Déterminer le format actuel du featured snippet afin de structurer votre contenu pour être compétitif.
def analyze_snippet(serp: dict) -> dict:
snippet = serp.get('featured_snippet', serp.get('answer_box', {}))
if not snippet or not isinstance(snippet, dict):
return {'type': 'none', 'exists': False}
snippet_text = snippet.get('snippet', snippet.get('answer', ''))
has_list = '<li>' in str(snippet) or isinstance(snippet.get('list'), list)
has_table = '<table>' in str(snippet) or isinstance(snippet.get('table'), list)
return {
'exists': True,
'type': 'list' if has_list else 'table' if has_table else 'paragraph',
'text_length': len(str(snippet_text)),
'source': snippet.get('link', snippet.get('source', '')),
}
fs = analyze_snippet(serp)
print(f"Featured snippet: {fs['type']} ({fs.get('text_length', 0)} chars)")Étape 5: Générer un brief de contenu
Combiner les insights SERP avec les recommandations de Surfer SEO en un seul brief de contenu.
def generate_brief(keyword: str) -> dict:
serp = get_serp(keyword)
comps = analyze_competitors(serp)
paa = get_paa(serp)
snippet = analyze_snippet(serp)
titles_with_dates = sum(1 for c in comps if c['has_date'])
brief = {
'keyword': keyword,
'competitor_count': len(comps),
'titles_with_year': titles_with_dates,
'paa_questions': paa,
'featured_snippet': snippet,
'top_3_titles': [c['title'] for c in comps[:3]],
'recommendations': [],
}
if titles_with_dates > 3:
brief['recommendations'].append('Include 2026 in your title')
if snippet['exists']:
brief['recommendations'].append(f"Target a {snippet['type']} featured snippet")
if paa:
brief['recommendations'].append(f'Address {len(paa)} PAA questions as subheadings')
return brief
brief = generate_brief('best project management tools 2026')
for rec in brief['recommendations']:
print(f' > {rec}')Exemple Python
import requests, os
H = {'x-api-key': os.environ['SCAVIO_API_KEY']}
def serp_brief(keyword):
data = requests.post('https://api.scavio.dev/api/v1/search', headers=H,
json={'platform': 'google', 'query': keyword}).json()
titles = [r['title'] for r in data.get('organic_results', [])[:5]]
paa = [q.get('question', q) if isinstance(q, dict) else q for q in data.get('people_also_ask', [])]
return {'titles': titles, 'paa': paa}
print(serp_brief('best project management tools 2026'))Exemple JavaScript
const H = {'x-api-key': process.env.SCAVIO_API_KEY, 'Content-Type': 'application/json'};
async function serpBrief(keyword) {
const r = await fetch('https://api.scavio.dev/api/v1/search', {
method: 'POST', headers: H,
body: JSON.stringify({platform: 'google', query: keyword})
});
const data = await r.json();
return {
titles: (data.organic_results || []).slice(0, 5).map(r => r.title),
paa: (data.people_also_ask || []).map(q => q.question || q)
};
}
serpBrief('best project management tools 2026').then(console.log);Sortie attendue
A content brief combining Surfer SEO recommendations with live SERP data including competitor titles, PAA questions, and featured snippet analysis for better content optimization.