localization
Audite cómo una página declara su idioma y su región. Devuelve el atributo <html lang>, la cabecera Content-Language, todos los enlaces hreflang rel="alternate", el idioma realmente detectado en el texto visible y, opcionalmente, las metaetiquetas geográficas, de modo que pueda ver dónde las declaraciones de un sitio no concuerdan con su contenido.
Casos de uso
Auditorías de hreflang
Enumere los enlaces de idiomas alternativos que publica una página y compruebe que el conjunto es completo y recíproco entre locales.
Detecte páginas mal etiquetadas
Compare html_lang con detected_language. Una página que declara en pero se lee en español es un defecto real de SEO, y así es como se encuentra.
Cobertura de la competencia
Vea qué idiomas ofrece realmente un competidor, directamente desde su conjunto de hreflang, en lugar de deducirlo de su estructura de URL.
Comprobaciones de regresión en CI
Verifique language_count e is_multilingual después de un despliegue, para que una compilación de i18n rota no llegue a producción con la mitad de los locales ausentes.
Inventario de segmentación geográfica
Recopile las metaetiquetas geo.region y geo.position de todo un sitio para ver qué páginas llevan señales regionales.
Pruebas de respuesta localizada
Envíe una preferencia Accept-Language con la solicitud y compruebe si el servidor varía lo que devuelve.
Endpoint
/api/v1/tools/localizationParameters
| Name | Type | Required | Default | Description |
|---|---|---|---|---|
url | string | Required | - | La página que se auditará. Debe ser una URL http o https absoluta y válida. Example: https://example.com/pricing |
target_language | string | Optional | - | Idioma que espera. Se envía como `Accept-Language` de la solicitud, se devuelve tal cual y se compara con el idioma detectado y con `html_lang` para producir `matches_target`. La comparación es exacta, así que `es` no coincide con `es-ES`. Example: es |
target_country | string | Optional | - | País que espera. Se devuelve tal cual y se envía como cabecera de solicitud `X-Country-Code`. Esa cabecera es una convención de CrawlForge y no un estándar, así que la mayoría de los servidores la ignorarán. Example: ES |
detect_language | boolean | Optional | true | Detecta el idioma a partir del texto visible de la página. Devuelve un código ISO 639-1, o `und` cuando el texto es demasiado corto o el idioma no se reconoce. Si lo pone en false, `detected_language` se queda en `und`. Example: true |
extract_hreflang | boolean | Optional | true | Recopila los enlaces hreflang `rel="alternate"`. Si lo pone en false, `alternate_languages` vuelve vacío, lo que también fuerza `language_count` a 0 y `is_multilingual` a false. Example: true |
check_geo_targeting | boolean | Optional | false | Lee las metaetiquetas `geo.region` y `geo.position`. El objeto `geo_targeting` no aparece a menos que lo solicite. Example: true |
timeout | number | Optional | 10000 | Tiempo de espera de la descarga en milisegundos, entre 1000 y 30000. Example: 10000 |
respect_robots | boolean | Optional | true | Respeta el robots.txt del sitio de destino. Con el valor `true`, una ruta que robots.txt no permita a `CrawlForge` se rechaza con un 403 antes de descargar nada y no se cobran credits. Póngalo en `false` solo para destinos con los que tenga su propio acuerdo: la respuesta incluye entonces una entrada `warnings` y la anulación queda registrada en su API key. Example: true |
Señales que lee
lang del elemento <html>: lo que la página afirma ser. null cuando no existe.Content-Language. Es independiente del HTML y a menudo lo contradice.<link rel="alternate" hreflang="…">, en orden de documento. x-default se devuelve como cualquier otra entrada.Ejemplos de solicitud
curl -X POST https://crawlforge.dev/api/v1/tools/localization \
-H "X-API-Key: cf_test_YOUR_KEY" \
-H "Content-Type: application/json" \
-d '{
"url": "https://example.com/pricing",
"target_language": "es",
"check_geo_targeting": true
}'Ejemplo de respuesta
{ "success": true, "data": { "url": "https://example.com/pricing", "detected_language": "en", "html_lang": "en-US", "content_language_header": "en-US", "alternate_languages": [ { "lang": "en", "url": "https://example.com/pricing" }, { "lang": "es", "url": "https://example.com/es/pricing" }, { "lang": "zh-Hans", "url": "https://example.com/zh-Hans/pricing" }, { "lang": "x-default", "url": "https://example.com/pricing" } ], "language_count": 4, "is_multilingual": true, "target_language": "es", "matches_target": false, "target_country": "ES", "geo_targeted": true, "geo_targeting": { "region": "US-CA", "position": "37.7749;-122.4194", "has_geo_meta": true } }, "credits_used": 2, "credits_remaining": 998, "processing_time": 420}data.detected_languageCódigo ISO 639-1 detectado en el texto visible, o `und`. Compárelo con `html_lang`: la discrepancia es el hallazgodata.html_langEl atributo `lang` tal como está escrito, incluida la subetiqueta de región. `null` si la página no tiene ningunodata.content_language_headerLa cabecera de respuesta `Content-Language`, o `null`data.alternate_languagesTodas las alternativas hreflang, en orden de documento. El orden de los atributos dentro de cada etiqueta no importadata.language_countLongitud de `alternate_languages`: no es un recuento de idiomas distintosdata.is_multilingualTrue cuando se encontró al menos una alternativa hreflangdata.matches_targetTrue cuando `target_language` es igual al idioma detectado o a `html_lang`. Es una comparación exacta de cadenas, así que `es` falla frente a `es-ES`data.geo_targetedRefleja la bandera `check_geo_targeting` que envió. No es un veredicto: para eso, consulte `geo_targeting.has_geo_meta`data.geo_targeting.positionContenido `geo.position` sin procesar, convencionalmente `latitud;longitud`credits_used2 credits fijos por URLManejo de errores
URL no válida (400 Bad Request)
VALIDATION_ERROR. url es obligatorio y debe analizarse como una URL absoluta. El mismo estado cubre un timeout fuera de 1000-30000.
Página demasiado grande (413 Payload Too Large)
RESPONSE_TOO_LARGE. La página superó el límite de lectura de 25MB y se rechazó en lugar de almacenarse en memoria.
El destino agotó el tiempo de espera (504 Gateway Timeout)
FETCH_TIMEOUT. La página dejó de responder mientras enviaba su cuerpo. Aumente timeout, hasta 30000 ms.
Fallo en la descarga (502 Bad Gateway)
FETCH_FAILED. No se pudo leer el cuerpo de la respuesta: conexión reiniciada, o un cuerpo que no es texto decodificable.
El análisis falló (500 Internal Server Error)
TOOL_ERROR. Una llamada fallida no se cobra; los credits solo se descuentan después de que la auditoría tiene éxito.
Bloqueado por robots.txt (403 Forbidden)
El robots.txt del sitio de destino no permite esta ruta a CrawlForge. Establezca respect_robots: false para anularlo si tiene su propio acuerdo con el destino: la anulación queda registrada en su API key. La anulación no alcanza a un host incluido en la lista de exclusión permanente de CrawlForge, que se rechaza sea cual sea el valor de respect_robots.
<html lang> válido devuelve un resultado normal. Compruebe el estado del destino por separado con fetch_url si eso le importa.Costo en credits
Qué incluye:
Extracción de <html lang> y Content-Language
Conjunto completo de hreflang rel=alternate, en orden de documento
Detección de idioma por trigramas sobre el texto visible
Metaetiquetas geo.region y geo.position
Veredicto de coincidencia con el idioma objetivo
Recomendaciones por plan:
Plan Free: 1,000 credits de prueba por única vez = 500 URL
Plan Hobby: 5,000 credits = 2,500 URL ($19/mo)
Plan Professional: 50,000 credits = 25,000 URL ($99/mo)