Nhà phát triển
API cho ngành ô tô
Nền tảng B.U.S. cung cấp các API cho kiểm định xe, định giá xe, đảm bảo chất lượng và phân tích xe dựa trên AI. Sandbox mở với dữ liệu thử nghiệm và tài liệu OpenAPI cho các endpoint REST. Liên hệ với chúng tôi, chúng tôi sẽ gửi thông tin đăng nhập.
Cách bắt đầu
-
Xem những gì có sẵn
Danh mục API hiển thị các endpoint khả dụng cùng tài liệu và ví dụ.
-
Xây dựng trong sandbox
Môi trường sandbox mở với dữ liệu thử nghiệm thực tế. Liên hệ với chúng tôi, chúng tôi sẽ gửi tên đăng nhập, mật khẩu và khóa API để bạn thử nghiệm. Miễn phí.
-
Chuyển sang production
Khi bạn đã sẵn sàng, hãy gửi email tới support@bus.no kèm thông tin công ty, mục đích sử dụng API và khối lượng dự kiến. Việc phê duyệt mất hai ngày làm việc. Chúng tôi xác thực cấu hình và cấp khóa production cho bạn.
Danh mục API
GraphQL. Predikerte feil for et kjøretøy
Oscar Inspector. Thông tin chi tiết về xe nhờ AI
Dự đoán các lỗi và nhu cầu bảo dưỡng dựa trên hãng, mẫu xe và số km đã đi. Được xây dựng trên hơn 20 triệu đợt kiểm định thực tế. API-first, khả dụng ở mọi thị trường, và là API nhanh nhất để bắt đầu. Được sử dụng bởi các công ty bảo hiểm, sàn giao dịch, công ty cho thuê tài chính và hệ thống xưởng dịch vụ.
PKK. Kiểm định xe định kỳ
Kết quả kiểm định, mã lỗi, lịch sử và trạng thái tái kiểm định. Nền tảng dữ liệu bao phủ 75 % thị trường Na Uy.
Test. Dữ liệu định giá và tình trạng xe
Đánh giá hư hỏng, chi phí sửa chữa, giá phụ tùng và báo cáo tình trạng xe. Được sử dụng để hỗ trợ bán hàng, đánh giá bảo hành và mô hình định giá.
Xem tất cả các phương thức trong API TestĐảm bảo chất lượng
Kiểm soát nội bộ, xử lý sai lệch, kiểm soát thiết bị và hiệu chuẩn. Phù hợp cho tuân thủ và kiểm toán.
Thêm API
Danh mục được mở rộng liên tục.
Oscar Inspector API
Dự đoán lỗi do AI hỗ trợ cho một xe. Dùng cùng cách xác thực như Test API: dùng applicationId 5 khi lấy token bằng token_ApplyToken2. Oscar Inspector có endpoint và schema riêng, tách biệt với Test API. Các ví dụ thể hiện truy vấn; câu trả lời phụ thuộc vào xe.
Xác thực
Mỗi lần gọi gửi hai header: Authorization: Bearer <accessToken> và x-api-key: <apiKey>. Khóa API là một khóa riêng, tồn tại lâu dài do chúng tôi cấp. Khóa sandbox có được khi bạn liên hệ với chúng tôi. Đây là nơi bạn lấy và gia hạn token.
| Sandbox | https://test.bus.no/BUSPlatform3/SecurityPortal/BUS.APIs.GraphQLServer.P3.SecurityPortal.Tool |
|---|
Sandbox yêu cầu đăng nhập. Hãy liên hệ để nhận nội dung kiểm thử.
| Loại API | GraphQL |
|---|---|
| Staging | https://test.bus.no/BUSPlatform3/SecurityPortal/BUS.APIs.GraphQLServer.P3.SecurityPortal.Endpoint1 |
| Môi trường sản xuất | https://bus2.bus.no/BUSPlatform3/SecurityPortal/BUS.APIs.GraphQLServer.P3.SecurityPortal.Endpoint1 |
Query token_ApplyToken2 Lấy ID token, access token và refresh token cho một người dùng và một ứng dụng.
Tham số
username: String!
password: String!
apiKey: String!
applicationId: Int! Phản hồi
idToken: String
accessToken: String
refreshToken: String Ghi chú
- Oscar Inspector yêu cầu applicationId 5. Test API dùng applicationId khác.
- accessToken có hiệu lực 60 phút. refreshToken có hiệu lực 90 ngày.
- Để gia hạn: dùng token_RefreshToken với refreshToken. Không gọi lại token_ApplyToken2 mỗi lần hết hạn.
- Nếu refreshToken đã hết hạn, bạn phải lấy một bộ hoàn toàn mới bằng token_ApplyToken2.
Ví dụ
query {
token_ApplyToken2(
username: ""
password: ""
apiKey: ""
applicationId: 5
) {
idToken
accessToken
refreshToken
}
} Phản hồi ví dụ
{
"data": {
"token_ApplyToken2": {
"idToken": "",
"accessToken": "",
"refreshToken": ""
}
}
} Query token_RefreshToken Làm mới token bằng refresh token, không cần đăng nhập lại.
Tham số
apiKey: String!
applicationId: Int!
refreshToken: String! Phản hồi
idToken: String
accessToken: String
refreshToken: String Ghi chú
- accessToken có hiệu lực 60 phút. refreshToken có hiệu lực 90 ngày.
- Nếu refreshToken đã hết hạn, bạn phải lấy một bộ hoàn toàn mới bằng token_ApplyToken2.
Ví dụ
query {
token_RefreshToken(
apiKey: "",
applicationId: 5,
refreshToken: ""
){
idToken
accessToken
refreshToken
}
} Phản hồi ví dụ
{
"data": {
"token_RefreshToken": {
"idToken": "",
"accessToken": "",
"refreshToken": ""
}
}
} Dự đoán lỗi
Lỗi và nhu cầu bảo dưỡng được dự đoán dựa trên biển số và số km đã đi.
| Sandbox | https://test.bus.no/BUSPlatform3/BUSDataPortal/BUS.APIs.GraphQLServer.P3.BUSDataPortal.Tool/ |
|---|
Sandbox yêu cầu đăng nhập. Hãy liên hệ để nhận nội dung kiểm thử.
| Loại API | GraphQL |
|---|---|
| Staging | https://test.bus.no/BUSPlatform3/BUSDataPortal/BUS.APIs.GraphQLServer.P3.BUSDataPortal.ExternalEndpoint1 |
| Môi trường sản xuất | https://bus2.bus.no/BUSPlatform3/BUSDataPortal/BUS.APIs.GraphQLServer.P3.BUSDataPortal.ExternalEndpoint1 |
Query busData_GetDefectPredictions Trả về các lỗi được dự đoán cho một xe, kèm xác suất và giải thích cho từng lỗi.
Tham số
requestId: String?
regNo: String
mileage: Int!
valuationId: Int?
inspectionId: Int?
language: String?
isMileageSuggestion: Boolean!
windowSize: Int!
refNo: String? Phản hồi
result: DefectPredictionOutput Ghi chú
- requestId trong câu trả lời được dùng làm originalRequestId trong busData_RecordUserFeedback.
Ví dụ
query {
busData_GetDefectPredictions(
requestId: "8ef2a2d7-4373-4f93-b57e-d151a192edad"
regNo: "CF66983"
mileage: 50000
) {
requestId
noOfPredictions
defectPredictions {
checkpointTypeGroupId
checkpointTypeGroup
probability
}
errorCodes
}
} Phản hồi ví dụ
{
"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
}
}
} Phản hồi
Ghi nhận dự đoán có đúng hay không và lấy các lý do có thể nêu.
| Sandbox | https://test.bus.no/BUSPlatform3/BUSDataPortal/BUS.APIs.GraphQLServer.P3.BUSDataPortal.Tool/ |
|---|
Sandbox yêu cầu đăng nhập. Hãy liên hệ để nhận nội dung kiểm thử.
| Loại API | GraphQL |
|---|---|
| Staging | https://test.bus.no/BUSPlatform3/BUSDataPortal/BUS.APIs.GraphQLServer.P3.BUSDataPortal.ExternalEndpoint1 |
| Môi trường sản xuất | https://bus2.bus.no/BUSPlatform3/BUSDataPortal/BUS.APIs.GraphQLServer.P3.BUSDataPortal.ExternalEndpoint1 |
Query busData_GetUserFeedbackReasons Liệt kê các lý do người dùng có thể nêu khi dự đoán không đúng.
Tham số
requestId: String? Phản hồi
result: UserFeedbackReasonOutput Ghi chú
- userFeedbackReasonId được dùng làm giá trị trong userFeedbackReasons ở busData_RecordUserFeedback.
Ví dụ
query {
busData_GetUserFeedbackReasons(requestId: "4c84c8db-3f1f-427c-b2ad-f00725f430b9") {
requestId
userFeedbackReasons {
userFeedbackReasonId
displayString
userFeedbackReasonType
}
errorCodes
}
} Phản hồi ví dụ
{
"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 Ghi nhận phản hồi về một dự đoán trước đó.
Tham số
requestId: String?
originalRequestId: String?
isSatisfied: Boolean!
timeTakenForFeedback: Int!
userId: Int!
username: String?
organizationId: Int!
organizationName: String?
userFeedbackReasons: [Int]
time: DateTime? Phản hồi
result: RecordUserFeedbackOutput Ví dụ
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
}
} Phản hồi ví dụ
{
"data": {
"busData_RecordUserFeedback": {
"requestId": "1e692aa0-5a9b-400f-beef-7a53e27d26a2",
"errorCodes": null
}
}
} Mô hình dữ liệu
Các kiểu được sử dụng trong tham số và phản hồi.
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] Tài liệu tham khảo API. Test, định giá xe và báo cáo tình trạng xe
Tất cả các phương thức trong API Test, được nhóm theo mục đích sử dụng. Mở một phương thức để xem tham số, phản hồi và một ví dụ bạn có thể chạy.
Xác thực
Mỗi lần gọi gửi hai header: Authorization: Bearer <accessToken> và x-api-key: <apiKey>. Khóa API là một khóa riêng, tồn tại lâu dài do chúng tôi cấp. Khóa sandbox có được khi bạn liên hệ với chúng tôi. Đây là nơi bạn lấy và gia hạn token.
| Sandbox | https://test.bus.no/BUSPlatform3/SecurityPortal/BUS.APIs.GraphQLServer.P3.SecurityPortal.Tool |
|---|
Sandbox yêu cầu đăng nhập. Hãy liên hệ để nhận nội dung kiểm thử.
| Loại API | GraphQL |
|---|---|
| Staging | https://test.bus.no/BUSPlatform3/SecurityPortal/BUS.APIs.GraphQLServer.P3.SecurityPortal.Endpoint1 |
| Môi trường sản xuất | https://bus2.bus.no/BUSPlatform3/SecurityPortal/BUS.APIs.GraphQLServer.P3.SecurityPortal.Endpoint1 |
Query token_ApplyToken2 Lấy ID token, access token và refresh token cho một người dùng và một ứng dụng.
Tham số
username: String!
password: String!
apiKey: String!
applicationId: Int! Phản hồi
idToken: String
accessToken: String
refreshToken: String Ghi chú
- accessToken có hiệu lực 60 phút. refreshToken có hiệu lực 90 ngày.
- Để gia hạn: dùng token_RefreshToken với refreshToken. Không gọi lại token_ApplyToken2 mỗi lần hết hạn.
- Nếu refreshToken đã hết hạn, bạn phải lấy một bộ hoàn toàn mới bằng token_ApplyToken2.
Ví dụ
query {
token_ApplyToken2(
username: ""
password: ""
apiKey: ""
applicationId: 13
) {
idToken
accessToken
refreshToken
}
} Phản hồi ví dụ
{
"data": {
"token_ApplyToken2": {
"idToken": "",
"accessToken": "",
"refreshToken": ""
}
}
} Query token_RefreshToken Làm mới token bằng refresh token, không cần đăng nhập lại.
Tham số
apiKey: String!
applicationId: Int!
refreshToken: String! Phản hồi
idToken: String
accessToken: String
refreshToken: String Ghi chú
- accessToken có hiệu lực 60 phút. refreshToken có hiệu lực 90 ngày.
- Nếu refreshToken đã hết hạn, bạn phải lấy một bộ hoàn toàn mới bằng token_ApplyToken2.
Ví dụ
query {
token_RefreshToken(
apiKey: "",
applicationId: 13,
refreshToken: ""
){
idToken
accessToken
refreshToken
}
} Phản hồi ví dụ
{
"data": {
"token_RefreshToken": {
"idToken": "",
"accessToken": "",
"refreshToken": ""
}
}
} Bản định giá xe
Tạo, đọc, cập nhật và liệt kê các đợt định giá, kèm dữ liệu xe, dữ liệu cho thuê và báo cáo. Các ví dụ bên dưới dùng biển số và ID có trong môi trường kiểm thử. Hãy liên hệ khi bạn yêu cầu quyền truy cập kiểm thử, bạn sẽ nhận được dữ liệu kiểm thử phù hợp với tài khoản của mình.
Sandbox yêu cầu đăng nhập. Hãy liên hệ để nhận nội dung kiểm thử.
| Loại API | GraphQL |
|---|---|
| Staging | https://test.bus.no/BUSPlatform3/BUSTest.Server/BUS.APIs.GraphQLServer.P3.BUSTest.ExternalEndpoint1 |
| Môi trường sản xuất | https://bus2.bus.no/BUSPlatform3/BUSTest.Server/BUS.APIs.GraphQLServer.P3.BUSTest.ExternalEndpoint1 |
Mutation Test_CreateTest Tạo một bản định giá xe mới cho một phương tiện. Trả về ID của bản định giá.
Tham số
vehicleDataModel: VehicleDataModel!
testDataModel: TestDataModel! Bắt buộc
-
testTypeIds -
unitId -
regNo / vin
Phản hồi
result: Int Ví dụ
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"
}]
}
)
} Phản hồi ví dụ
{
"data": {
"test_CreateTest": 54
}
} Mutation testData_CreateLeaseData Thêm dữ liệu cho thuê tài chính vào một bản định giá: loại sản phẩm, giá mua, mã tham chiếu hợp đồng và nhiều hơn nữa.
Tham số
testId: Int!
leaseDataModel: LeaseDataModel! Phản hồi
result: Boolean Ví dụ
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"
}
)
} Phản hồi ví dụ
{
"data": {
"testData_CreateLeaseData": true
}
} Mutation testData_CreateLeaseUserData Thêm khách hàng thuê tài chính và người liên hệ vào một bản định giá: người phụ trách đội xe, tài xế và nhiều hơn nữa.
Tham số
testId: Int!
leaseUserDataModel: LeaseUserDataModel! Phản hồi
result: Boolean Ví dụ
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"
}
)
} Phản hồi ví dụ
{
"data": {
"testData_CreateLeaseUserData": true
}
} Query Test_GetTest Lấy một bản định giá cùng trạng thái, số km đã đi và lịch sử bảo dưỡng.
Tham số
testId: Int! Phản hồi
result: TestDataModel Ghi chú
- Các trường văn bản bản địa hóa như testStatus và tên điểm kiểm tra được trả về theo culture của bên gọi. Culture lấy từ claim culture của token, dự phòng bằng Accept-Language. Ví dụ được ghi lại với culture Thụy Điển.
Ví dụ
query{
test_GetTest(testId: 32685)
{
testId,
externalReferenceId,
mileage,
serviceData {
date,
mileage,
comment
},
unitId,
testTypeIds,
testStatus,
testComments
}
} Phản hồi ví dụ
{
"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 Lấy hình ảnh và tệp thuộc về một bản định giá.
Tham số
testId: Int! Phản hồi
result: [TestFileModel] Ví dụ
query{
test_GetTestFiles(testId: 32685)
{
fileUrl,
fileName,
testSectionId,
mediaId
}
} Phản hồi ví dụ
{
"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 Lấy dữ liệu xe: biển số đăng ký, số khung, trang bị và gói tùy chọn.
Tham số
testId: Int! Phản hồi
result: VehicleDataModel Ví dụ
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
}
} Phản hồi ví dụ
{
"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 Lấy dữ liệu cho thuê tài chính của một bản định giá.
Tham số
testId: Int! Phản hồi
result: LeaseDataModel Ví dụ
query{
testData_GetLeaseData(testId: 21) {
productType
purchasePrice
quotationTemplate
repairMaintenance
transportDate
winterTyres
}
} Phản hồi ví dụ
{
"data": {
"testData_GetLeaseData": {
"productType": null,
"purchasePrice": null,
"quotationTemplate": null,
"repairMaintenance": null,
"transportDate": null,
"winterTires": null
}
}
} Query testData_GetLeaseUserData Lấy khách hàng thuê tài chính và người liên hệ của một bản định giá.
Tham số
testId: Int! Phản hồi
result: LeaseUserDataModel Ví dụ
query{
testData_GetLeaseUserData(testId: 21) {
customerId
customerName
fleetManagerName
fleetManagerEmail
installationRecipientEmail
kamName
kamEmail
driverName
driverPhone
driverEmail
}
} Phản hồi ví dụ
{
"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 Liệt kê các đơn vị mà bạn có quyền truy cập.
Phản hồi
result: [UnitModel] Ví dụ
query{
unit_GetAccessibleUnits
{
unitId
unitName
}
} Phản hồi ví dụ
{
"data": {
"unit_GetAccessibleUnits": [
{
"unitId": 1,
"unitName": "Test unit"
}
]
}
} Query TestType_GetTestTypes Liệt kê các loại định giá khả dụng cho một đơn vị.
Tham số
unitId: Int!
vin: String Phản hồi
result: [TestTypeModel] Ví dụ
query{
testType_GetTestTypes(unitId: 1)
{
testTypeId,
testTypeName,
isActive
}
} Phản hồi ví dụ
{
"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 Cập nhật một bản định giá hiện có.
Phản hồi
result: TestDataModel Ví dụ
mutation {
test_UpdateTest(testDataModel: {
testId: 625,
mileage: 60000
}) {
testId,
mileage
}
} Phản hồi ví dụ
SalesReport_CreateSalesReportFromSource Query Test_GetAllTests Danh sách tất cả các bản định giá có thể tìm kiếm và sắp xếp, với bộ lọc và phân trang.
Tham số
searchTerm: String
sortBy: GridSort
filters: TestFilterModel
skip: Int?
take: Int?
timeZoneOffset: Int? Phản hồi
result: TestListModel Ghi chú
- Trang được phân trang bằng skip và take. take mặc định là 50 và skip mặc định là 0. Không có giới hạn trên.
- Các trường sắp xếp được: regno, vehicleMake, vehicleModel, vin, completedDate, createdDate, performedDate, performedBy, testTypes, isObdPerformed, testStatus, testAnnotations.
- searchTerm chỉ khớp khi văn bản bắt đầu bằng RegNo hoặc TestAnnotations.
- timeZoneOffset được gửi theo phút và là chênh lệch giữa giờ UTC và giờ của máy khách (UTC − giờ máy khách). Nếu giờ Thụy Điển là +1 GMT, hãy gửi -1 để đúng ngày.
Ví dụ
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 Giống như trên, nhưng chỉ các bản định giá đang thực hiện.
Tham số
searchTerm: String
sortBy: GridSort
filters: TestFilterModel
skip: Int?
take: Int?
timeZoneOffset: Int? Phản hồi
result: TestListModel Ghi chú
- Trang được phân trang bằng skip và take. take mặc định là 50 và skip mặc định là 0. Không có giới hạn trên.
- Các trường sắp xếp được: regno, vehicleMake, vehicleModel, vin, completedDate, createdDate, performedDate, performedBy, testTypes, isObdPerformed, testStatus, testAnnotations.
- searchTerm chỉ khớp khi văn bản bắt đầu bằng RegNo hoặc TestAnnotations.
- timeZoneOffset được gửi theo phút và là chênh lệch giữa giờ UTC và giờ của máy khách (UTC − giờ máy khách). Nếu giờ Thụy Điển là +1 GMT, hãy gửi -1 để đúng ngày.
Ví dụ
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 Lấy liên kết đến các báo cáo tình trạng xe của một bản định giá, cả dưới dạng PDF.
Tham số
testId: Int! Bắt buộc
-
int testId
Phản hồi
result: [ReportModel] Ví dụ
query {
test_GetTestReports(testId: 33081) {
testTypeId
testType
shortenedReportURL
shortenedPdfReportURL
}
} Phản hồi ví dụ
{
"data": {
"test_GetTestReports": [
{
"testTypeId": 2,
"testType": "Test utan kostnader",
"shortenedReportURL": "https://lnkt.bus.no/8049d5ll2"
"shortenedPdfReportURL": "https://lnkt.bus.no/41181Ruhpp"
}
]
}
} Query test_GetGeneralInfo Lấy thông tin chung về xe: chìa khóa, cáp sạc, mục đích sử dụng trước đây và nhiều hơn nữa.
Tham số
testId: Int! Phản hồi
result: GeneralInfoModel Ghi chú
- Đọc giá trị hiện tại trước khi cập nhật. test_GetGeneralInfoMetaData cung cấp các giá trị khóa được định nghĩa trước.
Ví dụ
query {
test_GetGeneralInfo(testId: 46324) {
masterKeyCount
chargingCableCount
previousUseId
hasPreviousDamage
vehicleKeyTypes { key value }
chargingCableTypes { key value }
}
} Phản hồi ví dụ
{ "data": { "test_GetGeneralInfo": { "masterKeyCount": 2, "chargingCableCount": 1, "previousUseId": 3, "hasPreviousDamage": false, "vehicleKeyTypes": [ { "key": 1, "value": "Remote key" } ], "chargingCableTypes": [] } } } Mutation test_UpdateGeneralInfo Cập nhật thông tin chung về xe.
Tham số
testId: Int!
generalInfoModel: GeneralInfoModel! Phản hồi
result: Boolean Ghi chú
- Đọc, sửa, ghi: gửi toàn bộ model. Danh sách rỗng cho vehicleKeyTypes hoặc chargingCableTypes sẽ bị từ chối; danh sách rỗng sẽ xóa các loại hiện có.
Ví dụ
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" }]
})
} Phản hồi ví dụ
{
"data":
{
"test_UpdateGeneralInfo": true
}
} Báo cáo bán hàng
Báo cáo bán hàng được xây dựng trên các bản định giá, với liên kết chia sẻ và hoàn tất.
Sandbox yêu cầu đăng nhập. Hãy liên hệ để nhận nội dung kiểm thử.
| Loại API | GraphQL |
|---|---|
| Staging | https://test.bus.no/BUSPlatform3/BUSTest.Server/BUS.APIs.GraphQLServer.P3.BUSTest.ExternalEndpoint1 |
| Môi trường sản xuất | https://bus2.bus.no/BUSPlatform3/BUSTest.Server/BUS.APIs.GraphQLServer.P3.BUSTest.ExternalEndpoint1 |
Mutation SalesReport_CreateSalesReportFromSource Tạo một báo cáo bán hàng từ một bản định giá hoặc một phương tiện hiện có.
Tham số
regNo: String!
testRunId: Int?
unitId: Int? Bắt buộc
-
string regNo -
int testRunId or int unitId
Phản hồi
result: Int Ví dụ
mutation {
salesReport_CreateSalesReportFromSource(regNo: "ØSXXR01", unitId: 5147)
} Phản hồi ví dụ
{
"data": {
"salesReport_CreateSalesReportFromSource": 764
}
} Query SalesReport_GetSalesReportShareMetaData Lấy liên kết chia sẻ cho báo cáo bán hàng và báo cáo VDN, cùng liên kết tải PDF.
Tham số
salesReportId: Int! Bắt buộc
-
int salesReportId
Phản hồi
result: SalesReportShareMetaDataModel Ghi chú
- salesReportPdfDownloadSasUrl chỉ khả dụng cho đối tác bên ngoài.
Ví dụ
query {
salesReport_GetSalesReportShareMetaData(salesReportId: 764) {
shortenedSalesReportLinkURL
shortenedVDNReportLinkURL
shortenedSalesReportPdfURL
salesReportPdfDownloadSasUrl
}
} Phản hồi ví dụ
{
"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 Danh sách tất cả các báo cáo bán hàng có thể tìm kiếm và sắp xếp.
Tham số
searchTerm: String
sortBy: GridSort
filters: SalesReportFilterModel
skip: Int?
take: Int?
timeZoneOffset: Int? Phản hồi
result: SalesReportListModel Ghi chú
- Trang được phân trang bằng skip và take. take mặc định là 50 và skip mặc định là 0. Không có giới hạn trên.
- Các trường sắp xếp được: regno, vehicleMake, vehicleModel, vin, completedDate, salesReportStatus, createdDate, performedBy
- searchTerm chỉ khớp khi văn bản bắt đầu bằng RegNo.
- timeZoneOffset được gửi theo phút và là chênh lệch giữa giờ UTC và giờ của máy khách (UTC − giờ máy khách). Nếu giờ Thụy Điển là +1 GMT, hãy gửi -1 để đúng ngày.
Ví dụ
query {
salesReport_GetAllSalesReports(searchTerm: "WBS99A") {
salesReports {
salesReportId
salesReportStatus
salesReportStatusId
regno
vehicleMake
vehicleModel
vin
createdDate
completedDate
}
totalSalesReports
}
} Query SalesReport_GetActiveSalesReports Giống như trên, nhưng chỉ các báo cáo bán hàng đang hoạt động.
Tham số
searchTerm: String
sortBy: GridSort
filters: SalesReportFilterModel
skip: Int?
take: Int?
timeZoneOffset: Int? Phản hồi
result: SalesReportListModel Ghi chú
- Trang được phân trang bằng skip và take. take mặc định là 50 và skip mặc định là 0. Không có giới hạn trên.
- Các trường sắp xếp được: regno, vehicleMake, vehicleModel, vin, completedDate, salesReportStatus, createdDate, performedBy
- searchTerm chỉ khớp khi văn bản bắt đầu bằng RegNo.
- timeZoneOffset được gửi theo phút và là chênh lệch giữa giờ UTC và giờ của máy khách (UTC − giờ máy khách). Nếu giờ Thụy Điển là +1 GMT, hãy gửi -1 để đúng ngày.
Ví dụ
query {
salesReport_GetActiveSalesReports(searchTerm: "WBS99A") {
salesReports {
salesReportId
salesReportStatus
salesReportStatusId
regno
vehicleMake
vehicleModel
vin
createdDate
completedDate
}
totalSalesReports
}
} Mutation SalesReport_UpdateSalesReport Cập nhật một báo cáo bán hàng.
Tham số
salesReportData: SalesReportDataModel! Bắt buộc
-
salesReportData.SalesReportId -
salesReportData.TestId -
salesReportData.UnitId
Phản hồi
result: SalesReportDataModel Ví dụ
mutation UpdateSalesReport($salesReportData: SalesReportDataModelInput!) {
updatedSalesReport: salesReport_UpdateSalesReport(
salesReportData: $salesReportData
) {
testId
mileage
createdDate
completedDate
salesReportTypeIds
deviationNotes
hasBatteryReading
testStatusId
unitId
__typename
}
} Phản hồi ví dụ
{
"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 Hoàn tất một báo cáo bán hàng và gửi qua email hoặc SMS.
Tham số
salesReportConcludeModel: SalesReportConcludeModel! Bắt buộc
-
salesReportConcludeModel.salesReportId -
salesReportConcludeModel.sendSalesReportEmailSMSModel
Phản hồi
result: Boolean Ghi chú
- sendSalesReportEmailSMSModel là bắt buộc và các liên kết chia sẻ được tạo sẽ lưu trên đó. Danh sách rỗng cho email, số điện thoại và loại báo cáo sẽ không gửi gì. Người nhận được cấu hình theo đơn vị sẽ được thêm vào khi kết thúc. Các sai lệch đang mở không chặn việc kết thúc.
Ví dụ
mutation {
salesReport_ConcludeSalesReport(salesReportConcludeModel: {
salesReportId: 3180,
sendSalesReportEmailSMSModel: {
salesReportId: 3180,
emails: [],
numbers: [],
salesReportTypes: []
}
})
} Phản hồi ví dụ
{
"data":
{
"salesReport_ConcludeSalesReport": true
}
} Mutation salesReport_AddSalesReportImages Thêm hình ảnh vào một báo cáo bán hàng, với ảnh bìa tùy chọn.
Tham số
salesReportId: Int!
images: [SalesReportImageInputModel]! Phản hồi
result: [SalesReportImageResultModel] Ví dụ
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
}
} Sai lệch và hư hỏng
Các sai lệch và hư hỏng được ghi nhận trên một bản định giá, kèm hình ảnh.
Sandbox yêu cầu đăng nhập. Hãy liên hệ để nhận nội dung kiểm thử.
| Loại API | GraphQL |
|---|---|
| Staging | https://test.bus.no/BUSPlatform3/BUSTest.Server/BUS.APIs.GraphQLServer.P3.BUSTest.ExternalEndpoint1 |
| Môi trường sản xuất | https://bus2.bus.no/BUSPlatform3/BUSTest.Server/BUS.APIs.GraphQLServer.P3.BUSTest.ExternalEndpoint1 |
Query Defect_GetTestDefects Lấy các sai lệch và hư hỏng đã ghi nhận trên một bản định giá.
Tham số
testId: Int! Phản hồi
result: [TestDefectModel] Ghi chú
- TotalCost chưa gồm VAT. Giao diện có thể hiển thị số tiền đã gồm VAT.
Ví dụ
query{
defect_GetTestDefects(testId: 54)
{
testDefectId,
checkpoint {
key
value
}
checkpointComment {
key
value
}
commonCost,
workCost,
partsCost,
totalCost
}
} Phản hồi ví dụ
{
"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 Lấy hình ảnh và tệp liên quan đến các sai lệch trên một bản định giá.
Tham số
testId: Int! Phản hồi
result: [TestDefectFileModel] Ví dụ
query{
defect_GetTestDefectFiles(testId: 54)
{
testDefectId,
testDefectFiles
{
fileUrl,
fileName,
mediaId
}
}
} Phản hồi ví dụ
{
"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 Cập nhật một sai lệch trên một bản định giá và báo cáo bán hàng của nó.
Tham số
testId: Int!
defectFormData: TestDefectModel! Phản hồi
result: TestDefectModel Ví dụ
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
}
} Phản hồi ví dụ
{
"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"
}
}
} Lệnh công việc
Lệnh công việc và các công việc cho quy trình của xưởng dịch vụ.
Sandbox yêu cầu đăng nhập. Hãy liên hệ để nhận nội dung kiểm thử.
| Loại API | GraphQL |
|---|---|
| Staging | https://test.bus.no/BUSPlatform3/BUSTest.Server/BUS.APIs.GraphQLServer.P3.BUSTest.ExternalEndpoint1 |
| Môi trường sản xuất | https://bus2.bus.no/BUSPlatform3/BUSTest.Server/BUS.APIs.GraphQLServer.P3.BUSTest.ExternalEndpoint1 |
Mutation workOrder_CreateWorkOrder Tạo một lệnh công việc cho một phương tiện, có hoặc không có bản định giá liên kết.
Tham số
regNo: String!
testRunId: Int?!
unitId: Int! Bắt buộc
-
testRunId (optional for standalone work order)
Phản hồi
result: Int Ghi chú
- Với testRunId, đợt kiểm định phải đã kết thúc và mỗi sai lệch tạo ra một công việc. Không có testRunId sẽ tạo một lệnh công việc độc lập.
Ví dụ
mutation {
workOrder_CreateWorkOrder(regNo: "PHP526", testRunId: 45988, unitId: 5147)
} Phản hồi ví dụ
{
"data":
{
"workOrder_CreateWorkOrder": 1773
}
} Mutation workOrder_CreateWorkOrderJob Thêm một công việc vào một lệnh công việc.
Tham số
workOrderJobModel: WorkOrderJobModel! Bắt buộc
-
workOrderJobModel (workOrderId and job details)
Phản hồi
result: WorkOrderJobModel Ví dụ
mutation {
workOrder_CreateWorkOrderJob(workOrderJobModel: {
workOrderId: 1773,
jobName: "Replace wiper blades",
comment: "Added by partner"
}) {
workOrderJobId
jobName
}
} Phản hồi ví dụ
{
"data":
{ "workOrder_CreateWorkOrderJob": {
"workOrderJobId": 28584, "jobName": "Replace wiper blades"
}
}
} Mutation workOrder_AddStandardJobsToWorkOrderCycle Thêm các công việc tiêu chuẩn vào một lệnh công việc.
Tham số
workOrderId: Int!
standardJobIds: [Int]! Phản hồi
result: [WorkOrderJobModel] Ví dụ
mutation {
workOrder_AddStandardJobsToWorkOrderCycle(workOrderId: 1773, standardJobIds: [101, 205]) {
workOrderJobId
jobName
}
} Phản hồi ví dụ
{
"data":
{ "workOrder_AddStandardJobsToWorkOrderCycle":
[ { "workOrderJobId": 28585, "jobName": "Standard service" } ]
}
} Query workOrder_GetWorkOrderJobList Lấy tất cả các công việc trong một lệnh công việc.
Tham số
workOrderId: Int! Phản hồi
result: WorkOrderJobListModel Ghi chú
- workOrderJobStatus là một đối tượng lồng nhau. Dùng các ID công việc nhận được ở đây khi đặt trạng thái.
Ví dụ
query {
workOrder_GetWorkOrderJobList(workOrderId: 1773) {
count
workOrderJobs {
workOrderJobId
jobName
workOrderJobStatus {
workOrderJobStatusId
workOrderJobStatusName
}
testDefect {
testDefectId
}
}
}
} Phản hồi ví dụ
{
"data":
{ "workOrder_GetWorkOrderJobList":
{ "count": 2, "workOrderJobs": [
{ "workOrderJobId": 28581, "jobName": "Defect job", "workOrderJobStatus": { "workOrderJobStatusId": 3, "workOrderJobStatusName": "Done" }, "testDefect": { "testDefectId": 3444 } }
]
}
}
} Mutation workOrder_UpdateWorkOrderJobStatus Đặt trạng thái mới cho một hoặc nhiều công việc.
Tham số
workOrderId: Int!
workOrderJobIds: [Int]!
workOrderJobStatusId: Int! Phản hồi
result: WorkOrderStatusUpdateResult Ghi chú
- Done hiển thị là đã khắc phục trên báo cáo bán hàng, Open là sai lệch còn mở. Trạng thái lệnh công việc được giữ đồng bộ.
Ví dụ
mutation {
workOrder_UpdateWorkOrderJobStatus(
workOrderId: 1773,
workOrderJobIds: [28581, 28582],
workOrderJobStatusId: 3
) {
workOrderStatusId
workOrderStatusName
updatedJobs {
workOrderJobId
workOrderJobStatusId
workOrderJobStatusName
}
}
} Phản hồi ví dụ
{ "data": { "workOrder_UpdateWorkOrderJobStatus": { "workOrderStatusId": 2, "workOrderStatusName": "InProgress", "updatedJobs": [ { "workOrderJobId": 28581, "workOrderJobStatusId": 3, "workOrderJobStatusName": "Done" } ] } } } Query workOrder_GetStandardJobsForWorkOrder Liệt kê các công việc tiêu chuẩn có thể liên kết với một lệnh công việc.
Tham số
workOrderId: Int! Phản hồi
result: [StandardJobModel] Ví dụ
query{
workOrder_GetStandardJobsForWorkOrder(
workOrderId: 1832)
{
standardJobId
jobName
cost
isTaxInclude
}
} Phản hồi ví dụ
{
"data": {
"workOrder_GetStandardJobsForWorkOrder": [
{
"standardJobId": 723,
"jobName": "Shenal standard - job",
"cost": 800,
"isTaxInclude": false
}
]
}
} Query workOrderSettings_GetStandardJobsListForUnit Liệt kê các công việc tiêu chuẩn riêng của đơn vị, kèm chi phí.
Tham số
unitId: Int! Phản hồi
result: StandardJobsGridModel Ví dụ
query{
workOrderSettings_GetStandardJobsListForUnit(unitId: 5208)
{
totalStandardJobs
standardJobs {
standardJobId
jobName
cost
}
}
} Phản hồi ví dụ
{
"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 Liệt kê các lượt chạy thử đủ điều kiện để trở thành một lệnh công việc cho một biển số đăng ký.
Tham số
regNo: String!
unitId: Int! Phản hồi
result: WorkOrderCreationTestRunListModel Ví dụ
query{
workOrder_GetTestRunsForWorkOrderCreation(
regNo: "AOL449"
, unitId: 5147
)
{
isRegNoValid
items {
testId
testRunId
mileage
}
}
} Phản hồi ví dụ
{
"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 Liệt kê tất cả các lệnh công việc. Có thể tìm kiếm, sắp xếp và phân trang.
Tham số
searchTerm: String
sortBy: GridSort
filters: WorkOrderFilterModel
skip: Int?
take: Int?
timeZoneOffset: Int Phản hồi
result: WorkOrderListModel Ghi chú
- Trang được phân trang bằng skip và take. take mặc định là 50 và skip mặc định là 0. Không có giới hạn trên.
- timeZoneOffset được gửi theo phút và là chênh lệch giữa giờ UTC và giờ của máy khách (UTC − giờ máy khách). Nếu giờ Thụy Điển là +1 GMT, hãy gửi -1 để đúng ngày.
Ví dụ
query{
workOrder_GetAllWorkOrders(
searchTerm: "AOL449"
timeZoneOffset: 0
)
{
totalWorkOrders
workOrders
{
testId
workOrderId
vehicleMake
vehicleModel
}
}
}
} Phản hồi ví dụ
{
"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 Liệt kê các lệnh công việc chưa kết thúc.
Tham số
searchTerm: String
sortBy: GridSort
filters: WorkOrderFilterModel
skip: Int?
take: Int?
timeZoneOffset: Int Phản hồi
result: WorkOrderListModel Ghi chú
- Trang được phân trang bằng skip và take. take mặc định là 50 và skip mặc định là 0. Không có giới hạn trên.
- timeZoneOffset được gửi theo phút và là chênh lệch giữa giờ UTC và giờ của máy khách (UTC − giờ máy khách). Nếu giờ Thụy Điển là +1 GMT, hãy gửi -1 để đúng ngày.
Ví dụ
query{
workOrder_GetActiveWorkOrders(
searchTerm: "AOL449"
timeZoneOffset: 0
)
{
totalWorkOrders
workOrders
{
testId
workOrderId
vehicleMake
vehicleModel
}
}
}
} Phản hồi ví dụ
{
"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 Kết thúc một lệnh công việc.
Tham số
workOrderId: Int! Phản hồi
result: Boolean Ví dụ
mutation{
workOrder_ConcludeWorkOrder(workOrderId: 1832)
} Phản hồi ví dụ
{
"data": {
"workOrder_ConcludeWorkOrder": true
}
} Mutation workOrder_ReopenWorkOrder Mở lại một lệnh công việc đã kết thúc.
Tham số
workOrderId: Int! Phản hồi
result: Boolean Ví dụ
mutation{
workOrder_ReopenWorkOrder(workOrderId: 1832)
} Phản hồi ví dụ
{
"data": {
"workOrder_ReopenWorkOrder": true
}
} Mutation workOrder_DeleteWorkOrder Xóa một lệnh công việc.
Tham số
workOrderId: Int! Phản hồi
result: Boolean Ví dụ
mutation{
workOrder_DeleteWorkOrder(workOrderId: 1824)
} Phản hồi ví dụ
{
"data": {
"workOrder_DeleteWorkOrder": true
}
} Query workOrder_GetWorkOrder Lấy một lệnh công việc.
Tham số
workOrderId: Int! Phản hồi
result: WorkOrderDataModel Ví dụ
query{
workOrder_GetWorkOrder(workOrderId: 1832)
{
workOrderId
regNo
mileage
workOrderStatusId
}
} Phản hồi ví dụ
{
"data": {
"workOrder_GetWorkOrder": {
"workOrderId": 1832,
"regNo": "AOL449",
"mileage": 45000,
"workOrderStatusId": 5
}
}
} Tệp
Các endpoint REST để lấy hình ảnh và tài liệu.
Sandbox yêu cầu đăng nhập. Hãy liên hệ để nhận nội dung kiểm thử.
| Loại API | REST |
|---|---|
| Staging | https://test.bus.no/BUSPlatform3/RestAPIServers.FileServer/api |
| Môi trường sản xuất | 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.
Tham số
mediaId: String!
useRedirect: Boolean Phản hồi
Actual file Ví dụ
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.
Tham số
mediaId: String! Phản hồi
sasUrl expiresOn Ví dụ
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...' Thời gian thực
Đăng ký nhận sự kiện thời gian thực khi một đợt định giá kết thúc.
Sandbox yêu cầu đăng nhập. Hãy liên hệ để nhận nội dung kiểm thử.
| Loại API | GraphQL |
|---|---|
| Staging | wss://test.bus.no/BUSPlatform3/MessagingPortal/BUS.APIs.GraphQLServer.P3.MessagingPortal.ExternalEndpoint1 |
| Môi trường sản xuất | wss://bus2.bus.no/BUSPlatform3/MessagingPortal/BUS.APIs.GraphQLServer.P3.MessagingPortal.ExternalEndpoint1 |
Subscription Test_OnTestConclude Thông báo theo thời gian thực khi một bản định giá kết thúc.
Tham số
testId: Int! Phản hồi
result: TestDataModel Ghi chú
- Các trường văn bản bản địa hóa như testStatus và tên điểm kiểm tra được trả về theo culture của bên gọi. Culture lấy từ claim culture của token, dự phòng bằng Accept-Language. Ví dụ được ghi lại với culture Thụy Điển.
Ví dụ
subscription{
test_OnTestConclude(testId: 54)
{
testId,
mileage,
serviceData {
date,
mileage,
comment
},
unitId,
testTypeIds,
testStatus
}
} Phản hồi ví dụ
{
"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
Đăng ký webhook và nhận sự kiện tại URL của bạn. B.U.S. gửi một POST JSON cho mỗi sự kiện và chấp nhận mọi mã 2xx là xác nhận.
Sandbox yêu cầu đăng nhập. Hãy liên hệ để nhận nội dung kiểm thử.
| Loại API | GraphQL |
|---|---|
| Staging | https://test.bus.no/BUSPlatform3/MessagingPortal/BUS.APIs.GraphQLServer.P3.MessagingPortal.InternalApp |
| Môi trường sản xuất | https://bus2.bus.no/BUSPlatform3/MessagingPortal/BUS.APIs.GraphQLServer.P3.MessagingPortal.InternalApp |
Mutation notification_SubscribeWebhook Đăng ký webhook, chung hoặc cho một đơn vị. Trả về một secret mà B.U.S. đặt trong mỗi payload thông báo để bạn có thể xác nhận thông báo đến từ chúng tôi.
Tham số
webhookRegisterModel: WebhookRegisterModel (url, eventTypeId, unitId?) Bắt buộc
-
url -
eventTypeId
Phản hồi
secret: String Ghi chú
- Mỗi lần giao là một POST JSON. Với 2xx, thông báo được coi là đã giao; mọi phản hồi khác được ghi log là lỗi và không gửi lại.
Ví dụ
mutation{
notification_SubscribeWebhook(webhookRegisterModel: {
url: "https://example.com/webhook",
eventTypeId: 1,
unitId: null
}
){
secret
}
} Phản hồi ví dụ
{
"data": {
"notification_SubscribeWebhook": {
"secret": "…"
}
}
} Mutation notification_UnsubscribeWebhook Gỡ một webhook đã đăng ký.
Tham số
eventTypeId: Int!
unitId: Int? Phản hồi
result: Boolean Ví dụ
mutation{
notification_UnsubscribeWebhook(eventTypeId: 1, unitId: 5147)
} Webhook TestConcluded Thông báo mà B.U.S. gửi đến webhook của bạn khi một bản định giá kết thúc.
Phản hồi
EventName, Data (TestDataModel), Secret Ghi chú
- Mỗi lần giao là một POST JSON. Với 2xx, thông báo được coi là đã giao; mọi phản hồi khác được ghi log là lỗi và không gửi lại.
Ví dụ
{
"EventName": "TestConcluded",
"Data": { "TestId": 34626, "UnitId": 5147, "Mileage": 3234, "…": "…" },
"Secret": "…"
} Webhook TestDeleted Thông báo mà B.U.S. gửi đến webhook của bạn khi một bản định giá bị xóa.
Phản hồi
EventName, Data (TestDataModel), Secret Ghi chú
- Mỗi lần giao là một POST JSON. Với 2xx, thông báo được coi là đã giao; mọi phản hồi khác được ghi log là lỗi và không gửi lại.
Ví dụ
{
"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 Thông báo mà B.U.S. gửi đến webhook của bạn khi một lệnh công việc kết thúc.
Phản hồi
EventName, Data (WorkOrderDataModel), Secret Ghi chú
- Mỗi lần giao là một POST JSON. Với 2xx, thông báo được coi là đã giao; mọi phản hồi khác được ghi log là lỗi và không gửi lại.
Ví dụ
{
"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
} Mô hình dữ liệu
Các kiểu được sử dụng trong tham số và phản hồi.
TestDataModel
UnitId: Int?
Mileage: Int?
ParkingLocation: String?
KeyLocation: String
TestStatus: String
TestTypeIds: [Int]
ServiceData: [ServiceMileageModel]
TestComments: [String]
ExternalReferenceId: String
TestAnnotations: [String]
testOrderedBy: String VehicleDataModel
RegNo: String
Vin: String
VehicleType: String
TrimLevel: String
VehicleOptions: [VehicleOptionModel]
VehiclePackages: [VehiclePackageModel]
Color: String
Model: String
Make: String
GearBox: String
Engine: String
ManufacturedYear: Int?
ManufacturedMonth: Int?
Co2Emissions: Decimal? ServiceMileageModel
Date: DateTime?
Mileage: Int?
Comment: String? TestDefectModel
TestDefectId: Int
Checkpoint: KeyValueModel
CheckpointComment: KeyValueModel
CommonCost: Decimal
WorkCost: Decimal
PartsCost: Decimal
TotalCost: Decimal TestTypeModel
TestTypeId: Int
TestTypeName: String TestFileModel
FileUrl: String
FileName: String
FileReference: String
mediaId: String
testSectionId: Int TestDefectFileModel
TestDefectFiles: [TestFileModel]
TestDefectId: Int KeyValueModel
Key: Int
Value: String VehicleOptionModel
OptionName: String
IncludedItems: String
IsSelected: Boolean? VehiclePackageModel
PackageName: String
VehicleOptions: [VehicleOptionModel]
IsSelected: Boolean? LeaseDataModel
PurchasePrice: Decimal?
ProductType: String
RepairMaintenance: String
WinterTires: String
TransportDate: DateTime?
QuotationTemplate: String LeaseUserDataModel
CustomerId: String
CustomerName: String
FleetManagerName: String
FleetManagerEmail: String
InstallationRecipientEmail: String
KamName: String
KamEmail: String
DriverName: String
DriverPhone: String
DriverEmail: String UnitModel
unitId: Int
unitName: String TestListModel
tests: [TestGridInformationModel]
totalTests: Int TestGridInformationModel
TestId: Int?
TestStatus: String
Regno: String
VehicleMake: String
VehicleModel: String
Vin: String
TestTypes: String
TestPersonId: Int?
IsActiveTest: Boolean
IsTestConcluded: Boolean
IsObdPerformed: Boolean
PerformedBy: String
PerformedDate: DateTime?
CreatedDate: DateTime
CompletedDate: DateTime?
TestAnnotations: String GridSort
Field: String
Dir: SortDirection SortDirection
enum SortDirection{
Asc
Desc
} TestFilterModel
OrderedBy: [KeyValueModel]
TestDate: KeyValueModel
TestType: [KeyValueModel]
Status: [KeyValueModel]
CompletedDate: KeyValueModel ReportModel
TestTypeId: Int
TestType: String
ReportURL: String
ShortenedReportURL: String
ShortenedPdfReportURL: String
DownloadUrl: String SalesReportFilterModel
CompletedDate: KeyValueModel
Status: [KeyValueModel]
PerformedBy: [KeyValueModel]
CreatedDate: KeyValueModel WorkOrderFilterModel
CreatedDate: KeyValueModel
CompletedDate: KeyValueModel
SharedStatus: KeyValueModel
Status: [KeyValueModel]
WorkOrderUnit: [KeyValueModel]
Unit: [Int] SalesReportListModel
SalesReports: [SalesReportGridInformationModel]
TotalSalesReports: Int SalesReportGridInformationModel
SalesReportId: Int
SalesReportStatus: String
SalesReportStatusId: Int?
Regno: String
VehicleMake: String
VehicleModel: String
Vin: String
CreatedDate: DateTime
CompletedDate: DateTime? WorkOrderJobModel
WorkOrderJobId
WorkOrderId
WorkOrderJobTypeId
JobName
WorkOrderJobStatus: WorkOrderJobStatusModel
IsShared
IsSentToSupplier
ExternalCost
RepairCost
Supplier
TestDefect
Comment
StandardJob
StartDate
CompletionDate WorkOrderJobListModel
Count
WorkOrderJobs: [WorkOrderJobModel] WorkOrderStatusUpdateResult
WorkOrderStatusId
WorkOrderStatusName
UpdatedJobs: [WorkOrderJobStatusModel] WorkOrderJobStatusModel
WorkOrderJobId
WorkOrderJobStatusId
IsSentToSupplier
WorkOrderJobStatusName GeneralInfoModel
MasterKeyCount
ChargingCableCount
PreviousUseId
HasPreviousDamage
IsLuggageCoverAvailable
IsTemperatureMeasured
TemperatureInside
TemperatureOutside
ACTestSkipReasonId
LocknutsAvailabilityStatusId
NextServiceDate
VehicleKeyTypes
ChargingCableTypes SalesReportConcludeModel
SalesReportId
SendSalesReportEmailSMSModel SendSalesReportEmailSMSModel
SalesReportId
SalesReportTypes
Emails
Numbers
Description
ShortenedSalesReportLinkURL
ShortenedVDNReportLinkURL
ShortenedSalesReportPdfURL
SalesReportPdfDownloadSasUrl StandardJobModel
StandardJobId: Int
StandardJobStatusId: Int
ParentStandardJobId: Int?
JobName: String
Cost: Decimal?
IsTaxInclude: Boolean
IsIncludedInCycle: Boolean
SupplierName: String WorkOrderCreationTestRunListModel
Items: [WorkOrderCreationTestRunModel] WorkOrderCreationTestRunModel
TestId: Int?
TestRunId: Int
WorkOrderId: Int?
TestTypeNames: [String]
TestRunStatuses: TestRunStatusesModel
Mileage: Int
Date: DateTime
UnitName: String TestRunStatusesModel
TestStatus: KeyValuePair<Int, String>?
WorkOrderStatus: KeyValuePair<Int, String>?
SalesReportStatus: KeyValuePair<Int, String>?
PreTestStatus: KeyValuePair<Int, String>? WorkOrderListModel
WorkOrders: [WorkOrderGridInformationModel]
TotalWorkOrders: Int WorkOrderGridInformationModel
TestId: Int
WorkOrderId: Int
WorkOrderStatus: String
Regno: String
VehicleMake: String
VehicleModel: String
Vin: String
CreatedDate: DateTime
CompletedDate: DateTime?
UnitId: Int
UnitName: String SalesReportImageResultModel
FileName: String
IsSuccess: Boolean
Reason: String
AttachmentOrder: Int? SalesReportImageInputModel
Url: String
FileName: String
IsCover: Boolean WorkOrderDataModel
WorkOrderId: Int
TestId: Int
TestRunId: Int?
UnitId: Int
Mileage: Int?
JobsStartDate: DateTime?
JobsCompletionDate: DateTime?
WorkOrderStatusId: Int?
RegNo: String? StandardJobsGridModel
StandardJobs: [StandardJobModel]
TotalStandardJobs: Int B.U.S. Shop
Bạn đã xây dựng một tích hợp hữu ích cho xưởng dịch vụ hoặc đại lý? Hãy cung cấp nó trong B.U.S. Shop. Đây là chợ ứng dụng nơi khách hàng B.U.S. tìm và kích hoạt các tích hợp. Tích hợp của bạn tiếp cận ba trong bốn xưởng dịch vụ tại Na Uy, mà không cần tổ chức bán hàng riêng.
Kỹ thuật
| Xác thực | Token Bearer. Thông tin đăng nhập sandbox theo yêu cầu, môi trường sản xuất sau khi được phê duyệt. |
|---|---|
| Định dạng | GraphQL. |
| Giới hạn tần suất | Không giới hạn trong sandbox. Hiện chưa có giới hạn cố định ở môi trường sản xuất. Nếu lạm dụng, tài khoản có thể bị khóa và dịch vụ có thể trả về 429 (Too Many Requests). |
| Webhook | Sự kiện thời gian thực. Lần kiểm định mới, định giá được cập nhật, thay đổi trạng thái. Chọn sự kiện bạn muốn đăng ký. |
| Thay đổi | Chúng tôi không đưa vào các thay đổi phá vỡ tương thích. Nhu cầu mới được đáp ứng bằng các phương thức mới, và các phương thức cùng trường hiện có không bị thay đổi chừng nào còn được sử dụng. Các phương thức mới và trường tùy chọn có thể được bổ sung dần. Các thay đổi được thông báo qua email tới đầu mối kỹ thuật. |
| Schema | Introspection được bật. Bạn có thể lấy toàn bộ schema bằng truy vấn introspection tại endpoint, hoặc đọc trong sandbox GraphQL. Mỗi API có schema riêng: Test API và Oscar Inspector là các endpoint tách biệt. Schema được tạo khi build nên luôn khớp với dịch vụ. |
FAQ
Hỗ trợ những ngôn ngữ/SDK nào?
Dựa trên GraphQL. Hoạt động với mọi ngôn ngữ có thể gửi HTTP request. Bạn tự chọn những trường muốn nhận về.
Chi phí là bao nhiêu?
Sandbox miễn phí. Giá cho quyền truy cập production phụ thuộc vào mức sử dụng.
Sẵn sàng xây dựng?
Khám phá danh mục API, hoặc trao đổi với một lập trình viên của chúng tôi.