Skip to main content

Documentation

Ovryth docs

Everything needed to understand, use, and build on Ovryth: payroll for real community work, paid in USDC on Base.

Earn in a roomCreate a roomInspect proofUse the API

Overview

Ovryth pays members who do real work in a project's Telegram, in USDC on Base, within minutes. The project keeps its budget in its own Base Account and grants Ovryth a capped, revocable spend permission. Low-quality or copied messages are refused in public with a reason, and Ovryth can never spend past the weekly cap because the cap is enforced on chain.

How it works

A project funds a weekly cap in its Base Account and grants a spend permission naming the Ovryth payer contract as the only spender. Members post work in the project's Telegram group where Ovryth is an admin. Each message is scored against the project's rules; real work is paid, and everything else is refused in public. Every payout is a single on-chain transaction, and a payout past the cap reverts.

Getting started

Earn in a room

Join a project's group where Ovryth is active, DM the bot /wallet 0xYourAddress once, then answer a pinned question with real, specific work. You are paid in-thread with a BaseScan link. Copying an earlier answer is refused.

Open a room

You need a Base Account, some USDC on Base for the weekly cap, and a Telegram group where you are an admin. Connect at /open, set the allowance and sign the spend permission, write your rules, then add @Ovryth_bot and send /link in the group.

Core concepts

Base Account
A smart-wallet account on Base that can sign a spend permission. Plain seed-phrase wallets (EOAs) are not supported.
Spend permission
A signed, on-chain authorization letting the Ovryth payer spend up to a weekly allowance from the project's account, and no more. Revocable in one transaction.
Weekly cap
The allowance per 7-day period. A payout past it reverts on chain. It resets each period.
Non-custodial
Ovryth never holds funds. Each payout is one transaction from the project's account to the member.
Refusal
A message judged not to be real work. Ovryth replies in public with a fixed reason, at most once per member per day.
Hold
Approved work with no linked wallet is held for 72 hours, then released back to the budget.
Floors
Minimum account age and room tenure, plus per-member weekly and per-room daily caps, applied before payment.

Room flow

For each message: a cheap pre-filter checks length, links, duplicates, and floors. Candidates that pass go to the model, which classifies the message against the room's categories and proposes an amount within the category range. A deterministic policy layer then applies floors and caps and can only lower or zero the amount, never raise it. The result is a payout to the member's linked wallet, a 72-hour hold if there is no wallet, or a public refusal. Recipients come only from the wallet a member linked in a DM, never from message text.

Telegram commands

/wallet 0x…
DM the bot to link your payout address. Changing it requires a confirmation.
/rules
DM the bot to list the rooms you are in and their rules.
/link <code>
Sent in a group by the owner to bind it to a room.
#question …
Pin a question so answers are judged against a real prompt.

Console

The owner console at /console shows the weekly budget bar, the spend permission, the ledger of paid and refused contributions, and operator notes (last sweeper run, pending jobs, operator gas). Owners connect their Base Account to pause or resume the room and edit the rules; both actions are signed and verified against the room owner. Revoking is done from the Base Account's own permissions screen and stops Ovryth immediately.

API reference

POST/api/rooms
Create a room from a signed spend permission and initial rules. Returns { slug, linkCode }.
auth: Owner signature
GET/api/rooms/[slug]
Public room JSON: room, permission status, rules version, this week's payouts and refusals, totals.
auth: Public
PUT/api/rooms/[slug]/rules
Publish a new rules version. Returns { version }.
auth: Owner signature
POST/api/rooms/[slug]/pause
Pause or resume scoring. Body { paused: boolean }.
auth: Owner signature
POST/api/telegram
Telegram webhook. Always 200 after storing; work runs after the response.
auth: Secret header
POST/api/tick
Sweeper: retry payouts, release holds, poll permission status, alert on low gas.
auth: Bearer TICK_SECRET

Owner-signed routes take a SIWE-style message signed by the room's Base Account, valid for ten minutes. The public room JSON is also rendered on the room page.

Technical details

Chain: Base mainnet, chain id 8453. USDC 0x8335…2913. Coinbase SpendPermissionManager 0xf852…67Ad. OvrythPayer 0x4854…3999, verified on BaseScan, with no withdraw, no arbitrary call, and no way to hold funds. The payer's pay() approves the permission once, spends within the cap, and transfers to the member in a single transaction. Stack: Next.js App Router, viem, Prisma on Neon Postgres, and a raw Telegram Bot API webhook. See /proof for the on-chain artifacts.