# Waterbear Microscope for agents

Waterbear Microscope accepts free observation requests for human review. `payment_supported: false` and `device_operation_available: false`: payment and live device control are planned but unavailable. There is no public booking, device, payment, or request-reading operation.

## Consent is required

Before calling the API, show the user the complete request body, the destination (`https://waterbear-microscope.pages.dev/api/demands`), and any email address that will be shared. Get explicit user consent to submit that request and share the email. Do not submit examples, inferred details, or a changed request without consent. Submission is free and does not create a booking, confirm a quote, or guarantee a reply.

## Submit a request

Send one JSON `POST` to `https://waterbear-microscope.pages.dev/api/demands`. No account or API token is used. Include `Content-Type: application/json` and a fresh `Idempotency-Key` containing 8–100 ASCII letters, digits, periods, underscores, colons, or hyphens.

```http
POST /api/demands HTTP/1.1
Host: waterbear-microscope.pages.dev
Content-Type: application/json
Idempotency-Key: obs-7d64a90e-1834-43cc-8c84-9b46537a53bc
User-Agent: YourAgentName/1.0

{
  "sample": "User-approved leaf sample",
  "conditions": "Not specified",
  "desired_result": "Observe surface structure",
  "budget": "Not specified"
}
```

The request body must be at most 8192 UTF-8 bytes. The required string fields are `sample` (maximum 300 characters), `conditions` (2000), `desired_result` (2000), and `budget` (200). Values are trimmed and Unicode NFC normalized; field lengths count JavaScript UTF-16 code units, and each value must remain nonempty. Use `"Not specified"` when the user has no value for a required field.

Optional fields:

- `email` (maximum 254 characters): include only an address the user approved sharing.
- `quote_requested` (boolean): when `true`, a valid email is required. This records quote interest only; it does not create a quote.
- `interest` (maximum 64 characters): one of `free_explore`, `fresh_capture`, `china_collection_observation`, `custom_observation`, `multi_condition_experiment`, `shanghai_moss_safari`, `moss_microcosm`, `tardigrade_search`, `chinese_bracket_fungus`, `chinese_tea`, `spices_under_the_microscope`, `common_plant_leaf`, `legal_special_plant`, `chinese_silk`, `xuan_paper`, `traditional_fibers`, or `ordinary_paper_comparison`.
- `result` and `contact`: legacy aliases for `desired_result` and `email`. Prefer the current field names.

Omit `website`; it is a spam honeypot and a nonempty value is rejected. Other unrecognized fields are ignored. Do not send credentials, payment information, device commands, clinical or human samples, hazardous materials, or culture requests. A safety rejection must not be bypassed. Passing the automated screen is not a safety approval; a person still reviews feasibility and handling.

## Idempotency and limits

Reuse the same key and unchanged approved body after an uncertain network result. Reusing a key with changed normalized content returns `409`. Do not rotate keys to bypass limits. The endpoint allows at most 5 validated nonduplicate attempts per IP in a fixed UTC hour and 200 saved requests globally per UTC day. Identical retries are checked before the rate limit.

## Responses

- `201` with `received: true`: the request was saved for review.
- `200` with `duplicate: true`: the same request was already saved.
- `400`: malformed request, invalid fields or key, or a quote request without a valid email.
- `405`, `413`, or `415`: unsupported method, body larger than 8192 bytes, or wrong content type.
- `409`: the idempotency key was already used with different content.
- `422`: safety screening rejected the request. Do not retry with altered wording to evade screening.
- `429`: hourly or daily limit reached. Wait; do not loop or change IPs.
- `503`: saving was not confirmed. Retry later only with the same key and body.

Only a `200` or `201` response with `received: true` confirms receipt. The status is `PENDING_REVIEW`; it does not confirm feasibility, availability, price, booking, observation, or delivery. Cloudflare may also reject a request before this Function runs.

## Capabilities

- `request_submission_supported: true` — free submission for human review.
- `payment_supported: false` — payment is planned but unavailable.
- `device_operation_available: false` — live device control is planned but unavailable.

The only public API operation is `POST /api/demands`. There is no public list, read, status, checkout, payment, or device-control API. See [openapi.json](https://waterbear-microscope.pages.dev/openapi.json), [llms.txt](https://waterbear-microscope.pages.dev/llms.txt), and the [Waterbear Microscope Skill](https://waterbear-microscope.pages.dev/skills/waterbear-microscope/SKILL.md).
