Use FeneCAM from Claude / Cursor / your shop agent
FeneCAM is a browser cutting optimizer / CAM for linear stock (bars, pipes, tubes, profiles, lumber) and sheets; window and door fabrication is one built-in feature. The Agent API is an access channel to that product — import a BOM, run 1-CSP or 2-CSP, read yield and remnants, export PDF / XLS / CSV / DXF — without opening the dashboard. It is not a new “AI Agent” product.
Base URL
https://www.fenecam.com/api/v1
Create an API key while signed in: Dashboard → REST API → API status. Keys belong to your FeneCAM account and Paddle plan.
Auth and scopes
Authorization: Bearer fnc_live_…
X-API-Key: fnc_live_…
| Scope | Tools |
|---|---|
plans:write | import_parts, parse_clipboard, create_or_update_plan |
optimize | optimize_1csp, optimize_2csp |
plans:read | get_result |
export | export_plan |
A key never returns another user’s plan. Unknown ids are 404.
Credits
Agent API and MCP optimize calls are metered in credits. 1 credit = $0.01. Every plan includes credits:
| Plan | Credits | Refill |
|---|---|---|
| Free $0 | 1,000 once, on signup | None |
| Standard $9 / month | 1,000 / month | Each UTC month |
| Professional $19 / month | 2,000 / month | Each UTC month |
| Enterprise API $99 / month | 12,000 / month | Each UTC month |
Credit packs (one-time payment, $0.01 per credit): 1,000 credits for $10 · 2,000 for $20 · 10,000 for $100. Pack credits never expire, and neither the monthly reset nor a plan change touches them. Buy them in the pricing section or under Billing in your account.
| Call | Credits |
|---|---|
New optimize_1csp or optimize_2csp solve | 1 |
Solve that starts and then fails (SOLVER_FAILED, STOCK_SHORTAGE, UNPLACED_PARTS) | 1 |
Optimize on an unchanged plan (saved result returned, summary.cached: true) | 0 |
Optimize refused before the solver starts (OPTIMIZE_BUSY, RATE_LIMITED, OPTIMIZE_COOLDOWN, PLAN_LIMIT_EXCEEDED, WRONG_KIND, CREDITS_EXCEEDED) | 0 |
get_result, GET /plans/{id}, import_parts, parse_clipboard, create_or_update_plan, export_plan, GET /me, OpenAPI, MCP schema | 0 |
- One balance per account. REST calls and MCP
tools/callspend the same credits, and every key on the account shares them. - A solve uses plan credits first, then pack credits.
- Free: the 1,000 credits are granted once per account and do not refill. Moving from a paid plan back to Free does not grant them again.
- Paid plans: credits reset on the first day of each UTC month. Unused plan credits do not carry over. Upgrading from Free gives the full monthly credits right away. A change between paid plans applies the new plan’s monthly credits against what was already used this month.
- Every optimize response returns
credits_used(what that call used),credits_remaining(plan credits left plus pack credits),credits_allotment,credits_refill(noneon Free,monthlyon paid plans),pack_credits_remainingandperiod_key(freeon Free, else the UTC month). On an optimize error,details.credits_usedis what the call used; if it is missing, the call used 0. GET /api/v1/mereturns the same balance fields. There,credits_usedis what was used fromcredits_allotmentinperiod_key.- When plan credits and pack credits are both used up, optimize returns HTTP 402 with code
CREDITS_EXCEEDED. Nothing runs and nothing is charged. Saved results stay readable. The error details includeupgrade_url,credit_packs_urlandcredit_packs. On Free, upgrade or buy a credit pack. On a paid plan, buy a pack, upgrade, or wait for the next UTC month. - Retries: send an
Idempotency-Keyheader (oridempotency_keyin the JSON body or MCP arguments). The same key in the same month returns the first outcome withcredits_used: 0. Without a key, a retried new solve uses another credit.
Limits by plan
BOM size caps are unchanged (Free: 5 stock sizes / 20 part sizes / 500 parts). Monthly optimize volume is set by credits. Rate limits and the export cap are per account, not per key. Only one optimization may run at a time. On HTTP 429, wait for Retry-After. Do not retry SOLVER_FAILED or OPTIMIZE_COOLDOWN with the same input. Linear optimization uses ga_opt.
| Plan | Credits | Rate / min | Optimize / min | Export / month | Keys |
|---|---|---|---|---|---|
| Free $0 | 1,000 once | 20 | 2 | 30 | 1 |
| Standard $9 | 1,000 / month | 60 | 5 | 300 | 5 |
| Professional $19 | 2,000 / month | 120 | 10 | 2,000 | 20 |
| Enterprise API $99 | 12,000 / month | 300 | 20 | 10,000 | 50 |
Exports use no credits. They count toward the export cap above; when it is reached, export returns QUOTA_EXCEEDED until the next UTC month. The Agent API and MCP are part of every plan. Enterprise API ($99 / month) is the plan for high API volume: 12,000 credits a month and the highest limits.
Tools
REST paths and MCP tools share the same names.
| Tool | HTTP | What it does |
|---|---|---|
import_parts | POST /import_parts | JSON or CSV (keys N, M, K, S, P, LT, RT…). Kind 1csp or 2csp. |
parse_clipboard | POST /import/parse | Cells pasted from Excel or Google Sheets (any headers) → plan draft plus columns_mapped, assumptions, warnings. Kimi maps the columns; FeneCAM reads the numbers. 0 credits; max 64 KB; Free 10, paid 30 per minute. |
create_or_update_plan | POST /plans | Save a plan the optimizer can run. |
optimize_1csp | POST /plans/{id}/optimize_1csp | Linear stock (bars, pipes, tubes, profiles): bars used, yield, waste, remnants, patterns. |
optimize_2csp | POST /plans/{id}/optimize_2csp | Sheet / panel nesting. |
get_result | GET /plans/{id}/result | Idempotent read. |
export_plan | POST /plans/{id}/export | Body {"format":"csv"} — pdf, xls, csv, or dxf only. |
Example material name: Aluminum Profile 6060. Kerf starting point for a window profile saw: 3 mm. Do not mix aluminium and uPVC in one stock list. Glass and infill belong in 2-CSP.
curl example
export FENECAM_API_KEY=fnc_live_YOUR_KEY
CSV='N,Agent Demo
M,Aluminum Profile 6060
K,3
S,6000,5
P,500,4,Sash
P,750,2,Transom'
PLAN=$(curl -sS https://www.fenecam.com/api/v1/plans \
-H "Authorization: Bearer $FENECAM_API_KEY" \
-H "Content-Type: application/json" \
-d "$(jq -n --arg csv "$CSV" '{kind:"1csp",format:"csv",csv:$csv}')")
ID=$(echo "$PLAN" | jq -r .plan_id)
# 1 credit for a new solve; the response has credits_used and credits_remaining
curl -sS -X POST https://www.fenecam.com/api/v1/plans/$ID/optimize_1csp \
-H "Authorization: Bearer $FENECAM_API_KEY" \
-H "Idempotency-Key: $ID-run-1"
# Credit balance (uses no credits)
curl -sS https://www.fenecam.com/api/v1/me \
-H "Authorization: Bearer $FENECAM_API_KEY"
curl -sS https://www.fenecam.com/api/v1/plans/$ID/result \
-H "Authorization: Bearer $FENECAM_API_KEY"
curl -sS -X POST https://www.fenecam.com/api/v1/plans/$ID/export \
-H "Authorization: Bearer $FENECAM_API_KEY" \
-H "Content-Type: application/json" \
-d '{"format":"csv"}'
A copy-paste script lives in the repo as examples/agent-api.curl.sh.
MCP
POST JSON-RPC to /api/v1/mcp (initialize, tools/list, tools/call). Schema: /api/v1/mcp/schema.
{
"mcpServers": {
"fenecam": {
"url": "https://www.fenecam.com/api/v1/mcp",
"headers": { "Authorization": "Bearer fnc_live_YOUR_KEY" }
}
}
}
Exports and what we do not claim
- Exports: PDF, XLS, CSV, DXF only.
- Named CNC dialects (PTX, Biesse, Elumatec, and similar) are undocumented and are not API formats.
- Machine modes in the UI remain Single, Double, CNC.
- FeneCAM is not a camera, not FeneVision, not FeatureCAM.
Last update: 11 October 2026