Bicops Partner APIv1

Integrationsgrænseflade for sælgere og erhvervspartnere.

Oversigt

Produkt-, lager- og prisdata sendes til Bicops via denne API. Ordre- og økonomidata hentes via samme API. Masseanmodninger behandles fra en kø; svaret er 202 med et batch-id (batchId).

Version: /v1. Feltnavne ændres ikke. Svarbeskeder er på engelsk; feltet code er stabilt.

  • JSON, UTF-8, ISO-8601 (UTC)
  • Hvert svar indeholder headeren X-Request-Id
  • Ugyldige poster afvises, gyldige behandles
  • En post med samme sourceId opdateres
GET /v1/me
POST /v1/catalog/products
PATCH /v1/catalog/stock · /v1/catalog/prices
DELETE /v1/catalog/products/{sourceId}
POST /v1/catalog/imports → /{batchId}/complete
GET /v1/catalog/products · /v1/catalog/batches/{id} · /v1/logs/requests

Godkendelse

Hver anmodning indeholder headerne X-Api-Key og X-Api-Secret. Nøglen udstedes af Bicops; hemmeligheden vises kun ved oprettelsen.

Sælgeridentiteten kommer fra nøglen. Der sendes intet sælger-id i body. En nøgle har kun adgang til sin egen konto. Rettigheder styres af scopes (catalog:read, catalog:write, orders:read).

Der kan angives en IP-allowlist og en udløbsdato. Ved rotation kan to nøgler være aktive.

X-Api-Key: 2c1d5c7e-2a1b-4c1e-9d7a-2b6f0e3c9a11
X-Api-Secret: 4Qb…(base64url, 43 chars)
Content-Type: application/json
X-Request-Id: optional-your-correlation-id

Forbindelsestest: GET /v1/me. Svaret indeholder nøglens scopes og grænser.

Nøgletyper

Der findes to nøgletyper med forskelligt omfang. En tjeneste, der kaldes med den forkerte type, returnerer 403.

SælgernøgleKatalog, ordrer, returneringer, fakturaer, økonomi, rapporter, batches, webhooks. Knyttet til en sælgerkonto.
VirksomhedsnøgleKundekonti, kontoudtog, kvitteringer, salgsfakturaer, tildelinger af salgsrepræsentanter. Knyttet til en virksomhedsafdeling.
BeggeGET /v1/me, GET /v1/logs/requests, webhook-abonnementer og GET /v1/events.

Kom i gang

1. Forbindelsestest

curl -s https://partner.bicops.tr/v1/me \
  -H "X-Api-Key: 2c1d5c7e-2a1b-4c1e-9d7a-2b6f0e3c9a11" \
  -H "X-Api-Secret: <your-secret>"

2. Send produkter (højst 1.000 poster). Svar: 202 og batchId.

curl -s -X POST https://partner.bicops.tr/v1/catalog/products \
  -H "X-Api-Key: <key>" -H "X-Api-Secret: <secret>" \
  -H "Content-Type: application/json" \
  -d '{
    "items": [{
      "sourceId": "SACHS 317 572",
      "name": "AMORTISOR ON AUDI A3 / GOLF V",
      "brand": "SACHS",
      "producerCode": "317 572",
      "oemCodes": ["1T0413031CN", "1T0413031CK"],
      "equivalentCodes": ["FEBI 106124"],
      "price": 3869.60, "currency": "TRY", "pricesIncludeVat": false,
      "stock": 12,
      "warehouses": [{ "code": "ANK", "stock": 8 }, { "code": "IZM", "stock": 4 }],
      "minOrder": 1, "packageAmount": 1, "unit": "AD", "desi": 3.2,
      "images": ["https://cdn.example.com/317572.jpg"],
      "status": 1
    }]
  }'
HTTP/1.1 202 Accepted
X-Request-Id: 7c0e1c5a-…
{
  "batchId": 1042, "status": "queued",
  "received": 1, "accepted": 1, "rejected": 0, "warnings": 0,
  "chunks": 1, "dryRun": false, "issues": [], "requestId": "7c0e1c5a-…"
}

3. Hent batchposten: status, optællinger, rækkefejl.

curl -s https://partner.bicops.tr/v1/catalog/batches/1042 -H "X-Api-Key: <key>" -H "X-Api-Secret: <secret>"
curl -s https://partner.bicops.tr/v1/catalog/batches/1042/errors.csv -H "X-Api-Key: <key>" -H "X-Api-Secret: <secret>" -o errors.csv

4. Opdater lager og priser (højst 5.000 poster).

curl -s -X PATCH https://partner.bicops.tr/v1/catalog/stock \
  -H "X-Api-Key: <key>" -H "X-Api-Secret: <secret>" -H "Content-Type: application/json" \
  -d '{"items":[{"sourceId":"SACHS 317 572","stock":9,"warehouses":[{"code":"ANK","stock":5},{"code":"IZM","stock":4}]}]}'

Katalog

POST /v1/catalog/products tilføjer eller opdaterer poster efter sourceId. Kun ændrede poster behandles.

Felter

FeltTypeBeskrivelse
sourceIdstring (≤200)Påkrævet. Sælgerens varenummer. Højst 200 tegn.
namestring (≤4000)Påkrævet for aktive produkter.
brandstring (≤200)Mærkenavn.
producerCode, previousCodestring (≤200)Producentnummer og tidligere nummer.
oemCodes[]string[] (≤200 items, each ≤100)OEM-numre som array. Numre slås ikke sammen.
equivalentCodes[]string[] (≤200 items)Tilsvarende numre ("MÆRKE NUMMER").
price, currency, pricesIncludeVatdecimal · string(3) · booleanListepris. TRY, USD eller EUR.
stock, warehouses[]decimal · object[] {code: string, stock: decimal}Samlet lager og fordeling pr. lager [{code, stock}].
minOrder, packageAmount, boxAmount, unitinteger · integer · integer · string(≤16)Bestillingsregler.
desi, weightdecimal · decimalVolumenvægt og vægt (kg).
images[]string[] (URL, ≤10)Billed-URL’er (https).
statusinteger (0 | 1)1 aktiv, 0 inaktiv.

PATCH /v1/catalog/stock og PATCH /v1/catalog/prices opdaterer kun lager og priser. Behandles i prioritetskøen.

Deaktivering: DELETE /v1/catalog/products/{sourceId} eller POST /v1/catalog/products/deactivate.

GET /v1/catalog/products viser posternes status hos Bicops.

Filimport

Et komplet katalog sendes som NDJSON-fil (én post pr. linje). gzip anbefales. Filen uploades direkte til lageret.

  1. POST /v1/catalog/imports: få uploadUrl og batchId
  2. Upload filen med HTTP PUT til uploadUrl
  3. POST /v1/catalog/imports/{batchId}/complete: start behandlingen
  4. GET /v1/catalog/batches/{batchId}: følg fremdriften
# 1
curl -s -X POST https://partner.bicops.tr/v1/catalog/imports -H "X-Api-Key: <key>" -H "X-Api-Secret: <secret>" \
  -H "Content-Type: application/json" -d '{"format":"ndjson","gzip":true}'
# → {"batchId":1043,"uploadUrl":"https://files.bicops.tr/partner-raw/…","expiresInSec":900}
# 2
curl -s -X PUT "<uploadUrl>" -H "Content-Type: application/octet-stream" --data-binary @catalog.ndjson.gz
# 3
curl -s -X POST https://partner.bicops.tr/v1/catalog/imports/1043/complete -H "X-Api-Key: <key>" -H "X-Api-Secret: <secret>"

Filformat

  • Hver linje er et selvstændigt JSON-objekt. Der er ingen kommaer eller firkantede parenteser mellem linjerne.
  • Filen er UTF-8-kodet, og linjer slutter med \n. Tomme linjer springes over.
  • Kun sourceId (dit varenummer) er påkrævet. Et felt, du udelader, beholder sin nuværende værdi.
  • En ugyldig linje afvises for sig, og resten af filen behandles. Årsager findes i GET /v1/catalog/batches/{id}/errors.
  • Hvis stock og warehouses sendes sammen, skal stock svare til summen af lagerbeholdningerne.
  • Produkter, der mangler i filen, slettes ikke. Send et sådant produkt med status: 0 for at deaktivere det.

Eksempelfil

{"sourceId":"SACHS 317 572","name":"AMORTISOR ON AUDI A3 / GOLF V","brand":"SACHS","producerCode":"317 572","previousCode":"317 571","oemCodes":["1T0413031CN","1T0413031CK"],"equivalentCodes":["FEBI 106124"],"barcodes":["4054228012345"],"price":3869.6,"currency":"TRY","pricesIncludeVat":false,"stock":12,"warehouses":[{"code":"ANK","stock":8},{"code":"IST","stock":4}],"minOrder":1,"packageAmount":1,"boxAmount":2,"unit":"AD","desi":3.2,"weight":1.25,"images":["https://cdn.satici.com/317572.jpg"],"categoryHint":"Amortisor","vehicleHint":"VW Golf V 2003-2008","status":1}
{"sourceId":"MANN W 712/95","name":"YAG FILTRESI","brand":"MANN","oemCodes":["W 712/95","1109AY"],"price":210.5,"currency":"TRY","stock":0,"status":1}
{"sourceId":"BOSCH 0986495255","name":"FREN BALATASI ON","brand":"BOSCH","oemCodes":["0986495255"],"price":1250,"currency":"TRY","stock":6,"warehouses":[{"code":"IZM","stock":6}],"status":1}
{"sourceId":"SACHS 317 571","status":0}

Download NDJSON-eksempelfil

dryRun=true validerer filen uden at skrive. Den første import af 1.000.000 poster tager ca. 15 minutter.

Batchposter

Hver masseanmodning opretter en batchpost. GET /v1/catalog/batches/{id} giver status, optællinger og varighed. /errors giver rækkefejl; /errors.csv samme liste som CSV.

queuedI kø
awaiting_uploadVenter på filupload
processingBehandles
syncingKatalog og søgeindeks opdateres
doneFuldført
partialFuldført, nogle poster afvist
failedMislykkedes

Optællinger: received, accepted, rejected, changed. Ved identiske data er changed = 0.

Endpoints

Alle endpoints ligger under /v1. Skrive-endpoints kræver det tilhørende scope.

Ordrer

EndpointBeskrivelse
GET /ordersOrdreliste (status, updatedSince)
GET /orders/{id}Ordredetaljer
POST /orders/{id}/approveGodkend ordre
POST /orders/{id}/statusOpdater status {status}
POST /orders/{id}/erp-referenceGem ERP-reference {reference}
GET /orders/{id}/messagesOrdrebeskeder
GET /orders/{id}/documentsOrdredokumenter

Forsendelse

EndpointBeskrivelse
POST /orders/{id}/shipmentsRegistrer egen forsendelse {trackNumber, cargoId?}
POST /orders/{id}/shipments/createOpret forsendelse med Bicops-fragtfirma
GET /orders/{id}/shipments/labelForsendelsesetiket (PDF, base64)
GET /orders/carriersListe over fragtfirmaer

Returneringer og annulleringer

EndpointBeskrivelse
GET /returnsReturanmodninger
GET /returns/{id}Returdetaljer
POST /returns/{id}/decisionReturbeslutning {action: approve|reject}
GET /cancellationsAnnullerede ordrer

Fakturaer

EndpointBeskrivelse
GET /orders/{id}/invoicesFakturafiler til ordren
POST /orders/{id}/invoiceTilføj egen faktura {fileBase64|fileUrl}
GET /invoicesDokumenter udstedt til dig af Bicops

Økonomi

EndpointBeskrivelse
GET /finance/settlementsAfregning pr. ordre
GET /finance/statementMånedsoversigt
GET /finance/paymentsKortbetalinger

Webhooks og hændelser

EndpointBeskrivelse
GET /webhooksWebhook-liste
POST /webhooksRegistrer webhook {url, events[]}
DELETE /webhooks/{id}Deaktiver webhook
POST /webhooks/{id}/testSend testhændelse
GET /webhooks/deliveriesLeveringslog
GET /eventsHændelseskø (cursor)

Rapporter

EndpointBeskrivelse
GET /reports/salesSalgsrapport (groupBy=day|month|product|brand)
GET /reports/returnsReturprocent
GET /reports/catalogKatalogstatus
GET /reports/demandEfterspørgsel og udsolgte produkter

Erhverv (afdelingsnøgle)

EndpointBeskrivelse
GET /customersKundekonti
GET /customers/{id}/statementKundeoversigt og saldo
GET /accounting/receiptsKvitteringer
GET /accounting/invoicesAfdelingens salgsfakturaer
GET /salesmenTildelinger af salgsrepræsentanter

Fejlkoder

Fejlsvar: { code, message, details[], requestId }. code er stabil; message er en engelsk beskrivelse.

{
  "code": "VALIDATION_FAILED",
  "message": "Request body validation failed",
  "details": [{ "field": "items.0.price", "code": "INVALID_FIELD", "message": "price must not be less than 0" }],
  "requestId": "7c0e1c5a-…"
}

HTTP-statuskoder

UNAUTHORIZED (401)Nøgle ugyldig eller mangler
FORBIDDEN_SCOPE (403)Utilstrækkeligt scope
SELLER_KEY_REQUIRED (403)Tjenesten kræver en sælgernøgle; der blev brugt en virksomhedsnøgle
CORPORATE_KEY_REQUIRED (403)Tjenesten kræver en virksomhedsnøgle; der blev brugt en sælgernøgle
SANDBOX_READ_ONLY (403)En sandbox-nøgle kan ikke ændre ordrer, returneringer og fakturaer; katalogforespørgsler valideres kun
IP_NOT_ALLOWED (403)IP er ikke på allowlisten
VALIDATION_FAILED (422)Ugyldigt body-skema
PAYLOAD_TOO_LARGE (413)Postgrænsen er overskredet
QUEUE_BUSY (429)Grænsen for ventende batches er overskredet; se headeren Retry-After
RATE_LIMITED (429)Anmodningshastigheden er overskredet
NOT_FOUND (404)Post ikke fundet
STORAGE_UNAVAILABLE (503)Lageret er midlertidigt utilgængeligt

Postkoder (batchfejlrapport)

SOURCEID_REQUIREDsourceId er tom
NAME_REQUIREDNavn mangler for aktivt produkt
PRICE_NEGATIVE, STOCK_NEGATIVENegativ eller ikke-numerisk værdi
CURRENCY_INVALIDValutaen er ikke TRY, USD eller EUR
STATUS_INVALIDstatus er ikke 0 eller 1
UNKNOWN_SOURCEIDProduktet er ikke defineret
INVALID_JSONLinjen er ikke gyldig JSON
OEM_TOO_SHORT (advarsel)Nummer kortere end tre tegn sprunget over
WAREHOUSE_STOCK_MISMATCH (advarsel)Lagertotal brugt
DUPLICATE_SOURCEID (advarsel)Sidste post brugt

Grænser

  • Produkter: 1.000 poster pr. anmodning. Lager og priser: 5.000 poster pr. anmodning. Body: 6 MB.
  • Anmodningshastighed: 600 anmodninger pr. minut pr. nøgle. Derover 429.
  • Ventende batches: 10 pr. sælger. Derover 429.
  • Fil: ingen postgrænse, højst 2 GB (gzip).
  • Upload-URL’en er gyldig i 15 minutter.

Anmodningslog

GET /v1/logs/requests viser anmodningerne fra de sidste 30 dage: endpoint, status, varighed, requestId, batchId.

Reference