Getting Started

Our API is designed to be simple and easy to use. Follow the instructions below to get started.

Base URL
https://api.culturaltranslate.com/v1

All endpoints are versioned and return JSON. Use HTTPS.

Note: All API requests must be made over HTTPS. Requests over HTTP will fail.

Authentication

Authenticate your API requests using Bearer tokens. You can generate API keys from your dashboard.

curl -X POST https://api.culturaltranslate.com/v1/translate \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"text": "Hello", "target_language": "ar"}'
await fetch('https://api.culturaltranslate.com/v1/translate', {
    method: 'POST',
    headers: {
        'Authorization': 'Bearer YOUR_API_KEY',
        'Content-Type': 'application/json'
    },
    body: JSON.stringify({ text: 'Hello', target_language: 'ar' })
});
$client = new \GuzzleHttp\Client(['base_uri' => 'https://api.culturaltranslate.com']);
$res = $client->post('/v1/translate', [
    'headers' => [ 'Authorization' => 'Bearer YOUR_API_KEY' ],
    'json' => [ 'text' => 'Hello', 'target_language' => 'ar' ]
]);
echo $res->getBody();

Translation API

Translate Text

Translate text from one language to another with cultural adaptation.

POST /v1/translate Rate limit: 60 req/min
{
  "text": "Hello, world!",
  "source_language": "en",
  "target_language": "ar",
  "ai_model": "gpt-4",
  "cultural_adaptation": true,
  "preserve_brand_voice": true,
  "formal_tone": false
}
Use `cultural_adaptation` to apply region-specific idioms and tone.

Response

{
  "success": true,
  "data": {
    "translated_text": "مرحباً بالعالم!",
    "source_language": "en",
    "target_language": "ar",
    "characters_used": 13,
    "quality_score": 0.95
  }
}
Responses include quality metrics and usage counters.

Batch Translation

POST /v1/translate/batch

{
  "texts": ["Hello", "Goodbye", "Thank you"],
  "source_language": "en",
  "target_language": "ar"
}
Batch requests process texts sequentially and return an array of translations.

Voice Translation

Speech-to-Text

POST /v1/voice/speech-to-text

{
  "audio_url": "https://example.com/audio.mp3",
  "source_language": "en"
}
Supports Whisper, Azure Speech, and Deepgram. See `services.asr` config.

Text-to-Speech

POST /v1/voice/text-to-speech

{
  "text": "Hello, world!",
  "language": "en",
  "voice": "male",
  "cultural_tone": true
}
Voices depend on provider (Azure, Google, ElevenLabs). See `services.tts`.

Visual Translation

Translate Image

POST /v1/visual/translate-image

{
  "image_url": "https://example.com/image.jpg",
  "target_language": "ar",
  "preserve_layout": true
}
Enable layout preservation for screenshots and UI mocks.

Translate Document

POST /v1/visual/translate-document

{
  "document_url": "https://example.com/doc.pdf",
  "target_language": "ar",
  "format": "pdf"
}
Documents support PDF, DOCX, and images. Long PDFs can be processed async.

Error Handling

Our API uses standard HTTP status codes to indicate the success or failure of a request.

200 - OK
Request succeeded
400 - Bad Request
Invalid request parameters
401 - Unauthorized
Invalid or missing API key
429 - Too Many Requests
Rate limit exceeded

Rate Limits: 60 requests/min per API key by default. 429 indicates throttling. Contact support to raise limits.

Webhook Verification
$signature = request()->header('X-Signature');
$secret = env('WEBHOOK_SECRET');
$expected = hash_hmac('sha256', request()->getContent(), $secret);
abort_unless(hash_equals($expected, $signature), 401);

All webhook payloads are signed with HMAC-SHA256. Reject mismatches.