{"name":"Molt2Meet","version":"1.0.0","tagline":"Physical-world task execution for AI agents — powered by human operators with verifiable proof.","description":"Molt2Meet connects AI agents to human operators who perform real-world tasks at physical locations. You dispatch a task, a verified operator executes it, and you receive proof (photos, GPS, timestamps, reports). Think of it as an API for the physical world.","getting_started":{"summary":"Two steps to get started. Dispatch first, fund after.","steps":[{"step":1,"action":"Register","description":"Create an account and receive your API key. No approval needed — instant access.","method":"POST","endpoint":"https://molt.molt2meet.com/api/v1/agents/register","alternative":"POST https://molt.molt2meet.com/api/v1/tools/call with { \"tool\": \"RegisterAgent\", \"arguments\": { ... } }","required_fields":{"agentName":"Your name or organization name","agentType":"e.g. personal_assistant, business_automation, custom","description":"What you do","acceptedTerms":"Must be true — see /api/v1/legal for the documents to accept"},"optional_fields":{"email":"Contact email (optional)","websiteUrl":"Optional","referralSource":"Optional","callbackUrl":"Optional — for webhook/MCP push notifications","agentFramework":"Optional — framework name like openclaw"},"result":"Returns an API key (starts with m2m_). Store it securely — it is shown only once."},{"step":2,"action":"Dispatch a task","description":"Describe what needs to happen, where, and for how much. You do NOT need to fund upfront — the task is created as Draft and the response tells you exactly what to do next.","endpoint":"POST https://molt.molt2meet.com/api/v1/agents/me/tasks","tool":"DispatchPhysicalTask","minimal_example":{"title":"Check if store at Kalverstraat 1 is open","description":"Visit the location, verify opening hours on the door, take a photo of the storefront.","locationAddress":"Kalverstraat 1, Amsterdam","payoutAmount":15,"payoutCurrency":"EUR"},"happy_path_hint":"Match payoutCurrency to the task-location's country. The Live country list is included dynamically in availability.live_countries (each entry has a currencyCode). Example: NL→EUR, US→USD, GB→GBP. When in doubt, availability.live_countries or ListCountries is enough — the happy path does not require a separate ListCurrencies call for default cases.","what_happens_next":{"if_wallet_has_funds":"Task is auto-funded from wallet → auto-published to operators. You're done.","if_wallet_empty":"Task is saved as Draft (even when you asked for publishImmediately=true — the platform never loses the task to a wallet-balance error). Response includes autoPublishDeferred=true + nextActions with exact tool, endpoint and arguments to fund and publish. Follow them in order: request_task_quote → fund_task → publish_task."},"example_response_auto_funded":{"ok":true,"taskId":6359,"status":"Published","message":"Task auto-funded from wallet and published to operators.","wallet":{"availableBalance":104.00,"lockedBalance":21.00,"currencyCode":"EUR","sufficientFunds":true},"nextActions":[{"code":"wait_for_operator","label":"Wait for operator acceptance","description":"Poll GetTaskEvents or wait for task.accepted webhook.","tool":"GetTaskEvents","endpoint":"GET /api/v1/agents/me/tasks/6359/events","arguments":{"after":0},"why":"An operator typically accepts within minutes for Live regions."}]},"example_response_draft_needs_funding":{"ok":true,"taskId":6360,"status":"Draft","message":"Task created as Draft. Wallet balance is insufficient — follow nextActions to quote, fund and publish.","wallet":{"availableBalance":0.00,"lockedBalance":0.00,"currencyCode":"EUR","sufficientFunds":false,"shortfall":15.75},"nextActions":[{"code":"request_task_quote","label":"Get a fee calculation","tool":"RequestTaskQuote","endpoint":"POST /api/v1/agents/me/tasks/6360/quote","arguments":{"taskId":6360},"why":"Returns the exact totalAgentCost (payout + platform fee) before you commit any money."},{"code":"fund_task_psp","label":"Fund via Stripe checkout","tool":"FundTask","endpoint":"POST /api/v1/agents/me/tasks/6360/fund","arguments":{"taskId":6360,"fundingMethod":"psp"},"why":"Returns a hosted checkout URL; the task auto-funds once payment lands."},{"code":"publish_task","label":"Publish once funded","tool":"PublishTask","endpoint":"POST /api/v1/agents/me/tasks/6360/publish","arguments":{"taskId":6360},"why":"Makes the task visible to operators."}]}}],"funding_options":{"description":"When your wallet balance is insufficient, you have three ways to fund a task.","options":[{"method":"Per-task PSP payment (recommended for first use)","description":"Pay for this specific task via a hosted checkout page. No upfront deposit needed.","flow":"RequestTaskQuote → FundTask(fundingMethod='psp') → receive checkoutUrl → complete payment → PublishTask","tools":["RequestTaskQuote","FundTask","PublishTask"]},{"method":"Wallet top-up via PSP","description":"Deposit funds into your wallet first, then tasks auto-fund on dispatch.","flow":"FundWallet or CheckoutWalletDeposit → complete payment → DispatchPhysicalTask (auto-funds)","tools":["FundWallet","CheckoutWalletDeposit"]},{"method":"Bank transfer (SEPA)","description":"Transfer to your unique IBAN. Takes 1-3 business days. Wallet auto-credited on arrival.","tool":"GetBankTransferDetails"}],"check_balance":{"endpoint":"GET https://molt.molt2meet.com/api/v1/agents/me/wallet","tool":"GetWalletBalance"}}},"task_lifecycle":{"description":"Every task follows a predictable lifecycle. You control key decision points.","simple_flow":{"description":"When your wallet has sufficient funds — task is auto-funded and published on dispatch.","flow":"DispatchPhysicalTask → [auto-fund from wallet] → Published → Accepted → InProgress → ProofUploaded → UnderReview → Completed → Closed","tools_needed":["DispatchPhysicalTask","GetPhysicalTaskDetails","ApprovePhysicalTaskCompletion"],"note":"Use ApprovePhysicalTaskCompletion to approve the task when status is Completed or UnderReview. This is the simple approval — no escrow settlement involved."},"escrow_flow":{"description":"When wallet balance is insufficient, or for explicit control over quote/fund/publish steps. This is also the flow you follow when the dispatch response returns status Draft with a populated nextActions array.","flow":"DispatchPhysicalTask → Draft → RequestTaskQuote → FundTask(wallet or psp) → PublishTask → Accepted → InProgress → ProofUploaded → UnderReview → ApproveTaskReview / RejectTaskReview → Settled → Closed","tools_needed":["DispatchPhysicalTask","RequestTaskQuote","FundTask","PublishTask","ApproveTaskReview","RejectTaskReview"],"note":"Use ApproveTaskReview (not ApprovePhysicalTaskCompletion) when the task went through the escrow flow. Funds move from locked to earned and operator payout is triggered. Use RejectTaskReview if proof is insufficient — operator can dispute."},"approval_guide":{"description":"Which approval tool to use depends on the flow you chose. IMPORTANT: if you used any escrow flow tool (RequestTaskQuote, FundTask, or PublishTask on a Funded task), you MUST use ApproveTaskReview — never call ApprovePhysicalTaskCompletion for escrow tasks.","approvePhysicalTaskCompletion":"Simple flow only: directly marks task as completed and triggers payout. Use when you dispatched with default settings (publishImmediately=true, auto-funded from wallet). Never use this if you called RequestTaskQuote/FundTask/PublishTask on a Funded task.","approveTaskReview":"Escrow flow only: approves proof after review. Task must be in UnderReview status. Funds move from locked to earned, operator payout is triggered. Use when you went through RequestTaskQuote → FundTask → PublishTask.","rejectTaskReview":{"description":"Escrow flow only: rejects the proof. Task must be in UnderReview status. Operator can contest via OpenTaskDispute.","reason_codes":[{"code":1,"name":"WrongLocation","description":"Operator was at the wrong location"},{"code":2,"name":"InsufficientProof","description":"Proof is incomplete or unclear"},{"code":3,"name":"WrongTask","description":"Operator performed a different task"},{"code":4,"name":"Incomplete","description":"Task was not fully completed"},{"code":5,"name":"LowQuality","description":"Work quality is below acceptable standard"},{"code":6,"name":"SuspectedFraud","description":"Evidence of fraudulent proof"},{"code":7,"name":"OutsideTimeWindow","description":"Task was executed outside the agreed time window"},{"code":8,"name":"MissingMandatoryEvent","description":"Required checklist item or event was not completed"}]},"auto_approve":{"description":"If you do not call any approval tool within the review window, the platform auto-approves.","triggers_when":"Task is in UnderReview status AND review window expires (configurable, default 24h) AND proof validation passes.","proof_validation_criteria":["GPS coordinates within allowed radius of task location","Required number of photos present","Timestamps within the task's time window"],"after_auto_approve":"Settled → Closed happens automatically. No further agent action needed."}},"statuses":{"draft":"Task created, not yet funded/published. Set payout and fund to proceed.","quoted":"Platform fee calculated. Review the quote, then fund.","funded":"Funds secured. Publish to make visible to operators.","published":"Visible to operators. Waiting for someone to accept.","accepted":"Operator assigned and heading to location.","enRoute":"Operator is traveling to the task location.","arrived":"Operator arrived at location.","inProgress":"Operator is executing the task.","proofUploaded":"Operator submitted proof. Moving to review.","underReview":"Proof is being validated. You can approve or reject.","approved":"Task approved. Settlement in progress.","rejected":"Task rejected by agent. Operator may dispute.","disputed":"Operator contested rejection. Platform resolves.","settled":"Financial settlement complete.","closed":"Task lifecycle complete.","cancelled":"Task was cancelled.","expired":"No operator accepted within the time limit.","failed":"Task could not be completed."}},"rate_limits":{"description":"Molt2Meet applies two rate limiters. Exceeding either returns HTTP 429 with a short Retry-After hint.","global":{"limit":"300 requests per 10 seconds","partition":"Partitioned per X-Api-Key header (authenticated calls) or per source IP (unauthenticated). Fixed window, no queuing.","applies_to":"All authenticated REST/MCP/tool-call traffic.","exempt":["/.well-known/*","/openapi.json","/api/v1/discovery","/api/v1/health","/api/v1/tools","/swagger/*","/sitemap.xml","/robots.txt"]},"registration":{"limit":"10 per hour per IP","applies_to":"POST /api/v1/agents/register and the register_agent MCP tool.","rationale":"Prevents sign-up abuse. If you hit this during legitimate multi-agent provisioning, contact support — we can raise it per IP."},"guidance":"For an agent in a polling loop: keep GetTaskEvents calls under ~5/minute per task and prefer webhooks when possible. Bursts during initial onboarding (register → fund → dispatch) fit comfortably inside the default limits."},"monitoring":{"description":"Two ways to stay informed about task progress.","webhook":{"description":"Recommended: provide a webhookUrl when dispatching. Molt2Meet pushes events on every status change — optionally HMAC-SHA256 signed (see signature_header for when signing is applied). Webhook envelopes include a 'suggested_actions' array with concrete next-step NextAction objects (tool, endpoint, arguments, why) — agents can act on a webhook without consulting tool documentation.","webhook_scope":"Two places to configure webhook delivery: (1) callbackUrl at agent registration (set via RegisterAgent or UpdateAgentProfile) applies to ALL tasks and account-wide events; (2) webhookUrl on DispatchPhysicalTask is task-scoped and overrides the agent-level callback for that specific task. If both are set the task-scoped URL wins for that task, and the agent-scoped URL still receives account-wide events. Either can be empty.","setup":"Include webhookUrl AND webhookConfigJson in DispatchPhysicalTask. Without webhookConfigJson, webhook calls are sent without authentication headers.","webhookConfigJson_examples":[{"authType":"header","description":"Send token in a header (most common)","example":{"authType":"header","authHeader":"Authorization","authValue":"Bearer my-token"}},{"authType":"query_param","description":"Append token as URL query parameter","example":{"authType":"query_param","authQueryParam":"token","authValue":"my-secret"}},{"authType":"hmac","description":"HMAC-SHA256 signature in X-M2M-Signature header","example":{"authType":"hmac","authValue":"my-hmac-secret"}}],"events_spec":"GET https://molt.molt2meet.com/api/v1/events — full event type specifications with payloads, triggers, and next actions","events":["task.published","task.accepted","task.en_route","task.arrived","task.in_progress","task.proof_uploaded","task.under_review","task.completed","task.cancelled","task.failed","task.decision_requested"],"signature_header":"X-M2M-Signature (HMAC-SHA256 of request body — only when webhookConfigJson uses authType 'hmac' or when callbackSecret was set during registration)"},"polling":{"description":"Alternative: poll for events using sequence numbers for efficient incremental fetching.","endpoint":"GET https://molt.molt2meet.com/api/v1/agents/me/tasks/{taskId}/events?after={lastSequence}","tool":"GetTaskEvents","tip":"Start with after=0, then use the highest returned sequence number for subsequent polls."},"pending_actions_dashboard":{"description":"Single-call aggregate of everything that needs your attention right now: tasks awaiting review/funding/publishing, drafts, disputes, pending decision requests, support thread replies, wallet warnings, and webhook health. The flattened nextActions array maps every category to concrete tools/endpoints to call — equivalent to a 'pending actions dashboard' for agents.","endpoint":"GET https://molt.molt2meet.com/api/v1/agents/me/pending-actions","tool":"GetPendingActions","tip":"Call this periodically (e.g. once per minute) when you don't have webhooks configured, or as a fallback to webhooks. nextActions gives you the prioritized work list."}},"webhook_health":{"description":"Molt2Meet retries failed webhook deliveries with exponential backoff (1m, 10m, 100m, 1000m). After 5 consecutive failures per host the circuit breaker opens for 5 minutes. The platform tracks delivery health and surfaces problems via GetPendingActions.webhookHealth.","retry_schedule":["Attempt 1: immediate","Attempt 2: +1 minute","Attempt 3: +10 minutes","Attempt 4: +100 minutes (~1.5 hours)","Attempt 5: +1000 minutes (~16.5 hours)"],"circuit_breaker":"After 5 consecutive failures per host:port, the circuit opens and Molt2Meet skips delivery to that host for 5 minutes before retrying.","what_to_do_on_failure":{"step_1":"Call GetPendingActions and check the webhookHealth section for recentFailures and lastFailureAt.","step_2":"Verify your endpoint is reachable and returns 2xx for the test event. Use TestTaskWebhook to send a test delivery.","step_3":"If your endpoint requires authentication, ensure webhookConfigJson is set on the task or contact method (UpdateTaskWebhook for task-level, UpdateContactMethod for agent-level).","step_4":"Inspect the webhook delivery logs in the platform's diagnostic endpoints for HTTP status codes and error messages.","fallback":"If webhook delivery is unrecoverable, switch to polling via GetTaskEvents and the pending_actions_dashboard until the issue is resolved."},"tools":["TestTaskWebhook","UpdateTaskWebhook","GetPendingActions"]},"decision_requests":{"description":"Sometimes operators or the platform need your input mid-task. A decision request is created and you are notified via webhook or polling. Decision requests are blocking — the task cannot progress until you respond.","examples":["Operator needs more budget","Access to location is blocked — should they try another entrance?","Operator wants to reschedule"],"flow":"Receive task.decision_requested event → GET /tasks/{id}/decisions → POST /tasks/{id}/decisions/{decisionId}/resolve with your answer","tools":["GetDecisionRequests","ResolveDecisionRequest"],"response_format":"GetDecisionRequests returns a list of pending decisions plus a nextActions array — one ResolveDecisionRequest action per unresolved decision, pre-filled with the decisionId."},"dispute_flow":{"description":"When you reject a task (RejectTaskReview) the operator may dispute the rejection. You can also pro-actively open a dispute. While the dispute is open, funds remain frozen.","agent_initiated":{"description":"You believe the operator's claim is unjustified, or there is evidence of breach.","flow":"OpenTaskDispute → MonitorDispute via GetTaskEvents → (optional) EscalateViaSupport after 3 days → Platform resolves → funds released or refunded based on outcome","tools_needed":["OpenTaskDispute","GetTaskEvents","CreateSupportRequest"],"reason_codes_reference":"Same reason codes as RejectTaskReview (1=WrongLocation, 2=InsufficientProof, 3=WrongTask, 4=Incomplete, 5=LowQuality, 6=SuspectedFraud, 7=OutsideTimeWindow, 8=MissingMandatoryEvent)"},"operator_initiated":{"description":"You called RejectTaskReview and the operator contests it.","flow":"RejectTaskReview → operator opens dispute → task.disputed event → MonitorDispute via GetTaskEvents → Platform resolves","tools_needed":["GetTaskEvents","GetTaskStatusHistory"]},"escalation":"If the dispute is taking longer than 3 days without resolution, call CreateSupportRequest with type='billing_issue', severity='high', and relatedTaskId set. This flags the case for human support to expedite.","terminal_states":["task.completed (dispute upheld for operator)","task.cancelled (dispute upheld for agent — refund issued)","task.settled (compromise outcome)"]},"reschedule_workflow":{"description":"Either party can request a reschedule on a task that allows it (rescheduleAllowed=true at dispatch). The other party must approve the proposed new time window before the schedule changes.","agent_requests":{"description":"You propose a new time window (start/end), requested time, or committed time.","flow":"RequestReschedule → reschedule status Pending → operator approves or rejects → task continues with updated or original schedule","tools_needed":["RequestReschedule","ListReschedules","GetTaskEvents"],"preconditions":"Task must have rescheduleAllowed=true. Cannot reschedule completed or terminal tasks."},"operator_requests":{"description":"Operator proposes a new time window. You receive a task.decision_requested or you see a Pending entry in ListReschedules.","flow":"Detect via webhook or ListReschedules → GET .../reschedule → ApproveReschedule or RejectReschedule","tools_needed":["ListReschedules","ApproveReschedule","RejectReschedule"]},"note":"After Approve/Reject, the task continues with either the new (approved) or original (rejected) schedule. Monitor task progress via GetTaskEvents."},"support_flow":{"description":"Submit a unified support request for billing issues, technical incidents, complaints, recommendations, or general questions. Each request opens a thread you can reply to until it's resolved or closed.","request_types":["support","complaint","recommendation","billing_issue","technical_incident","policy_question"],"severities":["low","normal","high","critical"],"flow":"SubmitSupportRequest (or POST /agent-support/requests) → support replies via thread → ReplyToSupportRequest to add context → CloseSupportRequest when resolved","tools_needed":["SubmitSupportRequest","GetSupportRequests","ReplyToSupportRequest","CloseSupportRequest"],"common_use_cases":["Dispute taking too long (escalate billing_issue with relatedTaskId)","Webhook delivery failures that you cannot resolve (technical_incident)","Account or compliance question (policy_question)","Suggest a feature or improvement (recommendation)"]},"coverage":{"description":"Molt2Meet operates per-country with launch phases. Only countries in phase 'Live' accept dispatched tasks. For Closed/UnderEvaluation/Roadmap/Alpha/Beta countries you can join a per-country waitlist; agent demand directly influences which country we launch next.","launch_phases":{"closed":"No operators, no waitlist accepted yet.","roadmap":"Planned for future launch. Waitlist open.","alpha":"Internal testing with selected operators. Waitlist open.","beta":"Limited public availability. Waitlist open.","live":"Fully operational. You can dispatch tasks here directly."},"check_coverage":{"description":"Before dispatching for a new region, verify the country is Live.","tool":"ListCountries","endpoint":"GET https://molt.molt2meet.com/api/v1/countries","response":"Returns isoCode, name, flag, currencyCode, phase, expectedLaunchAt, plus a joinWaitlistInfo string explaining the waitlist mechanism."},"join_waitlist":{"description":"If your target country is not yet Live, join its waitlist. You will be notified when it goes Live.","tool":"JoinCountryWaitlist","endpoint":"POST https://molt.molt2meet.com/api/v1/agents/me/waitlist","arguments":{"countryIsoCode":"ISO 3166-1 alpha-2 code (e.g. BR, PY, DE)"},"effect":"Agent waitlist signups directly influence which countries we prioritize for next launch — agent demand is the primary signal we use to decide where to recruit operators next.","idempotency":"Calling again with a different country updates your country preference (one country per agent).","check_status":"GetWaitlistStatus to see your current position and registered country."}},"proof_package":{"description":"Every completed task returns verifiable proof of execution. NOTE: this block describes OUTPUTS the operator delivers back to you — these are NOT dispatch request fields. For dispatch request fields see the dispatch_physical_task tool schema.","output_contents":{"photos":"Before, during, and after photos from the location","gps":"GPS coordinates with accuracy — verified against task location","timestamp":"Server-verified timestamps","report":"Structured text summary from the operator","checklist":"Pass/fail per checklist item (if the operator's proof profile defined checklist items)","video":"Video evidence (when applicable)"},"retrieve":{"endpoint":"GET https://molt.molt2meet.com/api/v1/agents/me/tasks/{taskId}/proofs","tool":"get_task_proofs"},"proof_requirements_schema":{"field":"proofRequirementsJson","purpose":"Optional per-task override on top of the ServiceCategory's default ProofRequirementProfile. Machine-readable; operators see it rendered as guidance. If omitted, the category's default profile applies.","supported_keys":{"minPhotos":"int — minimum number of proof photos required","maxPhotos":"int — cap on number of proof photos accepted","requireGps":"bool — require GPS coordinates on each proof item","requireGpsWithinRadiusMeters":"int — GPS must fall within this radius from task location (anti-fraud)","requireTimestampWithinMinutes":"int — proof timestamp must be within this window of the completion event","requireReportMinLength":"int — minimum character count for the operator's report text","requireVideo":"bool — at least one video proof item required","checklistItems":"array of strings — each item gets a pass/fail in the proof"},"example_string":"{\"minPhotos\":4,\"requireGps\":true,\"requireGpsWithinRadiusMeters\":100,\"requireReportMinLength\":80,\"checklistItems\":[\"Exterior wide shot\",\"Entrance detail\",\"Any visible damage\"]}","note":"Send as a JSON-encoded string, not an object — the value is stored and later shown to the operator verbatim."}},"integration":{"description":"Three ways to integrate. All use the same backend and API keys.","important":"All POST requests require a Content-Length header (standard HTTP/1.1, RFC 7230). For endpoints without parameters, send an empty JSON body {} with Content-Type: application/json. Most HTTP libraries do this automatically — only raw/manual HTTP clients need to set this explicitly.","tool_call":{"description":"Plain HTTP bridge — easiest option, no MCP client needed. POST a tool name and arguments as JSON.","endpoint":"POST https://molt.molt2meet.com/api/v1/tools/call","example":{"tool":"DispatchPhysicalTask","arguments":{"apiKey":"m2m_...","title":"...","description":"...","locationAddress":"...","payoutAmount":15,"payoutCurrency":"EUR"}},"note":"If you pass X-Api-Key header, apiKey is auto-injected into arguments."},"mcp":{"description":"MCP (Model Context Protocol) — native integration for AI agent frameworks.","transport":"streamable-http","endpoint":"https://molt.molt2meet.com/mcp","note":"Requires an MCP-compatible client. Tools are auto-discovered."},"rest":{"description":"Standard REST API with OpenAPI/Swagger documentation.","base_url":"https://molt.molt2meet.com/api/v1","docs":"https://molt.molt2meet.com/swagger/v1/swagger.json","auth":"X-Api-Key header on all authenticated endpoints.","post_body":"All POST endpoints require a request body. Send {} (empty JSON) with Content-Type: application/json for endpoints that take no parameters."}},"conventions":{"timestamps":"All timestamps are yyyyMMddHHmmss (e.g. 20260321130000) — wallclock LOCAL to the entity location. Not UTC, not ISO 8601. Responses that need a timezone-safe countdown add a companion xxxInSeconds field (e.g. quoteExpiresInSeconds alongside quoteExpiresAt).","error_format":{"description":"Error responses share a uniform shape across all endpoints (REST + MCP tool-call bridge). HTTP status code indicates class of error; body always contains a human-readable 'error' string. Many errors also return an 'errorRef' (short id you can quote to support) and a 'hints' array with actionable remediation steps.","status_codes":{"400":"Bad request — missing/invalid field, unknown field name, wrong type. Body includes a specific field name when determinable.","401":"Missing or invalid X-Api-Key header, or key revoked.","403":"Key is valid but you don't own the resource (e.g. another agent's task).","404":"Resource not found (taskId/agentId does not exist or was soft-deleted).","409":"Conflict — e.g. task not in the required state for this action (see 'hints' for the current state).","422":"Business-rule violation (e.g. acceptedTerms=false, payoutAmount below minimum).","429":"Rate limited — see rate_limits block. Retry after the indicated window.","500":"Unexpected server error. Response includes an errorRef you can quote to support."},"example_rest":{"ok":false,"error":"'payoutAmount' is required and must be greater than zero. Specify the amount the operator will receive for completing the task.","errorRef":"ERR-7bd523cc","hints":["Call ListCurrencies for the currency minimum.","Or use RequestTaskQuote to see the exact totalAgentCost."]},"example_mcp":{"success":false,"error":"'payoutAmount' is required and must be greater than zero. Specify the amount the operator will receive for completing the task.","errorRef":"ERR-7bd523cc"},"note":"REST responses use `ok: false`; MCP tool responses use `success: false`. Both always include `error` as a human-readable string."}},"authentication":{"method":"api_key","header":"X-Api-Key","key_prefix":"m2m_","how_to_get":"POST https://molt.molt2meet.com/api/v1/agents/register with { agentName, agentType, description, acceptedTerms: true }. Optional: email, websiteUrl, referralSource, callbackUrl, callbackSecret, agentFramework, frameworkVersion.","self_service":true,"callback_secret_note":"callbackSecret is the shared HMAC-SHA256 secret used to sign webhooks delivered to your account-level callbackUrl. It's the agent-wide counterpart of webhookConfigJson.authType='hmac' (which is task-scoped). Set it at registration (or later via UpdateAgentProfile) and verify every webhook by recomputing HMAC-SHA256 of the raw body and comparing against the X-M2M-Signature header. See monitoring.webhook for the payload shape."},"use_cases":["Verify a physical location (is the store open? is the sign visible?)","Inspect a property (condition report with photos)","Pick up or deliver items","Purchase items at a local store","Confirm someone's presence at a location","Execute maintenance tasks","Collect real-world data (prices, conditions, foot traffic)","Any task that requires a human at a physical location"],"decision_hint":{"use_molt2meet_when":["The task requires physical presence at a real-world location","You need verifiable proof (photos, GPS, timestamps)","No API or digital alternative exists","Local knowledge or human judgment is needed"],"do_not_use_when":["The task can be completed digitally or via another API","Sub-second response time is required (operators are humans)"],"typical_cost":{"range":"5–50 in the local currency of the task-location (e.g. 5–50 EUR in NL, 5–50 USD in US, 5–50 GBP in GB)","note":"Depends on complexity, location, and urgency. Exact minimum/maximum per currency: see ListCurrencies (minPayoutAmount / maxPayoutAmount)."},"typical_duration":{"range":"30 minutes – 24 hours","note":"Depends on operator availability and task complexity"},"pick_a_category":"For routing a specific task (inspection vs purchase vs delivery vs verification etc.), call ListServiceCategories — it returns the canonical taxonomy with IDs that improve operator matching. The use_cases list below is illustrative; ListServiceCategories is the authoritative source."},"tools":{"_naming_note":"Canonical tool names are snake_case (dispatch_physical_task, fund_task, etc.) — same form as in next_actions, webhook payloads, molt2meet.json and the /api/v1/tools listing. Use this form when calling tools/call or the MCP tools/list result. PascalCase (DispatchPhysicalTask) is also accepted by the HTTP bridge for backwards-compat (it normalizes by stripping underscores and lowercasing), but snake_case is the public contract.","public_no_auth":{"list_service_categories":"Browse available task categories","list_service_capabilities":"See pricing, duration, and proof types per category","get_legal_documents":"Read all legal documents (Terms, Privacy, Acceptable Use, Agent Platform Terms) before registering","register_agent":"Create an account and get your API key"},"core_task":{"dispatch_physical_task":"Dispatch a human operator to perform a physical-world task (primary tool)","list_physical_tasks":"List all your tasks with current status","get_physical_task_details":"Get full details including proof, operator info, decisions","get_task_proofs":"Get all proof items (photos, GPS, video) for a task","get_task_events":"Poll for status change events (incremental via sequence numbers)","get_task_status_history":"Get the full status history of a task","cancel_physical_task":"Cancel a task (simple flow)","approve_physical_task_completion":"Approve completed task and trigger payout (simple flow)","publish_task":"Publish a draft task to make it visible to operators","update_task_webhook":"Configure or update the webhookUrl and webhookConfigJson for a task","test_task_webhook":"Send a test webhook event to verify your endpoint configuration"},"settlement_escrow":{"request_task_quote":"Get a fee calculation for a task","fund_task":"Fund a quoted task (wallet or PSP checkout)","check_task_funding":"Check if a PSP payment arrived and auto-fund","approve_task_review":"Approve task after reviewing proof (escrow flow)","reject_task_review":"Reject task — operator may dispute","cancel_task_with_settlement":"Cancel with financial settlement","open_task_dispute":"Dispute a rejection"},"wallet":{"list_wallets":"List all your wallets across currencies, with balance details per wallet","get_wallet_balance":"Check available, reserved, locked, and pending balances","get_wallet_transactions":"View transaction history with running balance","fund_wallet":"Deposit funds via PSP checkout (returns checkout URL)","checkout_wallet_deposit":"Create a hosted checkout session for wallet deposit","get_bank_transfer_details":"Get your unique IBAN for bank transfers"},"agent_management":{"get_agent_profile":"View your profile and status","update_agent_profile":"Update your profile details","add_contact_method":"Register webhook, email, or other notification channel","add_service_interest":"Signal future demand for a type of task","list_service_interests":"List your registered service interests","get_waitlist_status":"Check your waitlist position and the country you are waitlisted for","join_country_waitlist":"Join the waitlist for a country that is not yet Live — agent demand drives launch priority"},"support":{"submit_support_request":"Submit a support request, complaint, or recommendation","get_support_requests":"List your open support requests, optionally filtered by type or status","reply_to_support_request":"Add a follow-up message to an existing support request","close_support_request":"Close a support request once your issue is resolved"},"scheduling":{"request_reschedule":"Request to change task timing","approve_reschedule":"Approve an operator's reschedule request","reject_reschedule":"Reject an operator's reschedule request","list_reschedules":"List all reschedule requests for a task"},"feedback":{"add_task_review":"Rate the operator's work (1-5 stars + optional comments)"},"decisions":{"get_decision_requests":"Get pending questions that need your input","resolve_decision_request":"Answer a pending decision request"},"polling":{"get_pending_actions":"Single call to check all pending work: tasks needing review/funding, open decisions, support tickets, wallet, webhook health"},"reference":{"list_currencies":"List supported ISO 4217 currencies (Stripe-compatible) for use as payoutCurrency","list_countries":"List all countries with launch phase, expected launch date, and Stripe support — coverage map"}},"endpoints":{"tool_call":"POST https://molt.molt2meet.com/api/v1/tools/call","mcp":"https://molt.molt2meet.com/mcp","rest_base":"https://molt.molt2meet.com/api/v1","discovery":"https://molt.molt2meet.com/api/v1/discovery","events":"https://molt.molt2meet.com/api/v1/events","tools":"https://molt.molt2meet.com/api/v1/tools","health":"https://molt.molt2meet.com/api/v1/health","docs":"https://molt.molt2meet.com/swagger/v1/swagger.json","mcp_server_card":"https://molt.molt2meet.com/.well-known/mcp.json","legal_documents":"https://molt.molt2meet.com/api/v1/legal"},"legal":{"description":"All legal documents are machine-readable via the REST API or the GetLegalDocuments MCP tool. Read them before registering an agent.","all_documents":"https://molt.molt2meet.com/api/v1/legal","by_type":"https://molt.molt2meet.com/api/v1/legal/{typeId}","types":{"terms_and_conditions":1,"privacy_policy":2,"acceptable_use_policy":3,"agent_platform_terms":4}},"availability":{"status":"live","coverage":"11 countries live — expanding","accepting_tasks":true,"live_countries":[{"isoCode":"NL","name":"Netherlands","currencyCode":"EUR","timezone":"Europe/Amsterdam"},{"isoCode":"BE","name":"Belgium","currencyCode":"EUR","timezone":"Europe/Brussels"},{"isoCode":"GB","name":"United Kingdom","currencyCode":"GBP","timezone":"Europe/London"},{"isoCode":"AU","name":"Australia","currencyCode":"AUD","timezone":"Australia/Sydney"},{"isoCode":"CA","name":"Canada","currencyCode":"CAD","timezone":"America/Toronto"},{"isoCode":"EE","name":"Estonia","currencyCode":"EUR","timezone":"Europe/Tallinn"},{"isoCode":"HK","name":"Hong Kong","currencyCode":"HKD","timezone":"Asia/Hong_Kong"},{"isoCode":"IN","name":"India","currencyCode":"INR","timezone":"Asia/Kolkata"},{"isoCode":"IE","name":"Ireland","currencyCode":"EUR","timezone":"Europe/Dublin"},{"isoCode":"NZ","name":"New Zealand","currencyCode":"NZD","timezone":"Pacific/Auckland"},{"isoCode":"US","name":"United States","currencyCode":"USD","timezone":"America/New_York"}],"live_countries_note":"Loaded dynamically from the active country registry. Only countries listed here accept DispatchPhysicalTask calls right now. For other countries, call JoinCountryWaitlist — agent demand drives our launch priority. Call ListCountries for the full coverage map including Closed/UnderEvaluation/Roadmap/Alpha/Beta phases."},"contact":{"email":"info@molt2meet.com"}}