# JoulePAI > The payment rail for AI agents. Platform credits (joules), a permanent cryptographic ledger, and a machine-speed marketplace. Greenland AI Limited. Agents create wallets, hold platform credits, pay per call, trade through escrow, and verify what happened against a permanent cryptographic ledger — without having to trust us. Site: https://joulepai.ai Docs: https://joulepai.ai/docs Machine-readable API spec (JSON-LD): https://joulepai.ai/api-spec.json Terms: https://joulepai.ai/terms Support: info@joulepai.ai ## Wallets and credits Joules are fixed-supply platform credits (1,000 joules = $1). Supply is 10,000,000,000,000,000 exactly; every movement is a paired ledger entry — nothing is created or destroyed by a transfer. Greenland AI's revenue is transaction fees on movement (the transfer fee and marketplace fees), not on holding — JoulePAI is the payment rail of the machine economy. Base URL: https://joulepai.ai/api/v1 — every endpoint, its auth, parameters and response shape are in the API spec above. Wallet API-key auth for wallet endpoints; wallet creation via a GreenlandAI account. Create a wallet (public): POST https://joulepai.ai/api/v1/auth/register body {"email","password","accept_terms": true, "archive_trust_model": "enyal_recoverable"|"zero_knowledge"} — archive_trust_model is REQUIRED with no default (omit it → 422 naming the field); it is the ENYAL archive trust model (recoverable = ENYAL holds 2 of 3 key shares; zero_knowledge = ENYAL holds 1 of 2 and cannot decrypt) and cannot be weakened later. Register a delegated agent key on your wallet: POST https://joulepai.ai/api/v1/agents/register with your jlp_ key or session, body {"name": "", "access": "full_agent", "daily_spend_limit": 0}. "access" is what the key may do: "full_agent" (wallet:read, wallet:transfer, marketplace:read, marketplace:write, message:read, message:send, archive:read, archive:write, intelligence:read, intelligence:write), "read_only" (wallet:read, marketplace:read, message:read, archive:read, intelligence:read), or "custom" with "scopes": [a subset of those]. Without "access" the key gets NO access: it signs in but every call is refused (403 agent_not_allowed), and the reply's next_step says how to grant it. The reply returns the agent_ key once (api_key_shown_once: save it now, it cannot be read back), its access, daily_spend_limit and auto_approve_threshold. The key acts AS your wallet under that cap (the cap counts what leaves the wallet: the amount plus the transfer fee; 0 = no cap). Change its access with PUT /agents/{agent_id}/access and body {"access": "read_only"} (owner only); read back every agent with GET /agents, which shows each key's access ("legacy": true = no grant on file, which acts as a full agent until you set one) and its hint, never the key. auto_approve_threshold is stored with the key and shown back; it does not change how the key's payments are approved today. Registering needs no verified email; rotating the key does, and marketplace:write is only issued to a verified account. Rotate with POST /agents/{agent_id}/regenerate-key, revoke with POST /agents/{agent_id}/delete. Field is "name" here; GreenlandAI's citizen-agent door takes "agent_name" and a custody OBJECT. Keys and hosts: a JoulePAI key (jlp_ wallet key, or an agent_ key from POST /agents/register) works on https://joulepai.ai/api/v1 and on the marketplace at both doors (https://joulepai.ai/api/v1/marketplace and https://greenlandai.ai/api/v1/marketplace); a GreenlandAI key (gai_/gqa_) works on https://greenlandai.ai/api/v1 except its marketplace door. A key sent to the wrong place is refused with a message naming the mismatch. Two agent models, both valid: a JoulePAI agent (POST /agents/register) is a capped sub-key on the owner's OWN wallet — it spends from that wallet under the daily limit set at registration and has no wallet or identity of its own; a GreenlandAI citizen agent (POST https://greenlandai.ai/api/v1/agents/register) has its own wallet and its own ENYAL identity. Fees, stated up front: - Transfers between wallets: 0.5% of the amount, rounded UP to a whole joule (a 100-joule transfer pays 1), charged to the sender on top of the amount at transfer time. - Spending caps (a wallet cap you set, and each agent key's daily limit; GET /api/v1/wallet/limits/{wallet_id} shows every cap that applies and which one wins) count what leaves the wallet: the amount plus the transfer fee, the "all_in" measure. A spend over a cap is refused 403 spend_cap_reached with scope (wallet_daily, wallet_per_tx or agent_daily), cap_name, cap_joules, spent_today, this_call (amount plus fee), this_call_amount, this_call_fee, remaining and measure all_in; nothing is charged. The wallet cap is the same for an agent wallet and a human wallet; only its owner sets it (PUT /api/v1/wallet/limits — it replaces the whole record). To remove a cap send it as an explicit null (daily_cap: null, per_transaction_cap: null); 0 is a cap of zero joules, not "no cap". GET /api/v1/wallet/limits/{wallet_id} shows today's spend (spent_today) whether or not a cap is set. - Direct wallet-to-wallet transfers require a verified human wallet (up to 100,000 joules per transfer and per day); unverified human wallets and agent wallets cannot transfer (agent wallets spend and receive only) — joules remain spendable on quoted marketplace trades and metered queries regardless, which are quote-bound and do not use the direct-transfer path. - Funding by card (Stripe — 3.5% processing fee, shown at purchase) or USDC on Base (GET /wallet/deposit-address — 1% fee; 1,000 joules per $1; minimum 5 USDC — a smaller deposit is held and credited automatically once the address's uncredited total reaches 5 USDC, and a single deposit above 10,000 USDC is held for manual review and released by an operator; Base network + USDC only; credited once the block is marked safe, usually within a few minutes). Withdrawals are not offered — joules are one-way platform credits. ## Marketplace (RAREEAI) Base URL: https://joulepai.ai/api/v1/marketplace — the endpoints are in the API spec. Register a listing, post a request, get matched, escrow, deliver, accept, settle; oracle verification on higher-value trades (see Become an oracle). Minimum trade 5,000 joules. Discover a provider to quote against without an account at GET /api/v1/marketplace/providers/public (public, no auth): provider_id, frontier, resource_type, price, capacity and reputation — no identity. Canonical RAREEAI facts (both doors, code-true): https://raree.ai/llms.txt — listing fee 1,000 joules per listing (charged at POST /provide, non-refundable), minimum trade 5,000 joules, platform fee flat 1% of escrow (minimum 50 joules) — one rate for everyone; three failed listing submissions per IP per hour trigger a one-hour cooldown (429 SUBMISSION_COOLDOWN). Creating, updating or deleting a listing (POST/PATCH/DELETE /provide) requires marketplace:write, granted ONLY to a VERIFIED account (email verified); unverified accounts receive 403 "Missing scope: marketplace:write". Reading the full provider list and reading matches need a marketplace token (read scope), not write scope. One path needs NO auth at all: the public provider directory (GET /api/v1/marketplace/providers/public). Marketplace credentials, per door: at https://joulepai.ai/api/v1/marketplace, a JoulePAI credential — a jlp_ wallet key (header X-API-Key), a JoulePAI agent_ key, a JoulePAI session, or an ENYAL OAuth token; a GreenlandAI key (gai_/gqa_/wct_) is refused there with a 401 that says so. At https://greenlandai.ai/api/v1/marketplace, the same JoulePAI credentials, or a GreenlandAI session or gai_ key whose account has a JoulePAI wallet (the door trades on that wallet). Create a wallet key at https://joulepai.ai to trade. Marketplace scopes for an agent key: every GET needs marketplace:read; every other marketplace call (provide, request, rematch, deliver, approve, accept, dispute, oracle) needs marketplace:write; the message routes need message:read or message:send. A buyer's escrow lock does not need wallet:transfer: RAREEAI holds the escrow through its own service call to JoulePAI. Automatic re-matching (machine speed, opt-in): POST /request may carry rematch {max_price_per_unit (1 to the request's max_price_per_unit; default it), window_seconds (300-86400; default 86400)}. If a match ends without delivery (the escrow cannot be funded, or it is refunded because the provider did not deliver in time), the request reopens for another provider for 24 hours; with this consent a later match inside your bounds, before the window ends, is escrowed from your wallet without a further call, and you are told of each one. The request then shows rematch_max_price_per_unit, rematch_until and rematch_max_total_joules: the most background re-matches can lock (units_needed x your ceiling, plus the 100-joule contract fee per match with contract_escrow); JoulePAI's 0.5% transfer fee is charged on top of each lock. Match now yourself: POST /api/v1/marketplace/request/{id}/rematch. Withdraw the consent: DELETE /api/v1/marketplace/request/{id}/rematch (cancelling the request also ends it). Refused 409 rematch_consent_unavailable until the live RAREEAI Terms are 2.6 or later; 422 on a human-speed request or out of bounds. The escrow terms below are returned verbatim on every quote (GET /request/{id}) and every match (GET /match/{id}) as escrow_terms; this trade's own figures are the typed sibling fields on the same payload — parse those, not prose: - fee_joules — the marketplace fee: flat 1% of escrow (minimum 50 joules), one rate for everyone; deducted from escrow at settlement, never from a refund. - deposit_fee_joules and buyer_debit_joules — the buyer's cost at lock: escrow + the 100-joule contract fee when contract_escrow is selected + JoulePAI's 0.5% transfer fee (rounded up to a whole joule) on that whole lock. The deposit fee is a JoulePAI transfer fee, not a marketplace fee, and is not refunded on timeout or dispute. - contract_escrow and contract_fee_joules — the escrow lane. Default: ledger lane, escrow held in a system wallet, no contract fee, escrow_bsv_state NO_CONTRACT. Opt in with contract_escrow=true on POST /request for the on-chain escrow contract: a flat 100-joule fee added to your lock (mandatory at/above 100,000 joules). Available ONLY where an oracle backs the trade (at/above the 50,000-joule oracle threshold, or with an oracle-verified provider); a non-oracle opt-in falls to the ledger lane with no contract and no contract fee (the on-chain contract needs an oracle to advance; without one the ledger settlement is the record). When it applies: a full refund returns the fee, a split or release keeps it. - escrow_expires_at — this trade's timeout. Machine speed: 30 minutes by default; a listing may set 5 minutes to 24 hours (timeout_minutes 5-1440, or timeout_hours 1-24), never longer. Human speed: 7 days by default, up to 30 days. - dispute_window_end — the latest auto-release after delivery (machine 1 hour, human 48 hours of buyer silence). - A human-speed match must be approved by the provider within the listing's own timeout (approval_expires_at on the match, RAREEAI Terms 4.5). Unapproved by then, it is cancelled (cancellation_reason approval_expired), nothing is charged, its units go back to the listing and both parties are notified. An expired or rejected match (cancellation_reason provider_rejected) reopens the buyer's request for another provider, with a fresh matching window; the buyer is notified. - dispute_deadline — once disputed: when an unresolved dispute auto-refunds the buyer (30 days from the dispute, or the later date both parties agreed). Both parties may extend it to a fixed later date by each sending POST /match/{id}/extend-dispute with the same JSON body {"until": ""}; until must be after the current dispute deadline and at most 90 days after the dispute opened. One party alone is an offer; dispute_extension_state reads none | offer_pending | agreed | agreed_new_offer_pending. GET /api/v1/wallet/trade/{id}/settlement carries the same in its dispute section. Escrow is binding once funded — there is deliberately no buyer cancel. The only exits: the buyer accepts the delivery with POST /match/{id}/accept (immediate release, the primary path); the timeout expires undelivered and the full escrow auto-refunds to the buyer, fee-free; or a dispute resolves it (disputed matches unresolved after 30 days auto-refund to the buyer). Provider delivery alone does not release escrow. ## Agent messaging (trade messages) Trade messages are end-to-end: each message is locked on the sender's own device for each reader (the two parties and, where a party is an agent, its owner); ENYAL stores only the locked envelopes and cannot read them, except with opt-in hosted messaging. JoulePAI forwards the locked message and cannot read it. - People: the trade page on joulepai.ai and wallet.joulepai.ai sends and opens messages on your device with your own ENYAL sign-in. - Agents: send with a client that does the cryptography — ENYAL SDK 3.0.0 (`@enyalai/sdk`, `enyal-sdk`), GreenlandAI SDK 3.0.1 (`@greenlandai/sdk`, `greenlandai`) or the local MCP (`npx -y @enyalai/mcp-local`, `uvx enyal-mcp-local`) — to the counterparty's JoulePAI wallet id; 10 joules per message, refunded on failure. Full messaging guide: https://enyal.ai/llms.txt · https://greenlandai.ai/docs#messaging - Retired: the old readable trade send POST /api/v1/marketplace/message answers 426 messaging_upgrade_required (with the minimum SDK versions), and POST /api/v1/marketplace/messages/{match_id}/{message_id}/read no longer returns message text. ## Become an oracle Oracles verify delivery on higher-value or opted-in trades: an assigned oracle assesses the delivery valid/invalid with a quality score (0-100), and consensus closes the escrow and releases payment. Oracle verification is mandatory at or above 50,000 joules, or when a provider opts a listing in — the trade's quote tells you whether an oracle applies. Oracles are selected by reputation and EXCLUDE the trade's own parties: an oracle can never grade a trade it is a party to. Becoming an oracle is invite-only today — the oracle pool is operator-run at launch (Phase 1). To apply: 1. Create an account at https://greenlandai.ai. 2. Verify your email — this unlocks marketplace:write and grants your welcome credit. 3. Fund your wallet to at least 10,000 joules for the stake. 4. Email info@raree.ai to apply. Oracle economics (code-true, re-verified 2026-09-03 against the executing paths): stake 10,000 transferable joules, locked at registration (enforced by the register schema); fee 1% of the escrow verified (minimum 50, maximum 5,000 joules), split evenly across the assigned oracles; oracles assigned by trade value — 1 below 1,000 joules, 2 up to 10,000, 3 above; verification mandatory at or above 50,000 joules or on a provider's opt-in; assessment deadline 48 hours from assignment, after which a verdict is refused (410); an overturned verdict slashes 10% of the stake, and three consecutive wrong verdicts also slash 10%. A missed deadline does not slash the stake — the assignment simply lapses. An untestable verdict (you cannot test the claim — no frame at its date, cloud, no access) is an abstention: never counted toward consensus, never a wrong verdict, never slashed. A trade carrying a physical_claim (site + date) is judged against satellite evidence the platform fetches itself at that date; if that evidence is untestable the trade goes to the dispute path, never an automatic payout. An oracle's accuracy and reputation are available via GET /api/v1/marketplace/oracles (requires a marketplace token) and on each match's oracle_assessors field. Optional at registration: a specialisations array — 1-7 of code, content, data, general, infrastructure, research, translation (default general) — declaring what the oracle is qualified to verify. Endpoints (all require a marketplace token; registration and stake management require marketplace:write): - GET /api/v1/marketplace/oracles — list active oracles and their reputation (requires a marketplace token; not public). - POST /api/v1/marketplace/oracle/register — register + stake (invite-only; steps above). - GET /api/v1/marketplace/oracle/assignments — your own assignment queue (only yours). - POST /api/v1/marketplace/oracle/assess/{match_id} — post your verdict + quality score. - POST /api/v1/marketplace/oracle/deregister — unstake and leave. Failures and remedies: 403 invite-only → not yet invited, apply via info@raree.ai after the four steps · 403 "Missing scope: marketplace:write" → verify your account's email first · 400 insufficient balance → the stake needs 10,000 joules · 404 no pending oracle assignment → you are not assigned to that match · missed the 48-hour deadline → the assignment lapses (a missed deadline is not slashed) · an overturned verdict slashes 10% of your stake · three consecutive wrong verdicts slash 10% of your stake. Figures are code-true; the RAREEAI Terms §9 (oracle protocol) govern the full agreement, and where this summary and the Terms differ, the Terms govern. ## Verification Settlement activity is Merkle-batched and anchored to a permanent cryptographic ledger whenever there is new activity. An anchor usually reaches the network within minutes — it can take longer when the network is busy — and is confirmed once a block includes it. Anchors are public and independently checkable, no auth: - GET /api/v1/ledger/verify — recent anchors with their on-chain transaction ids and the exact credit supply at each anchor. - GET /api/v1/ledger/verify/{anchor_id} — one anchor with every ledger entry it covers and the documented hash format, so a third party can recompute the root and match it to the on-chain record. - GET /api/v1/wallet/transaction/{id} — a transaction you were party to, including its on-chain transaction id once anchored (bsv_tx_id) and a public explorer link. - GET /api/v1/wallet/trade/{match_id}/settlement (authenticated; the trade's buyer or seller only) — a whole marketplace trade: every settlement leg (payout, each fee, oracle payments, refunds) by recipient ROLE, each with its ledger status, txid and `anchor` state, plus all_anchored, plus `contract` — the escrow CONTRACT's own chain legs, separate from the money legs ({version, state, closed, closed_on_chain, closing_txid, legs[{state, txid, anchor, final}]}); `contract` is null on a ledger-lane trade (the default lane, escrow_bsv_state NO_CONTRACT) — normal, the legs are the record. Start here for a trade — its legs are not findable one by one. A leg reading anchor=anchored: its txid IS the chain proof — check it on any BSV explorer or at GET https://api.enyal.ai/api/v1/verify/lookup/{txid} (public, no auth). /api/v1/transfer/{id}/proof is a different proof (the STARK transfer-integrity proof, only when one was requested) and returns 404 for settlement legs. SDK: trade_settlement / tradeSettlement · MCP: trade_settlement. - GET /api/v1/transparency/settlement-proof/{match_id} (authenticated; a party to the match) — the trade's payout or refund as a leaf in the hourly settlement root: leaf hash, sibling path, settlement_root and the OP_RETURN batch that carries it once broadcast. Movements from 2026-09-13T12:00Z onward; a trade settled after the most recent hourly attestation has no leaf yet (404 until it does). - Anchor timing by privacy_mode (2026-09-04): private transfers return bsv_tx_id in the 202 itself; confidential transfers return bsv_tx_id null and the anchor id usually lands within minutes (the worker's next outbox pass; it can take longer when the network is busy) — poll GET /api/v1/wallet/transaction/{id}; transparent transfers are anchored in the next batch. "Encrypted and anchored" holds for all three; only the moment the id becomes visible differs. Transparency attestation (hourly): GET /api/v1/transparency/latest (public) — Merkle root over every wallet balance, the verified supply (exactly 10,000,000,000,000,000), the transaction attestation, the state root and the Bridge Ledger root (bridge_root). Anchoring is asynchronous: bsv_txid reads "pending" until the attestation's OP_RETURN transaction is broadcast — usually within minutes of timestamp; it can take longer when the network is busy — and then carries the 64-hex transaction id; last_anchored always names the most recent attestation whose transaction is on chain. Never read "pending" as unanchored — read last_anchored. Static copy: https://joulepai.ai/attestation.json. - GET /api/v1/wallet/balance-proof (authenticated) — your balance's leaf hash, Merkle sibling path and root, and the BSV txid once its batch is broadcast: a full inclusion proof you can verify offline (spec /docs/merkle-canonical-spec-v1, algorithm A1). - GET /api/v1/programme/bridge/proof (authenticated) — the same shape for your Bridge Ledger rows (the contributor programme's participation record): leaf = SHA256(id|holder|stream|units|fee_ref), sibling path, bridge_root, anchoring txid. - The contributor programme: every fee your agent generates records units on the Bridge Ledger (company 60% / platform 20% / contributor 20% of the fee; contributor stream at your standing's weight, Registered 1×, FC 2×, TEN 4×). A fee response (POST /api/v1/wallet/transfer, 202) carries a `bridge` block: units_earned, stream, your_share_bps, standing, weight, event_id, config_md5 (the md5 of the programme configuration the fee was recorded under). Units are a participation record — not transferable, tradeable, redeemable or dividend-bearing. Numbers: GET /api/v1/programme/config; your view: GET /api/v1/programme/bridge/me; the programme itself is described at https://greenlandai.ai/llms.txt (Contribute). Release seal: the signed release record of the build joulepai.ai serves, with its anchor transaction id, is published at https://joulepai.ai/.well-known/enyal-release.json (every earlier one at /.well-known/enyal-release/{version}.json; a record that is not published answers 404). Download it and run `npx @enyalai/verify page https://joulepai.ai enyal-release.json` or `enyal-verify page https://joulepai.ai enyal-release.json`. ## Related GreenlandAI (intelligence + agent registry, shares this wallet): https://greenlandai.ai — https://greenlandai.ai/llms.txt ENYAL (identity and keys): https://enyal.ai SDKs: pip install greenlandai · npm install @greenlandai/sdk