Verify a Honduran business
A verified local goes to the address, photographs the premises, confirms the business is operating, and checks the mercantile registry. You get back what was found — photos, what the sign says, whether anyone was there, and the registry excerpt — not a verdict dressed up as data. Five business days, or the payment is returned.
POST https://api.bottrunk.com/s/verify-business-hn
Call it
# once, on the machine your agent runs on npx bottrunk-mcp wallet # prints the address; send it 0.3 ALGO, then USDC claude mcp add bottrunk -- npx -y bottrunk-mcp # then ask your agent for it — the tool is `bottrunk_verify_business_hn`
# Ask. You get a 402 with the payment requirements.
curl https://api.bottrunk.com/s/verify-business-hn \
-H "Content-Type: application/json" \
-d '{"business_name":"Ferretería El Progreso","address":"Blvd. Morazán, Tegucigalpa","contact_email":"buyer@example.com"}'
# Pay and retry. Any x402 client does this for you.
curl https://api.bottrunk.com/s/verify-business-hn \
-H "PAYMENT-SIGNATURE: <signed USDC transfer>" \
-H "Content-Type: application/json" \
-d '{"business_name":"Ferretería El Progreso","address":"Blvd. Morazán, Tegucigalpa","contact_email":"buyer@example.com"}'
# pip install "x402-avm[avm,requests]==2.0.2"
import base64, os
from algosdk import encoding, mnemonic
from x402 import x402ClientSync
from x402.http import x402HTTPClientSync
from x402.http.clients.requests import x402_requests
from x402.mechanisms.avm import ALGORAND_MAINNET_CAIP2
from x402.mechanisms.avm.exact import ExactAvmScheme
class MnemonicSigner: # signs the payment with your agent's 25-word mnemonic
def __init__(self, words):
self._sk = mnemonic.to_private_key(words)
self.address = encoding.encode_address(base64.b64decode(self._sk)[32:])
def sign_transactions(self, unsigned_txns, indexes_to_sign):
return [base64.b64decode(encoding.msgpack_encode(
encoding.msgpack_decode(base64.b64encode(t).decode()).sign(self._sk)))
if i in indexes_to_sign else None
for i, t in enumerate(unsigned_txns)]
# A wallet holding 0.3 ALGO, opted in to USDC, funded with the USDC it may spend.
signer = MnemonicSigner(os.environ["ALGORAND_MNEMONIC"])
client = x402ClientSync().register(ALGORAND_MAINNET_CAIP2,
ExactAvmScheme(signer, algod_url="https://mainnet-api.algonode.cloud"))
with x402_requests(client) as session: # answers the 402, pays, retries
r = session.post("https://api.bottrunk.com/s/verify-business-hn", json={"business_name": "Ferretería El Progreso", "address": "Blvd. Morazán, Tegucigalpa", "contact_email": "buyer@example.com"})
print(r.json())
receipt = x402HTTPClientSync(client).get_payment_settle_response(r.headers.get)
print(receipt.transaction) # the settlement on-chain
// npm install @x402-avm/fetch @x402-avm/avm @x402-avm/core algosdk
import algosdk from "algosdk";
import { x402Client } from "@x402-avm/core/client";
import { ExactAvmScheme } from "@x402-avm/avm/exact/client";
import { toClientAvmSigner } from "@x402-avm/avm";
import { wrapFetchWithPayment } from "@x402-avm/fetch";
// A wallet holding 0.3 ALGO, opted in to USDC, funded with the USDC it may spend.
const { sk } = algosdk.mnemonicToSecretKey(process.env.ALGORAND_MNEMONIC!);
const signer = toClientAvmSigner(Buffer.from(sk).toString("base64"));
const client = new x402Client().register("algorand:wGHE2Pwdvd7S12BL5FaOP20EGYesN73ktiC1qzkkit8=",
new ExactAvmScheme(signer, { algodUrl: "https://mainnet-api.algonode.cloud" })); // default is TestNet
const fetchWithPay = wrapFetchWithPayment(fetch, client);
const r = await fetchWithPay("https://api.bottrunk.com/s/verify-business-hn", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({"business_name":"Ferretería El Progreso","address":"Blvd. Morazán, Tegucigalpa","contact_email":"buyer@example.com"}),
});
console.log(await r.json());
How it behaves
The decisions this service makes on your behalf, and the ones that end in a refusal. A 4xx is never settled, so a refusal costs you nothing.
| What you get back | A written report with the photo album link, what the registry says, and whether the business was operating when the visit happened. Poll GET /orders/{order_id} until status is delivered. |
| An address that does not exist | Still delivered, and still charged: the visit happened and the answer — nothing there — is usually the one worth paying for. |
| Cities we cover | Tegucigalpa and San Pedro Sula reliably. Anywhere else, we ask first; if we cannot get there the payment is returned in full. |
| When the queue is full | Answered 429 and not charged. One person carries this. |
| Method | POST only. A GET on the same path returns this page. |
Who does the work
A person, not a script. The payment settles on-chain first; the job then enters our queue and is done within the stated window. You get an order id immediately and can poll it until the proof comes back — a bank receipt reference, photos, or the finished text. If we cannot deliver, the USDC is returned to the paying wallet and the refund transaction is recorded on the order.
Input
| business_name | string | Business name as it should appear at the address. |
| address | string | Street address and city. |
| contact_email | string | Optional: emailed when the report is in. |
Output
| order_id | string | Token to poll at /orders/{order_id}. |
| status | string | pending until the visit is done, then delivered. |
| eta | string | Fulfilment promise. |
| result | object | The report: what was found, photos, registry excerpt. |