Is it still there?

Live status of any product page, listing, or job posting, read from the page right now. $0.01 per URL with a wallet, or a free GitHub starter key for the first checks.

npx agentcash@0.17.1 add https://livecheck.fly.dev
Try Verify Starter key Agent skill Live stats

Search engines tell you what they saw. Livecheck tells you what the page says now.

Try Verify

Live status checks for AI agents. Is this product still available or sold out (Shopify, eBay)? Is this job posting still open (Greenhouse, Lever, Ashby, Workday)? Real-time answer with evidence. $0.01 per check via x402 or Stripe MPP. Price is $0.01 USDC on Base per request.

The 402 response includes a payment-required header (x402 v2, Stripe deposit address, USDC on Base).

{
  "x402Version": 2,
  "error": "PAYMENT-SIGNATURE header is required",
  "resource": {
    "url": "http://livecheck.fly.dev/v1/verify",
    "description": "Live status checks for AI agents. Is this product still available or sold out (Shopify, eBay)? Is this job posting still open (Greenhouse, Lever, Ashby, Workday)? Real-time answer with evidence. $0.01 per check via x402 or Stripe MPP.",
    "mimeType": "application/json",
    "serviceName": "Livecheck",
    "tags": [
      "listing-status",
      "product-availability",
      "job-postings",
      "ecommerce",
      "web-monitoring"
    ]
  },
  "accepts": [
    {
      "scheme": "exact",
      "network": "eip155:8453",
      "amount": "10000",
      "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
      "payTo": "0x33693228b706cb30f4b4dbf35f79129a763f91c5",
      "maxTimeoutSeconds": 60,
      "extra": {
        "name": "USD Coin",
        "version": "2"
      }
    }
  ],
  "extensions": {
    "bazaar": {
      "info": {
        "input": {
          "type": "http",
          "bodyType": "json",
          "body": {
            "url": "https://boards.greenhouse.io/example/jobs/1842"
          },
          "method": "POST"
        },
        "output": {
          "type": "json",
          "example": {
            "url": "https://boards.greenhouse.io/example/jobs/1842",
            "canonical_url": "https://boards.greenhouse.io/example/jobs/1842",
            "status": "live",
            "http_status": 200,
            "checked_at": "2026-08-30T21:00:00Z",
            "title": "Staff Backend Engineer — Northwind Labs",
            "signals": [
              "apply form present",
              "no closure banner"
            ],
            "confidence": 0.92,
            "price_usd": 0.01,
            "route": "verify"
          }
        }
      },
      "schema": {
        "$schema": "https://json-schema.org/draft/2020-12/schema",
        "type": "object",
        "properties": {
          "input": {
            "type": "object",
            "additionalProperties": false,
            "properties": {
              "type": {
                "type": "string",
                "const": "http"
              },
              "method": {
                "type": "string",
                "enum": [
                  "POST"
                ]
              },
              "bodyType": {
                "type": "string",
                "enum": [
                  "json",
                  "form-data",
                  "text"
                ]
              },
              "body": {
                "properties": {
                  "url": {
                    "type": "string",
                    "description": "Absolute http(s) URL of the specific job, product, or eBay item page to check. Not a search-results URL."
                  },
                  "stale_after_days": {
                    "type": "number",
                    "description": "Job postings: age in days after which age.stale_age is true. Default 60, clamped to 7–365. Does not change status or confidence."
                  }
                },
                "required": [
                  "url"
                ]
              }
            },
            "required": [
              "type",
              "method",
              "bodyType",
              "body"
            ]
          },
          "output": {
            "type": "object",
            "properties": {
              "type": {
                "type": "string"
              },
              "example": {
                "type": "object",
                "properties": {
                  "url": {
                    "type": "string"
                  },
                  "canonical_url": {
                    "type": "string"
                  },
                  "status": {
                    "type": "string",
                    "enum": [
                      "live",
                      "closed",
                      "unknown"
                    ]
                  },
                  "label": {
                    "type": "string",
                    "enum": [
                      "backorder",
                      "in_stores_only"
                    ],
                    "description": "Optional label adds detail to a live result. backorder: can be ordered now, ships later. in_stores_only: not purchasable online, so agents completing an online purchase should treat it as unavailable."
                  },
                  "http_status": {
                    "type": "number"
                  },
                  "checked_at": {
                    "type": "string"
                  },
                  "title": {
                    "type": "string"
                  },
                  "signals": {
                    "type": "array",
                    "items": {
                      "type": "string"
                    }
                  },
                  "confidence": {
                    "type": "number"
                  },
                  "price_usd": {
                    "type": "number"
                  },
                  "message": {
                    "type": "string",
                    "description": "Set when the URL is a job board or careers index instead of one posting. Ask for a single posting URL. Omitted on live and closed answers."
                  },
                  "route": {
                    "type": "string",
                    "description": "API path that produced this response, after /v1/ and without a leading slash.",
                    "enum": [
                      "verify",
                      "verify/job",
                      "verify/listing"
                    ]
                  },
                  "watch": {
                    "type": "object",
                    "description": "Present on paid 200 Confirm responses, and on paid 200 Verify responses only when status is live (omitted on closed and unknown). Cross-sell hint to POST /v1/watch ($2.50, 30-day standard watcher). Default detector is status_change. Not included on unpaid 402.",
                    "properties": {
                      "suggest": {
                        "type": "string",
                        "enum": [
                          "/v1/watch"
                        ]
                      },
                      "detector": {
                        "type": "string",
                        "enum": [
                          "status_change"
                        ]
                      },
                      "price_usd": {
                        "type": "number"
                      }
                    },
                    "required": [
                      "suggest",
                      "detector",
                      "price_usd"
                    ]
                  },
                  "paid_with": {
                    "type": "string",
                    "enum": [
                      "free_credit"
                    ],
                    "description": "Set to free_credit when a starter key paid for the call. price_usd is then 0."
                  },
                  "credits_remaining": {
                    "type": "number",
                    "description": "Starter-key free checks left after this call."
                  },
                  "credit_used": {
                    "type": "boolean",
                    "description": "Whether this call used one starter-key credit."
                  },
                  "age": {
                    "type": "object",
                    "description": "Job postings only. How long the posting has been up, from the hiring platform's first-posted date (or the page's JSON-LD datePosted). Context only: never changes status or confidence. Never taken from a last-updated date; unknown when there is no posted date.",
                    "properties": {
                      "posted_at": {
                        "type": [
                          "string",
                          "null"
                        ]
                      },
                      "age_days": {
                        "type": [
                          "number",
                          "null"
                        ]
                      },
                      "age_days_min": {
                        "type": "number",
                        "description": "Lower bound when only \"30+ days\" is known (Workday)."
                      },
                      "age_source": {
                        "type": "string",
                        "enum": [
                          "greenhouse.first_published",
                          "greenhouse.published_at",
                          "ashby.publishedAt",
                          "lever.createdAt",
                          "workday.startDate",
                          "workday.postedOn_text",
                          "jsonld.datePosted",
                          "none"
                        ]
                      },
                      "age_precision": {
                        "type": "string",
                        "enum": [
                          "exact",
                          "day",
                          "at_least",
                          "unknown"
                        ]
                      },
                      "age_bucket": {
                        "type": "string",
                        "enum": [
                          "0-7",
                          "8-30",
                          "31-60",
                          "61-90",
                          "90+",
                          "30+",
                          "unknown"
                        ]
                      },
                      "stale_age": {
                        "type": [
                          "boolean",
                          "null"
                        ],
                        "description": "age_days >= stale_after_days (default 60: \"60 and up\"); null when unknown."
                      },
                      "stale_after_days": {
                        "type": "number"
                      },
                      "last_updated_at": {
                        "type": "string",
                        "description": "ATS last-updated date. Not the posted date."
                      },
                      "note": {
                        "type": "string"
                      }
                    },
                    "required": [
                      "posted_at",
                      "age_days",
                      "age_source",
                      "age_precision",
                      "age_bucket",
                      "stale_age",
                      "stale_after_days"
                    ]
                  }
                },
                "required": [
                  "url",
                  "canonical_url",
                  "status",
                  "http_status",
                  "checked_at",
                  "signals",
                  "confidence",
                  "price_usd",
                  "route"
                ]
              }
            },
            "required": [
              "type"
            ]
          }
        },
        "required": [
          "input"
        ]
      }
    }
  }
}

Example 402 (decoded)

Header value is base64. Decoded shape:

{
  "x402Version": 2,
  "error": "PAYMENT-SIGNATURE header is required",
  "resource": {
    "url": "http://livecheck.fly.dev/v1/verify",
    "description": "Live status checks for AI agents. Is this product still available or sold out (Shopify, eBay)? Is this job posting still open (Greenhouse, Lever, Ashby, Workday)? Real-time answer with evidence. $0.01 per check via x402 or Stripe MPP.",
    "mimeType": "application/json",
    "serviceName": "Livecheck",
    "tags": [
      "listing-status",
      "product-availability",
      "job-postings",
      "ecommerce",
      "web-monitoring"
    ]
  },
  "accepts": [
    {
      "scheme": "exact",
      "network": "eip155:8453",
      "amount": "10000",
      "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
      "payTo": "0x33693228b706cb30f4b4dbf35f79129a763f91c5",
      "maxTimeoutSeconds": 60,
      "extra": {
        "name": "USD Coin",
        "version": "2"
      }
    }
  ],
  "extensions": {
    "bazaar": {
      "info": {
        "input": {
          "type": "http",
          "bodyType": "json",
          "body": {
            "url": "https://boards.greenhouse.io/example/jobs/1842"
          },
          "method": "POST"
        },
        "output": {
          "type": "json",
          "example": {
            "url": "https://boards.greenhouse.io/example/jobs/1842",
            "canonical_url": "https://boards.greenhouse.io/example/jobs/1842",
            "status": "live",
            "http_status": 200,
            "checked_at": "2026-08-30T21:00:00Z",
            "title": "Staff Backend Engineer — Northwind Labs",
            "signals": [
              "apply form present",
              "no closure banner"
            ],
            "confidence": 0.92,
            "price_usd": 0.01,
            "route": "verify"
          }
        }
      },
      "schema": {
        "$schema": "https://json-schema.org/draft/2020-12/schema",
        "type": "object",
        "properties": {
          "input": {
            "type": "object",
            "additionalProperties": false,
            "properties": {
              "type": {
                "type": "string",
                "const": "http"
              },
              "method": {
                "type": "string",
                "enum": [
                  "POST"
                ]
              },
              "bodyType": {
                "type": "string",
                "enum": [
                  "json",
                  "form-data",
                  "text"
                ]
              },
              "body": {
                "properties": {
                  "url": {
                    "type": "string",
                    "description": "Absolute http(s) URL of the specific job, product, or eBay item page to check. Not a search-results URL."
                  },
                  "stale_after_days": {
                    "type": "number",
                    "description": "Job postings: age in days after which age.stale_age is true. Default 60, clamped to 7–365. Does not change status or confidence."
                  }
                },
                "required": [
                  "url"
                ]
              }
            },
            "required": [
              "type",
              "method",
              "bodyType",
              "body"
            ]
          },
          "output": {
            "type": "object",
            "properties": {
              "type": {
                "type": "string"
              },
              "example": {
                "type": "object",
                "properties": {
                  "url": {
                    "type": "string"
                  },
                  "canonical_url": {
                    "type": "string"
                  },
                  "status": {
                    "type": "string",
                    "enum": [
                      "live",
                      "closed",
                      "unknown"
                    ]
                  },
                  "label": {
                    "type": "string",
                    "enum": [
                      "backorder",
                      "in_stores_only"
                    ],
                    "description": "Optional label adds detail to a live result. backorder: can be ordered now, ships later. in_stores_only: not purchasable online, so agents completing an online purchase should treat it as unavailable."
                  },
                  "http_status": {
                    "type": "number"
                  },
                  "checked_at": {
                    "type": "string"
                  },
                  "title": {
                    "type": "string"
                  },
                  "signals": {
                    "type": "array",
                    "items": {
                      "type": "string"
                    }
                  },
                  "confidence": {
                    "type": "number"
                  },
                  "price_usd": {
                    "type": "number"
                  },
                  "message": {
                    "type": "string",
                    "description": "Set when the URL is a job board or careers index instead of one posting. Ask for a single posting URL. Omitted on live and closed answers."
                  },
                  "route": {
                    "type": "string",
                    "description": "API path that produced this response, after /v1/ and without a leading slash.",
                    "enum": [
                      "verify",
                      "verify/job",
                      "verify/listing"
                    ]
                  },
                  "watch": {
                    "type": "object",
                    "description": "Present on paid 200 Confirm responses, and on paid 200 Verify responses only when status is live (omitted on closed and unknown). Cross-sell hint to POST /v1/watch ($2.50, 30-day standard watcher). Default detector is status_change. Not included on unpaid 402.",
                    "properties": {
                      "suggest": {
                        "type": "string",
                        "enum": [
                          "/v1/watch"
                        ]
                      },
                      "detector": {
                        "type": "string",
                        "enum": [
                          "status_change"
                        ]
                      },
                      "price_usd": {
                        "type": "number"
                      }
                    },
                    "required": [
                      "suggest",
                      "detector",
                      "price_usd"
                    ]
                  },
                  "paid_with": {
                    "type": "string",
                    "enum": [
                      "free_credit"
                    ],
                    "description": "Set to free_credit when a starter key paid for the call. price_usd is then 0."
                  },
                  "credits_remaining": {
                    "type": "number",
                    "description": "Starter-key free checks left after this call."
                  },
                  "credit_used": {
                    "type": "boolean",
                    "description": "Whether this call used one starter-key credit."
                  },
                  "age": {
                    "type": "object",
                    "description": "Job postings only. How long the posting has been up, from the hiring platform's first-posted date (or the page's JSON-LD datePosted). Context only: never changes status or confidence. Never taken from a last-updated date; unknown when there is no posted date.",
                    "properties": {
                      "posted_at": {
                        "type": [
                          "string",
                          "null"
                        ]
                      },
                      "age_days": {
                        "type": [
                          "number",
                          "null"
                        ]
                      },
                      "age_days_min": {
                        "type": "number",
                        "description": "Lower bound when only \"30+ days\" is known (Workday)."
                      },
                      "age_source": {
                        "type": "string",
                        "enum": [
                          "greenhouse.first_published",
                          "greenhouse.published_at",
                          "ashby.publishedAt",
                          "lever.createdAt",
                          "workday.startDate",
                          "workday.postedOn_text",
                          "jsonld.datePosted",
                          "none"
                        ]
                      },
                      "age_precision": {
                        "type": "string",
                        "enum": [
                          "exact",
                          "day",
                          "at_least",
                          "unknown"
                        ]
                      },
                      "age_bucket": {
                        "type": "string",
                        "enum": [
                          "0-7",
                          "8-30",
                          "31-60",
                          "61-90",
                          "90+",
                          "30+",
                          "unknown"
                        ]
                      },
                      "stale_age": {
                        "type": [
                          "boolean",
                          "null"
                        ],
                        "description": "age_days >= stale_after_days (default 60: \"60 and up\"); null when unknown."
                      },
                      "stale_after_days": {
                        "type": "number"
                      },
                      "last_updated_at": {
                        "type": "string",
                        "description": "ATS last-updated date. Not the posted date."
                      },
                      "note": {
                        "type": "string"
                      }
                    },
                    "required": [
                      "posted_at",
                      "age_days",
                      "age_source",
                      "age_precision",
                      "age_bucket",
                      "stale_age",
                      "stale_after_days"
                    ]
                  }
                },
                "required": [
                  "url",
                  "canonical_url",
                  "status",
                  "http_status",
                  "checked_at",
                  "signals",
                  "confidence",
                  "price_usd",
                  "route"
                ]
              }
            },
            "required": [
              "type"
            ]
          }
        },
        "required": [
          "input"
        ]
      }
    }
  }
}

Encoded header starts eyJ4NDAyVmVyc2lvbiI6MiwiZXJyb3IiOiJQQVlNRU5ULVNJ…

Example verify JSON

{
  "url": "https://boards.greenhouse.io/northwind/jobs/1842",
  "canonical_url": "https://boards.greenhouse.io/northwind/jobs/1842",
  "status": "live",
  "http_status": 200,
  "checked_at": "2026-08-30T21:00:00Z",
  "title": "Staff Backend Engineer — Northwind Labs",
  "signals": [
    "apply form present",
    "no closure banner"
  ],
  "confidence": 0.92,
  "price_usd": 0.01,
  "route": "verify"
}

Local fixtures

Served by this process so you can exercise the classifier without the open web.

curl

curl -iv http://livecheck.fly.dev/v1/verify -H 'content-type: application/json' \
  -d '{"url":"https://boards.greenhouse.io/example/jobs/1"}'

# Real funds: Stripe's purl client from the x402 docs
purl http://livecheck.fly.dev/v1/verify -H 'content-type: application/json' \
  -d '{"url":"https://boards.greenhouse.io/example/jobs/1"}'

Confirm for operators

How do you know the agent actually did it?

A success toast and a calendar invite aren’t proof. Livecheck Confirm checks the real-world result — independently.

Watch the Confirm demo.

Live stats

Includes internal test traffic. Headline watchers, checks, and confirm windows are all wallets. traffic.external omits configured team wallets.

Source of truth: GET /stats?format=json (https://livecheck.fly.dev/stats?format=json). That document is the serving machine's SQLite. unique_payers is a distinct count on that file, not a sum across volumes. Gil owns landing copy — this strip only fetches that JSON.

Loading /stats?format=json…