content/auto-draft
blockedviewing older commit2149391 · fullPR #252reviewed 2026-07-10 17:30 UTC8H · 6M · 7L · 5I- Purpose
- Auto-draft marketing content for the /developers API landing page, targeting the priority-1 keyword 'API CFE' (transactional intent)
- Goal
- Ship the /developers transactional landing page for the Batu public API to capture developer integrator intent
- Sub-goals
- SG-1: Add /developers marketing page with SEO metadata, JSON-LD schemas, endpoint table, code samples, FAQ, CTAs
- SG-2: Promote api-cfe calendar entry from idea to review
- SG-3: Register /developers in sitemap.ts at priority 0.9
- What
- New 431-line /developers marketing page with 3 JSON-LD schemas, endpoint table (3 endpoints), curl/JS/Python samples, FAQ (4 items), who-it's-for section, and dual CTAs (/acceso, /demo). Calendar.yml promoted api-cfe status. Sitemap updated.
- Why
- Batu's public API for CFE data is a key differentiator. This page captures the priority-1 'API CFE' transactional keyword to convert developers and integrators seeking CFE data access.
- Areas
- apps/web/src/app/(marketing)/developers/page.tsx+431−0apps/web/content/calendar.yml+1−1apps/web/src/app/sitemap.ts+1−0
- Blast
- 3 files, +433/-1. Marketing website only; no backend or domain-logic changes.
Findings · 25
correctness8
/api/v1/bills/aggregates is NOT in the public v1 contract
apps/web/src/app/(marketing)/developers/page.tsx:79
Public v1 defines only GET /bills and GET /bills/:id. Advertising a non-existent endpoint will generate 404s.
/api/v1/catalog/tariff-mappings is NOT in the public v1 contract
apps/web/src/app/(marketing)/developers/page.tsx:87
Path exists only in catalog-internal.contract.ts, not in the bearer-exposed public v1 surface.
TODO strings in FAQ render user-visible text AND enter FAQPage JSON-LD
apps/web/src/app/(marketing)/developers/page.tsx:136
Two FAQ answers contain literal 'TODO' visible to users and indexed by search engines via JSON-LD.
SoftwareApplication schema: Offer missing price/priceCurrency
apps/web/src/app/(marketing)/developers/page.tsx:161
Bare Offer disqualifies schema from Google rich-result eligibility.
Code samples don't explain org-scoping constraint
apps/web/src/app/(marketing)/developers/page.tsx:99
Querying an RPU from a different org returns empty list with no error.
Sitemap: /developers listed after /atlas despite higher priority
apps/web/src/app/sitemap.ts:14
Advisory only; priority 0.9 (/developers) appears after 0.85 (/atlas).
/blog/como-leer-recibo-cfe exists and is published — no 404 risk
apps/web/src/app/(marketing)/developers/page.tsx:360
draft:false confirmed in MDX.
SEO metadata dimensions within spec
apps/web/src/app/(marketing)/developers/page.tsx:38
title 57 chars, description 155 chars, canonical root-relative, single h1. All pass.
security3
data-todo attributes ship in production HTML
apps/web/src/app/(marketing)/developers/page.tsx:226
Reveals internal design workflow state in source.
No CSP headers in next.config.ts (pre-existing)
apps/web/next.config.ts
Pre-existing gap across the marketing site, not introduced here.
JsonLd dangerouslySetInnerHTML safe as implemented
apps/web/src/components/JsonLd.tsx
All values are hardcoded constants. Document invariant for future callers.
conventions2
calendar.yml title and page <title> are inconsistent
apps/web/content/calendar.yml:28
Calendar: 'API para descargar recibos de CFE | Batu'; page: 'API CFE: descarga recibos y datos de consumo | Batu'.
Hardcoded hex colors in code-block styling
apps/web/src/app/(marketing)/developers/page.tsx:300
bg-[#0b0e14] and text-[#e6e6ef] — prefer CSS custom properties or Tailwind tokens.
tests4
/developers missing from seo-assert.mjs ROUTES — SEO CI gap
scripts/seo-assert.mjs:11
Deferred comment says 'add when API landing ships'. This is that moment.
/developers missing from e2e/web/marketing.spec.ts smoke ROUTES
e2e/web/marketing.spec.ts:13
Same deferred comment. Add to catch routing regressions.
No CI guard for 'TODO' placeholder strings in rendered content
scripts/seo-assert.mjs
A one-liner check would catch draft-content leakage automatically.
/atlas also missing from marketing smoke ROUTES (pre-existing)
e2e/web/marketing.spec.ts:17
Good moment to add alongside /developers.
improvement8
Python code sample: BATU_API_KEY is undefined — NameError on copy-paste
apps/web/src/app/(marketing)/developers/page.tsx:119
Missing import os and variable assignment. JS sample is correct; Python is not.
Two design placeholder divs render user-visible draft text to crawlers
apps/web/src/app/(marketing)/developers/page.tsx:232
'pendiente de diseño' text will be indexed by Google as page content, signalling an unfinished page.
llms.txt missing /developers URL — GEO gap for AI answer engines
apps/web/public/llms.txt
CLAUDE.md template explicitly lists this URL under Páginas clave; actual file omits it.
SoftwareApplication: consider @type WebAPI for sharper signal
apps/web/src/app/(marketing)/developers/page.tsx:154
schema.org WebAPI type is more precise for API query intent.
No trust signal or social proof on a transactional landing
apps/web/src/app/(marketing)/developers/page.tsx
EPCs/comercializadores need confidence before requesting API access.
GEO: split auth FAQ into standalone Q for AI extractability
apps/web/src/app/(marketing)/developers/page.tsx:139
Mixed auth+rate-limits+pricing answer is hard for AI engines to extract.
Endpoints table footnote 'rutas ilustrativas' undersells accuracy
apps/web/src/app/(marketing)/developers/page.tsx:257
Paths are confirmed against v1 contract; calling them 'ilustrativas' implies instability.
No pricing/credits anchor in FAQ
apps/web/src/app/(marketing)/developers/page.tsx:140
Even 'starts at pay-as-you-go credits' reduces CTA friction without inventing numbers.
History · 14 commits
- c27ea57needs attentionincremental3H · 5M · 4L2026-08-04 17:46
- ff69645needs attentionincremental0H · 6M · 8L2026-07-28 18:21
- 0257d74safeincremental0H · 0M · 0L2026-07-20 23:00
- 0795a9dsafeincremental0H · 0M · 2L2026-07-20 22:42
- 5c57414needs attentionincremental2H · 7M · 10L2026-07-20 22:29
- 5a57a8fneeds attentionincremental0H · 5M · 8L2026-07-20 17:14
- cc9056eneeds attentionfull1H · 3M · 9L2026-07-20 16:40
- 8b79d33needs attentionincremental5H · 7M · 11L2026-07-14 18:10
- f0c337cneeds attentionincremental1H · 1M · 5L2026-07-14 17:15
- 5c9de97needs attentionincremental0H · 5M · 7L2026-07-14 17:02
- 92cce08needs attentionincremental1H · 4M · 3L2026-07-14 02:00
- b7dd610needs attentionincremental0H · 6M · 7L2026-07-14 01:43
- 8c43554needs attentionfull0H · 2M · 1L2026-07-14 01:15
- 2149391blockedfull8H · 6M · 7L2026-07-10 17:30current