Search US patent applications and grants via the USPTO Open Data Portal. Query: q (required, 2+ chars), yearFrom / yearTo (optional filing-year bounds), applicationType (optional: Utility|Design|Plant|Reissue), limit (1-100, default 10), offset (0-based, default 0). Returns { total, returned, offset, limit, hits[{ applicationNumber, title, applicationType, firstInventor, inventors[], applicants[], filingDate, effectiveFilingDate, status:{ code, description, updatedAt }, cpcSymbols[], uspcSymbol, url }] }. URLs link to USPTO Patent Center for the public file wrapper.
/api/patents/searchPAYMENT-SIGNATURE.The patent search API queries US patent applications and grants through the USPTO Open Data Portal and returns structured results agents can reason over.
Search free text across titles and abstracts, optionally bounded by filing year and application type (Utility, Design, Plant, Reissue), with paging via limit and offset. Each hit includes the application number, title, application type, first inventor and full inventor and applicant lists, filing and effective filing dates, current status, CPC and USPC classification symbols, and a link to the public file wrapper in USPTO Patent Center. No API key — pay per search with x402.
| Name | Type | Description |
|---|---|---|
qrequired | string | min 2 chars · max 500 chars |
yearFrom | integer | min 1790 · max 2100 |
yearTo | integer | min 1790 · max 2100 |
applicationType | string | one of: Utility | Design | Plant | Reissue |
limit | integer | min 1 · max 100 |
offset | integer | min 0 · max 10000 |
# 1. Probe with no auth → 402 envelope with PaymentRequirements curl -sS 'https://2s.io/api/patents/search?q=xx&yearFrom=1790&yearTo=1790&applicationType=Utility&limit=10&offset=0' # 2. Sign + retry with PAYMENT-SIGNATURE: curl -sS 'https://2s.io/api/patents/search?q=xx&yearFrom=1790&yearTo=1790&applicationType=Utility&limit=10&offset=0' \ -H 'PAYMENT-SIGNATURE: <base64-json-payload>' # Or use the canonical runner (handles probe → sign → retry): # EVM_PRIVATE_KEY=0x... node --env-file=.env.local \ # --experimental-strip-types scripts/x402-pay.ts \ # 'https://2s.io/api/patents/search?q=xx&yearFrom=1790&yearTo=1790&applicationType=Utility&limit=10&offset=0'
import { TwoS } from '@2sio/sdk'
const client = new TwoS({
privateKey: process.env.EVM_PRIVATE_KEY as `0x${string}`,
})
const result = await client.patents.search({
"q": "xx",
"yearFrom": 1790,
"yearTo": 1790,
"applicationType": "Utility",
"limit": 10,
"offset": 0
})
console.log('endpoint:', result.endpoint)
console.log('cost:', result.costUsd, 'USDC')
console.log('tx:', result.settlement?.txHash)
console.log('data:', result.data)import os
from twosio import TwoS
client = TwoS(private_key=os.environ["EVM_PRIVATE_KEY"])
result = client.patents.search(q="xx", yearFrom=1790, yearTo=1790, applicationType="Utility", limit=10, offset=0)
print("endpoint:", result.endpoint)
print("cost:", result.cost_usd, "USDC")
print("tx:", (result.settlement or {}).get("tx_hash"))
print("data:", result.data)// 1. Add @2sio/mcp to your MCP host config (Claude Desktop example below).
// EVM_PRIVATE_KEY funds x402 payments per call.
// claude_desktop_config.json
{
"mcpServers": {
"2sio": {
"command": "npx",
"args": ["-y", "@2sio/mcp"],
"env": { "EVM_PRIVATE_KEY": "0x..." }
}
}
}
// 2. Once the server is running, agents call this tool via standard MCP:
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "patents.search",
"arguments": {
"q": "xx",
"yearFrom": 1790,
"yearTo": 1790,
"applicationType": "Utility",
"limit": 10,
"offset": 0
}
}
}# pip install langchain-twosio langchain-anthropic
import os
from langchain_twosio import get_twosio_tools
from langchain_anthropic import ChatAnthropic
from langgraph.prebuilt import create_react_agent
tools = get_twosio_tools(private_key=os.environ["EVM_PRIVATE_KEY"])
llm = ChatAnthropic(model="claude-haiku-4-5", temperature=0)
agent = create_react_agent(llm, tools)
# The agent will pick "twosio_patents_search" when the prompt matches.
result = agent.invoke({
"messages": [("user", "...prompt that requires patents.search...")]
})
print(result["messages"][-1].content)# pip install llama-index-tools-twosio llama-index-llms-anthropic
import asyncio, os
from llama_index_tools_twosio import get_twosio_tools
from llama_index.llms.anthropic import Anthropic
from llama_index.core.agent.workflow import FunctionAgent
tools = get_twosio_tools(private_key=os.environ["EVM_PRIVATE_KEY"])
llm = Anthropic(model="claude-haiku-4-5")
agent = FunctionAgent(tools=tools, llm=llm)
# The agent will pick "twosio_patents_search" when the prompt matches.
response = asyncio.run(agent.run("...prompt that requires patents.search..."))
print(response)| Field | Type | Description |
|---|---|---|
ok | boolean | one of: true |
items | array | |
total | integer | Total matching rows upstream; null when unknown. |
source | object | |
meta | object |
{
"ok": true,
"items": [
{}
],
"total": 1,
"source": {
"provider": "example",
"url": "example",
"license": "example"
},
"meta": {
"query": {
"q": "example",
"yearFrom": 1,
"yearTo": 1,
"applicationType": "example",
"offset": 1,
"limit": 1
},
"returned": 1
}
}