Remlo Payroll API — MPP Grade D
Compliance Checks
3 issues
- Missing 402 response declaration on GET /api/reputation/{address}
- Missing 402 response declaration on POST /api/x402/payroll/execute
- Endpoint GET /api/reputation/{address} returned 200 without payment
Paid Operations (20)
POST /api/x402/streams dynamic
- Amount
- map[amount:0.050000 currency:USD mode:fixed]
- Currency
- -
- Method
- Intent
- -
- 402 Declared
- Yes
authMode: x402 price: map[amount:0.050000 currency:USD mode:fixed] protocols: [map[x402:map[]]]
Input Schema
| Field | Type | Required | Description |
|---|---|---|---|
| amountUsdc | number | Yes | Total USDC to stream |
| cancelAuthority | string | Yes |
Who can cancel the stream early
enum: sender, recipient, both |
| cliffSeconds | number | No | Optional cliff before any funds vest |
| durationSeconds | number | Yes | Stream window in seconds |
| recipientAddress | string | Yes | Solana base58 pubkey |
Response Schema (200)
| Field | Type | Description |
|---|---|---|
| claimedUsdc | number | - |
| estimatedEndAt | integer | Unix seconds |
| note | string | - |
| provider | string | - |
| remainingUsdc | number | - |
| startedAt | integer | Unix seconds |
| streamId | string | - |
| stub | boolean | - |
GET /api/reputation/{address} dynamic
- Amount
- map[amount:0.000000 currency:USD mode:fixed]
- Currency
- -
- Method
- Intent
- -
authMode: none price: map[amount:0.000000 currency:USD mode:fixed] protocols: [map[x402:map[]]]
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| address | path | string | Yes | Solana base58 pubkey OR numeric ERC-8004 agent ID |
Response Schema (200)
| Field | Type | Description |
|---|---|---|
| last_updated | string (date-time) | - |
| solana | object | - |
| subject | object | - |
| tempo | object | - |
| unified | object | - |
GET /api/mpp/treasury/yield-rates dynamic
Returns current APY and allocation breakdown for the Remlo treasury.
- Amount
- map[amount:0.010000 currency:USD mode:fixed]
- Currency
- -
- Method
- Intent
- -
- 402 Declared
- Yes
price: map[amount:0.010000 currency:USD mode:fixed] protocols: [map[x402:map[]] map[mpp:map[currency: intent: method:]]]
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| token | query | string | No | Optional token address filter (defaults to pathUSD) |
Input Schema
| Field | Type | Required | Description |
|---|---|---|---|
| token | string | No | Optional token address |
Response Schema (200)
| Field | Type | Description |
|---|---|---|
| allocation | array[number] | - |
| apy_bps | number | APY in basis points |
| apy_percent | number | APY as percentage |
| sources | array[string] | - |
| timestamp | number | - |
POST /api/mpp/payroll/execute dynamic
Triggers batch payroll execution for a prepared payroll run. Agent wallet signs the on-chain transaction.
- Amount
- map[amount:1.000000 currency:USD mode:fixed]
- Currency
- -
- Method
- Intent
- -
- 402 Declared
- Yes
price: map[amount:1.000000 currency:USD mode:fixed] protocols: [map[x402:map[]] map[mpp:map[currency: intent: method:]]]
Input Schema
| Field | Type | Required | Description |
|---|---|---|---|
| payrollRunId | string | Yes | UUID of the payroll run to execute |
Response Schema (200)
| Field | Type | Description |
|---|---|---|
| employer_account_id | string | - |
| employer_admin_wallet | string | - |
| payroll_run_id | string | - |
| recipient_count | number | - |
| success | boolean | - |
| tx_hash | string | - |
POST /api/mpp/employee/advance dynamic
Allows an employee to claim their currently accrued salary stream balance as an on-demand advance.
- Amount
- map[amount:0.500000 currency:USD mode:fixed]
- Currency
- -
- Method
- Intent
- -
- 402 Declared
- Yes
price: map[amount:0.500000 currency:USD mode:fixed] protocols: [map[x402:map[]] map[mpp:map[currency: intent: method:]]]
Input Schema
| Field | Type | Required | Description |
|---|---|---|---|
| employeeAddress | string | Yes | 0x-prefixed EVM wallet address of the employee |
Response Schema (200)
| Field | Type | Description |
|---|---|---|
| claimed_at | string (date-time) | - |
| employee_address | string | - |
| success | boolean | - |
| tx_hash | string | - |
POST /api/mpp/compliance/check dynamic
Screens a wallet address against configured compliance policies (OFAC, custom blocklists).
- Amount
- map[amount:0.050000 currency:USD mode:fixed]
- Currency
- -
- Method
- Intent
- -
- 402 Declared
- Yes
price: map[amount:0.050000 currency:USD mode:fixed] protocols: [map[x402:map[]] map[mpp:map[currency: intent: method:]]]
Input Schema
| Field | Type | Required | Description |
|---|---|---|---|
| employerId | string | No | Optional employer UUID for employer-scoped policies |
| policyId | number | No | Optional policy ID (defaults to global policy) |
| walletAddress | string | Yes | 0x-prefixed EVM wallet address to screen |
Response Schema (200)
| Field | Type | Description |
|---|---|---|
| authorized | boolean | - |
| checked_at | string (date-time) | - |
| policy_id | number | - |
| result | string | - |
| risk_score | number | - |
| wallet_address | string | - |
GET /api/mpp/employee/balance/stream dynamic
Server-Sent Events stream of an employee's real-time accruing salary balance, ticking every second.
- Amount
- map[amount:0.001000 currency:USD mode:fixed]
- Currency
- -
- Method
- Intent
- -
- 402 Declared
- Yes
price: map[amount:0.001000 currency:USD mode:fixed] protocols: [map[x402:map[]] map[mpp:map[currency: intent: method:]]]
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| employeeId | query | string | No | Employee UUID |
| address | query | string | No | 0x-prefixed EVM wallet address (legacy fallback) |
Input Schema
| Field | Type | Required | Description |
|---|---|---|---|
| employeeId | string | Yes | Employee UUID |
| streamId | string | No | Stream contract ID |
Response Schema (200)
| Field | Type | Description |
|---|---|---|
| accrued_raw | string | - |
| accrued_usd | string | - |
| address | string | - |
| balance | string | - |
| balanceUsd | string | - |
| employeeId | string | - |
| salary_per_second_usd | string | - |
| tick | number | - |
| timestamp | number | - |
GET /api/mpp/payslips/{runId}/{employeeId} dynamic
Retrieves the payslip for an employee in a specific payroll run.
- Amount
- map[amount:0.020000 currency:USD mode:fixed]
- Currency
- -
- Method
- Intent
- -
- 402 Declared
- Yes
price: map[amount:0.020000 currency:USD mode:fixed] protocols: [map[x402:map[]] map[mpp:map[currency: intent: method:]]]
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| runId | path | string | Yes | Payroll run UUID |
| employeeId | path | string | Yes | Employee UUID |
Input Schema
| Field | Type | Required | Description |
|---|---|---|---|
| employeeId | string | Yes | Employee UUID (path) |
| runId | string | Yes | Payroll run UUID (path) |
Response Schema (200)
| Field | Type | Description |
|---|---|---|
| payslip | object | - |
POST /api/mpp/memo/decode dynamic
Decodes a 0x-prefixed 32-byte hex memo into structured payroll fields.
- Amount
- map[amount:0.010000 currency:USD mode:fixed]
- Currency
- -
- Method
- Intent
- -
- 402 Declared
- Yes
price: map[amount:0.010000 currency:USD mode:fixed] protocols: [map[x402:map[]] map[mpp:map[currency: intent: method:]]]
Input Schema
| Field | Type | Required | Description |
|---|---|---|---|
| memo | string | Yes | 0x-prefixed 32-byte hex memo (66 chars total) |
Response Schema (200)
| Field | Type | Description |
|---|---|---|
| fields | object | - |
| memo | string | - |
GET /api/mpp/employee/{id}/history dynamic
Returns paginated payment history for an employee.
- Amount
- map[amount:0.050000 currency:USD mode:fixed]
- Currency
- -
- Method
- Intent
- -
- 402 Declared
- Yes
price: map[amount:0.050000 currency:USD mode:fixed] protocols: [map[x402:map[]] map[mpp:map[currency: intent: method:]]]
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| id | path | string | Yes | Employee UUID |
| limit | query | number | No | Number of records to return (max 100) |
Input Schema
| Field | Type | Required | Description |
|---|---|---|---|
| cursor | string | No | Optional pagination cursor |
| id | string | Yes | Employee UUID (path) |
| limit | integer | No | Optional page size |
Response Schema (200)
| Field | Type | Description |
|---|---|---|
| count | number | - |
| employee_id | string | - |
| payments | array[object] | - |
POST /api/mpp/bridge/offramp dynamic
Converts USDC.e balance to fiat and initiates a bank transfer via the Bridge protocol.
- Amount
- map[amount:0.250000 currency:USD mode:fixed]
- Currency
- -
- Method
- Intent
- -
- 402 Declared
- Yes
price: map[amount:0.250000 currency:USD mode:fixed] protocols: [map[x402:map[]] map[mpp:map[currency: intent: method:]]]
Input Schema
| Field | Type | Required | Description |
|---|---|---|---|
| amount | string | Yes | USD amount to off-ramp (e.g. "100.00") |
| bankAccountId | string | Yes | Bridge-registered bank account ID |
| destinationType | string | Yes |
Bank transfer rail
enum: ach, sepa, spei, pix |
| employeeId | string | Yes | Employee UUID |
Response Schema (200)
| Field | Type | Description |
|---|---|---|
| amount | string | - |
| created_at | string (date-time) | - |
| destination_type | string | - |
| status | string | - |
| success | boolean | - |
| transfer_id | string | - |
POST /api/mpp/treasury/optimize dynamic
Analyzes current treasury state and returns rebalancing recommendations to maximize yield.
- Amount
- map[amount:0.100000 currency:USD mode:fixed]
- Currency
- -
- Method
- Intent
- -
- 402 Declared
- Yes
price: map[amount:0.100000 currency:USD mode:fixed] protocols: [map[x402:map[]] map[mpp:map[currency: intent: method:]]]
Input Schema
| Field | Type | Required | Description |
|---|---|---|---|
| employerId | string | Yes | Employer UUID |
| question | string | No | Optional natural-language question about the treasury |
Response Schema (200)
| Field | Type | Description |
|---|---|---|
| analyzedAt | string (date-time) | - |
| current_allocation | array[number] | - |
| employerAccountId | string | - |
| employerAdminWallet | string | - |
| employerId | string | - |
| projected_annual_yield_usd | string | - |
| question | string | - |
| recommendations | array[object] | - |
| recommended_allocation | array[number] | - |
| suggestion | string | - |
| summary | object | - |
GET /api/mpp/marketplace/compliance-list/{employerId} dynamic
Returns the list of compliance-cleared wallet addresses for an employer, suitable for marketplace use.
- Amount
- map[amount:0.500000 currency:USD mode:fixed]
- Currency
- -
- Method
- Intent
- -
- 402 Declared
- Yes
price: map[amount:0.500000 currency:USD mode:fixed] protocols: [map[x402:map[]] map[mpp:map[currency: intent: method:]]]
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| employerId | path | string | Yes | Employer UUID |
| limit | query | number | No | Maximum number of wallet entries to return |
Input Schema
| Field | Type | Required | Description |
|---|---|---|---|
| employerId | string | Yes | Employer UUID (path) |
Response Schema (200)
| Field | Type | Description |
|---|---|---|
| clearedWallets | number | - |
| lastUpdated | string (date-time) | - |
| list | array[object] | - |
| providerId | string | - |
POST /api/mpp/escrow/post dynamic
Creates a three-party escrow: requester locks USDC, worker submits a deliverable, Claude judge decides against rubric_prompt. Funds custodied on-chain by the remlo_escrow Anchor program PDA — not by Remlo. Settlement and refund are permissionless after the verdict is posted. Max 100 USDC per escrow, 1h-7d expiry, max 2000-char rubric.
- Amount
- map[amount:0.100000 currency:USD mode:fixed]
- Currency
- -
- Method
- Intent
- -
- 402 Declared
- Yes
price: map[amount:0.100000 currency:USD mode:fixed] protocols: [map[x402:map[]] map[mpp:map[currency: intent: method:]]]
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| X-Agent-Identifier | header | string | Yes | Pre-registered agent identity authorized for this employer. |
Input Schema
| Field | Type | Required | Description |
|---|---|---|---|
| amount_usdc | string | Yes | USDC amount as decimal string (e.g. "10.00"), max 100.00 |
| employer_id | string | Yes | Remlo employer UUID |
| expiry_hours | number | No | Hours until escrow auto-refunds if no verdict. Default 24, max 168 (7 days). |
| rubric_prompt | string | Yes | Validation criteria for Claude to evaluate the deliverable against. Max 2000 chars. |
| worker_agent_identifier | string | Yes | Agent identity of the worker — must match X-Agent-Identifier when they call /deliver |
| worker_wallet_address | string | Yes | Solana address of the worker who will receive funds on approved verdict |
Response Schema (200)
| Field | Type | Description |
|---|---|---|
| applied_expiry_hours | number | Hours actually applied (reputation-scaled from requested). |
| escrow_id | string | - |
| escrow_pda | string | - |
| expires_at | string (date-time) | - |
| initialize_signature | string | - |
| requested_expiry_hours | number | Hours the caller requested. |
| solana_explorer_urls | object | - |
| status | string | - |
| worker_attestation_count | number | Number of prior SAS attestations driving the tier. |
| worker_reputation_tier | string | Worker SAS reputation tier at escrow-post time. |
POST /api/mpp/escrow/deliver dynamic
The submitting agent must match worker_agent_identifier recorded at post time. Validation and settlement broadcast asynchronously — poll /status for the final verdict.
- Amount
- map[amount:0.020000 currency:USD mode:fixed]
- Currency
- -
- Method
- Intent
- -
- 402 Declared
- Yes
price: map[amount:0.020000 currency:USD mode:fixed] protocols: [map[x402:map[]] map[mpp:map[currency: intent: method:]]]
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| X-Agent-Identifier | header | string | Yes | Must equal worker_agent_identifier of the target escrow. |
Input Schema
| Field | Type | Required | Description |
|---|---|---|---|
| deliverable_uri | string | Yes | HTTPS URL, IPFS link, or inline data: URI |
| escrow_id | string | Yes |
POST /api/mpp/escrow/deliver-signed dynamic
For worker agents that manage their own Solana keys instead of delegating to Remlo Privy. Client signs the submit_deliverable instruction offline; Remlo verifies signature + uri_hash match, then broadcasts and runs validator+settle.
- Amount
- map[amount:0.020000 currency:USD mode:fixed]
- Currency
- -
- Method
- Intent
- -
- 402 Declared
- Yes
price: map[amount:0.020000 currency:USD mode:fixed] protocols: [map[x402:map[]] map[mpp:map[currency: intent: method:]]]
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| X-Agent-Identifier | header | string | Yes | Must equal worker_agent_identifier of the target escrow. |
Input Schema
| Field | Type | Required | Description |
|---|---|---|---|
| deliverable_uri | string | Yes | HTTPS URL, IPFS link, or inline data: URI |
| escrow_id | string | Yes | |
| signed_transaction | string | Yes | Base64-encoded fully-signed Solana Transaction |
GET /api/mpp/escrow/{id}/status dynamic
Public read access to any x402-paying caller. Returns public-facing fields only — no validator model, no internal hashes, no employer scope.
- Amount
- map[amount:0.010000 currency:USD mode:fixed]
- Currency
- -
- Method
- Intent
- -
- 402 Declared
- Yes
price: map[amount:0.010000 currency:USD mode:fixed] protocols: [map[x402:map[]] map[mpp:map[currency: intent: method:]]]
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| id | path | string | Yes | Escrow UUID |
Input Schema
| Field | Type | Required | Description |
|---|---|---|---|
| id | string | Yes | Escrow UUID (path) |
Response Schema (200)
| Field | Type | Description |
|---|---|---|
| amount_usdc | string | - |
| deliverable_uri | string | - |
| escrow_id | string | - |
| expires_at | string (date-time) | - |
| rubric_prompt | string | - |
| signatures | object | - |
| solana_explorer_urls | object | - |
| status | string | - |
| validator_confidence | integer | - |
| validator_reasoning | string | - |
| validator_verdict | string | - |
| worker_wallet_address | string | - |
POST /api/mpp/agent/pay dynamic
Sends USDC from a Remlo employer treasury to a recipient wallet. Designed for autonomous agents paying other autonomous agents: pay $0.05 via x402, specify recipient and amount, receive on-chain tx hash. The caller must identify itself via the X-Agent-Identifier header; that identifier must be pre-registered by the employer at /dashboard/settings/agents with per-transaction and per-day spend caps. Calls that exceed caps or use an unregistered identifier are rejected with 403 (AGENT_NOT_AUTHORIZED, PER_TX_CAP_EXCEEDED, PER_DAY_CAP_EXCEEDED) — the $0.05 x402 fee is still charged. Successful calls write ERC-8004 Reputation Registry feedback to the Remlo Payroll Agent on-chain identity; the reputation record is publicly queryable at /api/reputation/{agentId}.
- Amount
- map[amount:0.050000 currency:USD mode:fixed]
- Currency
- -
- Method
- Intent
- -
- 402 Declared
- Yes
price: map[amount:0.050000 currency:USD mode:fixed] protocols: [map[x402:map[]] map[mpp:map[currency: intent: method:]]]
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| X-Agent-Identifier | header | string | Yes | Pre-registered agent identity (EVM address, AgentCard URI, or opaque token). Must match an active employer_agent_authorizations row for the employer. |
Input Schema
| Field | Type | Required | Description |
|---|---|---|---|
| amount | string | Yes | USDC amount as decimal string (e.g. "12.50") |
| employer_id | string | Yes | Remlo employer UUID whose treasury funds the transfer |
| recipient_wallet | string | Yes | 0x-prefixed EVM address of the recipient agent or human |
| reference | string | No | Optional free-text reference for audit trail |
Response Schema (200)
| Field | Type | Description |
|---|---|---|
| amount | string | - |
| employer_account_id | string | - |
| employer_id | string | - |
| explorer_url | string | - |
| memo | string | - |
| recipient | string | - |
| reference | string | - |
| success | boolean | - |
| timestamp | string (date-time) | - |
| tx_hash | string | - |
POST /api/mpp/agent/session/treasury dynamic
Perform treasury management actions (balance, yield, rebalance, headcount) per call. Designed for AI agent workflows requiring treasury reads/writes.
- Amount
- map[amount:0.020000 currency:USD mode:fixed]
- Currency
- -
- Method
- Intent
- -
- 402 Declared
- Yes
price: map[amount:0.020000 currency:USD mode:fixed] protocols: [map[x402:map[]] map[mpp:map[currency: intent: method:]]]
Input Schema
| Field | Type | Required | Description |
|---|---|---|---|
| action | string | Yes |
Treasury action to perform
enum: balance, yield, rebalance, headcount |
| allocation | array | No | Target allocation percentages (for rebalance action) |
| employerId | string | Yes | Employer UUID |
| params | object | No | Additional action parameters |
Response Schema (200)
| Field | Type | Description |
|---|---|---|
| action | string | - |
| result | object | Action-specific result payload |
| timestamp | number | - |
POST /api/x402/payroll/execute dynamic
Authenticated via Privy JWT (identity-only, zero-dollar auth). Broadcasts any Tempo payments via REMLO_AGENT_PRIVATE_KEY (legacy transitional path) and any Solana payments via a Privy server wallet with policy enforcement. Mixed-chain decisions return both tempo_tx_hash and solana_signatures. Per-item policy rejections are surfaced in solana_policy_rejections without failing the entire run — the affected payment_items rows are marked status=policy_rejected with the rejection reason.
- Amount
- map[amount:0.000000 currency:USD mode:fixed]
- Currency
- -
- Method
- Intent
- -
authMode: identity price: map[amount:0.000000 currency:USD mode:fixed] protocols: [map[x402:map[]]]
Input Schema
| Field | Type | Required | Description |
|---|---|---|---|
| decision_id | string | Yes | agent_decisions row UUID to execute |
| employer_id | string | Yes | Employer UUID |
Response Schema (200)
| Field | Type | Description |
|---|---|---|
| decision_id | string | - |
| employee_count | integer | - |
| payroll_run_id | string | - |
| solana_broadcast_error | string | - |
| solana_explorer_urls | array[string] | - |
| solana_policy_rejections | array[object] | - |
| solana_signatures | array[string] | - |
| tempo_broadcast_error | string | - |
| tempo_explorer_url | string | - |
| tempo_tx_hash | string | - |
| total_amount | number | - |
Payment Methods
- Methods
- -
- Intents
- -
- Currencies (discovery)
- -
- Multiple Challenges
- No
Security
- TLS Version
- TLSv1.3
- Challenge ID Unique
- -
- Challenge ID Length
- -
- Digest Binding
- -
Uptime
- Discovery
- Reachable (196ms)
- Challenge
- Reachable (170ms)
- Last Checked
Schema Completeness
- Paid Operations
- 20
- With Input Schema
- 19
- With Description
- 20
1 missing schema
- GET /api/reputation/{address}
Documentation
- Homepage
- -
- API Reference
- -
- llms.txt
- -
Discovery
- OpenAPI URL
- https://www.remlo.xyz/openapi.json
- OpenAPI Version
- 3.1.0
- Service Version
- 1.0.0
- Document Size
- 37738 bytes
- Document Hash
- 593730ebbc5bfd7d91027b4275df1d9c05696e18d5a14ae39c89c103fc0ca7db
Version History (1 snapshots)
- document hash changed (no semantic differences detected)
Scan snapshots
| Date | Grade | Score | Response | Status |
|---|---|---|---|---|
| 2026-04-21 | D | 54% | 479ms | Up |