No-write payload and mapping preview
SEO_BLOG_PUBLISH_TOKEN='<tenant-token>' \
SEO_BLOG_SITE_SLUG='<slug>' \
WEBHOOK_URL='<webhook-url>' \
WEBHOOK_TOKEN='<webhook-token>' \
WEBHOOK_SECRET='<webhook-secret>' \
SEO_BLOG_SITE_ORIGIN='<origin>' \
npx --yes @wotaso/seo-blog-admin-cli publish-cms --cms webhook --site-slug '<slug>' --site-origin '<origin>' --dry-run
For a currently due approved post, --dry-run builds the destination payload without writing to the provider. It does not contact the provider or prove credentials, remote schema compatibility, deployment, or a live page; when no post is due, provider inputs are not exercised.
Scheduled runner health heartbeat
SEO_BLOG_PUBLISH_TOKEN='<tenant-token>' \
SEO_BLOG_SITE_SLUG='<slug>' \
WEBHOOK_URL='<webhook-url>' \
WEBHOOK_TOKEN='<webhook-token>' \
WEBHOOK_SECRET='<webhook-secret>' \
SEO_BLOG_SITE_ORIGIN='<origin>' \
SEO_BLOG_SCHEDULED='true' \
npx --yes @wotaso/seo-blog-admin-cli health --config seo-blog.config.json --mode webhook --site-slug '<slug>' --site-origin '<origin>'
Run this from the real scheduled runner after seo-blog.config.json contains the selected connector configuration and the listed secrets are loaded. It reports configuration readiness, not a live article. The dashboard expires readiness at the returned deadline, with a 36-hour fallback when no deadline is available.
Fields and data model
- Payload includes the original approved post and normalized content
- The status field distinguishes draft and publish intent
- Response may return id or postId and publishedUrl or url
Canonical and route
The tenant endpoint is responsible for durable storage, idempotent updates, rendering, canonical markup, sitemap changes, deployment, and URL verification. SEODrafts records the URL it returns.
Known limits
- The receiving endpoint and its data contract are operated by the tenant.
- A 2xx response without a durable URL is not proof that a public page is live.
- Retries require an idempotent upsert keyed by the stable post ID or slug.
Recovery
- Validate the payload and signature against a staging endpoint first.
- Log request IDs and validation errors without logging tokens or shared secrets.
- Return a deterministic publishedUrl after the destination has accepted the upsert.