Prazo Certo — Check for a New Blog Post
Purpose
Answers the question "Tem um blogpost novo no site do Mário?" — is there a new blog post on Prazo Certo (prazocerto.me), Mário Lúcio's site? This is a read-only skill that returns the newest post's title, publish date, author, and URL, plus a simple has_new_post recency judgement. The fast, reliable path is the site's open WordPress REST API, which returns posts already sorted newest-first as JSON — no scraping, no browser, no anti-bot friction.
When to Use
- A user asks whether Mário / Prazo Certo published anything new, or wants "the latest post."
- You need the newest post's title / date / link to summarize, share, or monitor.
- You want to poll for new content on a schedule (compare the newest
idordateagainst a stored value). - You need the last N posts (change
per_page), not just the single newest one.
Workflow
The recommended method is the WordPress REST API. prazocerto.me is a WordPress site (LiteSpeed + Cloudflare) that exposes the standard wp-json API publicly, discoverable via the Link: <https://prazocerto.me/wp-json/>; rel="https://api.w.org/" header on any page.
- GET the newest post(s) as JSON. Request only the fields you need with
_fields:GET https://prazocerto.me/wp-json/wp/v2/posts?per_page=1&orderby=date&_fields=id,date,modified,slug,link,title- The response is a JSON array already sorted newest-first (
orderby=dateis the default; kept explicit for clarity). Element[0]is the newest post. - Increase
per_page(max 100) to pull a list; theX-WP-Total/X-WP-TotalPagesresponse headers tell you the full post count (~31 posts / 11 pages of 3 at time of authoring). - This endpoint returns HTTP 200 from datacenter IPs — it does not require residential proxies or stealth. (
browse cloud fetch <url>works with or without--proxies.)
- The response is a JSON array already sorted newest-first (
- Read the fields from element
[0]:title.rendered→ post title (HTML-entity encoded; decode if displaying).date→ publish datetime, site-local (America/Sao_Paulo), e.g.2026-07-25T21:17:27. Take the date part forpublished_date.link→ canonical post URL (note: posts live at the site root, e.g./projetos-praticos/, not under/blog/).modified→ last-edited datetime (useful to distinguish "new post" from "edited old post").
- Judge recency. Compute
days_since_published = today − date. Treathas_new_post: truewhen the newest post is within ~30 days. (Adjust the window to the caller's definition of "new"; document the assumption.) - Author. All posts are authored by Mário Lúcio (the site owner). If you need it programmatically, add
authorto_fieldsand resolve via/wp-json/wp/v2/users/<id>, or read thePor Mário Lúciobyline on the post page.
Assumption made when the caller doesn't specify: "new" = published within the last 30 days. State this in your answer.
Browser fallback
Only needed if the REST API is ever disabled. The rendered pages sit behind Cloudflare, so a plain headless hit may be challenged — use a stealth session (--verified --proxies).
browse open https://prazocerto.me/blog/ --remote(verified + proxies session).browse wait load, then dismiss the "Gerenciar Consentimento de Cookies" modal (click "Aceitar cookies") — it overlays content on first load.- The blog index lists posts newest-first; the first card's title +
DD/MM/YYYYbyline is the newest post. Open it for the full byline (Mário Lúcio / 25/07/2026 / N comentários). - Do not log in, comment, or submit the contact form. Read-only.
Site-Specific Gotchas
- Open WP REST API is the whole game.
https://prazocerto.me/wp-json/wp/v2/postsis public, unauthenticated, and returns clean JSON newest-first. Prefer it over scraping the HTML in every case. - Posts are NOT under
/blog/. The blog index is/blog/(paginated:/blog/page/2/…), but individual posts live at the site root, e.g.https://prazocerto.me/projetos-praticos/. Use thelinkfield from the API rather than constructing URLs. orderby=date≠orderby=modified. Default ordering is by publish date. An old post that was recently edited will still sort as old — checkmodifiedif "recently touched" matters more than "newly published."title.renderedis HTML-entity encoded (e.g.–, accented chars as UTF-8). Decode before display.- Dates are site-local (America/São Paulo) with no timezone suffix. Don't assume UTC when computing
days_since_published. - Cloudflare only bites the rendered HTML, not the API. The API returned 200 from a bare datacenter fetch across multiple runs. The
/blog/and post pages are Cloudflare-fronted; drive them with--verified --proxiesif you must, and expect a cookie-consent modal. robots.txtexplicitly welcomes AI crawlers (GPTBot, ClaudeBot, PerplexityBot, etc. allAllow: /) and only blocks/admin/,/wp-admin/,/private/. Reading posts is fully sanctioned.sitemap.xmllists only static pages (/sobre,/portfolio,/blog/,/contato/,/mentorias, …) — not individual posts, and itslastmodvalues are stale (2025-01-01). Do not use the sitemap to find the newest post; use the API.- Recency window is a judgement call. The API gives you facts (title/date); "new" is subjective. At time of authoring, the newest post was 2026-07-25 (7 days before the 2026-08-01 check) → considered new.
Expected Output
New post found (recent) — the normal case:
{
"success": true,
"has_new_post": true,
"latest_post": {
"title": "A teoria é incrível, mas aplique isso em projetos práticos",
"author": "Mário Lúcio",
"published_date": "2026-07-25",
"modified_date": "2026-07-25",
"url": "https://prazocerto.me/projetos-praticos/",
"days_since_published": 7
},
"total_posts": 31,
"checked_at": "2026-08-01",
"error_reasoning": null
}
No recent post (newest exists but is older than the recency window):
{
"success": true,
"has_new_post": false,
"latest_post": {
"title": "Nem todas as experiências são individuais",
"author": "Mário Lúcio",
"published_date": "2026-06-09",
"url": "https://prazocerto.me/nem-todas-as-experiencias-sao-individuais/",
"days_since_published": 53
},
"total_posts": 31,
"checked_at": "2026-08-01",
"error_reasoning": null
}
Failure (API unreachable and browser fallback blocked):
{
"success": false,
"has_new_post": null,
"latest_post": null,
"checked_at": "2026-08-01",
"error_reasoning": "wp-json returned 403 and /blog/ hit a Cloudflare challenge that did not resolve"
}