TradePartner entity acting in the buyer role, unique per
(sellerId, vatNumber), so the same buyer across multiple orders is one
record, not a new entry per deal.
That identity covers COMPANY buyers, which is what this endpoint creates.
Natural persons (type: "CONSUMER") are onboarded through the prospect /
Click2Comply flow instead, which records no VAT number for them. They are read
on the same operations as any other buyer, so branch on type rather than on
the presence of vatNumber.
Upsert a buyer
POST /partners/{sellerId}/buyers is an upsert keyed on
(sellerId, vatNumber):
- First call → buyer created,
201 Created+Locationheader. - Second call with identical body → existing buyer returned,
200 OK. - Second call with different body → the same existing buyer,
200 OK, withnotAppliednaming the fields you sent that the record does not say. Nothing is overwritten; change a field withPATCHunderIf-Match.
Response
Save the returned
uuid, it’s the buyer reference for every subsequent
call (order creation, KYC documents, invitations). The version field is
for optimistic concurrency.Look a buyer up
GET /partners/{sellerId}/buyers resolves one buyer. Supply exactly one of
vat or companyNumber, both matched exactly, ignoring case and surrounding
whitespace:
400. A value that resolves nothing is a 404,
whatever its shape. A buyer for whom the platform holds no VAT number — a
natural person, or a company that never supplied one — is reachable by
companyNumber only. Which key resolved a buyer tells you nothing about what
kind of party it is: read type on the response.
Buyers you reach through a shared KYC result
The platform holds one KYC record per buyer. You reach a buyer either because your partner made the KYC request, or because another partner that did shared the result with you. The split exists because the first request is billed differently — not because a shared record is a lesser one. So both routes give the same access. On a buyer you reach either way you can:- read it and list its contact people
- add a contact person —
POST .../contacts, andresponsibleContacton an order reaches the same buyer through the same scope - correct
companyNameand the registeredaddressunderIf-Match - block and unblock it
notApplied. Neither overwrites the person on file. Send
the same body to both and you get the same person; send a different one and
both tell you so, in the same shape.
Four consequences worth designing for:
- Your edits land for everybody. Correcting a company name corrects it for
every partner holding that record. That is the point — one clean record per
buyer — but it means a
PATCHis not a private change. - The tag moves without you. Another partner editing the same buyer
advances its
ETag, so a409onIf-Matchhere does not mean you got something wrong. Re-read the buyer and retry — optimistic concurrency has the rules and the retry loop. - A replayed body can start reporting
notApplied. Every write here compares your body against the record as it stands now, so once another partner or Novatrade24 has corrected a company name, an address or a contact person’s name or telephone number, the body that reported nothing yesterday reports it today. The call still succeeds and still resolves the same buyer or person — re-read the record and send what it says, or keep sending yours and ignore a report you already understand. - One VAT number can reach two buyers, and
?vat=gives you yours. If you reach a buyer through a share and then record your own under the same VAT number, both are yours to read —POST /buyersdeliberately creates your own row rather than adopting the shared one.GET /buyers?vat=answers with your own record in that case, so a lookup followed by aPATCHcorrects the row your orders point at. The shared record stays reachable by itsuuidand bycompanyNumber. Storing theuuida create returned is still the sturdier habit.
404 on reads and writes alike.
Choose a KYC mode
See the full KYC modes guide. Short version:
Mode is required on buyer create, can be upgraded A→B (not reversed) via
PATCH /buyers/{id}. Mode A is not available yet: MARKETPLACE_LED is
rejected with 403 for every organization, and allowMarketplaceLedKyc
reads false everywhere. Use NT24_LED.
Upload KYC documents
Documents are typed via the platformDocumentType enum. For a KYC buyer
workflow, the relevant types are COC_*, BANK_*, VAT_*, CONTACT_*,
ADDRESS_*, and TP_*.
ACTIVE document of each type is what counts for compliance.
The full history is retained for audit.
Trigger a VIES check
202 Accepted. Result is written to KYC status shortly after (async).
Check GET .../kyc:
kyc.vies_check_failed webhook, subscribe for real-time notification.
Optional: invite the buyer to complete their own KYC
If you don’t have all KYC data yourself, generate a self-service invitation the buyer receives an email with a branded upload link. The recipient must be the buyer’s company email or an active contact of the buyer (otherwise422), and a KYC that is already decided takes no new
invitation (409).
publicLinkUrl is in this response only: the platform keeps a hash of the
link, so the list and a repeated create leave it out. To send a link again,
revoke the invitation and create a new one.
When the buyer uses the link, the self_service_invitation.used webhook
fires. The KYC status endpoint reflects their submissions identically to
API-uploaded documents, your integration doesn’t need to branch on data source.
NT24-led verification (Mode B only)
If the buyer’skycMode is NT24_LED, trigger iDenfy + AML:
kyc.verification_completed with
the outcome (VERIFIED or REJECTED).
Once verified, download the signed KYC profile PDF:
Block or unblock a buyer
Used for risk-based interventions (fraud signal, regulatory hold):Inactive buyers
A buyer can close its account on Novatrade24. It then becomes inactive, and the buyer’sinactiveSince field carries the date; it is null while the buyer is
active. Nobody learns why it closed.
An inactive buyer stays readable: GET on the buyer, its KYC status and its
orders keeps answering. Every write that names it answers 409 with a detail
saying it is inactive:
- creating an order for it, and resolving it again through
POST /buyers PATCHon the buyer, adding a contact, triggering a VIES check or a verification, uploading a KYC document, inviting it to self-service KYC- any write to one of its orders: update, cancellation, documents and payment
409 applies when your own partner has closed its account.
Next
KYC modes deep-dive
Differences between Marketplace-led and NT24-led.
Create an order
With a buyer in place, register your first transaction.