Skip to content

Commit 141cc17

Browse files
github-actions[bot]github-actions
andauthored
Support mark as read by token API (#1443)
line/line-openapi#115 ## Support for "Mark as Read" by Token API We have released a new **Mark as Read API** that allows developers to mark a user’s messages as read. Previously, this functionality was available only to partners, but it is now publicly available. When your server receives a user message via Webhook, the `MessageEvent` will include a new field: `markAsReadToken`. By calling the Mark as Read API with this token, all messages in the chat room **up to and including** that message will be marked as read. > **Note:** This feature assumes that your service uses the chat feature through Official Account Manager. > If chat is not enabled, messages from users are automatically marked as read, making this API unnecessary. For more details, please refer to the release note: https://developers.line.biz/en/news/2025/11/05/mark-as-read/ Co-authored-by: github-actions <github-actions@github.com>
1 parent edf0e03 commit 141cc17

13 files changed

+168
-1
lines changed

lib/messaging-api/.openapi-generator/FILES

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -121,6 +121,7 @@ model/locationAction.ts
121121
model/locationMessage.ts
122122
model/lotteryAcquisitionConditionRequest.ts
123123
model/lotteryAcquisitionConditionResponse.ts
124+
model/markMessagesAsReadByTokenRequest.ts
124125
model/markMessagesAsReadRequest.ts
125126
model/membersIdsResponse.ts
126127
model/membership.ts

lib/messaging-api/api/messagingApiClient.ts

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ import { GroupMemberCountResponse } from "../model/groupMemberCountResponse.js";
2828
import { GroupSummaryResponse } from "../model/groupSummaryResponse.js";
2929
import { GroupUserProfileResponse } from "../model/groupUserProfileResponse.js";
3030
import { IssueLinkTokenResponse } from "../model/issueLinkTokenResponse.js";
31+
import { MarkMessagesAsReadByTokenRequest } from "../model/markMessagesAsReadByTokenRequest.js";
3132
import { MarkMessagesAsReadRequest } from "../model/markMessagesAsReadRequest.js";
3233
import { MembersIdsResponse } from "../model/membersIdsResponse.js";
3334
import { MembershipListResponse } from "../model/membershipListResponse.js";
@@ -1632,6 +1633,39 @@ export class MessagingApiClient {
16321633
const parsedBody = text ? JSON.parse(text) : null;
16331634
return { httpResponse: res, body: parsedBody };
16341635
}
1636+
/**
1637+
* Mark messages from users as read by token
1638+
* @param markMessagesAsReadByTokenRequest
1639+
*
1640+
* @see <a href="https://developers.line.biz/en/reference/messaging-api/#mark-as-read"> Documentation</a>
1641+
*/
1642+
public async markMessagesAsReadByToken(
1643+
markMessagesAsReadByTokenRequest: MarkMessagesAsReadByTokenRequest,
1644+
): Promise<Types.MessageAPIResponseBase> {
1645+
return (
1646+
await this.markMessagesAsReadByTokenWithHttpInfo(
1647+
markMessagesAsReadByTokenRequest,
1648+
)
1649+
).body;
1650+
}
1651+
1652+
/**
1653+
* Mark messages from users as read by token.
1654+
* This method includes HttpInfo object to return additional information.
1655+
* @param markMessagesAsReadByTokenRequest
1656+
*
1657+
* @see <a href="https://developers.line.biz/en/reference/messaging-api/#mark-as-read"> Documentation</a>
1658+
*/
1659+
public async markMessagesAsReadByTokenWithHttpInfo(
1660+
markMessagesAsReadByTokenRequest: MarkMessagesAsReadByTokenRequest,
1661+
): Promise<Types.ApiResponseType<Types.MessageAPIResponseBase>> {
1662+
const params = markMessagesAsReadByTokenRequest;
1663+
1664+
const res = await this.httpClient.post("/v2/bot/chat/markAsRead", params);
1665+
const text = await res.text();
1666+
const parsedBody = text ? JSON.parse(text) : null;
1667+
return { httpResponse: res, body: parsedBody };
1668+
}
16351669
/**
16361670
* An API that efficiently sends the same message to multiple user IDs. You can\'t send messages to group chats or multi-person chats.
16371671
* @param multicastRequest
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
/**
2+
* LINE Messaging API
3+
* This document describes LINE Messaging API.
4+
*
5+
* The version of the OpenAPI document: 0.0.1
6+
*
7+
*
8+
* NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
9+
* https://openapi-generator.tech
10+
* Do not edit the class manually.
11+
*/
12+
13+
export type MarkMessagesAsReadByTokenRequest = {
14+
/**
15+
* Token used to mark messages as read.
16+
*
17+
* @see <a href="https://developers.line.biz/en/reference/messaging-api/#mark-as-read-request-body">markAsReadToken Documentation</a>
18+
*/
19+
markAsReadToken: string /**/;
20+
};

lib/messaging-api/model/models.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -116,6 +116,7 @@ export * from "./locationAction.js";
116116
export * from "./locationMessage.js";
117117
export * from "./lotteryAcquisitionConditionRequest.js";
118118
export * from "./lotteryAcquisitionConditionResponse.js";
119+
export * from "./markMessagesAsReadByTokenRequest.js";
119120
export * from "./markMessagesAsReadRequest.js";
120121
export * from "./membersIdsResponse.js";
121122
export * from "./membership.js";

lib/messaging-api/tests/api/MessagingApiClientTest.spec.ts

Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ import { GroupMemberCountResponse } from "../../model/groupMemberCountResponse.j
1717
import { GroupSummaryResponse } from "../../model/groupSummaryResponse.js";
1818
import { GroupUserProfileResponse } from "../../model/groupUserProfileResponse.js";
1919
import { IssueLinkTokenResponse } from "../../model/issueLinkTokenResponse.js";
20+
import { MarkMessagesAsReadByTokenRequest } from "../../model/markMessagesAsReadByTokenRequest.js";
2021
import { MarkMessagesAsReadRequest } from "../../model/markMessagesAsReadRequest.js";
2122
import { MembersIdsResponse } from "../../model/membersIdsResponse.js";
2223
import { MembershipListResponse } from "../../model/membershipListResponse.js";
@@ -4455,6 +4456,86 @@ describe("MessagingApiClient", () => {
44554456
server.close();
44564457
});
44574458

4459+
it("markMessagesAsReadByTokenWithHttpInfo", async () => {
4460+
let requestCount = 0;
4461+
4462+
const server = createServer((req, res) => {
4463+
requestCount++;
4464+
4465+
equal(req.method, "POST");
4466+
const reqUrl = new URL(req.url, "http://localhost/");
4467+
equal(reqUrl.pathname, "/v2/bot/chat/markAsRead");
4468+
4469+
equal(req.headers["authorization"], `Bearer ${channel_access_token}`);
4470+
equal(req.headers["user-agent"], "@line/bot-sdk/1.0.0-test");
4471+
4472+
res.writeHead(200, { "Content-Type": "application/json" });
4473+
res.end(JSON.stringify({}));
4474+
});
4475+
await new Promise(resolve => {
4476+
server.listen(0);
4477+
server.on("listening", resolve);
4478+
});
4479+
4480+
const serverAddress = server.address();
4481+
if (typeof serverAddress === "string" || serverAddress === null) {
4482+
throw new Error("Unexpected server address: " + serverAddress);
4483+
}
4484+
4485+
const client = new MessagingApiClient({
4486+
channelAccessToken: channel_access_token,
4487+
baseURL: `http://localhost:${String(serverAddress.port)}/`,
4488+
});
4489+
4490+
const res = await client.markMessagesAsReadByTokenWithHttpInfo(
4491+
// markMessagesAsReadByTokenRequest: MarkMessagesAsReadByTokenRequest
4492+
{} as unknown as MarkMessagesAsReadByTokenRequest, // paramName=markMessagesAsReadByTokenRequest
4493+
);
4494+
4495+
equal(requestCount, 1);
4496+
server.close();
4497+
});
4498+
4499+
it("markMessagesAsReadByToken", async () => {
4500+
let requestCount = 0;
4501+
4502+
const server = createServer((req, res) => {
4503+
requestCount++;
4504+
4505+
equal(req.method, "POST");
4506+
const reqUrl = new URL(req.url, "http://localhost/");
4507+
equal(reqUrl.pathname, "/v2/bot/chat/markAsRead");
4508+
4509+
equal(req.headers["authorization"], `Bearer ${channel_access_token}`);
4510+
equal(req.headers["user-agent"], "@line/bot-sdk/1.0.0-test");
4511+
4512+
res.writeHead(200, { "Content-Type": "application/json" });
4513+
res.end(JSON.stringify({}));
4514+
});
4515+
await new Promise(resolve => {
4516+
server.listen(0);
4517+
server.on("listening", resolve);
4518+
});
4519+
4520+
const serverAddress = server.address();
4521+
if (typeof serverAddress === "string" || serverAddress === null) {
4522+
throw new Error("Unexpected server address: " + serverAddress);
4523+
}
4524+
4525+
const client = new MessagingApiClient({
4526+
channelAccessToken: channel_access_token,
4527+
baseURL: `http://localhost:${String(serverAddress.port)}/`,
4528+
});
4529+
4530+
const res = await client.markMessagesAsReadByToken(
4531+
// markMessagesAsReadByTokenRequest: MarkMessagesAsReadByTokenRequest
4532+
{} as unknown as MarkMessagesAsReadByTokenRequest, // paramName=markMessagesAsReadByTokenRequest
4533+
);
4534+
4535+
equal(requestCount, 1);
4536+
server.close();
4537+
});
4538+
44584539
it("multicastWithHttpInfo", async () => {
44594540
let requestCount = 0;
44604541

lib/webhook/model/audioMessageContent.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,4 +24,8 @@ export type AudioMessageContent = MessageContentBase & {
2424
* Length of audio file (milliseconds)
2525
*/
2626
duration?: number /**/;
27+
/**
28+
* Token used to mark the message as read.
29+
*/
30+
markAsReadToken?: string /**/;
2731
};

lib/webhook/model/fileMessageContent.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,4 +24,8 @@ export type FileMessageContent = MessageContentBase & {
2424
* File size in bytes
2525
*/
2626
fileSize: number /**/;
27+
/**
28+
* Token used to mark the message as read.
29+
*/
30+
markAsReadToken?: string /**/;
2731
};

lib/webhook/model/imageMessageContent.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,4 +28,8 @@ export type ImageMessageContent = MessageContentBase & {
2828
* Quote token to quote this message.
2929
*/
3030
quoteToken: string /**/;
31+
/**
32+
* Token used to mark the message as read.
33+
*/
34+
markAsReadToken?: string /**/;
3135
};

lib/webhook/model/locationMessageContent.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,4 +32,8 @@ export type LocationMessageContent = MessageContentBase & {
3232
* Longitude
3333
*/
3434
longitude: number /**/;
35+
/**
36+
* Token used to mark the message as read.
37+
*/
38+
markAsReadToken?: string /**/;
3539
};

lib/webhook/model/stickerMessageContent.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,12 @@ export type StickerMessageContent = MessageContentBase & {
5757
* @see <a href="https://developers.line.biz/en/reference/messaging-api/#wh-sticker">quotedMessageId Documentation</a>
5858
*/
5959
quotedMessageId?: string /**/;
60+
/**
61+
* Token used to mark the message as read.
62+
*
63+
* @see <a href="https://developers.line.biz/en/reference/messaging-api/#wh-sticker">markAsReadToken Documentation</a>
64+
*/
65+
markAsReadToken?: string /**/;
6066
};
6167

6268
export namespace StickerMessageContent {

0 commit comments

Comments
 (0)