Chi tiết hóa đơn đầu vào
API này dùng để lấy thông tin chi tiết của một hóa đơn đầu vào, bao gồm thông tin người bán, người mua, danh sách hàng hóa/dịch vụ và tổng hợp thuế suất.
POST
URLhttps://open-api.tingee.vn/v1/e-invoice/input/detail
Lấy chi tiết hóa đơn đầu vào theo invoiceCode.
Header Request
| Header | Bắt buộc | Mô tả |
|---|---|---|
Content-Type | ✓ | application/json |
x-client-id | ✓ | Mã định danh của đối tác do TINGEE cung cấp. |
x-signature | ✓ | Chữ ký xác thực HMAC SHA512. Xem thêm tại Cách sinh chữ ký. |
x-request-timestamp | ✓ | Thời gian gửi request (format: yyyyMMddHHmmssSSS, múi giờ UTC+7) |
Body Parameter
| Trường | Kiểu | Bắt buộc | Mô tả |
|---|---|---|---|
merchantId | number | ~ | ID của Merchant (Bắt buộc nếu kết nối bằng tài khoản Master Merchant). |
accountId | number | ✕ | ID tài khoản hóa đơn điện tử (lấy từ Danh sách tài khoản). Bỏ trống để dùng tài khoản mặc định. |
invoiceCode | string | ✓ | Mã định danh hóa đơn, lấy từ API Danh sách hóa đơn đầu vào. |
Ví dụ mã nguồn
- cURL
- NestJS
- C#
- Java
- PHP
curl --location --request POST 'https://open-api.tingee.vn/v1/e-invoice/input/detail' \
--header 'accept: application/json' \
--header 'x-client-id: YOUR_CLIENT_ID' \
--header 'x-request-timestamp: 20240509154004003' \
--header 'x-signature: YOUR_SIGNATURE' \
--header 'Content-Type: application/json' \
--data '{
"invoiceCode": "a1b2c3d4-5e6f-7a8b-9c0d-1e2f3a4b5c6d"
}'
import axios from "axios";
import { createHmac } from "crypto";
const CLIENT_ID = "YOUR_CLIENT_ID";
const SECRET_KEY = "YOUR_SECRET_KEY";
// Timestamp theo múi giờ UTC+7, định dạng yyyyMMddHHmmssSSS
function getTimestamp() {
return new Date(Date.now() + 7 * 60 * 60 * 1000)
.toISOString()
.replace(/[-:TZ.]/g, "")
.slice(0, 17);
}
async function eInvoiceInputDetail() {
const body = {
invoiceCode: "a1b2c3d4-5e6f-7a8b-9c0d-1e2f3a4b5c6d",
};
const bodyJson = JSON.stringify(body);
const timestamp = getTimestamp();
const signature = createHmac("sha512", SECRET_KEY)
.update(`${timestamp}:${bodyJson}`)
.digest("hex");
const res = await axios.request({
method: "POST",
url: "https://open-api.tingee.vn/v1/e-invoice/input/detail",
data: bodyJson,
headers: {
accept: "application/json",
"Content-Type": "application/json",
"x-client-id": CLIENT_ID,
"x-request-timestamp": timestamp,
"x-signature": signature,
},
});
console.log(res.data);
}
eInvoiceInputDetail();
using System;
using System.Net.Http;
using System.Security.Cryptography;
using System.Text;
using System.Text.Encodings.Web;
using System.Text.Json;
using System.Threading.Tasks;
public class Program
{
private const string ClientId = "YOUR_CLIENT_ID";
private const string SecretKey = "YOUR_SECRET_KEY";
private static readonly HttpClient Client = new HttpClient();
public static async Task Main()
{
var body = new
{
invoiceCode = "a1b2c3d4-5e6f-7a8b-9c0d-1e2f3a4b5c6d"
};
// Không escape tiếng Việt / ký tự đặc biệt để khớp với JSON.stringify phía TINGEE
var jsonOptions = new JsonSerializerOptions { Encoder = JavaScriptEncoder.UnsafeRelaxedJsonEscaping };
var bodyJson = JsonSerializer.Serialize(body, jsonOptions);
// Timestamp theo múi giờ UTC+7, định dạng yyyyMMddHHmmssSSS
var timestamp = DateTime.UtcNow.AddHours(7).ToString("yyyyMMddHHmmssfff");
var signature = HmacSha512(SecretKey, $"{timestamp}:{bodyJson}");
var request = new HttpRequestMessage(HttpMethod.Post, "https://open-api.tingee.vn/v1/e-invoice/input/detail");
request.Headers.Add("accept", "application/json");
request.Headers.Add("x-client-id", ClientId);
request.Headers.Add("x-request-timestamp", timestamp);
request.Headers.Add("x-signature", signature);
request.Content = new StringContent(bodyJson, Encoding.UTF8, "application/json");
var response = await Client.SendAsync(request);
Console.WriteLine(await response.Content.ReadAsStringAsync());
}
private static string HmacSha512(string key, string message)
{
using var hmac = new HMACSHA512(Encoding.UTF8.GetBytes(key));
var hash = hmac.ComputeHash(Encoding.UTF8.GetBytes(message));
return Convert.ToHexString(hash).ToLower();
}
}
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.nio.charset.StandardCharsets;
import java.time.ZoneId;
import java.time.ZonedDateTime;
import java.time.format.DateTimeFormatter;
import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;
public class Main {
private static final String CLIENT_ID = "YOUR_CLIENT_ID";
private static final String SECRET_KEY = "YOUR_SECRET_KEY";
public static void main(String[] args) throws Exception {
// JSON minified, giống kết quả JSON.stringify()
String bodyJson = "{\"invoiceCode\":\"a1b2c3d4-5e6f-7a8b-9c0d-1e2f3a4b5c6d\"}";
// Timestamp theo múi giờ UTC+7, định dạng yyyyMMddHHmmssSSS
String timestamp = ZonedDateTime.now(ZoneId.of("Asia/Ho_Chi_Minh"))
.format(DateTimeFormatter.ofPattern("yyyyMMddHHmmssSSS"));
String signature = hmacSha512(SECRET_KEY, timestamp + ":" + bodyJson);
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://open-api.tingee.vn/v1/e-invoice/input/detail"))
.header("accept", "application/json")
.header("Content-Type", "application/json")
.header("x-client-id", CLIENT_ID)
.header("x-request-timestamp", timestamp)
.header("x-signature", signature)
.method("POST", HttpRequest.BodyPublishers.ofString(bodyJson, StandardCharsets.UTF_8))
.build();
HttpResponse<String> response = HttpClient.newHttpClient()
.send(request, HttpResponse.BodyHandlers.ofString());
System.out.println(response.body());
}
private static String hmacSha512(String key, String data) throws Exception {
Mac mac = Mac.getInstance("HmacSHA512");
mac.init(new SecretKeySpec(key.getBytes(StandardCharsets.UTF_8), "HmacSHA512"));
byte[] hash = mac.doFinal(data.getBytes(StandardCharsets.UTF_8));
StringBuilder hex = new StringBuilder();
for (byte b : hash) hex.append(String.format("%02x", b));
return hex.toString();
}
}
<?php
$clientId = "YOUR_CLIENT_ID";
$secretKey = "YOUR_SECRET_KEY";
$body = [
"invoiceCode" => "a1b2c3d4-5e6f-7a8b-9c0d-1e2f3a4b5c6d",
];
// Không escape "/" và tiếng Việt để khớp với JSON.stringify phía TINGEE
$bodyJson = json_encode($body, JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE);
// Timestamp theo múi giờ UTC+7, định dạng yyyyMMddHHmmssSSS
$now = new DateTime("now", new DateTimeZone("Asia/Ho_Chi_Minh"));
$timestamp = $now->format("YmdHisv");
$signature = hash_hmac("sha512", $timestamp . ":" . $bodyJson, $secretKey);
$ch = curl_init();
curl_setopt_array($ch, [
CURLOPT_URL => "https://open-api.tingee.vn/v1/e-invoice/input/detail",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => $bodyJson,
CURLOPT_HTTPHEADER => [
"Accept: application/json",
"Content-Type: application/json",
"x-client-id: " . $clientId,
"x-request-timestamp: " . $timestamp,
"x-signature: " . $signature,
],
]);
$response = curl_exec($ch);
if ($response === false) {
echo "cURL Error: " . curl_error($ch);
} else {
echo $response;
}
curl_close($ch);
Response mẫu
{
"code": "00",
"message": "Success",
"data": {
"invoiceCode": "a1b2c3d4-5e6f-7a8b-9c0d-1e2f3a4b5c6d",
"fileHistoryId": "f9e8d7c6-b5a4-4321-9876-543210fedcba",
"invoiceName": "Hóa đơn giá trị gia tăng",
"invoicePattern": "1",
"invoiceSeries": "C26TAA",
"invoiceNo": "0000125",
"invoiceDate": "2026-10-05",
"signedDate": "2026-10-05",
"receivedDate": "2026-10-06",
"approvedDate": null,
"paymentDate": null,
"currency": "VND",
"exchangeRate": 1,
"paymentMethod": "TM/CK",
"sellerName": "CÔNG TY TNHH ABC",
"sellerTaxCode": "0101234567",
"sellerAddress": "Hà Nội",
"buyerName": "CÔNG TY CP XYZ",
"buyerTaxCode": "0109876543",
"buyerAddress": "TP. Hồ Chí Minh",
"totalBeforeTax": 1000000,
"taxAmount": 80000,
"discountAmount": 0,
"totalAfterTax": 1080000,
"amountInWords": "Một triệu không trăm tám mươi nghìn đồng",
"invoiceStatus": 1,
"approvalStatus": 1,
"invoiceType": 1,
"note": null,
"items": [
{
"id": 987654,
"lineNumber": 1,
"itemName": "Dịch vụ phần mềm",
"unitName": "Gói",
"quantity": 1,
"unitPrice": 1000000,
"totalBeforeTax": 1000000,
"taxRate": "8%",
"taxAmount": 80000,
"itemType": 1,
"isPromotion": false
}
],
"taxRateSummaries": [
{
"id": 55501,
"taxRate": "8%",
"taxAmount": 80000
}
]
}
}
| Trường | Kiểu | Mô tả |
|---|---|---|
code | string | Mã kết quả (00 = Thành công). |
message | string | Thông điệp phản hồi. |
data.invoiceCode | string | Mã định danh hóa đơn. |
data.fileHistoryId | string | Mã lịch sử file hóa đơn tại nhà cung cấp. |
data.invoiceName, invoicePattern, invoiceSeries, invoiceNo | string | Tên, mẫu số, ký hiệu và số hóa đơn. |
data.invoiceDate, signedDate, receivedDate, approvedDate, paymentDate | string | Ngày lập, ngày ký, ngày nhận, ngày duyệt, ngày thanh toán. |
data.currency, exchangeRate | string, number | Loại tiền tệ (mặc định VND) và tỷ giá (mặc định 1). |
data.paymentMethod | string | Hình thức thanh toán. |
data.sellerName, sellerTaxCode, sellerAddress | string | Thông tin người bán. |
data.buyerName, buyerTaxCode, buyerAddress | string | Thông tin người mua. |
data.totalBeforeTax, taxAmount, discountAmount, totalAfterTax | number | Tổng tiền trước thuế, tiền thuế, chiết khấu, tổng thanh toán. |
data.amountInWords | string | Số tiền bằng chữ. |
data.invoiceStatus | number | Trạng thái hóa đơn (theo dữ liệu của nhà cung cấp). |
data.approvalStatus | number | Trạng thái phê duyệt: 1 Chờ duyệt, 2 Đã duyệt, 3 Không duyệt, 4 Đã hủy, 5 Đã xử lý. |
data.invoiceType | number | Loại hóa đơn (theo dữ liệu của nhà cung cấp). |
data.note | string | Ghi chú (nếu có). |
data.items[] | array | Danh sách dòng hàng hóa/dịch vụ: id, lineNumber (số thứ tự), itemName, unitName, quantity, unitPrice, totalBeforeTax (thành tiền trước thuế), taxRate, taxAmount, itemType (1 Hàng hóa/Dịch vụ, 4 Ghi chú), isPromotion (hàng khuyến mại). |
data.taxRateSummaries[] | array | Tổng hợp tiền thuế theo từng thuế suất: id, taxRate, taxAmount. |
Mã lỗi thường gặp
| Code | Mô tả | Hướng xử lý |
|---|---|---|
400 | Lấy chi tiết hóa đơn đầu vào thất bại | Kiểm tra invoiceCode. message chứa mô tả chi tiết. |
2036 | Tài khoản chưa đăng ký dịch vụ Hóa đơn đầu vào | Cập nhật tài khoản với services chứa input-invoice qua API Tạo/Cập nhật tài khoản. |
2007 | Nhà cung cấp chưa được hỗ trợ | Hóa đơn đầu vào chỉ hỗ trợ tài khoản nhà cung cấp x-cyber. |
2032 | Chưa cấu hình tài khoản mặc định | Truyền accountId, hoặc đặt một tài khoản làm mặc định. |
1057 | Không tìm thấy thông tin tài khoản | Kiểm tra accountId. |
1095, 1096 | Lỗi merchantId của Master Merchant | Truyền merchantId thuộc Master Merchant đang gọi API. |
90, 91, 92, 97 | Lỗi xác thực request (timestamp, client-id, chữ ký) | Xem Mã lỗi hệ thống. |
Others | Lỗi khác | Xem Danh sách mã lỗi. |