Register new Car Owner user
Creates a new Car Owner account. Notes - Email must be unique. - Password must be at least 8 characters.
Auth: None (public endpoint).Source: CAROWNER-API-COMPLETE.md
Request Example
{
"email": "owner@minbil.io",
"password": "StrongPass123!"
}
Response Example
{
"message": "Registration successful.",
"uid": "123e4567-e89b-12d3-a456-426614174000"
}
Node.js Axios example
import axios from "axios";
const BASE_URL = process.env.MINBIL_API_BASE_URL ?? "http://localhost:5000";
const API_KEY = process.env.MINBIL_API_KEY ?? "YOUR_API_KEY";
const ACCESS_TOKEN = process.env.MINBIL_ACCESS_TOKEN ?? "YOUR_BEARER_TOKEN";
async function run() {
const response = await axios({
method: "post",
url: BASE_URL + "/api/co/auth/sign-up",
headers: {
"Content-Type": "application/json",
},
data: {
"email": "owner@minbil.io",
"password": "StrongPass123!"
},
timeout: 20000,
});
console.log(response.status, response.data);
}
run().catch((error) => {
console.error(error.response?.status, error.response?.data ?? error.message);
});
cURL example
curl -X POST 'https://api.minbil.no/api/co/auth/sign-up'\
-H 'Accept: application/json'\
-H 'Content-Type: application/json'\
-d '{"email": "owner@minbil.io", "password": "StrongPass123!"}'
Fetch example
const BASE_URL = process.env.MINBIL_API_BASE_URL ?? "http://localhost:5000";
const API_KEY = process.env.MINBIL_API_KEY ?? "YOUR_API_KEY";
const ACCESS_TOKEN = process.env.MINBIL_ACCESS_TOKEN ?? "YOUR_BEARER_TOKEN";
const response = await fetch(BASE_URL + "/api/co/auth/sign-up", {
method: "POST",
headers: {
"Content-Type": "application/json",
},
body: JSON.stringify({
"email": "owner@minbil.io",
"password": "StrongPass123!"
}),
});
const data = await response.json();
console.log(response.status, data);
Endpoint operation.
Lists bookings for the authenticated car owner. Results are grouped by `group_id` by default. Query params - `grouped` (default `1`): return grouped response. - `expand`: comma-separated tokens (e.g. `co,ws`) to include related data.
Auth: Bearer token (`Authorization: Bearer <token>`)Source: CAROWNER-API-COMPLETE.md
Response Example
[
{
"group_id": "string_value",
"items": [
{
"id": {},
"group_id": {},
"workshop_org_nr": {},
"service_id": {},
"service_title": {},
"service_description": {},
"service_price": {},
"service_start_time": {},
"service_estimated_end_time": {},
"service_actual_end_time": {},
"registration_number": {},
"attachments": {},
"status": {},
"status_display": {},
"verify_booked": {},
"verify_canceled": {},
"verify_service_done": {},
"cancel_request": {},
"messages": {},
"unread_count": {},
"time_window": {},
"can_reschedule": {},
"can_request_cancel": {},
"rating_allowed": {},
"service_rating": {},
"service_rating_message": {},
"private_service_rating": {},
"workshop_name": {},
"service_estimated_hours": {},
"carowner": {},
"workshop": {}
}
],
"summary": {},
"warnings": [
{
"code": {},
"detail": {},
"meta": {}
}
]
}
]
Node.js Axios example
import axios from "axios";
const BASE_URL = process.env.MINBIL_API_BASE_URL ?? "http://localhost:5000";
const API_KEY = process.env.MINBIL_API_KEY ?? "YOUR_API_KEY";
const ACCESS_TOKEN = process.env.MINBIL_ACCESS_TOKEN ?? "YOUR_BEARER_TOKEN";
async function run() {
const response = await axios({
method: "get",
url: BASE_URL + "/api/co/bookings",
headers: {
"Content-Type": "application/json",
Authorization: "Bearer " + ACCESS_TOKEN,
},
timeout: 20000,
});
console.log(response.status, response.data);
}
run().catch((error) => {
console.error(error.response?.status, error.response?.data ?? error.message);
});
cURL example
curl -X GET 'https://api.minbil.no/api/co/bookings'\
-H 'Accept: application/json'\
-H 'Authorization: Bearer <access-token>'
Fetch example
const BASE_URL = process.env.MINBIL_API_BASE_URL ?? "http://localhost:5000";
const API_KEY = process.env.MINBIL_API_KEY ?? "YOUR_API_KEY";
const ACCESS_TOKEN = process.env.MINBIL_ACCESS_TOKEN ?? "YOUR_BEARER_TOKEN";
const response = await fetch(BASE_URL + "/api/co/bookings", {
method: "GET",
headers: {
"Content-Type": "application/json",
Authorization: "Bearer " + ACCESS_TOKEN,
},
});
const data = await response.json();
console.log(response.status, data);
Create new booking (one or more services)
Creates a new booking (one or more services) for the authenticated car owner. Rules - All services must belong to the same workshop (`org_nr`). - If `services[]` is not provided, `service_id` + `message` are used. - Response may include `warnings[]` for potential conflicts. - all services MUST be from the same workshop (org_nr). - if services[] is not provided, service_id + message are used. - response contains warnings[] for double booking etc., but the call still succeeds.
Auth: Bearer token (`Authorization: Bearer <token>`)Source: CAROWNER-API-COMPLETE.md
Request Example
{
"org_nr": "921460929",
"service_id": 1,
"services": [
{
"service_id": 77,
"message": "string_value",
"attachments": [
{}
]
}
],
"service_start_time": "2025-11-30 09:00",
"registration_number": "BT57225",
"attachments": [
{}
],
"message": {}
}
Response Example
{
"data": {},
"meta": {
"request_id": "f59ee325-0445-4bd0-9bf1-73edcd7da151",
"generated_at": "2026-02-12T10:00:00Z"
}
}
Node.js Axios example
import axios from "axios";
const BASE_URL = process.env.MINBIL_API_BASE_URL ?? "http://localhost:5000";
const API_KEY = process.env.MINBIL_API_KEY ?? "YOUR_API_KEY";
const ACCESS_TOKEN = process.env.MINBIL_ACCESS_TOKEN ?? "YOUR_BEARER_TOKEN";
async function run() {
const response = await axios({
method: "post",
url: BASE_URL + "/api/co/bookings",
headers: {
"Content-Type": "application/json",
Authorization: "Bearer " + ACCESS_TOKEN,
},
data: {
"org_nr": "921460929",
"service_id": 1,
"services": [
{
"service_id": 77,
"message": "string_value",
"attachments": [
{}
]
}
],
"service_start_time": "2025-11-30 09:00",
"registration_number": "BT57225",
"attachments": [
{}
],
"message": {}
},
timeout: 20000,
});
console.log(response.status, response.data);
}
run().catch((error) => {
console.error(error.response?.status, error.response?.data ?? error.message);
});
cURL example
curl -X POST 'https://api.minbil.no/api/co/bookings'\
-H 'Accept: application/json'\
-H 'Authorization: Bearer <access-token>'\
-H 'Content-Type: application/json'\
-d '{"org_nr": "921460929", "service_id": 1, "services": [{"service_id": 77, "message": "string_value", "attachments": [{}]}], "service_start_time": "2025-11-30 09:00", "registration_number": "BT57225", "attachments": [{}], "message": {}}'
Fetch example
const BASE_URL = process.env.MINBIL_API_BASE_URL ?? "http://localhost:5000";
const API_KEY = process.env.MINBIL_API_KEY ?? "YOUR_API_KEY";
const ACCESS_TOKEN = process.env.MINBIL_ACCESS_TOKEN ?? "YOUR_BEARER_TOKEN";
const response = await fetch(BASE_URL + "/api/co/bookings", {
method: "POST",
headers: {
"Content-Type": "application/json",
Authorization: "Bearer " + ACCESS_TOKEN,
},
body: JSON.stringify({
"org_nr": "921460929",
"service_id": 1,
"services": [
{
"service_id": 77,
"message": "string_value",
"attachments": [
{}
]
}
],
"service_start_time": "2025-11-30 09:00",
"registration_number": "BT57225",
"attachments": [
{}
],
"message": {}
}),
});
const data = await response.json();
console.log(response.status, data);
GET/api/co/bookings/booking-statusesList all valid statuses for bookings
Returns all active booking statuses ordered by sort order.
Auth: None (public endpoint).Source: CAROWNER-API-COMPLETE.md
Response Example
[
{
"id": 1,
"code": "string_value",
"display_name": "string_value",
"sort_order": 1,
"is_active": true
}
]
Node.js Axios example
import axios from "axios";
const BASE_URL = process.env.MINBIL_API_BASE_URL ?? "http://localhost:5000";
const API_KEY = process.env.MINBIL_API_KEY ?? "YOUR_API_KEY";
const ACCESS_TOKEN = process.env.MINBIL_ACCESS_TOKEN ?? "YOUR_BEARER_TOKEN";
async function run() {
const response = await axios({
method: "get",
url: BASE_URL + "/api/co/bookings/booking-statuses",
headers: {
"Content-Type": "application/json",
},
timeout: 20000,
});
console.log(response.status, response.data);
}
run().catch((error) => {
console.error(error.response?.status, error.response?.data ?? error.message);
});
cURL example
curl -X GET 'https://api.minbil.no/api/co/bookings/booking-statuses'\
-H 'Accept: application/json'
Fetch example
const BASE_URL = process.env.MINBIL_API_BASE_URL ?? "http://localhost:5000";
const API_KEY = process.env.MINBIL_API_KEY ?? "YOUR_API_KEY";
const ACCESS_TOKEN = process.env.MINBIL_ACCESS_TOKEN ?? "YOUR_BEARER_TOKEN";
const response = await fetch(BASE_URL + "/api/co/bookings/booking-statuses", {
method: "GET",
headers: {
"Content-Type": "application/json",
},
});
const data = await response.json();
console.log(response.status, data);
POST/api/co/bookings/cancelEndpoint operation.
Cancels or requests cancellation for a booking group or a single booking.
Auth: Bearer token (`Authorization: Bearer <token>`)Source: CAROWNER-API-COMPLETE.md
Request Example
{
"group_id": "string_value",
"booking_id": 1,
"cancellation_reason": 59.9139
}
Response Example
{
"data": {},
"meta": {
"request_id": "f59ee325-0445-4bd0-9bf1-73edcd7da151",
"generated_at": "2026-02-12T10:00:00Z"
}
}
Node.js Axios example
import axios from "axios";
const BASE_URL = process.env.MINBIL_API_BASE_URL ?? "http://localhost:5000";
const API_KEY = process.env.MINBIL_API_KEY ?? "YOUR_API_KEY";
const ACCESS_TOKEN = process.env.MINBIL_ACCESS_TOKEN ?? "YOUR_BEARER_TOKEN";
async function run() {
const response = await axios({
method: "post",
url: BASE_URL + "/api/co/bookings/cancel",
headers: {
"Content-Type": "application/json",
Authorization: "Bearer " + ACCESS_TOKEN,
},
data: {
"group_id": "string_value",
"booking_id": 1,
"cancellation_reason": 59.9139
},
timeout: 20000,
});
console.log(response.status, response.data);
}
run().catch((error) => {
console.error(error.response?.status, error.response?.data ?? error.message);
});
cURL example
curl -X POST 'https://api.minbil.no/api/co/bookings/cancel'\
-H 'Accept: application/json'\
-H 'Authorization: Bearer <access-token>'\
-H 'Content-Type: application/json'\
-d '{"group_id": "string_value", "booking_id": 1, "cancellation_reason": 59.9139}'
Fetch example
const BASE_URL = process.env.MINBIL_API_BASE_URL ?? "http://localhost:5000";
const API_KEY = process.env.MINBIL_API_KEY ?? "YOUR_API_KEY";
const ACCESS_TOKEN = process.env.MINBIL_ACCESS_TOKEN ?? "YOUR_BEARER_TOKEN";
const response = await fetch(BASE_URL + "/api/co/bookings/cancel", {
method: "POST",
headers: {
"Content-Type": "application/json",
Authorization: "Bearer " + ACCESS_TOKEN,
},
body: JSON.stringify({
"group_id": "string_value",
"booking_id": 1,
"cancellation_reason": 59.9139
}),
});
const data = await response.json();
console.log(response.status, data);
GET/api/co/bookings/change-requestsEndpoint operation.
Auth: Bearer token (`Authorization: Bearer <token>`)Source: CAROWNER-API-COMPLETE.md
Response Example
[
{
"id": 1,
"booking_id": 1,
"group_id": "string_value",
"request_type": "string_value",
"status": "string_value",
"reason": "string_value",
"requested_start_time": "2026-02-12T10:00:00Z",
"created_at": "string_value",
"resolved_at": "string_value"
}
]
Node.js Axios example
import axios from "axios";
const BASE_URL = process.env.MINBIL_API_BASE_URL ?? "http://localhost:5000";
const API_KEY = process.env.MINBIL_API_KEY ?? "YOUR_API_KEY";
const ACCESS_TOKEN = process.env.MINBIL_ACCESS_TOKEN ?? "YOUR_BEARER_TOKEN";
async function run() {
const response = await axios({
method: "get",
url: BASE_URL + "/api/co/bookings/change-requests",
headers: {
"Content-Type": "application/json",
Authorization: "Bearer " + ACCESS_TOKEN,
},
timeout: 20000,
});
console.log(response.status, response.data);
}
run().catch((error) => {
console.error(error.response?.status, error.response?.data ?? error.message);
});
cURL example
curl -X GET 'https://api.minbil.no/api/co/bookings/change-requests'\
-H 'Accept: application/json'\
-H 'Authorization: Bearer <access-token>'
Fetch example
const BASE_URL = process.env.MINBIL_API_BASE_URL ?? "http://localhost:5000";
const API_KEY = process.env.MINBIL_API_KEY ?? "YOUR_API_KEY";
const ACCESS_TOKEN = process.env.MINBIL_ACCESS_TOKEN ?? "YOUR_BEARER_TOKEN";
const response = await fetch(BASE_URL + "/api/co/bookings/change-requests", {
method: "GET",
headers: {
"Content-Type": "application/json",
Authorization: "Bearer " + ACCESS_TOKEN,
},
});
const data = await response.json();
console.log(response.status, data);
POST/api/co/bookings/change-requestsEndpoint operation.
Auth: Bearer token (`Authorization: Bearer <token>`)Source: CAROWNER-API-COMPLETE.md
Request Example
{
"booking_id": 1,
"request_type": "string_value",
"requested_start_time": "2026-02-12T10:00:00Z",
"reason": "string_value"
}
Response Example
{
"id": 1,
"booking_id": 1,
"group_id": "string_value",
"request_type": "string_value",
"status": "string_value",
"reason": "string_value",
"requested_start_time": "2026-02-12T10:00:00Z",
"created_at": "string_value",
"resolved_at": "string_value"
}
Node.js Axios example
import axios from "axios";
const BASE_URL = process.env.MINBIL_API_BASE_URL ?? "http://localhost:5000";
const API_KEY = process.env.MINBIL_API_KEY ?? "YOUR_API_KEY";
const ACCESS_TOKEN = process.env.MINBIL_ACCESS_TOKEN ?? "YOUR_BEARER_TOKEN";
async function run() {
const response = await axios({
method: "post",
url: BASE_URL + "/api/co/bookings/change-requests",
headers: {
"Content-Type": "application/json",
Authorization: "Bearer " + ACCESS_TOKEN,
},
data: {
"booking_id": 1,
"request_type": "string_value",
"requested_start_time": "2026-02-12T10:00:00Z",
"reason": "string_value"
},
timeout: 20000,
});
console.log(response.status, response.data);
}
run().catch((error) => {
console.error(error.response?.status, error.response?.data ?? error.message);
});
cURL example
curl -X POST 'https://api.minbil.no/api/co/bookings/change-requests'\
-H 'Accept: application/json'\
-H 'Authorization: Bearer <access-token>'\
-H 'Content-Type: application/json'\
-d '{"booking_id": 1, "request_type": "string_value", "requested_start_time": "2026-02-12T10:00:00Z", "reason": "string_value"}'
Fetch example
const BASE_URL = process.env.MINBIL_API_BASE_URL ?? "http://localhost:5000";
const API_KEY = process.env.MINBIL_API_KEY ?? "YOUR_API_KEY";
const ACCESS_TOKEN = process.env.MINBIL_ACCESS_TOKEN ?? "YOUR_BEARER_TOKEN";
const response = await fetch(BASE_URL + "/api/co/bookings/change-requests", {
method: "POST",
headers: {
"Content-Type": "application/json",
Authorization: "Bearer " + ACCESS_TOKEN,
},
body: JSON.stringify({
"booking_id": 1,
"request_type": "string_value",
"requested_start_time": "2026-02-12T10:00:00Z",
"reason": "string_value"
}),
});
const data = await response.json();
console.log(response.status, data);
POST/api/co/bookings/rate/123Endpoint operation.
Submits a service rating for a completed booking. Rules - Rating is only allowed when the booking is completed. - Valid range: 0–5.
Auth: Bearer token (`Authorization: Bearer <token>`)Source: CAROWNER-API-COMPLETE.md
Request Example
{
"service_rating": 499.0,
"service_rating_message": "string_value",
"private_service_rating": true
}
Response Example
{
"data": {},
"meta": {
"request_id": "f59ee325-0445-4bd0-9bf1-73edcd7da151",
"generated_at": "2026-02-12T10:00:00Z"
}
}
Node.js Axios example
import axios from "axios";
const BASE_URL = process.env.MINBIL_API_BASE_URL ?? "http://localhost:5000";
const API_KEY = process.env.MINBIL_API_KEY ?? "YOUR_API_KEY";
const ACCESS_TOKEN = process.env.MINBIL_ACCESS_TOKEN ?? "YOUR_BEARER_TOKEN";
async function run() {
const response = await axios({
method: "post",
url: BASE_URL + "/api/co/bookings/rate/123",
headers: {
"Content-Type": "application/json",
Authorization: "Bearer " + ACCESS_TOKEN,
},
data: {
"service_rating": 499,
"service_rating_message": "string_value",
"private_service_rating": true
},
timeout: 20000,
});
console.log(response.status, response.data);
}
run().catch((error) => {
console.error(error.response?.status, error.response?.data ?? error.message);
});
cURL example
curl -X POST 'https://api.minbil.no/api/co/bookings/rate/123'\
-H 'Accept: application/json'\
-H 'Authorization: Bearer <access-token>'\
-H 'Content-Type: application/json'\
-d '{"service_rating": 499.0, "service_rating_message": "string_value", "private_service_rating": true}'
Fetch example
const BASE_URL = process.env.MINBIL_API_BASE_URL ?? "http://localhost:5000";
const API_KEY = process.env.MINBIL_API_KEY ?? "YOUR_API_KEY";
const ACCESS_TOKEN = process.env.MINBIL_ACCESS_TOKEN ?? "YOUR_BEARER_TOKEN";
const response = await fetch(BASE_URL + "/api/co/bookings/rate/123", {
method: "POST",
headers: {
"Content-Type": "application/json",
Authorization: "Bearer " + ACCESS_TOKEN,
},
body: JSON.stringify({
"service_rating": 499,
"service_rating_message": "string_value",
"private_service_rating": true
}),
});
const data = await response.json();
console.log(response.status, data);
GET/api/co/bookings/ratingsEndpoint operation.
Returns all ratings submitted by the authenticated car owner.
Auth: Bearer token (`Authorization: Bearer <token>`)Source: CAROWNER-API-COMPLETE.md
Response Example
{
"total": 1,
"items": [
{
"booking_id": 1,
"workshop_org_nr": "921460929",
"workshop_name": "string_value",
"service_id": 1,
"service_title": "string_value",
"registration_number": "BT57225",
"status": "string_value",
"service_start_time": "2026-02-12T10:00:00Z",
"service_estimated_end_time": "2026-02-12T10:00:00Z",
"service_actual_end_time": "2026-02-12T10:00:00Z",
"service_rating": 499.0,
"service_rating_message": "string_value",
"private_service_rating": true,
"rated_at": "string_value"
}
]
}
Node.js Axios example
import axios from "axios";
const BASE_URL = process.env.MINBIL_API_BASE_URL ?? "http://localhost:5000";
const API_KEY = process.env.MINBIL_API_KEY ?? "YOUR_API_KEY";
const ACCESS_TOKEN = process.env.MINBIL_ACCESS_TOKEN ?? "YOUR_BEARER_TOKEN";
async function run() {
const response = await axios({
method: "get",
url: BASE_URL + "/api/co/bookings/ratings",
headers: {
"Content-Type": "application/json",
Authorization: "Bearer " + ACCESS_TOKEN,
},
timeout: 20000,
});
console.log(response.status, response.data);
}
run().catch((error) => {
console.error(error.response?.status, error.response?.data ?? error.message);
});
cURL example
curl -X GET 'https://api.minbil.no/api/co/bookings/ratings'\
-H 'Accept: application/json'\
-H 'Authorization: Bearer <access-token>'
Fetch example
const BASE_URL = process.env.MINBIL_API_BASE_URL ?? "http://localhost:5000";
const API_KEY = process.env.MINBIL_API_KEY ?? "YOUR_API_KEY";
const ACCESS_TOKEN = process.env.MINBIL_ACCESS_TOKEN ?? "YOUR_BEARER_TOKEN";
const response = await fetch(BASE_URL + "/api/co/bookings/ratings", {
method: "GET",
headers: {
"Content-Type": "application/json",
Authorization: "Bearer " + ACCESS_TOKEN,
},
});
const data = await response.json();
console.log(response.status, data);
Endpoint operation.
Fetches a single booking line for the authenticated car owner. Query params - `expand`: comma-separated tokens (e.g. `co,ws`) to include related data.
Auth: Bearer token (`Authorization: Bearer <token>`)Source: CAROWNER-API-COMPLETE.md
Response Example
{
"id": 1,
"group_id": "string_value",
"workshop_org_nr": "921460929",
"service_id": 1,
"service_title": "string_value",
"service_description": "string_value",
"service_price": 499.0,
"service_start_time": "2026-02-12T10:00:00Z",
"service_estimated_end_time": "2026-02-12T10:00:00Z",
"service_actual_end_time": "2026-02-12T10:00:00Z",
"registration_number": "BT57225",
"attachments": [
{}
],
"status": "string_value",
"status_display": "string_value",
"verify_booked": true,
"verify_canceled": true,
"verify_service_done": true,
"cancel_request": true,
"messages": {},
"unread_count": 1,
"time_window": {},
"can_reschedule": true,
"can_request_cancel": true,
"rating_allowed": true,
"service_rating": 499.0,
"service_rating_message": "string_value",
"private_service_rating": true,
"workshop_name": "string_value",
"service_estimated_hours": 499.0,
"carowner": {},
"workshop": {}
}
Node.js Axios example
import axios from "axios";
const BASE_URL = process.env.MINBIL_API_BASE_URL ?? "http://localhost:5000";
const API_KEY = process.env.MINBIL_API_KEY ?? "YOUR_API_KEY";
const ACCESS_TOKEN = process.env.MINBIL_ACCESS_TOKEN ?? "YOUR_BEARER_TOKEN";
async function run() {
const response = await axios({
method: "get",
url: BASE_URL + "/api/co/bookings/123",
headers: {
"Content-Type": "application/json",
Authorization: "Bearer " + ACCESS_TOKEN,
},
timeout: 20000,
});
console.log(response.status, response.data);
}
run().catch((error) => {
console.error(error.response?.status, error.response?.data ?? error.message);
});
cURL example
curl -X GET 'https://api.minbil.no/api/co/bookings/123'\
-H 'Accept: application/json'\
-H 'Authorization: Bearer <access-token>'
Fetch example
const BASE_URL = process.env.MINBIL_API_BASE_URL ?? "http://localhost:5000";
const API_KEY = process.env.MINBIL_API_KEY ?? "YOUR_API_KEY";
const ACCESS_TOKEN = process.env.MINBIL_ACCESS_TOKEN ?? "YOUR_BEARER_TOKEN";
const response = await fetch(BASE_URL + "/api/co/bookings/123", {
method: "GET",
headers: {
"Content-Type": "application/json",
Authorization: "Bearer " + ACCESS_TOKEN,
},
});
const data = await response.json();
console.log(response.status, data);