Acceder Pide una demo

Desarrolladores

APIs de datos de vehículos. Basadas en 35 años de inspecciones de automoción.

La plataforma B.U.S. ofrece APIs para tasaciones de vehículos, informes de estado e inteligencia sobre el vehículo con IA. Sandbox abierto con datos de prueba y documentación OpenAPI para los endpoints REST. Contacta con nosotros y te enviamos las credenciales de acceso. Empieza a desarrollar en minutos, no en semanas.

Desarrollo en B.U.S.

Empieza en tres pasos

  1. Descubre qué hay disponible

    El catálogo de APIs muestra los endpoints disponibles con documentación, esquemas y ejemplos que funcionan.

  2. Desarrolla en el sandbox

    Entorno sandbox abierto con datos de prueba reales. Contacta con nosotros y te enviamos un usuario, una contraseña y una clave de API para probar. No cuesta nada.

  3. Pasa a producción

    Cuando estés listo, escribe a support@bus.no con los datos de tu empresa, el uso previsto de la API y el volumen esperado. La aprobación tarda dos días hábiles. Validamos la configuración y te entregamos las claves de producción.

Catálogo de APIs

GraphQL. Defectos previstos de un vehículo

Oscar Inspector, la vía de entrada más rápida

Defectos y necesidades de mantenimiento previstos a partir de la marca, el modelo y el kilometraje. Basado en más de 20 millones de inspecciones reales. Una consulta, una respuesta, y ya tienes inteligencia sobre el vehículo con IA en tu producto. Es la API con la que empiezan la mayoría de los partners. La usan aseguradoras para la evaluación de riesgos, marketplaces para enriquecer los anuncios, empresas de leasing para el mantenimiento de flotas y sistemas de talleres para disponer de información antes de la visita.

PKK. Inspección periódica del vehículo

Resultados de la inspección, códigos de defecto, historial y estado de la reinspección. La base de datos cubre el 75 % del mercado noruego.

Test. Datos de tasación y de estado

Valoraciones de daños, costes de reparación, precios de recambios e informes de estado completos. Úsalo para la integración de apoyo a la venta, la valoración de garantías, modelos de precios o allí donde necesites datos estructurados sobre el estado del vehículo.

Ver todos los métodos de la API Test

Aseguramiento de la calidad

Control interno, gestión de desviaciones, control de equipos y calibraciones. Relevante para el cumplimiento y la auditoría.

Más APIs

El catálogo sigue creciendo.

Oscar Inspector API

Predicciones de defectos asistidas por IA para un vehículo. La misma autenticación que la API Test: usa applicationId 5 cuando obtengas un token con token_ApplyToken2. Oscar Inspector tiene su propio endpoint y su propio esquema, separados de la API Test. Los ejemplos muestran la consulta; la respuesta depende del vehículo.

Autenticación

Cada llamada envía dos cabeceras: Authorization: Bearer <accessToken> y x-api-key: <apiKey>. La clave de API es una clave propia y de larga duración que te proporcionamos. Las claves de sandbox se obtienen contactando con nosotros. Aquí obtienes y renuevas los tokens.

La sandbox requiere iniciar sesión. Contacta con nosotros para obtener contenido de prueba.

Tipo de API GraphQL
Staging https://test.bus.no/BUSPlatform3/SecurityPortal/BUS.APIs.GraphQLServer.P3.SecurityPortal.Endpoint1
Producción https://bus2.bus.no/BUSPlatform3/SecurityPortal/BUS.APIs.GraphQLServer.P3.SecurityPortal.Endpoint1
Query token_ApplyToken2 Obtiene un id token, un access token y un refresh token para un usuario y una aplicación.

Parámetros

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

Respuesta

idToken: String
accessToken: String
refreshToken: String

Observaciones

  • Oscar Inspector requiere applicationId 5. La API Test usa un applicationId distinto.
  • accessToken es válido durante 60 minutos. refreshToken es válido durante 90 días.
  • Para renovar: usa token_RefreshToken con refreshToken. No llames a token_ApplyToken2 de nuevo en cada expiración.
  • Si refreshToken ha caducado, debes obtener un conjunto completamente nuevo con token_ApplyToken2.

Ejemplo

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

Respuesta de ejemplo

{
  "data": {
    "token_ApplyToken2": {
      "idToken": "",
      "accessToken": "",
      "refreshToken": ""
    }
  }
}
Query token_RefreshToken Renueva los tokens con un refresh token, sin volver a iniciar sesión.

Parámetros

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

Respuesta

idToken: String
accessToken: String
refreshToken: String

Observaciones

  • accessToken es válido durante 60 minutos. refreshToken es válido durante 90 días.
  • Si refreshToken ha caducado, debes obtener un conjunto completamente nuevo con token_ApplyToken2.

Ejemplo

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

Respuesta de ejemplo

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

Predicción de defectos

Defectos y necesidades de mantenimiento previstos a partir de la matrícula y el kilometraje.

La sandbox requiere iniciar sesión. Contacta con nosotros para obtener contenido de prueba.

Tipo de API GraphQL
Staging https://test.bus.no/BUSPlatform3/BUSDataPortal/BUS.APIs.GraphQLServer.P3.BUSDataPortal.ExternalEndpoint1
Producción https://bus2.bus.no/BUSPlatform3/BUSDataPortal/BUS.APIs.GraphQLServer.P3.BUSDataPortal.ExternalEndpoint1
Query busData_GetDefectPredictions Devuelve los defectos previstos para un vehículo, con probabilidad y explicación por defecto.

Parámetros

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

Respuesta

result: DefectPredictionOutput

Observaciones

  • El requestId de la respuesta se usa como originalRequestId en busData_RecordUserFeedback.

Ejemplo

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

Respuesta de ejemplo

{
  "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
    }
  }
}

Comentarios

Indica si la predicción fue correcta y obtén los motivos disponibles.

La sandbox requiere iniciar sesión. Contacta con nosotros para obtener contenido de prueba.

Tipo de API GraphQL
Staging https://test.bus.no/BUSPlatform3/BUSDataPortal/BUS.APIs.GraphQLServer.P3.BUSDataPortal.ExternalEndpoint1
Producción https://bus2.bus.no/BUSPlatform3/BUSDataPortal/BUS.APIs.GraphQLServer.P3.BUSDataPortal.ExternalEndpoint1
Query busData_GetUserFeedbackReasons Enumera los motivos que un usuario puede indicar cuando una predicción no fue correcta.

Parámetros

requestId: String?

Respuesta

result: UserFeedbackReasonOutput

Observaciones

  • userFeedbackReasonId se usa como valor en userFeedbackReasons en busData_RecordUserFeedback.

Ejemplo

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

Respuesta de ejemplo

{
  "data": {
    "busData_GetUserFeedbackReasons": {
      "requestId": "4c84c8db-3f1f-427c-b2ad-f00725f430b9",
      "userFeedbackReasons": [
        {
          "userFeedbackReasonId": 2000,
          "displayString": "Tidsbesparende",
          "userFeedbackReasonType": 1
        },
        {
          "userFeedbackReasonId": 2001,
          "displayString": "Høy treffsikkerhet",
          "userFeedbackReasonType": 1
        }
      ],
      "errorCodes": null
    }
  }
}
Mutation busData_RecordUserFeedback Registra un comentario sobre una predicción anterior.

Parámetros

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

Respuesta

result: RecordUserFeedbackOutput

Ejemplo

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
  }
}

Respuesta de ejemplo

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

Modelos de datos

Los tipos usados en los parámetros y las respuestas.

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]

Referencia de la API. Test, tasación e informe de estado

Todos los métodos de la API Test, agrupados por uso. Abre un método para ver sus parámetros, su respuesta y un ejemplo que puedes ejecutar.

Autenticación

Cada llamada envía dos cabeceras: Authorization: Bearer <accessToken> y x-api-key: <apiKey>. La clave de API es una clave propia y de larga duración que te proporcionamos. Las claves de sandbox se obtienen contactando con nosotros. Aquí obtienes y renuevas los tokens.

La sandbox requiere iniciar sesión. Contacta con nosotros para obtener contenido de prueba.

Tipo de API GraphQL
Staging https://test.bus.no/BUSPlatform3/SecurityPortal/BUS.APIs.GraphQLServer.P3.SecurityPortal.Endpoint1
Producción https://bus2.bus.no/BUSPlatform3/SecurityPortal/BUS.APIs.GraphQLServer.P3.SecurityPortal.Endpoint1
Query token_ApplyToken2 Obtiene un id token, un access token y un refresh token para un usuario y una aplicación.

Parámetros

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

Respuesta

idToken: String
accessToken: String
refreshToken: String

Observaciones

  • accessToken es válido durante 60 minutos. refreshToken es válido durante 90 días.
  • Para renovar: usa token_RefreshToken con refreshToken. No llames a token_ApplyToken2 de nuevo en cada expiración.
  • Si refreshToken ha caducado, debes obtener un conjunto completamente nuevo con token_ApplyToken2.

Ejemplo

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

Respuesta de ejemplo

{
  "data": {
    "token_ApplyToken2": {
      "idToken": "",
      "accessToken": "",
      "refreshToken": ""
    }
  }
}
Query token_RefreshToken Renueva los tokens con un refresh token, sin volver a iniciar sesión.

Parámetros

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

Respuesta

idToken: String
accessToken: String
refreshToken: String

Observaciones

  • accessToken es válido durante 60 minutos. refreshToken es válido durante 90 días.
  • Si refreshToken ha caducado, debes obtener un conjunto completamente nuevo con token_ApplyToken2.

Ejemplo

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

Respuesta de ejemplo

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

Tasaciones

Crea, lee, actualiza y lista las tasaciones, con datos del vehículo, datos de leasing e informes. Los ejemplos siguientes usan matrículas e identificadores presentes en el entorno de prueba. Contacta con nosotros al solicitar el acceso de prueba y recibirás datos de prueba adaptados a tu cuenta.

La sandbox requiere iniciar sesión. Contacta con nosotros para obtener contenido de prueba.

Tipo de API GraphQL
Staging https://test.bus.no/BUSPlatform3/BUSTest.Server/BUS.APIs.GraphQLServer.P3.BUSTest.ExternalEndpoint1
Producción https://bus2.bus.no/BUSPlatform3/BUSTest.Server/BUS.APIs.GraphQLServer.P3.BUSTest.ExternalEndpoint1
Mutation Test_CreateTest Crea una tasación nueva para un vehículo. Devuelve el id de la tasación.

Parámetros

vehicleDataModel: VehicleDataModel!
testDataModel: TestDataModel!

Obligatorio

  • testTypeIds
  • unitId
  • regNo / vin

Respuesta

result: Int

Ejemplo

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"
    }]
  }
  )
}

Respuesta de ejemplo

{
  "data": {
    "test_CreateTest": 54
  }
}
Mutation testData_CreateLeaseData Añade datos de leasing a una tasación: tipo de producto, precio de compra, referencia del contrato y más.

Parámetros

testId: Int!
leaseDataModel: LeaseDataModel!

Respuesta

result: Boolean

Ejemplo

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"
  }
  )
}

Respuesta de ejemplo

{
  "data": {
    "testData_CreateLeaseData": true
  }
}
Mutation testData_CreateLeaseUserData Añade a una tasación el cliente de leasing y los contactos: gestor de flota, conductor y más.

Parámetros

testId: Int!
leaseUserDataModel: LeaseUserDataModel!

Respuesta

result: Boolean

Ejemplo

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"
  }
  )
}

Respuesta de ejemplo

{
  "data": {
    "testData_CreateLeaseUserData": true
  }
}
Query Test_GetTest Obtiene una tasación con su estado, kilometraje e historial de mantenimiento.

Parámetros

testId: Int!

Respuesta

result: TestDataModel

Observaciones

  • Los campos de texto localizados como testStatus y los nombres de los puntos de control se devuelven en la cultura del llamante. La cultura procede del claim culture del token, con retroceso a Accept-Language. El ejemplo se capturó con cultura sueca.

Ejemplo

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

Respuesta de ejemplo

{
  "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 Obtiene las imágenes y los archivos que pertenecen a una tasación.

Parámetros

testId: Int!

Respuesta

result: [TestFileModel]

Ejemplo

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

Respuesta de ejemplo

{
  "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 Obtiene los datos del vehículo: matrícula, VIN, opciones y paquetes.

Parámetros

testId: Int!

Respuesta

result: VehicleDataModel

Ejemplo

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
  }
}

Respuesta de ejemplo

{
  "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 Obtiene los datos de leasing de una tasación.

Parámetros

testId: Int!

Respuesta

result: LeaseDataModel

Ejemplo

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

Respuesta de ejemplo

{
  "data": {
    "testData_GetLeaseData": {
      "productType": null,
      "purchasePrice": null,
      "quotationTemplate": null,
      "repairMaintenance": null,
      "transportDate": null,
      "winterTires": null
    }
  }
}
Query testData_GetLeaseUserData Obtiene el cliente de leasing y los contactos de una tasación.

Parámetros

testId: Int!

Respuesta

result: LeaseUserDataModel

Ejemplo

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

Respuesta de ejemplo

{
  "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 Lista las unidades a las que tienes acceso.

Respuesta

result: [UnitModel]

Ejemplo

query{
  unit_GetAccessibleUnits
  {
    unitId
    unitName
  }
}

Respuesta de ejemplo

{
  "data": {
    "unit_GetAccessibleUnits": [
      {
        "unitId": 1,
        "unitName": "Test unit"
      }
    ]
  }
}
Query TestType_GetTestTypes Lista los tipos de tasación disponibles para una unidad.

Parámetros

unitId: Int!
vin: String

Respuesta

result: [TestTypeModel]

Ejemplo

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

Respuesta de ejemplo

{
  "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 Actualiza una tasación existente.

Parámetros

testDataModel: TestDataModel!

Obligatorio

  • testDataModel.testId

Respuesta

result: TestDataModel

Ejemplo

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

Respuesta de ejemplo

SalesReport_CreateSalesReportFromSource
Query Test_GetAllTests Una lista de todas las tasaciones con búsqueda y ordenación, con filtros y paginación.

Parámetros

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

Respuesta

result: TestListModel

Observaciones

  • La página se pagina con skip y take. El take predeterminado es 50 y el skip predeterminado es 0. No hay un límite superior.
  • Campos ordenables: regno, vehicleMake, vehicleModel, vin, completedDate, createdDate, performedDate, performedBy, testTypes, isObdPerformed, testStatus, testAnnotations.
  • searchTerm solo coincide cuando el texto empieza por RegNo o TestAnnotations.
  • timeZoneOffset se envía en minutos y es la diferencia entre la hora UTC y la hora del cliente (UTC − hora del cliente). Si la hora sueca es +1 GMT, envía -1 para acertar el día.

Ejemplo

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 Lo mismo que arriba, pero solo con las tasaciones en curso.

Parámetros

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

Respuesta

result: TestListModel

Observaciones

  • La página se pagina con skip y take. El take predeterminado es 50 y el skip predeterminado es 0. No hay un límite superior.
  • Campos ordenables: regno, vehicleMake, vehicleModel, vin, completedDate, createdDate, performedDate, performedBy, testTypes, isObdPerformed, testStatus, testAnnotations.
  • searchTerm solo coincide cuando el texto empieza por RegNo o TestAnnotations.
  • timeZoneOffset se envía en minutos y es la diferencia entre la hora UTC y la hora del cliente (UTC − hora del cliente). Si la hora sueca es +1 GMT, envía -1 para acertar el día.

Ejemplo

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 Obtiene los enlaces a los informes de estado de una tasación, incluido el PDF.

Parámetros

testId: Int!

Obligatorio

  • int testId

Respuesta

result: [ReportModel]

Ejemplo

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

Respuesta de ejemplo

{
  "data": {
    "test_GetTestReports": [
      {
        "testTypeId": 2,
        "testType": "Test utan kostnader",
        "shortenedReportURL": "https://lnkt.bus.no/8049d5ll2"
        "shortenedPdfReportURL": "https://lnkt.bus.no/41181Ruhpp"
      }
    ]
  }
}
Query test_GetGeneralInfo Obtiene información general sobre el vehículo: llaves, cable de carga, uso anterior y más.

Parámetros

testId: Int!

Respuesta

result: GeneralInfoModel

Observaciones

  • Lee los valores actuales antes de actualizar. test_GetGeneralInfoMetaData proporciona los valores clave predefinidos.

Ejemplo

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

Respuesta de ejemplo

{ "data": { "test_GetGeneralInfo": { "masterKeyCount": 2, "chargingCableCount": 1, "previousUseId": 3, "hasPreviousDamage": false, "vehicleKeyTypes": [ { "key": 1, "value": "Remote key" } ], "chargingCableTypes": [] } } }
Mutation test_UpdateGeneralInfo Actualiza la información general sobre el vehículo.

Parámetros

testId: Int!
generalInfoModel: GeneralInfoModel!

Respuesta

result: Boolean

Observaciones

  • Leer, modificar, escribir: envía el modelo completo. Las listas vacías para vehicleKeyTypes o chargingCableTypes se rechazan; una lista vacía elimina los tipos existentes.

Ejemplo

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" }]
  })
}

Respuesta de ejemplo

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

Informes de venta

Informes de venta creados a partir de las tasaciones, con enlaces para compartir y conclusión.

La sandbox requiere iniciar sesión. Contacta con nosotros para obtener contenido de prueba.

Tipo de API GraphQL
Staging https://test.bus.no/BUSPlatform3/BUSTest.Server/BUS.APIs.GraphQLServer.P3.BUSTest.ExternalEndpoint1
Producción https://bus2.bus.no/BUSPlatform3/BUSTest.Server/BUS.APIs.GraphQLServer.P3.BUSTest.ExternalEndpoint1
Mutation SalesReport_CreateSalesReportFromSource Crea un informe de venta a partir de una tasación existente o de un vehículo.

Parámetros

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

Obligatorio

  • string regNo
  • int testRunId or int unitId

Respuesta

result: Int

Ejemplo

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

Respuesta de ejemplo

{
  "data": {
    "salesReport_CreateSalesReportFromSource": 764
  }
}
Query SalesReport_GetSalesReportShareMetaData Obtiene los enlaces para compartir el informe de venta y el informe VDN, y la descarga del PDF.

Parámetros

salesReportId: Int!

Obligatorio

  • int salesReportId

Respuesta

result: SalesReportShareMetaDataModel

Observaciones

  • salesReportPdfDownloadSasUrl solo está disponible para socios externos.

Ejemplo

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

Respuesta de ejemplo

{
  "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 Una lista de todos los informes de venta con búsqueda y ordenación.

Parámetros

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

Respuesta

result: SalesReportListModel

Observaciones

  • La página se pagina con skip y take. El take predeterminado es 50 y el skip predeterminado es 0. No hay un límite superior.
  • Campos ordenables: regno, vehicleMake, vehicleModel, vin, completedDate, salesReportStatus, createdDate, performedBy
  • searchTerm solo coincide cuando el texto empieza por RegNo.
  • timeZoneOffset se envía en minutos y es la diferencia entre la hora UTC y la hora del cliente (UTC − hora del cliente). Si la hora sueca es +1 GMT, envía -1 para acertar el día.

Ejemplo

query {
  salesReport_GetAllSalesReports(searchTerm: "WBS99A") {
            salesReports {
                salesReportId
                salesReportStatus
                salesReportStatusId
                regno
                vehicleMake
                vehicleModel
                vin
                createdDate
                completedDate
            }
            totalSalesReports
        }
    }
Query SalesReport_GetActiveSalesReports Lo mismo que arriba, pero solo con los informes de venta activos.

Parámetros

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

Respuesta

result: SalesReportListModel

Observaciones

  • La página se pagina con skip y take. El take predeterminado es 50 y el skip predeterminado es 0. No hay un límite superior.
  • Campos ordenables: regno, vehicleMake, vehicleModel, vin, completedDate, salesReportStatus, createdDate, performedBy
  • searchTerm solo coincide cuando el texto empieza por RegNo.
  • timeZoneOffset se envía en minutos y es la diferencia entre la hora UTC y la hora del cliente (UTC − hora del cliente). Si la hora sueca es +1 GMT, envía -1 para acertar el día.

Ejemplo

query {
  salesReport_GetActiveSalesReports(searchTerm: "WBS99A") {
            salesReports {
                salesReportId
                salesReportStatus
                salesReportStatusId
                regno
                vehicleMake
                vehicleModel
                vin
                createdDate
                completedDate
            }
            totalSalesReports
        }
    }
Mutation SalesReport_UpdateSalesReport Actualiza un informe de venta.

Parámetros

salesReportData: SalesReportDataModel!

Obligatorio

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

Respuesta

result: SalesReportDataModel

Ejemplo

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

Respuesta de ejemplo

{
  "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 Finaliza un informe de venta y lo envía por correo electrónico o SMS.

Parámetros

salesReportConcludeModel: SalesReportConcludeModel!

Obligatorio

  • salesReportConcludeModel.salesReportId
  • salesReportConcludeModel.sendSalesReportEmailSMSModel

Respuesta

result: Boolean

Observaciones

  • sendSalesReportEmailSMSModel es obligatorio y los enlaces de compartición generados se guardan en él. Las listas vacías de correo, números y tipos de informe no envían nada. Los destinatarios configurados por unidad se añaden al concluir. Los defectos abiertos no bloquean la conclusión.

Ejemplo

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

Respuesta de ejemplo

{ 
"data": 
           { 
                "salesReport_ConcludeSalesReport": true 
           }
 }
Mutation salesReport_AddSalesReportImages Añade imágenes a un informe de venta, con una imagen de portada opcional.

Parámetros

salesReportId: Int!
images: [SalesReportImageInputModel]!

Respuesta

result: [SalesReportImageResultModel]

Ejemplo

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
  }
}

Defectos y daños

Defectos y daños registrados en una tasación, con imágenes.

La sandbox requiere iniciar sesión. Contacta con nosotros para obtener contenido de prueba.

Tipo de API GraphQL
Staging https://test.bus.no/BUSPlatform3/BUSTest.Server/BUS.APIs.GraphQLServer.P3.BUSTest.ExternalEndpoint1
Producción https://bus2.bus.no/BUSPlatform3/BUSTest.Server/BUS.APIs.GraphQLServer.P3.BUSTest.ExternalEndpoint1
Query Defect_GetTestDefects Obtiene los defectos y daños registrados en una tasación.

Parámetros

testId: Int!

Respuesta

result: [TestDefectModel]

Observaciones

  • TotalCost es sin IVA. La interfaz puede mostrar el importe con IVA incluido.

Ejemplo

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

Respuesta de ejemplo

{
  "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 Obtiene las imágenes y los archivos adjuntos a los defectos de una tasación.

Parámetros

testId: Int!

Respuesta

result: [TestDefectFileModel]

Ejemplo

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

Respuesta de ejemplo

{
  "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 Actualiza un defecto de una tasación y de su informe de venta.

Parámetros

testId: Int!
defectFormData: TestDefectModel!

Respuesta

result: TestDefectModel

Ejemplo

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
  }
}

Respuesta de ejemplo

{
  "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"
    }
  }
}

Órdenes de trabajo

Órdenes de trabajo y trabajos para el flujo del taller.

La sandbox requiere iniciar sesión. Contacta con nosotros para obtener contenido de prueba.

Tipo de API GraphQL
Staging https://test.bus.no/BUSPlatform3/BUSTest.Server/BUS.APIs.GraphQLServer.P3.BUSTest.ExternalEndpoint1
Producción https://bus2.bus.no/BUSPlatform3/BUSTest.Server/BUS.APIs.GraphQLServer.P3.BUSTest.ExternalEndpoint1
Mutation workOrder_CreateWorkOrder Crea una orden de trabajo para un vehículo, con o sin tasación vinculada.

Parámetros

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

Obligatorio

  • testRunId (optional for standalone work order)

Respuesta

result: Int

Observaciones

  • Con testRunId la tasación debe estar concluida y se crea una tarea por defecto. Sin testRunId se crea una orden de trabajo independiente.

Ejemplo

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

Respuesta de ejemplo

{ 
"data": 
     {
          "workOrder_CreateWorkOrder": 1773
     }
 }
Mutation workOrder_CreateWorkOrderJob Añade un trabajo a una orden de trabajo.

Parámetros

workOrderJobModel: WorkOrderJobModel!

Obligatorio

  • workOrderJobModel (workOrderId and job details)

Respuesta

result: WorkOrderJobModel

Ejemplo

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

Respuesta de ejemplo

{ 
"data":
         { "workOrder_CreateWorkOrderJob": { 
                           "workOrderJobId": 28584, "jobName": "Replace wiper blades"
                   }
          }
 }
Mutation workOrder_AddStandardJobsToWorkOrderCycle Añade trabajos estándar a una orden de trabajo.

Parámetros

workOrderId: Int!
standardJobIds: [Int]!

Respuesta

result: [WorkOrderJobModel]

Ejemplo

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

Respuesta de ejemplo

{ 
"data": 
            { "workOrder_AddStandardJobsToWorkOrderCycle":
                            [ { "workOrderJobId": 28585, "jobName": "Standard service" } ] 
            }
 }
Query workOrder_GetWorkOrderJobList Obtiene todos los trabajos de una orden de trabajo.

Parámetros

workOrderId: Int!

Respuesta

result: WorkOrderJobListModel

Observaciones

  • workOrderJobStatus es un objeto anidado. Usa los identificadores de tarea obtenidos aquí al establecer el estado.

Ejemplo

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

Respuesta de ejemplo

{ 
"data":
                { "workOrder_GetWorkOrderJobList":
                                              { "count": 2, "workOrderJobs": [ 
                                                                  { "workOrderJobId": 28581, "jobName": "Defect job", "workOrderJobStatus": { "workOrderJobStatusId": 3,                             "workOrderJobStatusName": "Done" }, "testDefect": { "testDefectId": 3444 } } 
                                                             ]
                                                }
                  }
 }
Mutation workOrder_UpdateWorkOrderJobStatus Establece un nuevo estado en uno o varios trabajos.

Parámetros

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

Respuesta

result: WorkOrderStatusUpdateResult

Observaciones

  • Done aparece como corregido en el informe de venta, Open como defecto aún abierto. El estado de la orden de trabajo se mantiene sincronizado.

Ejemplo

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

Respuesta de ejemplo

{ "data": { "workOrder_UpdateWorkOrderJobStatus": { "workOrderStatusId": 2, "workOrderStatusName": "InProgress", "updatedJobs": [ { "workOrderJobId": 28581, "workOrderJobStatusId": 3, "workOrderJobStatusName": "Done" } ] } } }
Query workOrder_GetStandardJobsForWorkOrder Lista los trabajos estándar que se pueden asociar a una orden de trabajo.

Parámetros

workOrderId: Int!

Respuesta

result: [StandardJobModel]

Ejemplo

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

Respuesta de ejemplo

{
  "data": {
    "workOrder_GetStandardJobsForWorkOrder": [
      {
        "standardJobId": 723,
        "jobName": "Shenal standard - job",
        "cost": 800,
        "isTaxInclude": false
      }
    ]
  }
}
Query workOrderSettings_GetStandardJobsListForUnit Lista los trabajos estándar propios de la unidad con su coste.

Parámetros

unitId: Int!

Respuesta

result: StandardJobsGridModel

Ejemplo

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

Respuesta de ejemplo

{
  "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 Lista las ejecuciones de test que pueden convertirse en una orden de trabajo para una matrícula.

Parámetros

regNo: String!
unitId: Int!

Ejemplo

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

Respuesta de ejemplo

{
  "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 Lista todas las órdenes de trabajo. Con búsqueda, ordenación y paginación.

Parámetros

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

Respuesta

result: WorkOrderListModel

Observaciones

  • La página se pagina con skip y take. El take predeterminado es 50 y el skip predeterminado es 0. No hay un límite superior.
  • timeZoneOffset se envía en minutos y es la diferencia entre la hora UTC y la hora del cliente (UTC − hora del cliente). Si la hora sueca es +1 GMT, envía -1 para acertar el día.

Ejemplo

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

Respuesta de ejemplo

{
  "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 Lista las órdenes de trabajo que no están finalizadas.

Parámetros

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

Respuesta

result: WorkOrderListModel

Observaciones

  • La página se pagina con skip y take. El take predeterminado es 50 y el skip predeterminado es 0. No hay un límite superior.
  • timeZoneOffset se envía en minutos y es la diferencia entre la hora UTC y la hora del cliente (UTC − hora del cliente). Si la hora sueca es +1 GMT, envía -1 para acertar el día.

Ejemplo

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

Respuesta de ejemplo

{
  "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 Finaliza una orden de trabajo.

Parámetros

workOrderId: Int!

Respuesta

result: Boolean

Ejemplo

mutation{
  workOrder_ConcludeWorkOrder(workOrderId: 1832)
}

Respuesta de ejemplo

{
  "data": {
    "workOrder_ConcludeWorkOrder": true
  }
}
Mutation workOrder_ReopenWorkOrder Reabre una orden de trabajo finalizada.

Parámetros

workOrderId: Int!

Respuesta

result: Boolean

Ejemplo

mutation{
  workOrder_ReopenWorkOrder(workOrderId: 1832)
}

Respuesta de ejemplo

{
  "data": {
    "workOrder_ReopenWorkOrder": true
  }
}
Mutation workOrder_DeleteWorkOrder Elimina una orden de trabajo.

Parámetros

workOrderId: Int!

Respuesta

result: Boolean

Ejemplo

mutation{
  workOrder_DeleteWorkOrder(workOrderId: 1824)
}

Respuesta de ejemplo

{
  "data": {
    "workOrder_DeleteWorkOrder": true
  }
}
Query workOrder_GetWorkOrder Recupera una única orden de trabajo.

Parámetros

workOrderId: Int!

Respuesta

result: WorkOrderDataModel

Ejemplo

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

Respuesta de ejemplo

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

Archivos

Endpoints REST para obtener imágenes y documentos.

La sandbox requiere iniciar sesión. Contacta con nosotros para obtener contenido de prueba.

Tipo de API REST
Staging https://test.bus.no/BUSPlatform3/RestAPIServers.FileServer/api
Producción 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.

Parámetros

mediaId: String!
useRedirect: Boolean

Respuesta

Actual file

Ejemplo

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.

Parámetros

mediaId: String!

Respuesta

sasUrl expiresOn

Ejemplo

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

Tiempo real

Suscríbete a eventos en tiempo real cuando se concluye una tasación.

La sandbox requiere iniciar sesión. Contacta con nosotros para obtener contenido de prueba.

Tipo de API GraphQL
Staging wss://test.bus.no/BUSPlatform3/MessagingPortal/BUS.APIs.GraphQLServer.P3.MessagingPortal.ExternalEndpoint1
Producción wss://bus2.bus.no/BUSPlatform3/MessagingPortal/BUS.APIs.GraphQLServer.P3.MessagingPortal.ExternalEndpoint1
Subscription Test_OnTestConclude Te avisa en tiempo real cuando se ha finalizado una tasación.

Parámetros

testId: Int!

Respuesta

result: TestDataModel

Observaciones

  • Los campos de texto localizados como testStatus y los nombres de los puntos de control se devuelven en la cultura del llamante. La cultura procede del claim culture del token, con retroceso a Accept-Language. El ejemplo se capturó con cultura sueca.

Ejemplo

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

Respuesta de ejemplo

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

Webhooks

Registra un webhook y recibe eventos en tu propia URL. B.U.S. envía un POST JSON por evento y acepta cualquier código 2xx como confirmación.

La sandbox requiere iniciar sesión. Contacta con nosotros para obtener contenido de prueba.

Tipo de API GraphQL
Staging https://test.bus.no/BUSPlatform3/MessagingPortal/BUS.APIs.GraphQLServer.P3.MessagingPortal.InternalApp
Producción https://bus2.bus.no/BUSPlatform3/MessagingPortal/BUS.APIs.GraphQLServer.P3.MessagingPortal.InternalApp
Mutation notification_SubscribeWebhook Registra un webhook, general o para una unidad. Devuelve un secreto que B.U.S. incluye en cada carga útil de notificación, para que puedas confirmar que la notificación procede de nosotros.

Parámetros

webhookRegisterModel: WebhookRegisterModel (url, eventTypeId, unitId?)

Obligatorio

  • url
  • eventTypeId

Respuesta

secret: String

Observaciones

  • Cada entrega es un POST JSON. Con 2xx la notificación se considera entregada; cualquier otra respuesta se registra como error y no se reenvía.

Ejemplo

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

Respuesta de ejemplo

{
  "data": {
    "notification_SubscribeWebhook": {
      "secret": "…"
    }
  }
}
Mutation notification_UnsubscribeWebhook Elimina un webhook registrado.

Parámetros

eventTypeId: Int!
unitId: Int?

Respuesta

result: Boolean

Ejemplo

mutation{
  notification_UnsubscribeWebhook(eventTypeId:  1, unitId: 5147)
}
Webhook TestConcluded La notificación que B.U.S. envía a tu webhook cuando se ha finalizado una tasación.

Respuesta

EventName, Data (TestDataModel), Secret

Observaciones

  • Cada entrega es un POST JSON. Con 2xx la notificación se considera entregada; cualquier otra respuesta se registra como error y no se reenvía.

Ejemplo

{
  "EventName": "TestConcluded",
  "Data": { "TestId": 34626, "UnitId": 5147, "Mileage": 3234, "…": "…" },
  "Secret": "…"
}
Webhook TestDeleted La notificación que B.U.S. envía a tu webhook cuando se elimina una tasación.

Respuesta

EventName, Data (TestDataModel), Secret

Observaciones

  • Cada entrega es un POST JSON. Con 2xx la notificación se considera entregada; cualquier otra respuesta se registra como error y no se reenvía.

Ejemplo

{
  "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 notificación que B.U.S. envía a tu webhook cuando se finaliza una orden de trabajo.

Respuesta

EventName, Data (WorkOrderDataModel), Secret

Observaciones

  • Cada entrega es un POST JSON. Con 2xx la notificación se considera entregada; cualquier otra respuesta se registra como error y no se reenvía.

Ejemplo

{
  "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
}

Modelos de datos

Los tipos usados en los parámetros y las respuestas.

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

El B.U.S. Shop

¿Has creado una integración útil para talleres o concesionarios? Ponla a disposición en el B.U.S. Shop, el marketplace donde los clientes de B.U.S. encuentran y activan integraciones. Tu integración llega a tres de cada cuatro talleres de Noruega, sin necesidad de una organización de ventas propia.

Aspectos técnicos

AutenticaciónToken Bearer. Credenciales de sandbox bajo petición, producción tras aprobación.
FormatoGraphQL.
Límites de peticionesIlimitado en sandbox. Hoy no hay un límite fijo en producción. En caso de uso indebido la cuenta puede bloquearse y el servicio puede responder 429 (Too Many Requests).
WebhooksEventos en tiempo real. Nueva inspección, tasación actualizada, cambio de estado. Elige qué eventos suscribes.
CambiosNo introducimos cambios incompatibles. Las nuevas necesidades se cubren con nuevos métodos, y los métodos y campos existentes no se modifican mientras estén en uso. Pueden añadirse nuevos métodos y campos opcionales con el tiempo. Los cambios se anuncian por correo electrónico al contacto técnico.
EsquemaLa introspección está activada. Puedes obtener todo el esquema con la consulta de introspección en el endpoint, o leerlo en la sandbox de GraphQL. Cada API tiene su propio esquema: la API Test y Oscar Inspector son endpoints distintos. El esquema se genera durante la compilación, por lo que siempre está alineado con el servicio.

Preguntas frecuentes

¿Qué lenguajes/SDK son compatibles?

Basado en GraphQL. Funciona con cualquier lenguaje que pueda enviar solicitudes HTTP. Tú eliges los campos que quieres recibir.

¿Cuánto cuesta?

El sandbox es gratuito. El precio del acceso a producción depende del uso.

¿Listo para desarrollar?

Explora el catálogo de APIs o habla con un desarrollador de B.U.S.