The Trinity Beast – Translation Service

Technical Documents Translated Perfectly — Code, Diagrams & All

"We use Amazon Bedrock to do what generic translation services can't."

Status: Production Version: v2.0 May 26, 2026

1. Service Overview

1.1 The Problem We Solved

Technical documentation is hard to translate. Generic translation services — including AWS Translate — don't understand the boundary between human language and machine language. They translate code blocks, corrupt variable names, localize version numbers, and hallucinate brand names.

We learned this the hard way. AWS Translate cost us over $800 in worthless translations before we caught it corrupting technical content across 11 languages. Silent failures. No warnings. No way to know without reading every translated document.

Real failure modes we caught:

  • function getName()función obtenerNombre() (code no longer executes)
  • PostgreSQL 17.7PostgreSQL (version number dropped)
  • Brand names hallucinated or substituted with unrelated terms
  • 32 GB32 Go (unit localized in French)
  • AutoOps → آٹو آپس (brand name transliterated to Urdu phonetic)

So we built our own translation engine. It uses Amazon Bedrock with sentinel preprocessing and multi-layer validation. You choose the AI agent — from fast and affordable to the highest quality available. The agent never sees protected content — it can't corrupt what it never touches. Every translation is validated before it ships.

1.2 Choose Your Agent

Three AI agents. Same protection. Your choice.

Every translation job lets you pick the agent that fits your needs. Same sentinel protection, same validation pipeline, same quality guarantees — the difference is the depth of linguistic reasoning applied to your human-readable text.

Default agent: If no agent is specified in the request, the engine uses Claude Sonnet 4.6 — the balanced choice that handles all languages and document types well. You only need to specify an agent if you want to override this default.

AgentModelSpeedStrengthsCost/Chunk
Haiku 3.5 Claude Haiku 3.5 Fast High-volume batch jobs, Latin-script languages, frequent re-translations where speed and cost efficiency are the priority $0.0334
Sonnet 4.6 DEFAULT Claude Sonnet 4.6 Moderate Complex scripts (Arabic, Hindi, Japanese, Chinese), nuanced technical content, balanced speed and linguistic depth. Used automatically when no agent is specified. $0.0427
Opus 4 Claude Opus 4 Thorough Critical documents (legal, medical, compliance), languages with complex grammar, maximum fidelity where precision justifies the investment $0.094

All three agents share the same protection: Sentinel preprocessing extracts code blocks, brand terms, version numbers, and technical identifiers before the agent sees your document. The validation pipeline checks every translation regardless of which agent produced it. The difference is the depth of linguistic reasoning — not the safety of your content.

1.3 The Pitch

AI translation that understands the difference between human language and machine language.

Your code blocks stay code. Your version numbers stay exact. Your brand names stay yours. Validated before delivery — not after you find the bug in production.

1.3.1 See It In Action

Want to see the quality? You're looking at it.

This entire website — cpmp-site.org — is available in 12 languages. Every page, every document, every piece of technical documentation was translated by the same engine we're offering you. That's 440 document-language pairs in production.

Switch languages in the header. Read the Document Library in Japanese. Check the API Reference in German. Browse the Infrastructure Specification in Arabic (RTL). Code blocks intact. Version numbers exact. Brand names preserved.

This isn't a demo. This is production proof at scale.

1.3 What We Translate

Document TypeSupportedNotes
HTML documentation✅ YesFull support including embedded code, diagrams, tables
Markdown files🔜 PlannedPhase 2 — convert to HTML, translate, convert back
Plain text✅ YesWrapped in minimal HTML for processing
JSON (i18n bundles)✅ YesKey-value translation with key preservation and inline HTML protection (links, styled elements)
PDF❌ NoNot planned — extract to HTML first

Supported languages (300+):

The translation engine supports any language that Claude can translate — over 300 languages and dialects. The table below shows our validated tier (languages tested in production with full sentinel and validator coverage). Any other language Claude supports can be requested — it will use the same engine with default settings.

CodeLanguageScriptDirectionRegion
Western European
esSpanishLatinLTRSpain, Latin America
ptPortugueseLatinLTRPortugal, Brazil
frFrenchLatinLTRFrance, Canada, Africa
deGermanLatinLTRGermany, Austria, Switzerland
itItalianLatinLTRItaly, Switzerland
nlDutchLatinLTRNetherlands, Belgium
Nordic & Eastern European
svSwedishLatinLTRSweden, Finland
plPolishLatinLTRPoland
ruRussianCyrillicLTRRussia, CIS
trTurkishLatinLTRTurkey
East Asian
jaJapaneseKanji/KanaLTRJapan
zhChinese (Simplified)HanziLTRChina, Singapore
koKoreanHangulLTRSouth Korea
South & Southeast Asian
hiHindiDevanagariLTRIndia
paPunjabiGurmukhiLTRIndia, Pakistan
thThaiThaiLTRThailand
viVietnameseLatinLTRVietnam
idIndonesianLatinLTRIndonesia
Middle Eastern (RTL)
arArabicArabicRTLMiddle East, North Africa
urUrduNastaliqRTLPakistan, India

300+ languages. Day one. No "coming soon." If Claude can translate it, we offer it. The 21 validated languages above have production-tested sentinel configurations and per-language chunk tuning. All other languages use intelligent defaults and the same validation pipeline.

Any-to-any translation: Source language is auto-detected — submit a Japanese document and translate it to Spanish without specifying the source. No pivot through English. The engine detects the source language in <10ms using Unicode script analysis and word frequency heuristics. Or specify source_lang explicitly if you prefer.

2. Pricing

2.1 Pricing Model

Simple, transparent, usage-based pricing. No monthly fees. No commitments. Pay only for what you translate — priced per token, per language.

Cost is determined by the actual token usage of your document's translatable content. Code blocks, diagrams, and protected elements are excluded from the token count — you only pay for what the AI agent actually translates. A 100 KB document that's 60% code blocks costs far less than a 100 KB document that's all prose.

Why token-based pricing is fairer: Token pricing directly reflects the work the AI performs. Documents with large code blocks, Mermaid diagrams, or technical identifiers have less translatable content — and cost proportionally less. You pay for linguistic reasoning, not for content the engine skips over.

Live Pricing (from Valkey — always current)

AgentInput Rate (per 1M tokens)Output Rate (per 1M tokens)Typical 50KB Doc (per lang)
Haiku 3.5$1.00$5.00~$0.03
Sonnet 4.6 (default)$3.00$15.00~$0.08
Opus 4$5.00$25.00~$0.05

Rates are stored in Valkey and reflect current Bedrock pricing. The GET /translate/models endpoint returns input_rate_per_1m, output_rate_per_1m, and estimated_cost_per_pair for each agent — use these to build real-time cost estimates in your integration.

Cost estimation before you commit: When you request a quote, the response includes estimated token counts and total cost based on document analysis. You see exactly what you'll pay before translation begins. A 30% service fee is added to the Bedrock cost — this funds the infrastructure and the mission.

2.2 Volume Discounts

Volume pricing is available for high-usage customers. Contact us for custom rates if you're translating more than 1,000 chunks per month.

2.3 Cost Comparison

How we compare to alternatives for a typical 50 KB technical document translated into 11 languages (Sonnet agent, ~6 chunks):

ServiceCostQualityTurnaround
Trinity Beast Translation (Sonnet)~$2.82Validated, code-safe~60 seconds
AWS Translate~$1.50Broken for technical docs~30 seconds
Google Cloud Translation~$1.80Similar issues to AWS~30 seconds
DeepL API~$2.20Better prose, still corrupts code~45 seconds
Human translation (budget)$2,000–4,000Variable quality2–3 weeks
Human translation (premium)$8,000–12,000High quality4–6 weeks

The value proposition: We cost slightly more than generic machine translation, but we actually work for technical content. You're not paying for translation — you're paying for translation that doesn't break your documentation. Code blocks intact. Version numbers exact. Brand names preserved. Validated before delivery.

2.5 Service Limits

Each quote and acceptance has a clear ceiling. The math is yours to manage — submit additional quotes for larger jobs, with no limit on how many quotes you can create.

LimitValueWhat It Means
Document size500 KBMaximum HTML source size per quote. Larger documents should be split.
Languages per quote12Choose any 12 from Claude's 300+ supported languages. 35 are validated with production-tested sentinel configurations.
Quotes per acceptance6A single batch acceptance can process up to 6 quotes — one consolidated Stripe charge, one consolidated email receipt.
Active jobs3The engine processes 3 jobs concurrently. Additional accepted quotes queue automatically and start as slots free up.
Queue depth12Maximum jobs waiting behind the active 3. Beyond this, the engine returns a temporary back-pressure response — try again in a few minutes.
Daily spend cap$600Engine-wide cost protection. Jobs are deferred when the cap is reached, resuming the next day.

The math: A single batch acceptance can therefore translate up to 6 documents into up to 12 languages each — 72 doc-language pairs in one transaction, with one consolidated receipt. Larger jobs split cleanly across multiple acceptances. These ceilings are sized to keep quality consistent and delivery fast; they will scale up as the service registers with OpenAPI directories and we expand capacity.

Email policy: One email per accepted batch — never one per quote when batched. Customers are not flooded with separate confirmations for each quote in a multi-quote acceptance. The receipt summarizes every job in the batch with cost-by-language details.

3. API Reference

3.1 Authentication

All API requests require authentication via API key. Include your key in the X-API-Key header:

curl -H "X-API-Key: your-api-key-here" \
     https://api.cpmp-site.org/translate/languages

API keys are managed through your Trinity Beast Account Dashboard. Create an account at cpmp-site.org/dashboard — translation-only customers are first-class citizens. If your email is also tied to a Price API subscription, you'll see those options too. The dashboard adapts to what you have.

Response Format — Unified Messaging Envelope (UME)

Every response — success or error — follows the Unified Messaging Envelope format. All 12 fields are always present. No exceptions.

{
  "status": "✅ [LPO] [us-east-2] [BeastMain] [/translate] [202]",
  "status_code": 202,
  "endpoint": "/translate",
  "cluster_node": "BeastMain",
  "region": "us-east-2",
  "language": "en",
  "api_key_id": "ak_demo123",
  "ip_address": "203.0.113.42",
  "agent_profile_arn": "arn:tbi:us-east-2:211998422884:agent-profile/tbi-dashboard/v1",
  "timestamp": "2026-05-18T22:30:00Z",
  "data": { ... },
  "error": ""
}

The language field reflects the customer's api_lang preference (set in Account Dashboard). Error messages are translated into that language. The envelope metadata (brackets, identifiers) stays English always.

Transparency: Every response tells you which container handled it (cluster_node), which region (region), and exactly when (timestamp). You always know where your request went and when it was processed.

3.2 Submit Translation Job

POST /translate

Request Body

{
  "source_url": "https://example.com/docs/api-reference.html",
  "source_lang": "auto",
  "target_langs": ["es", "ja", "zh"],
  "agent": "claude-sonnet-4.6",
  "protected_terms": ["MyProduct", "DataSync API"],
  "callback_url": "https://example.com/webhook/translate-done",
  "idempotency_key": "api-ref-2026-05"
}
FieldTypeRequiredDescription
source_urlstringYesURL to the source document (must be publicly accessible or a presigned S3 URL)
source_langstringNoSource language code. Default: "auto" (auto-detected via Unicode script analysis + word frequency heuristics). Supports 300+ languages as source.
target_langsarray | "all"YesArray of language codes, or "all" for all 21 validated languages (excluding source language). Any other language code Claude supports can also be specified.
agentstringNoAI agent to use. Options: "claude-haiku-3.5" (Good), "claude-sonnet-4.6" (Better), "claude-opus-4" (Best). Default: "claude-sonnet-4.6" — used when this field is omitted.
protected_termsarrayNoAdditional brand names or terms that must not be translated (added to global list for this job only)
callback_urlstringNoWebhook URL to POST when job completes
idempotency_keystringNoPrevents duplicate submissions (24h TTL)

Any-to-any translation: The engine translates directly between any two supported languages — no pivot through English. A Spanish document can be translated directly to Japanese, Arabic, or any other language. Claude handles this natively. Source language is auto-detected when not specified, so customers don't need to declare it unless they want to override the detection.

Response (202 Accepted)

Returns the standard UME envelope (see section 3.1) with this data payload:

"data": {
  "job_id": "019e3d489ea4-15d9082769939137",
  "job_status": "queued",
  "source_doc": "api-reference.html",
  "source_size_kb": 52,
  "target_langs": ["es", "ja", "zh"],
  "chunks": 6,
  "estimated_cost": "$0.77",
  "estimated_time_seconds": 180
}

Error Response (400 Bad Request)

The error field contains a localized message in the customer's api_lang:

"error": "🛑 [LPO] [us-east-2] [BeastMirror] [/translate] [400] El campo target_langs es obligatorio. Use \"all\" o un array como [\"es\", \"ja\"]"

3.3 Check Job Status

GET /translate/{job_id}

Response — Job In Progress

"data": {
  "job_id": "019e3d489ea4-15d9082769939137",
  "job_status": "translating",
  "source_doc": "api-reference.html",
  "progress": {
    "total_pairs": 3,
    "completed": 1,
    "failed": 0,
    "in_progress": 2
  },
  "started_at": "2026-05-18T22:30:00Z",
  "elapsed_seconds": 45
}

Response — Job Complete

"data": {
  "job_id": "019e3d489ea4-15d9082769939137",
  "job_status": "succeeded",
  "source_doc": "api-reference.html",
  "completed_at": "2026-05-18T22:33:07Z",
  "duration_seconds": 187,
  "pairs_succeeded": 3,
  "pairs_failed": 0,
  "chunks_per_lang": 6,
  "cost": "$0.77",
  "outputs": {
    "es": "https://api.cpmp-site.org/translate/download/019e3d489ea4/es/api-reference.html",
    "ja": "https://api.cpmp-site.org/translate/download/019e3d489ea4/ja/api-reference.html",
    "zh": "https://api.cpmp-site.org/translate/download/019e3d489ea4/zh/api-reference.html"
  }
}

Job statuses: queued → translating → deploying → succeeded | partial | failed

3.4 Cancel Job

DELETE /translate/{job_id}

Cancels a running job. Already-completed pairs are still available for download. You are not charged for cancelled pairs.

Response (200 OK)

"data": {
  "job_id": "019e3d489ea4-15d9082769939137",
  "job_status": "cancelled",
  "pairs_completed_before_cancel": 1,
  "pairs_cancelled": 2,
  "outputs": {
    "es": "https://api.cpmp-site.org/translate/download/019e3d489ea4/es/api-reference.html"
  }
}

Returns 409 Conflict if the job is already complete.

3.5 List Languages

GET /translate/languages (public, no auth required)

Response

Returns all supported languages with metadata:

"data": {
  "language_count": 21,
  "validated_languages": [
    {"code": "es", "name": "Spanish", "native_name": "Español", "script": "Latin", "direction": "ltr"},
    {"code": "ja", "name": "Japanese", "native_name": "日本語", "script": "Kanji/Kana", "direction": "ltr"},
    {"code": "ar", "name": "Arabic", "native_name": "العربية", "script": "Arabic", "direction": "rtl"}
  ],
  "additional_languages": "300+ supported via Claude — specify any valid language code",
  "pricing": {
    "model": "per-token",
    "see_endpoint": "/translate/models"
  },
  "limits": {
    "max_file_size_kb": 500,
    "max_languages_per_quote": 12,
    "max_quotes_per_acceptance": 6
  }
}

The 21 validated languages have production-tested sentinel configurations and per-language chunk tuning. Any other language Claude supports can be requested using its ISO 639-1 code — the engine applies intelligent defaults.

3.6 List Agents

GET /translate/models (public, no auth required)

Response

Returns the available AI agents with token-based pricing, speed, and quality metadata:

"data": {
  "models": [
    {
      "id": "claude-haiku-3.5",
      "name": "Claude Haiku 3.5",
      "tier": "Good",
      "input_rate_per_1m": 1.0,
      "output_rate_per_1m": 5.0,
      "estimated_cost_per_pair": 0.03,
      "speed": "fast",
      "quality": "good",
      "description": "Fast and affordable. Best for Latin-script languages and straightforward documents."
    },
    {
      "id": "claude-sonnet-4.6",
      "name": "Claude Sonnet 4.6",
      "tier": "Better",
      "input_rate_per_1m": 3.0,
      "output_rate_per_1m": 15.0,
      "estimated_cost_per_pair": 0.08,
      "speed": "moderate",
      "quality": "excellent",
      "description": "Balanced speed and quality. Handles complex scripts and technical documents well. Default choice."
    },
    {
      "id": "claude-opus-4",
      "name": "Claude Opus 4",
      "tier": "Best",
      "input_rate_per_1m": 5.0,
      "output_rate_per_1m": 25.0,
      "estimated_cost_per_pair": 0.05,
      "speed": "slow",
      "quality": "exceptional",
      "description": "Highest quality translations. Best for critical documents and complex grammar."
    }
  ],
  "default": "claude-sonnet-4.6",
  "pricing_note": "Rates are per 1M tokens. estimated_cost_per_pair is for a typical 50KB document (one language). Actual cost depends on document size and content density."
}

Use the id value in the agent field when submitting a translation job. If omitted, the engine uses claude-sonnet-4.6 automatically.

3.7 Check Usage

GET /translate/usage

Response

"data": {
  "period": "2026-05",
  "chunks_translated": 847,
  "chunks_failed": 12,
  "total_cost": "$36.17",
  "our_cost": "$36.17",
  "default_agent": "claude-sonnet-4.6",
  "jobs_submitted": 18,
  "jobs_succeeded": 15,
  "jobs_partial": 2,
  "jobs_failed": 1
}

Transparency: Notice the our_cost field. We show you what we paid Bedrock so you can see our margin. No hidden fees. No mystery pricing.

4. Architecture

4.1 Request Flow

The translation service is built on the same infrastructure that powers our internal documentation translation. It's battle-tested on 440 document-language pairs.

Diagram 4.1: Translation Request Flow

sequenceDiagram
    participant C as Customer
    participant L as LPO Server (Go)
    participant St as Stripe
    participant Q as SQS Queue
    participant SF as Step Function
    participant W as Worker (Bedrock)
    participant S3 as S3 (Output)

    C->>L: POST /translate (API key auth)
    L->>L: Validate + Analyze chunks
    L-->>C: Quote (chunks, cost, languages)
    C->>St: Pay quote (Stripe Checkout)
    St-->>L: Payment confirmed (webhook)
    L->>Q: Enqueue job
    L-->>C: 202 Accepted (job_id)
    Q->>SF: EventBridge Pipe triggers
    SF->>W: Parallel language tasks (×11)
    W->>S3: Write translated docs
    SF->>L: Update Aurora (job record)
    C->>L: GET /translate/:id
    L-->>C: Status + Download URLs
        

Key components:

4.2 Validator System

Every translated chunk passes through 5 validation checks before it's accepted:

ValidatorWhat It ChecksFailure Action
Protected TermsBrand names, product names survive unchangedRetry with stronger prompt
Version Numbers17.7, 4.6, v2.0 exact matchRetry with explicit instruction
URLs/IPs/ARNsTechnical identifiers unchangedRetry
Tag CountsHTML structure preserved — exact tag boundary scanning, no regexRetry up to 3×, then fail with diagnostic detail
Protected ZonesContent inside translate="no" zones unchanged — character scanning with exact attribute matchingRetry up to 3×, then fail with zone content
Sentinel RestorationAll placeholder tokens restored correctlyHard fail (data corruption)

The key insight: Bedrock makes the right kind of mistakes — visible and recoverable. The validators catch issues before output ships. AWS Translate's failures were silent and structural — you only found them by reading every translated document.

No regex in tag validation: The tag count and protected zone validators use character scanning with exact boundary matching. We control these tags — we know a tag starts with < and ends with >. No partial matches, no false positives from text content that happens to contain tag-like strings.

Diagnostic depth: When a translation fails validation, the system captures the exact model output, the sentinel-processed input, and which specific items failed. This enables rapid root-cause analysis — we can see exactly what the model produced and why it didn't pass. No guessing, no "try again and hope."

4.3 Output Storage

Translated documents are stored in S3 under your customer folder:

s3://trinity-beast-translations/
  {customer_id}/
    {job_id}/
      source.html           (original, for reference)
      es/document.html      (Spanish output)
      ja/document.html      (Japanese output)
      zh/document.html      (Chinese output)
      manifest.json         (job metadata)

Retention: 30 days. Download URLs are presigned and valid for 72 hours (3 days). You can re-request download URLs anytime within the 30-day window.

4.4 Source Validation & Document Analysis

Before any translation work begins, your document passes through a validation gate and structural analysis. This catches defects that would cause translation failures, and determines the optimal way to split your document for translation — rejecting early saves you money and prevents corrupted output.

What Gets Checked

If your document has repairable issues, they're fixed silently — you never know. If it has unrecoverable issues, you get an actionable rejection report with exact locations and fix suggestions. Zero Bedrock tokens burned on broken documents.

Customer Prescan (Opt-In)

For documents without translate="no" annotations, enable the customer prescan to auto-detect protected zones:

{
  "docs": ["my-technical-doc.html"],
  "langs": ["es", "ja", "de"],
  "options": {
    "customer_prescan": true
  }
}

The prescan identifies code blocks, inline code, technical identifiers, and brand terms in your document — then protects them automatically during translation. Your document doesn't need any special markup. The engine figures out what's code and what's prose.

Document Analysis & Chunk Planning

When you request a translation quote, the engine performs a structural analysis of your document — automatically determining the optimal way to split it for translation. This is done on your behalf; no preparation is required from you.

What the analysis does:

Why this matters for cost:

Translation is priced per token — the translatable content in your document determines the token count. The analysis ensures your document is split at natural boundaries — never mid-paragraph, never mid-table, never mid-code-block. Smarter splitting means better context for the AI agent, which means higher quality output. A 100 KB document with large code blocks has far fewer translatable tokens than a 100 KB prose document, because the engine recognizes that protected content doesn't consume translation tokens.

The chunk plan is included in your quote response:

{
  "quote_id": "019e4f...",
  "document": "my-api-docs.html",
  "analysis": {
    "total_size_kb": 98.4,
    "translatable_chunks": 6,
    "protected_ratio": 0.42,
    "estimated_translatable_content_kb": 57.1
  },
  "estimated_input_tokens": 36544,
  "estimated_output_tokens": 27773,
  "cost_per_language": 0.36,
  "languages": 11,
  "total_cost": 3.96
}

You see exactly how the engine will process your document before you commit. No surprises.

Any-to-Any Translation

Source language is auto-detected — no need to specify it. The engine uses Unicode script analysis and word frequency heuristics to identify the source language (300+ languages supported, <10ms, no API calls). Submit a Japanese document and translate it to Spanish without specifying source_lang. No pivot through English required.

{
  "docs": ["japanese-guide.html"],
  "langs": ["es", "fr", "de"],
  "source_lang": "auto"
}

4.5 Observability & Control — Better Than AWS

We built this to be observable and controllable in ways that AWS Translate isn't. Every job, every pair, every event — tracked and actionable.

Real-Time Progress

Poll GET /translate/{job_id} for live progress. You see exactly which languages are done, which are in progress, and which failed — not just "processing" for 10 minutes.

"data": {
  "job_id": "019e3d489ea4-15d9082769939137",
  "job_status": "translating",
  "progress": {
    "total_pairs": 11,
    "completed": 7,
    "failed": 0,
    "in_progress": 4,
    "details": {
      "es": "succeeded", "pt": "succeeded", "fr": "succeeded",
      "de": "succeeded", "ru": "succeeded", "ja": "succeeded",
      "zh": "succeeded", "hi": "in_progress", "ar": "in_progress",
      "ur": "in_progress", "it": "in_progress"
    }
  }
}

Cancel Mid-Job

DELETE /translate/{job_id} stops the Step Function immediately. Already-completed pairs are still available. You're not charged for cancelled pairs. AWS Translate batch jobs? Once submitted, you wait.

Retry Failed Pairs

POST /translate/{job_id}/retry — if a job completes with partial status (some pairs failed), retry just the failed ones. No need to re-translate the whole document.

{
  "status": "✅ [LPO] [us-east-2] [BeastMain] [/translate/019e3d489ea4-15d9082769939137/retry] [202]",
  "status_code": 202,
  "endpoint": "/translate/019e3d489ea4-15d9082769939137/retry",
  "cluster_node": "BeastMain",
  "region": "us-east-2",
  "language": "en",
  "api_key_id": "ak_demo123",
  "ip_address": "203.0.113.42",
  "agent_profile_arn": "arn:tbi:us-east-2:211998422884:agent-profile/tbts/v1",
  "timestamp": "2026-05-18T23:00:00Z",
  "data": {
    "original_job_id": "019e3d489ea4-15d9082769939137",
    "retry_job_id": "019e3d5a1b2c-retry001",
    "pairs_retrying": ["ko", "ur"],
    "estimated_cost": "$0.51"
  },
  "error": ""
}

Full Audit Trail

Every event is logged in Aurora with millisecond timestamps:

Event TypeWhat It Records
job_submittedCustomer, source URL, target languages, estimated cost
job_startedStep Function execution ARN, start time
lang_startedLanguage code, worker task ID
lang_succeededLanguage code, duration, output S3 path, chunk count
lang_failedLanguage code, error type, retry count, last error message
job_completedFinal status, total duration, pairs succeeded/failed, actual cost
job_cancelledCancelled by (customer/system), pairs completed before cancel

You can query your job history via GET /translate/history — last 50 jobs with full event logs.

Spend Controls

Health Endpoint

GET /translate/health — public endpoint showing service status:

{
  "status": "✅ [LPO] [us-east-2] [BeastMirror] [/translate/health] [200]",
  "status_code": 200,
  "endpoint": "/translate/health",
  "cluster_node": "BeastMirror",
  "region": "us-east-2",
  "language": "en",
  "api_key_id": "ak_demo123",
  "ip_address": "203.0.113.42",
  "agent_profile_arn": "arn:tbi:us-east-2:211998422884:agent-profile/tbts/v1",
  "timestamp": "2026-05-18T23:15:00Z",
  "data": {
    "service_status": "operational",
    "queue_depth": 3,
    "active_jobs": 2,
    "avg_completion_time_seconds": 145,
    "last_successful_job": "2026-05-18T23:12:00Z",
    "bedrock_status": "available",
    "daily_spend": "$127.35",
    "daily_limit": "$600.00"
  },
  "error": ""
}

The difference: AWS Translate gives you a job ID and says "check back later." We give you real-time progress, mid-job cancellation, failed-pair retry, full audit trail, and spend controls. Observable. Controllable. Resilient.

4.6 Internal Efficiency — Delta Translation

We maintain a 40-document technical library translated into 11 languages. These documents change daily as we ship new features. Rather than re-translating entire documents on every update, our engine uses an internal delta system that identifies exactly which sections changed and only processes those.

This is not a customer-facing feature — it is an internal optimization that keeps our operational costs low, which in turn keeps your translation prices competitive. You always submit fresh documents and receive complete translations. Behind the scenes, we apply the same engineering discipline to our own documentation pipeline.

Why This Matters to You

5. Customer Experience

5.1 Account Dashboard — The Entry Point

The Trinity Beast Account Dashboard is where customers create accounts, manage services, and track usage. Translation-only customers are first-class citizens — you don't need a Price API subscription to use translation.

Dashboard URL: cpmp-site.org/dashboard

What You See Depends on What You Have

Customer TypeDashboard Shows
Translation onlyTranslations tab, Usage tab, Account Settings
Price API onlyAPI Keys tab, Usage tab, Account Settings
Both servicesAll tabs — Translations, API Keys, Usage, Account Settings
Subscriber (paid plan)All of the above + Subscription tab, Billing History

Translations Tab

Usage Tab (Translation Section)

5.2 Webhooks

When a job completes, we POST to your callback_url (if provided). Webhook payloads use the full UME envelope — same 12 fields as every API response:

POST https://your-server.com/webhook/translate-done
Content-Type: application/json
X-Trinity-Signature: sha256=abc123...

{
  "status": "✅ [LPO] [us-east-2] [BeastWebhook] [webhook/translation.completed] [200]",
  "status_code": 200,
  "endpoint": "webhook/translation.completed",
  "cluster_node": "BeastWebhook",
  "region": "us-east-2",
  "language": "en",
  "api_key_id": "ak_demo123",
  "ip_address": "203.0.113.42",
  "agent_profile_arn": "arn:tbi:us-east-2:211998422884:agent-profile/webhook-engine/v1",
  "timestamp": "2026-05-18T22:35:00Z",
  "data": {
    "event": "translation.completed",
    "job_id": "019e3d489ea4-15d9082769939137",
    "job_status": "succeeded",
    "source_doc": "api-reference.html",
    "pairs_succeeded": 3,
    "pairs_failed": 0,
    "cost": "$0.77",
    "duration_seconds": 187,
    "outputs": {
      "es": "https://api.cpmp-site.org/translate/download/019e3d489ea4/es/api-reference.html",
      "ja": "https://api.cpmp-site.org/translate/download/019e3d489ea4/ja/api-reference.html",
      "zh": "https://api.cpmp-site.org/translate/download/019e3d489ea4/zh/api-reference.html"
    }
  },
  "error": ""
}

The X-Trinity-Signature header contains an HMAC-SHA256 signature of the request body using your API key as the secret. Verify this to ensure the webhook is authentic.

UME everywhere: Webhooks use the same 12-field envelope as API responses. The cluster_node shows BeastWebhook so you know it came from our webhook delivery system. The endpoint shows the event type. Same shape, same parsing logic, same observability.

Webhook Events

EventWhen It FiresEndpoint Value
translation.startedJob begins processingwebhook/translation.started
translation.completedJob finishes (succeeded, partial, or failed)webhook/translation.completed
translation.cancelledJob was cancelled by customerwebhook/translation.cancelled

Webhook Failure Example

If a job fails, the webhook still uses UME — but with the error field populated:

{
  "status": "🛑 [LPO] [us-east-2] [BeastWebhook] [webhook/translation.completed] [200]",
  "status_code": 200,
  "endpoint": "webhook/translation.completed",
  "cluster_node": "BeastWebhook",
  "region": "us-east-2",
  "language": "en",
  "api_key_id": "ak_demo123",
  "ip_address": "203.0.113.42",
  "agent_profile_arn": "arn:tbi:us-east-2:211998422884:agent-profile/webhook-engine/v1",
  "timestamp": "2026-05-18T22:40:00Z",
  "data": {
    "event": "translation.completed",
    "job_id": "019e3d489ea4-15d9082769939137",
    "job_status": "partial",
    "source_doc": "api-reference.html",
    "pairs_succeeded": 9,
    "pairs_failed": 2,
    "cost": "$2.35",
    "duration_seconds": 312,
    "outputs": {
      "es": "https://api.cpmp-site.org/translate/download/019e3d489ea4/es/api-reference.html",
      "pt": "https://api.cpmp-site.org/translate/download/019e3d489ea4/pt/api-reference.html",
      "fr": "https://api.cpmp-site.org/translate/download/019e3d489ea4/fr/api-reference.html",
      "de": "https://api.cpmp-site.org/translate/download/019e3d489ea4/de/api-reference.html",
      "ru": "https://api.cpmp-site.org/translate/download/019e3d489ea4/ru/api-reference.html",
      "ja": "https://api.cpmp-site.org/translate/download/019e3d489ea4/ja/api-reference.html",
      "zh": "https://api.cpmp-site.org/translate/download/019e3d489ea4/zh/api-reference.html",
      "hi": "https://api.cpmp-site.org/translate/download/019e3d489ea4/hi/api-reference.html",
      "ar": "https://api.cpmp-site.org/translate/download/019e3d489ea4/ar/api-reference.html"
    },
    "failed_pairs": {
      "ur": "Validator failed: tag count mismatch after 3 retries",
      "ko": "Bedrock timeout after 15 minutes"
    }
  },
  "error": ""
}

Note: status_code is 200 because the webhook delivery succeeded. The job status (partial) and failed_pairs tell you what happened with the translation. The error field in the envelope is empty because this isn't an envelope-level error — it's a job-level partial failure.

5.3 Brand Terms Protection

Every account can configure up to 150 brand terms that are automatically protected during translation. These terms are never translated, transliterated, or modified in any way — they appear exactly as written in every target language.

Why This Matters

Generic translation services don't know your brand names. "Acme Corp" becomes "アクメ株式会社" in Japanese. "DataForge" becomes "DatenSchmiede" in German. Product names, person names, and technical identifiers get localized when they shouldn't be. Our sentinel preprocessing system prevents this entirely.

How to Set Up

  1. Log in to your Account Dashboard at https://api.cpmp-site.org/dashboard
  2. Navigate to the Translation Service panel
  3. Open the Brand Terms section under Account Settings
  4. Add your brand terms — product names, person names, company names, technical identifiers
  5. Save — terms apply to all future translation jobs automatically

Limits

ConstraintValue
Maximum terms per account150
Maximum characters per term100
DuplicatesAutomatically removed
ScopeAccount-level — applies to every job

What's Already Protected (Without Brand Terms)

The sentinel preprocessing system automatically protects technical content regardless of your brand terms list:

Brand terms add protection for prose-level content — names and identifiers that appear in regular text paragraphs where the AI agent would otherwise translate or transliterate them.

Example: If your brand terms include "CloudSync API" and "DataForge", then the sentence "DataForge uses CloudSync API for real-time synchronization" translates to Japanese as "DataForge は CloudSync API を使用してリアルタイム同期を行います" — brand terms untouched, prose naturally translated.

API Access

GET /dashboard/api/protected-terms    → Returns current terms list
PUT /dashboard/api/protected-terms    → Replaces terms list
    Body: {"terms": ["Acme Corp", "DataForge", "CloudSync API"]}

6. Implementation Plan

6.1 Phase 1: Core API

Timeline: 1-2 sessions

Deliverables:

6.2 Phase 2: Metering & Billing

Timeline: 1 session

Deliverables:

6.3 Phase 3: Customer Experience

Timeline: 1-2 sessions

Deliverables:

6.4 Phase 4: Launch

Timeline: 1 session

Deliverables:

7. Risks & Mitigations

RiskImpactMitigation
Abuse (huge documents) Cost overrun, resource exhaustion File size limit (5 MB), rate limit (10 jobs/hour per customer)
Abuse (spam submissions) Queue flooding, cost Require valid API key, daily spend cap per customer ($100 default)
Bad input (malformed HTML) Worker crashes, partial output Validate document structure before queuing, return clear error
Bedrock outage Jobs fail Retry with exponential backoff, notify customer on persistent failure
Customer data privacy Trust, compliance Isolated folders per customer, 30-day auto-delete, no content logging
Cost underestimation Negative margin Per-chunk pricing is driven from Valkey (actual Bedrock costs). Prices auto-adjust if model costs change. No manual margin calculation needed.
Complex scripts timeout Arabic, Urdu, Hindi take longer Per-language chunk size tuning (3000 chars for Indic/Arabic scripts), numeric pattern extraction to prevent model from dropping values, preprocessor sibling-awareness to ensure all code tags are extracted. All 21 validated languages tested in production.

Infrastructure cost: Nearly zero incremental cost. The translation engine is serverless (Step Functions, Lambda, SQS). We only pay when jobs run. S3 storage for customer outputs is pennies. The only fixed cost is the existing infrastructure we already run.

Business Case Summary

What we're selling: AI-powered document translation that actually works for technical content.

Why it's viable:

Revenue potential:

Time to market: 4-6 sessions to MVP. Core API in 1-2 sessions.

Bottom line: We solved this problem for ourselves. Now we can solve it for others — and let the service help pay for the ministry's infrastructure.