← all branches

content/auto-draft

blockedviewing older commit
2149391 · fullPR #252reviewed 2026-07-10 17:30 UTC8H · 6M · 7L · 5I
The branch
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
The changes (whole branch)
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+4310apps/web/content/calendar.yml+11apps/web/src/app/sitemap.ts+10
Blast
3 files, +433/-1. Marketing website only; no backend or domain-logic changes.
draft-content public-api-surface seo-critical-page no-backend-changes
ci-checks· gh pr checks scope unavailable (personal access token)coderabbit· no .coderabbit.yaml in repo

Findings · 25

correctness8

high

/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.

high

/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.

high

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.

medium

SoftwareApplication schema: Offer missing price/priceCurrency

apps/web/src/app/(marketing)/developers/page.tsx:161

Bare Offer disqualifies schema from Google rich-result eligibility.

medium

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.

low

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).

info

/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.

info

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

low

data-todo attributes ship in production HTML

apps/web/src/app/(marketing)/developers/page.tsx:226

Reveals internal design workflow state in source.

info

No CSP headers in next.config.ts (pre-existing)

apps/web/next.config.ts

Pre-existing gap across the marketing site, not introduced here.

info

JsonLd dangerouslySetInnerHTML safe as implemented

apps/web/src/components/JsonLd.tsx

All values are hardcoded constants. Document invariant for future callers.

conventions2

medium

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'.

low

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

high

/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.

high

/developers missing from e2e/web/marketing.spec.ts smoke ROUTES

e2e/web/marketing.spec.ts:13

Same deferred comment. Add to catch routing regressions.

medium

No CI guard for 'TODO' placeholder strings in rendered content

scripts/seo-assert.mjs

A one-liner check would catch draft-content leakage automatically.

low

/atlas also missing from marketing smoke ROUTES (pre-existing)

e2e/web/marketing.spec.ts:17

Good moment to add alongside /developers.

improvement8

high

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.

high

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.

high

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.

medium

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.

medium

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.

low

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.

low

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.

low

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

  1. c27ea57needs attentionincremental3H · 5M · 4L2026-08-04 17:46
  2. ff69645needs attentionincremental0H · 6M · 8L2026-07-28 18:21
  3. 0257d74safeincremental0H · 0M · 0L2026-07-20 23:00
  4. 0795a9dsafeincremental0H · 0M · 2L2026-07-20 22:42
  5. 5c57414needs attentionincremental2H · 7M · 10L2026-07-20 22:29
  6. 5a57a8fneeds attentionincremental0H · 5M · 8L2026-07-20 17:14
  7. cc9056eneeds attentionfull1H · 3M · 9L2026-07-20 16:40
  8. 8b79d33needs attentionincremental5H · 7M · 11L2026-07-14 18:10
  9. f0c337cneeds attentionincremental1H · 1M · 5L2026-07-14 17:15
  10. 5c9de97needs attentionincremental0H · 5M · 7L2026-07-14 17:02
  11. 92cce08needs attentionincremental1H · 4M · 3L2026-07-14 02:00
  12. b7dd610needs attentionincremental0H · 6M · 7L2026-07-14 01:43
  13. 8c43554needs attentionfull0H · 2M · 1L2026-07-14 01:15
  14. 2149391blockedfull8H · 6M · 7L2026-07-10 17:30current