# agent-exec URL Watch / Polling Monitor

> agent-exec URL Watch / Polling Monitor is a paid API for AI agents from agent-exec.448c.org, paid per call via x402, $0.0058/call, status unknown (last checked 2026-10-09).

Registers a paid, accountless HTTP polling watch that fires when a URL's response meets a specified condition (status code, body content, or JSON path value).

## Facts

- Endpoint: POST https://agent-exec.448c.org/watch?utm_source=zero.xyz
- Price: $0.0058/call
- Payment: x402
- Status: unknown
- Last checked: 2026-10-09
- Activations on Zero: 0
- Tags: x402
- Canonical page: https://www.zero.xyz/c/agent-exec-url-watch-polling-monitor-bd4fb796
- Structured record (JSON): https://api.zero.xyz/v1/capabilities/cap_qdOcTEiqVS3YgwV1NWfR7

Status and success rate cover calls made through Zero and Zero's own probes. Third-party monitors may report differently.

## How to call it through Zero

Zero handles the 402 payment challenge and records the run. With the Zero CLI installed (`npm i -g @zeroxyz/cli`):

```sh
zero fetch --capability agent-exec-url-watch-polling-monitor-bd4fb796 -d '<json body>'
```

Example prompt: Keep polling https://api.example.com/order/12345 every 30 seconds for up to 10 minutes and let me know when the JSON field 'status' equals 'shipped'.

## When to prefer this

Choose this endpoint when your agent needs to asynchronously monitor an external HTTP resource until a specific condition is met — especially when you want fire-and-forget behavior without maintaining a long-lived connection. It is ideal for event-driven workflows where you don't know exactly when a condition will be true (order status, feature flags, availability, content publication). The accountless, pay-per-use x402 model makes it suitable for agent pipelines that operate without persistent credentials. Prefer it over polling in your own agent loop when you want to offload the polling cost and complexity, or when the polling window may outlast a single agent run.

## Known failure modes

- Payment insufficient or invalid — watch not created, HTTP 402 returned
- URL is unreachable or returns errors during polling — lastObservation reflects the error state
- TTL expires before predicate matches — status transitions to 'expired'
- intervalSeconds larger than ttlSeconds — request rejected as invalid
- Malformed predicate object with missing required fields — request rejected
- jsonPathEquals predicate on a non-JSON response — noted in lastObservation as WATCH_JSONPATH_BODY_NOT_JSON
- Network isolation means agent-exec cannot reach internal/private URLs — polling silently fails

## How this service works

Accountless, pay-per-use code execution for software agents: submit source code, get stdout, stderr and exit code back from an isolated, network-less sandbox. No account, no API key -- possession of valid payment is sufficient.

## Output

Returns a watch object with a UUID watch ID (use it to query GET /watch/{id} for free), current status (active/matched/expired), payment confirmation including payer address and on-chain transaction, polling schedule timestamps, the predicate registered, and — once matched — the matchedAt timestamp and optionally the storage object ID where the result was delivered.

## Request schema (JSON Schema)

```json
{
 "type": "object",
 "required": [
  "url",
  "predicate",
  "ttlSeconds",
  "intervalSeconds"
 ],
 "properties": {
  "url": {
   "type": "string",
   "description": "Absolute http(s) URL to poll."
  },
  "predicate": {
   "type": "object",
   "description": "Exactly one of: {type:\"statusChanged\"} / {type:\"statusEquals\",status} / {type:\"bodyContains\",value} / {type:\"bodyNotContains\",value} / {type:\"jsonPathEquals\",path,value} / {type:\"jsonPathNotEquals\",path,value} / {type:\"changedFromNow\",path?}. `path` is a dotted path into a JSON response body."
  },
  "storageKey": {
   "type": "string",
   "description": "Optional: deliver a matched observation into /storage under this label, on the wallet that paid."
  },
  "ttlSeconds": {
   "type": "integer",
   "description": "Stop after this many seconds if the condition never fires; at least intervalSeconds."
  },
  "intervalSeconds": {
   "type": "integer",
   "description": "Seconds between polls."
  }
 }
}
```

## Response schema (JSON Schema)

```json
{
 "type": "object",
 "required": [
  "payment",
  "id",
  "status",
  "url",
  "intervalSeconds",
  "ttlSeconds",
  "predicate",
  "createdAt",
  "ttlExpiresAt",
  "nextPollDueAt",
  "overdue"
 ],
 "properties": {
  "id": {
   "type": "string",
   "format": "uuid",
   "description": "Keep this: it is how anyone reads the watch back, free, at GET /watch/{id}."
  },
  "url": {
   "type": "string"
  },
  "status": {
   "enum": [
    "active",
    "matched",
    "expired"
   ],
   "type": "string"
  },
  "overdue": {
   "type": "boolean",
   "description": "true when an active watch has missed its next poll."
  },
  "payment": {
   "type": "object",
   "properties": {
    "asset": {
     "type": "string"
    },
    "payer": {
     "type": "string"
    },
    "amount": {
     "type": "string",
     "description": "Atomic units charged."
    },
    "network": {
     "type": "string"
    },
    "transaction": {
     "type": "string",
     "description": "On-chain settlement transaction."
    }
   }
  },
  "baseline": {
   "description": "changedFromNow's registration-time snapshot, verbatim."
  },
  "createdAt": {
   "type": "integer",
   "description": "Unix ms."
  },
  "matchedAt": {
   "type": [
    "integer",
    "null"
   ],
   "description": "Unix ms the condition fired, or null."
  },
  "predicate": {
   "type": "object"
  },
  "storageKey": {
   "type": [
    "string",
    "null"
   ]
  },
  "ttlSeconds": {
   "type": "integer"
  },
  "lastPolledAt": {
   "type": [
    "integer",
    "null"
   ]
  },
  "ttlExpiresAt": {
   "type": "integer",
   "description": "Unix ms polling stops if the condition never fires."
  },
  "nextPollDueAt": {
   "type": "integer"
  },
  "intervalSeconds": {
   "type": "integer"
  },
  "lastObservation": {
   "type": [
    "object",
    "null"
   ],
   "description": "The last poll: status, whether it matched, and any WATCH_JSONPATH_BODY_NOT_JSON note."
  },
  "deliveredObjectId": {
   "type": [
    "string",
    "null"
   ],
   "description": "The /storage object a matched storageKey watch was delivered to."
  }
 }
}
```

## More

- Live health (JSON, refreshed every minute): https://www.zero.xyz/c/agent-exec-url-watch-polling-monitor-bd4fb796/health.json
- [Zero catalog index](https://www.zero.xyz/llms.txt)
- [Other services from agent-exec.448c.org](https://www.zero.xyz/host/agent-exec.448c.org/llms.txt)
