The OptiLearn docs. Camera to settlement, on one page.
How bounties, review, payouts and provenance work, what to capture and how, and the public API. Written for contributors and for the labs that license the data.
- Settles on
- Robinhood ChainChain ID 4663
- Paid in
- 35 stock tokensPriced by Chainlink
- Provenance
- OP MainnetEAS attestations
- Review
- A person, every timeUsually inside a day
- Data types
- Five modalitiesVideo, audio, image, text, sensor
- Contributor fees
- NonePayout gas is covered
Overview. What OptiLearn is.
OptiLearn is a data marketplace for AI and robotics. People film everyday tasks from their own point of view, or upload audio, photos, written procedures and phone sensor logs, and AI labs license the result.
Robots learn to manipulate the world by watching it being done, and first-person footage of real work barely exists at scale. OptiLearn posts bounties for the specific data labs are asking for. A person reviews every submission against a published capture standard. Approved work is paid in tokenized stock on Robinhood Chain, and each approved contribution gets an attestation on OP Mainnet so a buyer can check where every file came from.
Film or upload against an open bounty, pass human review, and choose which stock token the reward is paid in. No fee and nothing to fund.
License reviewed, consented datasets for manipulation, perception and planning, with a provenance record for every item.
Rewards settle on Robinhood Chain. Provenance is attested on OP Mainnet. $LEARN is the network token.
Powered by Optimism. Provenance lives on OP Mainnet through the Ethereum Attestation Service, so it is public, permanent and independent of OptiLearn's own servers.
How it works. Four steps, camera to settlement.
Every submission follows the same path. Nothing moves to the next step without a person looking at it.
- 1Connect a wallet or paste an addressSign in with a wallet, or with email and we create a wallet for you through Privy. You can also paste any EVM address. That address is where rewards are sent. There is no password to set and nothing to fund.
- 2Pick a bounty and captureChoose an open bounty, read its brief, then record in the browser or upload a file you already made. One task per submission, filmed or recorded by you.
- 3Human reviewA reviewer checks the submission against the capture standard and the bounty brief, gives it a score, and sets a reward in US dollars inside the bounty's range. This usually happens inside a day.
- 4Settlement and attestationThe dollar reward is converted into the stock token you picked at the Chainlink price and sent to your address on Robinhood Chain, after a person checks the payout. The contribution is attested on OP Mainnet. Track every step in Portfolio.
Bounties and how they become datasets.
A bounty is an open request for one kind of data, written against a real buyer need. Pick one, follow its brief, get paid when it clears review.
Each bounty has a brief, an accepted length, a pay range in US dollars and a target count. It feeds exactly one dataset in the marketplace, and it closes when the dataset has the approved items it needs. There are 17 bounties open across video, audio, images, text and sensor logs.
Tiers
The same review applies across the range. What changes is how hard the task is to capture well, and what it pays.
| Tier | Name | What it covers | Length | Pay per item |
|---|---|---|---|---|
| T1 | Household | Everyday tasks in your own home | 5–60 s | $2–$4 |
| T2 | Care and outdoors | Hands-on work with living things | 10–60 s | $4–$7 |
| T3 | Skilled trades | Tool use with a real outcome | 15–60 s | $8–$15 |
- T1Household
- What it covers
- Everyday tasks in your own home
- Length
- 5–60 s
- Pay per item
- $2–$4
- T2Care and outdoors
- What it covers
- Hands-on work with living things
- Length
- 10–60 s
- Pay per item
- $4–$7
- T3Skilled trades
- What it covers
- Tool use with a real outcome
- Length
- 15–60 s
- Pay per item
- $8–$15
Video lengths above are for video bounties. Audio, image, text and sensor bounties carry a tier too, with their own length rules and pay range shown on each bounty page. The exact reward is set at review, inside the range.
From bounty to dataset
Every approved item lands in one dataset. This is the full map as it stands today.
- Household ManipulationVideo, commercial license
- Skilled TradesVideo, exclusive license
- Care and OutdoorsVideo, commercial license
- Retail and WarehouseVideo, commercial license
- Everyday AudioAudio, research license
- Object ViewsImages, commercial license
- Task ProceduresText, research license
- Motion SensorsSensors, research license
Capture standard. One sheet, eight lines.
This is exactly what review checks. Submissions that meet it clear first time; the ones that miss a line are the only ones that come back.
- 01FramingFirst person, camera held or worn at eye level, both hands in frame for the whole task.Photos: the object fills most of the frame, on a plain surface.
- 02DurationOne task per submission, inside the bounty’s length range. Video runs 5 to 60 seconds.Audio 10 to 120 s. Sensor logs 30 to 300 s. Text 150 to 600 words.
- 03Resolution1080p or better, 30 fps or better.Photos 2000 px on the short edge. Audio 44.1 kHz. Sensors 50 Hz or faster.
- 04LightingEven enough that hands, tools and the object stay readable from start to finish.Audio: no clipping, no music, and no speech unless the brief asks for it.
- 05SubjectsYour own space. No other people, faces, screens or documents in shot.Text: no names, addresses or personal details of anyone, including you.
- 06AudioOptional on video. It is stripped before a clip enters a dataset.On audio bounties the recording is the data, so keep voices out.
- 07FormatStraight from the device. No edits, filters, speed changes or overlays.Accepted files and size limits are listed under Data types.
- 08ReviewChecked by a person against this sheet and the bounty brief.Scored 0 to 100. The score sets where the reward lands in the range.
Data types. Five modalities, one review.
Upload the original file from the device that made it. Anything outside these formats or limits is rejected at upload, before it reaches review.
| Modality | Formats | Max size | Notes |
|---|---|---|---|
| Video | MP4, MOV | 300 MB | As recorded. In-browser recordings arrive as WebM, which is also accepted. |
| Audio | WAV, M4A, MP3 | 100 MB | 44.1 kHz or better. WAV preferred; FLAC, OGG and WebM also accepted. |
| Image | JPG, PNG, HEIC | 25 MB | Per file, or one .zip for a multi-angle set. WebP also accepted. |
| Text | TXT, MD | 2 MB | UTF-8. Plain steps in your own words, 150 to 600 words. |
| Sensor | CSV, JSON | 50 MB | Timestamped rows, one sample per row, units stated. |
- Video
- Formats
- MP4, MOV
- Max size
- 300 MB
- Notes
- As recorded. In-browser recordings arrive as WebM, which is also accepted.
- Audio
- Formats
- WAV, M4A, MP3
- Max size
- 100 MB
- Notes
- 44.1 kHz or better. WAV preferred; FLAC, OGG and WebM also accepted.
- Image
- Formats
- JPG, PNG, HEIC
- Max size
- 25 MB
- Notes
- Per file, or one .zip for a multi-angle set. WebP also accepted.
- Text
- Formats
- TXT, MD
- Max size
- 2 MB
- Notes
- UTF-8. Plain steps in your own words, 150 to 600 words.
- Sensor
- Formats
- CSV, JSON
- Max size
- 50 MB
- Notes
- Timestamped rows, one sample per row, units stated.
Sensor logs
Export accelerometer and gyroscope readings from any logging app. Put a header row first, time in milliseconds from the start in the first column, acceleration in m/s² and rotation in rad/s. JSON uploads should be an array of objects with the same keys.
t_ms,ax,ay,az,gx,gy,gz
0,0.118,-9.793,0.342,0.002,-0.011,0.004
10,0.121,-9.801,0.337,0.003,-0.010,0.004
20,0.164,-9.786,0.351,0.019,-0.008,0.006The file type is checked twice, by extension and by its contents, and every file is fingerprinted with SHA-256 on upload. Resubmitting a file that is already in review or approved is refused as a duplicate.
Review. A person, every time.
Every submission is watched, listened to or read in full by a person on the OptiLearn team before anything is paid.
What a reviewer checks
- The brief. It shows the task the bounty asked for, from start to finish, and only that task.
- The standard. Each of the eight lines in the capture standard, in order.
- Originality. You made it, recently, and it has not been submitted before by you or anyone else.
- Consent. The consent box was ticked for this submission and the file matches what was described.
What gets rejected
- Other people's faces or voices, or anything showing screens, mail, ID cards or addresses.
- Edited, filtered, sped up, stitched or screen-recorded files.
- Footage you did not record yourself, including anything downloaded or AI generated.
- Duplicates and near duplicates of earlier submissions.
- Hands or the object out of frame for most of the task, or too dark or shaky to follow.
- A different task from the one the bounty describes.
Status and turnaround
Review usually happens inside a day. A busy queue can push it further, never silently: the status is always visible in Portfolio.
Scores and rewards
Each approved submission gets a score from 0 to 100, and the score decides where the reward lands inside the bounty's range. A Folding laundry clip that scores 90 in a $2 to $4 bounty earns close to $4. A rejected submission can be recorded again and resubmitted; the reviewer note tells you what to change.
Settlement. Dollars in, stock out.
Rewards are set in US dollars at review, then paid in the stock token you chose, at its Chainlink price on Robinhood Chain.
- Reward
- $6.00
- NVDA Chainlink price
- You receive
- Sent to your address on chain 4663
- Priced by Chainlink. The price comes from the stock's Chainlink feed on Robinhood Chain when the payout is prepared. When the market is closed the feed holds its last price, and that price is used.
- Checked by a person. A person checks the amount, the token and the address before any payout is signed. Nothing is sent automatically.
- Chosen per submission. You pick the payout stock when you submit. Different submissions can pay out in different stocks.
- Gas is on us. OptiLearn pays the network fee. You need nothing in your wallet to receive.
Payouts go out by hand in batches after approval. Until the transaction is sent, Portfolio shows the submission as approved; once it lands you get the transaction link on the explorer.
Robinhood Chain
- Network
- Robinhood Chain mainnet, an Arbitrum Orbit L2
- Chain ID
- 4663 (0x1237)
- RPC
- https://rpc.mainnet.chain.robinhood.com
- Explorer
- robinhoodchain.blockscout.com
- Gas token
- ETH
- Price source
- Chainlink data feeds, read on chain
Payout stocks
Any of these 35 stock and ETF tokens can be chosen as a payout. Each one has a live Chainlink feed on Robinhood Chain, which is what makes a fair conversion possible.
NVDANVIDIA
TSLATesla
AAPLApple
MSFTMicrosoft
GOOGLAlphabet Class A
METAMeta Platforms
AMZNAmazon
PLTRPalantir Technologies
AMDAMD- ASASMLASML Holding NV
- BABABAAlibaba
- CLCLSKCleanSpark
Prices are Chainlink feeds on Robinhood Chain. Each tile opens the token contract.
Attestations. Provenance on OP Mainnet.
Every approved contribution is attested on OP Mainnet through the Ethereum Attestation Service when its payout is recorded. The attestation says who contributed what, for which bounty, and the file's fingerprint, without putting the file or any personal data on chain.
- EAS contract
- 0x4200000000000000000000000000000000000021
- Schema registry
- 0x4200000000000000000000000000000000000020
- Explorer
- optimism.easscan.org
The schema
Each attestation is made against this schema with no resolver. The recipient is the contributor's address, so every attestation also shows up under that wallet on the explorer. The schema UID is the keccak256 of the schema string, resolver and revocable flag; the Network page shows whether it is registered.
bytes32 submissionId,address contributor,string modality,string bounty,bytes32 contentHash,uint16 reviewScore,string payoutSymbol| Field | Type | Meaning |
|---|---|---|
| submissionId | bytes32 | The submission's ID, the same one shown in Portfolio. |
| contributor | address | The wallet that made the submission and received the reward. |
| modality | string | video, audio, image, text or sensor. |
| bounty | string | The bounty slug, for example fold-laundry. |
| contentHash | bytes32 | SHA-256 of the original upload, before any processing. Anyone holding that file can recompute it. |
| reviewScore | uint16 | The reviewer's score, 0 to 100. |
| payoutSymbol | string | The stock token the reward was paid in, for example NVDA. |
- submissionIdbytes32
- Meaning
- The submission's ID, the same one shown in Portfolio.
- contributoraddress
- Meaning
- The wallet that made the submission and received the reward.
- modalitystring
- Meaning
- video, audio, image, text or sensor.
- bountystring
- Meaning
- The bounty slug, for example fold-laundry.
- contentHashbytes32
- Meaning
- SHA-256 of the original upload, before any processing. Anyone holding that file can recompute it.
- reviewScoreuint16
- Meaning
- The reviewer's score, 0 to 100.
- payoutSymbolstring
- Meaning
- The stock token the reward was paid in, for example NVDA.
What stays off chain
The file itself, your email, your IP hash, the reviewer's notes and the dollar value of the reward are never written to an attestation. Attestations are public and permanent: they cannot be deleted, only revoked, and a revoked attestation stays visible with its revocation time.
How a buyer verifies a file
- 1Find the attestationEvery item in a licensed dataset carries its attestation UID in the manifest.
- 2Read it on OP MainnetOpen it on easscan, or call
getAttestation(uid)on the EAS contract directly. - 3Check who signed itThe attester must be the OptiLearn attester address listed in your license, and the revocation time must be zero.
- 4Match the fingerprints
contentHashmust equal the item'ssource_sha256, the hash of the original upload. The file you received hashes tosha256; the two differ only when audio or metadata was stripped before delivery.
import { createPublicClient, http, parseAbi, decodeAbiParameters, parseAbiParameters } from "viem";
import { optimism } from "viem/chains";
import { createHash } from "node:crypto";
import { readFileSync } from "node:fs";
const row = JSON.parse(manifestLine); // one line of manifest.jsonl
const ATTESTER = "0x…"; // OptiLearn attester, listed in your license
const EAS = "0x4200000000000000000000000000000000000021";
const abi = parseAbi([
"function getAttestation(bytes32 uid) view returns ((bytes32 uid, bytes32 schema, uint64 time, uint64 expirationTime, uint64 revocationTime, bytes32 refUID, address recipient, address attester, bool revocable, bytes data))",
]);
const client = createPublicClient({ chain: optimism, transport: http() });
const att = await client.readContract({ address: EAS, abi, functionName: "getAttestation", args: [row.attestation.uid] });
const [, , , , contentHash] = decodeAbiParameters(
parseAbiParameters("bytes32, address, string, string, bytes32, uint16, string"),
att.data,
);
const sha = (f) => "0x" + createHash("sha256").update(readFileSync(f)).digest("hex");
const ok =
att.revocationTime === 0n &&
att.attester.toLowerCase() === ATTESTER.toLowerCase() &&
contentHash === row.source_sha256 && // what was reviewed
sha(row.file) === row.sha256; // what you received
console.log(ok ? "verified" : "does not match");$LEARN. The network token.
$LEARN is OptiLearn's network token on Robinhood Chain. The price and contract below are live.
- Not how rewards are paid. Contributor rewards are paid in stock tokens. $LEARN is separate.
- Not required. You do not need to hold $LEARN to contribute, get paid or license data.
- No promises. We make no promises about its price, supply or future use. If that changes, it will be written here before it happens.
The same data is available from GET /api/learn. Buying or holding any token carries risk and nothing on this site is investment advice.
For buyers. Licensing and delivery.
Datasets are licensed, not sold. Choose a scope, review sample records, then receive the full set with a manifest that ties every file to its consent record and attestation.
Licenses
| License | What it allows | Typical buyer |
|---|---|---|
| Research | Train and evaluate models for internal research and publication. Not for use in a commercial product. | Academic groups, evaluation sets, early exploration |
| Commercial | Train, fine-tune and ship models in commercial products. Non-exclusive. Raw files cannot be resold or redistributed. | Product teams training production policies |
| Exclusive | Commercial rights plus exclusive access to the dataset, including new items from its bounties, for an agreed window. | Labs that want a collection no one else has |
- Research
- What it allows
- Train and evaluate models for internal research and publication. Not for use in a commercial product.
- Typical buyer
- Academic groups, evaluation sets, early exploration
- Commercial
- What it allows
- Train, fine-tune and ship models in commercial products. Non-exclusive. Raw files cannot be resold or redistributed.
- Typical buyer
- Product teams training production policies
- Exclusive
- What it allows
- Commercial rights plus exclusive access to the dataset, including new items from its bounties, for an agreed window.
- Typical buyer
- Labs that want a collection no one else has
Each dataset page shows the license it is offered under and a starting price. Volume and exclusivity move the price; the final terms are in the license you sign.
Delivery
- Files. Video as MP4 with the audio track removed, audio as WAV, images in their original format, text as UTF-8 Markdown, sensor logs as CSV.
- Manifest. One JSON line per item with capture details, annotations, the consent record, both file hashes and the attestation UID.
- Transfer. Delivered into your S3 or R2 bucket. Sample records are shared before you sign.
- Refreshes. Datasets that are still collecting ship a new manifest as items clear review. Item IDs never change between refreshes.
{
"id": "4f1c9a2e-7b3d-4e21-a8c5-1d93e07b6f42",
"file": "clips/4f1c9a2e.mp4",
"sha256": "0x3b7e…91c4",
"source_sha256": "0x9d02…4ae8",
"contributor": "sha256:5c81e0a2…7f13",
"task": "fold-laundry",
"captured_at": "2026-08-14T10:32:00Z",
"country": "BR",
"duration_sec": 34.2,
"resolution": "1920x1080",
"fps": 30,
"audio": "stripped",
"annotations": {
"task_label": "fold_laundry",
"hand_visibility": 0.94,
"segment": [12, 1018],
"objects": ["t-shirt", "towel", "basket"]
},
"consent": { "recorded": true, "version": "2026-06", "at": "2026-08-14T10:32:00Z" },
"attestation": { "chain_id": 10, "uid": "0x8a4f…e2d0" }
}API. The endpoints behind this site.
Everything on OptiLearn reads from these public JSON endpoints, and you can too. No key is needed.
- GET/api/tickerChainlink prices for every payout token
- GET/api/learn$LEARN price and contract
- GET/api/configLive site settings
- GET/api/networkRobinhood Chain and OP Mainnet status
- GET/api/statsPlatform totals
- GET/api/submissions?wallet=A wallet's submissions
- POST/api/inquiriesSend a licensing inquiry
- Format. JSON in and out, UTF-8. Responses are not cached unless noted.
- Errors. A non-2xx status with
{ "error": "bad_request", "message": "…" }. Themessageis written to be shown to people. - Limits. Writes are rate limited per network and return
429with aRetry-Afterheader. Poll reads every 30 seconds or slower; prices do not change faster than that.
Every tokenized stock and ETF on Robinhood Chain with a live Chainlink feed, plus ETH and BTC reference prices, the latest block and gas. Read through Multicall3 and cached for 45 seconds. state is live when the feed updated within its normal window and held when the market is closed and the last price stands. Stale feeds are left out.
curl -s https://optilearn.ai/api/ticker{
"quotes": [
{
"symbol": "NVDA",
"name": "NVIDIA",
"kind": "stock",
"address": "0xd0601CE157Db5bdC3162BbaC2a2C8aF5320D9EEC",
"feed": "0x379EC4f7C378F34a1B47E4F3cbeBCbAC3E8E9F15",
"price": 225.66018707,
"updatedAt": 1790366165,
"state": "held"
}
],
"block": 74069201,
"gasGwei": 0.020218,
"at": 1790525258207
}The $LEARN contract and market data. Until the contract is published every field except symbol and updatedAt is null, which is what it returns today. change24h is a percentage and updatedAt is in milliseconds.
curl -s https://optilearn.ai/api/learn{
"address": null,
"symbol": "LEARN",
"priceUsd": null,
"change24h": null,
"marketCap": null,
"liquidityUsd": null,
"volume24h": null,
"url": null,
"source": null,
"updatedAt": 1790526092927
}Settings the operator can change without a redeploy: the $LEARN contract and pool, and the X handle. Writes need an operator token and are not public.
curl -s https://optilearn.ai/api/config{
"learnAddress": null,
"learnPool": null,
"xHandle": "gkimbwala",
"updatedAt": null
}Live status for both chains in the loop. Each chain degrades on its own: if one RPC is down it comes back with "ok": false and nulls while the other still reports. Cached for 10 seconds.
Some fields are trimmed above for length; the live response also repeats each chain's RPC, explorer and block time.
curl -s https://optilearn.ai/api/network{
"robinhood": {
"name": "Robinhood Chain",
"chainId": 4663,
"rpc": "https://rpc.mainnet.chain.robinhood.com",
"explorer": "https://robinhoodchain.blockscout.com",
"ok": true,
"block": 74077518,
"blockTime": 1790526092,
"blockAgeSec": 1,
"avgBlockTimeSec": 0.1,
"gasGwei": 0.020086
},
"optimism": {
"name": "OP Mainnet",
"chainId": 10,
"ok": true,
"block": 157463658,
"avgBlockTimeSec": 2,
"gasGwei": 0.001000409,
"eas": {
"address": "0x4200000000000000000000000000000000000021",
"schemaRegistry": "0x4200000000000000000000000000000000000020",
"schemaUid": null,
"schemaRegistered": false,
"attestations": 1318576
}
},
"feeds": { "total": 38, "live": 0, "held": 38 },
"at": 1790526093796
}Platform totals, with per-bounty counts keyed by bounty slug. Cached for 60 seconds. It never fails: if the database is unreachable it returns zeros.
curl -s https://optilearn.ai/api/stats{
"submissions": 42,
"approved": 31,
"contributors": 17,
"paidUsd": 118.5,
"byBounty": {
"fold-laundry": { "submitted": 12, "approved": 9 }
}
}Every submission made from a wallet, newest first, up to 100. Storage keys, IP hashes and file contents are never included. Returns 400 for an invalid address and 503 if the database is unreachable.
- walletaddressrequired
- Any EVM address, checksummed or lower case.
curl -s "https://optilearn.ai/api/submissions?wallet=0x7a3f…c21e"{
"submissions": [
{
"id": "4f1c9a2e-7b3d-4e21-a8c5-1d93e07b6f42",
"wallet": "0x7a3f…c21e",
"bountySlug": "fold-laundry",
"modality": "video",
"title": "Folding laundry",
"fileName": "IMG_4821.MOV",
"fileSize": 48213771,
"mime": "video/quicktime",
"durationSec": 34.2,
"captureSource": "upload",
"payoutSymbol": "NVDA",
"status": "paid",
"reviewScore": 88,
"rewardUsd": 3.75,
"reviewerNote": null,
"payoutAmount": 0.016618,
"payoutPriceUsd": 225.66,
"payoutTx": "0x51be…09aa",
"attestationUid": "0x8a4f…e2d0",
"createdAt": "2026-09-26T14:02:11.000Z",
"reviewedAt": "2026-09-26T19:40:05.000Z",
"paidAt": "2026-09-27T09:12:48.000Z"
}
]
}Sends a licensing inquiry, the same one the form on /buyers sends. Validation errors come back as 400 with a message per field. Limited to 5 per hour per network.
- namestringrequired
- 2 to 120 characters.
- emailstringrequired
- A work email.
- orgstringrequired
- Your lab or company, 2 to 160 characters.
- useCasestringrequired
- What you are training, at least 20 characters.
- rolestring
- Optional, up to 120 characters.
- datasetsstring[]
- Dataset slugs from the marketplace, for example
household-manipulation. - budgetenum
under-10k,10k-50k,50k-250k,250k-plusorunsure.
curl -s -X POST https://optilearn.ai/api/inquiries \
-H "Content-Type: application/json" \
-d '{"name":"Ada Lovelace","email":"ada@lab.ai","org":"Analytical Robotics","useCase":"Bimanual folding policy, 2k clips to start","datasets":["household-manipulation"],"budget":"10k-50k"}'{
"ok": true,
"id": "b2e0d6c4-3f1a-4c7e-9a52-6e8d1f0c7a31"
}FAQ. Before you start.
Still stuck? Contact us.
