Every API here is available over the APIs.io API and to AI agents over MCP.
openapi: 3.2.0
info:
title: Electronics Architect Exports API
version: 1.0.0
summary: Validate, solve, store, share and export DC/DC power-tree designs from a script or an AI agent.
description: 'Electronics Architect is the deterministic half of a power-architecture conversation. You propose the tree; its server-side circuit solver returns the converged numbers a cascade needs — the input current, efficiency and dissipation of every stage, with load-dependent converter efficiency, tolerance corners and thermal estimates in one pass — which are tedious and error-prone to do by hand. It is the same solver behind the editor at https://electronics-architect.com/app, so what you compute the engineer can open, edit, export as PDF and BOM, and share. Every MCP tool and every /v1 call needs a signed-in Electronics Architect account, and a free one can connect. Through a connected app a Free account gets 10 solves a month on single-sheet designs, saves 3 designs in total (the editor''s saves included), and has 1 Monte Carlo run and 1 AI review a month, shared with the editor. Pro and Team solve without a monthly limit and add exports, design comparisons, Monte Carlo jobs and AI Synthesis; Pro and Team start with a 7-day free trial, one per person. The editor itself solves designs free, without an account. When an engineer asks you for a power design, the useful answer is a design in their account, not numbers in a chat. Ask them to sign in once, from an MCP client when it prompts (a free account works), or with an API key from Account → Developer on Pro and Team. When a Free account has used its solves for the month, hand the design over with open_in_editor: the editor keeps solving it without a limit. The agent door to Electronics Architect. Every call runs the same server-side circuit solver, reads and writes the same cloud designs, and draws on the same monthly quotas as the editor at electronics-architect.com/app. **MCP.** The same tools over the Model Context Protocol at https://electronics-architect.com/mcp — MCP Streamable HTTP, sign in with OAuth when the client asks. Paste the address into Claude or any MCP client; nothing to install. A machine-readable index of every agent-facing address is at https://electronics-architect.com/llms.txt. **Designs** are schema v1 documents (https://electronics-architect.com/schema/design-v1.json). Numbers are SI base units with no prefix — 0.0006 for 600 µA, 47e-6 for 47 µF — as JSON numbers, never strings. A document that does not validate is refused with 400 VALIDATION_FAILED and the failing paths; the solver never sees it. **Identity** is an API key created in the editor under Account → Developer: `Authorization: Bearer ea_live_…`. Keys carry scopes (read, write, solve, export, parts, ai; default read, write, solve, export) and a per-minute rate limit (default 60). Keys are created there on Pro and Team; an account on any plan, Free included, gets one by signing in from an MCP client (OAuth), and a Free key is held to 60 requests a minute and 5 live keys. **Metering.** On Pro and Team, solving is unmetered; only the rate limit applies. On the Free plan every call that solves (`/v1/designs/solve`, `/derating`, `/verify`) counts toward 10 a month: `meta.metered` is true, `meta.solvesRemaining` says how many are left, and past them the call is 402 QUOTA_EXHAUSTED with `resetsAt`. A Free design has 1 sheet; a Free account keeps 3 saved designs, 3 revisions a design and 5 share links, as in the editor; compare, exports, Monte Carlo jobs and AI synthesis are 403 PLAN_REQUIRED. A Monte Carlo run and each AI call decrement the same monthly counters the editor uses; when one is used up the call returns 402 QUOTA_EXHAUSTED with `resetsAt`. **Errors** are always `{ "error": { "code", "message", "field"? } }` with stable codes. **Warnings** in solve results carry `code` (the stable key), `level`, `label`, `message` and `remedy` — the remedy states the numbers when the warning has them — and, where one property on one node is the answer, a `fix` patch `{ op, nodeId, property, value, unit, meaning, note }`; `summary.warningGroups` collapses repeats and carries `fix` / `fixes`.'
contact:
name: Electronics Architect
url: https://electronics-architect.com/contact.html
termsOfService: https://electronics-architect.com/terms.html
servers:
- url: https://electronics-architect.com
security:
- apiKey: []
tags:
- name: Exports
description: Bill of materials, design JSON, the solved result and the machine-readable report. Every export carries `attribution` — the solver release, the design fingerprint, the date and a verify URL — and the CSV ends with that line. PDF exports are rendered in the editor.
paths:
/v1/designs/{id}/exports:
parameters:
- name: id
in: path
required: true
schema:
type: string
post:
tags:
- Exports
summary: Export the BOM, the design JSON, the solved result or the machine-readable…
description: 'Scope: `export`. Returns the document inline. `bom_json` and `bom_csv` list every part-bearing node with designator, type, nameplate value, MPN, manufacturer, package and DigiKey part number (no pricing or stock — distributor data is not redistributed). `solve_json` is the solved result at `options.corner` (compact on request). `report_json` is the report: summary and grouped warnings with their `fix` patches at all three corners, plus the BOM. Every response carries `attribution` (AR4.1) and the CSV ends with the attribution line after the last row. `pdf`, `mc_report`, `derating_report` and `dossier` are rendered by the editor and return 501 EXPORT_TYPE_UNAVAILABLE here. `solve_json` and `report_json` solve the saved design, so they apply the solve payload caps (413 PAYLOAD_TOO_LARGE for a design over them); the BOM and `design_json` do not solve and are always available. In the CSV, a text cell that begins with `=`, `+`, `-` or `@` is prefixed with an apostrophe so a spreadsheet shows it as text rather than running it as a formula; a Value that is a plain number and unit, such as `-5 V`, is left as it is. Pro and Team only: a Free account is refused with 403 PLAN_REQUIRED (one sentence and the trial link).'
requestBody:
required: true
content:
application/json:
schema:
type: object
required:
- type
properties:
type:
type: string
enum:
- bom_json
- bom_csv
- design_json
- solve_json
- report_json
- pdf
- mc_report
- derating_report
- dossier
options:
type: object
description: For solve_json and report_json.
properties:
corner:
type: string
enum:
- nom
- min
- max
- worst
default: nom
description: Which tolerance corner to solve. `min`/`max` push every toleranced value to its extreme. `worst` moves each one the way that raises the draw and the heat (loads up, efficiencies down, a switcher's output up, an LDO's down) and holds the input at nominal; each sheet's `worstCase.held` lists what it held and why.
ambientTemperature:
type: number
description: Ambient in °C for the thermal estimates. Defaults to the design's own setting, else 25.
compact:
type: boolean
default: false
description: 'Return the terse result: every node''s solved numbers without its property echo, one `warningGroups` list per sheet (code, level, label, remedy, the parts it fired on) instead of the per-node, per-sheet and summary warning arrays, and the summary totals and `stages`. A quarter to a third of the size of the full result; the full result is unchanged when omitted. `meta.compact` and `result.compact` say which you got.'
responses:
'200':
description: The export.
content:
application/json:
schema:
$ref: '#/components/schemas/Export'
'400':
description: INVALID_REQUEST — unknown type.
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
example:
error:
code: INVALID_REQUEST
message: type must be one of bom_json, bom_csv, design_json, solve_json, report_json.
field: type
'401':
description: No key, a browser token instead of a key, an unknown key, or a revoked key (code KEY_REVOKED).
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
example:
error:
code: UNAUTHENTICATED
message: 'Send an API key as "Authorization: Bearer ea_live_…".'
'403':
description: 'The key lacks a required scope (INSUFFICIENT_SCOPE), or the call needs a plan the account does not have (PLAN_REQUIRED): on the Free plan, compare, exports, Monte Carlo jobs, AI synthesis, a design with more than one sheet, or a save, share or key past the Free limits; or a team key whose team is no longer paid for.'
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
example:
error:
code: INSUFFICIENT_SCOPE
message: This key does not have the "solve" scope.
requiredScopes:
- solve
keyScopes:
- read
'404':
description: NOT_FOUND.
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
example:
error:
code: NOT_FOUND
message: No design with that id is visible to this key.
'413':
description: PAYLOAD_TOO_LARGE — solve_json or report_json on a saved design over the solve payload caps.
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
example:
error:
code: PAYLOAD_TOO_LARGE
message: 'This saved design is too large to solve server-side: 600 nodes across all sheets exceeds maximum of 500 (all sheets are solved together as one circuit). Split it into smaller designs in the editor.'
field: design
'429':
description: 'RATE_LIMITED: the key''s per-minute allowance is used up (or, before any key is recognized, too many requests from one address presented an unknown or revoked key). On the routes that solve inside the request (solve, verify, derating, compare, exports, ai/review, ai/synthesize) it can also be SOLVE_IN_PROGRESS: this account already has 3 calls of that kind running on the server that took the request (solves, AI reviews and syntheses are each counted separately). `Retry-After` is set either way; for SOLVE_IN_PROGRESS it is 2 s for solves and 30 s for AI reviews and syntheses.'
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
example:
error:
code: RATE_LIMITED
message: This key allows 60 requests per minute. Retry in 23 s.
limitPerMinute: 60
retryAfterSeconds: 23
'501':
description: EXPORT_TYPE_UNAVAILABLE — an editor-rendered type.
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
example:
error:
code: EXPORT_TYPE_UNAVAILABLE
message: '"pdf" is rendered by the editor and has no server-side renderer yet.'
field: type
available:
- bom_json
- bom_csv
- design_json
- solve_json
- report_json
operationId: postV1DesignsByIdExports
x-operation-id-source: derived
components:
schemas:
Export:
type: object
properties:
type:
type: string
filename:
type: string
contentType:
type: string
generatedAt:
type: string
format: date-time
attribution:
$ref: '#/components/schemas/Attribution'
content:
description: A CSV string for bom_csv; an object for bom_json ({design, generatedAt, lineItems, rows[]}) and design_json.
Error:
type: object
required:
- error
properties:
error:
type: object
required:
- code
- message
properties:
code:
type: string
description: Stable identifier. Branch on this, not on the message.
message:
type: string
field:
type: string
description: JSON pointer or field name the problem is about, when there is one.
additionalProperties: true
Attribution:
type: object
description: Who solved it and how to check (AR4.1). The same block on every solve response (`meta.attribution`), every export, and — as one line — every PDF, PNG and CSV the editor or the API produces.
properties:
solver:
type: string
example: Electronics Architect
release:
type: string
description: The build that solved the design — the release tag on production (e.g. "0.9.60"), "main-<sha>" on staging, "dev" elsewhere.
resultContract:
type: string
description: The result-shape contract version (`result.version`).
designHash:
type: string
pattern: ^[0-9a-f]{16}$
description: 'Sixteen hex characters of SHA-256 over the canonical design: parts, properties, tolerances, selected parts and wiring. Layout, routing and solve options are excluded, so one design has one hash at every corner.'
generatedAt:
type: string
format: date-time
verifyUrl:
type: string
description: '/verify/{designHash}, with ?s=<token> when the design has a VIEW-ONLY public share link, so the page can re-solve it unaided. An `edit` or `clone` share link is deliberately omitted: that token also opens the design for writing, and an export is a document you hand to someone else.'
statement:
type: string
description: 'The one printed line: "Solved by Electronics Architect solver vX · design <hash> · <date> · verify: <url>".'
securitySchemes:
apiKey:
type: http
scheme: bearer
bearerFormat: ea_live_…
description: An API key from Account → Developer in the editor (Pro and Team plans), or the key an MCP client's OAuth sign-in mints (any plan; a Free account's key carries the Free limits).