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.
Inizia in tre passaggi
-
Scopri cosa è disponibile
Il catalogo delle API mostra gli endpoint disponibili con documentazione, schemi ed esempi funzionanti.
-
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.
-
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 TestAssicurazione 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.
| Sandbox | https://test.bus.no/BUSPlatform3/SecurityPortal/BUS.APIs.GraphQLServer.P3.SecurityPortal.Tool |
|---|
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.
| Sandbox | https://test.bus.no/BUSPlatform3/BUSDataPortal/BUS.APIs.GraphQLServer.P3.BUSDataPortal.Tool/ |
|---|
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.
| Sandbox | https://test.bus.no/BUSPlatform3/BUSDataPortal/BUS.APIs.GraphQLServer.P3.BUSDataPortal.Tool/ |
|---|
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.
| Sandbox | https://test.bus.no/BUSPlatform3/SecurityPortal/BUS.APIs.GraphQLServer.P3.SecurityPortal.Tool |
|---|
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.
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
Risposta
result: SalesReportShareMetaDataModel 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! Risposta
result: WorkOrderCreationTestRunListModel 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 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
SalesReportId
SendSalesReportEmailSMSModel 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
Items: [WorkOrderCreationTestRunModel] 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
| Autenticazione | Token Bearer. Credenziali sandbox su richiesta, produzione dopo approvazione. |
|---|---|
| Formato | GraphQL. |
| Limiti di richiesta | Illimitato 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). |
| Webhook | Eventi in tempo reale. Nuova ispezione, perizia aggiornata, cambio di stato. Scegli quali eventi sottoscrivere. |
| Modifiche | Non 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. |
| Schema | L’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.