{"openapi":"3.1.0","info":{"title":"CreceRank Content API","version":"1.1.0","summary":"API pública de solo lectura del contenido de crecerank.com.","description":"CreceRank es una herramienta GEO/AEO en español para medir la visibilidad de marcas en motores de IA (ChatGPT, Gemini, Perplexity, Copilot, AI Overviews).\n\nEsta especificación cubre la superficie pública machine-readable del sitio: la WordPress REST API v2 (posts, páginas, categorías y búsqueda, todo en JSON con errores JSON) y los recursos para agentes (llms.txt, versiones markdown por URL). El producto SaaS vive en https://www.app.crecerank.com (la API interna del producto no es pública).\n\nRate limits: 120 peticiones/minuto por IP sin autenticar, en ventana fija de 60 s. Todas las respuestas del API llevan RateLimit-Limit, RateLimit-Remaining y RateLimit-Reset; al superar el límite responde 429 JSON con Retry-After.\n\nVersionado y deprecación: el API usa versionado por URL (wp/v2). Si una operación fuera a retirarse, se anunciará con al menos 6 meses de antelación mediante los headers Deprecation y Sunset (RFC 8594) en las respuestas afectadas y una nota en https://crecerank.com/developers. Hoy no hay ninguna operación deprecada.\n\nCuándo usar este API: para leer, buscar o citar el contenido editorial de CreceRank (guías de GEO/AEO, listados de herramientas y agencias, experimentos con datos propios).","contact":{"name":"CreceRank","url":"https://crecerank.com/contacto/","email":"hola@rankerstudio.com"},"termsOfService":"https://crecerank.com/terminos-de-servicio/"},"servers":[{"url":"https://crecerank.com","description":"Producción"}],"paths":{"/wp-json/wp/v2/posts":{"get":{"operationId":"listPosts","summary":"Lista o busca entradas del blog","description":"Devuelve las entradas del blog en JSON, ordenadas por fecha descendente. Admite búsqueda por texto y filtro por slug.","parameters":[{"name":"search","in":"query","required":false,"description":"Texto libre a buscar.","schema":{"type":"string"}},{"name":"slug","in":"query","required":false,"description":"Filtra por slug exacto.","schema":{"type":"string"}},{"name":"per_page","in":"query","required":false,"description":"Resultados por página (1-100).","schema":{"type":"integer","minimum":1,"maximum":100,"default":10}},{"name":"page","in":"query","required":false,"description":"Página de resultados.","schema":{"type":"integer","minimum":1,"default":1}}],"responses":{"200":{"description":"Lista de entradas.","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/Post"}}}}},"429":{"description":"Límite de peticiones superado (120/min sin autenticar, ventana de 60 s por IP). Esperá los segundos que indica el header Retry-After y reintentá. Todas las respuestas del API llevan RateLimit-Limit, RateLimit-Remaining y RateLimit-Reset para auto-regularse.","headers":{"Retry-After":{"description":"Segundos hasta que se reinicia la ventana.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WPError"},"example":{"code":"rest_rate_limited","message":"Too many requests from this client.","data":{"status":429}}}}},"default":{"description":"Error JSON.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WPError"}}}}}}},"/wp-json/wp/v2/posts/{id}":{"get":{"operationId":"getPostById","summary":"Devuelve una entrada por ID","description":"Devuelve una entrada del blog por su ID numérico. Si no existe responde 404 con cuerpo JSON (code rest_post_invalid_id).","parameters":[{"name":"id","in":"path","required":true,"description":"ID numérico del recurso.","schema":{"type":"integer"}}],"responses":{"200":{"description":"La entrada.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Post"}}}},"404":{"description":"No encontrado. Cuerpo JSON con código y mensaje.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WPError"},"example":{"code":"rest_post_invalid_id","message":"ID de entrada no válido.","data":{"status":404}}}}},"429":{"description":"Límite de peticiones superado (120/min sin autenticar, ventana de 60 s por IP). Esperá los segundos que indica el header Retry-After y reintentá. Todas las respuestas del API llevan RateLimit-Limit, RateLimit-Remaining y RateLimit-Reset para auto-regularse.","headers":{"Retry-After":{"description":"Segundos hasta que se reinicia la ventana.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WPError"},"example":{"code":"rest_rate_limited","message":"Too many requests from this client.","data":{"status":429}}}}}}}},"/wp-json/wp/v2/pages":{"get":{"operationId":"listPages","summary":"Lista o busca páginas","description":"Devuelve las páginas del sitio (precios, contacto, casos de éxito, listados de agencias) en JSON.","parameters":[{"name":"search","in":"query","required":false,"description":"Texto libre a buscar.","schema":{"type":"string"}},{"name":"slug","in":"query","required":false,"description":"Filtra por slug exacto.","schema":{"type":"string"}},{"name":"per_page","in":"query","required":false,"description":"Resultados por página (1-100).","schema":{"type":"integer","minimum":1,"maximum":100,"default":10}},{"name":"page","in":"query","required":false,"description":"Página de resultados.","schema":{"type":"integer","minimum":1,"default":1}}],"responses":{"200":{"description":"Lista de páginas.","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/Post"}}}}},"429":{"description":"Límite de peticiones superado (120/min sin autenticar, ventana de 60 s por IP). Esperá los segundos que indica el header Retry-After y reintentá. Todas las respuestas del API llevan RateLimit-Limit, RateLimit-Remaining y RateLimit-Reset para auto-regularse.","headers":{"Retry-After":{"description":"Segundos hasta que se reinicia la ventana.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WPError"},"example":{"code":"rest_rate_limited","message":"Too many requests from this client.","data":{"status":429}}}}},"default":{"description":"Error JSON.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WPError"}}}}}}},"/wp-json/wp/v2/pages/{id}":{"get":{"operationId":"getPageById","summary":"Devuelve una página por ID","description":"Devuelve una página por su ID numérico. Si no existe responde 404 con cuerpo JSON.","parameters":[{"name":"id","in":"path","required":true,"description":"ID numérico del recurso.","schema":{"type":"integer"}}],"responses":{"200":{"description":"La página.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Post"}}}},"404":{"description":"No encontrado. Cuerpo JSON con código y mensaje.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WPError"},"example":{"code":"rest_post_invalid_id","message":"ID de entrada no válido.","data":{"status":404}}}}},"429":{"description":"Límite de peticiones superado (120/min sin autenticar, ventana de 60 s por IP). Esperá los segundos que indica el header Retry-After y reintentá. Todas las respuestas del API llevan RateLimit-Limit, RateLimit-Remaining y RateLimit-Reset para auto-regularse.","headers":{"Retry-After":{"description":"Segundos hasta que se reinicia la ventana.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WPError"},"example":{"code":"rest_rate_limited","message":"Too many requests from this client.","data":{"status":429}}}}}}}},"/wp-json/wp/v2/categories":{"get":{"operationId":"listCategories","summary":"Lista las categorías del blog","description":"Devuelve las categorías (p. ej. GEO ES, Mejores herramientas ES) con su ID, nombre, slug y conteo.","parameters":[{"name":"search","in":"query","required":false,"description":"Texto libre a buscar.","schema":{"type":"string"}},{"name":"per_page","in":"query","required":false,"description":"Resultados por página (1-100).","schema":{"type":"integer","minimum":1,"maximum":100,"default":10}},{"name":"page","in":"query","required":false,"description":"Página de resultados.","schema":{"type":"integer","minimum":1,"default":1}}],"responses":{"200":{"description":"Lista de categorías.","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/Category"}}}}},"429":{"description":"Límite de peticiones superado (120/min sin autenticar, ventana de 60 s por IP). Esperá los segundos que indica el header Retry-After y reintentá. Todas las respuestas del API llevan RateLimit-Limit, RateLimit-Remaining y RateLimit-Reset para auto-regularse.","headers":{"Retry-After":{"description":"Segundos hasta que se reinicia la ventana.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WPError"},"example":{"code":"rest_rate_limited","message":"Too many requests from this client.","data":{"status":429}}}}},"default":{"description":"Error JSON.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WPError"}}}}}}},"/wp-json/wp/v2/search":{"get":{"operationId":"searchContent","summary":"Busca en todo el contenido del sitio","description":"Búsqueda unificada sobre entradas y páginas. Devuelve título, URL y tipo de cada resultado.","parameters":[{"name":"search","in":"query","required":true,"description":"Texto a buscar.","schema":{"type":"string"}},{"name":"per_page","in":"query","required":false,"description":"Resultados por página (1-100).","schema":{"type":"integer","minimum":1,"maximum":100,"default":10}},{"name":"page","in":"query","required":false,"description":"Página de resultados.","schema":{"type":"integer","minimum":1,"default":1}}],"responses":{"200":{"description":"Resultados de búsqueda.","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/SearchResult"}}}}},"429":{"description":"Límite de peticiones superado (120/min sin autenticar, ventana de 60 s por IP). Esperá los segundos que indica el header Retry-After y reintentá. Todas las respuestas del API llevan RateLimit-Limit, RateLimit-Remaining y RateLimit-Reset para auto-regularse.","headers":{"Retry-After":{"description":"Segundos hasta que se reinicia la ventana.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WPError"},"example":{"code":"rest_rate_limited","message":"Too many requests from this client.","data":{"status":429}}}}},"default":{"description":"Error JSON.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WPError"}}}}}}},"/llms.txt":{"get":{"operationId":"getLlmsIndex","summary":"Índice del sitio para agentes (llms.txt)","description":"Índice en markdown de todo el contenido del sitio con enlaces a la versión .md de cada pieza, guía de cuándo usar CreceRank y recursos para desarrolladores.","responses":{"200":{"description":"El índice.","content":{"text/plain":{"schema":{"type":"string"}}}}}}},"/llms-full.txt":{"get":{"operationId":"getLlmsFullText","summary":"Todo el contenido del sitio en un archivo","description":"Texto completo de todas las páginas listadas en llms.txt, concatenado en un único archivo para ingestión por LLMs.","responses":{"200":{"description":"El contenido completo.","content":{"text/plain":{"schema":{"type":"string"}}}}}}},"/{slug}.md":{"get":{"operationId":"getMarkdownBySlug","summary":"Versión markdown de un artículo","description":"Cada entrada y página del sitio tiene un espejo markdown con frontmatter YAML (title, description, url, fechas, autor). También se puede pedir la URL HTML canónica con el header Accept: text/markdown.","parameters":[{"name":"slug","in":"path","required":true,"description":"Slug del artículo, p. ej. que-es-geo.","schema":{"type":"string"}}],"responses":{"200":{"description":"El artículo en markdown.","content":{"text/markdown":{"schema":{"type":"string"}}}},"404":{"description":"No existe un artículo con ese slug.","content":{"text/plain":{"schema":{"type":"string"}}}}}}},"/openapi.json":{"get":{"operationId":"getOpenApiSpec","summary":"Esta especificación","description":"Devuelve esta especificación OpenAPI 3.1 en JSON.","responses":{"200":{"description":"La especificación.","content":{"application/json":{"schema":{"type":"object"}}}}}}}},"components":{"schemas":{"WPError":{"type":"object","description":"Error estándar de la WordPress REST API. Siempre JSON, nunca HTML. El campo code identifica el error (p. ej. rest_no_route si la ruta no existe: revisá el path contra esta especificación; rest_post_invalid_id si el ID no existe: buscá el contenido con listPosts o searchContent).","properties":{"code":{"type":"string","description":"Código machine-readable del error, p. ej. rest_no_route."},"message":{"type":"string","description":"Mensaje legible del error."},"data":{"type":"object","properties":{"status":{"type":"integer","description":"Código de estado HTTP."}}}},"required":["code","message"]},"Post":{"type":"object","description":"Entrada del blog de CreceRank (contenido sobre GEO/AEO y visibilidad en IA).","properties":{"id":{"type":"integer"},"date":{"type":"string","format":"date-time"},"modified":{"type":"string","format":"date-time"},"slug":{"type":"string","description":"Añadiendo .md al slug se obtiene la versión markdown: https://crecerank.com/{slug}.md"},"link":{"type":"string","format":"uri"},"title":{"type":"object","properties":{"rendered":{"type":"string"}}},"excerpt":{"type":"object","properties":{"rendered":{"type":"string"}}},"content":{"type":"object","properties":{"rendered":{"type":"string"}}},"categories":{"type":"array","items":{"type":"integer"}}}},"Category":{"type":"object","properties":{"id":{"type":"integer"},"name":{"type":"string"},"slug":{"type":"string"},"count":{"type":"integer","description":"Cantidad de entradas en la categoría."}}},"SearchResult":{"type":"object","properties":{"id":{"type":"integer"},"title":{"type":"string"},"url":{"type":"string","format":"uri"},"type":{"type":"string","description":"post o page."},"subtype":{"type":"string"}}}}}}