Sabi

Give your agent eyes on the physical world.

Try it now

Go to the web app (demo pre-filled), or give your Nevermined agent our docs URL plus your preferred prompt to get verified.

Example prompt:Is the AWS vending machine Out of Order right now?

Or: “Is there security at the front desk?

QR code: open web app with demo

Scan the QR code or open https://webapp-psi-inky.vercel.app?demo=1 to place the demo order (AWS vending machine).

Tell your agent

Copy this and paste it to your AI agent. That's all you need to do.

Follow the instructions at https://webapp-psi-inky.vercel.app/skill to use the Sabi real-world verification API. Sign up, submit verifications, and retrieve photo-verified answers about physical locations.

Sabi dispatches a human verifier to any location. They capture photos with smart glasses and answer your agent's question. Three API calls. No SDK.

1. Sign up

curl -X POST https://sabi-backend.ben-imadali.workers.dev/api/auth/signup \
  -H "Content-Type: application/json" \
  -d '{}'

# => {"apiKey": "sabi_sk_...", "userId": "..."}

Save the apiKey. Use it on all subsequent requests. Do this once.

2. Submit a verification

# First call without payment token to get 402 + payment info:
curl -X POST https://sabi-backend.ben-imadali.workers.dev/api/verifications \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer <apiKey>" \
  -d '{
    "question": "Is the AWS vending machine Out of Order right now?",
    "targetLat": 37.7851,
    "targetLng": -122.3965
  }'
# => HTTP 402, payment-required header (base64 JSON with planId/agentId)

# Then retry with x402 access token from Nevermined:
curl -X POST https://sabi-backend.ben-imadali.workers.dev/api/verifications \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer <apiKey>" \
  -H "payment-signature: <access-token>" \
  -d '{
    "question": "Is the AWS vending machine Out of Order right now?",
    "targetLat": 37.7851,
    "targetLng": -122.3965
  }'

# => {"job": {"id": "...", "status": "connecting"}}

Payment uses the x402 protocol. The 402 response includes a payment-required header (base64 JSON with planId and agentId).

How to get an access token

You need a Nevermined API key. Get one at sandbox.nevermined.app (or nevermined.app for production).

Using the JS SDK

import { Payments } from "@nevermined-io/payments";

const payments = Payments.getInstance({
  nvmApiKey: "<your-nvm-api-key>",
  environment: "sandbox",
});

await payments.plans.orderPlan("<planId>");
const { accessToken } = await payments.x402
  .getX402AccessToken("<planId>", "<agentId>");

Using curl

# 1. Order the plan (once)
curl -s -X POST https://api.sandbox.nevermined.app/api/v1/payments/plans/<planId>/order \
  -H "Authorization: Bearer <your-nvm-api-key>"

# 2. Get x402 access token
curl -s -X POST https://api.sandbox.nevermined.app/api/v1/x402/permissions \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer <your-nvm-api-key>" \
  -d '{"accepted":{"scheme":"nvm:erc4337","network":"eip155:84532","planId":"<planId>","extra":{"agentId":"<agentId>"}}}'
# => {"accessToken": "..."}

Use the returned accessToken as the payment-signature header in the verification request above.

3. Get the result

curl https://sabi-backend.ben-imadali.workers.dev/api/verifications/<id>/artifact \
  -H "Authorization: Bearer <apiKey>"

# => {"answer": "Yes, it's open", "frames": [...]}

Poll GET /api/verifications/<id> until status is "verified", then fetch the artifact.

What comes back

answer — the verifier's spoken response, transcribed

frames — timestamped photos captured every 5s during the session

For AI agents

Point your agent at SKILL.md — a self-contained instruction file. The agent signs itself up, resolves locations, submits verifications, and retrieves results. No human setup required.

API reference

MethodPathDescription
POST/api/auth/signupCreate account
POST/api/verificationsSubmit verification (requires payment-signature header)
GET/api/verificationsList jobs
GET/api/verifications/:idJob status
GET/api/verifications/:id/artifactResult (answer + photos)