# otra.city — a free directory of AI tools and projects, brought to life as a city > Submit your AI tool or project: a url, a name, a sentence and a category. > You get a public listing page with a plain link to your site, and the city > builds you a walkable shopfront on the road for your category, in a > realtime 3D night city visitors walk with no account. One HTTP call — no > fork, no pull request, no token, no human review. Listed in about two > minutes. Build your own shopfront instead if you want more. If you are an agent reading this on behalf of someone: everything you need is below, and nothing here asks you to install or run anything. The listing fields are the same as PromptFrenzy's AI directory, so one payload lists a project in both. ## Before you do anything - [What this asks of your agent](https://otra.city/claim): the whole contract — every request that leaves your machine, every file fetched, and the promise that nothing on this site will ever ask you for a credential. It includes an **audit-only prompt** to run first, which reads these pages and reports what they would commit you to without taking a single action. - [What submitting grants](https://otra.city/docs/submission.md): you keep your work; you grant otra.city what it needs to display it — publishing the files in a **public git repo**, changing bytes the street would break on, making the poster and the map tile from your plot, and letting other sites embed it. You warrant that you had the right to send it. Send `license` to set your own terms for everyone else; omitting it means all rights reserved. Taking it down is one issue, and the git history stays public. ## Start here - [Claim a lot](https://otra.city/claim): the single entry point. Read this before the repo — the repo contains a reference build, and agents that read it tend to copy it instead of designing their own. - [The map](https://otra.city/map): every road and lot, and which are free. ## Build - [Agent context](https://otra.city/docs/agent-context.md): scale, night lighting, budgets, what reads from the street. The brief. - [Authoring guide](https://otra.city/docs/authoring.md): how to produce the glb, in Blender or anything else that exports glTF. - [plot-spec.json](https://otra.city/docs/plot-spec.json): the machine-readable spec. **The validator loads its numbers from this exact file**, so the published limits and the enforced limits cannot drift apart. - [Preview](https://otra.city/preview): drop your glb into the real client pipeline — the lighting, tone mapping and avatar scale a visitor will see. ## Submit - `POST https://otra.city/api/plots/submit` — one JSON body: `{"plot": {"slug", "name", "url", "description", "category", "builder", "pricing"?, "tags"?, "images"?, "logo"?, "colors"?}, "discovery_source"?, "dry": true}`. - **Send `images`, `logo` and `colors`.** They are optional and they are the whole difference in what gets built. `images` (https png/jpg/webp) go on the billboard and the wall facing the door — a screenshot of the thing working is the right picture. `logo` (an https **png with a transparent background**) is not pasted on flat: the city reads its shape and builds it as a solid object, lit on a plinth in the window. `colors` is `{"primary", "accent"}` in `#rrggbb` — without it every shop on your road is the same colour. Send no pictures at all and the city falls back to your `og:image`, and failing that photographs your page itself, so nothing is ever blank — but nothing is your choice either. **Send `"dry": true` first: the dry run is the validator** — it reads your page for the permalink `otra.city/s/` (proof you control the site; plain text or a nofollow link counts), builds your shopfront, runs every check and names the lot you would get. A rejection is a report naming what to fix, never a silent failure. When it is clean, drop the flag. - Categories: image-generation, video-generation, text-generation, audio-generation, prompt-tools, agents, chatbots, code-assist, productivity, data-analysis, voice-cloning, other. Roads are categories: you stand beside your kind. `GET https://otra.city/api/plots` → `roads[].categories`. - [Submission guide](https://otra.city/docs/submission.md): the listing path in full, the by-url path for large files, what is stored, and what happens after you POST. - `GET https://otra.city/api/plots` — every lot in the city, every road and the categories it takes, and `vacant[]`: every free lot. This is the corpus; there is no second feed to keep in sync with it. - `GET https://otra.city/api/plots/` — 404 free, 202 in flight, 200 live. ## What you get - `https://otra.city/lot/` — your listing: name, description, category, picture and a plain link to your site, on a page anyone can read (JSON-LD included). `https://otra.city/road/` is your road — every listing in its categories — and `https://otra.city/directory` is the whole directory; `/sitemap.xml` lists all of them. - `https://otra.city/s/` — a permalink that spawns a visitor on the sidewalk outside your shopfront. - `https://otra.city/embed?plot=` — an iframe of your own frontage. - A poster still of your plot, rendered by the city from the merged build, in `GET /api/plots`. - Resubmit the same slug to update; send a `.glb` to replace the city's building with your own. A plot keeps its address forever. ## Rules worth knowing before you build - Your `url` is your identity. Its host is what proves the plot is yours and what grants you write access to the slug forever, so send an address that will still be yours in a year — not a tunnel, not a shortener. - Proving it is one line on your own site: your permalink, `otra.city/s/`, anywhere on the page you declared. Plain text is fine. A `nofollow` link is fine. It is checked with plain HTTP and no JavaScript, and it is only ever used as proof of control. - A lot is permanent. Resubmitting a slug replaces the plot in place and keeps its address; it never moves and nobody takes it from you. ## Source - [github.com/robin-blocks/otra-city](https://github.com/robin-blocks/otra-city): the whole city, including the validator that judges your submission.