Partner API

Catalogue API reference

Build an auction catalogue on your website with live lots, dealer prices, featured picks and visitor leads. $100 USD per month.

Version 1. The shared OpenAPI 3.1 specification covers all products: https://api.notedcar.com/partner/v1/openapi.yaml.

Get an API key

Overview

Put live auction lots and featured picks on your own website, with the linked dealer’s all-in prices and a lead form that sends visitor requests to the dealer’s cabinet.

The catalogue costs $100 USD per month, paid from your prepaid account balance. UAH accounts are converted at the stored USD/UAH rate when subscribing; that price is saved for renewals. Requests are not billed individually. Manage the subscription and visitor pricing settings in the dashboard’s Catalogue tab.

https://api.notedcar.com/partner/v1

Quick start

Top up your balance, activate the catalogue subscription in the dashboard and create a key. Link a dealer account to show delivered prices and accept leads. Use a secret key on your server, or create a publishable key with your website’s allowed origins for browser requests.

Fetch lots, display their photos and prices, then submit a visitor’s contact details to /leads. Cache catalogue responses per key for one minute. For a sale price, use prices.buy_now.total or a pinned pick price; the current bid total is only an estimate at today’s bid.

# Server-side: list lots
curl "https://api.notedcar.com/partner/v1/lots?currency=usd&lang=en&per_page=12" \
  -H "Authorization: Bearer $NOTEDCAR_KEY"

# Browser: submit a lead using a publishable key issued for this origin
curl -X POST "https://api.notedcar.com/partner/v1/leads" \
  -H "Authorization: Bearer $NOTEDCAR_PUBLISHABLE_KEY" \
  -H "Origin: https://autoimport.ua" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: lead-88213" \
  -d '{"lot_id":"lot_48291023","contact":{"name":"Olena","phone":"+380671234567"}}'

Authentication

Send Authorization: Bearer <key> on every request. Keys are created in your dashboard and shown once. Secret keys (nc_live_… or nc_test_…) belong on your server; they can manage subscriptions, picks and billing, and may be restricted to source IP ranges.

Publishable keys (nc_pub_…) can be embedded in your website. They may only read the catalogue and submit leads. Requests must come from an allowed website origin (401 origin_not_allowed otherwise). Billing and subscription management require a secret key.

Publishable keys receive no lot numbers, VINs or auction links unless you enable those fields in the dashboard. Visitor prices follow the account’s price visibility setting: total_only, bid_repair_total or full.

Authorization: Bearer nc_pub_7Hc2mVbL8xRwQp4nY6sDfG1aJeUoT5iKzM

Conventions

JSON in, JSON out (Content-Type: application/json). Timestamps are ISO 8601 in UTC. Money is in integer minor units of your account currency: kopiyky for UAH (the default), cents for USD; field names use _cents for both.

Catalogue prices are decimal strings in the stated currency (USD or UAH). Auction bid amounts are in USD. lang accepts en, uk or ru and adds translated labels while filter values keep their canonical names. Lot ids use lot_…; lead ids use lead_….

Errors

Errors share one envelope with a stable machine-readable code; details names the field or state when there is one.

{ "error": { "code": "subscription_inactive", "message": "Catalogue subscription is not active." } }
HTTPcodeMeaning
400invalid_requestMalformed body, invalid filters or contact fields, or an Idempotency-Key reused with a different body
401unauthorizedMissing, invalid, expired or revoked key, suspended account, or IP outside the key’s allowlist
402insufficient_balanceBalance plus credit limit cannot cover the subscription
404not_foundUnknown id
401origin_not_allowedPublishable key used from a website origin not on its list
403forbidden_key_kindPublishable key on an endpoint that needs a secret key
403subscription_inactiveCatalogue endpoint without an entitled catalogue subscription
403dealer_not_linkedPrices, destinations or leads on an account with no linked dealer
422price_unavailablePOST /lots/{id}/estimate cannot price the lot; details.reason says why
429rate_limitedCatalogue windows, lead submission or top-up creation; see Retry-After
503provider_unavailableUpstream data source or payment provider temporarily unavailable; retry later

Rate limits

The catalogue product has anti-scraping windows instead of metering: 300 requests per minute, 5 000 per hour and 30 000 per day per account, counted separately for your secret keys and your publishable keys so visitors can never use up your server's quota (your values are in GET /account → limits.lots and can be raised on request), plus 60 per minute and 600 per hour per visitor IP for publishable keys and 5 leads per minute per IP. 304 Not Modified answers are not counted; catalogue responses carry the same three headers for the window closest to exhaustion.

Top-up creation is limited to 10 per minute per account. A 429 response includes Retry-After in seconds. Cache per API key and send If-None-Match with the previous ETag to reuse unchanged catalogue responses.

Idempotency

Send an Idempotency-Key header with POST /leads to make retries safe. The same key and body replay the original response for 24 hours; a different body with the same key returns 400 invalid_request. Keys are scoped to the API key.

Account

GET/account

Your account, balance, price list and limits

dealer, catalogue, subscriptions.lots and limits.lots describe your website integration. Publishable keys receive only name, dealer, catalogue, limits, key and subscriptions.lots.status; balance and billing fields require a secret key.

The example below shows a publishable-key response. Secret-key responses also include your account balance, pricing, top-up methods and webhook settings.

Response

{
  "name": "Example Motors",
  "dealer": {
    "linked": true,
    "company_name": "Example Motors"
  },
  "catalogue": {
    "currencies": [
      "usd",
      "uah"
    ],
    "price_visibility": "total_only",
    "default_destination": {
      "id": 12,
      "name": "Kyiv",
      "country": "UA"
    },
    "visibility": {
      "lot_numbers": false,
      "vin": false
    },
    "base_filters": {},
    "lead_fields": {
      "required": [
        "contact_name",
        "contact_phone"
      ]
    }
  },
  "subscriptions": {
    "lots": {
      "status": "active"
    }
  },
  "limits": {
    "lots": {
      "requests_per_minute": 300,
      "requests_per_hour": 5000,
      "requests_per_day": 30000
    }
  },
  "key": {
    "kind": "publishable",
    "name": "autoimport.ua"
  }
}

Responses

  • 200OK
  • 401Missing, invalid, expired or revoked key, suspended account, or IP outside the key’s allowlist (unauthorized).

Catalogue

POST/subscriptions/lots

Activate the catalogue subscription

The catalogue costs $100 USD per month, paid from your balance (UAH accounts are converted at the stored USD/UAH rate when subscribing; the subscription saves that price for renewals): the first month is charged now and the catalogue endpoints start answering. Each following month is charged on the renewal date; if the balance cannot cover it you have three days of grace (past_due), then the endpoints answer 403 subscription_inactive until you top up. Leads are always accepted.

DELETE /subscriptions/lots cancels at the end of the paid period; a POST on a cancelled-but-running subscription clears the cancellation without a charge. Secret keys only. The same controls are on the dashboard’s Catalogue tab.

Response

{
  "product": "lots",
  "plan": "catalogue",
  "status": "active",
  "entitled": true,
  "currency": "USD",
  "price_cents": 10000,
  "cancel_at_period_end": false,
  "current_period_starts_at": "2026-10-09T10:00:00Z",
  "current_period_ends_at": "2026-11-09T10:00:00Z",
  "grace_ends_at": null,
  "activated_at": "2026-10-09T10:00:00Z",
  "cancelled_at": null
}

Responses

  • 201Activated; the first month was charged
  • 200Already active (a pending cancellation is cleared)
  • 401Missing, invalid, expired or revoked key, suspended account, or IP outside the key’s allowlist (unauthorized).
  • 402Balance cannot cover the month (insufficient_balance)
  • 403Publishable key (forbidden_key_kind)
GET/lots

Live lots, filtered and paginated, with your prices

Filters: site[], makes[], models[] (canonical names from /filters/makes and /filters/models), year_from, year_to, odometer_min/odometer_max (miles), buy_now_min/buy_now_max (USD), body_type[], damage_primary[], color[], lot_type[], fuel, transmission, drive, status, state, location, auction_date_from/auction_date_to, search. Your dashboard base_filters are always applied underneath; a request can narrow but never widen them.

sort is auction_date (default), price_current, price_buy_now, year, odometer or added; order is asc or desc. page/per_page (max 50; page × per_page ≤ 10 000). destination is an id from /destinations, currency is usd or uah, lang (en/uk/ru) adds translated labels, and include= without prices skips pricing.

prices is present only on an account linked to a dealer and is priced with that dealer’s fees, routes, customs and markup. current_bid.total is what the car would cost if won at today’s bid, which before the sale is usually a few hundred dollars and not a price to print: use buy_now.total, a pinned pick price, or POST /lots/{id}/estimate with a realistic bid. breakdown is null under total_only; it lists bid and repair under bid_repair_total and every component under full. prices is null with a price_unavailable_reason (not_priceable_type, no_route, missing_battery_capacity) when the car cannot be priced.

Publishable keys receive no lot_number, vin or auction_url unless the account opted in (expose_lot_numbers adds the lot number and auction link, expose_vin the VIN); secret keys always receive them plus seller, salvage_id and price_reserve. Responses carry ETag and Cache-Control: private, max-age=60 (the answer depends on the key, so keep caches per key); render server-side with a one-minute cache and a busy site stays far under the limits.

Query parameters

makes[]string[]Canonical make names
year_fromintegerModel year lower bound
sortstringauction_date (default), price_current, price_buy_now, year, odometer, added
pageintegerDefault 1
per_pageintegerDefault 25, max 50
destinationintegerId from /destinations
currencystringusd (default) or uah
langstringen, uk or ru: adds labels

Response

{
  "data": [
    {
      "id": "lot_48291023",
      "site": "copart",
      "platform": "Copart",
      "year": 2019, "make": "BMW", "model": "X3", "series": "XDRIVE30I",
      "title": "2019 BMW X3 XDRIVE30I",
      "body_type": "Sport Utility", "color": "Black", "lot_type": "Automobile",
      "engine": "2.0L 4", "engine_size": 2.0, "fuel": "Gas", "transmission": "Automatic", "drive": "All wheel drive",
      "odometer": 41230, "odometer_unit": "mi", "odometer_brand": "Actual",
      "damage_primary": "Front End", "damage_secondary": "Minor Dent/Scratches",
      "document_type": "Salvage", "status": "Run & Drive",
      "auction_date": "2026-10-14T14:00:00Z",
      "location": "NJ - Somerville", "state": "NJ", "country": "US",
      "price_current": "5200.00", "price_buy_now": "14500.00", "auction_currency": "USD",
      "images": ["https://…/1.jpg"], "images_small": ["https://…/1_thb.jpg"],
      "listing_status": "listed",
      "labels": { "damage_primary": "Передня частина", "status": "На ходу" },
      "prices": {
        "currency": "USD",
        "destination": { "id": 12, "name": "Kyiv" },
        "current_bid": { "bid": "5200.00", "total": "11840.00", "breakdown": null },
        "buy_now":     { "bid": "14500.00", "total": "22690.00", "breakdown": null },
        "pinned": null
      },
      "price_unavailable_reason": null
    }
  ],
  "meta": { "page": 1, "per_page": 25, "total": 1834, "total_pages": 74 }
}

Responses

  • 200OK
  • 400Bad paging or parameter (invalid_request)
  • 401Missing, invalid, expired or revoked key, suspended account, or IP outside the key’s allowlist (unauthorized).
  • 403No entitled catalogue subscription (subscription_inactive)
  • 429A catalogue window is exhausted (rate_limited); see Retry-After
GET/lots/{id}

One lot

The same shape as a list item, with every photo and the 360° view links. Any lot your base filters allow can be read, including one whose auction has run (listing_status sold). 404 not_found for a lot outside your base filters or one that has been withdrawn, unless it is one of your picks; GET /lots leaves withdrawn lots out.

Response

{
  "id": "lot_48291023",
  "site": "copart",
  "platform": "Copart",
  "year": 2019, "make": "BMW", "model": "X3", "series": "XDRIVE30I",
  "title": "2019 BMW X3 XDRIVE30I",
  "body_type": "Sport Utility", "color": "Black", "lot_type": "Automobile",
  "engine": "2.0L 4", "engine_size": 2.0, "fuel": "Gas", "transmission": "Automatic", "drive": "All wheel drive",
  "odometer": 41230, "odometer_unit": "mi", "odometer_brand": "Actual",
  "damage_primary": "Front End", "damage_secondary": "Minor Dent/Scratches",
  "document_type": "Salvage", "status": "Run & Drive",
  "auction_date": "2026-10-14T14:00:00Z",
  "location": "NJ - Somerville", "state": "NJ", "country": "US",
  "price_current": "5200.00", "price_buy_now": "14500.00", "auction_currency": "USD",
  "images": ["https://…/1.jpg"], "images_small": ["https://…/1_thb.jpg"],
  "listing_status": "listed",
  "labels": { "damage_primary": "Передня частина", "status": "На ходу" },
  "prices": {
    "currency": "USD",
    "destination": { "id": 12, "name": "Kyiv" },
    "current_bid": { "bid": "5200.00", "total": "11840.00", "breakdown": null },
    "buy_now":     { "bid": "14500.00", "total": "22690.00", "breakdown": null },
    "pinned": null
  },
  "price_unavailable_reason": null
}

Responses

  • 200OK
  • 401Missing, invalid, expired or revoked key, suspended account, or IP outside the key’s allowlist (unauthorized).
  • 403subscription_inactive
  • 404Unknown or withdrawn lot, or one outside your base filters
POST/lots/{id}/estimate

Breakdown for a bid of the visitor’s choosing

The calculator on a car page. bid_amount is in USD (CAD on Canadian sites) regardless of currency. Needs a linked dealer.

Body

bid_amount*stringPositive number
destinationintegerId from /destinations
currencystringusd (default) or uah

Request

{ "bid_amount": "9000", "destination": 12, "currency": "uah" }

Response

{
  "lot_id": "lot_48291023",
  "currency": "UAH",
  "rate": "41.3000", "rate_as_of": "2026-10-09T06:00:00Z",
  "destination": { "id": 12, "name": "Kyiv" },
  "bid": "371700.00",
  "total": "716690.00",
  "breakdown": null
}

Responses

  • 200OK
  • 400bid_amount missing or not positive
  • 401Missing, invalid, expired or revoked key, suspended account, or IP outside the key’s allowlist (unauthorized).
  • 403subscription_inactive or dealer_not_linked
  • 404Unknown lot
  • 422Cannot be priced (price_unavailable; details.reason)
GET/picks

Featured lots, in order

The lots you featured on the dashboard or with POST /picks. Each item carries the pick’s own fields and the full lot object. A pick whose lot was withdrawn or sold stays in the list with listing_status delisted, sold or gone so your page can hide or label it. pinned_price is your own asking price; it is also surfaced as prices.pinned on the lot.

Manage picks with a secret key: POST /picks (lot_id, position, headline, pinned_price: { amount, currency }; 201, or 200 when already featured), PATCH /picks/{id} (any subset; pinned_price: null clears it), DELETE /picks/{id} (204).

Response

{
  "data": [
    {
      "id": "pick_01J9R8…",
      "position": 1,
      "headline": "One owner, under 45k miles",
      "pinned_price": { "amount": "21900.00", "currency": "USD" },
      "site": "copart",
      "listing_status": "listed",
      "lot": { "id": "lot_48291023", "title": "2019 BMW X3 XDRIVE30I", "prices": { "pinned": { "total": "21900.00", "currency": "USD" } } },
      "created_at": "2026-10-05T09:00:00Z",
      "updated_at": "2026-10-05T09:00:00Z"
    }
  ],
  "meta": { "total": 24 }
}

Responses

  • 200OK
  • 401Missing, invalid, expired or revoked key, suspended account, or IP outside the key’s allowlist (unauthorized).
  • 403subscription_inactive
POST/picks

Feature a lot (secret key)

See GET /picks for the fields. PATCH /picks/{id} and DELETE /picks/{id} complete the set.

Body

lot_id*stringA lot id such as lot_48291023
positionintegerOrder on the page
headlinestringUp to 200 characters
pinned_priceobject{ amount, currency }; your own asking price

Request

{ "lot_id": "lot_48291023", "position": 1, "headline": "One owner, under 45k miles",
  "pinned_price": { "amount": "21900.00", "currency": "USD" } }

Responses

  • 201Created
  • 200Already featured
  • 401Missing, invalid, expired or revoked key, suspended account, or IP outside the key’s allowlist (unauthorized).
  • 403Publishable key or no subscription
  • 404Unknown lot
GET/destinations

Where the linked dealer delivers

Ids are what destination accepts on /lots, /lots/{id}, /picks and the estimate.

Response

{ "data": [ { "id": 12, "name": "Kyiv", "country": "UA", "estimated_days": "7-10", "default": true } ] }

Responses

  • 200OK
  • 401Missing, invalid, expired or revoked key, suspended account, or IP outside the key’s allowlist (unauthorized).
  • 403subscription_inactive or dealer_not_linked
GET/filters/options

Filter vocabularies

GET /filters/makes and GET /filters/models?make=BMW return canonical names ({ "data": [ { "name": "BMW" } ] }). GET /filters/options returns the raw values every other filter accepts: sites, body_types, fuels, transmissions, drives, damages, colors, document_types, statuses, lot_types, states; with lang each value becomes { value, label }.

GET /dictionary?lang=uk returns translation maps keyed by field (damage, status, body_type, fuel, transmission, drive, document_type, color, lot_type, seller_type), raw value → label, so a site renders Ukrainian or Russian with one lookup. Cache it for a day.

Response

{
  "sites": [ { "value": "copart", "label": "copart" }, { "value": "iaai", "label": "iaai" } ],
  "damages": [ { "value": "Front End", "label": "Передня частина" } ],
  "statuses": [ { "value": "Run & Drive", "label": "На ходу" } ]
}

Responses

  • 200OK
  • 401Missing, invalid, expired or revoked key, suspended account, or IP outside the key’s allowlist (unauthorized).
  • 403subscription_inactive
POST/leads

A visitor’s request

Allowed with a publishable key, so a static page can post it. Requires a linked dealer: the lead lands in that dealer’s cabinet under Requests with a “website” badge and triggers the same notifications as the NotedCar order form. contact.name and contact.phone are required by default (the dashboard can change the required set; it is reported in GET /account → catalogue.lead_fields). quoted_total stores the price the visitor saw. website is a honeypot and must be empty.

Send Idempotency-Key to make retries safe (lead keys are kept per API key, apart from history-report keys). Without expose_lot_numbers, a publishable key's answer carries no lot.lot_number. Send X-NotedCar-Dry-Run: true (or use an nc_test_… key) to validate without saving: the answer is the would-be lead with dry_run: true. Secret keys can GET /leads (cursor-paginated; filters status, lot_id, created_after, created_before) and PATCH /leads/{id} with { "status": "contacted" }. Leads are limited to 5 per minute per visitor IP and are not counted against the catalogue windows.

Headers

Idempotency-KeystringOptional; replay protection for 24 hours

Body

lot_idstringOptional; omit for a general request
contact*objectname, phone required; email, telegram, preferred_contact_method (phone/telegram/email/whatsapp) optional
messagestringFree text from the visitor
delivery_citystringWhere the visitor wants the car
quoted_totalobject{ amount, currency } the visitor saw
page_urlstringhttp(s) URL of the page

Request

{
  "lot_id": "lot_48291023",
  "contact": { "name": "Олена", "phone": "+380671234567", "preferred_contact_method": "telegram" },
  "message": "Is the price final with delivery to Lviv?",
  "quoted_total": { "amount": "22690.00", "currency": "USD" },
  "page_url": "https://autoimport.ua/cars/lot_48291023"
}

Response

{
  "id": "lead_01J9R9…",
  "status": "new",
  "lot": { "id": "lot_48291023", "lot_number": "78912345", "site": "copart", "title": "2019 BMW X3" },
  "contact": { "name": "Олена", "phone": "+380671234567", "email": null, "telegram": null, "preferred_contact_method": "telegram" },
  "message": "Is the price final with delivery to Lviv?",
  "quoted_total": { "amount": "22690.00", "currency": "USD" },
  "page_url": "https://autoimport.ua/cars/lot_48291023",
  "source": "partner_api",
  "dry_run": false,
  "created_at": "2026-10-09T10:15:02Z"
}

Responses

  • 201Created, or validated with dry_run: true
  • 400Missing required fields (details.missing), honeypot filled, bad page_url
  • 401Missing, invalid, expired or revoked key, suspended account, or IP outside the key’s allowlist (unauthorized).
  • 403dealer_not_linked
  • 404Unknown lot
  • 429More than 5 leads per minute from one IP

Top-ups

POST/topupsRate-limited: 10 requests per minute per account.

Add funds to your balance

Returns the payment to complete; the balance is credited once the provider confirms, usually within seconds for card and within a minute or two on-chain. A topup.paid webhook is sent when it lands.

For crypto_direct there is no payment_url; crypto_payment holds what to send and where: { network, network_name, currency, amount, address, qr_svg, expires_at, expired }. Send exactly amount (the trailing decimals identify your order) before expires_at, 30 minutes after creation.

Statuses: pending → processing (payment seen, crediting) → paid; or payment_failed (declined, expired or cancelled; nothing credited).

Body

amount_cents*integerIn your account currency; bounds in GET /account → topups
payment_methodmonobank | crypto_directDefault monobank (card). Only methods listed in GET /account → topups.methods are accepted
payment_networkstringcrypto_direct only, one of topups.crypto_networks[].id
payment_currencystringcrypto_direct only, one of that network’s currencies
return_urlhttps URLOptional, where the card payment page sends the payer afterwards

Request

{ "amount_cents": 50000, "payment_method": "monobank" }

Response

{
  "id": "top_01J9R7A1B2C3D4E5F6G7H8J9K0",
  "status": "pending",
  "amount_cents": 50000,
  "currency": "UAH",
  "payment_method": "monobank",
  "payment_url": "https://pay.monobank.ua/…",
  "charged_amount": null,
  "charged_currency": null,
  "crypto_payment": null,
  "return_url": "https://notedcar.com/api/dashboard/topups?topup=top_01J9R7…",
  "created_at": "2026-10-08T12:00:00Z",
  "paid_at": null,
  "failure_reason": null
}

Responses

  • 201Top-up created, payment pending
  • 400invalid_request — amount out of bounds, unknown method, non-https return_url
  • 401Missing, invalid, expired or revoked key, suspended account, or IP outside the key’s allowlist (unauthorized).
  • 429rate_limited
  • 503provider_unavailable — the provider refused the order, or no exchange rate yet for a USD account
GET/topups/{id}

Top-up status

Poll this while a payment is open. For a crypto top-up it also triggers a chain scan.

Response

{
  "id": "top_01J9R7A1B2C3D4E5F6G7H8J9K0",
  "status": "pending",
  "amount_cents": 50000,
  "currency": "UAH",
  "payment_method": "monobank",
  "payment_url": "https://pay.monobank.ua/…",
  "charged_amount": null,
  "charged_currency": null,
  "crypto_payment": null,
  "return_url": "https://notedcar.com/api/dashboard/topups?topup=top_01J9R7…",
  "created_at": "2026-10-08T12:00:00Z",
  "paid_at": null,
  "failure_reason": null
}

Responses

  • 200OK
  • 401Missing, invalid, expired or revoked key, suspended account, or IP outside the key’s allowlist (unauthorized).
  • 404not_found
GET/topups

Your top-ups, newest first

Same cursor pagination as /history-reports.

Query parameters

limitintegerDefault 50, max 200
cursorstringFrom next_cursor

Responses

  • 200OK
  • 401Missing, invalid, expired or revoked key, suspended account, or IP outside the key’s allowlist (unauthorized).
POST/topups/{id}/claim

Claim an on-chain payment by transaction hash

For a crypto_direct top-up you paid after it stopped being watched, or when you do not want to wait for the next scan. Answers 200 with state: "paid", or a waiting state (not_found, unconfirmed, unavailable) to poll through.

Body

tx_hash*stringThe transaction hash / signature

Request

{ "tx_hash": "0x…" }

Response

{ "state": "paid", "topup": { "id": "top_…", "status": "processing" } }

Responses

  • 200Paid, or a waiting state
  • 400invalid_request — not a crypto_direct top-up
  • 401Missing, invalid, expired or revoked key, suspended account, or IP outside the key’s allowlist (unauthorized).
  • 404not_found
  • 422invalid_request with details.state saying why the transaction does not pay for this top-up

Billing

GET/ledger

Balance history, newest first

Same cursor pagination as /history-reports. kind is one of topup, charge, refund, adjustment; charges are negative; each entry names the product it belongs to.

Query parameters

limitintegerDefault 50, max 200
cursorstringFrom next_cursor

Response

{
  "data": [
    { "id": "led_…", "kind": "charge", "amount_cents": -4500, "balance_after_cents": 1250000,
      "product": "history_reports", "history_report_id": "hr_…",
      "description": "History report 1HGCM82633A004352 (en)", "created_at": "2026-10-08T10:15:02Z" },
    { "id": "led_…", "kind": "topup", "amount_cents": 1000000, "balance_after_cents": 1254500,
      "product": null, "reference": "monobank:PUB-20261001-AB12CD34", "created_at": "2026-10-01T08:00:00Z" }
  ],
  "next_cursor": null
}

Responses

  • 200OK
  • 401Missing, invalid, expired or revoked key, suspended account, or IP outside the key’s allowlist (unauthorized).

Testing your integration

nc_test_… secret keys read the real catalogue and calculate real prices. They do not provide fixture lots or a free catalogue subscription.

To test a lead without saving it, use a test key or send X-NotedCar-Dry-Run: true with POST /leads. The response contains the validated lead with dry_run: true. Top-ups and catalogue subscriptions are not sandboxed.