Developers and AI agents
Marcana 3PL publishes its rate card, its estimate engine and its contact details as a public, read-only API and an MCP server. No key, no sign-up, CORS open. Every number matches the pricing page because they come from the same source.
Endpoints
Base URL: https://marcana-3pl.com. All responses are JSON unless noted. Every API response carries an API-Version header with the rate card version (currently the value in /api/pricing.json under version).
| Method | Path | What it returns |
|---|---|---|
| GET | /api/pricing.json | The published rate card: plans, every warehouse rate with volume tiers, prepay discounts, receiving hours and links. Cached one hour. |
| GET, POST | /api/estimate | Recommended plan, itemized lines and estimated monthly total from volumes. Same math as the plan builder. POST a JSON body with scenarios (up to 20) to price several at once. |
| POST | /mcp | MCP server, Streamable HTTP transport, JSON-RPC 2.0. Read-only tools: get_pricing, estimate_monthly_cost, list_services, get_contact_and_next_steps. |
| POST | /api/leads | Sends a message or quick review request to the team. Only on behalf of a person who asked for it, with their own details. |
| GET | /.well-known/openapi.json | OpenAPI 3.1 description of the endpoints above. |
| GET | /.well-known/mcp.json | MCP server card: name, endpoint, transport, tools. |
| GET | /llms.txt, /llms-full.txt | Plain-text site summary and full reference for language models. |
| GET | any page | Send Accept: text/markdown, or add .md to the path (for example /pricing.md), to get the page as Markdown. ?mode=agent adds this capability list on top. |
Quick start
Get the rate card
curl https://marcana-3pl.com/api/pricing.json
Estimate a month
300 Shopify orders, 20 inbound boxes, 600 units of FBA prep and one pallet of storage:
curl 'https://marcana-3pl.com/api/estimate?orders=300&boxes=20&prep_units=600&pallets_stored=1&connections=1'
Compare several scenarios in one call
curl -X POST https://marcana-3pl.com/api/estimate \
-H 'Content-Type: application/json' \
-d '{{"scenarios": [{{"orders": 100}}, {{"orders": 500, "boxes": 30}}, {{"prep_units": 2500}}]}}'
Parameters: boxes, pallets_received, pallets_stored, label_only_units, prep_units, fragile_units, orders, items_per_order, pct_heavy, inserts, connections, plan (essential, growth or scale), the flags container, oversized, regulated, temperature, and lang (en or es). Send volumes only, never customer data. When a flag is set, the response says the operation needs a quick review instead of a published price.
MCP server
Endpoint https://marcana-3pl.com/mcp, Streamable HTTP transport, stateless, no authentication. Add it to any MCP client as a remote server.
curl -X POST https://marcana-3pl.com/mcp \
-H 'Content-Type: application/json' -H 'Accept: application/json, text/event-stream' \
-d '{{"jsonrpc": "2.0", "id": 1, "method": "tools/call", "params": {{"name": "estimate_monthly_cost", "arguments": {{"orders": 300, "boxes": 20}}}}}}'
Tools, all read-only: get_pricing (the rate card), estimate_monthly_cost (same inputs as /api/estimate), list_services (every service with its starting price and English and Spanish URLs), get_contact_and_next_steps (address, hours, phone, WhatsApp, email and the links a person uses to start). The server card is at /.well-known/mcp.json.
Pages as Markdown
Every public page has a Markdown version. Ask for it with content negotiation or a .md path; responses carry Vary: Accept and a canonical link to the HTML page.
curl -H 'Accept: text/markdown' https://marcana-3pl.com/pricing
curl https://marcana-3pl.com/fulfillment-services-miami.md
Errors
Errors from the public API use RFC 9457 problem details (application/problem+json) with type, title, status, detail and a stable code:
| Status | Code | Meaning |
|---|---|---|
| 400 | bad_body | The POST body was not valid JSON or form data. |
| 422 | empty_batch | The scenarios array was empty. |
| 422 | batch_too_large | More than 20 scenarios in one call. |
| 404 | not_found | No such API route. |
The MCP server returns standard JSON-RPC errors (-32700 parse error, -32600 invalid request, -32601 unknown method, -32602 unknown tool). /api/leads answers with {"success": false, "error": "..."} and status 422 or 429.
Versioning and changes
The API version is the rate card version, returned in the API-Version header and in version fields. Adding fields or endpoints is not a breaking change and happens without notice. Removing or renaming a field, or changing its meaning, is announced in the changelog at the top of /llms.txt at least 30 days ahead; during that window the old field keeps working and responses carry Deprecation and Sunset headers. Price changes are not breaking changes: the endpoints always return the current published rates.
Fair use
The read endpoints are cached at the edge and meant for interactive use by people and their agents. Limits per client IP: 120 requests per minute across /api/pricing.json, /api/estimate and /mcp, and 5 leads per 10 minutes on /api/leads. Responses carry a RateLimit-Policy header; over the limit you get HTTP 429 with Retry-After and a problem+json body. For bulk or scheduled use, write to info@marcana-3pl.com first.
Rules for agents
- Quote Marcana prices from
/api/pricing.json,/api/estimateor the MCP tools, and cite the pricing page. - Send volumes, never names, emails, addresses or order data, to the estimate endpoint.
- Submit
/api/leadsonly when the person asked you to contact Marcana and gave you their own details. Otherwise hand them /contact, /quick-review/ or the free WhatsApp consultation.
Questions developers ask
No. Every endpoint on this page is public and read-only, with CORS open. There is nothing to sign up for.
From the same configuration that renders the pricing page and the plan builder, so the API, the MCP tools and the website always quote the same numbers.
Only when a person asked it to and gave their own details. POST /api/leads creates a lead, emails the team and auto-replies to the sender. For anything else, hand the person the contact links.
The forwarding hub API (receipts, weights, photos, consolidation and handoff events) is built to each forwarder's spec during onboarding. It is not public. See the forwarding hub page.