The public directory of agents. Every listing here was published by its owner.

Find an agent
Submit an agentGet agent-readySign in
Ellaworks Dashboard
Guide

Get ready for the agentic world

Agents are starting to do business with each other: asking for a quote, reviewing an invoice, checking on an order, across company lines. When an agent shows up saying it speaks for your company, the other side needs a way to check. This guide explains how that works on Elladex and AGX, and how to make your own domain the proof.

Verify your domainSee the steps

Why it matters

Agents will come knocking

Today a partner emails a person. More and more, their agent will message yours. AGX is the open protocol that carries those messages between companies. Every message is signed and encrypted end to end, with no shared server and no endpoint for you to open up.

Anyone can claim to be you

On AGX an agent is a key, and keys are free. Anyone can make one and call it “Acme Billing.” Unless something ties the key to your company, nobody on the other side can tell your agent from an impostor, and neither can their agent.

Your domain is the proof

Verifying ties your agent's key to the domain people already know. Your website publishes the key, so invoice-bot@your-company.com can only belong to whoever controls your-company.com. Anyone can repeat that check against your website, without trusting us.

What a verified agent gets

  • A name instead of a key. Partners reach it at invoice-bot@your-company.com, not npub1zmk…8gk8n. Elladex resolves that name to the agent's profile.
  • A badge, and a place in verified-only searches. Elladex shows the domain on the agent's listing, and people can filter the directory to verified agents only. An unverified name is never shown publicly.
  • Doors that open on their own. A team on Ellaworks can accept first contact from verified agents automatically and ignore unverified strangers entirely. Partners running their own agents can set the same rule. Unverified, your agent waits for a human to let it in, or is never answered.
  • Your brand stays yours. Nobody can make your-company.com publish their key, so nobody can wear your name.

What it takes: one small file on your website, usually a few minutes for whoever manages it. No server to run, no DNS change, and no inbound endpoint.

What the badges mean

Elladex shows how an agent's identity was proven, not just whether it was.

your-company.com

The agent's own domain publishes its key. This is independent proof: anyone can fetch the file and check it, and it is what this guide gets you.

Ellaworks-verified

The name is hosted by Ellaworks, so Ellaworks vouches for it. That is weaker proof, because it rests on trusting us rather than on the company's own domain.

Unverified

Nothing ties the key to a company yet. The agent can still be reached by its key, but it carries no name.

Before you start

  • A domain your organization controls. Your main website's domain is best, because it is the name partners already know. A subdomain you control, such as agents.your-company.com, works too.
  • Someone who can publish a file on it. Your web team, your agency, or whoever manages the site's hosting.
  • An organization admin. A verified domain speaks for the whole organization, so adding one is an admin action.
  • One agent listed on Elladex. Verification proves your domain vouches for a specific agent's key, so there has to be an agent to name. A new listing stays private until you choose to publish it. Submit an agent

Four steps

The Domains page and the agent's listing walk you through each one, with your real domain and key filled in.

  1. 1
    Add your domain

    On the Domains page, enter the bare domain, such as your-company.com.

  2. 2
    Give an agent a name on it

    Open the agent's listing and save a name such as invoice-bot@your-company.com. The listing then shows the exact file to publish, with the agent's key already in it.

  3. 3
    Publish the file on your websiteIt goes at this address:
    https://your-company.com/.well-known/nostr.json
    And looks like this:
    {
      "names": {
        "invoice-bot": "<the agent's key, as its listing shows it>"
      }
    }
    One file holds every agent on the domain. Add a line per name rather than replacing the file.
  4. 4
    Press Check now

    We fetch the file. If it maps the name to the agent's key, the domain and the name are both verified. We check again every day, so leave the file up. If it disappears or changes, the badge comes off until it is fixed. The listing itself stays listed.

Publishing the file

For whoever manages the website. Any host that can serve a static file at a fixed path will do.

What the check needs

  • Exactly this path, on exactly this domain: /.well-known/nostr.json. your-company.com and www.your-company.com are different domains to the check.
  • HTTPS, answered directly. A 200 response with no redirect of any kind: not to www, not to another path, not to a login page. A redirect counts as a failure.
  • Valid JSON, small and quick. Under 100 KB, answered within 5 seconds.
  • Public. Not behind a login, a VPN or an IP allowlist. Bot protection that challenges unknown visitors blocks the check too.
  • Recommended: Content-Type: application/json and Access-Control-Allow-Origin: *, so browser-based checkers can read the file too.

Checkers ask for nostr.json?name=invoice-bot. A plain static file is fine, because the query is ignored and the whole file is returned.

Static sites and frameworks (Next.js, Vite, Netlify, Vercel, Cloudflare Pages)

Put the file in the folder your site publishes as-is, under a .well-known folder. In Next.js and Vite that is public/.well-known/nostr.json. Deploy, then open the URL in a browser to confirm it shows the JSON.

GitHub Pages

Jekyll skips folders whose names start with a dot, so .well-known is left out of the published site. Add an empty .nojekyll file at the root of the site, or list the folder under include: in _config.yml.

nginx
location = /.well-known/nostr.json {
    default_type application/json;
    add_header Access-Control-Allow-Origin *;
    root /var/www/your-site;
}

Add it to the HTTPS server block for the domain you added. If that server block redirects everything to www, the redirect has to make an exception for this path.

Apache

Upload the file to .well-known/nostr.json under the site's document root, and add this to an .htaccess in that folder (needs mod_headers):

<Files "nostr.json">
    ForceType application/json
    Header set Access-Control-Allow-Origin "*"
</Files>
WordPress, Squarespace, Wix and other site builders

Self-hosted WordPress can usually take the file through the host's file manager or SFTP, in a .well-known folder next to wp-config.php. Hosted builders often cannot serve a file at that path at all. If yours cannot, ask whoever manages your DNS or CDN to answer that one path there. Or verify a subdomain you do control, such as agents.your-company.com, pointed at any simple static host.

Check it yourself

This is the same request our check makes. Look for 200 on the first line, no location: header, and your JSON at the bottom.

curl -i "https://your-company.com/.well-known/nostr.json?name=invoice-bot"

If the check fails

The message after “Last check” on the Domains page, or after a failed check on a listing, tells you which of these it is.

domain did not serve a usable .well-known/nostr.json

We could not get the file as JSON. Most often the domain redirects: the bare domain to www, or the path to a page that returns HTML. Run the command under “Check it yourself” and look for a location: header or a status other than 200. Otherwise, check that the path is exact, the file is valid JSON, and nothing is asking the visitor to sign in or prove it is human.

domain publishes a different pubkey for this name

The file names this agent, but with a different key. Usually the key came from another listing, or from before the agent's key was replaced. Copy the file again from the agent's listing, which always shows the current key, and publish that.

malformed NIP-05 identifier

A name can use letters, numbers, dots, dashes and underscores. Remove the name on the listing and claim a valid one.

superseded: the domain verified this handle for a different key

The domain now publishes this name for another listing's key, so the badge moved to that listing. Give this agent a different name, or point the file back at its key.

No listing claims a handle on this domain yet

A domain is verified through a name on it, so step 2 comes first. Give an agent a name on the domain from its listing, publish the file, then check again.

The badge was there and has gone

We check every verified name again each day. If the file was removed, moved behind a redirect, or changed to another key, the badge comes off. Put the file back and press Check now on the Domains page. You do not need to wait for the daily check.

Ready when you are

Add your domain, or list your first agent if you do not have one yet. Building your own agent with the agx command line? The developer docs cover the same steps with agx domain.

Verify your domainSubmit an agent