API for LEDMESEE Authorized Partners
Full data exchange for contracted partners: the catalogue with your prices, checkout-identical quotes, your company orders and an XML/CSV price list for your own shop.
Start in 3 steps
- Sign the partner agreement — you get a partner number (LMP-…) and a level.
- Log in to your account on ledmesee.com → “Authorized Partner” section → “New API key”. The key is shown only once — keep it in a password manager.
- Send requests with the header Authorization: Bearer YOUR_KEY.
Base URL: https://ledmesee.com/partner-api/v1
API key
Keys are created by the company account owner or a company administrator. Scopes: catalog (products), quote (quotes), orders (read orders), feed (price list), ordering (place and cancel orders, balance), webhooks (notifications). Ordering and webhooks are opt-in — keep a key that can place orders on your server only. You may send the key in the X-API-Key header instead of Authorization. Keep keys on your server — never in browser code. Revoke an unused or exposed key with one click in your account.
Operations
GET | /meYour status: number, level, discount, quarterly turnover and what is missing for the next level. |
GET | /productsCatalogue: SKUs, variants, list net price, your net price, suggested retail price incl. VAT, availability, dimensions and print file size, images. Parameters: lang, currency, country, category, q. |
GET | /products/{key|SKU|id}One product with description, specifications and all images. |
POST | /quoteQuote exactly like checkout for your account: products, discount, delivery (live carrier rates), VAT, total. |
GET | /ordersPaid orders of your company (all company users): status, production stage, shipment and tracking number, invoice. Parameters: limit, updated_since, order (id_desc | updated_asc), cursor. |
GET | /orders/{number}One order. |
GET | /feed.csv, /feed.xmlPrice list with your prices (refreshed every 10 minutes). |
POST | /ordersPlace an order at your prices (scope ordering). Payment: transfer, balance, term, card_link. Ship to you or to your customer (ship_to, neutral parcel). |
POST | /orders/{number}/cancelCancel an order before payment. |
GET | /orders/{number}/invoice.pdfInvoice PDF (?kind=proforma — pro forma for the transfer). |
GET | /balanceLEDMESEE balance (PLN, EUR). |
GET | /shipping-methods?country=DEDelivery methods for a country. |
GET / POST | /webhooksList and add webhooks (scope webhooks). |
DELETE | /webhooks/{id}Delete a webhook. |
POST | /webhooks/{id}/testSend a test “ping” event. |
GET | /webhooks/{id}/deliveriesLast deliveries and errors. |
GET | /webhooks/{id}/sample?type=order.shippedA signed sample event for your own tests (nothing is sent). |
GET | /plugins, /plugins/{platform}Shop plugins: version, requirements, sha256, changelog; /plugins/{platform}/download — the ZIP file. |
Examples
curl https://ledmesee.com/partner-api/v1/me \
-H "Authorization: Bearer lmp_live_…"curl "https://ledmesee.com/partner-api/v1/products?currency=EUR&lang=en&category=frames" \
-H "Authorization: Bearer lmp_live_…"curl https://ledmesee.com/partner-api/v1/quote \
-H "Authorization: Bearer lmp_live_…" \
-H "Content-Type: application/json" \
-d '{"country":"PL","postal_code":"00-001","items":[{"sku":"LM-SINGLE-A1-BLACK","quantity":10}]}'curl "https://ledmesee.com/partner-api/v1/orders?updated_since=2026-11-01T00:00:00Z" \
-H "Authorization: Bearer lmp_live_…"Ordering via the API
- Before the first order, accept the partner agreement in your account (section “Authorized Partner” → “Partner agreement”; account owner or company administrator). Without it POST /orders returns 403 contract_required; agreement status: GET /me → agreement.
- Send POST /orders with: external_id (your order number), items (sku or variant_id + quantity), payment and optionally ship_to, shipping_method, print_files_url, expected_total.
- The same external_id always returns the same order (duplicate: true) — retry safely after a network error.
- payment: transfer — pro forma and bank details in payment.bank, production after payment; balance — paid at once from your LEDMESEE balance; term — VAT invoice with payment term (only if enabled in your agreement); card_link — card / BLIK payment link in payment.payment_url.
- Send expected_total from your quote (POST /quote): if the total changed we answer 409 price_changed and create nothing.
- ship_to = ship to your customer. Neutral parcel by default (dropship): no prices and no invoice of ours in the box. The invoice is always issued to your company.
- Error codes: 400 invalid (error.missing and error.fields list the fields), 400 unsupported_currency, 402 insufficient_balance, 403 term_not_allowed, 409 price_changed / in_progress, 422 out_of_stock (error.issues).
curl https://ledmesee.com/partner-api/v1/orders \
-H "Authorization: Bearer lmp_live_…" \
-H "Content-Type: application/json" \
-d '{"external_id":"SHOP-1001","payment":"transfer","expected_total":1234.56,
"items":[{"sku":"LM-SINGLE-A1-BLACK","quantity":2}],
"ship_to":{"name":"Jan Kowalski","street":"Długa 1","postal_code":"00-001","city":"Warszawa","country":"PL","phone":"+48600000000"}}'Webhooks
- Add an https URL (public server, port 443 or 8443) in your account or with POST /webhooks. The whsec_… secret is shown once.
- Events: order.created, order.paid, order.status_changed, order.shipped (with tracking number), order.delivered, order.cancelled, order.refunded, invoice.issued. Body: { id, type, created, partner, data: { order, previous } } — order has the same format as GET /orders/{number}.
- Signature: header X-LEDMESEE-Signature: t=…,v1=…; v1 = HMAC-SHA256(secret, t + "." + raw body). Reject when the signature differs or t is older than 5 minutes.
- Answer 2xx within 10 s. Otherwise we retry after 1 min, 5 min, 30 min, 2 h, 6 h and 24 h. The same event may arrive twice — check id.
// Node.js — weryfikacja podpisu / signature check
const crypto = require('crypto');
function verify(rawBody, header, secret) {
const p = Object.fromEntries(header.split(',').map(x => x.split('=')));
if (Math.abs(Date.now() / 1000 - Number(p.t)) > 300) return false;
const v = crypto.createHmac('sha256', secret).update(p.t + '.' + rawBody).digest('hex');
return crypto.timingSafeEqual(Buffer.from(v), Buffer.from(p.v1 || ''));
}Shop plugins: WooCommerce and PrestaShop
Ready-made plugins connect your shop to LEDMESEE through this API: catalogue import with your prices and margin, orders passed to LEDMESEE (transfer, balance, term, payment link), statuses and tracking numbers from webhooks, invoices and GPSR data on product pages. Download them in your LEDMESEE account → “Authorized Partner” → “Plugins for your shop”, or with your API key: GET /plugins/{woocommerce|prestashop}/download. GET /plugins/{platform} tells you about new versions.
| LEDMESEE Partner for WooCommerce | 1.1.0 · 2026-11-13 requires: PHP 7.4+, WordPress 6.0+, WooCommerce 8.0+ (HPOS) sha256 d319c757ac2478844c1eef994b4cc9266cb08883df2a465ca568b612ca2f17a0 |
| LEDMESEE Partner for PrestaShop | 1.1.0 · 2026-11-13 requires: PHP 7.1+, PrestaShop 1.7.8 – 8.x sha256 6fa1fbab32c090688a07ac50fab3d9419edfe60602b7276b5acf7d1644bfffe8 |
New in API 2.1: data formats, errors, GPSR
- Paged orders: GET /orders?order=updated_asc&updated_since=… returns changes oldest first. When has_more = true, get the next page with cursor=next_cursor (send the same filters again). The default order (newest first) is unchanged.
- Currencies: currency from the currencies list (GET /partner-api/v1/). Any other code → 400 unsupported_currency with the list. Without currency — the currency of the delivery country.
- Errors: POST /quote returns issues [{ code, sku, message }] — out_of_stock, unavailable, limit, shipping, blocked, other. 400 responses have error.fields [{ field, code, message }] (required, invalid, unknown). Messages in Polish with lang=pl or Accept-Language: pl, otherwise in English; error.message, error.missing and errors stay as in 2.0.
- GPSR: every product has a gpsr field — manufacturer (name, address, e-mail), country of origin, warnings and a link to safety information. Show it on the product page in your shop (required by EU Regulation 2023/988 when selling to consumers).
- Webhooks without a public address (staging shop, localhost): GET /webhooks/{id}/sample?type=order.shipped returns a ready event with headers and a signature made with your secret — nothing is sent. Pass it to your code; "sample": true marks a test event.
- ship_to.region: ISO 3166-2 code without the country prefix, max. 3 characters (USA: CA, Canada: ON, Australia: NSW). Required only where the carrier needs it — then 400 with field ship_to.region. Usually not needed in the EU.
- Order number: LM-, then 8 characters A–Z and 0–9, e.g. LM-26X4QP2A (test shop: LMT-). Store it as text up to 20 characters.
- Test shop: product images point to the public ledmesee.com (the test shop is password-protected).
curl "https://ledmesee.com/partner-api/v1/orders?order=updated_asc&updated_since=2026-11-01T00:00:00Z&limit=100" \
-H "Authorization: Bearer lmp_live_…"
# has_more: true →
curl "https://ledmesee.com/partner-api/v1/orders?order=updated_asc&updated_since=2026-11-01T00:00:00Z&limit=100&cursor=NEXT_CURSOR" \
-H "Authorization: Bearer lmp_live_…"XML / CSV price list for your shop
For a feed reader (e.g. product import in WooCommerce, Shopify, PrestaShop) use a separate “price list only” key — the “Price list link” button in your account. Such a key may be put in the URL: …/feed.csv?token=KEY¤cy=EUR&lang=en. Never put a full API key in a URL.
CSV: sku, variant_id, product_key, product, variant, category, size, color, currency, list_net, partner_net, discount_percent, fixed_price, rrp_gross, rrp_vat_rate, availability, weight_g, frame_outer_mm, graphic_mm, print_file_with_bleed_mm, image, url
Limits and errors
Per key: 120 requests per minute (quotes 30 per minute), 20,000 per day. Errors are JSON: {"error": {"code": "…", "message": "…"}} with HTTP 400, 401, 403, 404, 429 or 500. On 429 wait for the Retry-After header.
Test environment
Test shop: https://test.ledmesee.com/partner-api/v1 — lmp_test_… keys (test account on request). The test shop is password-protected (we send the login and password with the key): the password goes in the Authorization header (Basic) and the key in the X-API-Key header. Test orders are not fulfilled, payments are test-only. The live shop accepts only lmp_live_… keys.
Partner programme
Turnover = net product value of your company paid orders in the quarter. No penalties and no minimum turnover: turnover only decides the level. Plus partner stickers and certificate, monthly promotional creatives and joint campaigns.
Three levels: Certified, Gold and Platinum. Exact discounts and turnover thresholds are shown after logging in (partner account, GET /me → levels) and in the agreement. Programme terms
Partner badge and verification
Verification page: https://ledmesee.com/partner/LMP-0001 — the QR code on the certificate and sticker leads there. Badge for your website (updates itself and disappears when the partnership ends):
<a href="https://ledmesee.com/partner/LMP-0001" target="_blank" rel="noopener"><img src="https://ledmesee.com/partner/LMP-0001/badge.svg?lang=en" width="260" height="84" alt="Authorized LEDMESEE Partner"></a>“Where to buy LEDMESEE” map: https://ledmesee.com/en/partners/ — turn on your listing (address, phone, website, pin) in your account.
Contact
Questions about the API and the partner agreement: kontakt@ledmesee.com