Accedi Prenota una demo

Sviluppatori

API sui dati dei veicoli. Costruite su 35 anni di ispezioni automotive.

La piattaforma B.U.S. mette a disposizione API per valutazioni di veicoli, rapporti di condizione e intelligenza sul veicolo basata su AI. Sandbox aperta con dati di test e documentazione OpenAPI per gli endpoint REST. Contattaci e ti inviamo le credenziali di accesso. Inizia a sviluppare in pochi minuti, non in settimane.

Sviluppo in B.U.S.

Inizia in tre passaggi

  1. Scopri cosa è disponibile

    Il catalogo delle API mostra gli endpoint disponibili con documentazione, schemi ed esempi funzionanti.

  2. Sviluppa in sandbox

    Ambiente sandbox aperto con dati di test reali. Contattaci e ti inviamo nome utente, password e chiave API per provare. Non costa nulla.

  3. Passa in produzione

    Quando sei pronto, scrivi a support@bus.no indicando i dati della tua azienda, l’uso previsto dell’API e il volume atteso. L’approvazione richiede due giorni lavorativi. Verifichiamo la configurazione e ti consegniamo le chiavi di produzione.

Catalogo delle API

GraphQL. Difetti previsti per un veicolo

Oscar Inspector, la via d’accesso più rapida

Difetti previsti ed esigenze di manutenzione in base a marca, modello e chilometraggio. Costruito su oltre 20 milioni di ispezioni reali. Una query, una risposta, e hai l’intelligenza sul veicolo basata su AI nel tuo prodotto. È l’API da cui iniziano la maggior parte dei partner. La usano le assicurazioni per la valutazione del rischio, i marketplace per arricchire gli annunci, le società di leasing per la manutenzione della flotta e i gestionali delle officine per avere informazioni prima della visita.

PKK. Revisione periodica del veicolo

Esiti della revisione, codici di difetto, storico e stato della controrevisione. La base dati copre il 75 % del mercato norvegese.

Test. Dati di valutazione e di condizione

Valutazioni dei danni, costi di riparazione, prezzi dei ricambi e rapporti di condizione completi. Usalo per l’integrazione con il supporto vendite, la valutazione delle garanzie, i modelli di prezzo o ovunque servano dati strutturati sulle condizioni del veicolo.

Scopri tutti i metodi dell’API Test

Assicurazione qualità

Controllo interno, gestione delle deviazioni, controllo delle attrezzature e tarature. Rilevante per conformità e audit.

Altre API

Il catalogo è in crescita.

Oscar Inspector API

Previsioni dei difetti basate sull’IA per un veicolo. Stessa autenticazione dell’API Test: usa applicationId 5 quando ottieni un token con token_ApplyToken2. Oscar Inspector ha un endpoint e uno schema propri, separati dall’API Test. Gli esempi mostrano la query; la risposta dipende dal veicolo.

Autenticazione

Ogni chiamata invia due header: Authorization: Bearer <accessToken> e x-api-key: <apiKey>. La chiave API è una chiave separata e di lunga durata che ricevi da noi. Le chiavi sandbox si ottengono contattandoci. Qui ottieni e rinnovi i token.

La sandbox richiede l’accesso. Contattaci per ottenere contenuti di test.

Tipo di API GraphQL
Staging https://test.bus.no/BUSPlatform3/SecurityPortal/BUS.APIs.GraphQLServer.P3.SecurityPortal.Endpoint1
Produzione https://bus2.bus.no/BUSPlatform3/SecurityPortal/BUS.APIs.GraphQLServer.P3.SecurityPortal.Endpoint1
Query token_ApplyToken2 Ottiene un id token, un access token e un refresh token per un utente e un’applicazione.

Parametri

username: String!
password: String!
apiKey: String!
applicationId: Int!

Risposta

idToken: String
accessToken: String
refreshToken: String

Note

  • Oscar Inspector richiede applicationId 5. L’API Test usa un applicationId diverso.
  • accessToken è valido per 60 minuti. refreshToken è valido per 90 giorni.
  • Per rinnovare: usa token_RefreshToken con refreshToken. Non chiamare token_ApplyToken2 di nuovo a ogni scadenza.
  • Se refreshToken è scaduto, devi ottenere un set completamente nuovo con token_ApplyToken2.

Esempio

query {
  token_ApplyToken2(
    username: ""
    password: ""
    apiKey: ""
    applicationId: 5
  ) {
    idToken
    accessToken
    refreshToken
  }
}

Risposta di esempio

{
  "data": {
    "token_ApplyToken2": {
      "idToken": "",
      "accessToken": "",
      "refreshToken": ""
    }
  }
}
Query token_RefreshToken Rinnova i token con un refresh token, senza accedere di nuovo.

Parametri

apiKey: String!
applicationId: Int!
refreshToken: String!

Risposta

idToken: String
accessToken: String
refreshToken: String

Note

  • accessToken è valido per 60 minuti. refreshToken è valido per 90 giorni.
  • Se refreshToken è scaduto, devi ottenere un set completamente nuovo con token_ApplyToken2.

Esempio

query {
  token_RefreshToken(
    apiKey: "",
    applicationId: 5,
    refreshToken: ""
    ){
      idToken
      accessToken
      refreshToken
    }
}

Risposta di esempio

{
  "data": {
    "token_RefreshToken": {
      "idToken": "",
      "accessToken": "",
      "refreshToken": ""
    }
  }
}

Previsione dei difetti

Difetti e necessità di manutenzione previsti in base a targa e chilometraggio.

La sandbox richiede l’accesso. Contattaci per ottenere contenuti di test.

Tipo di API GraphQL
Staging https://test.bus.no/BUSPlatform3/BUSDataPortal/BUS.APIs.GraphQLServer.P3.BUSDataPortal.ExternalEndpoint1
Produzione https://bus2.bus.no/BUSPlatform3/BUSDataPortal/BUS.APIs.GraphQLServer.P3.BUSDataPortal.ExternalEndpoint1
Query busData_GetDefectPredictions Restituisce i difetti previsti per un veicolo, con probabilità e spiegazione per ciascun difetto.

Parametri

requestId: String?
regNo: String
mileage: Int!
valuationId: Int?
inspectionId: Int?
language: String?
isMileageSuggestion: Boolean!
windowSize: Int!
refNo: String?

Risposta

result: DefectPredictionOutput

Note

  • Il requestId della risposta viene usato come originalRequestId in busData_RecordUserFeedback.

Esempio

query {
  busData_GetDefectPredictions(
    requestId: "8ef2a2d7-4373-4f93-b57e-d151a192edad"
    regNo: "CF66983"
    mileage: 50000
  ) {
    requestId
    noOfPredictions
    defectPredictions {
      checkpointTypeGroupId
      checkpointTypeGroup
      probability
    }
    errorCodes
  }
}

Risposta di esempio

{
  "data": {
    "busData_GetDefectPredictions": {
      "requestId": "8ef2a2d7-4373-4f93-b57e-d151a192edad",
      "noOfPredictions": 10,
      "defectPredictions": [
        {
          "checkpointTypeGroupId": 1061,
          "checkpointTypeGroup": "Bremsetromler, bremseskiver: Trommel eller skive har for stor slitasje, med synlige-/for store riper eller sprekker, ikke tilstrekkelig festet eller brukket",
          "probability": 11.320754716981131
        }
      ],
      "errorCodes": null
    }
  }
}

Riscontro

Indica se la previsione era corretta e recupera i motivi disponibili.

La sandbox richiede l’accesso. Contattaci per ottenere contenuti di test.

Tipo di API GraphQL
Staging https://test.bus.no/BUSPlatform3/BUSDataPortal/BUS.APIs.GraphQLServer.P3.BUSDataPortal.ExternalEndpoint1
Produzione https://bus2.bus.no/BUSPlatform3/BUSDataPortal/BUS.APIs.GraphQLServer.P3.BUSDataPortal.ExternalEndpoint1
Query busData_GetUserFeedbackReasons Elenca i motivi che un utente può indicare quando una previsione non era corretta.

Parametri

requestId: String?

Risposta

result: UserFeedbackReasonOutput

Note

  • userFeedbackReasonId viene usato come valore in userFeedbackReasons su busData_RecordUserFeedback.

Esempio

query {
  busData_GetUserFeedbackReasons(requestId: "4c84c8db-3f1f-427c-b2ad-f00725f430b9") {
    requestId
    userFeedbackReasons {
      userFeedbackReasonId
      displayString
      userFeedbackReasonType
    }
    errorCodes
  }
}

Risposta di esempio

{
  "data": {
    "busData_GetUserFeedbackReasons": {
      "requestId": "4c84c8db-3f1f-427c-b2ad-f00725f430b9",
      "userFeedbackReasons": [
        {
          "userFeedbackReasonId": 2000,
          "displayString": "Tidsbesparende",
          "userFeedbackReasonType": 1
        },
        {
          "userFeedbackReasonId": 2001,
          "displayString": "Høy treffsikkerhet",
          "userFeedbackReasonType": 1
        }
      ],
      "errorCodes": null
    }
  }
}
Mutation busData_RecordUserFeedback Registra un riscontro su una previsione precedente.

Parametri

requestId: String?
originalRequestId: String?
isSatisfied: Boolean!
timeTakenForFeedback: Int!
userId: Int!
username: String?
organizationId: Int!
organizationName: String?
userFeedbackReasons: [Int]
time: DateTime?

Risposta

result: RecordUserFeedbackOutput

Esempio

mutation {
  busData_RecordUserFeedback(
    requestId: "1e692aa0-5a9b-400f-beef-7a53e27d26a2"
    originalRequestId: "8ef2a2d7-4373-4f93-b57e-d151a192edad"
    isSatisfied: true
    organizationId: 1
    organizationName: "unit 1"
    timeTakenForFeedback: 3000
    userId: 2
    username: "Nuwan"
    userFeedbackReasons: [2, 3]
  ) {
    requestId
    errorCodes
  }
}

Risposta di esempio

{
  "data": {
    "busData_RecordUserFeedback": {
      "requestId": "1e692aa0-5a9b-400f-beef-7a53e27d26a2",
      "errorCodes": null
    }
  }
}

Modelli di dati

I tipi usati nei parametri e nelle risposte.

DefectPredictionOutput
RequestId: String
NoOfPredictions: Int
DefectPredictions: [DefectPrediction]
MileageSuggestions: [Int]
ErrorCodes: [Int]
TimeElapsed: Decimal
DefectPrediction
CheckpointTypeGroupId: Int
CheckpointTypeGroup: String?
CheckPointTypeGroupDescription: String?
Probability: Decimal
Explanation: String?
ConfidenceThreshold: Decimal
Function: String?
WindowSize: Int
UserFeedbackReasonOutput
RequestId: String
UserFeedbackReasons: [UserFeedbackReason]
ErrorCodes: [Int]
UserFeedbackReason
UserFeedbackReasonId: Int
DisplayString: String?
UserFeedbackReasonType: Int
RecordUserFeedbackOutput
RequestId: String
ErrorCodes: [Int]

Riferimento API. Test, valutazione e rapporto di condizione

Tutti i metodi dell’API Test, raggruppati per utilizzo. Apri un metodo per vedere i suoi parametri, la risposta e un esempio che puoi eseguire.

Autenticazione

Ogni chiamata invia due header: Authorization: Bearer <accessToken> e x-api-key: <apiKey>. La chiave API è una chiave separata e di lunga durata che ricevi da noi. Le chiavi sandbox si ottengono contattandoci. Qui ottieni e rinnovi i token.

La sandbox richiede l’accesso. Contattaci per ottenere contenuti di test.

Tipo di API GraphQL
Staging https://test.bus.no/BUSPlatform3/SecurityPortal/BUS.APIs.GraphQLServer.P3.SecurityPortal.Endpoint1
Produzione https://bus2.bus.no/BUSPlatform3/SecurityPortal/BUS.APIs.GraphQLServer.P3.SecurityPortal.Endpoint1
Query token_ApplyToken2 Ottiene un id token, un access token e un refresh token per un utente e un’applicazione.

Parametri

username: String!
password: String!
apiKey: String!
applicationId: Int!

Risposta

idToken: String
accessToken: String
refreshToken: String

Note

  • accessToken è valido per 60 minuti. refreshToken è valido per 90 giorni.
  • Per rinnovare: usa token_RefreshToken con refreshToken. Non chiamare token_ApplyToken2 di nuovo a ogni scadenza.
  • Se refreshToken è scaduto, devi ottenere un set completamente nuovo con token_ApplyToken2.

Esempio

query {
  token_ApplyToken2(
    username: ""
    password: ""
    apiKey: ""
    applicationId: 13
  ) {
    idToken
    accessToken
    refreshToken
  }
}

Risposta di esempio

{
  "data": {
    "token_ApplyToken2": {
      "idToken": "",
      "accessToken": "",
      "refreshToken": ""
    }
  }
}
Query token_RefreshToken Rinnova i token con un refresh token, senza accedere di nuovo.

Parametri

apiKey: String!
applicationId: Int!
refreshToken: String!

Risposta

idToken: String
accessToken: String
refreshToken: String

Note

  • accessToken è valido per 60 minuti. refreshToken è valido per 90 giorni.
  • Se refreshToken è scaduto, devi ottenere un set completamente nuovo con token_ApplyToken2.

Esempio

query {
  token_RefreshToken(
    apiKey: "",
    applicationId: 13,
    refreshToken: ""
    ){
      idToken
      accessToken
      refreshToken
    }
}

Risposta di esempio

{
  "data": {
    "token_RefreshToken": {
      "idToken": "",
      "accessToken": "",
      "refreshToken": ""
    }
  }
}

Valutazioni

Crea, leggi, aggiorna ed elenca le perizie, con i dati del veicolo, i dati di leasing e i report. Gli esempi sotto usano targhe e ID presenti nell’ambiente di test. Contattaci quando richiedi l’accesso di test e riceverai dati di test adatti al tuo account.

La sandbox richiede l’accesso. Contattaci per ottenere contenuti di test.

Tipo di API GraphQL
Staging https://test.bus.no/BUSPlatform3/BUSTest.Server/BUS.APIs.GraphQLServer.P3.BUSTest.ExternalEndpoint1
Produzione https://bus2.bus.no/BUSPlatform3/BUSTest.Server/BUS.APIs.GraphQLServer.P3.BUSTest.ExternalEndpoint1
Mutation Test_CreateTest Crea una nuova valutazione per un veicolo. Restituisce l’id della valutazione.

Parametri

vehicleDataModel: VehicleDataModel!
testDataModel: TestDataModel!

Obbligatorio

  • testTypeIds
  • unitId
  • regNo / vin

Risposta

result: Int

Esempio

mutation{
  test_CreateTest(testDataModel:  {
    testTypeIds: [ 3 ],
    unitId: 1,
    externalReferenceId: "454532",
    mileage: 45000,
    testAnnotations: ["Fleet"]
    serviceData: [ {
       mileage: 2000,
       date: "2022-04-05"
    },
    {
       mileage: 10000,
       date: "2023-06-23"
    }],
    testComments: ["This is comment 1", "This is comment 2"],
    testOrderedBy: "FirstName LastName"
  },
  vehicleDataModel:  {
    regNo: "",
    vin: "YV1DZARCDH2231635",
    trimLevel: "M Sport",
    vehiclePackages: [ {
       packageName: "Comfort package",
       vehicleOptions: [ {
          optionName: "Dragkrok, elektrisk",
          includedItems: "Stabilitetsprogram släp\nVikter: totalvikt (kg): 3 500"
       }]
    }],
    vehicleOptions: [ {
        optionName: "Adaptiva LED strålkastare",
        includedItems: "Kurvljus\nLED-detaljljus"
    }]
  }
  )
}

Risposta di esempio

{
  "data": {
    "test_CreateTest": 54
  }
}
Mutation testData_CreateLeaseData Aggiunge i dati di leasing a una valutazione: tipo di prodotto, prezzo di acquisto, riferimento del contratto e altro.

Parametri

testId: Int!
leaseDataModel: LeaseDataModel!

Risposta

result: Boolean

Esempio

mutation{
  testData_CreateLeaseData(testId: 21, leaseDataModel:  {
     productType: "Full Service Leasing (FSL-SE)",
     purchasePrice: 23.50,
     quotationTemplate: "Release plus commercial",
     repairMaintenance: "Included",
     transportDate: "2025-01-21",
     winterTyres: "Not Included",
     contractReference: "777777"
  }
  )
}

Risposta di esempio

{
  "data": {
    "testData_CreateLeaseData": true
  }
}
Mutation testData_CreateLeaseUserData Aggiunge il cliente di leasing e i contatti a una valutazione: fleet manager, conducente e altro.

Parametri

testId: Int!
leaseUserDataModel: LeaseUserDataModel!

Risposta

result: Boolean

Esempio

mutation{
  testData_CreateLeaseUserData(testId: 21, leaseUserDataModel:  {
    customerId: "500000",
    customerName: "customer",
    fleetManagerName: "fleet manager",
    fleetManagerEmail: "fleetManager@test.com",
    installationRecipientEmail: "installationRecipient@test.com",
    kamName: "KAM Name",
    kamEmail: "kam@test.com",
    driverName: "driver",
    driverPhone: "944998989",
    driverEmail: "driver@test.com"
  }
  )
}

Risposta di esempio

{
  "data": {
    "testData_CreateLeaseUserData": true
  }
}
Query Test_GetTest Ottiene una valutazione con il suo stato, il chilometraggio e lo storico degli interventi di manutenzione.

Parametri

testId: Int!

Risposta

result: TestDataModel

Note

  • I campi di testo localizzati come testStatus e i nomi dei punti di controllo vengono restituiti nella cultura del chiamante. La cultura proviene dal claim culture del token, con fallback su Accept-Language. L’esempio è stato catturato con la cultura svedese.

Esempio

query{
  test_GetTest(testId: 32685)
  {
    testId,
    externalReferenceId,
    mileage,
    serviceData {
      date,
      mileage,
      comment
    },
    unitId,
    testTypeIds,
    testStatus,
    testComments
  }
}

Risposta di esempio

{
  "data": {
    "test_GetTest": {
      "testId": 59,
      "externalReferenceId": "45678",
      "mileage": 45000,
      "serviceData": [
        {
          "date": "2022-04-04T18:30:00.000Z",
          "mileage": 2000,
          "comment": null
        },
        {
          "date": "2023-06-22T18:30:00.000Z",
          "mileage": 10000,
          "comment": null
        }
      ],
      "unitId": 1,
      "testTypeIds": [
        2
      ],
      "testStatus": "Test påbörjad",
      "testComments": []
    }
  }
}
Query Test_GetTestFiles Ottiene le immagini e i file che appartengono a una valutazione.

Parametri

testId: Int!

Risposta

result: [TestFileModel]

Esempio

query{
  test_GetTestFiles(testId: 32685)
  {
    fileUrl,
    fileName,
    testSectionId,
    mediaId
  }
}

Risposta di esempio

{
  "data": {
    "test_GetTestFiles": [
      {
        "fileUrl": "https://…/fil.jpg?sv=…&sig=…",
        "fileName": "image (9).jpg",
        "testSectionId": 6,
        "mediaId": "CD......"
      },
      {
        "fileUrl": "https://…/fil.jpg?sv=…&sig=…",
        "fileName": "image (10).jpg",
        "testSectionId": 6,
        "mediaId": "CD......"
      },
      {
        "fileUrl": "https://…/fil.jpg?sv=…&sig=…",
        "fileName": "image (17).jpg",
        "testSectionId": 1,
        "mediaId": "CD......"
      }
    ]
  }
}
Query TestData_GetVehicleData Ottiene i dati del veicolo: targa, VIN, optional e pacchetti.

Parametri

testId: Int!

Risposta

result: VehicleDataModel

Esempio

query{
  testData_GetVehicleData(testId: 59)
  {
    regNo,
    vin,
    trimLevel,
    vehicleOptions {
      optionName,
      includedItems,
      isSelected
    },
    vehiclePackages {
      packageName,
      isSelected,
      vehicleOptions {
        optionName,
        includedItems,
        isSelected
      }
    }
    color,
    model,
    make,
    gearBox,
    engine,
    inspectionDueDate,
    lastInspectedDate
  }
}

Risposta di esempio

{
  "data": {
    "testData_GetVehicleData": {
      "regNo": "YSA053",
      "vin": "YV1DZARCDH2231635",
      "trimLevel": "M Sport",
      "vehicleOptions": [
        {
          "optionName": "Adaptiva LED strålkastare",
          "includedItems": "Kurvljus\nLED-detaljljus",
          "isSelected": false
        }
      ],
      "vehiclePackages": [
        {
          "packageName": "Comfort package",
          "isSelected": false,
          "vehicleOptions": [
            {
              "optionName": "Dragkrok, elektrisk",
              "includedItems": "Stabilitetsprogram släp\nVikter: totalvikt (kg): 3 500",
              "isSelected": false
            }
          ]
        }
      ],
      "color": "Svart",
      "model": "XC60",
      "make": "Volvo",
      "gearBox": "Automat",
      "engine": "2.0 D3 D4204T9 (110 kW)",
      "inspectionDueDate": "2027-07-30T22:00:00.000Z",
      "lastInspectedDate": "2025-07-21T22:00:00.000Z"
    }
  }
}
Query testData_GetLeaseData Ottiene i dati di leasing di una valutazione.

Parametri

testId: Int!

Risposta

result: LeaseDataModel

Esempio

query{
  testData_GetLeaseData(testId: 21) {
     productType
     purchasePrice
     quotationTemplate
     repairMaintenance
     transportDate
     winterTyres
  }
}

Risposta di esempio

{
  "data": {
    "testData_GetLeaseData": {
      "productType": null,
      "purchasePrice": null,
      "quotationTemplate": null,
      "repairMaintenance": null,
      "transportDate": null,
      "winterTires": null
    }
  }
}
Query testData_GetLeaseUserData Ottiene il cliente di leasing e i contatti di una valutazione.

Parametri

testId: Int!

Risposta

result: LeaseUserDataModel

Esempio

query{
  testData_GetLeaseUserData(testId: 21) {
    customerId
    customerName
    fleetManagerName
    fleetManagerEmail
    installationRecipientEmail
    kamName
    kamEmail
    driverName
    driverPhone
    driverEmail
  }
}

Risposta di esempio

{
  "data": {
    "testData_GetLeaseUserData": {
      "customerId": null,
      "customerName": null,
      "fleetManagerName": null,
      "fleetManagerEmail": null,
      "installationRecipientEmail": null,
      "kamName": null,
      "kamEmail": null,
      "driverName": null,
      "driverPhone": null,
      "driverEmail": null
    }
  }
}
Query Unit_GetAccessibleUnits Elenca le unità a cui hai accesso.

Risposta

result: [UnitModel]

Esempio

query{
  unit_GetAccessibleUnits
  {
    unitId
    unitName
  }
}

Risposta di esempio

{
  "data": {
    "unit_GetAccessibleUnits": [
      {
        "unitId": 1,
        "unitName": "Test unit"
      }
    ]
  }
}
Query TestType_GetTestTypes Elenca i tipi di valutazione disponibili per un’unità.

Parametri

unitId: Int!
vin: String

Risposta

result: [TestTypeModel]

Esempio

query{
  testType_GetTestTypes(unitId: 1)
  {
    testTypeId,
    testTypeName,
    isActive
  }
}

Risposta di esempio

{
  "data": {
    "testType_GetTestTypes": [
      {
        "testTypeId": 1,
        "testTypeName": "Test med kostnader",
        "isActive": true
      },
      {
        "testTypeId": 2,
        "testTypeName": "Test utan kostnader",
        "isActive": true
      },
      {
        "testTypeId": 3,
        "testTypeName": "Värdering av onormal slitage",
        "isActive": true
      },
      {
        "testTypeId": 770,
        "testTypeName": "Custom 1",
        "isActive": false
      }
    ]
  }
}
Mutation test_UpdateTest Aggiorna una valutazione esistente.

Parametri

testDataModel: TestDataModel!

Obbligatorio

  • testDataModel.testId

Risposta

result: TestDataModel

Esempio

mutation {
  test_UpdateTest(testDataModel:  {
    testId: 625,
    mileage: 60000
  }) {
    testId,
    mileage
  }
}

Risposta di esempio

SalesReport_CreateSalesReportFromSource
Query Test_GetAllTests Un elenco ricercabile e ordinabile di tutte le valutazioni, con filtri e paginazione.

Parametri

searchTerm: String
sortBy: GridSort
filters: TestFilterModel
skip: Int?
take: Int?
timeZoneOffset: Int?

Risposta

result: TestListModel

Note

  • La pagina è paginata con skip e take. Il take predefinito è 50 e lo skip predefinito è 0. Non c’è un limite massimo.
  • Campi ordinabili: regno, vehicleMake, vehicleModel, vin, completedDate, createdDate, performedDate, performedBy, testTypes, isObdPerformed, testStatus, testAnnotations.
  • searchTerm corrisponde solo se il testo inizia con RegNo o TestAnnotations.
  • timeZoneOffset viene inviato in minuti ed è la differenza tra ora UTC e ora del client (UTC − ora del client). Se l’ora svedese è +1 GMT, invia -1 per ottenere il giorno corretto.

Esempio

query {
  test_GetAllTests(searchTerm: "YSA053") {
            tests {
                testId
                regno
                vehicleMake
                vehicleModel
                vin
                createdDate
                performedDate
                completedDate
                performedBy
                testTypes
                isObdPerformed
                testStatus
                testAnnotations
                unitId
                unitName
            }
            totalTests
        }
    }
Query Test_GetActiveTests Come sopra, ma solo le valutazioni in corso.

Parametri

searchTerm: String
sortBy: GridSort
filters: TestFilterModel
skip: Int?
take: Int?
timeZoneOffset: Int?

Risposta

result: TestListModel

Note

  • La pagina è paginata con skip e take. Il take predefinito è 50 e lo skip predefinito è 0. Non c’è un limite massimo.
  • Campi ordinabili: regno, vehicleMake, vehicleModel, vin, completedDate, createdDate, performedDate, performedBy, testTypes, isObdPerformed, testStatus, testAnnotations.
  • searchTerm corrisponde solo se il testo inizia con RegNo o TestAnnotations.
  • timeZoneOffset viene inviato in minuti ed è la differenza tra ora UTC e ora del client (UTC − ora del client). Se l’ora svedese è +1 GMT, invia -1 per ottenere il giorno corretto.

Esempio

query {
  test_GetActiveTests(searchTerm: "YSA053") {
            tests {
                testId
                regno
                vehicleMake
                vehicleModel
                vin
                createdDate
                performedDate
                completedDate
                performedBy
                testTypes
                isObdPerformed
                testStatus
                testAnnotations
                unitId
                unitName
            }
            totalTests
        }
    }
Query Test_GetTestReports Ottiene i link ai rapporti di condizione di una valutazione, incluso il PDF.

Parametri

testId: Int!

Obbligatorio

  • int testId

Risposta

result: [ReportModel]

Esempio

query {
        test_GetTestReports(testId: 33081) {
            testTypeId
            testType
            shortenedReportURL
            shortenedPdfReportURL
        }
    }

Risposta di esempio

{
  "data": {
    "test_GetTestReports": [
      {
        "testTypeId": 2,
        "testType": "Test utan kostnader",
        "shortenedReportURL": "https://lnkt.bus.no/8049d5ll2"
        "shortenedPdfReportURL": "https://lnkt.bus.no/41181Ruhpp"
      }
    ]
  }
}
Query test_GetGeneralInfo Ottiene le informazioni generali sul veicolo: chiavi, cavo di ricarica, uso precedente e altro.

Parametri

testId: Int!

Risposta

result: GeneralInfoModel

Note

  • Leggi i valori correnti prima di aggiornare. test_GetGeneralInfoMetaData fornisce i valori chiave predefiniti.

Esempio

query {
  test_GetGeneralInfo(testId: 46324) {
    masterKeyCount
    chargingCableCount
    previousUseId
    hasPreviousDamage
    vehicleKeyTypes { key value }
    chargingCableTypes { key value }
  }
}

Risposta di esempio

{ "data": { "test_GetGeneralInfo": { "masterKeyCount": 2, "chargingCableCount": 1, "previousUseId": 3, "hasPreviousDamage": false, "vehicleKeyTypes": [ { "key": 1, "value": "Remote key" } ], "chargingCableTypes": [] } } }
Mutation test_UpdateGeneralInfo Aggiorna le informazioni generali sul veicolo.

Parametri

testId: Int!
generalInfoModel: GeneralInfoModel!

Risposta

result: Boolean

Note

  • Leggi, modifica, scrivi: invia il modello completo. Le liste vuote per vehicleKeyTypes o chargingCableTypes vengono rifiutate; una lista vuota elimina i tipi esistenti.

Esempio

mutation {
  test_UpdateGeneralInfo(testId: 46324, generalInfoModel: {
    masterKeyCount: 2,
    chargingCableCount: 1,
    previousUseId: 3,
    hasPreviousDamage: false,
    vehicleKeyTypes: [{ key: 1, value: "Remote key" }],
    chargingCableTypes: [{ key: 1, value: "Type 2" }]
  })
}

Risposta di esempio

{ 
"data": 
    { 
        "test_UpdateGeneralInfo": true
    }
 }

Rapporti di vendita

Rapporti di vendita creati a partire dalle valutazioni, con link di condivisione e conclusione.

La sandbox richiede l’accesso. Contattaci per ottenere contenuti di test.

Tipo di API GraphQL
Staging https://test.bus.no/BUSPlatform3/BUSTest.Server/BUS.APIs.GraphQLServer.P3.BUSTest.ExternalEndpoint1
Produzione https://bus2.bus.no/BUSPlatform3/BUSTest.Server/BUS.APIs.GraphQLServer.P3.BUSTest.ExternalEndpoint1
Mutation SalesReport_CreateSalesReportFromSource Crea un rapporto di vendita da una valutazione esistente o da un veicolo.

Parametri

regNo: String!
testRunId: Int?
unitId: Int?

Obbligatorio

  • string regNo
  • int testRunId or int unitId

Risposta

result: Int

Esempio

mutation {
      salesReport_CreateSalesReportFromSource(regNo: "ØSXXR01", unitId: 5147)
  }

Risposta di esempio

{
  "data": {
    "salesReport_CreateSalesReportFromSource": 764
  }
}
Query SalesReport_GetSalesReportShareMetaData Ottiene i link di condivisione del rapporto di vendita e del rapporto VDN, e il download del PDF.

Parametri

salesReportId: Int!

Obbligatorio

  • int salesReportId

Note

  • salesReportPdfDownloadSasUrl è disponibile solo per i partner esterni.

Esempio

query {
  salesReport_GetSalesReportShareMetaData(salesReportId: 764) {
    shortenedSalesReportLinkURL
    shortenedVDNReportLinkURL
    shortenedSalesReportPdfURL
    salesReportPdfDownloadSasUrl
  }
}

Risposta di esempio

{
  "data": {
    "salesReport_GetSalesReportShareMetaData": {
      "shortenedSalesReportLinkURL": "https://lnkt.bus.no/47430y13WA",
      "shortenedVDNReportLinkURL": "https://lnkt.bus.no/47431z3f1_",
      "shortenedSalesReportPdfURL": "https://lnkt.bus.no/47432iCS5k",
      "salesReportPdfDownloadSasUrl": "https://…/fil.jpg?sv=…&sig=…"
    }
  }
}
Query SalesReport_GetAllSalesReports Un elenco ricercabile e ordinabile di tutti i rapporti di vendita.

Parametri

searchTerm: String
sortBy: GridSort
filters: SalesReportFilterModel
skip: Int?
take: Int?
timeZoneOffset: Int?

Risposta

result: SalesReportListModel

Note

  • La pagina è paginata con skip e take. Il take predefinito è 50 e lo skip predefinito è 0. Non c’è un limite massimo.
  • Campi ordinabili: regno, vehicleMake, vehicleModel, vin, completedDate, salesReportStatus, createdDate, performedBy
  • searchTerm corrisponde solo se il testo inizia con RegNo.
  • timeZoneOffset viene inviato in minuti ed è la differenza tra ora UTC e ora del client (UTC − ora del client). Se l’ora svedese è +1 GMT, invia -1 per ottenere il giorno corretto.

Esempio

query {
  salesReport_GetAllSalesReports(searchTerm: "WBS99A") {
            salesReports {
                salesReportId
                salesReportStatus
                salesReportStatusId
                regno
                vehicleMake
                vehicleModel
                vin
                createdDate
                completedDate
            }
            totalSalesReports
        }
    }
Query SalesReport_GetActiveSalesReports Come sopra, ma solo i rapporti di vendita attivi.

Parametri

searchTerm: String
sortBy: GridSort
filters: SalesReportFilterModel
skip: Int?
take: Int?
timeZoneOffset: Int?

Risposta

result: SalesReportListModel

Note

  • La pagina è paginata con skip e take. Il take predefinito è 50 e lo skip predefinito è 0. Non c’è un limite massimo.
  • Campi ordinabili: regno, vehicleMake, vehicleModel, vin, completedDate, salesReportStatus, createdDate, performedBy
  • searchTerm corrisponde solo se il testo inizia con RegNo.
  • timeZoneOffset viene inviato in minuti ed è la differenza tra ora UTC e ora del client (UTC − ora del client). Se l’ora svedese è +1 GMT, invia -1 per ottenere il giorno corretto.

Esempio

query {
  salesReport_GetActiveSalesReports(searchTerm: "WBS99A") {
            salesReports {
                salesReportId
                salesReportStatus
                salesReportStatusId
                regno
                vehicleMake
                vehicleModel
                vin
                createdDate
                completedDate
            }
            totalSalesReports
        }
    }
Mutation SalesReport_UpdateSalesReport Aggiorna un rapporto di vendita.

Parametri

salesReportData: SalesReportDataModel!

Obbligatorio

  • salesReportData.SalesReportId
  • salesReportData.TestId
  • salesReportData.UnitId

Risposta

result: SalesReportDataModel

Esempio

mutation UpdateSalesReport($salesReportData: SalesReportDataModelInput!) {
  updatedSalesReport: salesReport_UpdateSalesReport(
    salesReportData: $salesReportData
  ) {
    testId
    mileage
    createdDate
    completedDate
    salesReportTypeIds
    deviationNotes
    hasBatteryReading
    testStatusId
    unitId
    __typename
  }
}

Risposta di esempio

{
  "data": {
    "updatedSalesReport": {
      "testId": 45068,
      "mileage": 12345,
      "createdDate": "2026-07-08T07:55:42.303Z",
      "completedDate": null,
      "salesReportTypeIds": [
        1,
        2,
        3
      ],
      "deviationNotes": null,
      "hasBatteryReading": false,
      "testStatusId": 8,
      "unitId": 5161,
      "__typename": "SalesReportDataModel"
    }
  }
}
Mutation salesReport_ConcludeSalesReport Conclude un rapporto di vendita e lo invia via e-mail o SMS.

Parametri

salesReportConcludeModel: SalesReportConcludeModel!

Obbligatorio

  • salesReportConcludeModel.salesReportId
  • salesReportConcludeModel.sendSalesReportEmailSMSModel

Risposta

result: Boolean

Note

  • sendSalesReportEmailSMSModel è obbligatorio e i link di condivisione generati vengono salvati su di esso. Liste vuote per e-mail, numeri e tipi di report non inviano nulla. I destinatari configurati a livello di unità vengono aggiunti alla conclusione. I difetti aperti non bloccano la conclusione.

Esempio

mutation {
  salesReport_ConcludeSalesReport(salesReportConcludeModel: {
    salesReportId: 3180,
    sendSalesReportEmailSMSModel: {
      salesReportId: 3180,
      emails: [],
      numbers: [],
      salesReportTypes: []
    }
  })
}

Risposta di esempio

{ 
"data": 
           { 
                "salesReport_ConcludeSalesReport": true 
           }
 }
Mutation salesReport_AddSalesReportImages Aggiunge immagini a un rapporto di vendita, con un’immagine di copertina facoltativa.

Parametri

salesReportId: Int!
images: [SalesReportImageInputModel]!

Risposta

result: [SalesReportImageResultModel]

Esempio

mutation {
  salesReport_AddSalesReportImages (salesReportId: 3416,
  images: [ {
    isCover: false
    fileName: "354.jpg"
     url: "https://fastly.picsum.photos/id/471/536/354.jpg?hmac=ep1BMOqUf1L7RJA-pgAlrJFeXxAbxj7srUVwGoTiJGE"

  }])
  {
    fileName
    isSuccess
    reason
  }
}

Difetti e danni

Difetti e danni registrati in una valutazione, con le immagini.

La sandbox richiede l’accesso. Contattaci per ottenere contenuti di test.

Tipo di API GraphQL
Staging https://test.bus.no/BUSPlatform3/BUSTest.Server/BUS.APIs.GraphQLServer.P3.BUSTest.ExternalEndpoint1
Produzione https://bus2.bus.no/BUSPlatform3/BUSTest.Server/BUS.APIs.GraphQLServer.P3.BUSTest.ExternalEndpoint1
Query Defect_GetTestDefects Ottiene i difetti e i danni registrati in una valutazione.

Parametri

testId: Int!

Risposta

result: [TestDefectModel]

Note

  • TotalCost è al netto dell’IVA. L’interfaccia può mostrare l’importo IVA inclusa.

Esempio

query{
  defect_GetTestDefects(testId: 54)
  {
    testDefectId,
    checkpoint {
      key
      value
    }
    checkpointComment {
      key
      value
    }
    commonCost,
    workCost,
    partsCost,
    totalCost
  }
}

Risposta di esempio

{
  "data": {
    "defect_GetTestDefects": [
      {
        "testDefectId": 3444,
        "checkpoint": {
          "key": 2,
          "value": "Dokumentation utrustning - SW"
        },
        "checkpointComment": {
          "key": 9,
          "value": "testpunkten"
        },
        "commonCost": 100,
        "workCost": 60,
        "partsCost": 40,
        "totalCost": 200
      },
      {
        "checkpoint": {
          "key": 5,
          "value": "Registreringsskylt - SW"
        },
        "checkpointComment": {
          "key": 6,
          "value": "oläsbar"
        },
        "commonCost": 300,
        "workCost": 40,
        "partsCost": 30,
        "totalCost": 370
      }
    ]
  }
}
Query Defect_GetTestDefectFiles Ottiene le immagini e i file allegati ai difetti di una valutazione.

Parametri

testId: Int!

Risposta

result: [TestDefectFileModel]

Esempio

query{
  defect_GetTestDefectFiles(testId: 54)
  {
    testDefectId,
    testDefectFiles
    {
      fileUrl,
      fileName,
      mediaId
    }
  }
}

Risposta di esempio

{
  "data": {
    "defect_GetTestDefectFiles": [
      {
        "testDefectId": 320,
        "testDefectFiles": [
          {
            "fileUrl": https://dev.bus.no/busplatform3/RestAPIServers.FileServerCustom2/api/v1/File/GetFile?fileReference=CfDJ8EsheyHuiV5NuNJhGGxi8IXoncPhEgkimEBPt93Wv0WX_3ToA1zBeCaMvNsEJzD2-3CvE_hVeiyHpI4xg6ptP1jhDuKXHfBLQLcshyiaCEAJurCO5Grs5aCGN9RoQR38vX4jMsALbkHdcBWNhAaMKP1h7-I0l3pdRBmxOdrqYqdoQUyqExcUkS3z-vUsGTYqRH0 ,
            "fileName": "pexels_mike_bird_100653.jpg",
             "mediaId": "CD......"
          },
          {
            "fileUrl": https://dev.bus.no/busplatform3/RestAPIServers.FileServerCustom2/api/v1/File/GetFile?fileReference=CfDJ8EsheyHuiV5NuNJhGGxi8IVhMC9lQU7CYN_0177q1-fn1HgYQJnGAMqkLl9hBQurMaT4Ej6W45btBdwW0z-QEMIupfHvwSbixIiNJInMS4g4PmtVpvGw0MYIoH-hS_PRgcwUV6dEE1HmSFcNkydDbAKzgueyxbwBMMFnV6y0TG4tW2JGvK-fV1mvWQu7xdHaXx8 ,
            "fileName": "pexels_joshua_koller_757185.jpg",
            "mediaId": "CD......"
          }
        ]
      },
      {
        "testDefectId": 321,
        "testDefectFiles": []
      }
    ]
  }
}
Mutation Defect_UpdateTestDefect Aggiorna un difetto di una valutazione e del relativo rapporto di vendita.

Parametri

testId: Int!
defectFormData: TestDefectModel!

Risposta

result: TestDefectModel

Esempio

mutation updateTestDefect($testId: Int!, $defectFormData: TestDefectModelInput!) {
  updatedDefect: defect_UpdateTestDefect(
    testId: $testId
    defectFormData: $defectFormData
  ) {
    testDefectId
    checkpointInstanceId
    checkpointGroup {
      key
      value
      __typename
    }
    checkpoint {
      key
      value
      __typename
    }
    checkpointComment {
      key
      value
      __typename
    }
    actionsList {
      actionId
      name
      __typename
    }
    positionsList {
      positionId
      name
      __typename
    }
    totalCost
    isTaxIncluded
    testDefectComment
    salesReportDefectId
    swedishStateReportLetterReferenceId
    stateGradeId
    __typename
  }
}

Risposta di esempio

{
  "data": {
    "updatedDefect": {
      "testDefectId": 14276,
      "checkpointInstanceId": 285,
      "checkpointGroup": {
        "key": 1,
        "value": "Identifikation",
        "__typename": "KeyValueWithAdditionalItemOfNullableOfInt32"
      },
      "checkpoint": {
        "key": 59,
        "value": "Registreringsskylt",
        "__typename": "KeyValueModel"
      },
      "checkpointComment": {
        "key": 1,
        "value": "Skyltfäste",
        "__typename": "KeyValueModel"
      },
      "actionsList": [
        {
          "actionId": 6,
          "name": "Kontrollera",
          "__typename": "ActionModel"
        }
      ],
      "positionsList": [
        {
          "positionId": 2,
          "name": "Bak",
          "__typename": "PositionModel"
        }
      ],
      "totalCost": 66,
      "isTaxIncluded": true,
      "testDefectComment": "TEessserer",
      "salesReportDefectId": null,
      "swedishStateReportLetterReferenceId": null,
      "stateGradeId": 3,
      "__typename": "TestDefectModel"
    }
  }
}

Ordini di lavoro

Ordini di lavoro e lavorazioni per il flusso dell’officina.

La sandbox richiede l’accesso. Contattaci per ottenere contenuti di test.

Tipo di API GraphQL
Staging https://test.bus.no/BUSPlatform3/BUSTest.Server/BUS.APIs.GraphQLServer.P3.BUSTest.ExternalEndpoint1
Produzione https://bus2.bus.no/BUSPlatform3/BUSTest.Server/BUS.APIs.GraphQLServer.P3.BUSTest.ExternalEndpoint1
Mutation workOrder_CreateWorkOrder Crea un ordine di lavoro per un veicolo, con o senza una valutazione collegata.

Parametri

regNo: String!
testRunId: Int?!
unitId: Int!

Obbligatorio

  • testRunId (optional for standalone work order)

Risposta

result: Int

Note

  • Con testRunId la perizia deve essere conclusa e viene creata una lavorazione per difetto. Senza testRunId viene creato un ordine di lavoro autonomo.

Esempio

mutation {
  workOrder_CreateWorkOrder(regNo: "PHP526", testRunId: 45988, unitId: 5147)
}

Risposta di esempio

{ 
"data": 
     {
          "workOrder_CreateWorkOrder": 1773
     }
 }
Mutation workOrder_CreateWorkOrderJob Aggiunge una lavorazione a un ordine di lavoro.

Parametri

workOrderJobModel: WorkOrderJobModel!

Obbligatorio

  • workOrderJobModel (workOrderId and job details)

Risposta

result: WorkOrderJobModel

Esempio

mutation {
  workOrder_CreateWorkOrderJob(workOrderJobModel: {
    workOrderId: 1773,
    jobName: "Replace wiper blades",
    comment: "Added by partner"
  }) {
    workOrderJobId
    jobName
  }
}

Risposta di esempio

{ 
"data":
         { "workOrder_CreateWorkOrderJob": { 
                           "workOrderJobId": 28584, "jobName": "Replace wiper blades"
                   }
          }
 }
Mutation workOrder_AddStandardJobsToWorkOrderCycle Aggiunge lavorazioni standard a un ordine di lavoro.

Parametri

workOrderId: Int!
standardJobIds: [Int]!

Risposta

result: [WorkOrderJobModel]

Esempio

mutation {
  workOrder_AddStandardJobsToWorkOrderCycle(workOrderId: 1773, standardJobIds: [101, 205]) {
    workOrderJobId
    jobName
  }
}

Risposta di esempio

{ 
"data": 
            { "workOrder_AddStandardJobsToWorkOrderCycle":
                            [ { "workOrderJobId": 28585, "jobName": "Standard service" } ] 
            }
 }
Query workOrder_GetWorkOrderJobList Ottiene tutte le lavorazioni di un ordine di lavoro.

Parametri

workOrderId: Int!

Risposta

result: WorkOrderJobListModel

Note

  • workOrderJobStatus è un oggetto annidato. Usa gli identificativi di lavorazione ottenuti qui quando imposti lo stato.

Esempio

query {
  workOrder_GetWorkOrderJobList(workOrderId: 1773) {
    count
    workOrderJobs {
      workOrderJobId
      jobName
      workOrderJobStatus {
        workOrderJobStatusId
        workOrderJobStatusName
      }
      testDefect {
        testDefectId
      }
    }
  }
}

Risposta di esempio

{ 
"data":
                { "workOrder_GetWorkOrderJobList":
                                              { "count": 2, "workOrderJobs": [ 
                                                                  { "workOrderJobId": 28581, "jobName": "Defect job", "workOrderJobStatus": { "workOrderJobStatusId": 3,                             "workOrderJobStatusName": "Done" }, "testDefect": { "testDefectId": 3444 } } 
                                                             ]
                                                }
                  }
 }
Mutation workOrder_UpdateWorkOrderJobStatus Imposta un nuovo stato su una o più lavorazioni.

Parametri

workOrderId: Int!
workOrderJobIds: [Int]!
workOrderJobStatusId: Int!

Risposta

result: WorkOrderStatusUpdateResult

Note

  • Done appare come corretto nel report di vendita, Open come difetto ancora aperto. Lo stato dell’ordine di lavoro resta sincronizzato.

Esempio

mutation {
  workOrder_UpdateWorkOrderJobStatus(
    workOrderId: 1773,
    workOrderJobIds: [28581, 28582],
    workOrderJobStatusId: 3
  ) {
    workOrderStatusId
    workOrderStatusName
    updatedJobs {
      workOrderJobId
      workOrderJobStatusId
      workOrderJobStatusName
    }
  }
}

Risposta di esempio

{ "data": { "workOrder_UpdateWorkOrderJobStatus": { "workOrderStatusId": 2, "workOrderStatusName": "InProgress", "updatedJobs": [ { "workOrderJobId": 28581, "workOrderJobStatusId": 3, "workOrderJobStatusName": "Done" } ] } } }
Query workOrder_GetStandardJobsForWorkOrder Elenca le lavorazioni standard che possono essere associate a un ordine di lavoro.

Parametri

workOrderId: Int!

Risposta

result: [StandardJobModel]

Esempio

query{
  workOrder_GetStandardJobsForWorkOrder(
    workOrderId: 1832)
  {
    standardJobId
    jobName
    cost
    isTaxInclude
  }
}

Risposta di esempio

{
  "data": {
    "workOrder_GetStandardJobsForWorkOrder": [
      {
        "standardJobId": 723,
        "jobName": "Shenal standard - job",
        "cost": 800,
        "isTaxInclude": false
      }
    ]
  }
}
Query workOrderSettings_GetStandardJobsListForUnit Elenca le lavorazioni standard proprie dell’unità con il relativo costo.

Parametri

unitId: Int!

Risposta

result: StandardJobsGridModel

Esempio

query{
  workOrderSettings_GetStandardJobsListForUnit(unitId: 5208)
  {
    totalStandardJobs
    standardJobs {
      standardJobId
      jobName
      cost
    }
  }
}

Risposta di esempio

{
  "data": {
    "workOrderSettings_GetStandardJobsListForUnit": {
      "totalStandardJobs": 6,
      "standardJobs": [
        {
          "standardJobId": 775,
          "jobName": "DT",
          "cost": 434
        },
        {
          "standardJobId": 737,
          "jobName": "Group 2 only LT",
          "cost": 0
        },
        {
          "standardJobId": 736,
          "jobName": "Group 1,2 only LT",
          "cost": 0
        },
        {
          "standardJobId": 734,
          "jobName": "Group 2 only CT",
          "cost": 0
        },
        {
          "standardJobId": 732,
          "jobName": "Group 1,2 CT",
          "cost": 0
        },
        {
          "standardJobId": 456,
          "jobName": "Group 1,2,3",
          "cost": 0
        }
      ]
    }
  }
}
Query workOrder_GetTestRunsForWorkOrderCreation Elenca le esecuzioni di test che possono diventare un ordine di lavoro per una targa.

Parametri

regNo: String!
unitId: Int!

Esempio

query{
  workOrder_GetTestRunsForWorkOrderCreation(
    regNo: "AOL449"
    , unitId: 5147
    )
  {
    isRegNoValid
    items {
      testId
      testRunId
      mileage
    }
  }
}

Risposta di esempio

{
  "data": {
    "workOrder_GetTestRunsForWorkOrderCreation": {
      "isRegNoValid": true,
      "items": [
        {
          "testId": 3456,
          "testRunId": 46664,
          "mileage": 45000
        },
        {
          "testId": 3457,
          "testRunId": 46663,
          "mileage": 45000
        },
        {
          "testId": 3458,
          "testRunId": 39591,
          "mileage": 45000
        },
        {
          "testId": 3459,
          "testRunId": 41191,
          "mileage": 45000
        },
        {
          "testId": 3460,
          "testRunId": 41223,
          "mileage": 66666
        },
        {
          "testId": 3461,
          "testRunId": 2358,
          "mileage": 100001
        },
        {
          "testId": 3462,
          "testRunId": 39356,
          "mileage": 1500
        },
        {
          "testId": 3463,
          "testRunId": 39363,
          "mileage": 33000
        },
        {
          "testId": 3464,
          "testRunId": 39264,
          "mileage": 45009
        },
        {
          "testId": 3465,
          "testRunId": 2887,
          "mileage": 222222
        }
      ]
    }
  }
}
Query workOrder_GetAllWorkOrders Elenca tutti gli ordini di lavoro. Ricercabile, ordinabile e paginato.

Parametri

searchTerm: String
sortBy: GridSort
filters: WorkOrderFilterModel
skip: Int?
take: Int?
timeZoneOffset: Int

Risposta

result: WorkOrderListModel

Note

  • La pagina è paginata con skip e take. Il take predefinito è 50 e lo skip predefinito è 0. Non c’è un limite massimo.
  • timeZoneOffset viene inviato in minuti ed è la differenza tra ora UTC e ora del client (UTC − ora del client). Se l’ora svedese è +1 GMT, invia -1 per ottenere il giorno corretto.

Esempio

query{
  workOrder_GetAllWorkOrders(
    searchTerm: "AOL449"
    timeZoneOffset: 0
    )
    {
      totalWorkOrders
      workOrders
      {
        testId
        workOrderId
        vehicleMake
        vehicleModel
      }
    }
  }
}

Risposta di esempio

{
  "data": {
    "workOrder_GetAllWorkOrders": {
      "totalWorkOrders": 8,
      "workOrders": [
        {
          "testId": 47186,
          "workOrderId": 1832,
          "vehicleMake": "Ford",
          "vehicleModel": "Transit Connect 230 LWB"
        },
        {
          "testId": 45523,
          "workOrderId": 1698,
          "vehicleMake": "",
          "vehicleModel": ""
        },
        {
          "testId": 41141,
          "workOrderId": 1419,
          "vehicleMake": "Ford",
          "vehicleModel": "Transit Connect 230 LWB"
        },
        {
          "testId": 40793,
          "workOrderId": 1376,
          "vehicleMake": "Ford",
          "vehicleModel": "Transit Connect 230 LWB"
        },
        {
          "testId": 40709,
          "workOrderId": 1362,
          "vehicleMake": "Ford",
          "vehicleModel": "Transit Connect 230 LWB"
        },
        {
          "testId": 38984,
          "workOrderId": 1016,
          "vehicleMake": "Ford",
          "vehicleModel": "Transit Connect 230 LWB"
        },
        {
          "testId": 38976,
          "workOrderId": 1015,
          "vehicleMake": "Ford",
          "vehicleModel": "Transit Connect 230 LWB"
        },
        {
          "testId": 38904,
          "workOrderId": 994,
          "vehicleMake": "Ford",
          "vehicleModel": "Transit Connect 230 LWB"
        }
      ]
    }
  }
}
Query workOrder_GetActiveWorkOrders Elenca gli ordini di lavoro non conclusi.

Parametri

searchTerm: String
sortBy: GridSort
filters: WorkOrderFilterModel
skip: Int?
take: Int?
timeZoneOffset: Int

Risposta

result: WorkOrderListModel

Note

  • La pagina è paginata con skip e take. Il take predefinito è 50 e lo skip predefinito è 0. Non c’è un limite massimo.
  • timeZoneOffset viene inviato in minuti ed è la differenza tra ora UTC e ora del client (UTC − ora del client). Se l’ora svedese è +1 GMT, invia -1 per ottenere il giorno corretto.

Esempio

query{
  workOrder_GetActiveWorkOrders(
    searchTerm: "AOL449"
    timeZoneOffset: 0
    )
    {
      totalWorkOrders
      workOrders
      {
        testId
        workOrderId
        vehicleMake
        vehicleModel
      }
    }
  }
}

Risposta di esempio

{
  "data": {
    "workOrder_GetActiveWorkOrders": {
      "totalWorkOrders": 7,
      "workOrders": [
        {
          "testId": 47186,
          "workOrderId": 1832,
          "vehicleMake": "Ford",
          "vehicleModel": "Transit Connect 230 LWB"
        },
        {
          "testId": 45523,
          "workOrderId": 1698,
          "vehicleMake": "",
          "vehicleModel": ""
        },
        {
          "testId": 41141,
          "workOrderId": 1419,
          "vehicleMake": "Ford",
          "vehicleModel": "Transit Connect 230 LWB"
        },
        {
          "testId": 40793,
          "workOrderId": 1376,
          "vehicleMake": "Ford",
          "vehicleModel": "Transit Connect 230 LWB"
        },
        {
          "testId": 40709,
          "workOrderId": 1362,
          "vehicleMake": "Ford",
          "vehicleModel": "Transit Connect 230 LWB"
        },
        {
          "testId": 38984,
          "workOrderId": 1016,
          "vehicleMake": "Ford",
          "vehicleModel": "Transit Connect 230 LWB"
        },
        {
          "testId": 38904,
          "workOrderId": 994,
          "vehicleMake": "Ford",
          "vehicleModel": "Transit Connect 230 LWB"
        }
      ]
    }
  }
}
Mutation workOrder_ConcludeWorkOrder Conclude un ordine di lavoro.

Parametri

workOrderId: Int!

Risposta

result: Boolean

Esempio

mutation{
  workOrder_ConcludeWorkOrder(workOrderId: 1832)
}

Risposta di esempio

{
  "data": {
    "workOrder_ConcludeWorkOrder": true
  }
}
Mutation workOrder_ReopenWorkOrder Riapre un ordine di lavoro concluso.

Parametri

workOrderId: Int!

Risposta

result: Boolean

Esempio

mutation{
  workOrder_ReopenWorkOrder(workOrderId: 1832)
}

Risposta di esempio

{
  "data": {
    "workOrder_ReopenWorkOrder": true
  }
}
Mutation workOrder_DeleteWorkOrder Elimina un ordine di lavoro.

Parametri

workOrderId: Int!

Risposta

result: Boolean

Esempio

mutation{
  workOrder_DeleteWorkOrder(workOrderId: 1824)
}

Risposta di esempio

{
  "data": {
    "workOrder_DeleteWorkOrder": true
  }
}
Query workOrder_GetWorkOrder Recupera un singolo ordine di lavoro.

Parametri

workOrderId: Int!

Risposta

result: WorkOrderDataModel

Esempio

query{
  workOrder_GetWorkOrder(workOrderId: 1832)
  {
    workOrderId
    regNo
    mileage
    workOrderStatusId
  }
}

Risposta di esempio

{
  "data": {
    "workOrder_GetWorkOrder": {
      "workOrderId": 1832,
      "regNo": "AOL449",
      "mileage": 45000,
      "workOrderStatusId": 5
    }
  }
}

File

Endpoint REST per recuperare immagini e documenti.

La sandbox richiede l’accesso. Contattaci per ottenere contenuti di test.

Tipo di API REST
Staging https://test.bus.no/BUSPlatform3/RestAPIServers.FileServer/api
Produzione https://bus2.bus.no/busplatform3/RestAPIServers.FileServer/api
REST Media/GetMedia Henter selve filen fra en media-ID. Med useRedirect hentes filen direkte fra lagring, som er raskest.

Parametri

mediaId: String!
useRedirect: Boolean

Risposta

Actual file

Esempio

curl -X 'GET' \
  'https://test.bus.no/BUSPlatform3/RestAPIServers.FileServer/api/Media/GetMedia?api-version=1&mediaId=xxxx' \
  -H 'accept: */*' \
  -H 'x-api-version: 1' \
  -H 'x-access-token: eyJhb...'
REST Media/GetMediaSas Henter en midlertidig nedlastingslenke (SAS) for en media-ID, med utløpstidspunkt.

Parametri

mediaId: String!

Risposta

sasUrl expiresOn

Esempio

curl -X 'GET' \
  'https://test.bus.no/BUSPlatform3/RestAPIServers.FileServer/api/Media/GetMediaSas?api-version=1&mediaId=xxxx' \
  -H 'accept: application/json' \
  -H 'x-api-version: 1' \
  -H 'x-access-token: eyJhb...'

Tempo reale

Sottoscrivi eventi in tempo reale quando una perizia viene conclusa.

La sandbox richiede l’accesso. Contattaci per ottenere contenuti di test.

Tipo di API GraphQL
Staging wss://test.bus.no/BUSPlatform3/MessagingPortal/BUS.APIs.GraphQLServer.P3.MessagingPortal.ExternalEndpoint1
Produzione wss://bus2.bus.no/BUSPlatform3/MessagingPortal/BUS.APIs.GraphQLServer.P3.MessagingPortal.ExternalEndpoint1
Subscription Test_OnTestConclude Ti avvisa in tempo reale quando una valutazione è stata conclusa.

Parametri

testId: Int!

Risposta

result: TestDataModel

Note

  • I campi di testo localizzati come testStatus e i nomi dei punti di controllo vengono restituiti nella cultura del chiamante. La cultura proviene dal claim culture del token, con fallback su Accept-Language. L’esempio è stato catturato con la cultura svedese.

Esempio

subscription{
  test_OnTestConclude(testId: 54)
  {
    testId,
    mileage,
    serviceData {
      date,
      mileage,
      comment
    },
    unitId,
    testTypeIds,
    testStatus
  }
}

Risposta di esempio

{
  "data": {
    "test_GetTest": {
      "testId": 54,
      "mileage": 45000,
      "serviceData": [
        {
          "date": "2022-04-04T18:30:00.000Z",
          "mileage": 2000,
          "comment": null
        },
        {
          "date": "2023-06-22T18:30:00.000Z",
          "mileage": 10000,
          "comment": null
        }
      ],
      "unitId": 1,
      "testTypeIds": [
        2
      ],
      "testStatus": "Test färdigställd"
    }
  }
}

Webhooks

Registra un webhook e ricevi eventi sul tuo URL. B.U.S. invia un POST JSON per evento e accetta qualsiasi codice 2xx come conferma.

La sandbox richiede l’accesso. Contattaci per ottenere contenuti di test.

Tipo di API GraphQL
Staging https://test.bus.no/BUSPlatform3/MessagingPortal/BUS.APIs.GraphQLServer.P3.MessagingPortal.InternalApp
Produzione https://bus2.bus.no/BUSPlatform3/MessagingPortal/BUS.APIs.GraphQLServer.P3.MessagingPortal.InternalApp
Mutation notification_SubscribeWebhook Registra un webhook, generale o per un’unità. Restituisce un secret che B.U.S. inserisce in ogni payload di notifica, così puoi confermare che la notifica proviene da noi.

Parametri

webhookRegisterModel: WebhookRegisterModel (url, eventTypeId, unitId?)

Obbligatorio

  • url
  • eventTypeId

Risposta

secret: String

Note

  • Ogni consegna è un POST JSON. Con 2xx la notifica è considerata consegnata; qualsiasi altra risposta viene registrata come errore e non viene reinviata.

Esempio

mutation{
  notification_SubscribeWebhook(webhookRegisterModel:  {
    url: "https://example.com/webhook",
    eventTypeId: 1,
    unitId: null
  }
  ){
    secret
  }
}

Risposta di esempio

{
  "data": {
    "notification_SubscribeWebhook": {
      "secret": "…"
    }
  }
}
Mutation notification_UnsubscribeWebhook Rimuove un webhook registrato.

Parametri

eventTypeId: Int!
unitId: Int?

Risposta

result: Boolean

Esempio

mutation{
  notification_UnsubscribeWebhook(eventTypeId:  1, unitId: 5147)
}
Webhook TestConcluded La notifica che B.U.S. invia al tuo webhook quando una valutazione è stata conclusa.

Risposta

EventName, Data (TestDataModel), Secret

Note

  • Ogni consegna è un POST JSON. Con 2xx la notifica è considerata consegnata; qualsiasi altra risposta viene registrata come errore e non viene reinviata.

Esempio

{
  "EventName": "TestConcluded",
  "Data": { "TestId": 34626, "UnitId": 5147, "Mileage": 3234, "…": "…" },
  "Secret": "…"
}
Webhook TestDeleted La notifica che B.U.S. invia al tuo webhook quando una valutazione viene eliminata.

Risposta

EventName, Data (TestDataModel), Secret

Note

  • Ogni consegna è un POST JSON. Con 2xx la notifica è considerata consegnata; qualsiasi altra risposta viene registrata come errore e non viene reinviata.

Esempio

{
  "EventName": "TestDeleted",
  "Data": {
    "TestId": 34626,
    "TestRunId": 34927,
    "UnitId": 5147,
    "UnitName": null,
    "Mileage": 3234,
    "ExpectedArrivalDate": null,
    "ExpectedArrivalKM": null,
    "RequestedCompletionDate": null,
    "ParkingLocation": null,
    "KeyLocation": null,
    "IsMVASelected": false,
    "TestStatus": "Test: Klar",
    "PerformedUserId": null,
    "PerformedBy": "",
    "PerformedDate": "2025-10-24T09:36:46.217Z",
    "TestTypeIds": [
      2133
    ],
    "IsPublic": false,
    "TestTypeEmails": null,
    "TestTypeDescription": null,
    "ServiceData": [],
    "TestPersonId": 163,
    "TestComments": [],
    "TestOrderedBy": null,
    "TestCoverImage": null,
    "ExternalReferenceId": null,
    "TestAnnotations": [],
    "TestStatusId": 3,
    "IsDeleted": false,
    "CreatedDate": "2025-10-24T09:36:46.217Z",
    "HasValidBatteryReading": null,
    "IsValidTestDrive": null,
    "IsTestTypeVersionUpdated": null,
    "LastUpdatedeDate": "2025-10-24T09:36:46.217Z",
    "CompletedDate": "2025-10-24T09:39:37.877Z",
    "TestDefects": null
  },
  "Secret": null
}
Webhook WorkOrderConcluded La notifica che B.U.S. invia al tuo webhook quando un ordine di lavoro viene concluso.

Risposta

EventName, Data (WorkOrderDataModel), Secret

Note

  • Ogni consegna è un POST JSON. Con 2xx la notifica è considerata consegnata; qualsiasi altra risposta viene registrata come errore e non viene reinviata.

Esempio

{
  "EventName": "WorkOrderConcluded",
  "Data": {
    "WorkOrderId": 1832,
    "TestId": 47186,
    "TestRunId": 46664,
    "UnitId": 5147,
    "IsShared": false,
    "Mileage": 45000,
    "JobsStartDate": null,
    "JobsCompletionDate": null,
    "WorkOrderStatusId": 6,
    "IsDeleted": false,
    "RegNo": "AOL449",
    "IsSalesReportCreated": true,
    "CreatedSalesReportId": 3416,
    "IsCreatedFromTest": true,
    "HasAllAccess": false
  },
  "Secret": null
}

Modelli di dati

I tipi usati nei parametri e nelle risposte.

TestDataModel
UnitId: Int?
Mileage: Int?
ParkingLocation: String?
KeyLocation: String
TestStatus: String
TestTypeIds: [Int]
ServiceData: [ServiceMileageModel]
TestComments: [String]
ExternalReferenceId: String
TestAnnotations: [String]
testOrderedBy: String
VehicleDataModel
RegNo: String
Vin: String
VehicleType: String
TrimLevel: String
VehicleOptions: [VehicleOptionModel]
VehiclePackages: [VehiclePackageModel]
Color: String
Model: String
Make: String
GearBox: String
Engine: String
ManufacturedYear: Int?
ManufacturedMonth: Int?
Co2Emissions: Decimal?
ServiceMileageModel
Date: DateTime?
Mileage: Int?
Comment: String?
TestDefectModel
TestDefectId: Int
Checkpoint: KeyValueModel
CheckpointComment: KeyValueModel
CommonCost: Decimal
WorkCost: Decimal
PartsCost: Decimal
TotalCost: Decimal
TestTypeModel
TestTypeId: Int
TestTypeName: String
TestFileModel
FileUrl: String
FileName: String
FileReference: String
mediaId: String
testSectionId: Int
TestDefectFileModel
TestDefectFiles: [TestFileModel]
TestDefectId: Int
KeyValueModel
Key: Int
Value: String
VehicleOptionModel
OptionName: String
IncludedItems: String
IsSelected: Boolean?
VehiclePackageModel
PackageName: String
VehicleOptions: [VehicleOptionModel]
IsSelected: Boolean?
LeaseDataModel
PurchasePrice: Decimal?
ProductType: String
RepairMaintenance: String
WinterTires: String
TransportDate: DateTime?
QuotationTemplate: String
LeaseUserDataModel
CustomerId: String
CustomerName: String
FleetManagerName: String
FleetManagerEmail: String
InstallationRecipientEmail: String
KamName: String
KamEmail: String
DriverName: String
DriverPhone: String
DriverEmail: String
UnitModel
unitId: Int
unitName: String
TestListModel
tests: [TestGridInformationModel]
totalTests: Int
TestGridInformationModel
TestId: Int?
TestStatus: String
Regno: String
VehicleMake: String
VehicleModel: String
Vin: String
TestTypes: String
TestPersonId: Int?
IsActiveTest: Boolean
IsTestConcluded: Boolean
IsObdPerformed: Boolean
PerformedBy: String
PerformedDate: DateTime?
CreatedDate: DateTime
CompletedDate: DateTime?
TestAnnotations: String
GridSort
Field: String
Dir: SortDirection
SortDirection
enum SortDirection{
Asc
Desc
}
TestFilterModel
OrderedBy: [KeyValueModel]
TestDate: KeyValueModel
TestType: [KeyValueModel]
Status: [KeyValueModel]
CompletedDate: KeyValueModel
ReportModel
TestTypeId: Int
TestType: String
ReportURL: String
ShortenedReportURL: String
ShortenedPdfReportURL: String
DownloadUrl: String
SalesReportShareMetaDataModel
ShortenedSalesReportLinkURL: String
ShortenedVDNReportLinkURL: String
ShortenedSalesReportPdfURL: String
SalesReportPdfDownloadSasUrl: String
SalesReportFilterModel
CompletedDate: KeyValueModel
Status: [KeyValueModel]
PerformedBy: [KeyValueModel]
CreatedDate: KeyValueModel
WorkOrderFilterModel
CreatedDate: KeyValueModel
CompletedDate: KeyValueModel
SharedStatus: KeyValueModel
Status: [KeyValueModel]
WorkOrderUnit: [KeyValueModel]
Unit: [Int]
SalesReportListModel
SalesReports: [SalesReportGridInformationModel]
TotalSalesReports: Int
SalesReportGridInformationModel
SalesReportId: Int
SalesReportStatus: String
SalesReportStatusId: Int?
Regno: String
VehicleMake: String
VehicleModel: String
Vin: String
CreatedDate: DateTime
CompletedDate: DateTime?
WorkOrderJobModel
WorkOrderJobId
WorkOrderId
WorkOrderJobTypeId
JobName
WorkOrderJobStatus: WorkOrderJobStatusModel
IsShared
IsSentToSupplier
ExternalCost
RepairCost
Supplier
TestDefect
Comment
StandardJob
StartDate
CompletionDate
WorkOrderJobListModel
Count
WorkOrderJobs: [WorkOrderJobModel]
WorkOrderStatusUpdateResult
WorkOrderStatusId
WorkOrderStatusName
UpdatedJobs: [WorkOrderJobStatusModel]
WorkOrderJobStatusModel
WorkOrderJobId
WorkOrderJobStatusId
IsSentToSupplier
WorkOrderJobStatusName
GeneralInfoModel
MasterKeyCount
ChargingCableCount
PreviousUseId
HasPreviousDamage
IsLuggageCoverAvailable
IsTemperatureMeasured
TemperatureInside
TemperatureOutside
ACTestSkipReasonId
LocknutsAvailabilityStatusId
NextServiceDate
VehicleKeyTypes
ChargingCableTypes
SalesReportConcludeModel
SendSalesReportEmailSMSModel
SalesReportId
SalesReportTypes
Emails
Numbers
Description
ShortenedSalesReportLinkURL
ShortenedVDNReportLinkURL
ShortenedSalesReportPdfURL
SalesReportPdfDownloadSasUrl
StandardJobModel
StandardJobId: Int
StandardJobStatusId: Int
ParentStandardJobId: Int?
JobName: String
Cost: Decimal?
IsTaxInclude: Boolean
IsIncludedInCycle: Boolean
SupplierName: String
WorkOrderCreationTestRunListModel
WorkOrderCreationTestRunModel
TestId: Int?
TestRunId: Int
WorkOrderId: Int?
TestTypeNames: [String]
TestRunStatuses: TestRunStatusesModel
Mileage: Int
Date: DateTime
UnitName: String
TestRunStatusesModel
TestStatus: KeyValuePair<Int, String>?
WorkOrderStatus: KeyValuePair<Int, String>?
SalesReportStatus: KeyValuePair<Int, String>?
PreTestStatus: KeyValuePair<Int, String>?
WorkOrderListModel
WorkOrders: [WorkOrderGridInformationModel]
TotalWorkOrders: Int
WorkOrderGridInformationModel
TestId: Int
WorkOrderId: Int
WorkOrderStatus: String
Regno: String
VehicleMake: String
VehicleModel: String
Vin: String
CreatedDate: DateTime
CompletedDate: DateTime?
UnitId: Int
UnitName: String
SalesReportImageResultModel
FileName: String
IsSuccess: Boolean
Reason: String
AttachmentOrder: Int?
SalesReportImageInputModel
Url: String
FileName: String
IsCover: Boolean
WorkOrderDataModel
WorkOrderId: Int
TestId: Int
TestRunId: Int?
UnitId: Int
Mileage: Int?
JobsStartDate: DateTime?
JobsCompletionDate: DateTime?
WorkOrderStatusId: Int?
RegNo: String?
StandardJobsGridModel
StandardJobs: [StandardJobModel]
TotalStandardJobs: Int

Il B.U.S. Shop

Hai sviluppato un’integrazione utile per officine o concessionari? Rendila disponibile nel B.U.S. Shop, il marketplace in cui i clienti B.U.S. trovano e attivano le integrazioni. La tua integrazione raggiunge tre officine su quattro in Norvegia, senza bisogno di una tua organizzazione commerciale.

Aspetti tecnici

AutenticazioneToken Bearer. Credenziali sandbox su richiesta, produzione dopo approvazione.
FormatoGraphQL.
Limiti di richiestaIllimitato in sandbox. Nessun limite fisso in produzione oggi. In caso di uso improprio l’account può essere bloccato e il servizio può rispondere 429 (Too Many Requests).
WebhookEventi in tempo reale. Nuova ispezione, perizia aggiornata, cambio di stato. Scegli quali eventi sottoscrivere.
ModificheNon introduciamo modifiche incompatibili. Le nuove esigenze sono coperte da nuovi metodi e i metodi e i campi esistenti non vengono modificati finché sono in uso. Nuovi metodi e campi facoltativi possono essere aggiunti nel tempo. Le modifiche vengono annunciate via e-mail al contatto tecnico.
SchemaL’introspezione è attiva. Puoi recuperare l’intero schema con la query di introspezione sull’endpoint, oppure leggerlo nella sandbox GraphQL. Ogni API ha il proprio schema: l’API Test e Oscar Inspector sono endpoint distinti. Lo schema viene generato in fase di build, quindi è sempre allineato al servizio.

FAQ

Quali linguaggi/SDK sono supportati?

Basato su GraphQL. Funziona con qualsiasi linguaggio in grado di inviare richieste HTTP. Scegli tu quali campi ricevere.

Quanto costa?

La sandbox è gratuita. I prezzi per l’accesso alla produzione dipendono dall’utilizzo.

Pronto a sviluppare?

Esplora il catalogo delle API, o parla con uno sviluppatore di B.U.S.