LINE Notification Messages
Do not answer LINE Notification Messages questions from memory — LINE updates APIs frequently and training data is unreliable. Always consult the references below.
LINE Notification Messages allow sending messages to users by specifying their phone number (SHA256-hashed E.164 format), even if they haven't added the LINE Official Account as a friend. Corporate-only service available in Japan, Thailand, and Taiwan. Not for advertising or commercial purposes.
Workflow
Build
- Read references/api-common.md (rate limits, forward compatibility, error handling)
- Load the relevant reference for the feature being implemented
- For architecture or design choices, consult references/experts.md for directional guidance
- Write code following specs and constraints from references
Review / Debug
- Read references/api-common.md (rate limits, error codes)
- Load relevant references for the code being reviewed
- Cross-check code against specs (phone hashing format, sending conditions, consent states, billing rules, IP restriction warnings)
- For design pattern concerns, consult references/experts.md
- Report violations with reference to specific constraints
Environment Variables
LINE_CHANNEL_ACCESS_TOKEN=Bot access token (Messaging API channel)
LINE_CHANNEL_SECRET=Channel secret (webhook signature verification)
Common Specifications
Read references/api-common.md before writing any notification message code. Contains rules that affect all API interactions: forward compatibility (don't use strict schemas — LINE adds fields without notice), rate limits, error handling, and logging recommendations.
Two Message Types
| Type |
Description |
UX Review |
Send Endpoint |
| Template |
Predefined layout with templateKey, itemKey, buttonKey. Easy to set up. |
Not required |
POST /v2/bot/message/pnp/templated/push |
| Flexible |
Free-form message objects (Flex Message, text, etc.). Greater design freedom. |
Required |
POST /bot/pnp/push |
- Template type added June 2025 — simpler, no UX review needed
- Flexible type (formerly just "LINE notification messages") — allows custom message objects but requires prior UX review
- Both types: no images, video, or audio allowed
Full type comparison → references/sending-api.md
Minimal Flow (pseudocode)
# 1. Hash phone number (E.164 → SHA256)
phone = "+818000001234" # E.164 format, no hyphens
hashed = SHA256(phone.encode()).hexdigest() # 64-char lowercase hex
# 2a. Send via template type
POST https://api.line.me/v2/bot/message/pnp/templated/push
Authorization: Bearer {channel_access_token}
X-Line-Delivery-Tag: {optional_tracking_tag}
{
"to": hashed,
"templateKey": "shipment_completed_ja",
"body": {
"emphasizedItem": {"itemKey": "date_002_ja", "content": "August 10"},
"items": [{"itemKey": "number_001_ja", "content": "1234567"}],
"buttons": [{"buttonKey": "contact_ja", "url": "https://example.com"}]
}
}
# → Response: 202 Accepted
# 2b. OR send via flexible type
POST https://api.line.me/bot/pnp/push
Authorization: Bearer {channel_access_token}
{
"to": hashed,
"messages": [{"type": "text", "text": "Your order has shipped"}]
}
# → Response: 200 OK
# 3. IMPORTANT: 200/202 does NOT guarantee delivery
# User may be blocked, consent not given, SMS auth expired, etc.
# 4. Delivery confirmation arrives via webhook
# event.type = "delivery", delivery.data = hashed phone or delivery tag
API Endpoint Summary
| Operation |
Endpoint |
Response |
| Send (Template) |
POST /v2/bot/message/pnp/templated/push |
202 |
| Send (Flexible) |
POST /bot/pnp/push |
200 |
| Count (Template) |
GET /v2/bot/message/delivery/pnp/templated?date=yyyyMMdd |
200 |
| Count (Flexible) |
GET /v2/bot/message/delivery/pnp?date=yyyyMMdd |
200 |
- Domain:
api.line.me
- Rate limit: 2,000 req/sec for all endpoints
X-Line-Retry-Key is NOT supported — do not use retry keys
- Do NOT restrict server IP in channel Security Settings — may cause sending failure
Full API specs, parameters, error codes → references/sending-api.md
Key Concepts
Phone Number Hashing
- Normalize to E.164 format (country code, no hyphens):
+818000001234
- Hash with SHA256:
hashlib.sha256("+818000001234".encode()).hexdigest()
- Result: 64-char lowercase hex string
Sending Conditions (ALL must be met)
- Phone number matches user's LINE account
- Phone number is valid (SMS authenticated)
- User agrees to receive LINE notification messages
- User has not blocked the LINE Official Account
- Phone number issued in Japan, Thailand, or Taiwan
- User has agreed to LINE's Privacy Policy (revised March 2022)
User Consent States
| State |
Behavior |
| Agree (on) |
Message delivered normally |
| Reject (off) |
Message deleted, not delivered |
| Not set |
User receives consent prompt; 24 hours to agree or message is deleted |
- Consent is comprehensive — once agreed, applies to ALL LINE Official Accounts
SMS Authentication
- Required once every 180 days
- Not required within 180 days of account creation or phone number change
Delivery Confirmation
- API response
200/202 does NOT guarantee delivery
- Use delivery completion webhook (
type: "delivery") to confirm actual delivery
- No webhook within 24 hours = message was not delivered
Full technical specs → references/technical-specs.md
Template system details → references/template-system.md
Webhook details → references/delivery-webhook.md
Reference Index
| File |
Topic |
| references/api-common.md |
Read first. Rate limits, status codes, error handling, forward compatibility |
| references/sending-api.md |
Send APIs (template + flexible), count APIs, request/response specs, error codes |
| references/template-system.md |
Template structure: templateKey, itemKey, buttonKey, field limits, country suffixes |
| references/technical-specs.md |
Phone hashing, sending conditions, consent flow, SMS auth, billing, IP restrictions |
| references/delivery-webhook.md |
Delivery completion event, X-Line-Delivery-Tag, user consent flows, non-friend behavior |
| references/experts.md |
LINE Notification Messages domain experts for architecture guidance |
SDK
Official SDKs: Python | Node.js | Go | Java | PHP | Ruby
Other languages: use LINE OpenAPI specs with OpenAPI Generator.
1---2name: line-notification-message3description: Reference for LINE Notification Messages — phone-number-based messaging to non-friends, template type (premade layouts) and flexible type (custom Flex Message), delivery completion webhooks, user consent flow, SMS authentication, and billing. Use when the user asks to "send a notification message via phone number", "hash a phone number for PNP", "handle delivery completion webhook", "set up template or flexible notification", "check notification message count", "integrate LON", or mentions LINE notification messages, LINE Official Notification (LON), PNP push, phone-number-based delivery, hashed phone number, notification template, delivery completion event, consent states, or SMS authentication for notifications. Always use this skill whenever the user mentions LINE notification messages, PNP, LON, LINE Official Notification, LINE 通知型訊息, or phone-based LINE messaging to non-friends, even if they don't explicitly say "notification message".4---5
6# LINE Notification Messages
7
8**Do not answer LINE Notification Messages questions from memory — LINE updates APIs frequently and training data is unreliable. Always consult the references below.**
9
10LINE Notification Messages allow sending messages to users by specifying their phone number (SHA256-hashed E.164 format), even if they haven't added the LINE Official Account as a friend. Corporate-only service available in **Japan, Thailand, and Taiwan**. Not for advertising or commercial purposes.
11
12## Workflow
13
14### Build
151. Read [references/api-common.md](references/api-common.md) (rate limits, forward compatibility, error handling)
162. Load the relevant reference for the feature being implemented
173. For architecture or design choices, consult [references/experts.md](references/experts.md) for directional guidance
184. Write code following specs and constraints from references
19
20### Review / Debug
211. Read [references/api-common.md](references/api-common.md) (rate limits, error codes)
222. Load relevant references for the code being reviewed
233. Cross-check code against specs (phone hashing format, sending conditions, consent states, billing rules, IP restriction warnings)
244. For design pattern concerns, consult [references/experts.md](references/experts.md)
255. Report violations with reference to specific constraints
26
27## Environment Variables
28
29```
30LINE_CHANNEL_ACCESS_TOKEN=Bot access token (Messaging API channel)
31LINE_CHANNEL_SECRET=Channel secret (webhook signature verification)
32```
33
34## Common Specifications
35
36**Read [references/api-common.md](references/api-common.md) before writing any notification message code.** Contains rules that affect all API interactions: forward compatibility (don't use strict schemas — LINE adds fields without notice), rate limits, error handling, and logging recommendations.
37
38## Two Message Types
39
40| Type | Description | UX Review | Send Endpoint |
41|------|-------------|-----------|---------------|
42| **Template** | Predefined layout with templateKey, itemKey, buttonKey. Easy to set up. | Not required | `POST /v2/bot/message/pnp/templated/push` |
43| **Flexible** | Free-form message objects (Flex Message, text, etc.). Greater design freedom. | **Required** | `POST /bot/pnp/push` |
44
45- Template type added June 2025 — simpler, no UX review needed
46- Flexible type (formerly just "LINE notification messages") — allows custom message objects but requires prior UX review
47- Both types: no images, video, or audio allowed
48
49Full type comparison → **[references/sending-api.md](references/sending-api.md)**
50
51## Minimal Flow (pseudocode)
52
53```
54# 1. Hash phone number (E.164 → SHA256)
55phone = "+818000001234" # E.164 format, no hyphens
56hashed = SHA256(phone.encode()).hexdigest() # 64-char lowercase hex
57
58# 2a. Send via template type
59POST https://api.line.me/v2/bot/message/pnp/templated/push
60Authorization: Bearer {channel_access_token}
61X-Line-Delivery-Tag: {optional_tracking_tag}
62{
63 "to": hashed,
64 "templateKey": "shipment_completed_ja",
65 "body": {
66 "emphasizedItem": {"itemKey": "date_002_ja", "content": "August 10"},
67 "items": [{"itemKey": "number_001_ja", "content": "1234567"}],
68 "buttons": [{"buttonKey": "contact_ja", "url": "https://example.com"}]
69 }
70}
71# → Response: 202 Accepted
72
73# 2b. OR send via flexible type
74POST https://api.line.me/bot/pnp/push
75Authorization: Bearer {channel_access_token}
76{
77 "to": hashed,
78 "messages": [{"type": "text", "text": "Your order has shipped"}]
79}
80# → Response: 200 OK
81
82# 3. IMPORTANT: 200/202 does NOT guarantee delivery
83# User may be blocked, consent not given, SMS auth expired, etc.
84
85# 4. Delivery confirmation arrives via webhook
86# event.type = "delivery", delivery.data = hashed phone or delivery tag
87```
88
89## API Endpoint Summary
90
91| Operation | Endpoint | Response |
92|-----------|----------|----------|
93| Send (Template) | `POST /v2/bot/message/pnp/templated/push` | 202 |
94| Send (Flexible) | `POST /bot/pnp/push` | 200 |
95| Count (Template) | `GET /v2/bot/message/delivery/pnp/templated?date=yyyyMMdd` | 200 |
96| Count (Flexible) | `GET /v2/bot/message/delivery/pnp?date=yyyyMMdd` | 200 |
97
98- Domain: `api.line.me`
99- Rate limit: 2,000 req/sec for all endpoints
100- `X-Line-Retry-Key` is **NOT supported** — do not use retry keys
101- Do **NOT** restrict server IP in channel Security Settings — may cause sending failure
102
103Full API specs, parameters, error codes → **[references/sending-api.md](references/sending-api.md)**
104
105## Key Concepts
106
107### Phone Number Hashing
1081. Normalize to **E.164** format (country code, no hyphens): `+818000001234`
1092. Hash with **SHA256**: `hashlib.sha256("+818000001234".encode()).hexdigest()`
1103. Result: 64-char lowercase hex string
111
112### Sending Conditions (ALL must be met)
1131. Phone number matches user's LINE account
1142. Phone number is valid (SMS authenticated)
1153. User agrees to receive LINE notification messages
1164. User has **not** blocked the LINE Official Account
1175. Phone number issued in Japan, Thailand, or Taiwan
1186. User has agreed to LINE's Privacy Policy (revised March 2022)
119
120### User Consent States
121| State | Behavior |
122|-------|----------|
123| **Agree (on)** | Message delivered normally |
124| **Reject (off)** | Message deleted, not delivered |
125| **Not set** | User receives consent prompt; 24 hours to agree or message is deleted |
126
127- Consent is **comprehensive** — once agreed, applies to ALL LINE Official Accounts
128
129### SMS Authentication
130- Required once every **180 days**
131- Not required within 180 days of account creation or phone number change
132
133### Delivery Confirmation
134- API response `200`/`202` does **NOT** guarantee delivery
135- Use **delivery completion webhook** (`type: "delivery"`) to confirm actual delivery
136- No webhook within 24 hours = message was not delivered
137
138Full technical specs → **[references/technical-specs.md](references/technical-specs.md)**
139Template system details → **[references/template-system.md](references/template-system.md)**
140Webhook details → **[references/delivery-webhook.md](references/delivery-webhook.md)**
141
142## Reference Index
143
144| File | Topic |
145|------|-------|
146| [references/api-common.md](references/api-common.md) | **Read first.** Rate limits, status codes, error handling, forward compatibility |
147| [references/sending-api.md](references/sending-api.md) | Send APIs (template + flexible), count APIs, request/response specs, error codes |
148| [references/template-system.md](references/template-system.md) | Template structure: templateKey, itemKey, buttonKey, field limits, country suffixes |
149| [references/technical-specs.md](references/technical-specs.md) | Phone hashing, sending conditions, consent flow, SMS auth, billing, IP restrictions |
150| [references/delivery-webhook.md](references/delivery-webhook.md) | Delivery completion event, X-Line-Delivery-Tag, user consent flows, non-friend behavior |
151| [references/experts.md](references/experts.md) | LINE Notification Messages domain experts for architecture guidance |
152
153## SDK
154
155Official SDKs: [Python](https://github.com/line/line-bot-sdk-python) | [Node.js](https://github.com/line/line-bot-sdk-nodejs) | [Go](https://github.com/line/line-bot-sdk-go) | [Java](https://github.com/line/line-bot-sdk-java) | [PHP](https://github.com/line/line-bot-sdk-php) | [Ruby](https://github.com/line/line-bot-sdk-ruby)
156
157Other languages: use [LINE OpenAPI specs](https://developers.line.biz/en/docs/messaging-api/line-bot-sdk/) with OpenAPI Generator.