# Submitting a tool to aidirecto, from an agent

aidirecto is a directory of AI tools. Every listing is hand-reviewed; nothing an agent submits is published automatically.

Human-readable version of this page: https://aidirecto.com/agents

## Two endpoints

- Submit: `POST https://aidirecto.com/api/agent/submit`
- Status: `GET https://aidirecto.com/api/agent/status` (JSON, for polling)
- Human-readable status: `https://aidirecto.com/s/<token>`

## Credential: the maker's private link

There is no signup and no API key. The maker's private link IS the credential:

    https://aidirecto.com/s/<32 hex characters>

The token is the last path segment. Where a maker gets it:

1. Submit once at https://aidirecto.com/submit with their email; the "Received" email contains the link.
2. Or sign in with Google and open https://aidirecto.com/account — the link is shown there and can be rotated (rotating kills the old one immediately).

Treat the token like a password: it can submit tools under that address and read that address's submissions. Send it only to these endpoints, never in a URL you share, a screenshot or a public page.

## Submit

    curl -X POST https://aidirecto.com/api/agent/submit \
      -H "Authorization: Bearer <token>" \
      -H "content-type: application/json" \
      -d '{"url":"https://example.com","name":"Example"}'

Fields:

- `url` (required): http(s) URL of the tool's site. The crawler reads it to draft the listing.
- `name` (optional): display name. Otherwise the crawled `<title>` is used.
- Any `email` you send is ignored; the token fixes the address.

Success (200):

    {
      "ok": true,
      "id": "sub_...",
      "slug": "example",
      "name": "Example",
      "statusUrl": "https://aidirecto.com/s/<token>",
      "review": "human",
      "next": "poll status_url about once a day. ..."
    }

`slug` is absent when the site could not be read yet: the submission is queued and an editor drafts it by hand.

Errors (JSON body always has `error`):

- `401` unknown, rotated or missing token → ask the maker for a current link. Do not guess tokens.
- `400` invalid URL, listing-policy refusal, already listed (`existingSlug` is set), or rate limited.

One listing per domain: resubmitting a domain that already exists joins that draft instead of creating a duplicate; the response still has `slug`.

Limits: 10 submissions per address per 24 hours, 50 auto-drafts per day across the whole site. A daily cap only queues the submission for a human, it does not discard it.

## Status

    curl https://aidirecto.com/api/agent/status -H "Authorization: Bearer <token>"

    {
      "ok": true,
      "email": "maker@example.com",
      "submissions": [
        { "id": "sub_...", "url": "https://example.com", "domain": "example.com", "name": "Example",
          "status": "reviewing", "createdAt": "2026-10-20T12:00:00.000Z",
          "tool": { "slug": "example", "name": "Example", "status": "draft" } }
      ]
    }

`tool.status` walks `draft` → `approved` → `published`; `rejected` and `discontinued` are terminal. Poll at most once a day — nothing changes faster, and weekly re-checks update pricing and uptime after publication.

## What happens after submit

1. The crawler drafts the listing from the site (name, tagline, pricing, categories, socials).
2. Every field is checked against the live site. A listing that passes every check is published; anything ambiguous goes to a person. Nothing is published just because it was submitted.
3. On approval the maker gets the badge code; the listing goes live when the badge is found on their site.
4. After that, pricing and uptime are re-checked weekly and the listing carries the date of the last check.

Listing is free; there is no paid or fast-track tier. Policy: https://aidirecto.com/legal/listing-policy · Method: https://aidirecto.com/how-we-check
