# Retail Availability — What published price and stock evidence exists for this product and observed variants?

Published product/variant offers and availability evidence.

- Capability id: `product.check`
- Actor: `impressionable_lupine/verified-retail-availability` (ID `1Huevg4n0rTdCWySV`), default build `0.2.4`
- Apify Store: https://apify.com/impressionable_lupine/verified-retail-availability
- Page: https://agents.retainly.dev/capabilities/retail-availability
- Last metadata check: 2026-10-08T12:16:53.713706+00:00 (read-only; not live status)

## Workflow

Commerce agents can compare dated offers and refresh availability before recommending a product.

Simpler alternative: If the retailer offers a product API or feed you already use, call it directly. Choose this for a dated, source-hashed offer snapshot of one product page.

Do not choose for:
- Buying the product or guaranteeing checkout stock
- Inferring every variant is in stock from a group offer
- Exhaustive retailer discovery or review analysis

## Input

| Field | Required | Constraints | Description |
|---|---|---|---|
| `product_url` | yes | required, string | HTTPS URL for one product page, not a collection, search, cart, or account page. |

Minimal valid input:

```json
{
  "product_url": "https://www.allbirds.com/products/mens-tree-runners-wheat-dark-beige"
}
```

Input schema: https://agents.retainly.dev/schemas/retail-availability/input_schema.json
Report schema: https://agents.retainly.dev/schemas/retail-availability/report.schema.json

## Price and charge trigger

- Model: PAY_PER_EVENT, event `verified-product-check` (“Verified product check”), $0.01 USD, max 1 event per run.
- Store event description (verbatim): “Charged once for a source-checked public product price and availability result. Unknown results are free.”
- Charge trigger: One event for a verified offer report, even if some variants are missing or out of stock.
- No event when: unknown and invalid_input produce no event.
- Standard Actor platform usage included under the configuration checked on 8 Oct 2026; recheck before purchase.
- Caps are not discounts and do not guarantee a positive result. Unknown/invalid checks produce no eligible report event; caller model/workflow costs are separate.

## Statuses

| Status | Meaning | Eligible report event |
|---|---|---|
| `verified` | A verified offer report from checked product structured data or supported variant metadata. Some variants may be missing or out of stock. | yes |
| `unknown` | No offer could be verified on the checked product page. | no |
| `invalid_input` | Fix the caller input (one HTTPS product page, not a collection, search, cart or account page). | no |

## Evidence and limits

- Verification scope: Checked product structured data and supported public variant metadata. Product-group and variant offers retain distinct scope.
- Coverage limits: Group stock does not prove every variant is available. Missing variant price stays null; regional checkout price and purchase completion are not tested.
- Request bounds: 3 requests, 4 MB total, 3 MB per page, 20-second network budget.

## Recorded example

Recorded example — observed 2026-10-08 11:45 UTC · owner-funded release test · not an independent purchase.
Subject: Allbirds product page. Run `AK3PgR7XTcM3EnCSG`, build 0.2.4. Reports may precede final event charging; their billing fields alone do not establish a settled debit.
Full report with provenance: https://agents.retainly.dev/examples/retail-availability.json

Input used:

```json
{
  "product_url": "https://www.allbirds.com/products/mens-tree-runners-wheat-dark-beige"
}
```

## Call it (after the caller authorizes spending)

Connecting does not authorize spending. Inspecting metadata never starts a run.

Inspect without purchase (MCP, anonymous endpoint `https://mcp.apify.com?tools=search-actors,fetch-actor-details`):

```json
{
  "name": "fetch-actor-details",
  "arguments": {
    "actor": "impressionable_lupine/verified-retail-availability",
    "output": {
      "pricing": true,
      "inputSchema": true,
      "outputSchema": true,
      "metadata": true,
      "readme": true
    }
  }
}
```

Inspect without purchase (REST, no token):

```bash
# Free, read-only: public Actor metadata (pricing, builds). Does not start a run.
curl "https://api.apify.com/v2/acts/1Huevg4n0rTdCWySV"
```

MCP `call-actor` (endpoint `https://mcp.apify.com?tools=actors,runs,storage`; run limits live in `callOptions`, never in `input`):

```json
{
  "name": "call-actor",
  "arguments": {
    "actor": "impressionable_lupine/verified-retail-availability",
    "input": {
      "product_url": "https://www.allbirds.com/products/mens-tree-runners-wheat-dark-beige"
    },
    "waitSecs": 30,
    "callOptions": {
      "build": "0.2.4",
      "memory": 512,
      "timeout": 60,
      "maxTotalChargeUsd": 0.01
    }
  }
}
```

MCP follow-ups (same run):

```json
{
  "name": "get-actor-run",
  "arguments": {
    "runId": "<runId returned by call-actor>"
  }
}
```

```json
{
  "name": "get-dataset-items",
  "arguments": {
    "datasetId": "<datasetId returned by call-actor>",
    "clean": true
  }
}
```

REST API v2:

```bash
# Paid run in YOUR Apify account. Only after spending is authorized.
# Set APIFY_TOKEN securely in your client/shell; never paste it into URLs or shared files.
curl -X POST "https://api.apify.com/v2/acts/1Huevg4n0rTdCWySV/runs?build=0.2.4&memory=512&timeout=60&maxTotalChargeUsd=0.01&waitForFinish=30" \
  -H "Authorization: Bearer $APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"product_url":"https://www.allbirds.com/products/mens-tree-runners-wheat-dark-beige"}'
```

```bash
# Save data.id (run ID) from the first response. On timeout/ambiguity, poll THIS run.
# Never start a second charged run to recover output.
curl "https://api.apify.com/v2/actor-runs/$RUN_ID" \
  -H "Authorization: Bearer $APIFY_TOKEN"
```

```bash
# data.defaultDatasetId from the run object (one report item).
curl "https://api.apify.com/v2/datasets/$DATASET_ID/items?format=json&clean=true" \
  -H "Authorization: Bearer $APIFY_TOKEN"
```

Recovery rule: Save the run ID from the first response; on timeout or ambiguous response, poll that same run; never start a second charged run to recover output.
