The Textfocus APIs allow you to perform various SEO and semantic analyses. This documentation explains how to call them, their parameters and their usefulness. APIs are available to subscribers of the "Classic" and "Comfort" packs.
API calls are limited to 30 per day in the Classic plan and 1 per minute in the Agency plan.
Each request consumes a credit on your account.
You can find your API key at your account.
The optional parameter force_refetch (value 1) is supported by all APIs except tf_langs and tf_robotstxt. When enabled, the cache is bypassed and all computations are rerun on the fly. Use with caution: this increases response time and consumes a credit just like a normal call.
These APIs have been public since March 2025. We know how important it is for APIs to be responsive and answer without error.
If, despite our vigilance, you encounter any error codes with the APIs, please contact us. We'll do our best to get back to you as soon as possible.
The MCP (Model Context Protocol) allows an AI assistant (Claude, Windsurf, Cursor, Cline, etc.) to directly call Textfocus APIs during a conversation, without you having to copy and paste data.
AI can thus run an SEO analysis, retrieve search volumes, or compare competitors, then interpret the results and make recommendations—all in a single interaction.
Textfocus offers a hosted MCP server accessible at the following address:
https://textfocus.onrender.com/ssehttps://textfocus.onrender.com/mcpIn both cases, your API key must be provided with every connection.
Open the configuration file:
%APPDATA%\Claude\claude_desktop_config.json~/Library/Application Support/Claude/claude_desktop_config.jsonAdd the following entry to the mcpServers section:
{
"mcpServers": {
"textfocus": {
"type": "sse",
"url": "https://textfocus.onrender.com/sse",
"headers": {
"X-API-Key": "Your API key"
}
}
}
}
Restart Claude Desktop. The Textfocus tools (tf_seo, tf_keyword, tf_competition…) will then appear in the list of available tools (hammer icon).
In Settings → Integrations, add a new MCP server using the following URL:
https://textfocus.onrender.com/mcp?key=Your API key
The OAuth fields are optional and can be left blank. Your key is passed directly in the URL.
In the Claude Code configuration file (~/.claude.json or in the project settings), add:
{
"mcpServers": {
"textfocus": {
"type": "sse",
"url": "https://textfocus.onrender.com/sse",
"headers": {
"X-API-Key": "Your API key"
}
}
}
}
These publishers support remote MCP servers via SSE. In their MCP settings, enter:
https://textfocus.onrender.com/sseX-API-Key: Your API keyOnce logged in, the AI has access to the following tools:
tf_endpoints — List of all available endpoints, along with their parameters and credit coststf_langs — List of available languages and marketstf_keyword — Search volume, CPC, and keyword difficultytf_related — Terms semantically related to a keywordtf_semantic — Comprehensive semantic analysis (expected vocabulary, TF-IDF)tf_seo — Comprehensive SEO analysis of a web pagetf_geo — IA-Ready Score and GEO Analysis of a Pagetf_robotstxt — Analysis of a domain's robots.txt filetf_lexical — Lexical field of a web pagetf_position — A domain's ranking for a keywordtf_competition — Competitive analysis for a keywordtf_structured_data — Extraction and analysis of structured JSON-LD (Schema.org) data from a pageEach tool call consumes one credit, just like a standard API call.
Description : Returns information about the account associated with the API key: profile, plan, AppSumo codes, remaining credits, and credits used over the past 30 days.
Endpoint : https://www.textfocus.net/apis/tf_account/
Method : POST
Parameters :
key (string, requis) : API key.This endpoint does not use any credits.
result.account.name — Member's nameresult.account.email — Email addressresult.account.company, address, city, zip, country — Contact Informationresult.pack.name — Name of the subscription planresult.pack.recurring — Type de récurrence (monthly, yearly, life, none)result.pack.apiAccess — API access enabledresult.pack.entitiesAccess — Access to named entity recognitionresult.pack.translateAccess — Access the translationresult.pack.whiteLabel — White label enabled (PDF exports without the Textfocus brand)result.pack.daysArchive — Retention period for records (days)result.pack.nbCompeteMax — Maximum number of competitors that can be analyzedresult.pack.nbSuggestMax — Maximum number of semantic suggestionsresult.pack.rateInterval / rateMax — API rate limits for the packageresult.appSumoCodes — List of AppSumo codes activated on the account (code, type)result.credits.remaining — Remaining creditsresult.credits.consumed30days — Total credits used in the last 30 daysresult.credits.byType30days — Usage by API type over the past 30 daysDescription : Lists all available endpoints along with their parameters, descriptions, and credit costs.
Endpoint : https://www.textfocus.net/apis/tf_endpoints/
Method : POST
Parameters :
key (string, requis) : API key.This endpoint does not use any credits.
Description : Provides a list of available languages. The returned identifiers (the id field) correspond to language+market codes that can be used directly in the lang parameter of all other APIs (e.g., fr-CA resolves to the ID for the French-speaking Canadian market).
Endpoint : https://www.textfocus.net/apis/tf_langs/
Method : POST
Parameters :
key (string, requis) : API key.Description : Provides data on a given keyword (search volume, cost per click, etc.).
Endpoint : https://www.textfocus.net/apis/tf_keyword/
Method : POST
Parameters :
key (string, requis) : API key.lang (string, requis) : 5-character language+market code (e.g., fr-FR, en-US, fr-CA) — the recommended format for targeting a specific market. A 2-character code (e.g., fr) is also accepted. See tf_langs for a complete list of available codes.keyword (array ou string, requis) : List of keywords to analyze.force_refetch (int, optional) : Set to 1 to bypass the cache and force a recalculation.Example of a JSON response :
{
"version": "1.0.3",
"params": {
"lang": "fr",
"keyword": ["agence en référencement", "agence seo"],
"key": "Your API key"
},
"result": {
"agence en référencement": {
"id": "agence en référencement",
"lang": "fr",
"cost": 13.06,
"concurrency": 6.00,
"volume": 27100,
"difficulty": 87
},
{
"id": "agence seo",
"lang": "fr",
"cost": 4.14,
"concurrency": 28.00,
"volume": 27100,
"difficulty": 87
}
},
"response": 200,
"message": "ok",
"timing": 0.020776,
"creditUsed": 1,
"method": "tf_keyword",
"credits": 294
}
Description : Provides terms related to a given keyword.
Endpoint : https://www.textfocus.net/apis/tf_related/
Method : POST
key (string, requis) : API key.lang (string, requis) : 5-character language+market code (e.g., fr-FR, en-US, fr-CA) — the recommended format for targeting a specific market. A 2-character code (e.g., fr) is also accepted. See tf_langs for a complete list of available codes.keyword (string, requis) : Keyword to analyze.force_refetch (int, optional) : Set to 1 to bypass the cache and force a recalculation.Example of a JSON response :
{
"version": "1.0.3",
"params": {
"lang": "fr",
"keyword": "agence seo",
"key": "Your API key"
},
"result": {
"semantic": {
"0": {
"id" : "agence seo",
"keyword" : "meilleure agence seo",
"lang" : "fr",
"type" : "match",
"ngram" : "3",
"cost" : "0.00",
"concurrency" : "2",
"volume" : "22200",
"intent" : "navigational",
"difficulty" : "19"
},
"1": {
"id" : "agence seo",
"keyword" : "agence seo lyon",
"lang" : "fr",
"type" : "match",
"ngram" : "3",
"cost" : "6.11",
"concurrency" : "18",
"volume" : "1600",
"intent" : "commercial",
"difficulty" : "56"
},
// Up to 100 terms can be returned },
"response": 200,
"message": "ok",
"timing": 0.3334009999999999,
"creditUsed": 1,
"method": "tf_related",
"credits": 2947
}
Description : Performs a complete SEO analysis of a web page.
Endpoint : https://www.textfocus.net/apis/tf_seo/
Method : POST
key (string, requis) : API key.lang (string, requis) : 5-character language+market code (e.g., fr-FR, en-US, fr-CA) — the recommended format for targeting a specific market. A 2-character code (e.g., fr) is also accepted. See tf_langs for a complete list of available codes.keyword (string, requis) : Target keyword.url (string, requis) : URL of the page to be analyzed.force_refetch (int, optional) : Set to 1 to bypass the cache and force a recalculation.verbose (int, optional, default: 0) : By default (0), the response is stripped down: contentBrut and footerTxt are excluded, words that appear only once in words are filtered out, and listPresence.footerTxt is limited to 20 entries. Set to 1 to get the full response.Example of a JSON response :
{
"version": "1.0.3",
"params": {
"lang": "fr",
"keyword": "agence seo",
"url": "https://beweb.fr/seo/",
"key": "Your API key"
},
"result": {
"packId": "14",
"nbCompeteMax": "50",
"url": "https://beweb.fr/seo/",
"urlDecode": "https://beweb.fr/seo/",
"nbH1": 1,
"entitiesNotSupported": false,
"typePage": "page",
"jsonLdType": "WebPage",
"firstWords": "vous cherchez [...] et une longue",
"footerTxt": "On nous demande [...]",
"host": "https://beweb.fr",
"urlWords": " beweb seo ",
"contentBrut": "Skip to content . AGENCE SEO . Pilotez votre référencement naturel. [...].",
"nbLinksOut": 16,
"nbLinksOutExt": 5,
"canon": "https://beweb.fr/seo/",
"title": "Agence SEO France - Référencement Naturel Google | BEWEB",
"description": "Besoin d'une agence SEO pour améliorer votre visibilité en ligne ? [...].",
"robots": "index, follow, max-image-preview:large, max-snippet:-1, max-video-preview:-1",
"h1": "AGENCE SEO Pilotez votre référencement naturel",
"h2": [
"Les services de notre agence SEO Nos solutions pour développer votre référencement naturel",
"Besoin d'une agence SEO ? Contactez nos consultants dès maintenant"
],
"h3": [
"Audit SEO Trouver les freins au référencement",
"Recherche de mots clés Les bons mots pour être visible",
"Accompagnement SEO Etre accompagné sur la durée",
"Rédaction des balises Optimisation des balises SEO",
"Refonte SEO Guide / cahier des charges SEO",
"SEO Rennes Référencement en région rennaise",
"Voici quelques avis de nos clients",
"Ils font confiance à nos experts SEO",
"Profitez de l'expérience d'une agence SEO Pour augmenter votre trafic naturel et vos conversions",
"Référencement naturel de qualité Avec une agence proche de vous",
"Améliorez la visibilité de vos sites dès maintenant !",
"Nos dernières publications sur le SEO",
"Stratégie SEO : les 14 méthodes de travail que nous utilisons le plus en 2024",
"Stratégie SEO : les 14 méthodes de travail que nous utilisons le plus en 2024",
"Utiliser Looker Studio pour analyser les performances de vos pages",
"Utiliser Looker Studio pour analyser les performances de vos pages",
"Quand faire un audit seo ?",
"Quand faire un audit seo ?",
"Pourquoi utiliser les services de notre agence SEO ?"
],
"hn": [
{
"level": "1",
"tag": "h1",
"hn": " AGENCE SEO Pilotez votre référencement naturel"
},
{
"level": "2",
"tag": "h2",
"hn": " Les services de notre agence SEO Nos solutions pour développer votre référencement naturel"
},
{
"level": "3",
"tag": "h3",
"hn": "Audit SEOTrouver les freins au référencement"
},
{
"level": "3",
"tag": "h3",
"hn": "Recherche de mots clés Les bons mots pour être visible"
},
{
"level": "3",
"tag": "h3",
"hn": "Accompagnement SEO Etre accompagné sur la durée"
},
{
"level": "3",
"tag": "h3",
"hn": "Rédaction des balises Optimisation des balises SEO"
},
{
"level": "3",
"tag": "h3",
"hn": "Refonte SEO Guide / cahier des charges SEO"
},
{
"level": "3",
"tag": "h3",
"hn": "Référencement en région rennaise"
},
{
"level": "3",
"tag": "h3",
"hn": " Voici quelques avis de nos clients "
},
{
"level": "3",
"tag": "h3",
"hn": " Ils font confiance à nos experts SEO "
},
{
"level": "3",
"tag": "h3",
"hn": " Profitez de l'expérience d'une agence SEO Pour augmenter votre trafic naturel et vos conversions"
},
{
"level": "3",
"tag": "h3",
"hn": " Référencement naturel de qualité Avec une agence proche de vous"
},
{
"level": "3",
"tag": "h3",
"hn": " Améliorez la visibilité de vos sites dès maintenant ! "
},
{
"level": "4",
"tag": "h4",
"hn": "Privacy Overview"
}
],
"anchors": [
{
"anchor": "consultant seo",
"link": "https://beweb.fr/",
"rel": "",
"title": "Consultant SEO"
},
{
"anchor": "services seo",
"link": "https://beweb.fr/seo/",
"rel": "",
"title": "Services SEO"
},
{
"anchor": "services web",
"link": "https://beweb.fr/web/",
"rel": "",
"title": "Services Web"
},
{
"anchor": "plan du site",
"link": "https://beweb.fr/plan-du-site/",
"rel": "",
"title": ""
},
{
"anchor": "contactez-nous",
"link": "/contact/",
"rel": "",
"title": ""
},
{
"anchor": "",
"link": "#li-page-top",
"rel": "",
"title": ""
},
{
"anchor": "",
"link": "https://www.cookieyes.com/",
"rel": "",
"title": ""
}
],
"images": {
"https://beweb.fr/wp-content/uploads/2020/09/beweb-logo-60.png": {
"alt": "Consultant SEO : Expert référencement de site internet à Rennes",
"title": "",
"width": "",
"height": ""
},
"https://beweb.fr/wp-content/uploads/2020/11/3249202edit.png": {
"alt": "agence seo",
"title": "",
"width": "900",
"height": "574"
},
"https://beweb.fr/wp-content/uploads/2020/11/ubiqus-logo.png": {
"alt": "ubiqus logo",
"title": "",
"width": "261",
"height": "100"
},
"https://beweb.fr/wp-content/uploads/2020/11/idaos-logo.png": {
"alt": "idaos logo",
"title": "",
"width": "226",
"height": "100"
},
"https://beweb.fr/wp-content/uploads/2016/07/orange_obs.jpg": {
"alt": "",
"title": "",
"width": "194",
"height": "100"
},
"https://beweb.fr/wp-content/uploads/2016/07/lylo_2015.png": {
"alt": "",
"title": "",
"width": "121",
"height": "100"
},
"https://beweb.fr/wp-content/uploads/2016/07/Creative-Ingenierie-logo_165X165.jpg": {
"alt": "",
"title": "",
"width": "206",
"height": "100"
},
"https://beweb.fr/wp-content/uploads/2020/11/augmentez-votre-trafic-naturel.png": {
"alt": "Augmentez votre trafic naturel",
"title": "",
"width": "801",
"height": "555"
},
"https://beweb.fr/wp-content/uploads/2020/11/3339159small.png": {
"alt": "3339159small",
"title": "",
"width": "506",
"height": "555"
},
"https://beweb.fr/wp-content/uploads/2023/01/strategie-seo-300x300.jpg": {
"alt": "strategie seo",
"title": "",
"width": "",
"height": ""
},
"https://beweb.fr/wp-content/uploads/2020/11/3497813-300x300.jpg": {
"alt": "Utiliser Google Data Studio pour analyser les performances de vos pages",
"title": "",
"width": "",
"height": ""
},
"https://beweb.fr/wp-content/uploads/2020/08/seo-793030_1280-300x199.jpg": {
"alt": "Quand faire un audit seo",
"title": "",
"width": "",
"height": ""
},
"https://beweb.fr/wp-content/plugins/cookie-law-info/legacy/public/images/logo-cookieyes.svg": {
"alt": "CookieYes Logo",
"title": "",
"width": "",
"height": ""
}
},
"strong": [
"agence en référencement",
"stratégie de référencement",
"expertise référencement naturel",
"bons mots clés",
"bonnes pratiques de Google",
"mobile first",
"Sites internet gérés, créés ou optimisés",
"Sessions mensuelles cumulées sur nos sites",
"Mots clés surveillés",
"optimisation pour les moteurs de recherche",
"stratégie de référencement sur mesure",
"expérience",
"savoir-faire",
"équipe passionnée",
"stratégies innovantes",
"chaque entreprise est unique",
"simple et accessible",
"sur le long terme",
"durables et évolutives,",
"résultats qui durent"
],
"em": "Jean-Joseph Lattuada, Ouest-France",
"nbWords": 762,
"nbWordsAll": 1414,
"ratio": 6.91,
"pertinence": 54,
"nbWordsDistinct": 427,
"beginWith": {
"référencement": 19,
"agence": 12,
"seo": 8,
"naturel": 5,
"solutions": 5,
"cookies": 5,
"beweb": 5,
"web": 5,
"visibilité": 5,
"optimisation": 4,
"analyse": 4,
"google": 4
},
"langs": {
"country": "FR",
"langOfPage": "fr",
"headers-content-type": "text/html",
"meta-charset": "utf-8",
"headers-content-language": "non renseigné",
"meta-content-language": "non renseigné",
"meta-name-language": "non renseigné",
"html-lang": "fr-FR"
},
"nbPhrases": 49,
"nbPhrasesAll": 111,
"entities": [
{
"id": 0,
"type": [
"Number"
],
"matchingTokens": [
2
],
"entityId": "78",
"confidenceScore": 0.5,
"wikiLink": "",
"matchedText": "78",
"relevanceScore": 0,
"entityEnglishId": "",
"startingPos": 5,
"endingPos": 7,
"unit": "Number"
},
{
"id": 1,
"type": [
"Number"
],
"matchingTokens": [
1
],
"entityId": "6",
"confidenceScore": 0.5,
"wikiLink": "",
"matchedText": "06",
"relevanceScore": 0,
"entityEnglishId": "",
"startingPos": 2,
"endingPos": 4,
"unit": "Number"
},
{
"id": 2,
"matchingTokens": [
792
],
"entityId": "Algorithme",
"freebaseTypes": [
"/award/award_discipline",
"/education/field_of_study",
"/symbols/namesake",
"/book/book_subject"
],
"confidenceScore": 5.629,
"wikiLink": "http://fr.wikipedia.org/wiki/Algorithme",
"matchedText": "algorithmes",
"freebaseId": "/m/0jpv",
"relevanceScore": 0.2498,
"entityEnglishId": "Algorithm",
"startingPos": 5522,
"endingPos": 5533,
"wikidataId": "Q8366"
},
{
"id": 3,
"matchingTokens": [
808
],
"entityId": "Privacy",
"freebaseTypes": [
"/media_common/quotation_subject",
"/film/film_subject",
"/law/legal_subject",
"/book/book_subject"
],
"confidenceScore": 5.349,
"wikiLink": "http://en.wikipedia.org/wiki/Privacy",
"matchedText": "privacy",
"freebaseId": "/m/06804",
"relevanceScore": 0,
"entityEnglishId": "Privacy",
"startingPos": 5633,
"endingPos": 5640,
"wikidataId": "Q188728"
},
{
"id": 4,
"matchingTokens": [
812
],
"entityId": "Website",
"freebaseTypes": [
"/book/book_subject",
"/business/industry",
"/award/award_category",
"/dataworld/information_source",
"/fictional_universe/fictional_organization_type",
"/organization/non_profit_organization",
"/location/location",
"/internet/website_category",
"/award/award_discipline",
"/organization/contact_category",
"/business/business_location",
"/education/school_category",
"/organization/role",
"/business/employer",
"/organization/organization_sector"
],
"confidenceScore": 10.45,
"wikiLink": "http://en.wikipedia.org/wiki/Website",
"matchedText": "website",
"freebaseId": "/m/085n4",
"relevanceScore": 0,
"entityEnglishId": "Website",
"startingPos": 5656,
"endingPos": 5663,
"wikidataId": "Q35127"
},
{
"id": 5,
"matchingTokens": [
814
],
"entityId": "Cookie (informatique)",
"freebaseTypes": [
"/book/book_subject"
],
"confidenceScore": 3.079,
"wikiLink": "http://fr.wikipedia.org/wiki/Cookie_(informatique)",
"matchedText": "cookies",
"freebaseId": "/m/0d18sk",
"relevanceScore": 0.3457,
"entityEnglishId": "HTTP cookie",
"startingPos": 5669,
"endingPos": 5676,
"wikidataId": "Q178995"
},
{
"id": 6,
"matchingTokens": [
892,
893
],
"entityId": "Option de retrait dans l'Union européenne",
"confidenceScore": 1.016,
"wikiLink": "http://fr.wikipedia.org/wiki/Option_de_retrait_dans_l'Union_européenne",
"matchedText": "opt out",
"freebaseId": "/m/03cfnlw",
"relevanceScore": 0.1998,
"entityEnglishId": "Opt-outs in the European Union",
"startingPos": 6098,
"endingPos": 6105,
"wikidataId": "Q1349687"
},
{
"id": 7,
"matchingTokens": [
899,
900
],
"entityId": "Opt-out (marketing)",
"confidenceScore": 1.776,
"wikiLink": "http://fr.wikipedia.org/wiki/Opt-out_(marketing)",
"matchedText": "opting out",
"freebaseId": "",
"relevanceScore": 0.06177,
"entityEnglishId": "Opt-out",
"startingPos": 6128,
"endingPos": 6138,
"wikidataId": "Q1368455"
},
{
"id": 8,
"matchingTokens": [
907
],
"entityId": "Affect",
"confidenceScore": 0.9559,
"wikiLink": "http://fr.wikipedia.org/wiki/Affect",
"matchedText": "affect",
"freebaseId": "/m/09f7n8",
"relevanceScore": 0.1276,
"entityEnglishId": "Affect (psychology)",
"startingPos": 6168,
"endingPos": 6174,
"wikidataId": "Q159904",
"wikidataTypes": [
"Q96634632/psychology term",
"Q12812139/technical term"
]
},
{
"id": 9,
"matchingTokens": [
928
],
"entityId": "Analytics",
"freebaseTypes": [
"/organization/organization_sector",
"/business/competitive_space",
"/computer/software_genre",
"/internet/website_category",
"/book/book_subject",
"/business/industry",
"/media_common/quotation_subject"
],
"confidenceScore": 2.001,
"wikiLink": "http://en.wikipedia.org/wiki/Analytics",
"matchedText": "analytics",
"freebaseId": "/m/02gcn9",
"relevanceScore": 0,
"entityEnglishId": "Analytics",
"startingPos": 6296,
"endingPos": 6305,
"wikidataId": "Q485396",
"wikidataTypes": [
"Q105948247/knowledge system",
"Q1047113/specialty",
"Q2198779/unit",
"Q4671286/academic major",
"Q26256810/matter",
"Q11953984/linguistic unit",
"Q11862829/academic discipline",
"Q110403031/knowledge type",
"Q115786086/linguistic form",
"Q115372263/word or phrase",
"Q1128340/subject heading"
]
}
],
"opengraph": {
"og:locale": "fr_FR",
"og:type": "article",
"og:title": "Agence SEO France - Référencement Naturel Google | BEWEB",
"og:description": "Besoin d",
"og:url": "https://beweb.fr/seo/",
"og:site_name": "Consultant SEO : Expert référencement de site internet à Rennes"
},
"twitter": [],
"robotsTxtInfo": {
"code": 200,
"response": {},
"content": "User-agent: *\r\nDisallow:\r\n\r\n#test o2"
},
"nbImg": 13,
"nbImgNoAlt": 3,
"firstPerson": {
"notre": 10,
"nos": 13,
"nous": 31,
"mes": 1,
"me": 1,
"je": 2,
"ma": 1
},
"mykeyword": "",
"verif_presence": 1,
"words": {
"agence": 18,
"référencement": 27,
"naturel": 9,
"référencement naturel": 5,
"google": 9,
"beweb": 6,
"france": 1,
"besoin": 6,
"solutions": 6,
"accompagnement": 5,
"rédaction": 4,
"améliorer": 5,
"visibilité": 7,
"mesure": 3,
"optimisation": 7,
"audit": 7,
"bonne": 3,
"développer": 2,
"optimisé": 2,
"cherchez": 2,
"croissance": 2,
"saura": 1,
"proposons": 2,
"contact": 1,
"contactez": 1,
"rigueur": 1,
"choisir": 1,
"sérieux": 1,
"confiez": 1,
"large": 1,
"laissons": 1,
"proposé": 1,
"panel": 1,
"adaptées": 1,
"temps": 1,
"outils": 1,
"tracking": 1,
"paramétrage": 1,
"longue": 1,
"manager": 1,
"contenu": 2,
"client": 8,
"stratégie": 8,
"technique": 6,
"recherche": 6,
"analyse": 6,
"experience": 6,
"cookies": 6,
"balises": 5,
"travail": 5,
"objectif": 4,
"sites": 4,
"place": 4,
"these": 4,
"performance": 4,
"résultats": 4,
"website": 4,
"comprendre": 4,
"aider": 4
},
"optimise": {
"agence": 51,
"référencement": 50,
"naturel": 39,
"google": 28,
"beweb": 28,
"france": 23,
"besoin": 12,
"solutions": 11,
"audit": 7,
"visibilité": 7
},
"wordsOptimiseFor": {
"agence": 51,
"référencement": 50,
"naturel": 39,
"google": 28,
"beweb": 28,
"france": 23,
"besoin": 12,
"solutions": 11,
"audit": 7,
"visibilité": 7,
"améliorer": 7,
"mesure": 7,
"rédaction": 7,
"optimisation": 7,
"accompagnement": 7
},
"groupOptimiseFor": {
"agence": 51,
"référencement": 50,
"naturel": 39,
"google": 28,
"beweb": 28,
"france": 23,
"besoin": 12,
"solutions": 11,
"audit": 7,
"visibilité": 7,
"améliorer": 7,
"mesure": 7,
"rédaction": 7,
"optimisation": 7,
"accompagnement": 7
},
"lexies": {
"proposons": {
"4": "proposition",
"22": "viser",
"24": "mesure",
"26": "objectif",
"33": "agence",
"35": "contenu",
"43": "sites",
"47": "services",
"53": "concurrence",
"83": "option",
"164": "projet",
"197": "atteindre",
"201": "client",
"211": "découvrir",
"214": "devis",
"228": "gratuit",
"277": "accompagnement"
},
"référencement": [
"recherche",
"optimisation",
"visibilité",
"contenu",
"internet",
"visible",
"complexe",
"optimisé"
],
"solutions": [
"optimisation",
"analyse",
"efficace",
"simple",
"optimiser",
"amélioration",
"performance",
"référencement",
"stratégie",
"processus",
"adaptées"
],
"agence": {
"14": "entreprise",
"16": "client",
"32": "objectif",
"37": "secteur"
},
"naturel": {
"38": "simple",
"126": "migration",
"187": "recherche",
"195": "force"
},
"besoin": [
"amélioration",
"objectif",
"qualité",
"utile",
"entreprise",
"client",
"disponible",
"projet",
"bonne",
"adaptées"
],
"développer": {
"0": "croissance",
"1": "secteur",
"2": "trafic",
"3": "processus",
"4": "entreprise",
"6": "améliorer"
},
"mesure": [
"temps",
"point",
"secteur",
"stade",
"ligne",
"force",
"commun",
"durée",
"travail",
"processus",
"terme",
"nouveau",
"ensemble",
"photographe",
"studio",
"performance",
"ordinaire",
"longue"
],
"outils": {
"8": "analyse",
"75": "optimisation",
"77": "ergonomie",
"98": "guide",
"111": "simple"
},
"confiez": {
"7": "laisser",
"8": "confiance",
"24": "découvrir",
"34": "choisir",
"99": "enregistrer"
},
"rédaction": {
"13": "projet",
"14": "quotidien",
"17": "cahier"
},
"contact": {
"11": "direct"
},
"contactez": {
"20": "aider",
"54": "découvrir",
"118": "proposer",
"126": "rendre",
"127": "répondre",
"134": "savoir"
},
"sérieux": {
"41": "confiance",
"55": "gratuit"
},
"saura": {
"51": "montre",
"59": "commun",
"64": "découvrir",
"167": "disponibilité",
"193": "force",
"272": "point",
"279": "processus"
},
"laissons": {
"50": "cours",
"69": "mettre",
"88": "rendre",
"97": "découvrir",
"114": "maîtriser",
"188": "place",
"265": "aimons",
"271": "appliquer"
}
},
"listLexies": {
"agence": {
"ponderation": 51,
"color": "264653"
},
"référencement": {
"ponderation": 74,
"color": "287271"
},
"naturel": {
"ponderation": 39,
"color": "2A9D8F"
},
"besoin": {
"ponderation": 23,
"color": "8AB17D"
},
"solutions": {
"ponderation": 73,
"color": "E9C46A"
},
"mesure": {
"ponderation": 17,
"color": "EFB366"
},
"rédaction": {
"ponderation": 7,
"color": "F4A261"
},
"développer": {
"ponderation": 18,
"color": "EE8959"
},
"contact": {
"ponderation": 5,
"color": "E76F51"
},
"contactez": {
"ponderation": 5,
"color": "E97C61"
},
"proposons": {
"ponderation": 75,
"color": "f45b5b"
},
"sérieux": {
"ponderation": 5,
"color": "e4d354"
},
"confiez": {
"ponderation": 10,
"color": "413775"
},
"saura": {
"ponderation": 5,
"color": "e91e63"
},
"laissons": {
"ponderation": 5,
"color": "9c27b0"
},
"outils": {
"ponderation": 12,
"color": "90ed7d"
}
},
"lexiesOptimiseFor": {
"proposons": 75,
"référencement": 74,
"solutions": 73,
"agence": 51,
"naturel": 39,
"besoin": 23,
"développer": 18,
"mesure": 17,
"outils": 12
},
"listPresence": {
"title": {
"référencement naturel": 1,
"référencement": 1,
"agence": 1,
"google": 1,
"naturel": 1,
"beweb": 1,
"france": 1
},
"h1": {
"référencement naturel": 1,
"référencement": 1,
"agence": 1,
"naturel": 1
},
"h2": {
"référencement naturel": 1,
"référencement": 1,
"agence": 1,
"naturel": 1,
"solutions": 1,
"services": 1,
"développer": 1,
"besoin": 1,
"consultants": 1,
"contact": 1,
"contactez": 1
},
"strong": {
"référencement naturel": 1,
"référencement": 1,
"agence": 1,
"stratégie": 1,
"naturel": 1,
"google": 1,
"pratiques": 1,
"bonne": 1,
"mobile": 1,
"first": 1
},
"description": {
"agence": 1,
"stratégie": 1,
"visibilité": 1,
"besoin": 1,
"améliorer": 1,
"mesure": 1,
"ligne": 1
},
"h3": {
"référencement": 1,
"audit": 1,
"trouver": 1,
"freins": 1,
"recherche": 1,
"visible": 1,
"accompagnement": 1,
"accompagné": 1,
"durée": 1,
"optimisation": 1,
"balises": 1,
"rédaction": 1,
"charges": 1,
"refonte": 1,
"cahier": 1,
"guide": 1,
"rennes": 1,
"région": 1,
"rennaise": 1
},
"host": {
"beweb": 1
},
"url": {
"beweb": 1
},
"firstWords": {
"référencement": 1,
"agence": 1,
"google": 1,
"visibilité": 1,
"audit": 1,
"optimisation": 1,
"besoin": 1,
"beweb": 1,
"solutions": 1,
"accompagnement": 1,
"améliorer": 1,
"place": 1,
"rédaction": 1,
"bonne": 1,
"mesure": 1,
"proposer": 1,
"concrètes": 1,
"trafic": 1,
"internet": 1,
"cherchez": 1,
"optimisé": 1,
"contenu": 1,
"hasard": 1,
"proposons": 1,
"croissance": 1,
"rigueur": 1,
"choisir": 1,
"sérieux": 1,
"confiez": 1,
"saura": 1,
"large": 1,
"laissons": 1,
"panel": 1,
"adaptées": 1,
"temps": 1,
"outils": 1,
"tracking": 1,
"paramétrage": 1,
"manager": 1,
"proposé": 1,
"longue": 1
},
"footerTxt": {
"agence": 1,
"besoin": 1,
"beweb": 1,
"experts": 1,
"répondre": 1,
"rennes": 1,
"christophe": 1,
"consultants": 1,
"services": 1,
"contact": 1,
"contactez": 1,
"répond": 1
},
"em": {
"ouest": 1,
"france": 1,
"lattuada": 1,
"joseph": 1
}
},
"scoreSeo": 96.5,
"hnInFooter": []
},
"response": 200,
"message": "ok",
"timing": 0.3334009999999999,
"creditUsed": 1,
"method": "tf_related",
"credits": 2947
}
Description : Provides semantic analysis and semantic vocabulary.
Endpoint : https://www.textfocus.net/apis/tf_semantic/
Method : POST
key (string, requis) : API key.lang (string, requis) : 5-character language+market code (e.g., fr-FR, en-US, fr-CA) — the recommended format for targeting a specific market. A 2-character code (e.g., fr) is also accepted. See tf_langs for a complete list of available codes.keyword (string, requis) : Keyword to analyze.force_refetch (int, optional) : Set to 1 to bypass the cache and force a recalculation.callback (string, optionnel) : Callback URL to retrieve asynchronous response. In fact, semantic analysis can take up to 30 seconds, so it can be useful to manage the response via a callback. Example of a JSON response :
{
"version": "1.0.3",
"params": {
"lang": "fr",
"keyword": "mini serre",
"key": "Your API key"
},
"result": {
"nbCompete": 34,
"nbFound": 119,
"nbWordsContentMoy": 904.6470588235294,
"nbWordsTitleMoy": 6.0588235294117645,
"semantic": {
"0": {
"id": "mini serre",
"keyword": "semis",
"kei": "100.00",
"ngram": "1",
"used": "82.35",
"occ": "105",
"omin": "1",
"omax": "36",
"omoy": "7.5",
"osd": "8.1",
"nbwmoy": "555",
"intitle": "14.71",
"inhn": "26.47",
"frequency": "22.85",
"tfidf": "0.0613",
"context": "a:3:{i:0;s:16:\"mini serre semis\";i:1;s:21:\"fleurs légumes semis\";i:2;s:16:\"serre semis pots\";}"
},
"1": {
"id": "mini serre",
"keyword": "plantes",
"kei": "99.11",
"ngram": "1",
"used": "73.53",
"occ": "97",
"omin": "1",
"omax": "44",
"omoy": "7.8",
"osd": "11.1",
"nbwmoy": "606",
"intitle": "0.00",
"inhn": "14.71",
"frequency": "16.74",
"tfidf": "0.0573",
"context": "a:3:{i:0;s:23:\"plantes fleurs légumes\";i:1;s:23:\"serre hivernage plantes\";i:2;s:24:\"hivernage plantes fleurs\";}"
},
"2": {
"id": "mini serre",
"keyword": "jardin",
"kei": "98.01",
"ngram": "1",
"used": "79.41",
"occ": "140",
"omin": "1",
"omax": "54",
"omoy": "12.0",
"osd": "11.9",
"nbwmoy": "605",
"intitle": "20.59",
"inhn": "38.24",
"frequency": "30.33",
"tfidf": "0.0694",
"context": "a:3:{i:0;s:17:\"mini serre jardin\";i:1;s:19:\"petite serre jardin\";i:2;s:26:\"serre jardin polycarbonate\";}"
},
"3": {
"id": "mini serre",
"keyword": "culture",
"kei": "95.93",
"ngram": "1",
"used": "76.47",
"occ": 83,
"omin": "1",
"omax": "23",
"omoy": "5.5",
"osd": "5.2",
"nbwmoy": "589",
"intitle": "14.71",
"inhn": "29.41",
"frequency": "19.50",
"tfidf": "0.0492",
"context": "a:3:{i:0;s:18:\"mini serre culture\";i:1;s:23:\"serre culture plastique\";i:2;s:13:\"serre culture\";}"
},
"4": {
"id": "mini serre",
"keyword": "balcon",
"kei": "77.62",
"ngram": "1",
"used": "47.06",
"occ": "24",
"omin": "1",
"omax": "6",
"omoy": "2.6",
"osd": "1.6",
"nbwmoy": "595",
"intitle": "0.00",
"inhn": "8.82",
"frequency": "4.29",
"tfidf": "0.0324",
"context": "a:3:{i:0;s:15:\"balcon terrasse\";i:1;s:13:\"serres balcon\";i:2;s:12:\"serre balcon\";}"
},
// Up to 100 terms can be returned
}
},
"response": 200,
"message": "ok",
"timing": 0.020776,
"creditUsed": 1,
"method": "tf_keyword",
"credits": 2948
}
Description : Analyze a domain's robots.txt file: presence of an XML sitemap, blocked AI bots, content signals.
Endpoint : https://www.textfocus.net/apis/tf_robotstxt/
Method : POST
key (string, requis) : API key.url (string, requis) : URL of the page or domain to be analyzed.Example of a JSON response :
{
"version": "1.0.4",
"params": {
"url": "https://beweb.fr/seo/",
"key": "Your API key"
},
"result": {
"score": 75,
"issues": [
"Aucun Content Signal détecté dans le robots.txt"
],
"details": {
"sitemaps": [
"https://beweb.fr/sitemap.xml"
],
"blocked_bots": [],
"content_signals": {}
}
},
"response": 200,
"message": "ok",
"timing": 0.312,
"creditUsed": 1,
"method": "tf_robotstxt",
"credits": 293
}
result.score : A score from 0 to 100 that evaluates the website's accessibility for AI agents.result.issues : List of detected issues (missing sitemap, blocked AI agents, missing content signals, etc.).result.details.sitemaps : URLs of sitemaps listed in the robots.txt file.result.details.blocked_bots : List of blocked AI agents (GPTBot, Claude-Web, PerplexityBot, etc.).result.details.content_signals : Content Signal guidelines detected (ai-train, search, ai-input); see contentsignals.org.Description : Performs a comprehensive GEO (Generative Engine Optimization) analysis of a web page: heading structure, structured data, readability, semantic consistency, performance, accessibility for AI agents, etc. Returns an overall AI-Ready score and scores for each category.
Endpoint : https://www.textfocus.net/apis/tf_geo/
Method : POST
key (string, requis) : API key.url (string, requis) : URL of the page to be analyzed.force_refetch (int, optional) : Set to 1 to bypass the cache and force a recalculation.Example of a JSON response (abridged):
{
"version": "1.0.4",
"params": {
"url": "https://beweb.fr/seo/",
"key": "Your API key"
},
"result": {
"ia_ready_score": 68.4,
"geo_commentary": {
"comment": "Cette page présente une optimisation correcte pour les IA, mais plusieurs points méritent attention.",
"priority_text": "Les principaux axes d'amélioration sont la table des matières et les données structurées (Schema.org)."
},
"all_scores": {
"structure_score": 80,
"structured_data_score": 40,
"segmentation_markup_score": 75,
"readability_score": 70,
"semantic_coherence_score": 65,
"toc_score": 30,
"concise_answer_score": 60,
"images_score": 55,
"loading_score": 85,
"accessibility_score": 90,
"robots_txt_score": 75
},
"structure_and_accessibility": {
"structure": {
"analysis": {
"score": 80,
"issues": [],
"details": {
"nb_h1": 1,
"nb_h2": 2,
"h1_matches_topic": true
}
}
},
"structured_data": {
"analysis": {
"score": 40,
"issues": ["Aucun type Schema.org pertinent détecté (Article, FAQ, HowTo…)"],
"types": ["WebPage"]
}
},
"segmentation_markup": {
"analysis": {
"score": 75,
"issues": []
}
}
},
"content_clarity": {
"readability": {
"analysis": {
"score": 70,
"issues": [],
"details": {
"flesch_kincaid": 33.7,
"avg_sentence_length": 18.4
}
}
},
"concise_answer": {
"analysis": {
"score": 60,
"issues": ["Aucune réponse concise détectée en début de page"]
}
},
"semantic_coherence": {
"analysis": {
"score": 65,
"issues": [],
"details": {
"title_to_content": 0.82,
"description_to_content": 0.74
}
}
}
},
"seo_ia_optimization": {
"toc": {
"analysis": {
"score": 30,
"issues": ["Aucune table des matières cliquable détectée"]
}
}
},
"multimodality": {
"alt_tags": {
"analysis": {
"score": 55,
"issues": ["3 image(s) sans attribut alt"],
"details": {
"nb_images": 13,
"nb_missing_alt": 3
}
}
}
},
"performance": {
"fast_loading": {
"analysis": {
"score": 85,
"issues": [],
"details": {
"lcp_ms": 1276,
"ttfb_ms": 15,
"tti_ms": 199
}
}
},
"main_readability_accessibility": {
"analysis": {
"score": 90,
"issues": []
}
},
"robots_txt": {
"analysis": {
"score": 75,
"issues": ["Aucun Content Signal détecté dans le robots.txt"],
"details": {
"sitemaps": ["https://beweb.fr/sitemap.xml"],
"blocked_bots": [],
"content_signals": {}
}
}
}
},
"res": {
"url": "https://beweb.fr/seo/",
"urlDecode": "https://beweb.fr/seo/",
"title": "Agence SEO France - Référencement Naturel Google | BEWEB",
"description": "Besoin d'une agence SEO pour améliorer votre visibilité en ligne ?",
"h1": "AGENCE SEO Pilotez votre référencement naturel",
"h2": ["Les services de notre agence SEO", "Besoin d'une agence SEO ?"],
"nbWords": 762,
"host": "https://beweb.fr",
"whatIsAbout": ["référencement", "agence", "naturel", "google", "seo", "visibilité"]
},
"lang": "fr",
"country": "fr",
"resume_ia": "Cette page présente l'agence SEO Beweb, spécialisée dans le référencement naturel en France..."
},
"response": 200,
"message": "ok",
"timing": 4.21,
"creditUsed": 1,
"method": "tf_geo",
"credits": 292
}
result.ia_ready_score : Overall AI-Ready score on a scale of 0 to 100, weighted across all categories.result.geo_commentary : A detailed analysis of the overall score and the three main areas for improvement.result.all_scores : Individual scores by category (structure, structured data, readability, semantic consistency, table of contents, images, loading speed, accessibility, robots.txt).result.structure_and_accessibility : Module 1 — Hn heading structure, Schema.org, content segmentation.result.content_clarity : Module 2 — Flesch-Kincaid readability score, concise response, semantic consistency between title and content.result.seo_ia_optimization : Module 3 — Clickable table of contents, internal links, tone of the content.result.multimodality : Module 4 — Alt tags for images, captions, and figure/figcaption markup.result.performance : Module 5 — Core Web Vitals (LCP, TTI, TTFB), SSR accessibility, and robots.txt analysis.result.res : Metadata for the analyzed page (title, description, H1, H2, word count, main topics).result.resume_ia : Automatic page summary generated by AI (available for paid plans).Note: This API performs an in-depth analysis that can take between 3 and 10 seconds, depending on the page being analyzed.
Description : Competitive analysis for a given keyword: retrieves the top pages in Google search results and calculates their SEO metrics (SEO score, semantic score, word count, relevance, page type). The analysis is comprehensive: pages that have not yet been analyzed are retrieved and calculated on the fly.
Endpoint : https://www.textfocus.net/apis/tf_competition/
Method : POST
Parameters :
key (string, requis) : API key.lang (string, requis) : 5-character language+market code (e.g., fr-FR, en-US, fr-CA) — the recommended format for targeting a specific market. A 2-character code (e.g., fr) is also accepted. See tf_langs for a complete list of available codes.keyword (string, requis) : Target keyword.force_refetch (int, optional) : Set to 1 to bypass the cache and force all concurrent pages to be recalculated.callback (string, optionnel) : URL de callback (webhook) pour recevoir la réponse de façon asynchrone. Recommandé : l'analyse peut prendre jusqu'à 2 minutes selon le nombre de pages à récupérer. Lorsque ce paramètre est fourni, la réponse immédiate confirme la mise en file d'attente (message: "callback is queued") ; le résultat complet est ensuite envoyé en POST à l'URL fournie une fois le calcul terminé.Example of a JSON response :
{
"version": "1.0.4",
"params": {
"lang": "fr",
"keyword": "agence seo",
"key": "Your API key"
},
"result": {
"keyword": "agence seo",
"lang": "fr",
"nbCompete": 10,
"competitors": [
{
"url": "https://www.optimize360.fr/agence-seo/",
"position": 1,
"title": "Agence SEO - Optimize 360",
"h1": "Agence SEO Optimize 360",
"nbWords": 312,
"nbWordsAll": 687,
"pertinence": 45,
"scoreSeo": 87.5,
"scoreSemantic": 62.3,
"typePage": "page"
},
{
"url": "https://www.primelis.com/agence-seo/",
"position": 2,
"title": "Agence SEO - Primelis",
"h1": "Votre agence SEO",
"nbWords": 489,
"nbWordsAll": 1102,
"pertinence": 44,
"scoreSeo": 91.0,
"scoreSemantic": 71.8,
"typePage": "page"
}
// Up to nbCompeteMax competitors, depending on your subscription ]
},
"response": 200,
"message": "ok",
"timing": 12.4,
"creditUsed": 1,
"method": "tf_competition",
"credits": 291
}
result.nbCompete : Number of competitors analyzed.result.competitors[].url : Competitor's URL.result.competitors[].position : Ranking in Google search results.result.competitors[].title : Page title tag.result.competitors[].h1 : H1 content.result.competitors[].nbWords : Number of meaningful words (excluding stopwords).result.competitors[].nbWordsAll : Total number of raw words.result.competitors[].pertinence : Percentage of meaningful words out of total words.result.competitors[].scoreSeo : Overall SEO score from 0 to 100.result.competitors[].scoreSemantic : Semantic score relative to the target keyword (0 to 100).result.competitors[].typePage : Page type detected (page, article, e-commerce, etc.).Note: This API may take between 5 and 30 seconds, depending on the number of pages to be analyzed. Pages that have been analyzed recently are served from the cache.
Description : Extracts and analyzes JSON-LD (Schema.org) structured data from a web page. Returns the raw JSON-LD blocks, the detected Schema.org types, and a comprehensive analysis of the structured data quality.
Endpoint : https://www.textfocus.net/apis/tf_structured_data/
Method : POST
key (string, requis) : API key.url (string, requis) : URL of the page to be analyzed.force_refetch (int, optional) : Set to 1 to bypass the cache and force a recalculation.Example of a JSON response :
{
"version": "1.0.4",
"params": {
"url": "https://beweb.fr/seo/",
"key": "Your API key"
},
"result": {
"jsonLd": [
{
"@context": "https://schema.org",
"@type": "Article",
"name": "Agence SEO Paris",
"description": "Optimisation SEO pour votre site web"
}
],
"jsonLdType": ["Article"],
"analysis": {
"score": 60,
"types_found": ["Article"],
"issues": ["Missing recommended property: author"],
"recommendations": ["Add author property to Article schema"]
}
},
"response": 200,
"message": "ok",
"timing": 1.24,
"creditUsed": 1,
"method": "tf_structured_data",
"credits": 292
}
result.jsonLd : Table of raw JSON-LD blocks found on the page.result.jsonLdType : List of detected Schema.org types (Article, Product, FAQPage, BreadcrumbList, etc.).result.analysis.score : Structured data quality score on a scale of 0 to 100.result.analysis.types_found : Schema.org types on the page.result.analysis.issues : List of detected issues (missing required properties, formatting errors, etc.).result.analysis.recommendations : Recommendations for improving structured data.Description : Returns the history of SEO analyses for a previously analyzed URL: SEO score, performance score, semantic score, AI score, word count, and the date of each entry.
Endpoint : https://www.textfocus.net/apis/tf_history/
Method : POST
key (string, requis) : API key.url (string, requis) : The URL for which you want to retrieve the analytics history.Example of a JSON response :
{
"version": "1.0.4",
"params": {
"url": "https://beweb.fr/seo/",
"key": "Your API key"
},
"result": {
"url": "https://beweb.fr/seo/",
"keyword": "agence seo",
"session": "a1b2c3d4e5f6",
"snapshots": [
{
"date": "2024-09-01 10:15:00",
"scoreSeo": 72.5,
"scorePerf": 65.0,
"scoreSem": 58.3,
"scoreIa": 61.0,
"nbwordsall": 1240
},
{
"date": "2025-01-15 14:30:00",
"scoreSeo": 78.2,
"scorePerf": 70.1,
"scoreSem": 63.5,
"scoreIa": 67.4,
"nbwordsall": 1350
}
]
},
"response": 200,
"message": "ok",
"timing": 0.08,
"creditUsed": 0,
"method": "tf_history",
"credits": 292
}
result.url : URL analyzed.result.keyword : Target keyword associated with the analysis.result.session : Analysis session ID.result.snapshots[].date : Recording date (YYYY-MM-DD HH:MM:SS).result.snapshots[].scoreSeo : Overall SEO score from 0 to 100.result.snapshots[].scorePerf : Performance score from 0 to 100.result.snapshots[].scoreSem : Semantic score from 0 to 100.result.snapshots[].scoreIa : AI score from 0 to 100.result.snapshots[].nbwordsall : Total number of words on the page as of this date.Note: The history is only available if the page has been crawled at least once from your account. The data is sorted in ascending order by date.
Description : Analyzes a page's mobile performance using Google Lighthouse / PageSpeed Insights. Returns the overall performance score and Core Web Vitals: FCP, LCP, TBT, CLS, Speed Index, TTI, and TTFB.
Endpoint : https://www.textfocus.net/apis/tf_perf/
Method : POST
key (string, requis) : API key.url (string, requis) : URL of the page to be analyzed.force_refetch (int, optional) : Set to 1 to bypass the cache (valid for 60 minutes).Example of a JSON response :
{
"version": "1.0.4",
"params": {
"url": "https://beweb.fr/seo/",
"key": "Your API key"
},
"result": {
"url": "https://beweb.fr/seo/",
"scorePerf": 72.0,
"strategy": "MOBILE",
"metrics": {
"first-contentful-paint": { "value": 1820, "score": 75, "unit": "ms" },
"largest-contentful-paint": { "value": 3200, "score": 48, "unit": "ms" },
"total-blocking-time": { "value": 240, "score": 62, "unit": "ms" },
"cumulative-layout-shift": { "value": 0.04, "score": 90, "unit": "" },
"speed-index": { "value": 2900, "score": 71, "unit": "ms" },
"interactive": { "value": 4100, "score": 55, "unit": "ms" },
"server-response-time": { "value": 310, "score": 85, "unit": "ms" }
}
},
"response": 200,
"message": "ok",
"timing": 8.4,
"creditUsed": 1,
"method": "tf_perf",
"credits": 291
}
result.scorePerf : Overall mobile performance score on a scale of 0 to 100.result.strategy : Analysis strategy (still MOBILE).result.metrics[key].value : Gross value of the metric (in milliseconds, except for CLS, which is dimensionless).result.metrics[key].score : Score from 0 to 100 for this metric.result.metrics[key].unit : Unit: ms for most metrics, empty string for CLS.Note: Results are cached for 60 minutes. Use force_refetch=1 to force a new scan.
Description : Extracts all outbound links from a page: anchor text, resolved URL (relative → absolute), rel attribute, location on the page (main, nav, footer, aside, header, breadcrumb), and type (internal or external).
Endpoint : https://www.textfocus.net/apis/tf_links/
Method : POST
key (string, requis) : API key.url (string, requis) : URL of the page to be analyzed.force_refetch (int, optional) : Set to 1 to bypass the page cache.Example of a JSON response :
{
"version": "1.0.4",
"params": {
"url": "https://beweb.fr/seo/",
"key": "Your API key"
},
"result": {
"url": "https://beweb.fr/seo/",
"total": 34,
"internal": 22,
"external": 12,
"links": [
{
"url": "https://beweb.fr/audit-seo/",
"anchor": "audit seo",
"rel": null,
"title": null,
"location": "main",
"type": "internal"
},
{
"url": "https://www.google.fr/",
"anchor": "google",
"rel": "nofollow",
"title": "Google",
"location": "footer",
"type": "external"
}
]
},
"response": 200,
"message": "ok",
"timing": 1.8,
"creditUsed": 1,
"method": "tf_links",
"credits": 290
}
result.total : Total number of unique links (URL + anchor text).result.internal : Number of internal links (same domain).result.external : Number of external links (different domain).result.links[].url : The resolved absolute URL of the link.result.links[].anchor : Anchor text (in lowercase).result.links[].rel : The value of the rel attribute (nofollow, sponsored…) or null.result.links[].title : The value of the title attribute is or null.result.links[].location : The section of the page where the link is located: main, nav, footer, aside, header, or breadcrumb.result.links[].type : internal (same domain) or external.Note: The HTTP status codes for each link are not checked (to avoid dozens of additional requests). Page anchors (#...), mailto: links, and tel: links are excluded.
Description : Bulk on-page SEO audit: analyzes up to 50 URLs sequentially and sends the consolidated results to a callback URL. Credits are only deducted for pages that are successfully analyzed.
Endpoint : https://www.textfocus.net/apis/tf_seo_bulk/
Method : POST
key (string, requis) : API key.urls[] (array, required) : List of URLs to analyze (maximum of 50). In the form data, repeat the key urls[] for each URL.callback (string, requis) : The URL of your webhook that will receive the consolidated results via HTTP POST (JSON) once processing is complete.keyword (string, optionnel) : Target keyword applied to all URLs (enables on-page keyword scoring).force_refetch (int, optional) : Set to 1 to bypass the cache for all URLs.{
"response": 202,
"message": "processing started",
"urls_count": 5
}
{
"response": 200,
"method": "tf_seo_bulk",
"processed": 4,
"errors": 1,
"skipped": 0,
"credits_consumed": 4,
"timing": 38.2,
"results": [
{
"url": "https://example.com/page-1",
"status": "ok",
"scoreSeo": 67.3,
"scoreSem": 52.0,
"title": "Titre de la page",
"h1": "Titre H1",
"description": "Meta description...",
"nbMots": 842
},
{
"url": "https://example.com/page-unreachable",
"status": "error",
"error": "analysis returned no result"
}
]
}
processed : Number of URLs successfully scanned (= credits used).errors : Number of failed URLs (page not found or no results).skipped : Number of unprocessed URLs (quota exceeded during processing).skip_reason : Present if skipped > 0. Value: insufficient_credits.credits_consumed : Total number of credits debited (equal to processed).results[].scoreSeo : Overall SEO score from 0 to 100.results[].scoreSem : Semantic score from 0 to 100.results[].title : Content of the <title> tag.results[].h1 : Content of the <h1> tag.results[].description : Meta description content.results[].nbMots : Number of useful words on the page.Note: There is a 1-second delay between each URL. For 50 URLs, processing may take several minutes. Make sure your callback endpoint accepts POST requests with a Content-Type: application/json.
Some APIs, such as tf_semantic, may require asynchronous processing.
In this case, a callback can be defined to receive the response on your server.
<?php
public function my_callback(){
log_message('error', 'Call of my_callback');
$payload = file_get_contents('php://input');
log_message('error', 'Content : '. $payload);
print_r($payload);
}
?>