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
| Tool | What it does |
|---|---|
valta_check_balance | Check USDC balance and spending limits |
valta_spend | Request a spend — approved or blocked by policy |
valta_transfer | Transfer 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