PHP SDK
Official PHP SDK for TruthMark invisible watermarking.
Installation
composer require truthmark/sdkQuick Example
<?php
require 'vendor/autoload.php';
use TruthMark\SDK\TruthMarkClient;
$client = new TruthMarkClient([
'api_key' => 'tm_live_your_key',
'base_url' => 'https://truthmark-api.onrender.com',
]);
// Encode
$result = $client->encode('image.png', 'Copyright 2025');
echo "Download: " . $result['download_url'] . "\n";
echo "PSNR: " . number_format($result['metadata']['psnr'], 1) . " dB\n";
// Decode
$decoded = $client->decode('watermarked.png');
if ($decoded['found']) {
echo "Message: " . $decoded['message'] . "\n";
echo "Confidence: " . number_format($decoded['confidence'] * 100, 1) . "%\n";
}API Reference
new TruthMarkClient(array $config)
Create a new client with configuration.
api_key(string): Your API keybase_url(string): API base URLtimeout(int): Request timeout in seconds
encode($imagePath, $message)
Embed an invisible watermark. Returns associative array.
decode($imagePath)
Extract watermark. Returns associative array.
Error Handling
use TruthMark\SDK\Exceptions\TruthMarkException;
use TruthMark\SDK\Exceptions\RateLimitException;
try {
$result = $client->encode('image.png', 'message');
} catch (RateLimitException $e) {
echo "Rate limited. Retry after: " . $e->getRetryAfter() . "s\n";
} catch (TruthMarkException $e) {
echo "Error ({$e->getStatusCode()}): {$e->getMessage()}\n";
}Advanced Examples
Laravel Controller
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use TruthMark\SDK\TruthMarkClient;
class WatermarkController extends Controller
{
private TruthMarkClient $client;
public function __construct()
{
$this->client = new TruthMarkClient([
'api_key' => config('services.truthmark.key'),
]);
}
public function encode(Request $request)
{
$request->validate([
'image' => 'required|image|max:20480',
'message' => 'required|string|max:500',
]);
$path = $request->file('image')->store('temp');
$result = $this->client->encode(
storage_path('app/' . $path),
$request->message
);
Storage::delete($path);
return response()->json($result);
}
}Batch Directory Processing
$images = glob('./images/*.{png,jpg,jpeg}', GLOB_BRACE);
foreach ($images as $image) {
try {
$result = $client->encode($image, '© 2025 My Company');
$name = basename($image);
$psnr = number_format($result['metadata']['psnr'], 1);
echo "✓ {$name}: PSNR={$psnr}dB\n";
} catch (TruthMarkException $e) {
echo "✗ " . basename($image) . ": " . $e->getMessage() . "\n";
}
}Best Practices
Use environment variables
Store API keys in .env and access via getenv() or Laravel config.
Clean up temp files
Always delete temporary uploaded files after processing.
Don't hardcode API keys
Never commit credentials to version control.