Listing pages with real data and the anti-fabrication check
A catalog of products, courses, or services becomes one page per item: the listing page. Built in bulk, with template text, it is the thin page that doesn't get indexed. Built from each item's real page, with an AI that only extracts and a check that discards whatever it made up, it becomes content only you have.
1Why 283 template-based listing pages didn't get indexed
2The extractive prompt: copy from the source, don't create
3The check: title, words, and numbers verified against the source
4Publish a little at a time, and only what passed
Goal: generate catalog listing pages extracted from each item's real page and discard any item that fails the anti-fabrication check.
01 · From the real page to the published listing page
Tap each block.
Click each block in the diagram to see what it does.
The AI rewrites and organizes; the check makes sure it did not make up facts.
02 · The case and the fix
Tap each step.
1. The batch
INEMA published 283 course listing pages in a single commit. Of the 6 listing pages in the sample, 5 were "discovered, not indexed" and had never been crawled.
2. The diagnosis
Each listing page had 170 to 240 words, and two randomly picked listing pages shared 47% of their vocabulary.
The FAQ was identical on all of them, and the description was copied from the course page.
3. The extraction
The syllabus is now extracted from each course's real page, with the check discarding anything that was not in the source.
40 listing pages were extracted and validated for US$ 0.031, in one run with an authorized API; the following batches moved to Codex through the subscription.
4. The pace
Enriched listing pages went from 40 to 50, 76 and 98 (10/05/2026), among 310 listing pages live. In batches, not all at once.
03 · The extractive prompt and the check
Replace "course" with your own type of item. Run the check on every sentence and title.
prompt-ficha-extrativa.md (inemaSEO templates)
You extract a course's syllabus from the TEXT OF ITS PAGE. Rules:
- EXTRACTIVE: copy module/track titles exactly as they appear (you may remove emoji). "Audience", "learns" and "builds" phrases
must reuse the words on the page; do not invent anything.
- Do not include price, free access, promotions, testimonials or student counts.
- If a field is not on the page, use [] or null.
Answer ONLY JSON: {"estrutura":[{"titulo":"","detalhe":""}],"aprende":[""],"publico":[""],
"constroi":[""],"pre_requisitos":[""],"carga_horaria":null,"nivel":null}
Limits: estrutura up to 12 items — only tracks/modules/lessons of the content, never sections of the page
("Who it's for", "FAQ", "Start now").
Run the check (validar_extracao.mjs)
git clone https://github.com/inematds/inemaseo-metodo.git
cd inemaseo-metodo
# fonte.txt = text of the item's actual page
node tools/validar_extracao.mjs fonte.txt "Hydration and folds"
node tools/validar_extracao.mjs fonte.txt "Natural-fermentation bread course with 12 lessons"
fonte.txt used in the example
Natural-fermentation bread course
Module 1: The levain from scratch
Module 2: Hydration and folds
Module 3: Home oven
Workload: 6 lessons of 20 minutes each.
For people who already bake bread with regular yeast and want to switch to levain.
Example from the repository
$ node tools/validar_extracao.mjs fonte.txt "Hydration and folds"
{ apoiada: true, numerosNaFonte: true, tituloNaFonte: true }
$ node tools/validar_extracao.mjs fonte.txt "Natural-fermentation bread course with 12 lessons"
{ apoiada: true, numerosNaFonte: false, tituloNaFonte: false }
$ node tools/validar_extracao.mjs fonte.txt "Learn how to sell your breads on Instagram"
{ apoiada: false, numerosNaFonte: true, tituloNaFonte: false }
First: module title copied from the source. Passes all three.
Second: the source says 6 lessons; the "12" was made up. Rejected because of the number.
Third: "selling on Instagram" is not on the page. Rejected because it does not reuse the source's words.
A rejected item is discarded, not fixed by hand to pass.
04 · Practice: three real listing pages
Pick 3 items from your catalog that have their own page with text.
E1 · Extract three listing pages
40 min
Save each item's page text to a file and run the extractive prompt with the agent from your subscription.
Done when: you have 3 JSON files in the prompt's format, with no price, testimonials or customer counts.
E2 · Run them through the check
30 min
Run validar_extracao.mjs on each title and sentence from the 3 listing pages. Discard whatever fails.
Done when: a note lists each item with its check result, the rejected ones are out, and only listing pages with 3 or more valid modules were marked to publish.
05 · Test what you learned
The explanation shows up after your answer.
Question 1 of 4
The check rejected a sentence because the number is not in the source. What should you do?skill
Correct
An item that fails is discarded, not patched up. A smaller listing page beats a lying one.