PHP SDK

Official PHP SDK for TruthMark invisible watermarking.

Installation

composer require truthmark/sdk

Quick 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 key
  • base_url (string): API base URL
  • timeout (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.

Need Help?

Check out the API reference or reach out to support.