Tài liệu API
Tích hợp LogsNinja vào ứng dụng của bạn trong vài phút. Gửi sự kiện từ bất kỳ ngôn ngữ nào bằng một yêu cầu HTTP POST đơn giản.
Bắt đầu nhanh
Lấy prompt bắt đầuXác thực
Tất cả các yêu cầu phải bao gồm token API trong header Authorization.
Authorization: Bearer YOUR_API_TOKEN
Bạn có thể tạo token API từ cài đặt dự án. Đến trang token
Nếu bạn là một tác nhân AI thay vì con người, bạn có thể lấy token mà không cần ai sao chép và dán cho bạn. Xem phần ủy quyền thiết bị
Giới hạn tốc độ & hạn ngạch
Giới hạn phụ thuộc vào gói của bạn. Giới hạn tốc độ áp dụng cho mỗi tổ chức và được dùng chung cho mọi token API; việc tạo thêm token không làm tăng giới hạn này.
Giới hạn tốc độ toàn tổ chức áp dụng cho mọi endpoint được xác thực bằng token API, bao gồm POST /v1/events, PUT /v1/users, POST /v1/ping, PUT /v1/metrics, /v1/org/charts, /v1/org/widgets, và các thao tác xóa. Mỗi lệnh gọi tiêu tốn một yêu cầu từ cùng giới hạn chia sẻ này.
/v1/device/authorize (chưa có token tại thời điểm đó) được giới hạn ở mức 10 yêu cầu mỗi giờ cho mỗi địa chỉ IP, và /v1/device/token ở mức 60 yêu cầu mỗi 5 phút cho mỗi địa chỉ IP.
| Plan | Giới hạn lượt gọi | Sự kiện / tháng | Hình ảnh / tháng | Hình ảnh mỗi sự kiện |
|---|---|---|---|---|
| Free | 60 req/min | 3,000 | – | Không bao gồm |
| Starter | 300 req/min | 100,000 | 20,000 | 1 mỗi sự kiện · tối đa 1 MB · đổi cỡ về 1024px · thân yêu cầu tối đa 1 MB |
| Plus | 1,200 req/min | 500,000 | 100,000 | 4 mỗi sự kiện · tối đa 1 MB · đổi cỡ về 1024px · thân yêu cầu tối đa 8 MB |
| Enterprise | Tùy chỉnh | Tùy chỉnh | Tùy chỉnh | Tùy chỉnh |
Khi vượt quá giới hạn tốc độ, API trả về 429 với Too many requests. Số lượng sự kiện và số lượng hình ảnh mỗi loại có hạn ngạch hằng tháng riêng; khi đạt một trong hai, API trả về 429 với Monthly event or hosted image quota exceeded. Upgrade your plan to continue.
Header hạn ngạch
Mỗi phản hồi thành công từ POST /v1/events bao gồm các header sau:
X-Quota-Remaining: 2497
X-Image-Quota-Remaining: 18320
X-Plan: starter
X-Quota-Remaining– số sự kiện còn lại trong tháng dương lịch hiện tại.-1nghĩa là không giới hạn (Enterprise).X-Image-Quota-Remaining– hình ảnh còn lại trong tháng dương lịch hiện tại.-1nghĩa là không giới hạn (Enterprise).X-Plan– gói hiện tại của tổ chức (free,starter,plus,enterprise).
Định dạng siêu dữ liệu
Trường metadata trên sự kiện và người dùng tuân theo các quy tắc giống nhau:
- Khóa: chỉ chữ thường, chữ số, dấu gạch ngang và dấu gạch dưới (
^[a-z0-9_-]+$) - Giá trị:
string,number, hoặcboolean - Tối đa 20 khóa mỗi đối tượng
- Khóa: tối đa 100 ký tự
- Giá trị dạng chuỗi: tối đa 255 ký tự
{
"plan": "pro",
"amount": 49,
"score": 4.8,
"is-trial": false
}
Prompt bắt đầu
Dán vào Claude Code, Cursor, Codex hoặc bất kỳ tác nhân AI nào để bắt đầu ngay.
You are integrating LogsNinja into this project.
LogsNinja is a real-time event tracking and push notification platform. Use its REST API to log application events, track users, update dashboard metrics, and trigger instant push notifications to mobile and desktop devices.
LogsNinja provides no SDK – all integration is done via plain HTTP calls using the libraries and conventions already present in this project.
## Fetch the full API documentation
Before writing any integration code, fetch the complete reference in Markdown:
curl https://logsninja.com/vi/docs -H "Accept: text/markdown"
Read it carefully – it covers all endpoints, request fields, response codes, rate limits, and examples.
## Core concepts
**Events** – send a POST to /v1/events. All fields are covered in the documentation.
**Streams** – lightweight channels grouping events. Auto-created on first use (e.g. "payments", "errors").
**Users** – PUT /v1/users to create or update a user profile. The same id is used in the user field when sending events. Optional country_code is caller-supplied (LogsNinja does not geolocate IPs itself) – see the full docs for how to obtain it.
**Metrics** – PUT /v1/metrics to create or update a numeric, text, currency, or percent dashboard tile. Supports atomic diff increments.
**Presence** – POST /v1/ping to signal a user is online without creating an event.
**Event chains** – link events sequentially with before/after fields to trace multi-step workflows.
**Charts** – POST/GET/PATCH/DELETE /v1/org/charts to manage dashboard charts. Same fields and validation rules as the dashboard's own chart editor.
**Widgets** – POST/GET/PATCH/DELETE /v1/org/widgets (plus POST /v1/org/widgets/reorder) to manage what's on the dashboard. The dashboard is a masonry layout, not a rigid grid: "small" widgets (metric, online_users) are meant for width 1 or 2 and render at exactly half the visual height of "large" widgets (chart, world_map, events_7d, top_countries), meant for width 2 or 3 (full row) – keep that in mind when arranging one via the API.
## Authentication
All requests require:
Authorization: Bearer YOUR_API_TOKEN
Creating an account and generating a token both require a human to sign in
to the LogsNinja dashboard - you cannot do either yourself. If you don't
already have a token (e.g. in an environment variable), stop and ask the
person you're working with to create one at https://logsninja.com/vi/my/tokens
and give it to you (for example as a LOGSNINJA_API_TOKEN environment
variable) before you continue.
## API base URL
https://api.logsninja.com/v1
## MCP server
If you are an AI agent with MCP support rather than a code-generation assistant, LogsNinja is also usable directly as an MCP server at https://logsninja.com/mcp (same Bearer token as above) – it exposes tools to manage charts and dashboard widgets, explore project data, and create/delete test events, users, and metrics, without writing HTTP calls yourself. See the full docs for the tool list.
## Integration guidelines
- Use the HTTP client and patterns already established in this project – do not introduce new dependencies.
- All LogsNinja calls must be fire-and-forget from the application's perspective: they must never block the main flow or surface errors to the end user.
- Apply a 3-second timeout to every HTTP call, if possible.
- If this project already has a job queue, background worker, or retry mechanism, use it for LogsNinja calls.
- If no such mechanism exists, wrap calls in a silent try/catch (or equivalent) so that a LogsNinja failure has zero impact on the application.
## What to instrument
Scan the codebase and identify meaningful moments to send events: key user actions, business transactions, errors, background jobs, and any other signal that would be useful to monitor. For each, choose a descriptive title and a fitting emoji. Once done, provide a summary of every integration point added.
## Presence
Use presence sparingly. Sending an event with a user field already updates that user's online status for 15 minutes, so a separate ping is redundant in those cases. Only call POST /v1/ping when you know the user is active but no event will be sent soon – for example on login, or during an idle session. Do not ping on every page view or API call.
Gửi sự kiện
https://api.logsninja.com/v1/events
Tiêu đề
Authorization: Bearer YOUR_API_TOKEN
Content-Type: application/json
Nội dung yêu cầu
{
"project": "YOUR_PROJECT_ID",
"stream": "payments",
"title": "New subscription",
"content": "[email protected] subscribed to Pro",
"emoji": "💳",
"metadata": { "plan": "pro", "amount": 49 },
"notify": true
}
Ví dụ
curl -X POST https://api.logsninja.com/v1/events \
-H "Authorization: Bearer YOUR_API_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"project": "YOUR_PROJECT_ID",
"stream": "payments",
"title": "New subscription",
"content": "[email protected] subscribed to Pro",
"notify": true
}'
await fetch('https://api.logsninja.com/v1/events', {
method: 'POST',
headers: {
'Authorization': 'Bearer YOUR_API_TOKEN',
'Content-Type': 'application/json',
},
body: JSON.stringify({
project: 'YOUR_PROJECT_ID',
stream: 'payments',
title: 'New subscription',
content: '[email protected] subscribed to Pro',
notify: true,
}),
});
import requests
requests.post(
'https://api.logsninja.com/v1/events',
headers={
'Authorization': 'Bearer YOUR_API_TOKEN',
'Content-Type': 'application/json',
},
json={
'project': 'YOUR_PROJECT_ID',
'stream': 'payments',
'title': 'New subscription',
'content': '[email protected] subscribed to Pro',
'notify': True,
},
)
Trường sự kiện
| Trường | Kiểu | Bắt buộc | Mô tả |
|---|---|---|---|
project |
string | ✓ | ID dự án. Xem trong cài đặt dự án. |
stream |
string | ✓ | Stream mà sự kiện này thuộc về. Tự động tạo khi sử dụng lần đầu. |
title |
string | ✓ | Tiêu đề ngắn của sự kiện. Tối đa 100 ký tự. |
content |
string | Chi tiết bổ sung, tối đa 500 ký tự. Hỗ trợ Markdown: in đậm, in nghiêng, mã, danh sách và liên kết. | |
emoji |
string | Emoji để nhận diện trực quan sự kiện. Mặc định là 🔔 nếu bỏ trống. Định dạng được chấp nhận: ký tự emoji ("💳"), shortcode (":credit_card:"), hoặc mã hex ("1F4B3"). Cũng được dùng làm hình ảnh thông báo đẩy. Xem các emoji có sẵn. |
|
metadata |
object | Siêu dữ liệu khóa/giá trị. Xem quy tắc định dạng ở trên. | |
user |
string | ID người dùng trong ứng dụng của bạn (cùng id được truyền vào PUT /v1/users). Người dùng chưa cần tồn tại: các sự kiện được liên kết tự động khi người dùng được tạo. Gửi sự kiện thời gian thực với trường user cũng tính là hiện diện: người dùng được coi là trực tuyến trong 15 phút sau sự kiện hoặc ping cuối cùng. Các sự kiện backdated với timestamp không ảnh hưởng đến trạng thái hiện diện. |
|
images |
string[] | Hình ảnh cho sự kiện này. Yêu cầu gói trả phí. Là một mảng các URL HTTPS công khai của ảnh để tải và lưu trữ (các URL trùng lặp trong cùng một sự kiện sẽ được loại bỏ), hoặc chính các file được gửi dưới dạng multipart/form-data. Ảnh được xử lý bất đồng bộ và được giữ trong 30 ngày. Xem Tải ảnh lên để biết hợp đồng đầy đủ, giới hạn kích thước, định dạng được chấp nhận, yêu cầu về URL và cách đọc images_status. |
|
notify |
boolean | Gửi thông báo đẩy đến các thiết bị đã đăng ký. Mặc định: false. Không thể là true khi timestamp được đặt. Khi có notify, phản hồi cũng bao gồm notification_queued; false nghĩa là sự kiện đã được lưu nhưng hàng đợi thông báo di động vẫn không khả dụng sau khi thử lại. | |
timestamp |
integer | Timestamp Unix (tính bằng giây) để cài lùi ngày sự kiện. Phải là thời gian trong quá khứ. Không thể kết hợp với notify: true. Các sự kiện backdated không ảnh hưởng đến trạng thái hiện diện. | |
before |
string | Sự kiện sẽ được đặt trước sự kiện có ID được truyền trong thuộc tính này, trong một chuỗi sự kiện. | |
after |
string | Sự kiện sẽ được đặt sau sự kiện có ID được truyền trong thuộc tính này, trong một chuỗi sự kiện. |
Tải ảnh lên
Có hai cách để đính kèm ảnh vào một sự kiện, cả hai đều dành cho gói trả phí và được xử lý theo cùng một cách, bất đồng bộ: truyền một mảng các URL HTTPS công khai trong trường JSON images để LogsNinja tải và lưu trữ, hoặc gửi chính các file trong cùng một yêu cầu POST /v1/events dưới dạng multipart/form-data.
Tải lên nhị phân (multipart/form-data)
Yêu cầu có một phần event và một hoặc nhiều phần file có tên image:
| Phần | Mô tả |
|---|---|
event |
Một chuỗi chứa đúng phần thân JSON mà bạn sẽ gửi dưới dạng application/json: project, stream, title và bất kỳ trường nào khác, với metadata là một đối tượng JSON thực sự (không phải các trường biểu mẫu metadata[key]). Nó vẫn có thể bao gồm một mảng images gồm các URL, được lưu cùng với các file đã tải lên. |
image |
Mỗi file một phần, mỗi phần được gửi dưới dạng file (có tên file) và mang Content-Type là image/jpeg, image/png hoặc image/webp. Các phần có tên khác, và các phần image không phải là file, sẽ bị bỏ qua. |
curl -X POST https://api.logsninja.com/v1/events \
-H "Authorization: Bearer YOUR_API_TOKEN" \
-F 'event={"project":"YOUR_PROJECT_ID","stream":"payments","title":"New subscription","metadata":{"plan":"pro"},"notify":true};type=application/json' \
-F 'image=@./screenshot.png;type=image/png'
const form = new FormData();
form.append('event', JSON.stringify({
project: 'YOUR_PROJECT_ID',
stream: 'payments',
title: 'New subscription',
metadata: { plan: 'pro' },
notify: true,
}));
form.append('image', fileOrBlob, 'screenshot.png'); // Content-Type image/png
await fetch('https://api.logsninja.com/v1/events', {
method: 'POST',
headers: { 'Authorization': 'Bearer YOUR_API_TOKEN' }, // no Content-Type
body: form,
});
Lỗi đồng bộ
Chúng được trả về ngay trong phản hồi POST, trước khi sự kiện được tạo:
| Mã | Nguyên nhân |
|---|---|
400 | Thiếu phần event hoặc nó không phải là một đối tượng JSON. |
403 | Gói của bạn không bao gồm ảnh trên sự kiện. |
411 | Yêu cầu không có tiêu đề Content-Length. |
413 | Một file vượt quá giới hạn kích thước mỗi ảnh của gói, hoặc toàn bộ thân yêu cầu vượt quá kích thước tối đa của gói. |
415 | Content-Type của một phần image không bắt đầu bằng image/. Một kiểu ảnh sai (ví dụ image/gif) vượt qua kiểm tra này nhưng sau đó thất bại dưới dạng bad_format. |
422 | Nhiều ảnh hơn mức gói của bạn cho phép mỗi sự kiện. |
Xem Giới hạn tần suất và hạn mức để biết số lượng ảnh theo gói, kích thước mỗi ảnh và kích thước thân yêu cầu tối đa.
Tải từ một URL
Khi bạn truyền URL thay vì file, mỗi URL phải đáp ứng tất cả các điều sau, nếu không ảnh sẽ bị đánh dấu failed:
- Chỉ HTTPS, trên cổng 443. Không có host là địa chỉ IP, không
localhost,.localhoặc.internal. URL tối đa 2048 ký tự. - Phản hồi phải mang
Content-Type: image/jpeg,image/pnghoặcimage/webp. Một200trả vềtext/html(trang lỗi, tường đăng nhập) là lỗi vĩnh viễn – không bao giờ thử lại. - Việc tải hết thời gian chờ sau 15 giây và theo tối đa 3 lần chuyển hướng.
- Với
403,404,408,425,429,500,502,503hoặc504, việc tải được thử lại trong khoảng một phút trước khi ảnh bị đánh dấufailed. Mọi trạng thái khác đều thất bại vĩnh viễn ngay lần đầu.
Định dạng và xử lý
- Định dạng được chấp nhận: JPEG, PNG và WebP, được phát hiện từ các byte nhận dạng của file – không phải phần mở rộng hay kiểu khai báo.
- Mỗi ảnh được đổi cỡ để vừa với kích thước tối đa của gói và được lưu ở cả JPEG và WebP. Ảnh được giữ trong 30 ngày.
- Một sự kiện lùi ngày (
timestamp) có ngày đã nằm ngoài cửa sổ 30 ngày sẽ bỏ qua hoàn toàn việc xử lý ảnh;images_statuscủa nó làexpired.
Đọc kết quả
Phản hồi POST bao gồm images_status, nhưng tại thời điểm đó nó luôn là pending (hoặc none / expired) vì việc xử lý chưa chạy. Không có webhook: hãy đọc lại sự kiện sau – bằng công cụ get_event của MCP hoặc trong nguồn cấp sự kiện của Studio – để xem kết quả.
images_status |
Ý nghĩa |
|---|---|
none | Sự kiện không có ảnh. |
pending | Đang xếp hàng hoặc đang xử lý. |
ready | Mọi ảnh đều đã được xử lý. |
partial | Một số ảnh đã sẵn sàng, một số bị lỗi. |
failed | Mọi ảnh đều bị lỗi. |
expired | Sự kiện có trước cửa sổ ảnh 30 ngày; không có gì được tải lên. |
Mỗi ảnh cũng mang một chuỗi error và một error_code (too_large, bad_format hoặc unreachable) khi bị lỗi.
Khuyến nghị: đối với một sự kiện bạn phát ngay sau khi tạo ảnh (một bản render, ảnh chụp màn hình, bản xuất), hãy tải file lên thay vì một URL. Một URL chưa thể truy cập – hoặc đã bị xóa – khi LogsNinja tải nó sẽ làm ảnh bị lỗi, và không có gì báo cho bạn khi điều đó xảy ra.
Chuỗi sự kiện
Các trường before và after liên kết các sự kiện thành một chuỗi. Bảng chi tiết sự kiện hiển thị các sự kiện liền kề và cho phép xem toàn bộ chuỗi.
Chỉ các tham chiếu đến sự kiện trong cùng một dự án mới được xử lý và chỉ khi dấu thời gian của chúng hợp lý. Mục tiêu after (tiền nhiệm) phải có dấu thời gian sớm hơn, và mục tiêu before (kế nhiệm) phải có dấu thời gian muộn hơn.
Xóa sự kiện
https://api.logsninja.com/v1/events/:id?project=YOUR_PROJECT_ID
Xóa vĩnh viễn một sự kiện.
Tạo hoặc cập nhật người dùng
https://api.logsninja.com/v1/users
Tạo hoặc cập nhật người dùng app. Gọi với cùng id sẽ thay thế bản ghi.
{
"project": "YOUR_PROJECT_ID",
"id": "user_123",
"country_code": "FR",
"display_as": "[email protected]",
"metadata": { "plan": "pro", "mrr": 49 }
}
| Trường | Kiểu | Bắt buộc | Mô tả |
|---|---|---|---|
project |
string | ✓ | ID dự án. |
id |
string | ✓ | Định danh ổn định của bạn cho người dùng này (vd. ID trong database của bạn). Đây là giá trị bạn dùng trong trường user khi gửi sự kiện. |
country_code |
string | Mã quốc gia ISO 3166-1 alpha-2 (ví dụ FR, US). Xem Định vị địa lý để biết cách lấy mã này. | |
display_as |
string | Tên hiển thị trên trang web và ứng dụng di động cho người dùng này. Nếu không đặt hoặc là null, id của người dùng sẽ được dùng thay thế. |
|
metadata |
object | Siêu dữ liệu khóa/giá trị. Xem quy tắc định dạng ở trên. |
Ví dụ
curl -X PUT https://api.logsninja.com/v1/users \
-H "Authorization: Bearer YOUR_API_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"project": "YOUR_PROJECT_ID",
"id": "user_123",
"country_code": "FR",
"metadata": { "plan": "pro" }
}'
await fetch('https://api.logsninja.com/v1/users', {
method: 'PUT',
headers: {
'Authorization': 'Bearer YOUR_API_TOKEN',
'Content-Type': 'application/json',
},
body: JSON.stringify({
project: 'YOUR_PROJECT_ID',
id: 'user_123',
country_code: 'FR',
metadata: { plan: 'pro' },
}),
});
import requests
requests.put(
'https://api.logsninja.com/v1/users',
headers={
'Authorization': 'Bearer YOUR_API_TOKEN',
'Content-Type': 'application/json',
},
json={
'project': 'YOUR_PROJECT_ID',
'id': 'user_123',
'country_code': 'FR',
'metadata': {'plan': 'pro'},
},
)
Định vị địa lý
LogsNinja không bao giờ tự xác định quốc gia của người dùng từ địa chỉ IP – country_code hoàn toàn do bên gọi cung cấp.
- Nếu backend của bạn đi qua Cloudflare (Workers/Pages, hoặc bản ghi DNS bật đám mây cam), hãy đọc trực tiếp header
CF-IPCountry– nó đã có sẵn trên mọi request đến. - Nguyên tắc tương tự cũng áp dụng với hầu hết các CDN/mạng biên khác (vd. Akamai, Bunny, Fastly, Amazon CloudFront) – chúng thường tự thêm một header địa lý tương đương. Hãy kiểm tra tài liệu của nhà cung cấp đó để biết tên và định dạng header chính xác.
- Nếu không, hãy dùng một thư viện hoặc dịch vụ GeoIP trên địa chỉ IP của request (vd. MaxMind GeoLite2, ipinfo.io, ip-api.com).
Truyền mã thu được vào country_code – nó cung cấp dữ liệu cho biểu đồ phân bổ theo quốc gia và widget bản đồ thế giới.
Xóa người dùng
https://api.logsninja.com/v1/users/:id?project=YOUR_PROJECT_ID
Xóa người dùng app. Sự kiện của họ vẫn còn nhưng không còn liên kết với người dùng.
Báo hiệu sự hiện diện của người dùng
https://api.logsninja.com/v1/ping
Ghi nhận người dùng đang trực tuyến, không tạo sự kiện. Người dùng được coi là trực tuyến nếu họ đã gửi ping hoặc có sự kiện liên kết trong 15 phút qua. Nếu người dùng chưa tồn tại, ping sẽ bị bỏ qua – hãy tạo người dùng trước qua PUT /v1/users.
{
"project": "YOUR_PROJECT_ID",
"id": "user_123"
}
| Trường | Kiểu | Bắt buộc | Mô tả |
|---|---|---|---|
project |
string | ✓ | ID dự án. |
id |
string | ✓ | ID người dùng app của bạn (cùng id đã truyền vào PUT /v1/users). |
Tạo hoặc cập nhật chỉ số
https://api.logsninja.com/v1/metrics
Tạo hoặc cập nhật một ô chỉ số. Gọi với cùng id sẽ thay thế giá trị. Với kiểu số, bạn cũng có thể áp dụng delta thay vì đặt giá trị tuyệt đối.
{
"project": "YOUR_PROJECT_ID",
"id": "mrr",
"title": "MRR",
"emoji": "💰",
"value": 4900,
"value_type": "currency",
"currency": "EUR"
}
{
"project": "YOUR_PROJECT_ID",
"id": "active-users",
"title": "Active users",
"value": { "diff": 1 },
"value_type": "number"
}
| Trường | Kiểu | Bắt buộc | Mô tả |
|---|---|---|---|
project |
string | ✓ | ID dự án. |
id |
string | ✓ | Định danh ổn định của chỉ số này (ví dụ mrr, active-users). |
title |
string | ✓ | Nhãn hiển thị trên ô chỉ số. |
value |
string | number | object | ✓ | Giá trị của chỉ số. Với kiểu số, truyền {"diff": N} để cộng hoặc trừ N theo kiểu nguyên tử (ví dụ {"diff": -1}). Không dùng được với value_type text. |
value_type |
string | ✓ | Một trong: number, text, currency, percent. |
currency |
string | Mã tiền tệ ISO 4217 (ví dụ EUR, USD). Bắt buộc khi value_type là currency. |
|
emoji |
string | Emoji hiển thị trên ô số liệu. Các định dạng được chấp nhận: ký tự emoji ("💰"), shortcode (":money-bag:") hoặc mã thập lục phân ("1F4B0"). Khi bỏ qua, ℹ️ được hiển thị theo mặc định mà không được lưu vào số liệu. Xem các emoji có sẵn. |
Ví dụ
curl -X PUT https://api.logsninja.com/v1/metrics \
-H "Authorization: Bearer YOUR_API_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"project": "YOUR_PROJECT_ID",
"id": "mrr",
"title": "MRR",
"value": 4900,
"value_type": "currency",
"currency": "EUR"
}'
await fetch('https://api.logsninja.com/v1/metrics', {
method: 'PUT',
headers: {
'Authorization': 'Bearer YOUR_API_TOKEN',
'Content-Type': 'application/json',
},
body: JSON.stringify({
project: 'YOUR_PROJECT_ID',
id: 'mrr',
title: 'MRR',
value: 4900,
value_type: 'currency',
currency: 'EUR',
}),
});
import requests
requests.put(
'https://api.logsninja.com/v1/metrics',
headers={
'Authorization': 'Bearer YOUR_API_TOKEN',
'Content-Type': 'application/json',
},
json={
'project': 'YOUR_PROJECT_ID',
'id': 'mrr',
'title': 'MRR',
'value': 4900,
'value_type': 'currency',
'currency': 'EUR',
},
)
Xóa chỉ số
https://api.logsninja.com/v1/metrics/:id?project=YOUR_PROJECT_ID
Xóa ô chỉ số khỏi bảng điều khiển.
Dự án
Danh sách dự án
https://api.logsninja.com/v1/org/projects
Trả về các dự án trong tổ chức theo từng trang. Token giới hạn theo dự án chỉ nhận được dự án đã liên kết. Chấp nhận tham số page (mặc định 1) và limit (mặc định 50, tối đa 200). Phản hồi gồm page, limit, total và has_more.
Tạo dự án
https://api.logsninja.com/v1/org/projects
Việc tạo dự án yêu cầu token có phạm vi toàn tổ chức. Token giới hạn theo dự án không thể tạo dự án.
| Trường | Kiểu | Bắt buộc | Mô tả |
|---|---|---|---|
name |
string | ✓ | Tên dự án. |
Tokens
Danh sách token
https://api.logsninja.com/v1/org/tokens
Trả về các token API trong tổ chức theo từng trang. Token giới hạn theo dự án chỉ nhận được các token liên kết với cùng dự án. Chấp nhận tham số page (mặc định 1) và limit (mặc định 50, tối đa 200). Phản hồi gồm page, limit, total, has_more và quyền can_manage_tokens của từng token. Giá trị token không bao giờ được trả lại sau khi tạo.
Tạo token
https://api.logsninja.com/v1/org/tokens
Thông tin xác thực gọi API phải có can_manage_tokens=true. Giá trị token chỉ được trả về một lần và không thể lấy lại. Bên gọi bị giới hạn theo dự án chỉ có thể tạo token khác cho chính dự án đó; bỏ qua project_id không cấp quyền truy cập toàn tổ chức.
| Trường | Kiểu | Bắt buộc | Mô tả |
|---|---|---|---|
name |
string | ✓ | Tên token. |
project_id |
string | Giới hạn token cho một dự án. Nếu bỏ qua, token có quyền truy cập vào tất cả các dự án trong tổ chức. | |
can_manage_tokens |
boolean | Cho phép token này tạo và ủy quyền các token khác trong giới hạn tổ chức hoặc dự án của nó. Mặc định là tắt. |
Ủy quyền thiết bị
Cho phép công cụ CLI hoặc tác nhân AI lấy token API mà không cần con người sao chép và dán thủ công. Công cụ yêu cầu một mã ngắn và hiển thị cho con người; một người dùng đã có tài khoản LogsNinja mở một liên kết và phê duyệt yêu cầu từ phiên trình duyệt của chính họ; sau đó công cụ tự động nhận được token. Việc này không bao giờ tạo tài khoản hay bỏ qua đăng ký – chỉ người dùng đã đăng nhập mới có thể phê duyệt yêu cầu.
Bắt đầu quy trình
https://api.logsninja.com/v1/device/authorize
Không cần xác thực. Trả về device_code, một user_code ngắn để hiển thị cho con người, và một verification_uri để mở trong trình duyệt.
{
"device_code": "a1b2c3...",
"user_code": "WXYZ-1234",
"verification_uri": "https://logsninja.com/en/my/tokens#devices",
"verification_uri_complete": "https://logsninja.com/en/my/tokens?user_code=WXYZ-1234#devices",
"expires_in": 600,
"interval": 5
}
Hiển thị user_code (hoặc liên kết verification_uri_complete) cho con người và yêu cầu họ mở và phê duyệt yêu cầu.
Thăm dò để lấy token
https://api.logsninja.com/v1/device/token
Không cần xác thực. Thăm dò bằng device_code theo khoảng thời gian đã cho ở trên cho đến khi trạng thái không còn là pending.
| Trường | Kiểu | Bắt buộc | Mô tả |
|---|---|---|---|
device_code |
string | ✓ | device_code được trả về bởi lệnh gọi authorize. |
Phản hồi là {"status": "pending"}, {"status": "denied"}, {"status": "expired"}, hoặc, khi đã được phê duyệt, {"status": "approved", "token": "..."}. Token chỉ được trả về đúng một lần – hãy lưu lại ngay lập tức.
Máy chủ MCP
Cho phép một tác nhân AI (Claude, v.v.) sử dụng LogsNinja trực tiếp từ một cuộc trò chuyện thay vì viết các lệnh gọi HTTP.
https://logsninja.com/mcp
Trỏ client MCP của bạn đến URL này, xác thực bằng cùng token API như phần còn lại của API này: Authorization: Bearer YOUR_API_TOKEN.
Claude Code
claude mcp add --transport http logsninja https://logsninja.com/mcp \
--header "Authorization: Bearer YOUR_API_TOKEN"
Claude Desktop
File cấu hình của Claude Desktop không còn chấp nhận trực tiếp url và headers của một server từ xa – chỉ hỗ trợ server stdio (command/args). Hãy kết nối đến endpoint HTTP này bằng mcp-remote:
{
"mcpServers": {
"logsninja": {
"command": "npx",
"args": [
"-y",
"mcp-remote",
"https://logsninja.com/mcp",
"--header",
"Authorization: Bearer YOUR_API_TOKEN"
]
}
}
}
| Nền tảng | Vị trí file cấu hình |
|---|---|
| macOS | ~/Library/Application Support/Claude/claude_desktop_config.json |
| Windows | %APPDATA%\Claude\claude_desktop_config.json |
Cursor
Cursor hỗ trợ trực tiếp url và headers của một server từ xa, không cần cầu nối:
{
"mcpServers": {
"logsninja": {
"url": "https://logsninja.com/mcp",
"headers": {
"Authorization": "Bearer YOUR_API_TOKEN"
}
}
}
}
File cấu hình: ~/.cursor/mcp.json (toàn cục) hoặc .cursor/mcp.json (dự án)
Codex CLI và ứng dụng ChatGPT
Cả hai đều dùng chung ~/.codex/config.toml – form Settings → Plugins → MCPs → Add Server của ứng dụng ChatGPT cũng ghi vào file này. Hãy chỉnh sửa trực tiếp để dùng bearer_token_env_var, đọc token từ một biến môi trường thay vì lưu dạng văn bản thuần:
[mcp_servers.logsninja]
url = "https://logsninja.com/mcp"
bearer_token_env_var = "LOGSNINJA_API_TOKEN"
Đặt biến môi trường trong shell profile trước khi khởi chạy Codex hoặc ứng dụng ChatGPT, ví dụ export LOGSNINJA_API_TOKEN=YOUR_API_TOKEN.
File cấu hình: ~/.codex/config.toml
Công cụ
| Công cụ | Mô tả |
|---|---|
list_projects, create_project |
Liệt kê các dự án trong phạm vi của bên gọi. Việc tạo dự án yêu cầu token có phạm vi toàn tổ chức. |
list_charts, create_chart, update_chart, delete_chart |
Cùng các trường và quy tắc xác thực như trình chỉnh sửa biểu đồ trên bảng điều khiển. |
list_widgets, create_widget, update_widget, reorder_widgets, delete_widget |
Cùng quy tắc bố cục masonry như các endpoint REST của widget. |
get_data_inventory |
Tên stream, tiêu đề sự kiện và khóa metadata đã biết – hữu ích trước khi xây dựng biểu đồ. |
preview_chart_data |
Tính toán dữ liệu của biểu đồ mà không tạo nó. |
search_emojis |
Tìm kiếm emoji theo tên, shortcode hoặc từ khóa – hữu ích để chọn emoji cho một sự kiện. |
get_documentation |
Toàn bộ tài liệu API dưới dạng Markdown, theo ngôn ngữ bạn chọn. |
list_events, get_event |
100 sự kiện gần nhất (tùy chọn theo stream), hoặc chi tiết một sự kiện cùng các sự kiện liền kề theo thời gian. Không phân trang. |
list_users, get_user |
100 người dùng gần nhất, hoặc chi tiết một người dùng theo id. Không phân trang hoặc tìm kiếm. |
list_streams, list_metrics |
Stream và chỉ số tùy chỉnh được định nghĩa trong một dự án. |
create_event, delete_event, create_or_update_user, delete_user, create_or_update_metric, delete_metric |
Giống các endpoint nạp dữ liệu – dùng để tạo và dọn dẹp dữ liệu thử nghiệm, không phải để gửi sự kiện sản xuất thực thay mặt người dùng. |
Hầu hết các tool nhận tham số project_id, bắt buộc trừ khi token bị giới hạn cho một dự án duy nhất – cùng quy tắc như các endpoint REST bên dưới.
Biểu đồ
Tạo và quản lý các biểu đồ giống như bạn tự xây dựng trên bảng điều khiển – mọi tùy chọn bên dưới và mọi quy tắc xác thực đều giống hệt nhau, dù bạn dùng trình chỉnh sửa biểu đồ trên bảng điều khiển hay API. Đây chỉ là cấu hình biểu đồ: nó định nghĩa những gì biểu đồ hiển thị, không phải giá trị đã tính toán – không có endpoint nào để lấy các điểm dữ liệu của biểu đồ qua API này.
Loại biểu đồ
Biểu đồ đường (line) vẽ một giá trị cho mỗi kỳ dưới dạng đường liền – phù hợp để theo dõi xu hướng theo thời gian. Biểu đồ tròn (pie) hiển thị một ảnh chụp nhanh duy nhất chia thành các lát – phù hợp để xem tỷ lệ trong nháy mắt. Biểu đồ cột (bar) hiển thị một cột mỗi kỳ; ngay khi bạn thêm một phân tách (xem « Group by » bên dưới), nó tự động được vẽ với các phân đoạn xếp chồng thay vì một cột duy nhất – không có loại « cột xếp chồng » riêng để chọn. Biểu đồ phễu (funnel) đặt ra một loại câu hỏi hoàn toàn khác: thay vì một chỉ số theo thời gian, nó cho biết có bao nhiêu người dùng giống nhau đã đi qua một chuỗi bước có thứ tự.
Khoảng thời gian và khoảng chia
Chọn khoảng thời gian biểu đồ nhìn lại: 7 ngày qua (7d), 30 ngày qua (30d), hoặc 90 ngày qua (90d). Bạn cũng có thể tự định kích thước cửa sổ trượt theo giờ, ngày hoặc tháng (duration, kèm periodDurationValue và periodDurationUnit, ví dụ « 45 ngày qua »), hoặc đặt ngày bắt đầu cố định luôn chạy đến hôm nay (custom, kèm periodDateFrom) – không có trường nào để đặt ngày kết thúc cố định, nó luôn chạy đến hôm nay.
Khoảng chia thời gian (granularity) quyết định cách khoảng thời gian đó được chia thành các đoạn: theo giờ, ngày, tuần hoặc tháng (hour, day, week, month). Nó không áp dụng cho biểu đồ phễu: chúng vẫn dùng khoảng thời gian ở trên để lọc sự kiện, nhưng hiển thị một cột cho mỗi bước thay vì một chuỗi đoạn theo thời gian.
Một số tổ hợp chỉ có 90 ngày lịch sử khả dụng, bất kể khoảng thời gian bạn chọn: một phễu, một biểu đồ tròn có phân tách, một phân tách theo quốc gia/người dùng/metadata, nhiều hơn một phân tách cùng lúc, bất kỳ phép tính nào khác ngoài đếm đơn giản, hoặc lọc theo metadata. Một phép đếm đơn giản không có phân tách, hoặc phân tách chỉ theo stream hoặc tiêu đề sự kiện, có thể lùi xa hơn.
Lọc sự kiện nào được tính
Theo mặc định, một biểu đồ bao gồm mọi sự kiện (all). Bạn có thể thu hẹp xuống một stream duy nhất (stream, ví dụ chỉ "payments"), một tiêu đề sự kiện duy nhất (title, ví dụ chỉ "Order placed"), hoặc các sự kiện khớp với một giá trị metadata cụ thể (metadata, ví dụ chỉ sự kiện có "plan" bằng "pro").
| Mục tiêu | Cấu hình |
|---|---|
| Chỉ đếm sự kiện trên stream "payments" | event_source_type: "stream", event_source_value: "payments" |
| Chỉ đếm sự kiện "Order placed", bất kể chúng ở stream nào | event_source_type: "title", event_source_value: "Order placed" |
| Chỉ đếm sự kiện có metadata "plan" bằng "pro" | event_source_type: "metadata", event_source_value: "plan=pro" |
Tổng hợp
Điều này quyết định cách các sự kiện khớp trong mỗi khoảng thời gian trở thành con số duy nhất được vẽ: đếm sự kiện đơn giản (count), đếm người dùng riêng biệt (count_distinct), hoặc một phép tính trên giá trị metadata dạng số của sự kiện – tổng (sum), trung bình (avg), nhỏ nhất (min), lớn nhất (max), hoặc trung vị (median). Với bất kỳ phép tính nào khác ngoài đếm đơn giản, bạn cũng chọn khóa metadata nào chứa con số đó qua aggregation_field; các sự kiện thiếu khóa đó, hoặc giá trị không phải số, sẽ bị bỏ qua.
| Mục tiêu | Cấu hình |
|---|---|
| Sự kiện mỗi ngày | aggregation: "count" |
| Người dùng duy nhất hoạt động mỗi ngày | aggregation: "count_distinct" |
| Tổng doanh thu mỗi ngày (khóa metadata "amount" trên sự kiện của bạn) | aggregation: "sum", aggregation_field: "amount" |
| Giá trị đơn hàng trung bình mỗi ngày (khóa metadata "amount" trên sự kiện của bạn) | aggregation: "avg", aggregation_field: "amount" |
| Đơn hàng nhỏ nhất mỗi ngày (khóa metadata "amount" trên sự kiện của bạn) | aggregation: "min", aggregation_field: "amount" |
| Đơn hàng lớn nhất mỗi ngày (khóa metadata "amount" trên sự kiện của bạn) | aggregation: "max", aggregation_field: "amount" |
| Thời lượng phiên trung vị mỗi ngày (khóa metadata "duration_seconds" trên sự kiện của bạn) | aggregation: "median", aggregation_field: "duration_seconds" |
Nhóm theo
Theo mặc định, một biểu đồ hiển thị một giá trị tổng hợp duy nhất cho mỗi kỳ. Việc nhóm (group_by) sẽ tách nó thành nhiều chuỗi hoặc phân đoạn thay vào đó – mỗi giá trị riêng biệt của thứ bạn dùng để nhóm – được vẽ dưới dạng các đường riêng biệt, phân đoạn xếp chồng, hoặc lát hình tròn tùy theo loại biểu đồ.
Bạn có thể nhóm theo stream (stream), tiêu đề sự kiện (title), quốc gia (country), hoặc người dùng (user) mà không cần cấu hình gì thêm, hoặc theo một khóa metadata tùy chọn (metadata, với aggregation_field chứa khóa dùng để tách).
| Mục tiêu | Cấu hình |
|---|---|
| Sự kiện mỗi ngày, một đường cho mỗi stream | type: line, aggregation: count, group_by: ["stream"] |
| Tiêu đề sự kiện nào phổ biến nhất mỗi ngày | type: bar, aggregation: count, group_by: ["title"] |
| Đăng ký mỗi ngày, chia theo quốc gia | type: bar, aggregation: count_distinct, group_by: ["country"] |
| So sánh hoạt động của một nhóm người dùng cụ thể nhỏ (đội của bạn, một vài tài khoản VIP) – một chuỗi cho mỗi người dùng khớp, vì vậy chỉ dễ đọc với một tập nhỏ, cố ý giới hạn | type: line, aggregation: count, group_by: ["user"] |
| Khối lượng sự kiện mỗi ngày, một phân đoạn cho mỗi gói (khóa metadata "plan" trên sự kiện của bạn, ví dụ free/pro/enterprise) | type: bar, aggregation: count, group_by: ["metadata"], aggregation_field: "plan" |
| Tỷ lệ sự kiện theo từng gói, dạng hình tròn | type: pie, aggregation: count, group_by: ["metadata"], aggregation_field: "plan" |
Một ràng buộc cần biết: khóa metadata bạn dùng để nhóm và khóa metadata bạn tổng hợp là cùng một cài đặt (aggregation_field), vì một biểu đồ chỉ có một khóa đó. Vì vậy "tổng số tiền đơn hàng mỗi ngày, chia theo gói" không thể thực hiện trong một biểu đồ duy nhất – bạn cần hoặc tính tổng số tiền không phân tách, hoặc đếm đơn hàng phân tách theo gói, không thể cả hai trên cùng một biểu đồ.
Biểu đồ phễu
Biểu đồ phễu (funnel) đặt ra một loại câu hỏi hoàn toàn khác: không phải « bao nhiêu sự kiện » mà là « bao nhiêu người dùng giống nhau đã đi từ bước 1, sang bước 2, sang bước 3 ». Bạn cung cấp một danh sách có thứ tự gồm ít nhất hai tiêu đề sự kiện qua funnel_steps; biểu đồ hiển thị một cột cho mỗi bước, mỗi cột chỉ đếm những người dùng đã hoàn thành mọi bước trước đó theo đúng thứ tự. Khoảng thời gian ở trên vẫn áp dụng, nhưng khoảng chia, phép tổng hợp và việc phân nhóm thì không.
| Mục tiêu | Cấu hình |
|---|---|
| Chuyển đổi đăng ký: bao nhiêu người đã xem giá, bắt đầu thanh toán, rồi hoàn tất | type: "funnel", funnel_steps: ["Pricing viewed", "Checkout started", "Subscription created"] |
Tùy chọn hiển thị
Bạn có thể hiện hoặc ẩn chú giải (show_legend), và chọn màu riêng (colors, một mảng mã hex áp dụng theo thứ tự) cho mỗi chuỗi hoặc phân đoạn thay vì bảng màu mặc định. Bạn cũng có thể chuyển sang tổng lũy kế (cumulative) thay vì giá trị theo từng kỳ – chỉ có ý nghĩa với biểu đồ đường hoặc cột cộng dồn một phép đếm hoặc tổng, vì tổng lũy kế của một giá trị trung bình, một số lượng người dùng riêng biệt, hoặc một biểu đồ tròn/phễu thì không có ý nghĩa gì.
Liệt kê biểu đồ
https://api.logsninja.com/v1/org/charts
Chấp nhận tham số truy vấn project_id, bắt buộc trừ khi token đã được giới hạn cho một dự án duy nhất.
Tạo biểu đồ
https://api.logsninja.com/v1/org/charts
Cập nhật biểu đồ
https://api.logsninja.com/v1/org/charts/{id}
Chỉ những trường bạn gửi mới được thay đổi.
Xóa biểu đồ
https://api.logsninja.com/v1/org/charts/{id}
| Trường | Kiểu | Bắt buộc | Mô tả |
|---|---|---|---|
project_id |
string | ✓ | Bắt buộc trừ khi token được giới hạn cho một dự án duy nhất. |
name |
string | ✓ | Tên biểu đồ. |
type |
string | ✓ | line, bar, pie, funnel. Không có loại « cột xếp chồng » riêng: biểu đồ cột có thiết lập group_by vẫn là loại bar, được tự động hiển thị dưới dạng các phân đoạn xếp chồng. |
period |
string | ✓ | 7d, 30d, 90d, duration, custom |
period_date_from |
string | Bắt buộc khi period là custom, định dạng YYYY-MM-DD. | |
period_duration_value / period_duration_unit |
integer / string | Bắt buộc khi period là duration. Đơn vị là hour, day hoặc month. | |
granularity |
string | ✓ | hour, day, week, month |
aggregation |
string | ✓ | count, count_distinct, sum, avg, min, max, median |
aggregation_field |
string | Tên trường metadata, bắt buộc đối với sum/avg/min/max/median và khi group_by bao gồm metadata. | |
group_by |
array | Bất kỳ giá trị nào trong stream, title, country, user, metadata. | |
event_source_type |
string | ✓ | all, stream, title, metadata |
event_source_value |
string | Bắt buộc trừ khi event_source_type là all. | |
funnel_steps |
array | Ít nhất hai tên bước theo thứ tự, bắt buộc khi type là funnel. | |
show_legend / cumulative |
boolean | cumulative chỉ được áp dụng cho biểu đồ line/bar với phép tổng hợp count hoặc sum. | |
colors |
array | Màu của các chuỗi dữ liệu dưới dạng mã hex. |
Dữ liệu lịch sử vượt quá thời gian lưu trữ không khả dụng đối với các tổ hợp quét sự kiện thô (funnel, pie có group-by, group-by theo country/user/metadata, hoặc bất kỳ phép tổng hợp nào khác ngoài count).
Widget
Quản lý những ô nào xuất hiện trên bảng điều khiển và cách chúng được sắp xếp – đây chỉ là cấu hình bố cục, không phải dữ liệu hiển thị bên trong một ô.
Bảng điều khiển là bố cục kiểu masonry, không phải lưới cứng nhắc. Các widget « nhỏ » (metric, online_users) được thiết kế để chiếm một phần ba hoặc một nửa hàng (width 1 hoặc 2) và hiển thị với chính xác một nửa chiều cao trực quan của các widget « lớn » (chart, world_map, events_7d, top_countries), được thiết kế để chiếm một nửa hàng hoặc toàn bộ hàng (width 2 hoặc 3). Hãy nhớ điều này khi sắp xếp bảng điều khiển qua API.
Liệt kê widget
https://api.logsninja.com/v1/org/widgets
Chấp nhận tham số truy vấn project_id, bắt buộc trừ khi token đã được giới hạn cho một dự án duy nhất.
Thêm widget
https://api.logsninja.com/v1/org/widgets
| Trường | Kiểu | Bắt buộc | Mô tả |
|---|---|---|---|
project_id |
string | ✓ | Bắt buộc trừ khi token được giới hạn cho một dự án duy nhất. |
type |
string | ✓ | metric, chart, events_7d, world_map, top_countries, online_users. Chỉ có thể tồn tại một widget cho mỗi loại gốc (events_7d/world_map/top_countries/online_users) trên mỗi bảng điều khiển. |
metric_id |
string | Bắt buộc khi type là metric. Phải là id của một chỉ số đã tồn tại. | |
chart_id |
string | Bắt buộc khi type là chart. Phải là một biểu đồ thuộc cùng dự án. | |
width |
integer | 1 (1/3), 2 (1/2, mặc định), hoặc 3 (toàn hàng). |
Thay đổi kích thước hoặc di chuyển widget
https://api.logsninja.com/v1/org/widgets/{id}
Gửi width và/hoặc position (chỉ số bắt đầu từ 0 trong số các widget của dự án). Đặt một vị trí sẽ di chuyển widget đến đó và đẩy mọi widget phía sau xuống một bậc – nó không hoán đổi hai widget. Chỉ những trường bạn gửi mới được thay đổi.
Sắp xếp lại toàn bộ bảng điều khiển
https://api.logsninja.com/v1/org/widgets/reorder
Gửi order dưới dạng danh sách đầy đủ, có thứ tự của mọi id widget trong dự án (danh sách không đầy đủ sẽ bị từ chối), và tùy chọn widths dưới dạng bản đồ id sang width.
Xóa widget
https://api.logsninja.com/v1/org/widgets/{id}
Mã phản hồi
| Endpoint | Thành công | Nội dung |
|---|---|---|
POST /v1/events |
201 | { "id": "...", "image_count": 0, "images_status": "none", "notification_queued": true } |
DELETE /v1/events/:id |
200 | { "ok": true } |
PUT /v1/users |
200 | { "id": "..." } |
DELETE /v1/users/:id |
200 | { "ok": true } |
POST /v1/ping |
200 | { "ok": true } |
PUT /v1/metrics |
200 | { "id": "..." } |
DELETE /v1/metrics/:id |
200 | { "ok": true } |
Mã lỗi: 400 lỗi xác thực, 401 token thiếu hoặc không hợp lệ, 403 token bị giới hạn cho dự án khác, 404 không tìm thấy dự án.
Tham chiếu emoji
1837 emoji được hỗ trợ
mặt cười & cảm xúc
cười
yêu thương
lè lưỡi
tay
trung lập / hoài nghi
buồn ngủ
mệt mỏi
đội mũ
đeo kính
lo lắng
tiêu cực
hóa trang
mặt mèo
mặt khỉ
trái tim
cảm xúc
người & cơ thể
ngón tay mở
ngón tay một phần
chỉ hướng
ngón tay khép
bàn tay
đạo cụ
bộ phận cơ thể
người
cử chỉ
vai trò & nghề nghiệp
giả tưởng
hoạt động
vận động viên
nghỉ ngơi
gia đình
ký hiệu người
động vật & thiên nhiên
động vật có vú
chim
động vật lưỡng cư
bò sát
sinh vật biển
côn trùng
hoa
cây khác
thức ăn & đồ uống
trái cây
rau củ
chế biến sẵn
châu Á
đồ ngọt & kẹo
đồ uống
đồ dùng bếp
du lịch & địa điểm
địa cầu & bản đồ
vị trí địa lý
tòa nhà
công trình tôn giáo
địa điểm khác
đường bộ
đường thủy
hàng không
khách sạn
thời gian
thời tiết
hoạt động
sự kiện
giải thưởng & huy chương
thể thao
trò chơi
nghệ thuật & thủ công
đồ vật
quần áo
âm thanh
âm nhạc
nhạc cụ
điện thoại
máy tính
ánh sáng, phim & video
sách & giấy
tiền
thư
viết
văn phòng
ổ khoá & chìa khóa
dụng cụ
thiết bị khoa học
y tế
hộ gia đình
đồ vật khác
ký hiệu
biển báo giao thông
biểu tượng cảnh báo
mũi tên
biểu tượng tôn giáo
hoàng đạo
ký hiệu âm thanh & video
giới tính
kí hiệu toán học
dấu câu
tiền tệ
ký hiệu khác
phím số
chữ & số
hình dạng & màu sắc
cờ
cờ khác
quốc kỳ
