Développeurs
API de données véhicule. Fondées sur 35 ans d’inspections automobiles.
La plateforme B.U.S. expose des API pour les expertises de véhicules, les rapports d’état et l’intelligence véhicule basée sur l’IA. Sandbox ouverte avec données de test et documentation OpenAPI pour les points d’accès REST. Contactez-nous et nous vous envoyons vos identifiants. Lancez-vous en quelques minutes, pas en quelques semaines.
Démarrez en trois étapes
-
Découvrez ce qui est disponible
Le catalogue d’API présente les endpoints disponibles avec leur documentation, leurs schémas et des exemples fonctionnels.
-
Développez en sandbox
Environnement sandbox ouvert avec de vraies données de test. Contactez-nous et nous vous envoyons un identifiant, un mot de passe et une clé d’API pour tester. C’est gratuit.
-
Passez en production
Quand vous êtes prêt, écrivez à support@bus.no en indiquant les coordonnées de votre entreprise, l’usage prévu de l’API et le volume attendu. L’approbation prend deux jours ouvrés. Nous validons la configuration et vous remettons les clés de production.
Catalogue d’API
GraphQL. Défauts prédits pour un véhicule
Oscar Inspector, la voie d’accès la plus rapide
Défauts et besoins d’entretien prédits à partir de la marque, du modèle et du kilométrage. Fondé sur plus de 20 millions d’inspections réelles. Une requête, une réponse, et l’intelligence véhicule basée sur l’IA est dans votre produit. C’est l’API par laquelle la plupart des partenaires commencent. Elle est utilisée par les assureurs pour l’évaluation des risques, par les places de marché pour enrichir les annonces, par les sociétés de leasing pour l’entretien des flottes et par les systèmes d’atelier pour l’intelligence avant la visite.
PKK. Contrôle technique périodique
Résultats de contrôle, codes de défaut, historique et statut de contre-visite. La base couvre 75 % du marché norvégien.
Test. Données d’expertise et d’état
Évaluations des dommages, coûts de réparation, prix des pièces détachées et rapports d’état complets. Utilisez-le pour l’intégration à l’aide à la vente, l’évaluation de garantie, les modèles de tarification, ou partout où vous avez besoin de données structurées sur l’état du véhicule.
Voir toutes les méthodes de l’API TestAssurance qualité
Contrôle interne, traitement des écarts, contrôle des équipements et étalonnages. Pertinent pour la conformité et l’audit.
Autres API
Le catalogue s’enrichit.
Oscar Inspector API
Prédictions de défauts assistées par IA pour un véhicule. Même authentification que l’API Test : utilisez applicationId 5 lorsque vous obtenez un jeton avec token_ApplyToken2. Oscar Inspector dispose de son propre endpoint et de son propre schéma, séparés de l’API Test. Les exemples montrent la requête ; la réponse dépend du véhicule.
Authentification
Chaque appel envoie deux en-têtes : Authorization: Bearer <accessToken> et x-api-key: <apiKey>. La clé d’API est une clé distincte et durable que nous vous fournissons. Les clés sandbox s’obtiennent en nous contactant. C’est ici que vous obtenez et renouvelez les jetons.
| Sandbox | https://test.bus.no/BUSPlatform3/SecurityPortal/BUS.APIs.GraphQLServer.P3.SecurityPortal.Tool |
|---|
La sandbox nécessite une connexion. Contactez-nous pour obtenir du contenu de test.
| Type d’API | GraphQL |
|---|---|
| Staging | https://test.bus.no/BUSPlatform3/SecurityPortal/BUS.APIs.GraphQLServer.P3.SecurityPortal.Endpoint1 |
| Production | https://bus2.bus.no/BUSPlatform3/SecurityPortal/BUS.APIs.GraphQLServer.P3.SecurityPortal.Endpoint1 |
Query token_ApplyToken2 Obtient un jeton d’identité, un jeton d’accès et un jeton d’actualisation pour un utilisateur et une application.
Paramètres
username: String!
password: String!
apiKey: String!
applicationId: Int! Réponse
idToken: String
accessToken: String
refreshToken: String Remarques
- Oscar Inspector exige applicationId 5. L’API Test utilise un autre applicationId.
- accessToken est valide 60 minutes. refreshToken est valide 90 jours.
- Pour renouveler : utilisez token_RefreshToken avec refreshToken. N’appelez pas token_ApplyToken2 à nouveau à chaque expiration.
- Si refreshToken a expiré, vous devez obtenir un tout nouveau jeu avec token_ApplyToken2.
Exemple
query {
token_ApplyToken2(
username: ""
password: ""
apiKey: ""
applicationId: 5
) {
idToken
accessToken
refreshToken
}
} Exemple de réponse
{
"data": {
"token_ApplyToken2": {
"idToken": "",
"accessToken": "",
"refreshToken": ""
}
}
} Query token_RefreshToken Renouvelle les jetons avec un jeton d’actualisation, sans se reconnecter.
Paramètres
apiKey: String!
applicationId: Int!
refreshToken: String! Réponse
idToken: String
accessToken: String
refreshToken: String Remarques
- accessToken est valide 60 minutes. refreshToken est valide 90 jours.
- Si refreshToken a expiré, vous devez obtenir un tout nouveau jeu avec token_ApplyToken2.
Exemple
query {
token_RefreshToken(
apiKey: "",
applicationId: 5,
refreshToken: ""
){
idToken
accessToken
refreshToken
}
} Exemple de réponse
{
"data": {
"token_RefreshToken": {
"idToken": "",
"accessToken": "",
"refreshToken": ""
}
}
} Prédiction de défauts
Défauts et besoins d’entretien prédits à partir du numéro d’immatriculation et du kilométrage.
| Sandbox | https://test.bus.no/BUSPlatform3/BUSDataPortal/BUS.APIs.GraphQLServer.P3.BUSDataPortal.Tool/ |
|---|
La sandbox nécessite une connexion. Contactez-nous pour obtenir du contenu de test.
| Type d’API | GraphQL |
|---|---|
| Staging | https://test.bus.no/BUSPlatform3/BUSDataPortal/BUS.APIs.GraphQLServer.P3.BUSDataPortal.ExternalEndpoint1 |
| Production | https://bus2.bus.no/BUSPlatform3/BUSDataPortal/BUS.APIs.GraphQLServer.P3.BUSDataPortal.ExternalEndpoint1 |
Query busData_GetDefectPredictions Renvoie les défauts prédits pour un véhicule, avec la probabilité et une explication pour chaque défaut.
Paramètres
requestId: String?
regNo: String
mileage: Int!
valuationId: Int?
inspectionId: Int?
language: String?
isMileageSuggestion: Boolean!
windowSize: Int!
refNo: String? Réponse
result: DefectPredictionOutput Remarques
- Le requestId de la réponse est utilisé comme originalRequestId dans busData_RecordUserFeedback.
Exemple
query {
busData_GetDefectPredictions(
requestId: "8ef2a2d7-4373-4f93-b57e-d151a192edad"
regNo: "CF66983"
mileage: 50000
) {
requestId
noOfPredictions
defectPredictions {
checkpointTypeGroupId
checkpointTypeGroup
probability
}
errorCodes
}
} Exemple de réponse
{
"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
}
}
} Retour d’information
Indiquez si la prédiction était juste et récupérez les motifs disponibles.
| Sandbox | https://test.bus.no/BUSPlatform3/BUSDataPortal/BUS.APIs.GraphQLServer.P3.BUSDataPortal.Tool/ |
|---|
La sandbox nécessite une connexion. Contactez-nous pour obtenir du contenu de test.
| Type d’API | GraphQL |
|---|---|
| Staging | https://test.bus.no/BUSPlatform3/BUSDataPortal/BUS.APIs.GraphQLServer.P3.BUSDataPortal.ExternalEndpoint1 |
| Production | https://bus2.bus.no/BUSPlatform3/BUSDataPortal/BUS.APIs.GraphQLServer.P3.BUSDataPortal.ExternalEndpoint1 |
Query busData_GetUserFeedbackReasons Liste les motifs qu’un utilisateur peut indiquer lorsqu’une prédiction était erronée.
Paramètres
requestId: String? Réponse
result: UserFeedbackReasonOutput Remarques
- userFeedbackReasonId est utilisé comme valeur dans userFeedbackReasons sur busData_RecordUserFeedback.
Exemple
query {
busData_GetUserFeedbackReasons(requestId: "4c84c8db-3f1f-427c-b2ad-f00725f430b9") {
requestId
userFeedbackReasons {
userFeedbackReasonId
displayString
userFeedbackReasonType
}
errorCodes
}
} Exemple de réponse
{
"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 Enregistre un retour sur une prédiction précédente.
Paramètres
requestId: String?
originalRequestId: String?
isSatisfied: Boolean!
timeTakenForFeedback: Int!
userId: Int!
username: String?
organizationId: Int!
organizationName: String?
userFeedbackReasons: [Int]
time: DateTime? Réponse
result: RecordUserFeedbackOutput Exemple
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
}
} Exemple de réponse
{
"data": {
"busData_RecordUserFeedback": {
"requestId": "1e692aa0-5a9b-400f-beef-7a53e27d26a2",
"errorCodes": null
}
}
} Modèles de données
Les types utilisés dans les paramètres et les réponses.
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] Référence de l’API. Test, expertise et rapport d’état
Toutes les méthodes de l’API Test, regroupées par usage. Ouvrez une méthode pour voir ses paramètres, sa réponse et un exemple que vous pouvez exécuter.
Authentification
Chaque appel envoie deux en-têtes : Authorization: Bearer <accessToken> et x-api-key: <apiKey>. La clé d’API est une clé distincte et durable que nous vous fournissons. Les clés sandbox s’obtiennent en nous contactant. C’est ici que vous obtenez et renouvelez les jetons.
| Sandbox | https://test.bus.no/BUSPlatform3/SecurityPortal/BUS.APIs.GraphQLServer.P3.SecurityPortal.Tool |
|---|
La sandbox nécessite une connexion. Contactez-nous pour obtenir du contenu de test.
| Type d’API | GraphQL |
|---|---|
| Staging | https://test.bus.no/BUSPlatform3/SecurityPortal/BUS.APIs.GraphQLServer.P3.SecurityPortal.Endpoint1 |
| Production | https://bus2.bus.no/BUSPlatform3/SecurityPortal/BUS.APIs.GraphQLServer.P3.SecurityPortal.Endpoint1 |
Query token_ApplyToken2 Obtient un jeton d’identité, un jeton d’accès et un jeton d’actualisation pour un utilisateur et une application.
Paramètres
username: String!
password: String!
apiKey: String!
applicationId: Int! Réponse
idToken: String
accessToken: String
refreshToken: String Remarques
- accessToken est valide 60 minutes. refreshToken est valide 90 jours.
- Pour renouveler : utilisez token_RefreshToken avec refreshToken. N’appelez pas token_ApplyToken2 à nouveau à chaque expiration.
- Si refreshToken a expiré, vous devez obtenir un tout nouveau jeu avec token_ApplyToken2.
Exemple
query {
token_ApplyToken2(
username: ""
password: ""
apiKey: ""
applicationId: 13
) {
idToken
accessToken
refreshToken
}
} Exemple de réponse
{
"data": {
"token_ApplyToken2": {
"idToken": "",
"accessToken": "",
"refreshToken": ""
}
}
} Query token_RefreshToken Renouvelle les jetons avec un jeton d’actualisation, sans se reconnecter.
Paramètres
apiKey: String!
applicationId: Int!
refreshToken: String! Réponse
idToken: String
accessToken: String
refreshToken: String Remarques
- accessToken est valide 60 minutes. refreshToken est valide 90 jours.
- Si refreshToken a expiré, vous devez obtenir un tout nouveau jeu avec token_ApplyToken2.
Exemple
query {
token_RefreshToken(
apiKey: "",
applicationId: 13,
refreshToken: ""
){
idToken
accessToken
refreshToken
}
} Exemple de réponse
{
"data": {
"token_RefreshToken": {
"idToken": "",
"accessToken": "",
"refreshToken": ""
}
}
} Expertises
Créez, lisez, mettez à jour et listez les expertises, avec les données du véhicule, les données de leasing et les rapports. Les exemples ci-dessous utilisent des numéros d’immatriculation et des identifiants présents dans l’environnement de test. Contactez-nous en demandant l’accès de test et vous recevrez des données adaptées à votre compte.
La sandbox nécessite une connexion. Contactez-nous pour obtenir du contenu de test.
| Type d’API | GraphQL |
|---|---|
| Staging | https://test.bus.no/BUSPlatform3/BUSTest.Server/BUS.APIs.GraphQLServer.P3.BUSTest.ExternalEndpoint1 |
| Production | https://bus2.bus.no/BUSPlatform3/BUSTest.Server/BUS.APIs.GraphQLServer.P3.BUSTest.ExternalEndpoint1 |
Mutation Test_CreateTest Crée une nouvelle expertise pour un véhicule. Renvoie l’identifiant de l’expertise.
Paramètres
vehicleDataModel: VehicleDataModel!
testDataModel: TestDataModel! Obligatoire
-
testTypeIds -
unitId -
regNo / vin
Réponse
result: Int Exemple
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"
}]
}
)
} Exemple de réponse
{
"data": {
"test_CreateTest": 54
}
} Mutation testData_CreateLeaseData Ajoute les données de leasing à une expertise : type de produit, prix d’achat, référence du contrat et plus encore.
Paramètres
testId: Int!
leaseDataModel: LeaseDataModel! Réponse
result: Boolean Exemple
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"
}
)
} Exemple de réponse
{
"data": {
"testData_CreateLeaseData": true
}
} Mutation testData_CreateLeaseUserData Ajoute le client de leasing et ses contacts à une expertise : gestionnaire de flotte, conducteur et plus encore.
Paramètres
testId: Int!
leaseUserDataModel: LeaseUserDataModel! Réponse
result: Boolean Exemple
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"
}
)
} Exemple de réponse
{
"data": {
"testData_CreateLeaseUserData": true
}
} Query Test_GetTest Obtient une expertise avec son statut, son kilométrage et son historique d’entretien.
Paramètres
testId: Int! Réponse
result: TestDataModel Remarques
- Les champs texte localisés comme testStatus et les noms de points de contrôle sont renvoyés dans la culture de l’appelant. La culture provient de la revendication culture du jeton, avec repli sur Accept-Language. L’exemple a été capturé avec la culture suédoise.
Exemple
query{
test_GetTest(testId: 32685)
{
testId,
externalReferenceId,
mileage,
serviceData {
date,
mileage,
comment
},
unitId,
testTypeIds,
testStatus,
testComments
}
} Exemple de réponse
{
"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 Obtient les images et les fichiers associés à une expertise.
Paramètres
testId: Int! Réponse
result: [TestFileModel] Exemple
query{
test_GetTestFiles(testId: 32685)
{
fileUrl,
fileName,
testSectionId,
mediaId
}
} Exemple de réponse
{
"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 Obtient les données du véhicule : numéro d’immatriculation, VIN, options et packs.
Paramètres
testId: Int! Réponse
result: VehicleDataModel Exemple
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
}
} Exemple de réponse
{
"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 Obtient les données de leasing d’une expertise.
Paramètres
testId: Int! Réponse
result: LeaseDataModel Exemple
query{
testData_GetLeaseData(testId: 21) {
productType
purchasePrice
quotationTemplate
repairMaintenance
transportDate
winterTyres
}
} Exemple de réponse
{
"data": {
"testData_GetLeaseData": {
"productType": null,
"purchasePrice": null,
"quotationTemplate": null,
"repairMaintenance": null,
"transportDate": null,
"winterTires": null
}
}
} Query testData_GetLeaseUserData Obtient le client de leasing et ses contacts pour une expertise.
Paramètres
testId: Int! Réponse
result: LeaseUserDataModel Exemple
query{
testData_GetLeaseUserData(testId: 21) {
customerId
customerName
fleetManagerName
fleetManagerEmail
installationRecipientEmail
kamName
kamEmail
driverName
driverPhone
driverEmail
}
} Exemple de réponse
{
"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 Liste les unités auxquelles vous avez accès.
Réponse
result: [UnitModel] Exemple
query{
unit_GetAccessibleUnits
{
unitId
unitName
}
} Exemple de réponse
{
"data": {
"unit_GetAccessibleUnits": [
{
"unitId": 1,
"unitName": "Test unit"
}
]
}
} Query TestType_GetTestTypes Liste les types d’expertise disponibles pour une unité.
Paramètres
unitId: Int!
vin: String Réponse
result: [TestTypeModel] Exemple
query{
testType_GetTestTypes(unitId: 1)
{
testTypeId,
testTypeName,
isActive
}
} Exemple de réponse
{
"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 Met à jour une expertise existante.
Réponse
result: TestDataModel Exemple
mutation {
test_UpdateTest(testDataModel: {
testId: 625,
mileage: 60000
}) {
testId,
mileage
}
} Exemple de réponse
SalesReport_CreateSalesReportFromSource Query Test_GetAllTests Une liste consultable et triable de toutes les expertises, avec filtres et pagination.
Paramètres
searchTerm: String
sortBy: GridSort
filters: TestFilterModel
skip: Int?
take: Int?
timeZoneOffset: Int? Réponse
result: TestListModel Remarques
- La page est paginée avec skip et take. Le take par défaut est 50 et le skip par défaut est 0. Il n’y a pas de limite supérieure.
- Champs triables : regno, vehicleMake, vehicleModel, vin, completedDate, createdDate, performedDate, performedBy, testTypes, isObdPerformed, testStatus, testAnnotations.
- searchTerm ne correspond que si le texte commence par RegNo ou TestAnnotations.
- timeZoneOffset est envoyé en minutes et représente la différence entre l’heure UTC et l’heure du client (UTC − heure du client). Si l’heure suédoise est +1 GMT, envoyez -1 pour atteindre le bon jour.
Exemple
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 Identique à la précédente, mais uniquement pour les expertises en cours.
Paramètres
searchTerm: String
sortBy: GridSort
filters: TestFilterModel
skip: Int?
take: Int?
timeZoneOffset: Int? Réponse
result: TestListModel Remarques
- La page est paginée avec skip et take. Le take par défaut est 50 et le skip par défaut est 0. Il n’y a pas de limite supérieure.
- Champs triables : regno, vehicleMake, vehicleModel, vin, completedDate, createdDate, performedDate, performedBy, testTypes, isObdPerformed, testStatus, testAnnotations.
- searchTerm ne correspond que si le texte commence par RegNo ou TestAnnotations.
- timeZoneOffset est envoyé en minutes et représente la différence entre l’heure UTC et l’heure du client (UTC − heure du client). Si l’heure suédoise est +1 GMT, envoyez -1 pour atteindre le bon jour.
Exemple
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 Obtient les liens vers les rapports d’état d’une expertise, y compris le PDF.
Paramètres
testId: Int! Obligatoire
-
int testId
Réponse
result: [ReportModel] Exemple
query {
test_GetTestReports(testId: 33081) {
testTypeId
testType
shortenedReportURL
shortenedPdfReportURL
}
} Exemple de réponse
{
"data": {
"test_GetTestReports": [
{
"testTypeId": 2,
"testType": "Test utan kostnader",
"shortenedReportURL": "https://lnkt.bus.no/8049d5ll2"
"shortenedPdfReportURL": "https://lnkt.bus.no/41181Ruhpp"
}
]
}
} Query test_GetGeneralInfo Obtient les informations générales sur le véhicule : clés, câble de recharge, usage antérieur et plus encore.
Paramètres
testId: Int! Réponse
result: GeneralInfoModel Remarques
- Lisez les valeurs actuelles avant de mettre à jour. test_GetGeneralInfoMetaData fournit les valeurs de référence prédéfinies.
Exemple
query {
test_GetGeneralInfo(testId: 46324) {
masterKeyCount
chargingCableCount
previousUseId
hasPreviousDamage
vehicleKeyTypes { key value }
chargingCableTypes { key value }
}
} Exemple de réponse
{ "data": { "test_GetGeneralInfo": { "masterKeyCount": 2, "chargingCableCount": 1, "previousUseId": 3, "hasPreviousDamage": false, "vehicleKeyTypes": [ { "key": 1, "value": "Remote key" } ], "chargingCableTypes": [] } } } Mutation test_UpdateGeneralInfo Met à jour les informations générales sur le véhicule.
Paramètres
testId: Int!
generalInfoModel: GeneralInfoModel! Réponse
result: Boolean Remarques
- Lire, modifier, écrire : envoyez le modèle complet. Les listes vides pour vehicleKeyTypes ou chargingCableTypes sont refusées ; une liste vide supprime les types existants.
Exemple
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" }]
})
} Exemple de réponse
{
"data":
{
"test_UpdateGeneralInfo": true
}
} Rapports de vente
Rapports de vente construits à partir des expertises, avec liens de partage et conclusion.
La sandbox nécessite une connexion. Contactez-nous pour obtenir du contenu de test.
| Type d’API | GraphQL |
|---|---|
| Staging | https://test.bus.no/BUSPlatform3/BUSTest.Server/BUS.APIs.GraphQLServer.P3.BUSTest.ExternalEndpoint1 |
| Production | https://bus2.bus.no/BUSPlatform3/BUSTest.Server/BUS.APIs.GraphQLServer.P3.BUSTest.ExternalEndpoint1 |
Mutation SalesReport_CreateSalesReportFromSource Crée un rapport de vente à partir d’une expertise existante ou d’un véhicule.
Paramètres
regNo: String!
testRunId: Int?
unitId: Int? Obligatoire
-
string regNo -
int testRunId or int unitId
Réponse
result: Int Exemple
mutation {
salesReport_CreateSalesReportFromSource(regNo: "ØSXXR01", unitId: 5147)
} Exemple de réponse
{
"data": {
"salesReport_CreateSalesReportFromSource": 764
}
} Query SalesReport_GetSalesReportShareMetaData Obtient les liens de partage du rapport de vente et du rapport VDN, ainsi que le téléchargement du PDF.
Paramètres
salesReportId: Int! Obligatoire
-
int salesReportId
Réponse
result: SalesReportShareMetaDataModel Remarques
- salesReportPdfDownloadSasUrl n’est disponible que pour les partenaires externes.
Exemple
query {
salesReport_GetSalesReportShareMetaData(salesReportId: 764) {
shortenedSalesReportLinkURL
shortenedVDNReportLinkURL
shortenedSalesReportPdfURL
salesReportPdfDownloadSasUrl
}
} Exemple de réponse
{
"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 Une liste consultable et triable de tous les rapports de vente.
Paramètres
searchTerm: String
sortBy: GridSort
filters: SalesReportFilterModel
skip: Int?
take: Int?
timeZoneOffset: Int? Réponse
result: SalesReportListModel Remarques
- La page est paginée avec skip et take. Le take par défaut est 50 et le skip par défaut est 0. Il n’y a pas de limite supérieure.
- Champs triables : regno, vehicleMake, vehicleModel, vin, completedDate, salesReportStatus, createdDate, performedBy
- searchTerm ne correspond que si le texte commence par RegNo.
- timeZoneOffset est envoyé en minutes et représente la différence entre l’heure UTC et l’heure du client (UTC − heure du client). Si l’heure suédoise est +1 GMT, envoyez -1 pour atteindre le bon jour.
Exemple
query {
salesReport_GetAllSalesReports(searchTerm: "WBS99A") {
salesReports {
salesReportId
salesReportStatus
salesReportStatusId
regno
vehicleMake
vehicleModel
vin
createdDate
completedDate
}
totalSalesReports
}
} Query SalesReport_GetActiveSalesReports Identique à la précédente, mais uniquement pour les rapports de vente actifs.
Paramètres
searchTerm: String
sortBy: GridSort
filters: SalesReportFilterModel
skip: Int?
take: Int?
timeZoneOffset: Int? Réponse
result: SalesReportListModel Remarques
- La page est paginée avec skip et take. Le take par défaut est 50 et le skip par défaut est 0. Il n’y a pas de limite supérieure.
- Champs triables : regno, vehicleMake, vehicleModel, vin, completedDate, salesReportStatus, createdDate, performedBy
- searchTerm ne correspond que si le texte commence par RegNo.
- timeZoneOffset est envoyé en minutes et représente la différence entre l’heure UTC et l’heure du client (UTC − heure du client). Si l’heure suédoise est +1 GMT, envoyez -1 pour atteindre le bon jour.
Exemple
query {
salesReport_GetActiveSalesReports(searchTerm: "WBS99A") {
salesReports {
salesReportId
salesReportStatus
salesReportStatusId
regno
vehicleMake
vehicleModel
vin
createdDate
completedDate
}
totalSalesReports
}
} Mutation SalesReport_UpdateSalesReport Met à jour un rapport de vente.
Paramètres
salesReportData: SalesReportDataModel! Obligatoire
-
salesReportData.SalesReportId -
salesReportData.TestId -
salesReportData.UnitId
Réponse
result: SalesReportDataModel Exemple
mutation UpdateSalesReport($salesReportData: SalesReportDataModelInput!) {
updatedSalesReport: salesReport_UpdateSalesReport(
salesReportData: $salesReportData
) {
testId
mileage
createdDate
completedDate
salesReportTypeIds
deviationNotes
hasBatteryReading
testStatusId
unitId
__typename
}
} Exemple de réponse
{
"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 Conclut un rapport de vente et l’envoie par e-mail ou par SMS.
Paramètres
salesReportConcludeModel: SalesReportConcludeModel! Obligatoire
-
salesReportConcludeModel.salesReportId -
salesReportConcludeModel.sendSalesReportEmailSMSModel
Réponse
result: Boolean Remarques
- sendSalesReportEmailSMSModel est obligatoire et les liens de partage générés y sont enregistrés. Des listes vides pour l’e-mail, les numéros et les types de rapport n’envoient rien. Les destinataires configurés au niveau de l’unité sont ajoutés lors de la conclusion. Les défauts ouverts ne bloquent pas la conclusion.
Exemple
mutation {
salesReport_ConcludeSalesReport(salesReportConcludeModel: {
salesReportId: 3180,
sendSalesReportEmailSMSModel: {
salesReportId: 3180,
emails: [],
numbers: [],
salesReportTypes: []
}
})
} Exemple de réponse
{
"data":
{
"salesReport_ConcludeSalesReport": true
}
} Mutation salesReport_AddSalesReportImages Ajoute des images à un rapport de vente, avec une image de couverture en option.
Paramètres
salesReportId: Int!
images: [SalesReportImageInputModel]! Réponse
result: [SalesReportImageResultModel] Exemple
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
}
} Défauts et dommages
Défauts et dommages enregistrés lors d’une expertise, avec images.
La sandbox nécessite une connexion. Contactez-nous pour obtenir du contenu de test.
| Type d’API | GraphQL |
|---|---|
| Staging | https://test.bus.no/BUSPlatform3/BUSTest.Server/BUS.APIs.GraphQLServer.P3.BUSTest.ExternalEndpoint1 |
| Production | https://bus2.bus.no/BUSPlatform3/BUSTest.Server/BUS.APIs.GraphQLServer.P3.BUSTest.ExternalEndpoint1 |
Query Defect_GetTestDefects Obtient les défauts et dommages enregistrés lors d’une expertise.
Paramètres
testId: Int! Réponse
result: [TestDefectModel] Remarques
- TotalCost est hors TVA. L’interface peut afficher le montant TVA comprise.
Exemple
query{
defect_GetTestDefects(testId: 54)
{
testDefectId,
checkpoint {
key
value
}
checkpointComment {
key
value
}
commonCost,
workCost,
partsCost,
totalCost
}
} Exemple de réponse
{
"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 Obtient les images et les fichiers rattachés aux défauts d’une expertise.
Paramètres
testId: Int! Réponse
result: [TestDefectFileModel] Exemple
query{
defect_GetTestDefectFiles(testId: 54)
{
testDefectId,
testDefectFiles
{
fileUrl,
fileName,
mediaId
}
}
} Exemple de réponse
{
"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 Met à jour un défaut d’une expertise et de son rapport de vente.
Paramètres
testId: Int!
defectFormData: TestDefectModel! Réponse
result: TestDefectModel Exemple
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
}
} Exemple de réponse
{
"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"
}
}
} Ordres de travail
Ordres de travail et tâches pour le flux de l’atelier.
La sandbox nécessite une connexion. Contactez-nous pour obtenir du contenu de test.
| Type d’API | GraphQL |
|---|---|
| Staging | https://test.bus.no/BUSPlatform3/BUSTest.Server/BUS.APIs.GraphQLServer.P3.BUSTest.ExternalEndpoint1 |
| Production | https://bus2.bus.no/BUSPlatform3/BUSTest.Server/BUS.APIs.GraphQLServer.P3.BUSTest.ExternalEndpoint1 |
Mutation workOrder_CreateWorkOrder Crée un ordre de travail pour un véhicule, avec ou sans expertise liée.
Paramètres
regNo: String!
testRunId: Int?!
unitId: Int! Obligatoire
-
testRunId (optional for standalone work order)
Réponse
result: Int Remarques
- Avec testRunId, l’expertise doit être conclue et une tâche est créée par défaut. Sans testRunId, un ordre de travail autonome est créé.
Exemple
mutation {
workOrder_CreateWorkOrder(regNo: "PHP526", testRunId: 45988, unitId: 5147)
} Exemple de réponse
{
"data":
{
"workOrder_CreateWorkOrder": 1773
}
} Mutation workOrder_CreateWorkOrderJob Ajoute une tâche à un ordre de travail.
Paramètres
workOrderJobModel: WorkOrderJobModel! Obligatoire
-
workOrderJobModel (workOrderId and job details)
Réponse
result: WorkOrderJobModel Exemple
mutation {
workOrder_CreateWorkOrderJob(workOrderJobModel: {
workOrderId: 1773,
jobName: "Replace wiper blades",
comment: "Added by partner"
}) {
workOrderJobId
jobName
}
} Exemple de réponse
{
"data":
{ "workOrder_CreateWorkOrderJob": {
"workOrderJobId": 28584, "jobName": "Replace wiper blades"
}
}
} Mutation workOrder_AddStandardJobsToWorkOrderCycle Ajoute des tâches standard à un ordre de travail.
Paramètres
workOrderId: Int!
standardJobIds: [Int]! Réponse
result: [WorkOrderJobModel] Exemple
mutation {
workOrder_AddStandardJobsToWorkOrderCycle(workOrderId: 1773, standardJobIds: [101, 205]) {
workOrderJobId
jobName
}
} Exemple de réponse
{
"data":
{ "workOrder_AddStandardJobsToWorkOrderCycle":
[ { "workOrderJobId": 28585, "jobName": "Standard service" } ]
}
} Query workOrder_GetWorkOrderJobList Obtient toutes les tâches d’un ordre de travail.
Paramètres
workOrderId: Int! Réponse
result: WorkOrderJobListModel Remarques
- workOrderJobStatus est un objet imbriqué. Utilisez les identités de tâche obtenues ici lorsque vous définissez le statut.
Exemple
query {
workOrder_GetWorkOrderJobList(workOrderId: 1773) {
count
workOrderJobs {
workOrderJobId
jobName
workOrderJobStatus {
workOrderJobStatusId
workOrderJobStatusName
}
testDefect {
testDefectId
}
}
}
} Exemple de réponse
{
"data":
{ "workOrder_GetWorkOrderJobList":
{ "count": 2, "workOrderJobs": [
{ "workOrderJobId": 28581, "jobName": "Defect job", "workOrderJobStatus": { "workOrderJobStatusId": 3, "workOrderJobStatusName": "Done" }, "testDefect": { "testDefectId": 3444 } }
]
}
}
} Mutation workOrder_UpdateWorkOrderJobStatus Définit un nouveau statut pour une ou plusieurs tâches.
Paramètres
workOrderId: Int!
workOrderJobIds: [Int]!
workOrderJobStatusId: Int! Réponse
result: WorkOrderStatusUpdateResult Remarques
- Done apparaît comme corrigé dans le rapport de vente, Open comme défaut persistant. Le statut de l’ordre de travail reste synchronisé.
Exemple
mutation {
workOrder_UpdateWorkOrderJobStatus(
workOrderId: 1773,
workOrderJobIds: [28581, 28582],
workOrderJobStatusId: 3
) {
workOrderStatusId
workOrderStatusName
updatedJobs {
workOrderJobId
workOrderJobStatusId
workOrderJobStatusName
}
}
} Exemple de réponse
{ "data": { "workOrder_UpdateWorkOrderJobStatus": { "workOrderStatusId": 2, "workOrderStatusName": "InProgress", "updatedJobs": [ { "workOrderJobId": 28581, "workOrderJobStatusId": 3, "workOrderJobStatusName": "Done" } ] } } } Query workOrder_GetStandardJobsForWorkOrder Liste les tâches standard pouvant être rattachées à un ordre de travail.
Paramètres
workOrderId: Int! Réponse
result: [StandardJobModel] Exemple
query{
workOrder_GetStandardJobsForWorkOrder(
workOrderId: 1832)
{
standardJobId
jobName
cost
isTaxInclude
}
} Exemple de réponse
{
"data": {
"workOrder_GetStandardJobsForWorkOrder": [
{
"standardJobId": 723,
"jobName": "Shenal standard - job",
"cost": 800,
"isTaxInclude": false
}
]
}
} Query workOrderSettings_GetStandardJobsListForUnit Liste les tâches standard propres à l’unité, avec leur coût.
Paramètres
unitId: Int! Réponse
result: StandardJobsGridModel Exemple
query{
workOrderSettings_GetStandardJobsListForUnit(unitId: 5208)
{
totalStandardJobs
standardJobs {
standardJobId
jobName
cost
}
}
} Exemple de réponse
{
"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 Liste les exécutions de test pouvant devenir un ordre de travail pour un numéro d’immatriculation.
Paramètres
regNo: String!
unitId: Int! Réponse
result: WorkOrderCreationTestRunListModel Exemple
query{
workOrder_GetTestRunsForWorkOrderCreation(
regNo: "AOL449"
, unitId: 5147
)
{
isRegNoValid
items {
testId
testRunId
mileage
}
}
} Exemple de réponse
{
"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 Liste tous les ordres de travail. Consultable, triable et paginée.
Paramètres
searchTerm: String
sortBy: GridSort
filters: WorkOrderFilterModel
skip: Int?
take: Int?
timeZoneOffset: Int Réponse
result: WorkOrderListModel Remarques
- La page est paginée avec skip et take. Le take par défaut est 50 et le skip par défaut est 0. Il n’y a pas de limite supérieure.
- timeZoneOffset est envoyé en minutes et représente la différence entre l’heure UTC et l’heure du client (UTC − heure du client). Si l’heure suédoise est +1 GMT, envoyez -1 pour atteindre le bon jour.
Exemple
query{
workOrder_GetAllWorkOrders(
searchTerm: "AOL449"
timeZoneOffset: 0
)
{
totalWorkOrders
workOrders
{
testId
workOrderId
vehicleMake
vehicleModel
}
}
}
} Exemple de réponse
{
"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 Liste les ordres de travail non conclus.
Paramètres
searchTerm: String
sortBy: GridSort
filters: WorkOrderFilterModel
skip: Int?
take: Int?
timeZoneOffset: Int Réponse
result: WorkOrderListModel Remarques
- La page est paginée avec skip et take. Le take par défaut est 50 et le skip par défaut est 0. Il n’y a pas de limite supérieure.
- timeZoneOffset est envoyé en minutes et représente la différence entre l’heure UTC et l’heure du client (UTC − heure du client). Si l’heure suédoise est +1 GMT, envoyez -1 pour atteindre le bon jour.
Exemple
query{
workOrder_GetActiveWorkOrders(
searchTerm: "AOL449"
timeZoneOffset: 0
)
{
totalWorkOrders
workOrders
{
testId
workOrderId
vehicleMake
vehicleModel
}
}
}
} Exemple de réponse
{
"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 Conclut un ordre de travail.
Paramètres
workOrderId: Int! Réponse
result: Boolean Exemple
mutation{
workOrder_ConcludeWorkOrder(workOrderId: 1832)
} Exemple de réponse
{
"data": {
"workOrder_ConcludeWorkOrder": true
}
} Mutation workOrder_ReopenWorkOrder Rouvre un ordre de travail conclu.
Paramètres
workOrderId: Int! Réponse
result: Boolean Exemple
mutation{
workOrder_ReopenWorkOrder(workOrderId: 1832)
} Exemple de réponse
{
"data": {
"workOrder_ReopenWorkOrder": true
}
} Mutation workOrder_DeleteWorkOrder Supprime un ordre de travail.
Paramètres
workOrderId: Int! Réponse
result: Boolean Exemple
mutation{
workOrder_DeleteWorkOrder(workOrderId: 1824)
} Exemple de réponse
{
"data": {
"workOrder_DeleteWorkOrder": true
}
} Query workOrder_GetWorkOrder Récupère un ordre de travail.
Paramètres
workOrderId: Int! Réponse
result: WorkOrderDataModel Exemple
query{
workOrder_GetWorkOrder(workOrderId: 1832)
{
workOrderId
regNo
mileage
workOrderStatusId
}
} Exemple de réponse
{
"data": {
"workOrder_GetWorkOrder": {
"workOrderId": 1832,
"regNo": "AOL449",
"mileage": 45000,
"workOrderStatusId": 5
}
}
} Fichiers
Endpoints REST pour récupérer des images et des documents.
La sandbox nécessite une connexion. Contactez-nous pour obtenir du contenu de test.
| Type d’API | REST |
|---|---|
| Staging | https://test.bus.no/BUSPlatform3/RestAPIServers.FileServer/api |
| Production | 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.
Paramètres
mediaId: String!
useRedirect: Boolean Réponse
Actual file Exemple
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.
Paramètres
mediaId: String! Réponse
sasUrl expiresOn Exemple
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...' Temps réel
Abonnez-vous aux événements en temps réel lorsqu’une expertise est conclue.
La sandbox nécessite une connexion. Contactez-nous pour obtenir du contenu de test.
| Type d’API | GraphQL |
|---|---|
| Staging | wss://test.bus.no/BUSPlatform3/MessagingPortal/BUS.APIs.GraphQLServer.P3.MessagingPortal.ExternalEndpoint1 |
| Production | wss://bus2.bus.no/BUSPlatform3/MessagingPortal/BUS.APIs.GraphQLServer.P3.MessagingPortal.ExternalEndpoint1 |
Subscription Test_OnTestConclude Vous prévient en temps réel lorsqu’une expertise a été conclue.
Paramètres
testId: Int! Réponse
result: TestDataModel Remarques
- Les champs texte localisés comme testStatus et les noms de points de contrôle sont renvoyés dans la culture de l’appelant. La culture provient de la revendication culture du jeton, avec repli sur Accept-Language. L’exemple a été capturé avec la culture suédoise.
Exemple
subscription{
test_OnTestConclude(testId: 54)
{
testId,
mileage,
serviceData {
date,
mileage,
comment
},
unitId,
testTypeIds,
testStatus
}
} Exemple de réponse
{
"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
Enregistrez un webhook et recevez des événements sur votre propre URL. B.U.S. envoie un POST JSON par événement et accepte tout code 2xx comme accusé de réception.
La sandbox nécessite une connexion. Contactez-nous pour obtenir du contenu de test.
| Type d’API | GraphQL |
|---|---|
| Staging | https://test.bus.no/BUSPlatform3/MessagingPortal/BUS.APIs.GraphQLServer.P3.MessagingPortal.InternalApp |
| Production | https://bus2.bus.no/BUSPlatform3/MessagingPortal/BUS.APIs.GraphQLServer.P3.MessagingPortal.InternalApp |
Mutation notification_SubscribeWebhook Enregistre un webhook, généralement ou pour une unité. Renvoie un secret que B.U.S. place dans chaque charge utile de notification, afin que vous puissiez confirmer que la notification vient de nous.
Paramètres
webhookRegisterModel: WebhookRegisterModel (url, eventTypeId, unitId?) Obligatoire
-
url -
eventTypeId
Réponse
secret: String Remarques
- Chaque livraison est un POST JSON. Un code 2xx signifie que la notification est livrée ; toute autre réponse est journalisée comme erreur et n’est pas renvoyée.
Exemple
mutation{
notification_SubscribeWebhook(webhookRegisterModel: {
url: "https://example.com/webhook",
eventTypeId: 1,
unitId: null
}
){
secret
}
} Exemple de réponse
{
"data": {
"notification_SubscribeWebhook": {
"secret": "…"
}
}
} Mutation notification_UnsubscribeWebhook Supprime un webhook enregistré.
Paramètres
eventTypeId: Int!
unitId: Int? Réponse
result: Boolean Exemple
mutation{
notification_UnsubscribeWebhook(eventTypeId: 1, unitId: 5147)
} Webhook TestConcluded La notification que B.U.S. envoie à votre webhook lorsqu’une expertise a été conclue.
Réponse
EventName, Data (TestDataModel), Secret Remarques
- Chaque livraison est un POST JSON. Un code 2xx signifie que la notification est livrée ; toute autre réponse est journalisée comme erreur et n’est pas renvoyée.
Exemple
{
"EventName": "TestConcluded",
"Data": { "TestId": 34626, "UnitId": 5147, "Mileage": 3234, "…": "…" },
"Secret": "…"
} Webhook TestDeleted La notification que B.U.S. envoie à votre webhook lorsqu’une expertise est supprimée.
Réponse
EventName, Data (TestDataModel), Secret Remarques
- Chaque livraison est un POST JSON. Un code 2xx signifie que la notification est livrée ; toute autre réponse est journalisée comme erreur et n’est pas renvoyée.
Exemple
{
"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 notification que B.U.S. envoie à votre webhook lorsqu’un ordre de travail est conclu.
Réponse
EventName, Data (WorkOrderDataModel), Secret Remarques
- Chaque livraison est un POST JSON. Un code 2xx signifie que la notification est livrée ; toute autre réponse est journalisée comme erreur et n’est pas renvoyée.
Exemple
{
"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
} Modèles de données
Les types utilisés dans les paramètres et les réponses.
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 Le B.U.S. Shop
Vous avez conçu une intégration utile aux ateliers ou aux concessionnaires ? Mettez-la à disposition dans le B.U.S. Shop, la place de marché où les clients B.U.S. trouvent et activent des intégrations. Votre intégration atteint trois ateliers sur quatre en Norvège, sans organisation commerciale propre.
Technique
| Authentification | Jeton Bearer. Identifiants sandbox sur demande, production après approbation. |
|---|---|
| Format | GraphQL. |
| Limites de débit | Illimité en sandbox. Aucune limite fixe en production aujourd’hui. En cas d’usage abusif, le compte peut être bloqué et le service peut répondre 429 (Too Many Requests). |
| Webhooks | Événements en temps réel. Nouvelle inspection, expertise mise à jour, changement de statut. Choisissez les événements auxquels vous vous abonnez. |
| Modifications | Nous n’introduisons pas de changements incompatibles. Les nouveaux besoins sont couverts par de nouvelles méthodes, et les méthodes et champs existants ne sont pas modifiés tant qu’ils sont utilisés. De nouvelles méthodes et des champs facultatifs peuvent s’ajouter au fil du temps. Les changements sont annoncés par e-mail au contact technique. |
| Schéma | L’introspection est activée. Vous pouvez récupérer tout le schéma avec la requête d’introspection sur l’endpoint, ou le lire dans la sandbox GraphQL. Chaque API a son propre schéma : l’API Test et Oscar Inspector sont des endpoints distincts. Le schéma est généré lors du build, il est donc toujours aligné sur le service. |
FAQ
Quels langages/SDK sont pris en charge ?
Basé sur GraphQL. Fonctionne avec tout langage capable d’envoyer des requêtes HTTP. Choisissez les champs que vous voulez recevoir en retour.
Combien ça coûte ?
La sandbox est gratuite. La tarification de l’accès à la production dépend de l’usage.
Prêt à développer ?
Explorez le catalogue d’API, ou parlez à un développeur chez B.U.S.