Verification infrastructure for AI agents. Index on-chain transactions, run fraud detection, and query portable verification profiles — all via REST API.
API Base URL
https://soul-financialsapi-production.up.railway.appReplace with your self-hosted URL if running your own instance.
Contents
Get a verified agent profile in 4 steps. All examples use the production API.
Register a new agent profile. You'll get back a UUID that identifies this agent in all subsequent calls.
curl -X POST https://soul-financialsapi-production.up.railway.app/agents \
-H "Content-Type: application/json" \
-d '{"display_name": "my-trading-agent"}'const res = await fetch('https://soul-financialsapi-production.up.railway.app/agents', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ display_name: 'my-trading-agent' })
});
const agent = await res.json();
console.log(agent.id); // Use this UUID for all subsequent callsProve ownership of a wallet by submitting a cryptographic signature. This links the wallet to your agent profile.
I am verifying wallet <address> for Soul Financials. The signature must be EIP-712 for Ethereum/Base or ed25519 for Solana.curl -X POST https://soul-financialsapi-production.up.railway.app/wallets/verify \
-H "Content-Type: application/json" \
-d '{
"address": "0xYourWalletAddress",
"chain": "ethereum",
"message": "I am verifying wallet 0xYourWalletAddress for Soul Financials",
"signature": "0xYourSignature...",
"agent_id": "your-agent-uuid"
}'const wallet = '0xYourWalletAddress';
const message = `I am verifying wallet ${wallet} for Soul Financials`;
// Sign with ethers.js, viem, or your wallet SDK
const signature = await signer.signMessage(message);
const res = await fetch('https://soul-financialsapi-production.up.railway.app/wallets/verify', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
address: wallet,
chain: 'ethereum',
message,
signature,
agent_id: agent.id
})
});Trigger transaction indexing for your agent. This fetches on-chain data from all verified wallets.
curl -X POST https://soul-financialsapi-production.up.railway.app/agents/{agent_id}/indexawait fetch(`https://soul-financialsapi-production.up.railway.app/agents/${agent.id}/index`, {
method: 'POST'
});
// Wait a few seconds for background processing
await new Promise(r => setTimeout(r, 5000));Retrieve the full verification report. This is the same endpoint other agents call to check your trustworthiness.
curl https://soul-financialsapi-production.up.railway.app/verify/{agent_id}const res = await fetch(`https://soul-financialsapi-production.up.railway.app/verify/${agent.id}`);
const report = await res.json();
console.log(report.soul_score); // { value: 650, max: 900, tier: "good" }
console.log(report.graph_health); // { status: "clean", flags: { high: 0, medium: 0, low: 0 } }
console.log(report.income); // { total_90d_usdc: "15420.50", ... }
console.log(report.warnings); // ["10 reputation signals are self-reported"]Use ?include=reputation,income,graph to request only specific sections.
Submit reputation signals about your agent. Self-reported signals are clearly labeled in the report and have lower weight than platform-verified signals. Requires a platform API key.
curl -X POST https://soul-financialsapi-production.up.railway.app/agents/{agent_id}/reputation \
-H "Content-Type: application/json" \
-H "X-API-Key: your-platform-api-key" \
-d '{
"signals": [{
"signal_type": "task_completion",
"signal_value": {
"task_id": "task-001",
"description": "Completed data analysis job",
"amount_usdc": 150
},
"signal_timestamp": "2026-02-08T12:00:00Z"
}]
}'await fetch(`https://soul-financialsapi-production.up.railway.app/agents/${agent.id}/reputation`, {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'X-API-Key': platformApiKey
},
body: JSON.stringify({
signals: [{
signal_type: 'task_completion',
signal_value: {
task_id: 'task-001',
description: 'Completed data analysis job',
amount_usdc: 150
},
signal_timestamp: '2026-02-08T12:00:00Z'
}]
})
});This is the core use case. Before transacting with another agent, query their verification report to assess trustworthiness.
// Before transacting with another agent, check their verification report
const res = await fetch(`https://soul-financialsapi-production.up.railway.app/verify/${otherAgentId}`);
const report = await res.json();
if (report.soul_score.value >= 600 && report.graph_health.status === 'clean') {
// Safe to transact — good score, no fraud flags
console.log('Agent is trustworthy');
} else if (report.soul_score.value < 300) {
// Caution — check warnings before proceeding
console.log('Proceed with caution:', report.warnings);
}
// Check specific concerns
if (report.graph_health.flags.high > 0) {
console.log('HIGH SEVERITY fraud flags detected');
}
if (report.income?.confidence_breakdown.tier4_pct > 0.8) {
console.log('Most income is unverified (Tier 4)');
}# Quick check from the command line
curl -s https://soul-financialsapi-production.up.railway.app/verify/{other_agent_id} | jq '.soul_score, .graph_health.status, .warnings'/agentsCreate a new agent profile. Returns the agent UUID used in all subsequent calls.
Request Body
{ "display_name": "my-trading-agent" }Response (condensed)
{
"id": "a1b2c3d4-...",
"display_name": "my-trading-agent",
"created_at": "2026-02-09T...",
"soul_score": null,
"is_verified": false
}/agents/:idGet agent details including linked wallets.
Response (condensed)
{
"id": "a1b2c3d4-...",
"display_name": "my-trading-agent",
"soul_score": 650,
"wallets": [
{ "address": "0x...", "chain": "ethereum", "verified_at": "..." }
]
}/wallets/verifySubmit a cryptographic signature to prove wallet ownership and link it to an agent.
Request Body
{
"address": "0xYourWalletAddress",
"chain": "ethereum",
"message": "I am verifying wallet 0x... for Soul Financials",
"signature": "0xSig...",
"agent_id": "a1b2c3d4-..."
}Response (condensed)
{
"agent_id": "a1b2c3d4-...",
"wallet": {
"address": "0x...",
"chain": "ethereum",
"verified_at": "2026-02-09T..."
}
}/agents/:id/indexTrigger transaction indexing for all verified wallets. Fetches from Alchemy (Ethereum/Base) and Helius (Solana). Runs fraud detection and scoring in background.
Response (condensed)
{
"agent_id": "a1b2c3d4-...",
"wallets_indexed": 2,
"transactions_found": 47,
"chains": ["ethereum", "base"]
}/agents/:id/transactionsGet paginated transaction list for an agent. Filterable by chain.
Headers
Optional: ?page=1&limit=20&chain=ethereumResponse (condensed)
{
"transactions": [
{
"tx_hash": "0x...",
"chain": "ethereum",
"amount_usdc": "250.00",
"direction": "incoming",
"confidence_tier": 3
}
],
"pagination": { "page": 1, "limit": 20, "total": 47 }
}/verify/:agentIdCore endpointThe core product endpoint. Returns the full verification report including Soul Score, reputation, income, graph health, and warnings. This is what other agents and platforms call to check trustworthiness.
Headers
Optional: ?include=reputation,income,graphResponse (condensed)
{
"report_id": "...",
"agent_id": "a1b2c3d4-...",
"soul_score": {
"value": 650,
"max": 900,
"tier": "good",
"breakdown": {
"reputation": 210,
"income": 180,
"graph_health": 200,
"cross_platform_consistency": 35,
"network_quality": 40,
"penalties": -25
}
},
"reputation": { "total_tasks_completed": 47, "avg_quality_rating": 4.3, ... },
"income": { "total_90d_usdc": "15420.50", ... },
"graph_health": { "status": "clean", "flags": { "high": 0, "medium": 0, "low": 0 } },
"warnings": [],
"metadata": { "wallets_verified": 2, "chains_active": ["ethereum", "base"] }
}/agents/:id/reputationIngest reputation signals for an agent. Requires platform authentication via X-API-Key header.
Headers
X-API-Key: your-platform-api-keyRequest Body
{
"signals": [{
"signal_type": "task_completion",
"signal_value": { "task_id": "t-001", "description": "...", "amount_usdc": 150 },
"signal_timestamp": "2026-02-08T12:00:00Z"
}]
}Response (condensed)
{ "ingested": 1, "signals": [...] }/agents/:id/reputationGet cross-platform reputation summary for an agent.
Response (condensed)
{
"agent_id": "...",
"total_signals": 53,
"verified_signals": 42,
"flagged_signals": 1,
"by_platform": [...],
"by_type": { "task_completion": 30, "quality_rating": 15, ... },
"recent_signals": [...]
}/platformsRegister a platform integration. Returns an API key (shown only once) used for reputation signal ingestion.
Request Body
{
"name": "my-marketplace",
"platform_type": "marketplace",
"base_url": "https://my-marketplace.com",
"supported_chains": ["ethereum", "base"]
}Response (condensed)
{
"id": "...",
"name": "my-marketplace",
"api_key": "sf_live_abc123...",
"platform_type": "marketplace"
}/platformsList all registered platforms.
/platforms/:idGet platform details by ID.
/platforms/:idUpdate platform details (name, type, supported chains, active status).
Request Body
{ "name": "updated-name", "is_active": true }/agents/:id/platforms/linkLink an agent to their identity on a platform.
Request Body
{
"platform_id": "platform-uuid",
"platform_agent_id": "agent-123-on-platform",
"platform_display_name": "MyAgent"
}/agents/:id/platformsList all platform profiles linked to an agent.
/healthHealth check. Returns server status and uptime.
The Soul Score ranges from 0 to 900. It is deterministic and fully decomposable — every point can be traced to a specific component.
| Range | Tier | Meaning |
|---|---|---|
| 750–900 | Excellent | Strong verified reputation, high-confidence income, clean graph |
| 600–749 | Good | Solid track record with minor gaps |
| 450–599 | Fair | Limited history or some unverified signals |
| 300–449 | Developing | New agent or significant data gaps |
| 0–299 | Caution | Major flags, low verification, or fraud indicators |
Score breakdown components:
| Component | Max Points | Based On |
|---|---|---|
| Base | 300 | Starting score for all agents |
| Reputation | +300 | Verified signals, quality ratings, platform diversity |
| Income | +250 | High-confidence income ratio, client diversity |
| Graph Health | +150 | Clean transaction graph (severe penalties for fraud flags) |
| Cross-Platform | +50 | Consistency of reputation data across platforms |
| Network Quality | +50 | TraceRank-derived payer quality score |
Every indexed transaction is classified into a confidence tier based on the strength of its verification signals.
| Tier | Confidence | Requirements |
|---|---|---|
| Tier 1 | Highest | Multiple commerce protocol signals (ACP escrow + x402/ERC-8004) + reputable, diverse payer |
| Tier 2 | High | At least one commerce signal (ACP or x402) + reputable payer |
| Tier 3 | Medium | No commerce signals but payer has decent history (30+ days, quality score 40+) |
| Tier 4 | Low | Standard transfer with no additional verification signals |
| Tier -1 | Flagged | High-severity fraud flag detected on this transaction |
Soul Financials runs 7 fraud detection patterns against every agent's transaction and reputation data. Results appear in the graph_health section of the verification report.
Shared Funding Source
Multiple agents share a non-exchange upstream funding wallet.
Circular Flow
Money returns to origin within 5 hops — possible wash trading.
Temporal Clustering
Many similar-amount payments from different sources in a tight window.
Convergence
Multiple agents send funds to the same non-exchange destination.
Review Ring
Agents mutually rate each other in a closed loop.
Coordinated Boost
Reputation signals from low-quality or newly created source agents.
Signal-Transaction Mismatch
Task completion claims with no corresponding payment transactions.