Rust SDK

The SignalStack Rust SDK provides a safe, async client built on reqwest and tokiowith serde-based deserialization into strongly typed enums and structs.

Installation

Code
cargo add signalstack

# Enable the tokio runtime (default)
cargo add signalstack --features tokio

# Or use async-std
cargo add signalstack --features async-std

Client initialization

Code
use signalstack::{SignalStack, SignalStackConfig};

// Using environment variable
let client = SignalStack::new()?;

// Explicit configuration
let client = SignalStack::with_config(SignalStackConfig {
    api_key: Some("ssk_live_YOUR_API_KEY".into()),
    timeout: std::time::Duration::from_secs(30),
    max_retries: 3,
    base_url: "https://signal-stack-ten.vercel.app/v1".into(),
});

// Async initialization with builder
let client = SignalStack::builder()
    .api_key("ssk_live_YOUR_API_KEY")
    .timeout(std::time::Duration::from_secs(30))
    .build()?;

Verify a business

Code
use signalstack::input::VerifyBusinessInput;

let result = client
    .verify_business(VerifyBusinessInput {
        company_name: "Acme Corp".into(),
        jurisdiction: Some("us_de".into()),
        registration_number: None,
        officers: Some(true),
        filings: Some(true),
    })
    .await?;

println!("Status: {}", result.status);        // "active"
println!("Trust score: {}", result.trust_score); // 0.94
for officer in result.officers.unwrap_or_default() {
    println!("  {} — {}", officer.name, officer.role);
}

Analyze a document

Code
use signalstack::input::{VerifyDocumentInput, DocumentSource};

let result = client
    .verify_document(VerifyDocumentInput {
        source: DocumentSource::Url,
        content: "https://example.com/report.pdf".into(),
        mime_type: None,
        check_deepfakes: Some(true),
        check_watermarks: None,
    })
    .await?;

println!("AI probability: {}", result.ai_generated_probability); // 0.87
println!("Flags: {:?}", result.manipulation_flags);
// [ManipulationFlag::AiGeneratedText, ManipulationFlag::MetadataStripped]

Verify media provenance

Code
use signalstack::input::VerifyMediaInput;
use signalstack::response::Authenticity;

let result = client
    .verify_media(VerifyMediaInput {
        url: Some("https://example.com/photo.jpg".into()),
        file: None,
        check_deepfakes: Some(true),
        check_provenance: Some(true),
        check_watermarks: Some(true),
    })
    .await?;

println!("Authenticity: {:?}", result.authenticity); // Authenticity::Manipulated
println!("Deepfake score: {}", result.deepfake_score); // 0.94
println!("Provenance: {:?}", result.provenance_source);

Verify a claim

Code
use signalstack::input::VerifyClaimInput;
use signalstack::response::Verdict;

let result = client
    .verify_claim(VerifyClaimInput {
        claim: "Water boils at 100°C at sea level".into(),
        sources: Some(vec![
            "web".into(),
            "wikipedia".into(),
            "semantic_scholar".into(),
        ]),
        language: None,
        max_evidence: None,
    })
    .await?;

println!("Verdict: {:?}", result.verdict);       // Verdict::True
println!("Trust score: {}", result.trust_score); // 0.97
for evidence in result.evidence {
    println!("  [{}] {}", evidence.source, evidence.snippet);
}

Error handling

Code
use signalstack::error::SignalStackError;

match client.verify_claim(input).await {
    Ok(result) => println!("Success: {}", result.trust_score),
    Err(SignalStackError::RateLimit(e)) => {
        println!("Rate limited. Retry after {}s", e.retry_after);
    }
    Err(SignalStackError::Authentication(e)) => {
        eprintln!("Check API key: {}", e.message);
    }
    Err(SignalStackError::Validation(e)) => {
        eprintln!("Validation error: {:?}", e.details);
    }
    Err(SignalStackError::Server(e)) => {
        eprintln!("Server error: {}", e.status_code);
    }
    Err(e) => eprintln!("Unexpected error: {}", e),
}

Configuration

OptionDefaultDescription
api_keySIGNALSTACK_API_KEY envYour API key
timeout30sRequest timeout
max_retries3Max retries for 429/5xx
base_urlhttps://signal-stack-ten.vercel.app/v1API base URL