GODRICH

n8n Automation Basics for Beginners — 9 Mẫu API

n8n là công cụ nối app và API lại với nhau, không cần viết backend hay thuê developer.

Tự chạy · bấm ô để tới mục đó · cả 9 trong một zip

9 workflow được xếp theo đúng thứ tự khi bạn thực sự dựng một automation. Hai cái đầu gọi API (01 query params, 02 phân trang), hai cái tiếp theo chỉnh lại dữ liệu nhận về (03 biến đổi, 04 gộp nhiều lệnh gọi), một cái gửi dữ liệu đi (05 tạo hoặc cập nhật), ba cái phòng khi thất bại (06 thử lại, 07 rẽ nhánh theo status, 08 giãn tốc độ gọi), và cái cuối đảo ngược hướng — nhận request thay vì gửi đi (09 webhook). Cứ theo thứ tự này, không cần đọc code bạn cũng thấy vì sao automation thật thường có hình dạng như vậy.

01GET kèm query params

HTTP Request gắn postId làm query parameter để lấy danh sách comment, rồi Set chỉ giữ lại name, email, body. Đây là dạng URL có dấu hỏi phổ biến nhất bạn sẽ gặp. Trong thực tế, dạng này hay dùng để lấy comment của một bài viết, gọi API tìm kiếm/lọc.

HTTP Request GET쿼리 파라미터V2 실행 확인
{
  "name": "Get Comments",
  "type": "n8n-nodes-base.httpRequest",
  "typeVersion": 4.5,
  "parameters": {
    "method": "GET",
    "url": "https://jsonplaceholder.typicode.com/comments",
    "sendQuery": true,
    "queryParameters": {
      "parameters": [
        { "name": "postId", "value": "1" }
      ]
    },
    "options": {}
  }
}

02Lấy dữ liệu theo từng trang

Code tạo số trang 1, 2, 3, rồi Loop Over Items đưa từng trang vào HTTP Request và quay lại chính nó để gọi trang kế tiếp. Vì HTTP thay hẳn dữ liệu item bằng response, Tag Page phải trỏ thẳng tới node gốc theo tên để lấy lại số trang. Trong thực tế, dạng này hay dùng để thu thập toàn bộ API danh sách, kéo dữ liệu nhiều hơn một trang.

Loop Over Items_page·_limitV2 실행 확인
{
  "name": "Tag Page",
  "type": "n8n-nodes-base.set",
  "typeVersion": 3.5,
  "parameters": {
    "mode": "manual",
    "assignments": {
      "assignments": [
        {
          "id": "1",
          "name": "page",
          "value": "={{ $('Make Pages').item.json.page }}",
          "type": "number"
        }
      ]
    },
    "includeOtherFields": true,
    "options": {}
  }
}

03Biến đổi dữ liệu trả về

HTTP Request gọi một API thời tiết không cần key, rồi Code tính đổi độ C sang độ F và viết một dòng tóm tắt. Đây là ví dụ ngắn nhất về việc định dạng lại response thay vì dùng nguyên bản nó trả về. Trong thực tế, dạng này hay dùng để đổi đơn vị, chuẩn hóa tên field trong response.

HTTP RequestCode 변환V2 실행 확인
{
  "name": "Convert Units",
  "type": "n8n-nodes-base.code",
  "typeVersion": 2,
  "parameters": {
    "jsCode": "const c = $input.first().json.current.temperature_2m;\nconst f = Math.round((c * 9 / 5 + 32) * 10) / 10;\nreturn [{ json: { tempC: c, tempF: f, summary: `Seoul is ${c}C (${f}F)` } }];"
  }
}

04Nối ba lệnh gọi HTTP

Ba node HTTP Request lấy users, posts, todos riêng biệt, Set gắn field source để đánh dấu nguồn, rồi Merge ở chế độ Append xếp cả ba danh sách thành một. Khác với ghép theo khóa, cái này chỉ nối chồng kết quả lại. Trong thực tế, dạng này hay dùng để gộp kết quả nhiều API vào một bảng, hợp log từ ba kênh thông báo.

HTTP Request ×3Merge appendV2 실행 확인
{
  "name": "Combine Three",
  "type": "n8n-nodes-base.merge",
  "typeVersion": 3.2,
  "parameters": {
    "mode": "append",
    "numberInputs": 3
  }
}

05Tạo mới hoặc cập nhật

Code phát ra một item để tạo mới và một item để cập nhật, IF chia đường: một bên gửi POST (tạo), bên kia gửi PUT (cập nhật), rồi Merge gộp kết quả lại. Đây là bộ khung quen thuộc để quyết định ngay tại chỗ một resource là mới hay đã tồn tại. Trong thực tế, dạng này hay dùng để upsert bản ghi CRM, gộp tạo và sửa tồn kho trong một workflow.

IF 분기POST + PUTV2 실행 확인
{
  "name": "Update Post",
  "type": "n8n-nodes-base.httpRequest",
  "typeVersion": 4.5,
  "parameters": {
    "method": "PUT",
    "url": "=https://jsonplaceholder.typicode.com/posts/{{ $json.id }}",
    "sendBody": true,
    "specifyBody": "json",
    "jsonBody": "={{ JSON.stringify({ id: $json.id, title: $json.title, body: $json.body, userId: $json.userId }) }}"
  }
}

06Thử lại khi thất bại

Bản thân node HTTP Request được cấu hình thử lại 3 lần, cách nhau 1.5 giây, rồi Set ghi kèm chính sách đó vào kết quả. Vì mọi thứ nằm sẵn trong node nên bạn không cần thêm IF hay vòng lặp nào cả. Trong thực tế, dạng này hay dùng để gọi API ngoài không ổn định, hấp thụ lỗi tạm thời trong batch chạy đêm.

retryOnFailmaxTries 3V2 실행 확인
{
  "name": "Get User With Retry",
  "type": "n8n-nodes-base.httpRequest",
  "typeVersion": 4.5,
  "retryOnFail": true,
  "maxTries": 3,
  "waitBetweenTries": 1500,
  "onError": "continueRegularOutput",
  "parameters": {
    "method": "GET",
    "url": "https://jsonplaceholder.typicode.com/users/1"
  }
}

07Rẽ nhánh theo mã trạng thái

Với tùy chọn Never Error, HTTP Request nhận về cả ba phản hồi 200, 404, 500 mà không bị dừng, rồi Switch định tuyến chúng thành ba nhánh — thành công, lỗi phía client, lỗi phía server — theo dải mã trạng thái. Workflow vẫn chạy tiếp dù lệnh gọi thất bại. Trong thực tế, dạng này hay dùng để rẽ nhánh khi API thanh toán lỗi, gửi cảnh báo khác nhau theo trạng thái.

neverErrorSwitch 3 routesV2 실행 확인
{
  "name": "Call Endpoint",
  "type": "n8n-nodes-base.httpRequest",
  "typeVersion": 4.5,
  "parameters": {
    "method": "GET",
    "url": "={{ $json.url }}",
    "options": {
      "response": {
        "response": {
          "fullResponse": true,
          "neverError": true
        }
      }
    }
  }
}

08Chậm lại để tránh giới hạn tốc độ

Loop Over Items đưa từng ID trong ba ID vào HTTP Request, rồi Wait nghỉ 1 giây mỗi lần trước khi quay lại vòng lặp. Bạn dùng nguyên mẫu này khi API giới hạn số lần gọi mỗi giây. Trong thực tế, dạng này hay dùng để tránh vượt giới hạn khi gọi API hàng loạt, điều tiết tốc độ thu thập.

Loop Over ItemsWait 1sV2 실행 확인
{
  "name": "Throttle",
  "type": "n8n-nodes-base.wait",
  "typeVersion": 1.1,
  "parameters": {
    "resume": "timeInterval",
    "amount": 1,
    "unit": "seconds"
  }
}

09Webhook phản hồi đa nhánh

Webhook nhận một POST, Switch chia theo field type trong body thành ba nhánh — order, refund, và còn lại — mỗi nhánh gắn nhãn route, rồi Respond to Webhook luôn trả về 200 kèm nhãn đó. Khác với kiểm tra đúng/sai, cái này phản hồi theo nhiều nhánh cùng lúc, và mới chỉ xác minh được bước import — chạy thật cần một URL webhook đang sống. Trong thực tế, dạng này hay dùng để nhận sự kiện thanh toán, hoàn tiền, và các loại khác trên một webhook, định tuyến intent chatbot.

WebhookSwitch 3 routesV1 가져오기 확인
{
  "name": "Route By Type",
  "type": "n8n-nodes-base.switch",
  "typeVersion": 3.4,
  "parameters": {
    "mode": "rules",
    "rules": {
      "values": [
        {
          "conditions": {
            "conditions": [
              {
                "leftValue": "={{ $json.body.type }}",
                "rightValue": "order",
                "operator": { "type": "string", "operation": "equals" }
              }
            ]
          },
          "outputKey": "order"
        }
      ]
    },
    "options": { "fallbackOutput": "extra", "renameFallbackOutput": "other" }
  }
}

Chuẩn bị — tài khoản, quyền, phiên bản

Cột chuẩn bị toàn ghi "không có" nhưng bảng này vẫn cần thiết vì grade và phiên bản n8n khác nhau ở từng item. Grade chia làm ba mức V0 (chỉ đúng cấu trúc), V1 (đã xác minh import), V2 (đã chạy và kiểm tra) — bộ này có tám item chạm V2, riêng 09 dừng thành thật ở V1.

Item Grade Chuẩn bị Phiên bản n8n
01 GET kèm query params V2 Không có 2.38.5
02 Lấy dữ liệu theo từng trang V2 Không có 2.38.5
03 Biến đổi dữ liệu trả về V2 Không có 2.38.5
04 Nối ba lệnh gọi HTTP V2 Không có 2.38.5
05 Tạo mới hoặc cập nhật V2 Không có 2.38.5
06 Thử lại khi thất bại V2 Không có 2.38.5
07 Rẽ nhánh theo mã trạng thái V2 Không có 2.38.5
08 Chậm lại để tránh giới hạn tốc độ V2 Không có 2.38.5
09 Webhook phản hồi đa nhánh V1 (đã xác minh import; chạy thật cần URL webhook của bạn) Không có 2.38.5

Đưa file lên canvas n8n thì tùy bạn chọn cách nào cũng được. Dán thẳng JSON vào canvas bằng Ctrl/Cmd+V, hoặc dùng Import from File ở menu trên cùng để chọn file sau khi giải nén. Sau khi nó xuất hiện, bấm Test workflow ở góc trên bên trái, hoặc bấm nút play trên Manual Trigger, để xem cả luồng chạy ngay tại chỗ.

Bẫy nằm ở đâu

Chỗ khiến mình loay hoay nhất là tùy chọn Never Error ở item 07. Chỉ bật Never Error thì HTTP Request không còn làm workflow chết khi gặp 4xx hay 5xx nữa, nhưng field statusCode lại biến mất luôn, nên chẳng có gì để rẽ nhánh theo status cả — phải bật thêm Full Response thì statusCode, headers, body mới gộp về cùng lúc. Mật khẩu mở file zip này là kjnkjsfx, giải nén ra là thấy ngay chín file JSON nằm trong workflows/. Cấu hình thử lại ở item 06 cũng có bẫy tương tự: các giá trị như retryOnFail, maxTries không nằm trong parameters mà nằm ở ngay đỉnh của node (tab Settings), nên khi tự viết JSON bằng tay rất dễ đặt nhầm chỗ.

FAQ

Tài khoản n8n cloud có mở được không?

Mở được. Không cái nào trong chín workflow này cần credential đòi tài khoản hay community node, nên chúng import y nguyên trên cả bản cloud miễn phí. Riêng item 09 là ngoại lệ — muốn chạy thật thì phải gửi request tới URL webhook thật mà cloud của bạn cấp.

Không biết JavaScript thì có dùng được không?

Được. n8n vận hành bằng cách kéo node nối lại và điền vào ô trống, nên JSON trong bài này chỉ để bạn nhìn vào bên trong, không phải để gõ tay. Nếu dùng công cụ AI, dán nguyên văn trong prompt.md cũng ra cùng một cấu trúc.

Gặp lỗi typeVersion thì làm sao?

Tạo mới cùng loại node đó trên chính n8n của bạn rồi export ra là biết ngay phiên bản nó thật sự hỗ trợ. Chín workflow này đã được xác minh trên n8n 2.38.5 (Node 24), và tên các tùy chọn thử lại, xử lý lỗi đều theo đúng tài liệu HTTP Request chính thức của n8n.

Nếu bạn mới chạm vào n8n lần đầu, danh mục automation có thêm ví dụ cùng hướng, còn trang giới thiệu ghi rõ trang này kiểm chứng mọi thứ theo tiêu chuẩn nào.

Nhập mật khẩu file nén

Mật khẩu nằm ngay trong bài viết này. Đọc tới đó bạn sẽ thấy.