Authentication
All write and admin endpoints require a Bearer token in the Authorization header. Contact the Taciturn Studios admin to receive your TSPASS_API_KEY.
Every sister site has its own dedicated endpoint aliases. Replace :siteName with the site name (without .com):
arborsagecovercrushingmyauthorvoicepublishingtimeshighfeardecorpalmhomevibedluxbrooklifestyleattractweirdburrialstoriesHealth & Discovery
Public endpoints — no authentication required.
/api/pingPublicHealth check. Returns server status, API version, full network manifest (all 10 sister sites), and all available endpoint paths.
Response
{ "status": "ok", "site": "taciturnstudios.com", "apiVersion": "2.0", "network": { "arborsage.com": { ... }, ... }, "endpoints": { ... } }/api/tspass/sourceSitesPublicLists all source sites that have synced books to taciturnstudios.com, with book counts per site.
Response
{ "success": true, "count": 3, "sites": [{ "site": "arborsage.com", "displayName": "ArborSage", "bookCount": 14 }] }Product Sync (Write)
Upsert and delete products. All endpoints require Bearer token auth.
/api/sync/productsAuth requiredBulk upsert up to 200 books in a single request. Books are matched by slug — existing books are updated, new ones are created.
Request body / params
{ "books": [{ "slug": "my-book", "title": "My Book", "sourceSite": "arborsage.com", "price": "9.99", "coverImageUrl": "https://...", "description": "..." }] }Response
{ "success": true, "total": 5, "created": 3, "updated": 2, "failed": 0, "results": [...] }POST /api/sync/arborsage/products ← per-site alias
/api/sync/productAuth requiredUpsert a single book. Returns 201 on create, 200 on update.
Request body / params
{ "slug": "my-book", "title": "My Book", "sourceSite": "arborsage.com", "price": "9.99", "category": "gardening", "tags": ["organic", "raised-beds"] }Response
{ "success": true, "action": "created", "slug": "my-book", "id": 42 }/api/products/:slugAuth requiredDelete a book by its slug. Returns 404 if not found.
Response
{ "success": true, "slug": "my-book", "id": 42, "message": "Book "My Book" deleted." }Product Retrieval
Read products. Auth required.
/api/productsAuth requiredList all books. Filter by source site, featured status, with pagination.
Request body / params
Query params: ?sourceSite=arborsage.com&featured=true&limit=50&offset=0Response
{ "success": true, "count": 14, "sourceSite": "arborsage.com", "books": [...] }GET /api/products/arborsage ← per-site alias (no query param needed)
Network Management
Admin-only endpoints for monitoring and configuring the sister site network.
/api/network/statusAuth requiredLive-pings all 10 sister sites and returns their HTTP status, response time, and last known webhook config. Takes ~6s to complete.
Response
{ "success": true, "checkedAt": "...", "sites": [{ "domain": "arborsage.com", "status": "ok", "ms": 312, "httpStatus": 200 }] }/api/network/syncEventsAuth requiredReturns the most recent sync events (default 50, max 200). Filter by site with ?sourceSite=arborsage.com.
Response
{ "success": true, "count": 50, "events": [{ "sourceSite": "arborsage.com", "eventType": "batch_sync", "itemCount": 5, "status": "success", "createdAt": "..." }] }/api/network/webhookConfigsAuth requiredReturns webhook configuration for all sister sites — URL, active status, ping history.
Response
{ "success": true, "count": 10, "configs": [...] }/api/network/webhookConfigs/:siteDomainAuth requiredUpdate the webhook callback URL and/or secret for a specific sister site.
Request body / params
{ "webhookUrl": "https://arborsage.com/api/tspass/webhook", "webhookSecret": "optional-secret", "isActive": true }Response
{ "success": true, "siteDomain": "arborsage.com", "updated": { "webhookUrl": "..." } }Book Object Fields
All fields accepted by the upsert endpoints. Only slug and title are required.
| Field | Type | Required | Notes |
|---|---|---|---|
| slug | string | required | Unique identifier. Used for upsert matching. |
| title | string | required | |
| sourceSite | string | optional | e.g. arborsage.com. Used for filtering. |
| authorName | string | optional | Defaults to Taciturn Studios. |
| description | string | optional | Full description. |
| shortDescription | string | optional | Used in cards/previews. |
| price | string|number | optional | e.g. 9.99 or "9.99" |
| salePrice | string|number | optional | |
| coverImageUrl | string | optional | CDN URL for cover image. |
| downloadUrl | string | optional | Direct download link. |
| amazonUrl | string | optional | Amazon product page URL. |
| category | enum | optional | fiction | non-fiction | children | series | gardening | wellness | author-tools | puzzle | other |
| tags | string[] | optional | Array or comma-separated string. |
| isFeatured | boolean | optional | |
| isFree | boolean | optional | |
| isPublished | boolean | optional | Defaults to true. |
When a book is updated, featured, or deleted on taciturnstudios.com, it will POST a callback to your site's registered webhook URL. Implement this receiver to stay in sync automatically.
1. Register your webhook URL
Contact the Taciturn Studios admin or use the Admin → Network tab to register your callback URL. Expected format:
2. Webhook payload format
{
"event": "book.updated" | "book.featured" | "book.deleted" | "sync.complete",
"sourceSite": "taciturnstudios.com",
"timestamp": 1710000000000,
"data": {
"slug": "the-indie-authors-guide",
"title": "The Indie Author's Guide",
"coverImageUrl": "https://cdn.../cover.jpg",
"isFeatured": true
}
}3. Express.js receiver (copy-paste ready)
// server/tspassWebhookReceiver.ts
import { Request, Response } from "express";
const TSPASS_API_KEY = process.env.TSPASS_API_KEY ?? "";
export async function handleTspassWebhook(req: Request, res: Response) {
// 1. Verify the API key
const token = (req.headers["authorization"] ?? "").replace("Bearer ", "").trim();
if (!token || token !== TSPASS_API_KEY) {
return res.status(401).json({ error: "Unauthorized" });
}
const { event, sourceSite, timestamp, data } = req.body;
switch (event) {
case "book.updated":
case "book.featured":
// await db.upsertBook({ ...data, sourceSite });
console.log("[TSPASS] Book updated:", data.slug);
break;
case "book.deleted":
// await db.deleteBookBySlug(data.slug);
console.log("[TSPASS] Book deleted:", data.slug);
break;
case "sync.complete":
console.log("[TSPASS] Full sync complete from", sourceSite);
break;
}
return res.json({ received: true, event, timestamp });
}
// Register in Express:
// app.post("/api/tspass/webhook", express.json(), handleTspassWebhook);Security note
Always verify the Authorization: Bearer TSPASS_API_KEY header before processing any payload. Never trust the sourceSite field alone.
Drop tskit into any Manus sister site to instantly configure TSPASS, tacblock, auto-blog, newsletter, AdSense, and lmtxt. One installer script handles everything.
TSPASS Sender
Push products to hub
Webhook Receiver
Receive push events
Auto-Blog
Weekly AI articles
Newsletter
Welcome + teaser emails
lmtxt Routes
Dynamic llms.txt + sitemap
tacblock
Network banner + sister sites
Quick install
What's included
- •
server/tspassSender.ts— push products to taciturnstudios.com - •
server/tspassWebhookReceiver.ts— receive hub push events - •
server/tskitAutoBlog.ts— weekly AI article generator with topic queue - •
server/tskitNewsletter.ts— welcome email + newsletter teaser via Resend - •
server/tskitLmtxt.ts— dynamic /llms.txt, /llms-full.txt, /sitemap.xml - •
client/src/components/NetworkBanner.tsx— scrolling network carousel - •
client/src/components/SisterSites.tsx— editorial sister sites section - •
client/src/components/AdSenseBlock.tsx— AdSense block (pub-1051825252184436) - •
client/src/components/NewsletterWidget.tsx— newsletter signup widget - •
scripts/install.mjs— universal installer with auto-patching
Taciturn Studios TSPASS API v2.0 · Questions? Contact us
