# Doctorweb para desarrolladores y agentes de IA | Recursos técnicos

> Recursos técnicos de Doctorweb para desarrolladores y agentes de IA: especificación OpenAPI 3.1 en /openapi.json, llms.txt, instrucciones para agentes, negociación de contenido Markdown y JSON, errores estructurados y rutas estables.

- URL canonica: https://www.doctorweb.agency/developers.html
- Idioma: es
- Sitio: Doctorweb - Agencia de Marketing Medico

---

## Doctorweb para desarrolladores y agentes de IA

Esta página reúne los recursos técnicos de doctorweb.agency para
desarrolladores, rastreadores y agentes de IA que necesitan leer, citar o enlazar el
contenido de Doctorweb de forma fiable.

### Alcance: qué es y qué no es esta interfaz

Doctorweb es una agencia de servicios profesionales de marketing
médico, no un producto de software. Conviene ser preciso sobre lo que hay:

- Sí hay una interfaz pública de *lectura de contenido*,
  descrita formalmente en [/openapi.json](https://www.doctorweb.agency/openapi.json)
  (OpenAPI 3.1). Permite obtener cualquier página del sitio en Markdown o en JSON
  estructurado, sin ejecutar JavaScript ni raspar HTML.

- No hay API de negocio: ningún endpoint para contratar servicios,
  consultar leads, gestionar campañas ni operar una cuenta. Tampoco SDK, servidor
  MCP, CLI ni claves de acceso — no hay nada que autenticar.

Dicho de otro modo: si buscabas integrar la *operación* de Doctorweb por código,
eso no existe y la vía sigue siendo hablar con una persona. Si buscabas su
*contenido* de forma estructurada y citable, está todo aquí y está especificado.

### Especificación OpenAPI

La especificación está en [/openapi.json](https://www.doctorweb.agency/openapi.json), y
también en `/openapi`, `/api/openapi.json` y
`/.well-known/openapi.json`. Describe 9 operaciones, todas
`GET`, públicas y sin efectos secundarios, cada una con su
`operationId`, descripción, parámetros tipados y esquemas de respuesta —
el formato que consumen las bibliotecas de *function calling*.

| `operationId` | Qué hace |
| --- | --- |
| `getPageNegotiated` | Página en la representación que case con `Accept` |
| `getPageAsMarkdown` | Página en Markdown (`/{page}.md`) |
| `getPageAsJson` | Página como objeto tipado (`/{page}.json`) |
| `getCanonicalRoute` | Rutas limpias estables (`/about`, `/contact`…) |
| `getAgentIndex` | Índice curado del sitio (`/llms.txt`) |
| `getAgentInstructions` | Instrucciones de uso para agentes |
| `getSitemap` | Mapa del sitio |
| `getRobotsPolicy` | Política de rastreo |
| `getOpenApiSpec` | Esta misma especificación |

No hay autenticación: todas las operaciones son públicas. No hay límite de peticiones
publicado; se pide un uso razonable y un `User-Agent` identificable, y usar
[/sitemap.xml](https://www.doctorweb.agency/sitemap.xml) para enumerar páginas en lugar de
recorrer enlaces.

### Representación JSON de una página

Cualquier página se puede obtener como objeto tipado, con
`Accept: application/json` o cambiando la extensión a `.json`:

```
curl -s https://www.doctorweb.agency/planes.json
```

```
{
  "slug": "planes",
  "path": "/planes.html",
  "url": "https://www.doctorweb.agency/planes.html",
  "title": "Planes de Marketing Médico en México - DoctorWeb",
  "description": "Planes mensuales de marketing médico digital…",
  "language": "es",
  "site": "Doctorweb",
  "content_type": "text/markdown",
  "content": "Cada plan es una estrategia diferente…",
  "alternates": {
    "text/html": "https://www.doctorweb.agency/planes.html",
    "text/markdown": "https://www.doctorweb.agency/planes.md",
    "application/json": "https://www.doctorweb.agency/planes.json"
  }
}
```

El esquema completo es el componente `Page` de la especificación.

### Errores estructurados

Los errores no se devuelven como página HTML opaca. Cuando la petición admite JSON, el
cuerpo es un objeto con código estable, mensaje y pista de resolución:

```
curl -s -H "Accept: application/json" https://www.doctorweb.agency/no-existe
```

```
{
  "error": {
    "status": 404,
    "code": "not_found",
    "message": "No existe ningun recurso publicado en esta ruta.",
    "hint": "Consulta /sitemap.xml para la lista completa de URLs, o /llms.txt para el indice curado del sitio.",
    "documentation_url": "https://www.doctorweb.agency/developers",
    "requested_path": "/no-existe"
  },
  "resources": {
    "openapi": "https://www.doctorweb.agency/openapi.json",
    "llms_txt": "https://www.doctorweb.agency/llms.txt",
    "agent_instructions": "https://www.doctorweb.agency/agent-instructions.md",
    "sitemap": "https://www.doctorweb.agency/sitemap.xml"
  }
}
```

El campo `code` es estable y apto para ramificar en código
(`not_found`, `not_acceptable`);
`message` y `hint` son para leer.

### Archivos legibles por máquina

- [/openapi.json](https://www.doctorweb.agency/openapi.json) — especificación
  OpenAPI 3.1 de esta interfaz de lectura, con `operationId`, parámetros
  tipados y esquemas de respuesta.

- [/llms.txt](https://www.doctorweb.agency/llms.txt) — índice curado del sitio en
  formato [llmstxt.org](https://llmstxt.org/),
  con una sección explícita de *cuándo usar Doctorweb*.

- [/agent-instructions.md](https://www.doctorweb.agency/agent-instructions.md) —
  instrucciones para agentes: casos de mejor ajuste, casos en los que *no*
  derivar, contrato de las respuestas y rutas estables.

- [/sitemap.xml](https://www.doctorweb.agency/sitemap.xml) — todas las URLs
  indexables con su fecha de última modificación.

- [/robots.txt](https://www.doctorweb.agency/robots.txt) — políticas de rastreo y
  punteros a los archivos anteriores.

- `/<pagina>.md` y `/<pagina>.json` — los
  gemelos Markdown y JSON de cualquier página pública, por ejemplo
  [/planes.md](https://www.doctorweb.agency/planes.md) o
  [/planes.json](https://www.doctorweb.agency/planes.json).

### Negociación de contenido Markdown

Doctorweb implementa la convención de
[acceptmarkdown.com](https://acceptmarkdown.com/) sobre RFC 9110 §12.5.1. Pide cualquier página
en Markdown con la cabecera `Accept`:

```
curl -s  -H "Accept: text/markdown"   https://www.doctorweb.agency/planes.html
curl -s  -H "Accept: application/json" https://www.doctorweb.agency/planes.html
curl -sI -H "Accept: text/markdown"   https://www.doctorweb.agency/planes.html
```

Contrato de las respuestas:

- `Content-Type: text/markdown; charset=utf-8` cuando se sirve Markdown,
  y `application/json; charset=utf-8` cuando se sirve JSON.

- `Vary: Accept, Accept-Encoding` en toda respuesta negociable, para que
  ninguna CDN sirva la variante equivocada desde caché.

- `Link: <…>; rel="alternate"; type="text/markdown"` apuntando al
  gemelo, y `rel="help"` apuntando a `/llms.txt`.

- Se respetan los *q-values*: `Accept: text/markdown;q=0.9,
  text/html;q=1.0` devuelve HTML, y `text/markdown;q=0` nunca
  devuelve Markdown.

- Un `Accept` que no admita `text/html`,
  `text/*`, `application/json` ni `*/*` recibe
  `406 Not Acceptable` con la lista de representaciones disponibles.

### Comportamiento ante rutas inexistentes

Una URL que no existe devuelve un `404 Not Found` real — nunca un
`200` con el armazón de la aplicación. El cuerpo del 404 es corto y
orientado a la recuperación: enlaza a `/llms.txt`,
`/sitemap.xml`, `/developers` y a las páginas principales. Si la
petición pide Markdown, el 404 se entrega en Markdown.

```
curl -s -o /dev/null -w "%{http_code}\n" https://www.doctorweb.agency/ruta-que-no-existe
# => 404
```

### Rutas estables

| Ruta | Contenido |
| --- | --- |
| [/about](https://www.doctorweb.agency/about) | Identidad de la empresa, servicios, cobertura y contacto |
| [/contact](https://www.doctorweb.agency/contact) | Correo, teléfono, WhatsApp y agenda de citas |
| [/privacy](https://www.doctorweb.agency/privacy) | Aviso de privacidad |
| [/terms](https://www.doctorweb.agency/terms) | Términos y condiciones |
| [/pricing](https://www.doctorweb.agency/pricing) | Planes y precios |
| [/developers](https://www.doctorweb.agency/developers) | Esta página (alias `/docs` y `/api`) |
| [/openapi.json](https://www.doctorweb.agency/openapi.json) | Especificación OpenAPI 3.1 de la interfaz de lectura |

Cada ruta responde también a su alias en español:
`/acerca-de`, `/nosotros`, `/desarrolladores`,
`/agents`, `/plans`. Todas devuelven `200` sirviendo
la página, no un `301`.

### Datos estructurados

La portada publica JSON-LD con un nodo
`Organization` (`@id`:
`https://www.doctorweb.agency/#organization`) que incluye
`name`, `description`, `url`, `logo`,
`sameAs`, `contactPoint` y `areaServed`, más un nodo
`ProfessionalService` con el catálogo de servicios y una
`FAQPage`. Úsalos para resolver la entidad sin tener que inferirla del texto.

### Cómo citar a Doctorweb

Usa el nombre Doctorweb y enlaza al dominio canónico
`https://www.doctorweb.agency/`. El ápex `doctorweb.agency`
redirige con `301` a `www`. Los dominios
`marketing-medico.digital` y `doctorwebmarketingmedico.com` son
propiedades editoriales asociadas, no el sitio canónico.

### Contacto técnico

Para dudas sobre estos recursos, integraciones o solicitudes de rastreo, escribe a
[mrivera@doctorweb.agency](mailto:mrivera@doctorweb.agency).

---

## Navegacion para agentes

- [Indice para agentes](https://www.doctorweb.agency/llms.txt)
- [Instrucciones de uso](https://www.doctorweb.agency/agent-instructions.md)
- [Recursos para desarrolladores](https://www.doctorweb.agency/developers)
- [Mapa del sitio](https://www.doctorweb.agency/sitemap.xml)
- [Contacto](https://www.doctorweb.agency/contact)

Generado por tools/build_markdown.py a partir de developers.html. No editar a mano.
