Page Introduction

Messages namespace

This namespace page is optimized for frontend implementation with endpoint index, request/response examples, and code snippets.

  • Use auth and summary fields to configure your API client.
  • Use code snippets as starter references, not production-ready final code.
  • Validate critical mutations in interactive console before release.

CarOwner Namespace

Messages

Namespace details with request/response examples and code snippets.

16Endpoint methods

Endpoint Quick Index

Detailed Endpoints

GET/api/co/filters/search?q=string_value&query=string_value

Endpoint operation.

Free text search across workshops, addresses, services, and service categories.

Auth: Bearer token (`Authorization: Bearer <token>`)Source: CAROWNER-API-COMPLETE.md

Request Example

{}

Response Example

{
  "results": [
    {
      "org_nr": "921460929",
      "name": "string_value",
      "address_line": "string_value",
      "city": "string_value",
      "postal_code": "string_value",
      "latitude": 499.0,
      "longitude": 499.0,
      "distance_km": 499.0,
      "logo": [
        {}
      ],
      "categories": [
        {}
      ],
      "avg_rating": 499.0,
      "total_reviews": 1,
      "cheapest_service_price": 499.0,
      "services_count": 1
    }
  ],
  "count": 1,
  "query": "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/filters/search?q=string_value&query=string_value",
    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/filters/search?q=string_value&query=string_value'\
  -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/filters/search?q=string_value&query=string_value", {
  method: "GET",
  headers: {
    "Content-Type": "application/json",
    Authorization: "Bearer " + ACCESS_TOKEN,
  },
});
const data = await response.json();
console.log(response.status, data);
GET/api/co/messages/inbox?page=string_value&page_size=string_value&q=string_value

Endpoint operation.

Fetches list of message threads (per booking). Sorted by last activity (newest first).

Auth: Bearer token (`Authorization: Bearer <token>`)Source: CAROWNER-API-COMPLETE.md

Request Example

{}

Response Example

{
  "data": [
    {
      "id": 123,
      "thread_id": "string_value",
      "booking_id": 1,
      "workshop_org_nr": "921460929",
      "workshop_name": "string_value",
      "org_nr": "921460929",
      "last_message": {},
      "unread_count": 1,
      "total_messages": 1,
      "updated_at": "2026-02-12",
      "read_at": "string_value"
    }
  ],
  "meta": {
    "page": 1,
    "page_size": 1,
    "total": 1,
    "total_pages": 1,
    "has_next": true,
    "has_prev": true,
    "unread_total": 1
  },
  "links": {
    "self": "string_value",
    "first": "string_value",
    "prev": "string_value",
    "next": "string_value",
    "last": "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/messages/inbox?page=string_value&page_size=string_value&q=string_value",
    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/messages/inbox?page=string_value&page_size=string_value&q=string_value'\
  -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/messages/inbox?page=string_value&page_size=string_value&q=string_value", {
  method: "GET",
  headers: {
    "Content-Type": "application/json",
    Authorization: "Bearer " + ACCESS_TOKEN,
  },
});
const data = await response.json();
console.log(response.status, data);
OPTIONS/api/co/messages/inbox?page=string_value&page_size=string_value&q=string_value

Endpoint operation.

Fetches list of message threads (per booking). Sorted by last activity (newest first).

Auth: Bearer token (`Authorization: Bearer <token>`)Source: CAROWNER-API-COMPLETE.md

Request Example

{}

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: "options",
    url: BASE_URL + "/api/co/messages/inbox?page=string_value&page_size=string_value&q=string_value",
    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 OPTIONS 'https://api.minbil.no/api/co/messages/inbox?page=string_value&page_size=string_value&q=string_value'\
  -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/messages/inbox?page=string_value&page_size=string_value&q=string_value", {
  method: "OPTIONS",
  headers: {
    "Content-Type": "application/json",
    Authorization: "Bearer " + ACCESS_TOKEN,
  },
});
const data = await response.json();
console.log(response.status, data);
OPTIONS/api/co/messages/mark-read

Endpoint operation.

Marks workshop→car owner messages as read. Body { `thread_id`, `last_read_id?`, `last_read_at?` }

Auth: Bearer token (`Authorization: Bearer <token>`)Source: CAROWNER-API-COMPLETE.md

Request Example

{}

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: "options",
    url: BASE_URL + "/api/co/messages/mark-read",
    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 OPTIONS 'https://api.minbil.no/api/co/messages/mark-read'\
  -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/messages/mark-read", {
  method: "OPTIONS",
  headers: {
    "Content-Type": "application/json",
    Authorization: "Bearer " + ACCESS_TOKEN,
  },
});
const data = await response.json();
console.log(response.status, data);
POST/api/co/messages/mark-read

Endpoint operation.

Marks workshop→car owner messages as read. Body { `thread_id`, `last_read_id?`, `last_read_at?` }

Auth: Bearer token (`Authorization: Bearer <token>`)Source: CAROWNER-API-COMPLETE.md

Request Example

{
  "thread_id": "string_value",
  "last_read_id": 1,
  "last_read_at": "string_value"
}

Response Example

{
  "updated": 1,
  "json_updated": 1,
  "unread_count": 1,
  "read_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/messages/mark-read",
    headers: {
      "Content-Type": "application/json",
      Authorization: "Bearer " + ACCESS_TOKEN,
    },
    data: {
        "thread_id": "string_value",
        "last_read_id": 1,
        "last_read_at": "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/messages/mark-read'\
  -H 'Accept: application/json'\
  -H 'Authorization: Bearer <access-token>'\
  -H 'Content-Type: application/json'\
  -d '{"thread_id": "string_value", "last_read_id": 1, "last_read_at": "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/messages/mark-read", {
  method: "POST",
  headers: {
    "Content-Type": "application/json",
    Authorization: "Bearer " + ACCESS_TOKEN,
  },
  body: JSON.stringify({
    "thread_id": "string_value",
    "last_read_id": 1,
    "last_read_at": "string_value"
  }),
});
const data = await response.json();
console.log(response.status, data);
OPTIONS/api/co/messages/send

Endpoint operation.

Sends a message in the booking thread as the car owner. Payloads - JSON: `{ thread_id, message?, attachments?[] }` - multipart/form-data: `thread_id`, `message` (optional), `files` (1..n) Notes - At least one of `message` or attachment is required.

Auth: Bearer token (`Authorization: Bearer <token>`)Source: CAROWNER-API-COMPLETE.md

Request Example

{}

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: "options",
    url: BASE_URL + "/api/co/messages/send",
    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 OPTIONS 'https://api.minbil.no/api/co/messages/send'\
  -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/messages/send", {
  method: "OPTIONS",
  headers: {
    "Content-Type": "application/json",
    Authorization: "Bearer " + ACCESS_TOKEN,
  },
});
const data = await response.json();
console.log(response.status, data);
POST/api/co/messages/send

Endpoint operation.

Sends a message in the booking thread as the car owner. Payloads - JSON: `{ thread_id, message?, attachments?[] }` - multipart/form-data: `thread_id`, `message` (optional), `files` (1..n) Notes - At least one of `message` or attachment is required.

Auth: Bearer token (`Authorization: Bearer <token>`)Source: CAROWNER-API-COMPLETE.md

Request Example

{
  "thread_id": "string_value",
  "message": "string_value",
  "org_nr": "921460929",
  "attachments": [
    {
      "url": "string_value",
      "content_type": "string_value",
      "name": "string_value",
      "size": 1
    }
  ]
}

Response Example

{
  "message": {
    "id": 1,
    "booking_id": 1,
    "workshop_org_nr": "921460929",
    "sender_type": "string_value",
    "message_text": "string_value",
    "attachments": [
      {}
    ],
    "is_read": true,
    "created_at": "string_value",
    "text": "string_value",
    "message": "string_value",
    "content": "string_value",
    "sender_role": "string_value",
    "from": "string_value",
    "unread": true
  },
  "unread_count": 1
}
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/messages/send",
    headers: {
      "Content-Type": "application/json",
      Authorization: "Bearer " + ACCESS_TOKEN,
    },
    data: {
        "thread_id": "string_value",
        "message": "string_value",
        "org_nr": "921460929",
        "attachments": [
            {
                "url": "string_value",
                "content_type": "string_value",
                "name": "string_value",
                "size": 1
            }
        ]
    },
    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/messages/send'\
  -H 'Accept: application/json'\
  -H 'Authorization: Bearer <access-token>'\
  -H 'Content-Type: application/json'\
  -d '{"thread_id": "string_value", "message": "string_value", "org_nr": "921460929", "attachments": [{"url": "string_value", "content_type": "string_value", "name": "string_value", "size": 1}]}'
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/messages/send", {
  method: "POST",
  headers: {
    "Content-Type": "application/json",
    Authorization: "Bearer " + ACCESS_TOKEN,
  },
  body: JSON.stringify({
    "thread_id": "string_value",
    "message": "string_value",
    "org_nr": "921460929",
    "attachments": [
      {
        "url": "string_value",
        "content_type": "string_value",
        "name": "string_value",
        "size": 1
      }
    ]
  }),
});
const data = await response.json();
console.log(response.status, data);
GET/api/co/messages/thread/123?page=string_value&size=string_value

Endpoint operation.

Fetches messages in a booking thread (newest at the bottom). Sort: `created_at` ASC, `id` ASC. Notes - Alias routes: `/messages/thread/{booking_id}` and `/messages/{booking_id}`.

Auth: Bearer token (`Authorization: Bearer <token>`)Source: CAROWNER-API-COMPLETE.md

Request Example

{}

Response Example

{
  "data": [
    {
      "id": 1,
      "booking_id": 1,
      "workshop_org_nr": "921460929",
      "sender_type": "string_value",
      "message_text": "string_value",
      "attachments": [
        {}
      ],
      "is_read": true,
      "created_at": "string_value",
      "text": "string_value",
      "message": "string_value",
      "content": "string_value",
      "sender_role": "string_value",
      "from": "string_value",
      "unread": true
    }
  ],
  "meta": {
    "org_nr": "921460929",
    "page": 1,
    "page_size": 1,
    "total": 1,
    "total_pages": 1,
    "has_next": true,
    "has_prev": true,
    "unread_count": 1
  },
  "links": {
    "self": "string_value",
    "first": "string_value",
    "prev": "string_value",
    "next": "string_value",
    "last": "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/messages/thread/123?page=string_value&size=string_value",
    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/messages/thread/123?page=string_value&size=string_value'\
  -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/messages/thread/123?page=string_value&size=string_value", {
  method: "GET",
  headers: {
    "Content-Type": "application/json",
    Authorization: "Bearer " + ACCESS_TOKEN,
  },
});
const data = await response.json();
console.log(response.status, data);
OPTIONS/api/co/messages/thread/123?page=string_value&size=string_value

Endpoint operation.

Fetches messages in a booking thread (newest at the bottom). Sort: `created_at` ASC, `id` ASC. Notes - Alias routes: `/messages/thread/{booking_id}` and `/messages/{booking_id}`.

Auth: Bearer token (`Authorization: Bearer <token>`)Source: CAROWNER-API-COMPLETE.md

Request Example

{}

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: "options",
    url: BASE_URL + "/api/co/messages/thread/123?page=string_value&size=string_value",
    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 OPTIONS 'https://api.minbil.no/api/co/messages/thread/123?page=string_value&size=string_value'\
  -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/messages/thread/123?page=string_value&size=string_value", {
  method: "OPTIONS",
  headers: {
    "Content-Type": "application/json",
    Authorization: "Bearer " + ACCESS_TOKEN,
  },
});
const data = await response.json();
console.log(response.status, data);
OPTIONS/api/co/messages/thread/123/read-up-to

Endpoint operation.

Marks workshop→car owner messages as read up to and including the given message ID. Notes - Optional `last_read_at` applies to JSON thread messages.

Auth: Bearer token (`Authorization: Bearer <token>`)Source: CAROWNER-API-COMPLETE.md

Request Example

{}

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: "options",
    url: BASE_URL + "/api/co/messages/thread/123/read-up-to",
    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 OPTIONS 'https://api.minbil.no/api/co/messages/thread/123/read-up-to'\
  -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/messages/thread/123/read-up-to", {
  method: "OPTIONS",
  headers: {
    "Content-Type": "application/json",
    Authorization: "Bearer " + ACCESS_TOKEN,
  },
});
const data = await response.json();
console.log(response.status, data);
POST/api/co/messages/thread/123/read-up-to

Endpoint operation.

Marks workshop→car owner messages as read up to and including the given message ID. Notes - Optional `last_read_at` applies to JSON thread messages.

Auth: Bearer token (`Authorization: Bearer <token>`)Source: CAROWNER-API-COMPLETE.md

Request Example

{
  "last_read_id": 1,
  "last_read_at": "string_value"
}

Response Example

{
  "updated": 1,
  "json_updated": 1,
  "unread_count": 1,
  "read_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/messages/thread/123/read-up-to",
    headers: {
      "Content-Type": "application/json",
      Authorization: "Bearer " + ACCESS_TOKEN,
    },
    data: {
        "last_read_id": 1,
        "last_read_at": "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/messages/thread/123/read-up-to'\
  -H 'Accept: application/json'\
  -H 'Authorization: Bearer <access-token>'\
  -H 'Content-Type: application/json'\
  -d '{"last_read_id": 1, "last_read_at": "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/messages/thread/123/read-up-to", {
  method: "POST",
  headers: {
    "Content-Type": "application/json",
    Authorization: "Bearer " + ACCESS_TOKEN,
  },
  body: JSON.stringify({
    "last_read_id": 1,
    "last_read_at": "string_value"
  }),
});
const data = await response.json();
console.log(response.status, data);
GET/api/co/messages/123?page=string_value&size=string_value

Endpoint operation.

Fetches messages in a booking thread (newest at the bottom). Sort: `created_at` ASC, `id` ASC. Notes - Alias routes: `/messages/thread/{booking_id}` and `/messages/{booking_id}`.

Auth: Bearer token (`Authorization: Bearer <token>`)Source: CAROWNER-API-COMPLETE.md

Request Example

{}

Response Example

{
  "data": [
    {
      "id": 1,
      "booking_id": 1,
      "workshop_org_nr": "921460929",
      "sender_type": "string_value",
      "message_text": "string_value",
      "attachments": [
        {}
      ],
      "is_read": true,
      "created_at": "string_value",
      "text": "string_value",
      "message": "string_value",
      "content": "string_value",
      "sender_role": "string_value",
      "from": "string_value",
      "unread": true
    }
  ],
  "meta": {
    "org_nr": "921460929",
    "page": 1,
    "page_size": 1,
    "total": 1,
    "total_pages": 1,
    "has_next": true,
    "has_prev": true,
    "unread_count": 1
  },
  "links": {
    "self": "string_value",
    "first": "string_value",
    "prev": "string_value",
    "next": "string_value",
    "last": "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/messages/123?page=string_value&size=string_value",
    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/messages/123?page=string_value&size=string_value'\
  -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/messages/123?page=string_value&size=string_value", {
  method: "GET",
  headers: {
    "Content-Type": "application/json",
    Authorization: "Bearer " + ACCESS_TOKEN,
  },
});
const data = await response.json();
console.log(response.status, data);
OPTIONS/api/co/messages/123?page=string_value&size=string_value

Endpoint operation.

Fetches messages in a booking thread (newest at the bottom). Sort: `created_at` ASC, `id` ASC. Notes - Alias routes: `/messages/thread/{booking_id}` and `/messages/{booking_id}`.

Auth: Bearer token (`Authorization: Bearer <token>`)Source: CAROWNER-API-COMPLETE.md

Request Example

{}

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: "options",
    url: BASE_URL + "/api/co/messages/123?page=string_value&size=string_value",
    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 OPTIONS 'https://api.minbil.no/api/co/messages/123?page=string_value&size=string_value'\
  -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/messages/123?page=string_value&size=string_value", {
  method: "OPTIONS",
  headers: {
    "Content-Type": "application/json",
    Authorization: "Bearer " + ACCESS_TOKEN,
  },
});
const data = await response.json();
console.log(response.status, data);
GET/api/co/messages/123/messages?page=string_value&size=string_value

Endpoint operation.

Fetches messages in a booking thread (newest at the bottom). Sort: `created_at` ASC, `id` ASC. Notes - Alias routes: `/messages/thread/{booking_id}` and `/messages/{booking_id}`.

Auth: Bearer token (`Authorization: Bearer <token>`)Source: CAROWNER-API-COMPLETE.md

Request Example

{}

Response Example

{
  "data": [
    {
      "id": 1,
      "booking_id": 1,
      "workshop_org_nr": "921460929",
      "sender_type": "string_value",
      "message_text": "string_value",
      "attachments": [
        {}
      ],
      "is_read": true,
      "created_at": "string_value",
      "text": "string_value",
      "message": "string_value",
      "content": "string_value",
      "sender_role": "string_value",
      "from": "string_value",
      "unread": true
    }
  ],
  "meta": {
    "org_nr": "921460929",
    "page": 1,
    "page_size": 1,
    "total": 1,
    "total_pages": 1,
    "has_next": true,
    "has_prev": true,
    "unread_count": 1
  },
  "links": {
    "self": "string_value",
    "first": "string_value",
    "prev": "string_value",
    "next": "string_value",
    "last": "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/messages/123/messages?page=string_value&size=string_value",
    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/messages/123/messages?page=string_value&size=string_value'\
  -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/messages/123/messages?page=string_value&size=string_value", {
  method: "GET",
  headers: {
    "Content-Type": "application/json",
    Authorization: "Bearer " + ACCESS_TOKEN,
  },
});
const data = await response.json();
console.log(response.status, data);
OPTIONS/api/co/messages/123/messages?page=string_value&size=string_value

Endpoint operation.

Fetches messages in a booking thread (newest at the bottom). Sort: `created_at` ASC, `id` ASC. Notes - Alias routes: `/messages/thread/{booking_id}` and `/messages/{booking_id}`.

Auth: Bearer token (`Authorization: Bearer <token>`)Source: CAROWNER-API-COMPLETE.md

Request Example

{}

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: "options",
    url: BASE_URL + "/api/co/messages/123/messages?page=string_value&size=string_value",
    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 OPTIONS 'https://api.minbil.no/api/co/messages/123/messages?page=string_value&size=string_value'\
  -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/messages/123/messages?page=string_value&size=string_value", {
  method: "OPTIONS",
  headers: {
    "Content-Type": "application/json",
    Authorization: "Bearer " + ACCESS_TOKEN,
  },
});
const data = await response.json();
console.log(response.status, data);
OPTIONS/api/co/messages/123/messages/read-up-to

Endpoint operation.

Marks workshop→car owner messages as read up to and including the given message ID. Notes - Optional `last_read_at` applies to JSON thread messages.

Auth: Bearer token (`Authorization: Bearer <token>`)Source: CAROWNER-API-COMPLETE.md

Request Example

{}

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: "options",
    url: BASE_URL + "/api/co/messages/123/messages/read-up-to",
    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 OPTIONS 'https://api.minbil.no/api/co/messages/123/messages/read-up-to'\
  -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/messages/123/messages/read-up-to", {
  method: "OPTIONS",
  headers: {
    "Content-Type": "application/json",
    Authorization: "Bearer " + ACCESS_TOKEN,
  },
});
const data = await response.json();
console.log(response.status, data);