adland-1Monetize your building spaces collectively & transparently
One RPC call fetches all the onchain data, rendered by very lightweight packages, like the examples below.
Host it and get paid in USDC.
<!-- Styling: see https://adland.space/llms.txt for the
--adland-* custom properties and ::part() hooks -->
<script src="https://cdn.jsdelivr.net/npm/@adland/embed@0.5.0/dist/adland.js" async></script>
<adland-slot slot-key="adland-1"></adland-slot>One script tag and one element. A single RPC call fetches the ad.
{
"version": 1,
"domain": "yoursite.com",
"payTo": "0xYourWallet…",
"nonce": "k9x2m4p7",
"issuedAt": "2026-08-27T10:00:00.000Z",
"signature": "0x…"
}Signed once with the wallet you want paying. Hosting it proves the domain is yours; the signature proves the address is.
embedadland.jsonearn USDC
Four ways to put it on a page, all live.
Paste it
no styling at all
adland-1<script src="https://cdn.jsdelivr.net/npm/@adland/embed@0.5.0/dist/adland.js" async></script>
<adland-slot slot-key="adland-1"></adland-slot>Theme it
24 CSS custom properties, hover it
adland-1<!-- same script as above -->
<adland-slot
slot-key="adland-1"
style="--adland-bleed: 10px;
--adland-bg: #FFE500;
--adland-fg: #000;
--adland-border: #000;
--adland-border-width: 2px;
--adland-radius: 0;
--adland-shadow: 6px 6px 0 #000;
--adland-shadow-hover: 2px 2px 0 #000;
--adland-transform-hover: translate(4px, 4px)"
></adland-slot>Style it with your own classes
render-mode=light, Tailwind reaches the card
adland-1<!-- same script as above -->
<adland-slot
slot-key="adland-1"
render-mode="light"
class="[&_.adland-card]:flex [&_.adland-card]:gap-3
[&_.adland-card]:rounded-xl [&_.adland-card]:border
[&_.adland-media]:size-12 [&_.adland-title]:font-medium"
></adland-slot>Or build the card
React, the markup is yours
adland-1npm i @adland/react
import { Ad, AdImage, AdTitle } from "@adland/react";
<Ad slotKey="adland-1">
<AdImage className="aspect-video w-full" />
<AdTitle className="font-medium" />
</Ad>All four are live and read the same slot on Base. One eth_call each, since the name and the creative come back together. They run with consent="denied" so this page does not count as impressions against the ad. Leave it off and yours are tracked normally.
Link
linkAny URL. AdLand reads the page's Open Graph tags for the title, description and picture.
You supply url
{
"type": "link",
"data": {
"url": "https://blog.ethereum.org/"
},
"metadata": {
"title": "Home | Ethereum Foundation Blog",
"description": "Latest news and announcements from the Ethereum Foundation.",
"image": "https://blog.ethereum.org/images/ethereum-blog-og-image.png",
"icon": "https://blog.ethereum.org/images/favicon.png"
}
}Home | Ethereum Foundation Blog
Latest news and announcements from the Ethereum Foundation.
These six are the whole set, the same union @adland/data validates against, so a type that is not here cannot be placed. The card is a real component rendering static data, not a picture.
Access to your ad slot is always on sale.
You never set a price. Whoever wants the space says what it is worth to them, and pays rent on their own price for as long as they hold it.
Anyone can take it from them at that same price, which is what stops them lowballing you.
This slot charges 50% of the advertiser's own valuation per 30 days, and it accrues by the second, not on the 1st.
$3USDC
You earn
$1.50/ month
You collect, whenever
It piles up in the slot until somebody calls collect(), which pushes it to your recipient address. Permissionless, so you can call it, we can call it, or a bot can. Nobody can redirect it.