Marketplace Moderation Triage: API Gateway Caching, Batch Cost, Node.js, US/EU A developer detailed a Node.js marketplace moderation pipeline that compares OpenAI-, Claude-, and Gemini-compatible API gateways by the cost per accepted moderation classification rather than token price alone. The design preserves an auditable human-review queue, using a TypeScript evidence envelope to validate, cache, and replay results, ensuring the model only sorts work and never makes enforcement decisions. Short answer: compare an OpenAI-, Claude-, and Gemini-compatible API gateway by the cost of each accepted moderation classification, not cost per token alone. For a Node.js marketplace spanning the US and EU, preserve an auditable human-review queue first, then test caching and batch work through a narrow TypeScript evidence envelope; reject any result you can't trace, validate, or replay. For a marketplace, the flow is small enough to reason about. A report enters with a region, policy version, locale, and free-text reason. The application creates a stable cache key, asks an adapter for one constrained classification, validates the result, records usage, and sends the original report plus the classification to a human queue. The model sorts work; it doesn't make the enforcement decision. This changes the comparison. OpenAI-, Claude-, and Gemini-compatible APIs may give you a familiar request shape, but a familiar shape isn't evidence that streaming, usage fields, caching, batch execution, or regional handling behave alike. Test the evidence your review queue depends on. The runnable core below deliberately has no commercial endpoint. Each candidate adapter supplies the transport, while the marketplace code owns the input contract, validation, cache identity, and accounting. The evidence row travels with a report into the human queue. That boundary makes a later provider change observable: the application still sees the same labels, the reviewer still sees the original report, and operators still have a request ID and normalized usage record to investigate. js import { createHash } from "node:crypto"; type Region = "US" | "EU"; type Label = "fraud" | "harassment" | "prohibited item" | "other"; type Report = { id: string; region: Region; locale: string; text: string; policyVersion: string; }; type Usage = { inputTokens: number; outputTokens: number; cachedInputTokens: number }; type Classification = { label: Label; rationale: string }; type GatewayResult = { value: unknown; usage: Usage; requestId: string }; type GatewayCall = prompt: string, region: Region = Promise