Se connecter Réserver une démo

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éveloppement chez B.U.S.

Démarrez en trois étapes

  1. 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.

  2. 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.

  3. 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 Test

Assurance 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.

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.

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.

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.

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.

Paramètres

testDataModel: TestDataModel!

Obligatoire

  • testDataModel.testId

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

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!

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
SalesReportShareMetaDataModel
ShortenedSalesReportLinkURL: String
ShortenedVDNReportLinkURL: String
ShortenedSalesReportPdfURL: String
SalesReportPdfDownloadSasUrl: String
SalesReportFilterModel
CompletedDate: KeyValueModel
Status: [KeyValueModel]
PerformedBy: [KeyValueModel]
CreatedDate: KeyValueModel
WorkOrderFilterModel
CreatedDate: KeyValueModel
CompletedDate: KeyValueModel
SharedStatus: KeyValueModel
Status: [KeyValueModel]
WorkOrderUnit: [KeyValueModel]
Unit: [Int]
SalesReportListModel
SalesReports: [SalesReportGridInformationModel]
TotalSalesReports: Int
SalesReportGridInformationModel
SalesReportId: Int
SalesReportStatus: String
SalesReportStatusId: Int?
Regno: String
VehicleMake: String
VehicleModel: String
Vin: String
CreatedDate: DateTime
CompletedDate: DateTime?
WorkOrderJobModel
WorkOrderJobId
WorkOrderId
WorkOrderJobTypeId
JobName
WorkOrderJobStatus: WorkOrderJobStatusModel
IsShared
IsSentToSupplier
ExternalCost
RepairCost
Supplier
TestDefect
Comment
StandardJob
StartDate
CompletionDate
WorkOrderJobListModel
Count
WorkOrderJobs: [WorkOrderJobModel]
WorkOrderStatusUpdateResult
WorkOrderStatusId
WorkOrderStatusName
UpdatedJobs: [WorkOrderJobStatusModel]
WorkOrderJobStatusModel
WorkOrderJobId
WorkOrderJobStatusId
IsSentToSupplier
WorkOrderJobStatusName
GeneralInfoModel
MasterKeyCount
ChargingCableCount
PreviousUseId
HasPreviousDamage
IsLuggageCoverAvailable
IsTemperatureMeasured
TemperatureInside
TemperatureOutside
ACTestSkipReasonId
LocknutsAvailabilityStatusId
NextServiceDate
VehicleKeyTypes
ChargingCableTypes
SalesReportConcludeModel
SendSalesReportEmailSMSModel
SalesReportId
SalesReportTypes
Emails
Numbers
Description
ShortenedSalesReportLinkURL
ShortenedVDNReportLinkURL
ShortenedSalesReportPdfURL
SalesReportPdfDownloadSasUrl
StandardJobModel
StandardJobId: Int
StandardJobStatusId: Int
ParentStandardJobId: Int?
JobName: String
Cost: Decimal?
IsTaxInclude: Boolean
IsIncludedInCycle: Boolean
SupplierName: String
WorkOrderCreationTestRunListModel
WorkOrderCreationTestRunModel
TestId: Int?
TestRunId: Int
WorkOrderId: Int?
TestTypeNames: [String]
TestRunStatuses: TestRunStatusesModel
Mileage: Int
Date: DateTime
UnitName: String
TestRunStatusesModel
TestStatus: KeyValuePair<Int, String>?
WorkOrderStatus: KeyValuePair<Int, String>?
SalesReportStatus: KeyValuePair<Int, String>?
PreTestStatus: KeyValuePair<Int, String>?
WorkOrderListModel
WorkOrders: [WorkOrderGridInformationModel]
TotalWorkOrders: Int
WorkOrderGridInformationModel
TestId: Int
WorkOrderId: Int
WorkOrderStatus: String
Regno: String
VehicleMake: String
VehicleModel: String
Vin: String
CreatedDate: DateTime
CompletedDate: DateTime?
UnitId: Int
UnitName: String
SalesReportImageResultModel
FileName: String
IsSuccess: Boolean
Reason: String
AttachmentOrder: Int?
SalesReportImageInputModel
Url: String
FileName: String
IsCover: Boolean
WorkOrderDataModel
WorkOrderId: Int
TestId: Int
TestRunId: Int?
UnitId: Int
Mileage: Int?
JobsStartDate: DateTime?
JobsCompletionDate: DateTime?
WorkOrderStatusId: Int?
RegNo: String?
StandardJobsGridModel
StandardJobs: [StandardJobModel]
TotalStandardJobs: Int

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

AuthentificationJeton Bearer. Identifiants sandbox sur demande, production après approbation.
FormatGraphQL.
Limites de débitIllimité 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.
ModificationsNous 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émaL’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.