What is public
Noda is a web app for renewable energy developers at app.noda.energy. What you can read without an account is the content of this site, in three forms: a read-only JSON API, a Markdown version of every page, and the files that language models and search engines read (llms.txt, sitemap.xml).
The app itself has no public API yet. Projects, maps, chats and reports belong to signed-in accounts. For partner or API access, write to hello@noda.energy.
The content API
Base address https://noda.energy/api/v1. Requests are GET or HEAD, need no key and may come from any origin (Access-Control-Allow-Origin: *). Answers are JSON, Content-Type: application/json; charset=utf-8, and change only when the site does.
| Request | operationId | Returns |
|---|---|---|
GET /api/v1 | getApiIndex | List the API's endpoints and files |
GET /api/v1/use-cases | listUseCases | List Noda's use cases |
GET /api/v1/use-cases/{useCaseId} | getUseCase | Get one use case |
GET /api/v1/guides | listGuides | List the three guides |
GET /api/v1/guides/{guideId} | getGuide | Get one guide |
GET /api/v1/faq | listFaq | List the frequently asked questions |
GET /api/v1/pages | listPages | List the site's pages |
The full description, with every schema and operation, is openapi.json (OpenAPI 3.1). Every operation has its own operationId, so it maps to one function an agent can call. /.well-known/api-catalog points to it (RFC 9727).
Example
One use case, trimmed to five fields:
curl https://noda.energy/api/v1/use-cases/screen{
"id": "screen",
"title": "Screen a possible site",
"summary": "Check the main grid, land and environmental questions before you pay for a detailed study.",
"guide": {
"id": "site-finding",
"name": "Find a site",
"url": "https://noda.energy/site-finding"
},
"askUrl": "https://app.noda.energy/home?ask=Screen%20my%20selected%20site%20in%20Romania%20for%20a%205%20MW%20solar%20project.%20Check%20grid%20access%2C%20land%20rights%20and%20use%2C%20terrain%2C%20access%20routes%20and%20environmental%20constraints%20at%20an%20early%20screening%20level.%20Explain%20which%20constraints%20could%20stop%20the%20project%2C%20which%20could%20change%20the%20design%2C%20and%20which%20need%20a%20specialist%20study.%20Compare%20a%20useful%20alternative%20where%20the%20evidence%20supports%20one.%20Give%20a%20go%2C%20hold%20or%20stop%20recommendation%20with%20reasons%2C%20missing%20evidence%20and%20the%20next%20practical%20checks.%20Do%20not%20treat%20a%20nearby%20grid%20line%20as%20proof%20of%20connection%20capacity.%0A%0AUse%20only%20project%20context%20and%20files%20that%20are%20actually%20available.%20Ask%20for%20critical%20missing%20inputs%20before%20drawing%20conclusions.%20Separate%20verified%20facts%2C%20assumptions%20and%20open%20questions.%20Reference%20sources%20and%20dates%20for%20material%20claims."
}Errors
An address under /api that does not exist answers 404, and a method other than GET or HEAD answers 405, both as JSON with a code, a message and a hint:
{
"error": {
"status": 404,
"code": "not_found",
"message": "There is no endpoint at this address.",
"hint": "The endpoints are listed at https://noda.energy/openapi.json.",
"docs": "https://noda.energy/docs"
}
}Open Noda with a question
An agent can hand a person a link that opens Noda with a first message already written:
https://app.noda.energy/home?ask=<the message, URL-encoded>A signed-in person gets a new project and the message is sent there. Anyone else signs up first, confirms the email, answers two short questions, and then the message is sent. Every use case in the API carries its own link as askUrl.
Markdown versions
Every page has a Markdown version at the same address with .md added (/index.md for the home page, /screening.md for /screening). It holds the page's text and links and leaves out the navigation, the styling and the scripts.
Every page also answers in Markdown when the request asks for it: send Accept: text/markdown to the page address. The answer is Content-Type: text/markdown; charset=utf-8 with Vary: Accept, and an address that does not exist answers 404 in Markdown too.
Noda for AI assistants (MCP)
Noda runs an MCP server, so Claude, ChatGPT, Cursor, VS Code and any MCP client can use it directly.
- Public, no account:
https://mcp.noda.energy/public. It lists Noda's use cases, guides and FAQ, offers each use case as a prompt, reads every page in Markdown, and makes an "open in Noda" link with a question. - Signed in, Pro accounts:
https://mcp.noda.energy/mcp. The assistant signs in with OAuth (the company and the permissions are chosen on Noda's own page) and works with the projects, the map, sites and layers. Owners and admins can also make API keys for company bots in Settings, Integrations.
In Claude: Settings, Connectors, Add custom connector, and paste the address. In other clients, add it as a remote MCP server (Streamable HTTP). Both MCP versions in use are supported (2025-11-25 and 2026-07-28).
Machine-readable files
- /openapi.json: the API description (OpenAPI 3.1)
- /.well-known/api-catalog: where the API and its description are
- /llms.txt and /llms-full.txt: the site for language models
- /sitemap.xml and /robots.txt: every page may be read
Contact
Questions about the API or the files, or a request for more: hello@noda.energy. More ways to reach us are on the contact page.