Verified AgentReady.md certificate
Issued sig: ba39860a8522015e Verify →

Analyzed URL

https://cartadinamica.com/

Measured 3 weeks ago

Analyze another URL

AI-Ready Score

Fair

out of 100

Token Savings

HTML tokens 3027
Markdown tokens 368
Savings 88%

Score Breakdown

Accessibility 50/100
AI Discoverability 78/100
Structured Data 50/100
Semantic HTML 100/100
Content Efficiency 85/100

Emerging protocols

5 of 6 detected

Well-known endpoints AI agents look for. Detected here means an agent can discover and connect to your service automatically.

  • OAuth Protected Resource RFC 9728
    /.well-known/oauth-protected-resource
    • resource: carta-restaurante-admin
    • 1 authorization server(s)
  • OAuth Discovery RFC 8414
    /.well-known/oauth-authorization-server
    • issuer: https://api.cartadinamica.com
    • token_endpoint: /admin/auth/login
    • 1 grant type(s)
  • MCP Server Card SEP-1649 draft
    /.well-known/mcp/server-card.json
    • name: carta-restaurante-mcp
    • v0.1.0
  • A2A Agent Card A2A v1.0
    /.well-known/agent-card.json
    • name: Carta de Restaurante Dinamica Agent
    • v0.1.0
  • API Catalog RFC 9727
    /.well-known/api-catalog
  • Agent Skills index Discovery RFC v0.2.0 draft
    /.well-known/agent-skills/index.json
    • 1 skill(s)
    • public-menu-read

Doesn't stay fixed by itself. Monitoring isn't built yet — join the list and we'll tell you when it is.

You're on the list! We'll notify you when it launches.

What we measured Content requires JavaScript rendering

Your page requires JavaScript to render content. Most AI agents don't execute JavaScript, so they see an empty page.

How to implement

Use server-side rendering (SSR) or static site generation (SSG) to ensure content is available in the initial HTML response.

Paste into a coding agent to make the fix

What we measured No JSON-LD / Schema.org found

No Schema.org structured data found. JSON-LD helps AI agents extract factual, structured information from your pages.

How to implement

Add a <script type="application/ld+json"> block with Schema.org markup. Use appropriate types: Article for blog posts, Product for products, Organization for your company page.

Paste into a coding agent to make the fix

What we measured No Markdown for Agents support detected

Your site doesn't support Markdown for Agents. This Cloudflare standard lets AI agents request content in markdown format, reducing token usage by ~80%.

How to implement

Implement one or more: (1) Respond to Accept: text/markdown with markdown content. (2) Serve .md URLs (e.g., /page.md). (3) Add <link rel="alternate" type="text/markdown"> tags. (4) Add Link HTTP headers for markdown discovery.

Paste into a coding agent to make the fix

What we measured No canonical URL

No canonical URL found. This helps AI agents identify the preferred version of a page and avoid duplicate content.

How to implement

Add a <link rel="canonical" href="..."> tag pointing to the canonical URL of the page.

Paste into a coding agent to make the fix
Markdown tokens: 368
Carta digital para restaurantes

## La unica carta QR con precio dinamico de verdad

Cambia precios en segundos, con historico y trazabilidad completa. Sin PDFs desactualizados, sin llamar a la imprenta. Tu carta, siempre al dia, en el movil de cada cliente.

## Lo que te diferencia de una carta en PDF

### Precio dinamico con historico

Cambia el precio de un plato en un solo paso, con confirmacion doble y trazabilidad completa de cada cambio. Nunca pierdes el rastro de que se cobro y cuando.

### Administracion sin curva de aprendizaje

Un panel pensado para el dia a dia de un restaurante: crear productos, subir fotos y cambiar precios sin depender de un tecnico ni de una imprenta.

### 6 plantillas visuales listas para usar

De movil con fotos a carta clasica sin fotos, taberna rustica o quiosco tactil. Elige el estilo que mejor encaje con tu local, cambia cuando quieras.

### QR propio por restaurante

Genera y descarga el codigo QR de tu carta en un clic, listo para imprimir en mesas y escaparates.

### Selector de pedido para grupos grandes

Cada comensal marca cantidades por plato desde su movil. Cuando llega el turno de pedir, el resumen ya esta listo para ensenarle al camarero.

## Restaurantes que ya confian en nosotros

Entra y descubre como se ve su carta digital en vivo.

## Pide tu demo

Cuentanos sobre tu restaurante y te contactamos para ensenarte la carta en vivo.
Carta de Restaurante Dinamica

Carta digital para restaurantes

# La unica carta QR con precio dinamico de verdad

Cambia precios en segundos, con historico y trazabilidad completa. Sin PDFs desactualizados, sin llamar a la imprenta. Tu carta, siempre al dia, en el movil de cada cliente.

[Quiero una demo](https://cartadinamica.com/#contacto)[Acceso administradores](https://cartadinamica.com/admin/login)

## Lo que te diferencia de una carta en PDF

### Precio dinamico con historico

Cambia el precio de un plato en un solo paso, con confirmacion doble y trazabilidad completa de cada cambio. Nunca pierdes el rastro de que se cobro y cuando.

### Administracion sin curva de aprendizaje

Un panel pensado para el dia a dia de un restaurante: crear productos, subir fotos y cambiar precios sin depender de un tecnico ni de una imprenta.

### 6 plantillas visuales listas para usar

De movil con fotos a carta clasica sin fotos, taberna rustica o quiosco tactil. Elige el estilo que mejor encaje con tu local, cambia cuando quieras.

### QR propio por restaurante

Genera y descarga el codigo QR de tu carta en un clic, listo para imprimir en mesas y escaparates.

### Selector de pedido para grupos grandes

Cada comensal marca cantidades por plato desde su movil. Cuando llega el turno de pedir, el resumen ya esta listo para ensenarle al camarero.

## Restaurantes que ya confian en nosotros

Entra y descubre como se ve su carta digital en vivo.

[

C

Casa Iberica](https://cartadinamica.com/?restaurante=casa-iberica)[![La Leña de Cobo](https://storage.googleapis.com/carta-dinamica-uploads/restaurants/ac58b269534d4cf995cd9c20a5eff3a2.jpg)La Leña de Cobo](https://cartadinamica.com/?restaurante=la-lena-de-cobo)[![Bar Restaurante El Pargo](https://storage.googleapis.com/carta-dinamica-uploads/restaurants/e36a69e5bb9544778beda2f3f6c6c8ec.png)Bar Restaurante El Pargo](https://cartadinamica.com/?restaurante=el-pargo)

## Pide tu demo

Cuentanos sobre tu restaurante y te contactamos para ensenarte la carta en vivo.

Enviar

Upload this file as /index.md on your server so AI agents can access a clean version of your page. You can also configure Accept: text/markdown content negotiation to serve it automatically.

Our recommendation

Download llms.txt
# Cartas de Menu Dinamicas

> Precios dinamicos para restaurantes: carta QR con cambio de precio en tiempo real y trazabilidad completa.

## Main
- [Cartas de Menu Dinamicas — Precios dinamicos para restaurantes](https://cartadinamica.com/): Precios dinamicos para restaurantes: carta QR con cambio de precio en tiempo real y trazabilidad completa.
- [Aviso legal](https://cartadinamica.com/aviso-legal)
- [Politica de privacidad](https://cartadinamica.com/politica-de-privacidad)
- [Politica de cookies](https://cartadinamica.com/politica-de-cookies)

Full llms.txt requires domain-wide analysis (coming soon)

Upload this file to https://cartadinamica.com/llms.txt at the root of your domain. AI agents like ChatGPT, Claude, and Perplexity check this file to understand your site structure.

This site already has a llms.txt file.

Valid format
# Carta de Restaurante Dinamica

Project: Carta de Restaurante Dinamica (cartadinamica.com)
Description: Plataforma web multi-restaurante de carta QR con precio dinamico, historico de precios y varias plantillas visuales de carta.

## Sitio publico
- `/` — landing comercial, propuesta de valor y formulario de contacto.
- `/restaurantes` — directorio de restaurantes publicos.
- `/?restaurante=<slug>` — carta publica de un restaurante concreto (formato usado por los codigos QR).

## API publica (backend en api.cartadinamica.com, sin autenticacion)
- `GET /health` — estado del servicio.
- `GET /public/restaurants` — listado de restaurantes visibles (nombre, slug, portada).
- `GET /public/menu/{slug}` — carta completa de un restaurante (categorias, productos, precios con IVA, alergenos si estan activados).
- `GET /public/menu/items/{item_id}/price-history` — historico de precio de 30 dias de un producto, si el restaurante lo activa.
- `POST /public/contact-requests` — formulario de contacto de la landing (protegido con limite de tasa).
- `GET /sitemap.xml` — mapa del sitio generado dinamicamente a partir de los restaurantes publicados.

## Acceso administrativo (fuera del alcance de agentes automatizados)
- `/admin/login` y `/superadmin/login` requieren credenciales humanas; ver `/auth.md`.

## Documentacion del proyecto
- `/README.md`
- `/dbv-specs-ops-master/docs/SPECIFICATIONS.md`
- `/dbv-specs-ops-master/docs/ARCHITECTURE.md`
- `/dbv-specs-ops-master/docs/DESIGN.md`

## Notas
- Los precios se muestran siempre con IVA incluido (mercado espanol).
- La carta publica es movil-first; existen 6 plantillas visuales distintas segun el restaurante.
- Un restaurante puede estar deshabilitado (`is_enabled=false`): en ese caso su carta publica no esta disponible aunque el slug exista.

Accessibility

Content available without JavaScript (20/100)

Content requires JavaScript rendering

Content appears early in HTML (75/100)

Main content starts at 26% of HTML

Reasonable page size (100/100)

Page size: 10KB

AI Discoverability

Robots.txt allows AI bots (100/100)

All major AI search bots allowed

Markdown for Agents support (0/100)
&#10007; Accept: text/markdown &#10007; .md URL &#10007; <link> tag &#10007; Link header
Has sitemap.xml (100/100)

Sitemap found

Has robots.txt file (100/100)

robots.txt exists

Has llms.txt file (100/100)

llms.txt exists and is valid

Has Content-Signal (robots.txt or HTTP headers) (80/100)
&#10003; robots.txt &#10007; HTTP header &#10003; Policy

Structured Data

Has Schema.org / JSON-LD (0/100)

No JSON-LD / Schema.org found

Has Open Graph tags (100/100)

All OG tags present

Has meta description (100/100)

Meta description: 106 chars

Has canonical URL (0/100)

No canonical URL

Has lang attribute (100/100)

lang="en"

Semantic HTML

Proper heading hierarchy (100/100)

Clean heading hierarchy

Uses article or main element (100/100)

Has <article>

Uses semantic HTML elements (100/100)

10 semantic elements, 11 divs (ratio: 48%)

Meaningful image alt texts (100/100)

2/2 images with meaningful alt text

Low div nesting depth (100/100)

Avg div depth: 2.2, max: 4

Content Efficiency

Good token reduction ratio (100/100)

88% token reduction (HTML→Markdown)

Good content-to-noise ratio (50/100)

Content ratio: 13.2% (1337 content chars / 10137 HTML bytes)

Reasonable page weight (100/100)

HTML size: 10KB

Minimal inline styles (100/100)

0/99 elements with inline styles (0.0%)

{
  "url": "https://cartadinamica.com/",
  "timestamp": 1785994474554,
  "fetch": {
    "mode": "rendered",
    "timeMs": 1435,
    "htmlSizeBytes": 10137,
    "supportsMarkdown": false,
    "markdownAgents": {
      "contentNegotiation": false,
      "mdUrl": {
        "found": false,
        "url": null
      },
      "linkTag": {
        "found": false,
        "url": null
      },
      "linkHeader": {
        "found": false,
        "url": null
      },
      "responseHeaders": {
        "contentSignal": null,
        "xMarkdownTokens": null,
        "vary": null
      },
      "frontmatter": {
        "present": false,
        "fields": [],
        "level": "none"
      },
      "level": "none"
    },
    "statusCode": 200
  },
  "extraction": {
    "title": "Cartas de Menu Dinamicas — Precios dinamicos para restaurantes",
    "excerpt": "Cambia precios en segundos, con historico y trazabilidad completa. Carta QR movil-first para tu restaurante.",
    "byline": null,
    "siteName": "Cartas de Menu Dinamicas",
    "lang": "en",
    "contentLength": 1337,
    "metadata": {
      "description": "Precios dinamicos para restaurantes: carta QR con cambio de precio en tiempo real y trazabilidad completa.",
      "ogTitle": "Cartas de Menu Dinamicas — Precios dinamicos para restaurantes",
      "ogDescription": "Cambia precios en segundos, con historico y trazabilidad completa. Carta QR movil-first para tu restaurante.",
      "ogImage": "https://cartadinamica.com/og-image.png",
      "ogType": "website",
      "canonical": null,
      "lang": "en",
      "schemas": [],
      "robotsMeta": null,
      "author": null,
      "generator": null,
      "markdownAlternateHref": null
    }
  },
  "markdown": "Carta digital para restaurantes\n\n## La unica carta QR con precio dinamico de verdad\n\nCambia precios en segundos, con historico y trazabilidad completa. Sin PDFs desactualizados, sin llamar a la imprenta. Tu carta, siempre al dia, en el movil de cada cliente.\n\n## Lo que te diferencia de una carta en PDF\n\n### Precio dinamico con historico\n\nCambia el precio de un plato en un solo paso, con confirmacion doble y trazabilidad completa de cada cambio. Nunca pierdes el rastro de que se cobro y cuando.\n\n### Administracion sin curva de aprendizaje\n\nUn panel pensado para el dia a dia de un restaurante: crear productos, subir fotos y cambiar precios sin depender de un tecnico ni de una imprenta.\n\n### 6 plantillas visuales listas para usar\n\nDe movil con fotos a carta clasica sin fotos, taberna rustica o quiosco tactil. Elige el estilo que mejor encaje con tu local, cambia cuando quieras.\n\n### QR propio por restaurante\n\nGenera y descarga el codigo QR de tu carta en un clic, listo para imprimir en mesas y escaparates.\n\n### Selector de pedido para grupos grandes\n\nCada comensal marca cantidades por plato desde su movil. Cuando llega el turno de pedir, el resumen ya esta listo para ensenarle al camarero.\n\n## Restaurantes que ya confian en nosotros\n\nEntra y descubre como se ve su carta digital en vivo.\n\n## Pide tu demo\n\nCuentanos sobre tu restaurante y te contactamos para ensenarte la carta en vivo.\n",
  "fullPageMarkdown": "Carta de Restaurante Dinamica\n\nCarta digital para restaurantes\n\n# La unica carta QR con precio dinamico de verdad\n\nCambia precios en segundos, con historico y trazabilidad completa. Sin PDFs desactualizados, sin llamar a la imprenta. Tu carta, siempre al dia, en el movil de cada cliente.\n\n[Quiero una demo](https://cartadinamica.com/#contacto)[Acceso administradores](https://cartadinamica.com/admin/login)\n\n## Lo que te diferencia de una carta en PDF\n\n### Precio dinamico con historico\n\nCambia el precio de un plato en un solo paso, con confirmacion doble y trazabilidad completa de cada cambio. Nunca pierdes el rastro de que se cobro y cuando.\n\n### Administracion sin curva de aprendizaje\n\nUn panel pensado para el dia a dia de un restaurante: crear productos, subir fotos y cambiar precios sin depender de un tecnico ni de una imprenta.\n\n### 6 plantillas visuales listas para usar\n\nDe movil con fotos a carta clasica sin fotos, taberna rustica o quiosco tactil. Elige el estilo que mejor encaje con tu local, cambia cuando quieras.\n\n### QR propio por restaurante\n\nGenera y descarga el codigo QR de tu carta en un clic, listo para imprimir en mesas y escaparates.\n\n### Selector de pedido para grupos grandes\n\nCada comensal marca cantidades por plato desde su movil. Cuando llega el turno de pedir, el resumen ya esta listo para ensenarle al camarero.\n\n## Restaurantes que ya confian en nosotros\n\nEntra y descubre como se ve su carta digital en vivo.\n\n[\n\nC\n\nCasa Iberica](https://cartadinamica.com/?restaurante=casa-iberica)[![La Leña de Cobo](https://storage.googleapis.com/carta-dinamica-uploads/restaurants/ac58b269534d4cf995cd9c20a5eff3a2.jpg)La Leña de Cobo](https://cartadinamica.com/?restaurante=la-lena-de-cobo)[![Bar Restaurante El Pargo](https://storage.googleapis.com/carta-dinamica-uploads/restaurants/e36a69e5bb9544778beda2f3f6c6c8ec.png)Bar Restaurante El Pargo](https://cartadinamica.com/?restaurante=el-pargo)\n\n## Pide tu demo\n\nCuentanos sobre tu restaurante y te contactamos para ensenarte la carta en vivo.\n\nEnviar\n",
  "markdownStats": {
    "images": 0,
    "links": 0,
    "tables": 0,
    "codeBlocks": 0,
    "headings": 9
  },
  "tokens": {
    "htmlTokens": 3027,
    "markdownTokens": 368,
    "reduction": 2659,
    "reductionPercent": 88
  },
  "score": {
    "score": 68,
    "grade": "C",
    "rubricVersion": 2,
    "dimensions": {
      "accessibility": {
        "score": 50,
        "weight": 30,
        "grade": "D",
        "checks": {
          "content_without_js": {
            "score": 20,
            "weight": 55,
            "evidence": "proven",
            "details": "Content requires JavaScript rendering"
          },
          "fast_content_position": {
            "score": 75,
            "weight": 25,
            "evidence": "plausible",
            "details": "Main content starts at 26% of HTML"
          },
          "reasonable_page_size": {
            "score": 100,
            "weight": 20,
            "evidence": "plausible",
            "details": "Page size: 10KB"
          }
        }
      },
      "aiDiscoverability": {
        "score": 78,
        "weight": 25,
        "grade": "B",
        "checks": {
          "robots_allows_ai_bots": {
            "score": 100,
            "weight": 35,
            "evidence": "proven",
            "details": "All major AI search bots allowed"
          },
          "supports_markdown_negotiation": {
            "score": 0,
            "weight": 20,
            "evidence": "plausible",
            "details": "No Markdown for Agents support detected"
          },
          "has_sitemap": {
            "score": 100,
            "weight": 15,
            "evidence": "plausible",
            "details": "Sitemap found"
          },
          "has_robots_txt": {
            "score": 100,
            "weight": 10,
            "evidence": "plausible",
            "details": "robots.txt exists"
          },
          "has_llms_txt": {
            "score": 100,
            "weight": 10,
            "evidence": "speculative",
            "details": "llms.txt exists and is valid"
          },
          "has_content_signals": {
            "score": 80,
            "weight": 10,
            "evidence": "speculative",
            "details": "robots.txt: ai-train=no, search=yes, ai-input=yes | Policy included"
          }
        }
      },
      "structuredData": {
        "score": 50,
        "weight": 20,
        "grade": "D",
        "checks": {
          "has_schema_org": {
            "score": 0,
            "weight": 35,
            "evidence": "proven",
            "details": "No JSON-LD / Schema.org found"
          },
          "has_open_graph": {
            "score": 100,
            "weight": 20,
            "evidence": "plausible",
            "details": "All OG tags present"
          },
          "has_meta_description": {
            "score": 100,
            "weight": 20,
            "evidence": "plausible",
            "details": "Meta description: 106 chars"
          },
          "has_canonical_url": {
            "score": 0,
            "weight": 15,
            "evidence": "plausible",
            "details": "No canonical URL"
          },
          "has_lang_attribute": {
            "score": 100,
            "weight": 10,
            "evidence": "plausible",
            "details": "lang=\"en\""
          }
        }
      },
      "semanticHtml": {
        "score": 100,
        "weight": 15,
        "grade": "A",
        "checks": {
          "proper_heading_hierarchy": {
            "score": 100,
            "weight": 30,
            "evidence": "plausible",
            "details": "Clean heading hierarchy"
          },
          "uses_article_or_main": {
            "score": 100,
            "weight": 25,
            "evidence": "plausible",
            "details": "Has <article>"
          },
          "semantic_elements": {
            "score": 100,
            "weight": 20,
            "evidence": "plausible",
            "details": "10 semantic elements, 11 divs (ratio: 48%)"
          },
          "meaningful_alt_texts": {
            "score": 100,
            "weight": 15,
            "evidence": "plausible",
            "details": "2/2 images with meaningful alt text"
          },
          "low_div_nesting": {
            "score": 100,
            "weight": 10,
            "evidence": "speculative",
            "details": "Avg div depth: 2.2, max: 4"
          }
        }
      },
      "contentEfficiency": {
        "score": 85,
        "weight": 10,
        "grade": "B",
        "checks": {
          "token_reduction_ratio": {
            "score": 100,
            "weight": 40,
            "evidence": "speculative",
            "details": "88% token reduction (HTML→Markdown)"
          },
          "content_to_noise_ratio": {
            "score": 50,
            "weight": 30,
            "evidence": "speculative",
            "details": "Content ratio: 13.2% (1337 content chars / 10137 HTML bytes)"
          },
          "reasonable_page_weight": {
            "score": 100,
            "weight": 20,
            "evidence": "speculative",
            "details": "HTML size: 10KB"
          },
          "minimal_inline_styles": {
            "score": 100,
            "weight": 10,
            "evidence": "speculative",
            "details": "0/99 elements with inline styles (0.0%)"
          }
        }
      }
    }
  },
  "recommendations": [
    {
      "id": "provide_content_without_js",
      "priority": "critical",
      "category": "accessibility",
      "titleKey": "rec.provide_content_without_js.title",
      "descriptionKey": "rec.provide_content_without_js.description",
      "howToKey": "rec.provide_content_without_js.howto",
      "effort": "significant",
      "estimatedImpact": 13.2,
      "maxImpact": 16.5,
      "evidence": "proven",
      "checkScore": 20,
      "checkDetails": "Content requires JavaScript rendering"
    },
    {
      "id": "add_schema_org",
      "priority": "critical",
      "category": "structuredData",
      "titleKey": "rec.add_schema_org.title",
      "descriptionKey": "rec.add_schema_org.description",
      "howToKey": "rec.add_schema_org.howto",
      "effort": "moderate",
      "estimatedImpact": 7,
      "maxImpact": 7,
      "evidence": "proven",
      "checkScore": 0,
      "checkDetails": "No JSON-LD / Schema.org found"
    },
    {
      "id": "add_markdown_negotiation",
      "priority": "critical",
      "category": "aiDiscoverability",
      "titleKey": "rec.add_markdown_negotiation.title",
      "descriptionKey": "rec.add_markdown_negotiation.description",
      "howToKey": "rec.add_markdown_negotiation.howto",
      "effort": "significant",
      "estimatedImpact": 5,
      "maxImpact": 5,
      "evidence": "plausible",
      "checkScore": 0,
      "checkDetails": "No Markdown for Agents support detected"
    },
    {
      "id": "add_canonical_url",
      "priority": "high",
      "category": "structuredData",
      "titleKey": "rec.add_canonical_url.title",
      "descriptionKey": "rec.add_canonical_url.description",
      "howToKey": "rec.add_canonical_url.howto",
      "effort": "quick-win",
      "estimatedImpact": 3,
      "maxImpact": 3,
      "evidence": "plausible",
      "checkScore": 0,
      "checkDetails": "No canonical URL"
    }
  ],
  "llmsTxtPreview": "# Cartas de Menu Dinamicas\n\n> Precios dinamicos para restaurantes: carta QR con cambio de precio en tiempo real y trazabilidad completa.\n\n## Main\n- [Cartas de Menu Dinamicas — Precios dinamicos para restaurantes](https://cartadinamica.com/): Precios dinamicos para restaurantes: carta QR con cambio de precio en tiempo real y trazabilidad completa.\n- [Aviso legal](https://cartadinamica.com/aviso-legal)\n- [Politica de privacidad](https://cartadinamica.com/politica-de-privacidad)\n- [Politica de cookies](https://cartadinamica.com/politica-de-cookies)\n\n",
  "llmsTxtExisting": "# Carta de Restaurante Dinamica\n\nProject: Carta de Restaurante Dinamica (cartadinamica.com)\nDescription: Plataforma web multi-restaurante de carta QR con precio dinamico, historico de precios y varias plantillas visuales de carta.\n\n## Sitio publico\n- `/` — landing comercial, propuesta de valor y formulario de contacto.\n- `/restaurantes` — directorio de restaurantes publicos.\n- `/?restaurante=<slug>` — carta publica de un restaurante concreto (formato usado por los codigos QR).\n\n## API publica (backend en api.cartadinamica.com, sin autenticacion)\n- `GET /health` — estado del servicio.\n- `GET /public/restaurants` — listado de restaurantes visibles (nombre, slug, portada).\n- `GET /public/menu/{slug}` — carta completa de un restaurante (categorias, productos, precios con IVA, alergenos si estan activados).\n- `GET /public/menu/items/{item_id}/price-history` — historico de precio de 30 dias de un producto, si el restaurante lo activa.\n- `POST /public/contact-requests` — formulario de contacto de la landing (protegido con limite de tasa).\n- `GET /sitemap.xml` — mapa del sitio generado dinamicamente a partir de los restaurantes publicados.\n\n## Acceso administrativo (fuera del alcance de agentes automatizados)\n- `/admin/login` y `/superadmin/login` requieren credenciales humanas; ver `/auth.md`.\n\n## Documentacion del proyecto\n- `/README.md`\n- `/dbv-specs-ops-master/docs/SPECIFICATIONS.md`\n- `/dbv-specs-ops-master/docs/ARCHITECTURE.md`\n- `/dbv-specs-ops-master/docs/DESIGN.md`\n\n## Notas\n- Los precios se muestran siempre con IVA incluido (mercado espanol).\n- La carta publica es movil-first; existen 6 plantillas visuales distintas segun el restaurante.\n- Un restaurante puede estar deshabilitado (`is_enabled=false`): en ese caso su carta publica no esta disponible aunque el slug exista.",
  "emergingProtocols": {
    "oauthProtectedResource": {
      "exists": true,
      "url": "https://cartadinamica.com/.well-known/oauth-protected-resource",
      "resource": "carta-restaurante-admin",
      "authorizationServers": [
        "/.well-known/oauth-authorization-server"
      ],
      "scopesSupported": null
    },
    "oauthDiscovery": {
      "exists": true,
      "url": "https://cartadinamica.com/.well-known/oauth-authorization-server",
      "issuer": "https://api.cartadinamica.com",
      "authorizationEndpoint": null,
      "tokenEndpoint": "/admin/auth/login",
      "grantTypesSupported": [
        "password"
      ],
      "scopesSupported": null
    },
    "mcpServerCard": {
      "exists": true,
      "url": "https://cartadinamica.com/.well-known/mcp.json",
      "draft": true,
      "name": "carta-restaurante-mcp",
      "version": "0.1.0",
      "description": "MCP metadata placeholder for future integrations. No MCP server is deployed yet.",
      "transport": null,
      "tools": null,
      "resources": null,
      "prompts": null
    },
    "a2aAgentCard": {
      "exists": true,
      "url": "https://cartadinamica.com/.well-known/agent.json",
      "name": "Carta de Restaurante Dinamica Agent",
      "version": "0.1.0",
      "description": "Agent discovery card for Carta de Restaurante Dinamica, a multi-restaurant dynamic-pricing QR menu platform.",
      "capabilities": null,
      "skills": null,
      "endpoint": null
    },
    "apiCatalog": {
      "exists": false,
      "url": "https://cartadinamica.com/.well-known/api-catalog"
    },
    "agentSkills": {
      "exists": true,
      "url": "https://cartadinamica.com/.well-known/agent-skills/index.json",
      "draft": true,
      "schema": null,
      "skills": 1,
      "names": [
        "public-menu-read"
      ]
    },
    "count": 5,
    "total": 6
  },
  "botAccess": {
    "probed": true,
    "bot": "OAI-SearchBot",
    "controlStatus": 200,
    "botStatus": 200,
    "discriminates": false,
    "refusedAsBot": false,
    "edge": null,
    "verifiable": false,
    "detail": "This origin answers OAI-SearchBot exactly as it answers any other client (200). No edge-level filtering of AI crawlers observed."
  },
  "snippets": [
    {
      "id": "add_canonical_url",
      "title": "Add canonical URL",
      "description": "The canonical URL tells AI agents which version of the page is the \"official\" one, avoiding duplicate content issues.",
      "language": "html",
      "code": "<link rel=\"canonical\" href=\"https://cartadinamica.com/\">",
      "filename": "<head>"
    },
    {
      "id": "add_schema_org",
      "title": "Add Schema.org JSON-LD",
      "description": "Structured data helps AI agents understand the type, author, and purpose of your content.",
      "language": "html",
      "code": "<script type=\"application/ld+json\">\n{\n  \"@context\": \"https://schema.org\",\n  \"@type\": \"WebPage\",\n  \"name\": \"Cartas de Menu Dinamicas — Precios dinamicos para restaurantes\",\n  \"description\": \"Precios dinamicos para restaurantes: carta QR con cambio de precio en tiempo real y trazabilidad completa.\",\n  \"url\": \"https://cartadinamica.com/\",\n  \"inLanguage\": \"en\",\n  \"isPartOf\": {\n    \"@type\": \"WebSite\",\n    \"name\": \"Cartas de Menu Dinamicas\"\n  }\n}\n</script>",
      "filename": "<head>"
    },
    {
      "id": "add_markdown_negotiation",
      "title": "Support Markdown for Agents",
      "description": "Let AI agents request a clean Markdown version of any page via content negotiation, .md alternate URLs, link tags or Link headers.",
      "language": "html",
      "code": "<!-- Mechanism 3: link tag advertising the .md alternate -->\n<link rel=\"alternate\" type=\"text/markdown\" href=\"/page.md\">",
      "filename": "<head>",
      "stacks": [
        {
          "id": "html",
          "label": "HTML <head>",
          "language": "html",
          "filename": "<head>",
          "code": "<!-- Mechanism 3: link tag advertising the .md alternate -->\n<link rel=\"alternate\" type=\"text/markdown\" href=\"/page.md\">"
        },
        {
          "id": "express",
          "label": "Express",
          "language": "javascript",
          "filename": "server.js",
          "code": "// Mechanisms 1 + 4: content negotiation + Link header\napp.get('/page', (req, res) => {\n  res.setHeader('Vary', 'Accept');\n  res.setHeader('Link', '</page.md>; rel=\"alternate\"; type=\"text/markdown\"');\n  if ((req.headers.accept || '').includes('text/markdown')) {\n    res.type('text/markdown; charset=utf-8');\n    return res.send(renderMarkdown('page'));\n  }\n  res.render('page');\n});"
        },
        {
          "id": "fastify",
          "label": "Fastify",
          "language": "javascript",
          "filename": "server.js",
          "code": "// Mechanisms 1 + 4: content negotiation + Link header\nfastify.get('/page', async (req, reply) => {\n  reply.header('Vary', 'Accept');\n  reply.header('Link', '</page.md>; rel=\"alternate\"; type=\"text/markdown\"');\n  if ((req.headers.accept || '').includes('text/markdown')) {\n    return reply.type('text/markdown; charset=utf-8').send(renderMarkdown('page'));\n  }\n  return reply.view('/page.ejs');\n});"
        },
        {
          "id": "nextjs",
          "label": "Next.js",
          "language": "typescript",
          "filename": "app/page/route.ts",
          "code": "// Next.js App Router — Route Handler returning Markdown\nimport { NextRequest } from 'next/server';\nimport { renderMarkdown } from '@/lib/md';\nexport async function GET(req: NextRequest) {\n  const accept = req.headers.get('accept') || '';\n  if (accept.includes('text/markdown')) {\n    return new Response(await renderMarkdown('page'), {\n      headers: {\n        'Content-Type': 'text/markdown; charset=utf-8',\n        'Vary': 'Accept',\n      },\n    });\n  }\n  // Fall through to the page component\n  return new Response(null, { status: 404 });\n}"
        },
        {
          "id": "wordpress",
          "label": "WordPress",
          "language": "php",
          "filename": "functions.php",
          "code": "<?php\n// Mechanism 1: respond to Accept: text/markdown on the same URL\nadd_action('template_redirect', function () {\n    if (!is_singular()) return;\n    $accept = $_SERVER['HTTP_ACCEPT'] ?? '';\n    if (strpos($accept, 'text/markdown') === false) return;\n    header('Content-Type: text/markdown; charset=utf-8');\n    header('Vary: Accept');\n    $post = get_queried_object();\n    echo \"# \" . get_the_title($post) . \"\\n\\n\";\n    echo wp_strip_all_tags(apply_filters('the_content', $post->post_content));\n    exit;\n});"
        },
        {
          "id": "static",
          "label": "Hugo / Jekyll / Astro",
          "language": "txt",
          "filename": "static/page.md",
          "code": "# Mechanism 2: serve .md alongside .html\n# Hugo: place page.md in /static/ — built unchanged\n# Jekyll: drop page.md in /assets/ — copied as-is\n# Astro: src/pages/page.md.ts that exports a GET returning markdown\n\n# Then advertise with mechanism 3 in <head>:\n#   <link rel=\"alternate\" type=\"text/markdown\" href=\"/page.md\">"
        }
      ]
    }
  ]
}

Use our API to get this programmatically (coming soon)

This JSON is for internal use — unlike the Markdown and llms.txt files, it's not meant to be uploaded to your site. Save it as a baseline to track your score over time, share it with your dev team, or integrate it into your CI/CD pipeline.

Want a second opinion?

Cloudflare runs a free scanner too, and it asks a different question. It scores what your site publishes for agents to call — MCP server cards, Agent Skills, API catalogs, DNS records. We score whether an agent can reach, read and understand your content. A site can do well on one and poorly on the other, so expect two different numbers: they are answers to two different questions, and both are worth knowing.

Scan cartadinamica.com with Cloudflare

Embed your badge

Add this badge to your site. It updates automatically as your AI-readiness score changes.

AgentReady.md score for cartadinamica.com
Script Recommended
<script src="https://agentready.md/badge.js" data-id="0360d605-0561-4fc7-b6ea-3ee15d7bca2b" data-domain="cartadinamica.com"></script>
Markdown
[![AgentReady.md score for cartadinamica.com](https://agentready.md/badge/cartadinamica.com.svg)](https://agentready.md/r/0360d605-0561-4fc7-b6ea-3ee15d7bca2b)

Coming soon: Full Domain Analysis

Crawl your entire domain, generate llms.txt, and monitor your AI-readiness score over time. Join the waitlist to be notified.

You're on the list! We'll notify you when it launches.