Valta Docs

LangChain Integration

Add Valta to any LangChain agent in minutes. Each agent gets its own USDC wallet, programmable spending limits, and a kill switch you control from the dashboard.

Install

bash
pip install requests langchain-core

Get your API key

Sign up at valta.co/dashboard → Settings → API Keys → Create key.

Download the tool file

Save this as valta_tool.py in your project:

python
"""
Valta Wallet Tool for LangChain
"""
import requests
from typing import Optional, Type
from langchain_core.tools import BaseTool
from pydantic import BaseModel, Field

VALTA_BASE_URL = "https://www.valta.co"

class CheckBalanceInput(BaseModel):
    agent_id: str = Field(description="The Valta wallet ID or name to check balance for")

class SpendInput(BaseModel):
    agent_id: str = Field(description="The Valta wallet ID or name making the spend")
    amount: float = Field(description="Amount in USDC")
    description: str = Field(description="Purpose of the spend")
    category: Optional[str] = Field(default="general", description="Spend category")

class TransferInput(BaseModel):
    from_agent_id: str = Field(description="Wallet ID or name sending funds")
    to_agent_id: str = Field(description="Wallet ID or name receiving funds")
    amount: float = Field(description="Amount in USDC")
    description: Optional[str] = Field(default="")

class ValtaCheckBalanceTool(BaseTool):
    name: str = "valta_check_balance"
    description: str = (
        "Check how much USDC an AI agent has in its Valta wallet. "
        "Use before spending to confirm funds are available."
    )
    args_schema: Type[BaseModel] = CheckBalanceInput
    api_key: str = ""

    def _run(self, agent_id: str) -> str:
        headers = {"Authorization": f"Bearer {self.api_key}"}
        r = requests.get(
            f"{VALTA_BASE_URL}/api/v1/agents/{agent_id}/wallet",
            headers=headers, timeout=10,
        )
        if r.status_code == 200:
            data = r.json().get("wallet", {})
            return (
                f"Balance: {data.get('balance', 0)} USDC | "
                f"Status: {data.get('status', 'unknown')} | "
                f"Daily limit: {data.get('limits', {}).get('daily', 'none')} USDC"
            )
        return f"Error: {r.status_code}"

class ValtaSpendTool(BaseTool):
    name: str = "valta_spend"
    description: str = (
        "Request a spend from an agent's Valta wallet. "
        "Approved or blocked based on the agent's spending policy."
    )
    args_schema: Type[BaseModel] = SpendInput
    api_key: str = ""

    def _run(self, agent_id: str, amount: float, description: str, category: str = "general") -> str:
        headers = {"Authorization": f"Bearer {self.api_key}"}
        r = requests.post(
            f"{VALTA_BASE_URL}/api/v1/agents/{agent_id}/wallet/spend",
            json={"amount": amount, "description": description, "category": category},
            headers=headers, timeout=10,
        )
        if r.status_code == 200:
            data = r.json()
            if data.get("approved"):
                return f"Approved: {amount} USDC. New balance: {data.get('newBalance')} USDC"
            return f"Blocked by policy: {data.get('reason', 'limit exceeded')}"
        return f"Error: {r.status_code}"

class ValtaTransferTool(BaseTool):
    name: str = "valta_transfer"
    description: str = "Transfer USDC between two agent wallets on Valta."
    args_schema: Type[BaseModel] = TransferInput
    api_key: str = ""

    def _run(self, from_agent_id: str, to_agent_id: str, amount: float, description: str = "") -> str:
        headers = {"Authorization": f"Bearer {self.api_key}"}
        r = requests.post(
            f"{VALTA_BASE_URL}/api/v1/wallet/transfer",
            json={"fromAgentId": from_agent_id, "toAgentId": to_agent_id, "amount": amount, "description": description},
            headers=headers, timeout=10,
        )
        if r.status_code == 200:
            return f"Transfer complete. TX: {r.json().get('txId', 'N/A')}"
        return f"Error: {r.status_code}"

def get_valta_tools(api_key: str) -> list:
    return [
        ValtaCheckBalanceTool(api_key=api_key),
        ValtaSpendTool(api_key=api_key),
        ValtaTransferTool(api_key=api_key),
    ]

Use it

python
from langchain_openai import ChatOpenAI
from langchain.agents import create_react_agent, AgentExecutor
from langchain import hub
from valta_tool import get_valta_tools

tools = get_valta_tools("sk_valta_your_api_key")

llm = ChatOpenAI(model="gpt-4o")
prompt = hub.pull("hwchase17/react")

agent = create_react_agent(llm, tools, prompt)
executor = AgentExecutor(agent=agent, tools=tools, verbose=True)

executor.invoke({
    "input": "Check my wallet balance, then spend 5 USDC on API credits if I have enough."
})

Create a wallet for your agent

Before running, create a named wallet via the API:

bash
curl -X POST "https://www.valta.co/api/v1/wallets" \
  -H "x-api-key: sk_valta_your_key" \
  -H "Content-Type: application/json" \
  -d '{"name": "my-langchain-agent", "dailyLimit": 50, "perTxLimit": 10}'

Use the returned walletId or the name as the agent_id in your tools.

Available tools

ToolWhat it does
valta_check_balanceCheck USDC balance and spending limits
valta_spendRequest a spend — approved or blocked by policy
valta_transferTransfer USDC between agent wallets

Spending policies

All spends are governed by limits you set at wallet creation or in the dashboard:

  • Per-transaction cap — single spend ceiling
  • Daily limit — total spend per day
  • Monthly limit — total spend per month
  • Kill switch — freeze any agent instantly from valta.co/dashboard