For people and AI agents
Submit a custom observation request
Waterbear Microscope is collecting requests to understand interest in a planned remote microscopy service. Requests are stored for possible human review; submission does not guarantee a review or reply.
What is available now
- The only public capability is submitting a private custom observation request.
- No live microscope is currently available for public operation or booking. This endpoint cannot control equipment or start an experiment.
- Service and China collection pages show planning price assumptions only. A submission is not an accepted job, a confirmed price, or a booking. No payment is collected.
- An agent may submit a user approved interest in a planned service or sample project. It cannot authorize payment or accept an experiment on the user's behalf.
- There is no public API for reading, searching, or deleting requests.
See Services & Pricing and China Under the Microscope for current planning assumptions and sample status.
Endpoint and headers
Method: POST
URL: https://waterbear-microscope.pages.dev/api/demands
Headers: Content-Type: application/json, a descriptive User-Agent, and a unique Idempotency-Key.
The body limit is 8,192 bytes. Send one request only after the user has explicitly approved it. The endpoint is anonymous and intended for low-volume demand validation, not bulk submissions or unattended agent loops.
Cloudflare applies Browser Integrity Check to pages.dev. Use a descriptive client identity such as MyObservationAgent/1.0; do not rely on the default Python-urllib user agent, which can receive Cloudflare error 1010. You do not need to impersonate a browser.
JSON fields
sample: required non-empty string, up to 300 characters.conditions: required non-empty string, up to 2,000 characters. Use"Not specified"if unknown.desired_result: required non-empty string, up to 2,000 characters. Use"Not specified"if unknown.budget: required non-empty string, up to 200 characters. Use"Not specified"if unknown; a request does not confirm this budget or a price.email: optional string, up to 254 characters, checked for basic email format. It is needed for a quote request so a person can reply.quote_requested: optional boolean. Only the JSON booleantruerequests a quote; when true, a validemailis required.interest: optional string, up to 64 characters. It categorizes a user's interest and does not accept a booking or payment.
Accepted interest values are 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, and ordinary_paper_comparison. Omit the field for an ordinary custom request.
Do not send browser-form anti-spam fields. Safety keyword filters reject terms associated with clinical or human samples, pathogens, radioactive or explosive materials, weapons, regulated substances, toxins, some culture work, and BSL-3/4 work. Passing those filters does not bypass human safety review.
Example request
The values below are illustrative only. Sending this JSON creates a real private request; replace it with a user-approved request before calling the endpoint.
POST /api/demands HTTP/1.1
Host: waterbear-microscope.pages.dev
Content-Type: application/json
User-Agent: MyObservationAgent/1.0
Idempotency-Key: wm-request-550e8400-e29b-41d4-a716-446655440000
{
"sample": "User-approved sample name and observation question",
"conditions": "Not specified",
"desired_result": "What the user hopes to learn",
"budget": "Not specified",
"interest": "custom_observation"
}
Idempotency and limits
Generate a new random key for each user-approved request and reuse that same key for retries of that request. Keys must be 8–100 characters and contain only letters, numbers, periods, underscores, colons, or hyphens. Repeating the key with the same normalized request returns the prior success without saving another row. Reusing it with different content returns a conflict.
- At most 5 validated, non-duplicate POST attempts per source IP in each fixed UTC hour.
- At most 200 accepted requests across the site per UTC day.
- Duplicate idempotent retries are checked before the per-IP limit.
Responses
201: saved for review;{"received":true,"duplicate":false,"status":"PENDING_REVIEW"}.200: the same request was already saved;duplicateis true.409: the idempotency key was already used with different request content.400: malformed JSON, invalid fields/key or interest code, a missing quote email, or a rejected browser-form honeypot value.405: method not allowed. OnlyPOSTandOPTIONSare supported.413: request body exceeds 8,192 bytes.415: content type is notapplication/json.422: request was rejected by a safety filter.429: per-IP or site-wide request limit reached.503: storage or service configuration is unavailable; no request was confirmed as saved.403with Cloudflare error 1010: the client user agent was blocked before the Function ran; use a descriptive application user agent.
Every POST response includes received. Treat only a successful response with received: true as confirmation that the request was recorded. This is not confirmation that the observation can be performed.
Privacy and fees
Request details and email are stored privately for operator review and are not readable through a public endpoint. Email is required only when the user asks for a quote or reply. Displayed test prices are not offers; submitting a request is free, and no work, charge, or payment permission is confirmed until a person reviews the request and replies.
Questions about personal information: e76750773@gmail.com. Read the Privacy notice and Terms.