API 參考 · /api/v1
全 278 個端點,依 resource 分組。每個標出 HTTP method、路徑、 所需權限與模組閘。回應外殼與錯誤碼見 總覽。按 ⌘K 搜尋。
/accrual-ledger
掛帳台帳
/api/v1/accrual-ledger參數
period必填出團月(格式 YYYY-MM,Asia/Taipei 時區)
回應欄位 · data
perioddepartureSummarydepartureIdtripTitledepartureDatepaxrevenueTwdrealCostTwdgrossProfitTwdcostLinesidtripTitledepartureDatecategoryvendoramountTwdinvoiceAmountTwdisDeclarablereviewStatuspayablespayableNumbertripTitlepayeeNameamountTwdstatusreceivablesorderNumbertripTitlereceivableTwdreceivedTwdoutstandingTwdcurl -X GET "https://your-tenant.example.com/api/v1/accrual-ledger?period=<period>" \ -H "Authorization: Bearer $CAIRN_TOKEN"
{
"ok": true,
"data": {
"period": "…",
"departureSummary": [
{
"departureId": "…",
"tripTitle": "…",
"departureDate": "…",
"pax": 0,
"revenueTwd": 0,
"realCostTwd": 0,
"grossProfitTwd": 0
}
],
"costLines": [
{
"id": "…",
"tripTitle": "…",
"departureDate": "…",
"category": "…",
"vendor": "…",
"amountTwd": 0,
"invoiceAmountTwd": 0,
"isDeclarable": true,
"reviewStatus": "…"
}
],
"payables": [
{
"payableNumber": "…",
"tripTitle": "…",
"payeeName": "…",
"amountTwd": 0,
"status": "…"
}
],
"receivables": [
{
"orderNumber": "…",
"tripTitle": "…",
"receivableTwd": 0,
"receivedTwd": 0,
"outstandingTwd": 0
}
]
}
}掛帳台帳的「梯次彙總」
/api/v1/accrual-ledger/departure-summary參數
period必填出團月(格式 YYYY-MM,Asia/Taipei 時區)
回應欄位 · data
perioddepartureSummarydepartureIdtripTitledepartureDatepaxrevenueTwdrealCostTwdgrossProfitTwdcurl -X GET "https://your-tenant.example.com/api/v1/accrual-ledger/departure-summary?period=<period>" \ -H "Authorization: Bearer $CAIRN_TOKEN"
{
"ok": true,
"data": {
"period": "…",
"departureSummary": [
{
"departureId": "…",
"tripTitle": "…",
"departureDate": "…",
"pax": 0,
"revenueTwd": 0,
"realCostTwd": 0,
"grossProfitTwd": 0
}
]
}
}/agencies
同業
/api/v1/agencies參數
status選填activearchived同業狀態篩選(active 啟用中/archived 已封存;省略為全部)
owner選填負責業務篩選(傳明確使用者 ID;none=只列尚未指派負責業務者;all 或省略=全部)
hasTaxId選填yesno是否有統一編號篩選(yes 僅列有統編者/no 僅列無統編者)
回應欄位 · data[]
idnametaxIdcontactNamephoneemailaddresspaymentTermownerUserIdownerNamestatusnoteorderCountcreatedAtupdatedAtcurl -X GET https://your-tenant.example.com/api/v1/agencies \ -H "Authorization: Bearer $CAIRN_TOKEN"
{
"ok": true,
"data": [
{
"id": "…",
"name": "…",
"taxId": "…",
"contactName": "…",
"phone": "…",
"email": "…",
"address": "…",
"paymentTerm": "…",
"ownerUserId": "…",
"ownerName": "…",
"status": "active",
"note": "…",
"orderCount": 0,
"createdAt": "2026-06-30T08:00:00.000Z",
"updatedAt": "2026-06-30T08:00:00.000Z"
}
]
}/api/v1/agencies參數
name必填同業公司名稱(B2B 旅行社或個人團主名稱)
taxId選填統一編號(選填)
contactName選填主要聯絡人姓名(選填)
phone選填聯絡電話(選填)
email選填聯絡 Email(選填;留空字串視為未填)
address選填公司地址(選填)
paymentTerm選填付款條件/帳期約定(選填,如月結 30 天)
ownerUserId選填指派的負責業務使用者 ID(選填)
status選填同業狀態(active 啟用中/archived 已封存;預設 active)
note選填內部備註(選填)
回應欄位 · data
idcurl -X POST https://your-tenant.example.com/api/v1/agencies \
-H "Authorization: Bearer $CAIRN_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"name": "<name>"
}'{
"ok": true,
"data": {
"id": "…"
}
}單一同業完整資料
/api/v1/agencies/{id}參數
id路徑同業 ID
回應欄位 · data
idnametaxIdcontactNamephoneemailaddresspaymentTermownerUserIdownerNamestatusnoteorderCountcreatedAtupdatedAtcurl -X GET https://your-tenant.example.com/api/v1/agencies/<id> \ -H "Authorization: Bearer $CAIRN_TOKEN"
{
"ok": true,
"data": {
"id": "…",
"name": "…",
"taxId": "…",
"contactName": "…",
"phone": "…",
"email": "…",
"address": "…",
"paymentTerm": "…",
"ownerUserId": "…",
"ownerName": "…",
"status": "active",
"note": "…",
"orderCount": 0,
"createdAt": "2026-06-30T08:00:00.000Z",
"updatedAt": "2026-06-30T08:00:00.000Z"
}
}/api/v1/agencies/{id}參數
id路徑要更新的同業 ID
name選填同業公司名稱(省略則不更動)
taxId選填統一編號(省略則不更動)
contactName選填主要聯絡人姓名(省略則不更動)
phone選填聯絡電話(省略則不更動)
email選填聯絡 Email(省略則不更動;空字串視為清空)
address選填公司地址(省略則不更動)
paymentTerm選填付款條件/帳期約定(省略則不更動)
ownerUserId選填指派的負責業務使用者 ID(省略則不更動)
status選填同業狀態(active 啟用中/archived 已封存;省略則不更動)
note選填內部備註(省略則不更動)
回應欄位 · data
okcurl -X PATCH https://your-tenant.example.com/api/v1/agencies/<id> \
-H "Authorization: Bearer $CAIRN_TOKEN" \
-H "Content-Type: application/json" \
-d '{
}'{
"ok": true,
"data": {
"ok": true
}
}上下架同業
/api/v1/agencies/{id}/status參數
id路徑同業 ID
status必填目標狀態(active 上架啟用/archived 下架封存)
回應欄位 · data
okcurl -X POST https://your-tenant.example.com/api/v1/agencies/<id>/status \
-H "Authorization: Bearer $CAIRN_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"status": "<status>"
}'{
"ok": true,
"data": {
"ok": true
}
}負責業務指派候選清單
/api/v1/agencies/assignable-staff回應欄位 · data[]
userIdnamerolecurl -X GET https://your-tenant.example.com/api/v1/agencies/assignable-staff \ -H "Authorization: Bearer $CAIRN_TOKEN"
{
"ok": true,
"data": [
{
"userId": "…",
"name": "…",
"role": "…"
}
]
}同業名單匯出
/api/v1/agencies/export參數
status選填activearchived同業狀態篩選(active 啟用中/archived 已封存;省略為全部)
owner選填負責業務篩選(傳明確使用者 ID;none=只列尚未指派負責業務者;all 或省略=全部)
hasTaxId選填yesno是否有統一編號篩選(yes 僅列有統編者/no 僅列無統編者)
回應欄位 · data
rowsidnametaxIdcontactNamephoneemailaddresspaymentTermownerUserIdownerNamestatusnoteorderCountcreatedAtupdatedAtcurl -X GET https://your-tenant.example.com/api/v1/agencies/export \ -H "Authorization: Bearer $CAIRN_TOKEN"
{
"ok": true,
"data": {
"rows": [
{
"id": "…",
"name": "…",
"taxId": "…",
"contactName": "…",
"phone": "…",
"email": "…",
"address": "…",
"paymentTerm": "…",
"ownerUserId": "…",
"ownerName": "…",
"status": "active",
"note": "…",
"orderCount": 0,
"createdAt": "2026-06-30T08:00:00.000Z",
"updatedAt": "2026-06-30T08:00:00.000Z"
}
]
}
}/audit
list/filter the append-only tenant audit trail
/api/v1/audit/log參數
action選填動作代碼篩選,例如 order.update(比對稽核事件的動作)
actor選填操作者篩選,比對執行該動作的使用者 ID
entity選填目標實體篩選,比對被操作對象的類型或 ID
from選填起始時間(ISO 8601),僅回傳此時間之後的事件
to選填結束時間(ISO 8601),僅回傳此時間之前的事件
limit選填回傳筆數上限,最多 1000 筆
回應欄位 · data[]
idactorUserIdactorEmailactorNameactiontargetTypetargetIdmetadataipAddresscreatedAtcurl -X GET https://your-tenant.example.com/api/v1/audit/log \ -H "Authorization: Bearer $CAIRN_TOKEN"
{
"ok": true,
"data": [
{
"id": "…",
"actorUserId": "…",
"actorEmail": "…",
"actorName": "…",
"action": "…",
"targetType": "…",
"targetId": "…",
"metadata": "…",
"ipAddress": "…",
"createdAt": "2026-06-30T08:00:00.000Z"
}
]
}audit KPI counts
/api/v1/audit/stats參數
actor選填操作者使用者 ID,指定時將統計數據限縮至該操作者
回應欄位 · data
eventsThisMontheventsTodaywritesThisMonthdistinctActorsThisMonthcurl -X GET https://your-tenant.example.com/api/v1/audit/stats \ -H "Authorization: Bearer $CAIRN_TOKEN"
{
"ok": true,
"data": {
"eventsThisMonth": 0,
"eventsToday": 0,
"writesThisMonth": 0,
"distinctActorsThisMonth": 0
}
}/consent-templates
list every consent-document template version
/api/v1/consent-templates參數
kind選填同意書類別代碼,指定時僅列出該類別的範本版本
回應欄位 · data[]
idkindversioncontentMdxeffectiveFromcreatedAtsignatureCountcurl -X GET https://your-tenant.example.com/api/v1/consent-templates \ -H "Authorization: Bearer $CAIRN_TOKEN"
{
"ok": true,
"data": [
{
"id": "…",
"kind": "…",
"version": 0,
"contentMdx": "…",
"effectiveFrom": "2026-06-30T08:00:00.000Z",
"createdAt": "2026-06-30T08:00:00.000Z",
"signatureCount": 0
}
]
}/api/v1/consent-templates參數
kind必填同意書類別代碼,決定此範本綁定的文件種類
contentMdx必填同意書內文(MDX 格式),即此版本的條款全文
回應欄位 · data
idversioncurl -X POST https://your-tenant.example.com/api/v1/consent-templates \
-H "Authorization: Bearer $CAIRN_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"kind": "<kind>",
"contentMdx": "<contentMdx>"
}'{
"ok": true,
"data": {
"id": "…",
"version": 0
}
}a single consent-template version
/api/v1/consent-templates/{id}參數
id路徑同意書範本版本的 ID
回應欄位 · data
idkindversioncontentMdxeffectiveFromcreatedAtsignatureCountcurl -X GET https://your-tenant.example.com/api/v1/consent-templates/<id> \ -H "Authorization: Bearer $CAIRN_TOKEN"
{
"ok": true,
"data": {
"id": "…",
"kind": "…",
"version": 0,
"contentMdx": "…",
"effectiveFrom": "2026-06-30T08:00:00.000Z",
"createdAt": "2026-06-30T08:00:00.000Z",
"signatureCount": 0
}
}/cost-templates
list reusable series-tour cost templates
/api/v1/cost-templates參數
status選填activearchived依狀態篩選:active 啟用、archived 已封存
active選填啟用時只回傳輕量的 { id, name } 綁定挑選清單(行程設定的成本範本下拉用)
回應欄位 · data[]
idnamecurl -X GET https://your-tenant.example.com/api/v1/cost-templates \ -H "Authorization: Bearer $CAIRN_TOKEN"
{
"ok": true,
"data": [
{
"id": "…",
"name": "…"
}
]
}/api/v1/cost-templates參數
name必填成本範本名稱
description選填成本範本說明
status選填activearchived範本狀態:active 啟用、archived 已封存
回應欄位 · data
idcurl -X POST https://your-tenant.example.com/api/v1/cost-templates \
-H "Authorization: Bearer $CAIRN_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"name": "<name>"
}'{
"ok": true,
"data": {
"id": "…"
}
}full cost-template detail
/api/v1/cost-templates/{id}參數
id路徑成本範本 ID
回應欄位 · data
linesidtemplateIdcategoryvendorNamedescriptionunitPriceTwdquantityModequantityFixedheadcountComponentsgroupDivisorisDeclarablesortOrderidnamedescriptionstatuslineCountboundTripCountcreatedAtupdatedAtcurl -X GET https://your-tenant.example.com/api/v1/cost-templates/<id> \ -H "Authorization: Bearer $CAIRN_TOKEN"
{
"ok": true,
"data": {
"lines": [
{
"id": "…",
"templateId": "…",
"category": "…",
"vendorName": "…",
"description": "…",
"unitPriceTwd": 0,
"quantityMode": "…",
"quantityFixed": 0,
"headcountComponents": null,
"groupDivisor": 0,
"isDeclarable": true,
"sortOrder": 0
}
],
"id": "…",
"name": "…",
"description": "…",
"status": "active",
"lineCount": 0,
"boundTripCount": 0,
"createdAt": "2026-06-30T08:00:00.000Z",
"updatedAt": "2026-06-30T08:00:00.000Z"
}
}/api/v1/cost-templates/{id}參數
name必填成本範本名稱
description選填成本範本說明
status選填activearchived範本狀態:active 啟用、archived 已封存
id路徑成本範本 ID
回應欄位 · data
okcurl -X PATCH https://your-tenant.example.com/api/v1/cost-templates/<id> \
-H "Authorization: Bearer $CAIRN_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"name": "<name>"
}'{
"ok": true,
"data": {
"ok": true
}
}add a cost line to a template.
/api/v1/cost-templates/{id}/lines參數
id路徑成本範本 ID
line必填成本明細列:含 category 科目、vendorName 廠商、unitPriceTwd 單價、quantityMode 計量方式(fixed 固定/headcount 人數)與對應數量/人數組成、isDeclarable 是否可報帳等欄位
回應欄位 · data
idcurl -X POST https://your-tenant.example.com/api/v1/cost-templates/<id>/lines \
-H "Authorization: Bearer $CAIRN_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"line": "<line>"
}'{
"ok": true,
"data": {
"id": "…"
}
}update or delete a
/api/v1/cost-templates/lines/{lineId}參數
lineId路徑成本範本明細行 ID
line必填成本明細列更新內容:含 category 科目、vendorName 廠商、unitPriceTwd 單價、quantityMode 計量方式(fixed 固定/headcount 人數)與對應數量/人數組成、isDeclarable 是否可報帳等欄位
回應欄位 · data
okcurl -X PATCH https://your-tenant.example.com/api/v1/cost-templates/lines/<lineId> \
-H "Authorization: Bearer $CAIRN_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"line": "<line>"
}'{
"ok": true,
"data": {
"ok": true
}
}/api/v1/cost-templates/lines/{lineId}參數
lineId路徑成本範本明細行 ID
回應欄位 · data
okcurl -X DELETE https://your-tenant.example.com/api/v1/cost-templates/lines/<lineId> \ -H "Authorization: Bearer $CAIRN_TOKEN"
{
"ok": true,
"data": {
"ok": true
}
}/departures
設定梯次分配模式
/api/v1/departures/{depId}/allocation-mode參數
depId路徑梯次 ID
mode必填fcfslottery分配模式:fcfs(先到先得)或 lottery(抽籤)
回應欄位 · data
okdepartureIdmodecurl -X PATCH https://your-tenant.example.com/api/v1/departures/<depId>/allocation-mode \
-H "Authorization: Bearer $CAIRN_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"mode": "fcfs"
}'{
"ok": true,
"data": {
"ok": true,
"departureId": "…",
"mode": "fcfs"
}
}登錄梯次成本
/api/v1/departures/{depId}/costs參數
depId路徑梯次 ID
category必填成本科目類別,決定歸入哪個分類帳
vendorName選填供應商/受款對象名稱
description選填成本說明備註
amountTwd必填成本金額(台幣,整數)
回應欄位 · data
okidcurl -X POST https://your-tenant.example.com/api/v1/departures/<depId>/costs \
-H "Authorization: Bearer $CAIRN_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"category": "<category>",
"amountTwd": 0
}'{
"ok": true,
"data": {
"ok": true,
"id": "…"
}
}/api/v1/departures/{depId}/costs/{costId}參數
costId路徑成本列 ID
category必填成本科目類別,決定歸入哪個分類帳
vendorName選填供應商/受款對象名稱
description選填成本說明備註
amountTwd必填成本金額(台幣,整數)
回應欄位 · data
okcurl -X PATCH https://your-tenant.example.com/api/v1/departures/{depId}/costs/<costId> \
-H "Authorization: Bearer $CAIRN_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"category": "<category>",
"amountTwd": 0
}'{
"ok": true,
"data": {
"ok": true
}
}/api/v1/departures/{depId}/costs/{costId}參數
costId路徑成本列 ID
回應欄位 · data
okcurl -X DELETE https://your-tenant.example.com/api/v1/departures/{depId}/costs/<costId> \
-H "Authorization: Bearer $CAIRN_TOKEN"{
"ok": true,
"data": {
"ok": true
}
}該梯次財務摘要
/api/v1/departures/{depId}/finance-summary參數
depId路徑梯次 ID
回應欄位 · data
headeridtripTitletripSlugdepartureDatereturnDatefinancereceivableTwdcollectedTwdcashReturnedTwdoutstandingTwdcostTwdcostBilledTwdcostUnbilledTwdanomalyOrderCountcosttotalTwdbilledTwdunbilledTwddeclarableTwdnonDeclarableTwdcountcurl -X GET https://your-tenant.example.com/api/v1/departures/<depId>/finance-summary \ -H "Authorization: Bearer $CAIRN_TOKEN"
{
"ok": true,
"data": {
"header": {
"id": "…",
"tripTitle": "…",
"tripSlug": "…",
"departureDate": "…",
"returnDate": "…"
},
"finance": {
"receivableTwd": 0,
"collectedTwd": 0,
"cashReturnedTwd": 0,
"outstandingTwd": 0,
"costTwd": 0,
"costBilledTwd": 0,
"costUnbilledTwd": 0,
"anomalyOrderCount": 0
},
"cost": {
"totalTwd": 0,
"billedTwd": 0,
"unbilledTwd": 0,
"declarableTwd": 0,
"nonDeclarableTwd": 0,
"count": 0
}
}
}該梯次抽籤訂單清單
/api/v1/departures/{depId}/lottery-orders參數
depId路徑梯次 ID
回應欄位 · data[]
orderIdorderNumbercustomerNamepartySizelotteryStatebackupChoiceCountcurl -X GET https://your-tenant.example.com/api/v1/departures/<depId>/lottery-orders \ -H "Authorization: Bearer $CAIRN_TOKEN"
{
"ok": true,
"data": [
{
"orderId": "…",
"orderNumber": "…",
"customerName": "…",
"partySize": 0,
"lotteryState": "applied",
"backupChoiceCount": 0
}
]
}該梯次旅客名單
/api/v1/departures/{depId}/manifest參數
depId路徑梯次 ID
回應欄位 · data[]
orderIdorderNumbertravelerNamephoneemailisPrimaryorderStatusamountcurl -X GET https://your-tenant.example.com/api/v1/departures/<depId>/manifest \ -H "Authorization: Bearer $CAIRN_TOKEN"
{
"ok": true,
"data": [
{
"orderId": "…",
"orderNumber": "…",
"travelerName": "…",
"phone": "…",
"email": "…",
"isPrimary": true,
"orderStatus": "…",
"amount": 0
}
]
}成本轉請款:以選定的未轉成本列建立一張
/api/v1/departures/{depId}/payables參數
depId路徑梯次 ID
costIds必填要轉成請款單的成本列 ID 清單,至少一筆
payeeType必填supplierguidestaff_commissionother受款人類型:supplier(供應商)/ guide(領隊)/ staff_commission(員工佣金)/ other(其他)
payeeName必填受款人姓名/戶名(必填)
payeeBankAccount選填受款人銀行帳號
payeeBankName選填受款人銀行名稱
payeeTaxId選填受款人統一編號/稅籍編號
submitImmediately選填設為 true 時建立後立即送出核簽,否則僅存為草稿
回應欄位 · data
okpayableIdpayableNumbercurl -X POST https://your-tenant.example.com/api/v1/departures/<depId>/payables \
-H "Authorization: Bearer $CAIRN_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"costIds": [],
"payeeType": "supplier",
"payeeName": "<payeeName>"
}'{
"ok": true,
"data": {
"ok": true,
"payableId": "…",
"payableNumber": "…"
}
}新增餐食紀錄
/api/v1/departures/{depId}/prep/catering參數
depId路徑梯次 ID
supplier選填餐食供應商名稱
mealPlan選填餐食安排說明(如餐數、菜色)
headcountNote選填人數備註(如素食、特殊餐需求)
status選填餐食安排狀態,預設 pending
回應欄位 · data
okidcurl -X POST https://your-tenant.example.com/api/v1/departures/<depId>/prep/catering \
-H "Authorization: Bearer $CAIRN_TOKEN" \
-H "Content-Type: application/json" \
-d '{
}'{
"ok": true,
"data": {
"ok": true,
"id": "…"
}
}更新餐食紀錄
/api/v1/departures/{depId}/prep/catering/{id}參數
depId路徑梯次 ID
id路徑餐食紀錄 ID
supplier選填餐食供應商名稱
mealPlan選填餐食安排說明(如餐數、菜色)
headcountNote選填人數備註(如素食、特殊餐需求)
status選填餐食安排狀態
回應欄位 · data
okcurl -X PATCH https://your-tenant.example.com/api/v1/departures/<depId>/prep/catering/<id> \
-H "Authorization: Bearer $CAIRN_TOKEN" \
-H "Content-Type: application/json" \
-d '{
}'{
"ok": true,
"data": {
"ok": true
}
}刪除餐食紀錄
/api/v1/departures/{depId}/prep/catering/{id}參數
depId路徑梯次 ID
id路徑餐食紀錄 ID
回應欄位 · data
okcurl -X DELETE https://your-tenant.example.com/api/v1/departures/<depId>/prep/catering/<id> \ -H "Authorization: Bearer $CAIRN_TOKEN"
{
"ok": true,
"data": {
"ok": true
}
}設定行前總檢查某項勾選狀態
/api/v1/departures/{depId}/prep/checklist參數
depId路徑梯次 ID
itemKey必填行前檢查項目的代碼
checked必填該檢查項目是否已完成勾選
回應欄位 · data
okidcurl -X POST https://your-tenant.example.com/api/v1/departures/<depId>/prep/checklist \
-H "Authorization: Bearer $CAIRN_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"itemKey": "<itemKey>",
"checked": true
}'{
"ok": true,
"data": {
"ok": true,
"id": "…"
}
}設定梯次期限警戒
/api/v1/departures/{depId}/prep/deadlines參數
depId路徑梯次 ID
permitApply選填入山申請截止日(ISO 日期);傳空字串或省略則清除此期限
permitDownload選填入山證下載截止日(ISO 日期);傳空字串或省略則清除此期限
climbingInsurance選填登山險送保截止日(ISO 日期);傳空字串或省略則清除此期限
liabilityInsurance選填旅責險送保截止日(ISO 日期);傳空字串或省略則清除此期限
回應欄位 · data
permitApplypermitDownloadclimbingInsuranceliabilityInsuranceokdepartureIdcurl -X POST https://your-tenant.example.com/api/v1/departures/<depId>/prep/deadlines \
-H "Authorization: Bearer $CAIRN_TOKEN" \
-H "Content-Type: application/json" \
-d '{
}'{
"ok": true,
"data": {
"permitApply": "…",
"permitDownload": "…",
"climbingInsurance": "…",
"liabilityInsurance": "…",
"ok": true,
"departureId": "…"
}
}upsert 一種證件追蹤狀態
/api/v1/departures/{depId}/prep/documents參數
depId路徑梯次 ID
docType必填證件/文件種類代碼(如入山申請、保險名冊)
applyStatus選填todoapplyingapproved申辦狀態:todo(待辦)/ applying(申請中)/ approved(已核准)
fileReady選填文件檔案是否已備妥
uploadedToCloud選填文件是否已上傳雲端
fileUri選填文件檔案連結;給 null 清空
note選填備註;給 null 清空
回應欄位 · data
okidcurl -X POST https://your-tenant.example.com/api/v1/departures/<depId>/prep/documents \
-H "Authorization: Bearer $CAIRN_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"docType": "<docType>"
}'{
"ok": true,
"data": {
"ok": true,
"id": "…"
}
}upsert 某裝備品項的需求數
/api/v1/departures/{depId}/prep/equipment-needs參數
depId路徑梯次 ID
equipmentItemId必填裝備品項 ID
quantity必填該品項的需求數量
note選填需求備註;給 null 清空
回應欄位 · data
okidcurl -X POST https://your-tenant.example.com/api/v1/departures/<depId>/prep/equipment-needs \
-H "Authorization: Bearer $CAIRN_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"equipmentItemId": "<equipmentItemId>",
"quantity": 0
}'{
"ok": true,
"data": {
"ok": true,
"id": "…"
}
}刪除裝備需求列
/api/v1/departures/{depId}/prep/equipment-needs/{id}參數
depId路徑梯次 ID
id路徑裝備需求列 ID
回應欄位 · data
okcurl -X DELETE https://your-tenant.example.com/api/v1/departures/<depId>/prep/equipment-needs/<id> \ -H "Authorization: Bearer $CAIRN_TOKEN"
{
"ok": true,
"data": {
"ok": true
}
}指派 / 重派領隊到梯次
/api/v1/departures/{depId}/prep/guides參數
depId路徑梯次 ID
guideId必填領隊 ID
role必填leaderassistant指派角色:leader(領隊)或 assistant(隨隊/助理)
status選填tentativeconfirmed指派狀態:tentative(暫定)或 confirmed(已確認)
回應欄位 · data
okidcurl -X POST https://your-tenant.example.com/api/v1/departures/<depId>/prep/guides \
-H "Authorization: Bearer $CAIRN_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"guideId": "<guideId>",
"role": "leader"
}'{
"ok": true,
"data": {
"ok": true,
"id": "…"
}
}新增投保紀錄
/api/v1/departures/{depId}/prep/insurance參數
depId路徑梯次 ID
kind必填保險種類(如登山險、旅責險)
insurer選填保險公司名稱
policyNo選填保單號碼
status選填投保狀態,預設 pending
note選填備註;給 null 清空
回應欄位 · data
okidcurl -X POST https://your-tenant.example.com/api/v1/departures/<depId>/prep/insurance \
-H "Authorization: Bearer $CAIRN_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"kind": "<kind>"
}'{
"ok": true,
"data": {
"ok": true,
"id": "…"
}
}更新投保紀錄
/api/v1/departures/{depId}/prep/insurance/{id}參數
depId路徑梯次 ID
id路徑投保紀錄 ID
insurer選填保險公司名稱
policyNo選填保單號碼
status選填投保狀態
note選填備註;給 null 清空
回應欄位 · data
okcurl -X PATCH https://your-tenant.example.com/api/v1/departures/<depId>/prep/insurance/<id> \
-H "Authorization: Bearer $CAIRN_TOKEN" \
-H "Content-Type: application/json" \
-d '{
}'{
"ok": true,
"data": {
"ok": true
}
}刪除投保紀錄
/api/v1/departures/{depId}/prep/insurance/{id}參數
depId路徑梯次 ID
id路徑投保紀錄 ID
回應欄位 · data
okcurl -X DELETE https://your-tenant.example.com/api/v1/departures/<depId>/prep/insurance/<id> \ -H "Authorization: Bearer $CAIRN_TOKEN"
{
"ok": true,
"data": {
"ok": true
}
}從裝備需求開租借單
/api/v1/departures/{depId}/prep/rentals參數
depId路徑梯次 ID
orderId必填要掛這筆租借費用的訂單 ID
renterName選填租借人姓名;給 null 清空
lines必填租借品項明細(品項 + 數量),數量需大於 0 才計入
回應欄位 · data
okrentalIdcurl -X POST https://your-tenant.example.com/api/v1/departures/<depId>/prep/rentals \
-H "Authorization: Bearer $CAIRN_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"orderId": "<orderId>",
"lines": []
}'{
"ok": true,
"data": {
"ok": true,
"rentalId": "…"
}
}新增派車紀錄
/api/v1/departures/{depId}/prep/transport參數
depId路徑梯次 ID
description選填派車說明(如路線、接送地點)
driverName選填司機姓名
vehicleInfo選填車輛資訊(如車型、車牌)
fareNote選填車資備註
status選填派車狀態,預設 pending
回應欄位 · data
okidcurl -X POST https://your-tenant.example.com/api/v1/departures/<depId>/prep/transport \
-H "Authorization: Bearer $CAIRN_TOKEN" \
-H "Content-Type: application/json" \
-d '{
}'{
"ok": true,
"data": {
"ok": true,
"id": "…"
}
}更新派車紀錄
/api/v1/departures/{depId}/prep/transport/{id}參數
depId路徑梯次 ID
id路徑派車紀錄 ID
description選填派車說明(如路線、接送地點)
driverName選填司機姓名
vehicleInfo選填車輛資訊(如車型、車牌)
fareNote選填車資備註
status選填派車狀態
回應欄位 · data
okcurl -X PATCH https://your-tenant.example.com/api/v1/departures/<depId>/prep/transport/<id> \
-H "Authorization: Bearer $CAIRN_TOKEN" \
-H "Content-Type: application/json" \
-d '{
}'{
"ok": true,
"data": {
"ok": true
}
}刪除派車紀錄
/api/v1/departures/{depId}/prep/transport/{id}參數
depId路徑梯次 ID
id路徑派車紀錄 ID
回應欄位 · data
okcurl -X DELETE https://your-tenant.example.com/api/v1/departures/<depId>/prep/transport/<id> \ -H "Authorization: Bearer $CAIRN_TOKEN"
{
"ok": true,
"data": {
"ok": true
}
}分房表匯出資料列
/api/v1/departures/{depId}/rooming-export參數
depId路徑梯次 ID
回應欄位 · data[]
fullNamegenderroomLabelbedInforoommatesspecialRequestcontactSummarycurl -X GET https://your-tenant.example.com/api/v1/departures/<depId>/rooming-export \ -H "Authorization: Bearer $CAIRN_TOKEN"
{
"ok": true,
"data": [
{
"fullName": "…",
"gender": "…",
"roomLabel": "…",
"bedInfo": "…",
"roommates": "…",
"specialRequest": "…",
"contactSummary": "…"
}
]
}該梯次分房檢視
/api/v1/departures/{depId}/rooms參數
depId路徑梯次 ID
回應欄位 · data
departureiddepartureDatereturnDatetripTitletripSlugcapacitybookedCountroomsidroomLabelroomTypebedCountbedConfigaccommodationNameaccommodationDatebaseCostTwdupgradeFeeTwdnotesdepartureLodgingIdassignedTravelersunassignedTravelersidfullNameorderIdorderNumberisPrimarygenderbirthDate選填roomPreferenceroommatePrefstatstotalTravelersassignedCountroomCounttotalUpgradeFeecurl -X GET https://your-tenant.example.com/api/v1/departures/<depId>/rooms \ -H "Authorization: Bearer $CAIRN_TOKEN"
{
"ok": true,
"data": {
"departure": {
"id": "…",
"departureDate": "…",
"returnDate": "…",
"tripTitle": "…",
"tripSlug": "…",
"capacity": 0,
"bookedCount": 0
},
"rooms": [
{
"id": "…",
"roomLabel": "…",
"roomType": "…",
"bedCount": 0,
"bedConfig": "…",
"accommodationName": "…",
"accommodationDate": "…",
"baseCostTwd": 0,
"upgradeFeeTwd": 0,
"notes": "…",
"departureLodgingId": "…",
"assignedTravelers": []
}
],
"unassignedTravelers": [
{
"id": "…",
"fullName": "…",
"orderId": "…",
"orderNumber": "…",
"isPrimary": true,
"gender": "…",
"birthDate": "…",
"roomPreference": "…",
"roommatePref": "…"
}
],
"stats": {
"totalTravelers": 0,
"assignedCount": 0,
"roomCount": 0,
"totalUpgradeFee": 0
}
}
}建立一間梯次房間
/api/v1/departures/{depId}/rooms參數
depId路徑梯次 ID
roomLabel必填房間代號/標籤(如 101、A 房)
roomType必填房型(如 雙人房、四人房)
bedCount必填床位數,必須大於 0
bedConfig選填床型配置說明(如 2 大床、1 大 2 小)
accommodationName選填住宿地點/旅宿名稱
accommodationDate選填入住日期(ISO 日期字串)
baseCostTwd選填房間基本成本(台幣),預設 0
upgradeFeeTwd選填房型升等補款金額(台幣),預設 0
notes選填房間備註
回應欄位 · data
okidcurl -X POST https://your-tenant.example.com/api/v1/departures/<depId>/rooms \
-H "Authorization: Bearer $CAIRN_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"roomLabel": "<roomLabel>",
"roomType": "<roomType>",
"bedCount": 0
}'{
"ok": true,
"data": {
"ok": true,
"id": "…"
}
}編輯房間
/api/v1/departures/{depId}/rooms/{roomId}參數
roomId路徑房間 ID
roomLabel選填房間代號/標籤;未給則不變
roomType選填房型;未給則不變
bedCount選填床位數;未給則不變
bedConfig選填床型配置說明;給 null 清空、未給則不變
accommodationName選填住宿地點名稱;給 null 清空、未給則不變
accommodationDate選填入住日期(ISO 字串);給 null 清空、未給則不變
baseCostTwd選填房間基本成本(台幣);未給則不變
upgradeFeeTwd選填房型升等補款金額(台幣);未給則不變
notes選填房間備註;給 null 清空、未給則不變
回應欄位 · data
okcurl -X PATCH https://your-tenant.example.com/api/v1/departures/{depId}/rooms/<roomId> \
-H "Authorization: Bearer $CAIRN_TOKEN" \
-H "Content-Type: application/json" \
-d '{
}'{
"ok": true,
"data": {
"ok": true
}
}刪除房間
/api/v1/departures/{depId}/rooms/{roomId}參數
roomId路徑房間 ID
回應欄位 · data
okcurl -X DELETE https://your-tenant.example.com/api/v1/departures/{depId}/rooms/<roomId> \
-H "Authorization: Bearer $CAIRN_TOKEN"{
"ok": true,
"data": {
"ok": true
}
}線控確認 auto-pair 建議分組:
/api/v1/departures/{depId}/rooms/auto-pair-apply參數
depId路徑梯次 ID
travelerIds必填要編入同一房的旅客 ID 清單,至少一人
roomType選填建立房間的房型,預設 shared(合住)
回應欄位 · data
okroomIdtravelerIdscurl -X POST https://your-tenant.example.com/api/v1/departures/<depId>/rooms/auto-pair-apply \
-H "Authorization: Bearer $CAIRN_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"travelerIds": []
}'{
"ok": true,
"data": {
"ok": true,
"roomId": "…",
"travelerIds": [
"…"
]
}
}對某梯次「尚未排房」的旅客
/api/v1/departures/{depId}/rooms/auto-pair-preview參數
depId路徑梯次 ID
回應欄位 · data
suggestiongroupsunmatchednamescurl -X GET https://your-tenant.example.com/api/v1/departures/<depId>/rooms/auto-pair-preview \ -H "Authorization: Bearer $CAIRN_TOKEN"
{
"ok": true,
"data": {
"suggestion": {
"groups": [],
"unmatched": []
},
"names": "…"
}
}該梯次套用的成本範本列
/api/v1/departures/{depId}/template-costs參數
depId路徑梯次 ID
回應欄位 · data[]
idcategoryvendorNamedescriptionamountTwdinvoiceAmountTwdisDeclarablequantityModeheadcountComponentsgroupDivisorquantityunitPriceTwdisManualOverridepayableIdcurl -X GET https://your-tenant.example.com/api/v1/departures/<depId>/template-costs \ -H "Authorization: Bearer $CAIRN_TOKEN"
{
"ok": true,
"data": [
{
"id": "…",
"category": "…",
"vendorName": "…",
"description": "…",
"amountTwd": 0,
"invoiceAmountTwd": 0,
"isDeclarable": true,
"quantityMode": null,
"headcountComponents": null,
"groupDivisor": 0,
"quantity": 0,
"unitPriceTwd": 0,
"isManualOverride": true,
"payableId": "…"
}
]
}重設為範本算法
/api/v1/departures/{depId}/template-costs/{id}/clear-override參數
id路徑範本成本列 ID
回應欄位 · data
okcurl -X POST https://your-tenant.example.com/api/v1/departures/{depId}/template-costs/<id>/clear-override \
-H "Authorization: Bearer $CAIRN_TOKEN"{
"ok": true,
"data": {
"ok": true
}
}線控手改某範本成本列
/api/v1/departures/{depId}/template-costs/{id}/override參數
id路徑範本成本列 ID
amountTwd必填手動指定的成本金額(台幣),設定後停止自動重算
回應欄位 · data
okcurl -X POST https://your-tenant.example.com/api/v1/departures/{depId}/template-costs/<id>/override \
-H "Authorization: Bearer $CAIRN_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"amountTwd": 0
}'{
"ok": true,
"data": {
"ok": true
}
}套用行程綁定範本到本梯次
/api/v1/departures/{depId}/template-costs/apply參數
depId路徑梯次 ID
回應欄位 · data
okinsertedcurl -X POST https://your-tenant.example.com/api/v1/departures/<depId>/template-costs/apply \ -H "Authorization: Bearer $CAIRN_TOKEN"
{
"ok": true,
"data": {
"ok": true,
"inserted": 0
}
}該梯次各訂單旅客資料完整度
/api/v1/departures/{depId}/validation-summary參數
depId路徑梯次 ID
回應欄位 · data[]
orderIdorderNumbererrorCountwarningCountincompleteTravelerCounterrorTravelerCountcurl -X GET https://your-tenant.example.com/api/v1/departures/<depId>/validation-summary \ -H "Authorization: Bearer $CAIRN_TOKEN"
{
"ok": true,
"data": [
{
"orderId": "…",
"orderNumber": "…",
"errorCount": 0,
"warningCount": 0,
"incompleteTravelerCount": 0,
"errorTravelerCount": 0
}
]
}團控主列表:以出發日為主軸、彙整 order/付款/同意書
/api/v1/departures/control參數
range選填future_60this_monthnext_month時間視窗:future_60(未來 60 天)/ this_month(本月)/ next_month(下個月),預設不限
trip選填行程 ID,只看該行程的梯次
status選填梯次狀態篩選(如 open / closed)
attention選填設為 true 時只回傳付款或同意書有異常、需要關注的梯次
回應欄位 · data[]
idtripIdtripTitletripSlugdepartureDatereturnDatecapacitybookedCountstatusallocationModepriceTwdagencyPriceTwdpromoActivepromoPriceTwdpromoAgencyPriceTwddaysUntilDeparturetravelerCountpaidCountpendingCountcancelledCountordersWithoutConsentcodedRevenueTwddiscountTotalTwdprofitShareTotalTwdcurl -X GET https://your-tenant.example.com/api/v1/departures/control \ -H "Authorization: Bearer $CAIRN_TOKEN"
{
"ok": true,
"data": [
{
"id": "…",
"tripId": "…",
"tripTitle": "…",
"tripSlug": "…",
"departureDate": "…",
"returnDate": "…",
"capacity": 0,
"bookedCount": 0,
"status": "…",
"allocationMode": "fcfs",
"priceTwd": 0,
"agencyPriceTwd": 0,
"promoActive": true,
"promoPriceTwd": 0,
"promoAgencyPriceTwd": 0,
"daysUntilDeparture": 0,
"travelerCount": 0,
"paidCount": 0,
"pendingCount": 0,
"cancelledCount": 0,
"ordersWithoutConsent": 0,
"codedRevenueTwd": 0,
"discountTotalTwd": 0,
"profitShareTotalTwd": 0
}
]
}多梯次的分房進度統計
/api/v1/departures/room-stats參數
ids必填要查詢的梯次 ID 清單,以逗號分隔(例:a,b,c)
curl -X GET "https://your-tenant.example.com/api/v1/departures/room-stats?ids=<ids>" \ -H "Authorization: Bearer $CAIRN_TOKEN"
{
"ok": true,
"data": {}
}/discount-codes
list all discount codes
/api/v1/discount-codes回應欄位 · data[]
idcodelabeldiscountTypediscountValueprofitShareTypeprofitShareValueprofitSharePayeeisActivevalidFromvalidUntilmaxRedemptionsredemptionCountminOrderTwdappliesToAllmaxRedemptionsPerCustomerallowedPriceChannelsallowedCustomerTypesstackablenotescreatedAtcurl -X GET https://your-tenant.example.com/api/v1/discount-codes \ -H "Authorization: Bearer $CAIRN_TOKEN"
{
"ok": true,
"data": [
{
"id": "…",
"code": "…",
"label": "…",
"discountType": "…",
"discountValue": 0,
"profitShareType": null,
"profitShareValue": 0,
"profitSharePayee": "…",
"isActive": true,
"validFrom": null,
"validUntil": null,
"maxRedemptions": 0,
"redemptionCount": 0,
"minOrderTwd": 0,
"appliesToAll": true,
"maxRedemptionsPerCustomer": 0,
"allowedPriceChannels": "…",
"allowedCustomerTypes": "…",
"stackable": true,
"notes": "…",
"createdAt": "2026-06-30T08:00:00.000Z"
}
]
}create a discount code
/api/v1/discount-codes參數
code必填折扣碼字串(前台結帳輸入,不分大小寫須唯一)
label必填折扣碼顯示名稱(後台與報表辨識用)
discountType必填fixedpercentage折抵方式:fixed 固定金額(TWD)或 percentage 百分比
discountValue必填折抵數值;fixed 為折抵金額(TWD),percentage 為百分比(1–100)
profitShareType選填fixedpercentage分潤方式:fixed 固定金額或 percentage 百分比;null 為不分潤
profitShareValue選填分潤數值;搭配 profitShareType,percentage 須 1–100,null 為不分潤
profitSharePayee選填分潤對象名稱(如合作推廣者),供出款對帳辨識
isActive選填是否啟用;停用後前台無法套用
validFrom選填生效起日(YYYY-MM-DD);留空為不限起日
validUntil選填生效迄日(YYYY-MM-DD);留空為不限迄日
maxRedemptions選填全碼可使用總次數上限;null 為不限
minOrderTwd選填最低訂單金額門檻(TWD),未達門檻不可套用;null 為不限
appliesToAll選填是否適用全部行程;true 時忽略 tripIds
tripIds選填指定可套用的行程 id 清單(appliesToAll=false 時生效)
maxRedemptionsPerCustomer選填每位客戶可使用次數上限;null 為不限
allowedPriceChannels選填可套用的價格渠道(direct 直客 / agency 同業 / promo 優惠);空陣列為不限
allowedCustomerTypes選填可套用的客戶類型(direct 直客 / agency_contact 同業聯絡人);空陣列為不限
stackable選填是否可與其他折扣碼疊加使用
notes選填內部備註(不對外顯示)
回應欄位 · data
idcurl -X POST https://your-tenant.example.com/api/v1/discount-codes \
-H "Authorization: Bearer $CAIRN_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"code": "<code>",
"label": "<label>",
"discountType": "fixed",
"discountValue": 0
}'{
"ok": true,
"data": {
"id": "…"
}
}full discount code detail
/api/v1/discount-codes/{id}參數
id路徑折扣碼 id(路徑參數)
回應欄位 · data
idcodelabeldiscountTypediscountValueprofitShareTypeprofitShareValueprofitSharePayeeisActivevalidFromvalidUntilmaxRedemptionsredemptionCountminOrderTwdappliesToAllmaxRedemptionsPerCustomerallowedPriceChannelsallowedCustomerTypesstackablenotescreatedAttripIdsredemptionsorderIdorderNumbercodeSnapshotoriginalTotalTwddiscountTwdprofitShareTwdorderStatuscreatedAttotalDiscountTwdtotalProfitShareTwdtotalPaidTwdcurl -X GET https://your-tenant.example.com/api/v1/discount-codes/<id> \ -H "Authorization: Bearer $CAIRN_TOKEN"
{
"ok": true,
"data": {
"id": "…",
"code": "…",
"label": "…",
"discountType": "…",
"discountValue": 0,
"profitShareType": null,
"profitShareValue": 0,
"profitSharePayee": "…",
"isActive": true,
"validFrom": null,
"validUntil": null,
"maxRedemptions": 0,
"redemptionCount": 0,
"minOrderTwd": 0,
"appliesToAll": true,
"maxRedemptionsPerCustomer": 0,
"allowedPriceChannels": "…",
"allowedCustomerTypes": "…",
"stackable": true,
"notes": "…",
"createdAt": "2026-06-30T08:00:00.000Z",
"tripIds": [
"…"
],
"redemptions": [
{
"orderId": "…",
"orderNumber": "…",
"codeSnapshot": "…",
"originalTotalTwd": 0,
"discountTwd": 0,
"profitShareTwd": 0,
"orderStatus": "…",
"createdAt": "2026-06-30T08:00:00.000Z"
}
],
"totalDiscountTwd": 0,
"totalProfitShareTwd": 0,
"totalPaidTwd": 0
}
}update a discount code
/api/v1/discount-codes/{id}參數
id路徑折扣碼 id(路徑參數)
code必填折扣碼字串(前台結帳輸入,不分大小寫須唯一)
label必填折扣碼顯示名稱(後台與報表辨識用)
discountType必填fixedpercentage折抵方式:fixed 固定金額(TWD)或 percentage 百分比
discountValue必填折抵數值;fixed 為折抵金額(TWD),percentage 為百分比(1–100)
profitShareType選填fixedpercentage分潤方式:fixed 固定金額或 percentage 百分比;null 為不分潤
profitShareValue選填分潤數值;搭配 profitShareType,percentage 須 1–100,null 為不分潤
profitSharePayee選填分潤對象名稱(如合作推廣者),供出款對帳辨識
isActive選填是否啟用;停用後前台無法套用
validFrom選填生效起日(YYYY-MM-DD);留空為不限起日
validUntil選填生效迄日(YYYY-MM-DD);留空為不限迄日
maxRedemptions選填全碼可使用總次數上限;null 為不限
minOrderTwd選填最低訂單金額門檻(TWD),未達門檻不可套用;null 為不限
appliesToAll選填是否適用全部行程;true 時忽略 tripIds
tripIds選填指定可套用的行程 id 清單(appliesToAll=false 時生效)
maxRedemptionsPerCustomer選填每位客戶可使用次數上限;null 為不限
allowedPriceChannels選填可套用的價格渠道(direct 直客 / agency 同業 / promo 優惠);空陣列為不限
allowedCustomerTypes選填可套用的客戶類型(direct 直客 / agency_contact 同業聯絡人);空陣列為不限
stackable選填是否可與其他折扣碼疊加使用
notes選填內部備註(不對外顯示)
回應欄位 · data
okcurl -X PATCH https://your-tenant.example.com/api/v1/discount-codes/<id> \
-H "Authorization: Bearer $CAIRN_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"code": "<code>",
"label": "<label>",
"discountType": "fixed",
"discountValue": 0
}'{
"ok": true,
"data": {
"ok": true
}
}redemption/profit-share report for
/api/v1/discount-codes/{id}/redemptions參數
id路徑折扣碼 id(路徑參數)
回應欄位 · data
idcodelabelredemptionCounttotalDiscountTwdtotalProfitShareTwdtotalPaidTwdredemptionsorderIdorderNumbercodeSnapshotoriginalTotalTwddiscountTwdprofitShareTwdorderStatuscreatedAtcurl -X GET https://your-tenant.example.com/api/v1/discount-codes/<id>/redemptions \ -H "Authorization: Bearer $CAIRN_TOKEN"
{
"ok": true,
"data": {
"id": "…",
"code": "…",
"label": "…",
"redemptionCount": 0,
"totalDiscountTwd": 0,
"totalProfitShareTwd": 0,
"totalPaidTwd": 0,
"redemptions": [
{
"orderId": "…",
"orderNumber": "…",
"codeSnapshot": "…",
"originalTotalTwd": 0,
"discountTwd": 0,
"profitShareTwd": 0,
"orderStatus": "…",
"createdAt": "2026-06-30T08:00:00.000Z"
}
]
}
}activate / deactivate a discount
/api/v1/discount-codes/{id}/set-active參數
id路徑折扣碼 id(路徑參數)
isActive必填目標啟用狀態:true 啟用、false 停用
回應欄位 · data
okcurl -X POST https://your-tenant.example.com/api/v1/discount-codes/<id>/set-active \
-H "Authorization: Bearer $CAIRN_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"isActive": true
}'{
"ok": true,
"data": {
"ok": true
}
}read-only checkout preview of a code's
/api/v1/discount-codes/preview參數
code必填欲試算的折扣碼字串
kind必填tourlodging產品種類:tour 行程或 lodging 住宿
tripId選填行程 id(kind=tour 時必填)
total必填試算用原始金額(TWD,未折扣前)
priceChannel選填價格渠道(direct / agency / promo),用於折扣碼資格判定
customerType選填客戶類型(direct / agency_contact),用於折扣碼資格判定
userId選填客戶 user id,用於每客戶使用次數限制判定
curl -X GET "https://your-tenant.example.com/api/v1/discount-codes/preview?code=<code>&kind=<kind>&total=<total>" \ -H "Authorization: Bearer $CAIRN_TOKEN"
{
"ok": true,
"data": "…"
}/equipment
list the equipment master
/api/v1/equipment/items參數
activeOnly選填只列出啟用中(可租借)的品項
回應欄位 · data[]
idnamecategoryspecrentPriceTwddepositTwdtotalCountoutCountmaintenanceCountavailableCountisActivecreatedAtupdatedAtcurl -X GET https://your-tenant.example.com/api/v1/equipment/items \ -H "Authorization: Bearer $CAIRN_TOKEN"
{
"ok": true,
"data": [
{
"id": "…",
"name": "…",
"category": "…",
"spec": "…",
"rentPriceTwd": 0,
"depositTwd": 0,
"totalCount": 0,
"outCount": 0,
"maintenanceCount": 0,
"availableCount": 0,
"isActive": true,
"createdAt": "2026-06-30T08:00:00.000Z",
"updatedAt": "2026-06-30T08:00:00.000Z"
}
]
}create a master item
/api/v1/equipment/items參數
name必填裝備品項名稱
category選填裝備分類(如帳篷、睡袋;選填)
spec選填規格說明(如尺寸、型號;選填)
rentPriceTwd選填每日租金(台幣)
depositTwd選填每件押金(台幣)
totalCount選填總庫存數量
maintenanceCount選填維修中而不可租借的數量
isActive選填是否啟用(可供租借)
回應欄位 · data
idcurl -X POST https://your-tenant.example.com/api/v1/equipment/items \
-H "Authorization: Bearer $CAIRN_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"name": "<name>"
}'{
"ok": true,
"data": {
"id": "…"
}
}single equipment master item detail.
/api/v1/equipment/items/{id}參數
id路徑裝備品項 ID
回應欄位 · data
idnamecategoryspecrentPriceTwddepositTwdtotalCountoutCountmaintenanceCountavailableCountisActivecreatedAtupdatedAtcurl -X GET https://your-tenant.example.com/api/v1/equipment/items/<id> \ -H "Authorization: Bearer $CAIRN_TOKEN"
{
"ok": true,
"data": {
"id": "…",
"name": "…",
"category": "…",
"spec": "…",
"rentPriceTwd": 0,
"depositTwd": 0,
"totalCount": 0,
"outCount": 0,
"maintenanceCount": 0,
"availableCount": 0,
"isActive": true,
"createdAt": "2026-06-30T08:00:00.000Z",
"updatedAt": "2026-06-30T08:00:00.000Z"
}
}update a master item
/api/v1/equipment/items/{id}參數
id路徑要更新的裝備品項 ID
name必填裝備品項名稱
category選填裝備分類(如帳篷、睡袋;選填)
spec選填規格說明(如尺寸、型號;選填)
rentPriceTwd選填每日租金(台幣)
depositTwd選填每件押金(台幣)
totalCount選填總庫存數量
maintenanceCount選填維修中而不可租借的數量
isActive選填是否啟用(可供租借)
回應欄位 · data
okcurl -X PATCH https://your-tenant.example.com/api/v1/equipment/items/<id> \
-H "Authorization: Bearer $CAIRN_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"name": "<name>"
}'{
"ok": true,
"data": {
"ok": true
}
}list rental tickets
/api/v1/equipment/rentals參數
returnState選填rentedreturnedoverdue依歸還狀態篩選:rented 在租中、returned 已歸還、overdue 逾期
reconState選填pendingreconcileddeposit_pending依驗收結算狀態篩選:pending 待驗收、reconciled 已結算、deposit_pending 待退押金
orderId選填只列出綁定此訂單 ID 的租借單
departureId選填只列出綁定此梯次 ID 的租借單
回應欄位 · data[]
idorderIdorderNumberdepartureIdrenterNamerentStartDaterentEndDatereturnedAtreturnStateinspectedAtdamageCostTwdreconStatenotescreatedAtupdatedAtlinesidequipmentItemIditemNamequantityrentPriceTwdSnapshotdepositTwdSnapshotreturnedQuantityrentTotalTwddepositTotalTwdcurl -X GET https://your-tenant.example.com/api/v1/equipment/rentals \ -H "Authorization: Bearer $CAIRN_TOKEN"
{
"ok": true,
"data": [
{
"id": "…",
"orderId": "…",
"orderNumber": "…",
"departureId": "…",
"renterName": "…",
"rentStartDate": "…",
"rentEndDate": "…",
"returnedAt": null,
"returnState": "…",
"inspectedAt": null,
"damageCostTwd": 0,
"reconState": "…",
"notes": "…",
"createdAt": "2026-06-30T08:00:00.000Z",
"updatedAt": "2026-06-30T08:00:00.000Z",
"lines": [
{
"id": "…",
"equipmentItemId": "…",
"itemName": "…",
"quantity": 0,
"rentPriceTwdSnapshot": 0,
"depositTwdSnapshot": 0,
"returnedQuantity": 0
}
],
"rentTotalTwd": 0,
"depositTotalTwd": 0
}
]
}open a rental ticket
/api/v1/equipment/rentals參數
orderId必填租借單綁定的訂單 ID(租金與押金會掛入該訂單金流)
departureId選填關聯的梯次 ID(選填)
renterName選填租借人姓名(選填)
rentStartDate選填租借起始日,格式 YYYY-MM-DD(選填)
rentEndDate選填租借結束日,格式 YYYY-MM-DD(選填)
notes選填租借單備註(選填)
lines必填租借明細清單(至少一筆品項)
回應欄位 · data
rentalIdcurl -X POST https://your-tenant.example.com/api/v1/equipment/rentals \
-H "Authorization: Bearer $CAIRN_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"orderId": "<orderId>",
"lines": []
}'{
"ok": true,
"data": {
"rentalId": "…"
}
}single rental ticket detail
/api/v1/equipment/rentals/{id}參數
id路徑租借單 ID
回應欄位 · data
idorderIdorderNumberdepartureIdrenterNamerentStartDaterentEndDatereturnedAtreturnStateinspectedAtdamageCostTwdreconStatenotescreatedAtupdatedAtlinesidequipmentItemIditemNamequantityrentPriceTwdSnapshotdepositTwdSnapshotreturnedQuantityrentTotalTwddepositTotalTwdcurl -X GET https://your-tenant.example.com/api/v1/equipment/rentals/<id> \ -H "Authorization: Bearer $CAIRN_TOKEN"
{
"ok": true,
"data": {
"id": "…",
"orderId": "…",
"orderNumber": "…",
"departureId": "…",
"renterName": "…",
"rentStartDate": "…",
"rentEndDate": "…",
"returnedAt": null,
"returnState": "…",
"inspectedAt": null,
"damageCostTwd": 0,
"reconState": "…",
"notes": "…",
"createdAt": "2026-06-30T08:00:00.000Z",
"updatedAt": "2026-06-30T08:00:00.000Z",
"lines": [
{
"id": "…",
"equipmentItemId": "…",
"itemName": "…",
"quantity": 0,
"rentPriceTwdSnapshot": 0,
"depositTwdSnapshot": 0,
"returnedQuantity": 0
}
],
"rentTotalTwd": 0,
"depositTotalTwd": 0
}
}flag a single rented ticket
/api/v1/equipment/rentals/{id}/mark-overdue參數
id路徑要標記為逾期的租借單 ID
回應欄位 · data
okcurl -X POST https://your-tenant.example.com/api/v1/equipment/rentals/<id>/mark-overdue \ -H "Authorization: Bearer $CAIRN_TOKEN"
{
"ok": true,
"data": {
"ok": true
}
}receive a rental back
/api/v1/equipment/rentals/{id}/return參數
id路徑要驗收歸還的租借單 ID
returnedLines必填各明細的歸還數量清單
damageCostTwd選填損壞賠償金額(台幣,選填)
回應欄位 · data
okcurl -X POST https://your-tenant.example.com/api/v1/equipment/rentals/<id>/return \
-H "Authorization: Bearer $CAIRN_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"returnedLines": []
}'{
"ok": true,
"data": {
"ok": true
}
}the minimal order picker
/api/v1/equipment/rentals/order-options參數
limit選填回傳訂單筆數上限(最多 200,預設取最近多筆)
回應欄位 · data[]
orderIdorderNumbercustomerNamecurl -X GET https://your-tenant.example.com/api/v1/equipment/rentals/order-options \ -H "Authorization: Bearer $CAIRN_TOKEN"
{
"ok": true,
"data": [
{
"orderId": "…",
"orderNumber": "…",
"customerName": "…"
}
]
}/exchange-rates
list the Bank-of-Taiwan published FX rate board
/api/v1/exchange-rates參數
currency選填幣別篩選(ISO 4217 三碼,如 JPY / USD);省略則回傳所有幣別
monthFrom選填起始月份(YYYY-MM,含當月);省略則不設下界
monthTo選填結束月份(YYYY-MM,含當月);省略則不設上界
回應欄位 · data[]
idrateDatecurrencycashBuycashSellspotBuyspotSellsourcecreatedAtupdatedAtcurl -X GET https://your-tenant.example.com/api/v1/exchange-rates \ -H "Authorization: Bearer $CAIRN_TOKEN"
{
"ok": true,
"data": [
{
"id": "…",
"rateDate": "…",
"currency": "…",
"cashBuy": "…",
"cashSell": "…",
"spotBuy": "…",
"spotSell": "…",
"source": "…",
"createdAt": "2026-06-30T08:00:00.000Z",
"updatedAt": "2026-06-30T08:00:00.000Z"
}
]
}manual FX rate override
/api/v1/exchange-rates/manual參數
rateDate必填匯率掛牌日期(YYYY-MM-DD),與幣別共同決定覆蓋哪一筆牌價
currency必填幣別(ISO 4217 三碼大寫,如 JPY / USD)
cashBuy選填現金買入匯率(正數最多 6 位小數,以字串表達);四種報價至少填一個,留空傳 null
cashSell選填現金賣出匯率(正數最多 6 位小數,以字串表達);四種報價至少填一個,留空傳 null
spotBuy選填即期買入匯率(正數最多 6 位小數,以字串表達);四種報價至少填一個,留空傳 null
spotSell選填即期賣出匯率(正數最多 6 位小數,以字串表達);四種報價至少填一個,留空傳 null
回應欄位 · data
okidcurl -X PUT https://your-tenant.example.com/api/v1/exchange-rates/manual \
-H "Authorization: Bearer $CAIRN_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"rateDate": "<rateDate>",
"currency": "<currency>"
}'{
"ok": true,
"data": {
"ok": true,
"id": "…"
}
}resolve the canonical "1 foreign unit =
/api/v1/exchange-rates/resolve參數
currency必填要換算的外幣幣別(ISO 4217 三碼,如 JPY / USD)
date必填換算基準日期(YYYY-MM-DD),套用手動優先 + 往前承接的解析規則
quote選填cash_buycash_sellspot_buyspot_sell報價類型:cash_buy 現金買入、cash_sell 現金賣出、spot_buy 即期買入、spot_sell 即期賣出;省略預設 spot_sell
回應欄位 · data
currencydatequoteratecurl -X GET "https://your-tenant.example.com/api/v1/exchange-rates/resolve?currency=<currency>&date=<date>" \ -H "Authorization: Bearer $CAIRN_TOKEN"
{
"ok": true,
"data": {
"currency": "…",
"date": "…",
"quote": "cash_buy",
"rate": "…"
}
}/group-codes
航空碼對照表
/api/v1/group-codes/airlines參數
activeOnly選填truefalse10傳 true 或 1 時只列出啟用中的航空碼
回應欄位 · data[]
codenameisActivedisplayOrderusedCountcurl -X GET https://your-tenant.example.com/api/v1/group-codes/airlines \ -H "Authorization: Bearer $CAIRN_TOKEN"
{
"ok": true,
"data": [
{
"code": "…",
"name": "…",
"isActive": true,
"displayOrder": 0,
"usedCount": 0
}
]
}/api/v1/group-codes/airlines參數
code必填對照表碼,2–3 碼大寫英數(自動轉大寫)
name必填碼的顯示名稱(如地區或航空公司全名)
isActive選填是否啟用(停用後不再供新團號選用)
displayOrder選填排序權重,數字越小越前面
回應欄位 · data
okcodecurl -X POST https://your-tenant.example.com/api/v1/group-codes/airlines \
-H "Authorization: Bearer $CAIRN_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"code": "<code>",
"name": "<name>"
}'{
"ok": true,
"data": {
"ok": true,
"code": "…"
}
}/api/v1/group-codes/airlines參數
code必填要更新的對照表碼(不可變更碼本身)
name必填碼的顯示名稱(如地區或航空公司全名)
isActive選填是否啟用(停用後不再供新團號選用)
displayOrder選填排序權重,數字越小越前面
回應欄位 · data
okcodecurl -X PATCH https://your-tenant.example.com/api/v1/group-codes/airlines \
-H "Authorization: Bearer $CAIRN_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"code": "<code>",
"name": "<name>"
}'{
"ok": true,
"data": {
"ok": true,
"code": "…"
}
}前綴團號反查多梯次
/api/v1/group-codes/departures參數
prefix必填團號前綴,反查同地區同航空的所有梯次(如 26EGTK)
回應欄位 · data[]
idtripIdtripTitletripSlugdepartureDategroupCoderegionCodeairlineCodecurl -X GET "https://your-tenant.example.com/api/v1/group-codes/departures?prefix=<prefix>" \ -H "Authorization: Bearer $CAIRN_TOKEN"
{
"ok": true,
"data": [
{
"id": "…",
"tripId": "…",
"tripTitle": "…",
"tripSlug": "…",
"departureDate": "…",
"groupCode": "…",
"regionCode": "…",
"airlineCode": "…"
}
]
}精確團號反查單一梯次
/api/v1/group-codes/departures/{id}參數
id路徑完整團號,反查單一梯次(大小寫不敏感)
回應欄位 · data
idtripIdtripTitletripSlugdepartureDategroupCoderegionCodeairlineCodecurl -X GET https://your-tenant.example.com/api/v1/group-codes/departures/<id> \ -H "Authorization: Bearer $CAIRN_TOKEN"
{
"ok": true,
"data": {
"id": "…",
"tripId": "…",
"tripTitle": "…",
"tripSlug": "…",
"departureDate": "…",
"groupCode": "…",
"regionCode": "…",
"airlineCode": "…"
}
}地區碼對照表
/api/v1/group-codes/regions參數
activeOnly選填truefalse10傳 true 或 1 時只列出啟用中的地區碼
回應欄位 · data[]
codenameisActivedisplayOrderusedCountcurl -X GET https://your-tenant.example.com/api/v1/group-codes/regions \ -H "Authorization: Bearer $CAIRN_TOKEN"
{
"ok": true,
"data": [
{
"code": "…",
"name": "…",
"isActive": true,
"displayOrder": 0,
"usedCount": 0
}
]
}/api/v1/group-codes/regions參數
code必填對照表碼,2–3 碼大寫英數(自動轉大寫)
name必填碼的顯示名稱(如地區或航空公司全名)
isActive選填是否啟用(停用後不再供新團號選用)
displayOrder選填排序權重,數字越小越前面
回應欄位 · data
okcodecurl -X POST https://your-tenant.example.com/api/v1/group-codes/regions \
-H "Authorization: Bearer $CAIRN_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"code": "<code>",
"name": "<name>"
}'{
"ok": true,
"data": {
"ok": true,
"code": "…"
}
}/api/v1/group-codes/regions參數
code必填要更新的對照表碼(不可變更碼本身)
name必填碼的顯示名稱(如地區或航空公司全名)
isActive選填是否啟用(停用後不再供新團號選用)
displayOrder選填排序權重,數字越小越前面
回應欄位 · data
okcodecurl -X PATCH https://your-tenant.example.com/api/v1/group-codes/regions \
-H "Authorization: Bearer $CAIRN_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"code": "<code>",
"name": "<name>"
}'{
"ok": true,
"data": {
"ok": true,
"code": "…"
}
}/guide-roster
指派 / 重派 guide 到梯次
/api/v1/guide-roster/assignments參數
departureId必填指派的目標梯次 ID
guideId必填被指派的領隊/嚮導 ID
role必填指派角色(leader 領隊/assistant 隨隊助理)
status必填指派狀態(tentative 預塞暫定/confirmed 正式確認)
回應欄位 · data
idcurl -X POST https://your-tenant.example.com/api/v1/guide-roster/assignments \
-H "Authorization: Bearer $CAIRN_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"departureId": "<departureId>",
"guideId": "<guideId>",
"role": "<role>",
"status": "<status>"
}'{
"ok": true,
"data": {
"id": "…"
}
}移除某筆指派
/api/v1/guide-roster/assignments/{id}參數
id路徑要移除的指派紀錄 ID
回應欄位 · data
okcurl -X DELETE https://your-tenant.example.com/api/v1/guide-roster/assignments/<id> \ -H "Authorization: Bearer $CAIRN_TOKEN"
{
"ok": true,
"data": {
"ok": true
}
}正式確認某筆指派
/api/v1/guide-roster/assignments/{id}/confirm參數
id路徑要正式確認的指派紀錄 ID
回應欄位 · data
okcurl -X POST https://your-tenant.example.com/api/v1/guide-roster/assignments/<id>/confirm \ -H "Authorization: Bearer $CAIRN_TOKEN"
{
"ok": true,
"data": {
"ok": true
}
}換領隊
/api/v1/guide-roster/change-leader參數
departureId必填要換領隊的目標梯次 ID
fromGuideId選填原領隊嚮導 ID(選填;省略表示該梯次原本無領隊)
toGuideId必填新任領隊嚮導 ID
reason必填換領隊的原因(必填,記入稽核)
回應欄位 · data
idcurl -X POST https://your-tenant.example.com/api/v1/guide-roster/change-leader \
-H "Authorization: Bearer $CAIRN_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"departureId": "<departureId>",
"toGuideId": "<toGuideId>",
"reason": "<reason>"
}'{
"ok": true,
"data": {
"id": "…"
}
}pre-check whether assigning a guide
/api/v1/guide-roster/conflict-check參數
departureId必填欲指派的目標梯次 ID
guideId必填欲檢查檔期衝突的領隊/嚮導 ID
curl -X GET "https://your-tenant.example.com/api/v1/guide-roster/conflict-check?departureId=<departureId>&guideId=<guideId>" \ -H "Authorization: Bearer $CAIRN_TOKEN"
{
"ok": true,
"data": null
}schedule conflicts for the selected
/api/v1/guide-roster/conflicts參數
month必填查詢月份(YYYY-MM 格式)
回應欄位 · data[]
guideIdguideNameadepartureIdtripTitledepartureDatereturnDatebdepartureIdtripTitledepartureDatereturnDatecurl -X GET "https://your-tenant.example.com/api/v1/guide-roster/conflicts?month=<month>" \ -H "Authorization: Bearer $CAIRN_TOKEN"
{
"ok": true,
"data": [
{
"guideId": "…",
"guideName": "…",
"a": {
"departureId": "…",
"tripTitle": "…",
"departureDate": "…",
"returnDate": "…"
},
"b": {
"departureId": "…",
"tripTitle": "…",
"departureDate": "…",
"returnDate": "…"
}
}
]
}the selected month's departures
/api/v1/guide-roster/departures參數
month必填查詢月份(YYYY-MM 格式)
includeCancelled選填是否一併納入已取消的梯次(預設不納入)
回應欄位 · data[]
idtripIdtripTitledepartureDatereturnDatedayscapacitybookedCountstatusassignmentsidguideIdguideNamerolestatuscurl -X GET "https://your-tenant.example.com/api/v1/guide-roster/departures?month=<month>" \ -H "Authorization: Bearer $CAIRN_TOKEN"
{
"ok": true,
"data": [
{
"id": "…",
"tripId": "…",
"tripTitle": "…",
"departureDate": "…",
"returnDate": "…",
"days": 0,
"capacity": 0,
"bookedCount": 0,
"status": "…",
"assignments": [
{
"id": "…",
"guideId": "…",
"guideName": "…",
"role": "leader",
"status": "tentative"
}
]
}
]
}roster
/api/v1/guide-roster/guides參數
month必填查詢月份(YYYY-MM 格式)
includeInactive選填是否一併列出已停用的嚮導(預設不列出)
回應欄位 · data[]
idnamerosterRolespecialtiesstatusmaxDaysPerMonthmonthDaysmonthTripshasTentativeavailabilitycurl -X GET "https://your-tenant.example.com/api/v1/guide-roster/guides?month=<month>" \ -H "Authorization: Bearer $CAIRN_TOKEN"
{
"ok": true,
"data": [
{
"id": "…",
"name": "…",
"rosterRole": "leader",
"specialties": [
"…"
],
"status": "…",
"maxDaysPerMonth": 0,
"monthDays": 0,
"monthTrips": 0,
"hasTentative": true,
"availability": "…"
}
]
}/guides
list/search guides
/api/v1/guides參數
slug選填依嚮導公開頁網址代稱(slug)精確查單筆(選填)
status選填allactiveinactive嚮導狀態篩選(all 全部/active 啟用/inactive 停用)
q選填關鍵字搜尋(比對嚮導姓名等欄位)
page選填頁碼(從 1 起算)
pageSize選填每頁筆數(上限 200)
curl -X GET https://your-tenant.example.com/api/v1/guides \ -H "Authorization: Bearer $CAIRN_TOKEN"
{
"ok": true,
"data": "…"
}create a guide
/api/v1/guides參數
name必填嚮導/領隊姓名
slug選填公開頁網址代稱(選填,小寫英數與連字號;省略則自動產生)
bio選填嚮導簡介/經歷(選填)
avatarUrl選填大頭照圖片網址(選填,http/https)
specialties選填專長領域(選填,以逗號分隔多項)
yearsExperience選填帶團年資(年數,0~80;選填)
contactPhone選填聯絡電話(選填)
contactEmail選填聯絡 Email(選填)
status選填activeinactive嚮導狀態(active 啟用/inactive 停用;預設 active)
回應欄位 · data
idslugcurl -X POST https://your-tenant.example.com/api/v1/guides \
-H "Authorization: Bearer $CAIRN_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"name": "<name>"
}'{
"ok": true,
"data": {
"id": "…",
"slug": "…"
}
}single guide detail
/api/v1/guides/{id}參數
id路徑嚮導 ID
回應欄位 · data
idnameslugbioavatarUrlspecialtiesyearsExperiencecontactPhonecontactEmailstatuscreatedAtupdatedAtcurl -X GET https://your-tenant.example.com/api/v1/guides/<id> \ -H "Authorization: Bearer $CAIRN_TOKEN"
{
"ok": true,
"data": {
"id": "…",
"name": "…",
"slug": "…",
"bio": "…",
"avatarUrl": "…",
"specialties": [
"…"
],
"yearsExperience": 0,
"contactPhone": "…",
"contactEmail": "…",
"status": "…",
"createdAt": "2026-06-30T08:00:00.000Z",
"updatedAt": "2026-06-30T08:00:00.000Z"
}
}update a guide
/api/v1/guides/{id}參數
id路徑要更新的嚮導 ID
name選填嚮導/領隊姓名(省略則不更動)
slug選填公開頁網址代稱(小寫英數與連字號;省略則不更動)
bio選填嚮導簡介/經歷(省略則不更動)
avatarUrl選填大頭照圖片網址(http/https;省略則不更動)
specialties選填專長領域(以逗號分隔多項;省略則不更動)
yearsExperience選填帶團年資(年數,0~80;省略則不更動)
contactPhone選填聯絡電話(省略則不更動)
contactEmail選填聯絡 Email(省略則不更動)
status選填activeinactive嚮導狀態(active 啟用/inactive 停用;省略則不更動)
回應欄位 · data
okcurl -X PATCH https://your-tenant.example.com/api/v1/guides/<id> \
-H "Authorization: Bearer $CAIRN_TOKEN" \
-H "Content-Type: application/json" \
-d '{
}'{
"ok": true,
"data": {
"ok": true
}
}archive a guide
/api/v1/guides/{id}/archive參數
id路徑要封存(狀態改為停用)的嚮導 ID
回應欄位 · data
okcurl -X POST https://your-tenant.example.com/api/v1/guides/<id>/archive \ -H "Authorization: Bearer $CAIRN_TOKEN"
{
"ok": true,
"data": {
"ok": true
}
}開通某既有 guide 的嚮導 portal 登入帳號
/api/v1/guides/{id}/invite-account參數
id路徑要開通登入帳號的嚮導 ID
email必填嚮導 portal 登入帳號的 Email
name必填嚮導帳號的顯示姓名
回應欄位 · data
tempPasswordemailcurl -X POST https://your-tenant.example.com/api/v1/guides/<id>/invite-account \
-H "Authorization: Bearer $CAIRN_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"email": "<email>",
"name": "<name>"
}'{
"ok": true,
"data": {
"tempPassword": "…",
"email": "…"
}
}/holidays
per-tenant national-holiday / makeup-workday table
/api/v1/holidays參數
year選填篩選的西元年份(1000..9999);省略則回傳所有年份
回應欄位 · data
rowsdatenameisWorkdaycurl -X GET https://your-tenant.example.com/api/v1/holidays \ -H "Authorization: Bearer $CAIRN_TOKEN"
{
"ok": true,
"data": {
"rows": [
{
"date": "…",
"name": "…",
"isWorkday": true
}
]
}
}upsert / delete a single per-tenant
/api/v1/holidays/{date}參數
date路徑假日 / 補班日的日期(YYYY-MM-DD,路徑參數),作為該筆紀錄的自然鍵
name必填假日 / 補班日名稱(如「春節」「補行上班」)
isWorkday選填是否為補班日:true 表示原假日改上班、false 表示國定假日;影響行前作業工作日倒數
回應欄位 · data
okcurl -X PUT https://your-tenant.example.com/api/v1/holidays/<date> \
-H "Authorization: Bearer $CAIRN_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"name": "<name>"
}'{
"ok": true,
"data": {
"ok": true
}
}/api/v1/holidays/{date}參數
date路徑要刪除的假日 / 補班日日期(YYYY-MM-DD,路徑參數)
回應欄位 · data
okcurl -X DELETE https://your-tenant.example.com/api/v1/holidays/<date> \ -H "Authorization: Bearer $CAIRN_TOKEN"
{
"ok": true,
"data": {
"ok": true
}
}holiday / makeup-workday counts for a
/api/v1/holidays/stats參數
year必填要統計的西元年份(1000..9999,必填)
回應欄位 · data
holidayCountmakeupCountcurl -X GET "https://your-tenant.example.com/api/v1/holidays/stats?year=<year>" \ -H "Authorization: Bearer $CAIRN_TOKEN"
{
"ok": true,
"data": {
"holidayCount": 0,
"makeupCount": 0
}
}/images
list/search the trip image gallery
/api/v1/images參數
tripId選填行程 ID 篩選,僅回傳掛在該行程的圖片
q選填關鍵字,模糊比對行程標題、slug、圖說或網址
page選填分頁頁碼,從 1 起算,預設第 1 頁
pageSize選填每頁筆數,上限 200,預設由後端決定
回應欄位 · data
rowsidtripIdtripTitletripSlugurlcaptiondisplayOrdercreatedAttotalpagepageSizecurl -X GET https://your-tenant.example.com/api/v1/images \ -H "Authorization: Bearer $CAIRN_TOKEN"
{
"ok": true,
"data": {
"rows": [
{
"id": "…",
"tripId": "…",
"tripTitle": "…",
"tripSlug": "…",
"url": "…",
"caption": "…",
"displayOrder": 0,
"createdAt": "2026-06-30T08:00:00.000Z"
}
],
"total": 0,
"page": 0,
"pageSize": 0
}
}/api/v1/images參數
tripId必填要掛上此圖片的行程 ID
url必填圖片網址(http 或 https),以引用方式掛載,非檔案上傳
caption選填圖片說明文字,選填
displayOrder選填排序權重,數字越小越前面,預設 0
回應欄位 · data
idcurl -X POST https://your-tenant.example.com/api/v1/images \
-H "Authorization: Bearer $CAIRN_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"tripId": "<tripId>",
"url": "<url>"
}'{
"ok": true,
"data": {
"id": "…"
}
}remove a trip image
/api/v1/images/{id}參數
id路徑欲刪除的行程圖片 ID
回應欄位 · data
okcurl -X DELETE https://your-tenant.example.com/api/v1/images/<id> \ -H "Authorization: Bearer $CAIRN_TOKEN"
{
"ok": true,
"data": {
"ok": true
}
}the trip picker for attaching images: draft +
/api/v1/images/trips回應欄位 · data[]
idtitlecurl -X GET https://your-tenant.example.com/api/v1/images/trips \ -H "Authorization: Bearer $CAIRN_TOKEN"
{
"ok": true,
"data": [
{
"id": "…",
"title": "…"
}
]
}/internal-external-ledger
/api/v1/internal-external-ledger/costs/{costId}參數
category必填成本類別代碼(須為有效的成本分類)
vendorName選填廠商/供應商名稱
description選填成本摘要說明
amountTwd選填真實成本(台幣整數)。台幣路徑必填;外幣路徑忽略,改由外幣金額乘匯率換算
currency選填幣別;TWD 或留空走台幣路徑,其他幣別走外幣路徑
foreignAmount選填外幣金額(整數);僅外幣路徑使用
internalRateSource選填fx_accountpublishedmanual內帳匯率來源:fx_account 外幣帳戶加權成本、published 台銀牌告、manual 手填成交率
fxAccountId選填外幣帳戶 ID;內帳匯率來源為 fx_account 時使用
manualRate選填手填成交匯率(字串保精度);內帳匯率來源為 manual 時使用
hasReceipt選填是否有發票憑證;預設 true,false 表示無發票並強制可申報額為 0、改填支出證明單欄位
invoiceAmountTwd選填外帳可申報額覆寫(台幣整數,須大於等於 0、無上限)
payeeName選填受款人姓名;無發票時的支出證明單欄位
reasonNoReceipt選填無發票原因;無發票時的支出證明單欄位
proofSummary選填支出證明摘要;無發票時的支出證明單欄位
costId路徑成本列 ID
回應欄位 · data
okcurl -X PATCH https://your-tenant.example.com/api/v1/internal-external-ledger/costs/<costId> \
-H "Authorization: Bearer $CAIRN_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"category": "<category>"
}'{
"ok": true,
"data": {
"ok": true
}
}/api/v1/internal-external-ledger/costs/{costId}參數
costId路徑成本列 ID
回應欄位 · data
okcurl -X DELETE https://your-tenant.example.com/api/v1/internal-external-ledger/costs/<costId> \ -H "Authorization: Bearer $CAIRN_TOKEN"
{
"ok": true,
"data": {
"ok": true
}
}/api/v1/internal-external-ledger/costs/{costId}/approve-declaration參數
costId路徑成本列 ID
回應欄位 · data
okcurl -X POST https://your-tenant.example.com/api/v1/internal-external-ledger/costs/<costId>/approve-declaration \ -H "Authorization: Bearer $CAIRN_TOKEN"
{
"ok": true,
"data": {
"ok": true
}
}待覆核的嚮導申報
/api/v1/internal-external-ledger/declarations/pending回應欄位 · data[]
iddepartureIdtripTitledepartureDatecategoryvendorNameamountTwdinvoiceAmountTwdisDeclarablecreatedByNamecreatedAtcurl -X GET https://your-tenant.example.com/api/v1/internal-external-ledger/declarations/pending \ -H "Authorization: Bearer $CAIRN_TOKEN"
{
"ok": true,
"data": [
{
"id": "…",
"departureId": "…",
"tripTitle": "…",
"departureDate": "…",
"category": "…",
"vendorName": "…",
"amountTwd": 0,
"invoiceAmountTwd": 0,
"isDeclarable": true,
"createdByName": "…",
"createdAt": "2026-06-30T08:00:00.000Z"
}
]
}per-departure 內外帳列表
/api/v1/internal-external-ledger/departures參數
windowDays選填回看天數;只列出近 N 天內的梯次
tripId選填行程 ID;只列出該行程的梯次
period選填出團月(格式 YYYY-MM);只列出該月的梯次
回應欄位 · data[]
tripTitletripSlugdepartureDatereturnDategroupCodepaxdepartureIdrevenueTwdrealCostTwddeclarableCostTwdnonDeclarableCostTwdcostBilledTwdcostUnbilledTwdgrossProfitTwdfeeEcpayTwdfeeFongshouTwdtaxEstTwdestimatedNetProfitTwdmarginPctpendingProofCountfeeRatesecpayFeeBpsfongshouFeeBpsprofitTaxBpscurl -X GET https://your-tenant.example.com/api/v1/internal-external-ledger/departures \ -H "Authorization: Bearer $CAIRN_TOKEN"
{
"ok": true,
"data": [
{
"tripTitle": "…",
"tripSlug": "…",
"departureDate": "…",
"returnDate": "…",
"groupCode": "…",
"pax": 0,
"departureId": "…",
"revenueTwd": 0,
"realCostTwd": 0,
"declarableCostTwd": 0,
"nonDeclarableCostTwd": 0,
"costBilledTwd": 0,
"costUnbilledTwd": 0,
"grossProfitTwd": 0,
"feeEcpayTwd": 0,
"feeFongshouTwd": 0,
"taxEstTwd": 0,
"estimatedNetProfitTwd": 0,
"marginPct": 0,
"pendingProofCount": 0,
"feeRates": {
"ecpayFeeBps": 0,
"fongshouFeeBps": 0,
"profitTaxBps": 0
}
}
]
}single
/api/v1/internal-external-ledger/departures/{departureId}參數
departureId路徑梯次 ID
回應欄位 · data
departureIdrevenueTwdrealCostTwddeclarableCostTwdnonDeclarableCostTwdcostBilledTwdcostUnbilledTwdgrossProfitTwdfeeEcpayTwdfeeFongshouTwdtaxEstTwdestimatedNetProfitTwdmarginPctpendingProofCountfeeRatesecpayFeeBpsfongshouFeeBpsprofitTaxBpscurl -X GET https://your-tenant.example.com/api/v1/internal-external-ledger/departures/<departureId> \ -H "Authorization: Bearer $CAIRN_TOKEN"
{
"ok": true,
"data": {
"departureId": "…",
"revenueTwd": 0,
"realCostTwd": 0,
"declarableCostTwd": 0,
"nonDeclarableCostTwd": 0,
"costBilledTwd": 0,
"costUnbilledTwd": 0,
"grossProfitTwd": 0,
"feeEcpayTwd": 0,
"feeFongshouTwd": 0,
"taxEstTwd": 0,
"estimatedNetProfitTwd": 0,
"marginPct": 0,
"pendingProofCount": 0,
"feeRates": {
"ecpayFeeBps": 0,
"fongshouFeeBps": 0,
"profitTaxBps": 0
}
}
}/api/v1/internal-external-ledger/departures/{departureId}/convert-to-payable參數
departureId路徑梯次 ID
costIds必填要轉成請款核簽的成本列 ID 陣列(至少一筆,須為尚未轉請款者)
payeeType選填supplierguidestaff_commissionother受款對象類型:supplier 供應商、guide 嚮導、staff_commission 員工佣金、other 其他
payeeName必填受款對象名稱
payeeBankAccount選填受款銀行帳號
payeeBankName選填受款銀行名稱
payeeBankBranch選填受款銀行分行
payeeTaxId選填受款對象統一編號/稅籍編號
taxAmountTwd選填代扣稅額(台幣整數)
submitImmediately選填是否建立後立即送出核簽(true 直接送審)
回應欄位 · data
payableIdpayableNumbercurl -X POST https://your-tenant.example.com/api/v1/internal-external-ledger/departures/<departureId>/convert-to-payable \
-H "Authorization: Bearer $CAIRN_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"costIds": [],
"payeeName": "<payeeName>"
}'{
"ok": true,
"data": {
"payableId": "…",
"payableNumber": "…"
}
}/api/v1/internal-external-ledger/departures/{departureId}/costs參數
departureId路徑梯次 ID
createdBy選填登記者使用者 ID;只列出該人登記的成本列
回應欄位 · data[]
iddepartureIdcategoryvendorNamedescriptionamountTwdinvoiceAmountTwdisDeclarablereviewStatuscurrencyforeignAmountinternalRateSourcefxAccountIdinternalRateexternalRatefeeCategoryexpenseProofIdproofNumberproofStatuspayableIdpayableNumberpayableStatuscreatedAtupdatedAtcurl -X GET https://your-tenant.example.com/api/v1/internal-external-ledger/departures/<departureId>/costs \ -H "Authorization: Bearer $CAIRN_TOKEN"
{
"ok": true,
"data": [
{
"id": "…",
"departureId": "…",
"category": "…",
"vendorName": "…",
"description": "…",
"amountTwd": 0,
"invoiceAmountTwd": 0,
"isDeclarable": true,
"reviewStatus": "…",
"currency": "…",
"foreignAmount": 0,
"internalRateSource": "…",
"fxAccountId": "…",
"internalRate": "…",
"externalRate": "…",
"feeCategory": "…",
"expenseProofId": "…",
"proofNumber": "…",
"proofStatus": "…",
"payableId": "…",
"payableNumber": "…",
"payableStatus": "…",
"createdAt": "2026-06-30T08:00:00.000Z",
"updatedAt": "2026-06-30T08:00:00.000Z"
}
]
}/api/v1/internal-external-ledger/departures/{departureId}/costs參數
category必填成本類別代碼(須為有效的成本分類)
vendorName選填廠商/供應商名稱
description選填成本摘要說明
amountTwd選填真實成本(台幣整數)。台幣路徑必填;外幣路徑忽略,改由外幣金額乘匯率換算
currency選填幣別;TWD 或留空走台幣路徑,其他幣別走外幣路徑
foreignAmount選填外幣金額(整數);僅外幣路徑使用
internalRateSource選填fx_accountpublishedmanual內帳匯率來源:fx_account 外幣帳戶加權成本、published 台銀牌告、manual 手填成交率
fxAccountId選填外幣帳戶 ID;內帳匯率來源為 fx_account 時使用
manualRate選填手填成交匯率(字串保精度);內帳匯率來源為 manual 時使用
hasReceipt選填是否有發票憑證;預設 true,false 表示無發票並強制可申報額為 0、改填支出證明單欄位
invoiceAmountTwd選填外帳可申報額覆寫(台幣整數,須大於等於 0、無上限)
payeeName選填受款人姓名;無發票時的支出證明單欄位
reasonNoReceipt選填無發票原因;無發票時的支出證明單欄位
proofSummary選填支出證明摘要;無發票時的支出證明單欄位
departureId路徑梯次 ID
回應欄位 · data
idexpenseProofIdcurl -X POST https://your-tenant.example.com/api/v1/internal-external-ledger/departures/<departureId>/costs \
-H "Authorization: Bearer $CAIRN_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"category": "<category>"
}'{
"ok": true,
"data": {
"id": "…",
"expenseProofId": "…"
}
}支出
/api/v1/internal-external-ledger/departures/{departureId}/proofs參數
departureId路徑梯次 ID
回應欄位 · data[]
idproofNumberdepartureIdpayeeNameamountTwdreasonNoReceiptsummaryhandlerUserIdapproverUserIdstatusapprovedAtcreatedAtupdatedAtcurl -X GET https://your-tenant.example.com/api/v1/internal-external-ledger/departures/<departureId>/proofs \ -H "Authorization: Bearer $CAIRN_TOKEN"
{
"ok": true,
"data": [
{
"id": "…",
"proofNumber": "…",
"departureId": "…",
"payeeName": "…",
"amountTwd": 0,
"reasonNoReceipt": "…",
"summary": "…",
"handlerUserId": "…",
"approverUserId": "…",
"status": "…",
"approvedAt": null,
"createdAt": "2026-06-30T08:00:00.000Z",
"updatedAt": "2026-06-30T08:00:00.000Z"
}
]
}/api/v1/internal-external-ledger/departures/{departureId}/proofs/{proofId}參數
departureId路徑梯次 ID
proofId路徑支出證明單 ID
回應欄位 · data
idproofNumberdepartureIdpayeeNameamountTwdreasonNoReceiptsummaryhandlerUserIdapproverUserIdstatusapprovedAtcreatedAtupdatedAtcurl -X GET https://your-tenant.example.com/api/v1/internal-external-ledger/departures/<departureId>/proofs/<proofId> \ -H "Authorization: Bearer $CAIRN_TOKEN"
{
"ok": true,
"data": {
"id": "…",
"proofNumber": "…",
"departureId": "…",
"payeeName": "…",
"amountTwd": 0,
"reasonNoReceipt": "…",
"summary": "…",
"handlerUserId": "…",
"approverUserId": "…",
"status": "…",
"approvedAt": null,
"createdAt": "2026-06-30T08:00:00.000Z",
"updatedAt": "2026-06-30T08:00:00.000Z"
}
}/api/v1/internal-external-ledger/proofs/{proofId}/approve參數
proofId路徑支出證明單 ID
回應欄位 · data
okcurl -X POST https://your-tenant.example.com/api/v1/internal-external-ledger/proofs/<proofId>/approve \ -H "Authorization: Bearer $CAIRN_TOKEN"
{
"ok": true,
"data": {
"ok": true
}
}/journal
list/search 嚮導手記 posts
/api/v1/journal參數
status選填alldraftpublishedarchived依狀態篩選:all 全部、draft 草稿、published 已發佈、archived 已封存
q選填關鍵字搜尋(標題/內容)
page選填頁碼(從 1 起)
pageSize選填每頁筆數(上限 200)
回應欄位 · data
rowsidslugtitleexcerptcoverImageUrlcontentMdxauthorGuideIdseoTitleseoDescriptionogImageUrlstatuspublishedAtcreatedAtupdatedAttotalpagepageSizecurl -X GET https://your-tenant.example.com/api/v1/journal \ -H "Authorization: Bearer $CAIRN_TOKEN"
{
"ok": true,
"data": {
"rows": [
{
"id": "…",
"slug": "…",
"title": "…",
"excerpt": "…",
"coverImageUrl": "…",
"contentMdx": "…",
"authorGuideId": "…",
"seoTitle": "…",
"seoDescription": "…",
"ogImageUrl": "…",
"status": "…",
"publishedAt": null,
"createdAt": "2026-06-30T08:00:00.000Z",
"updatedAt": "2026-06-30T08:00:00.000Z"
}
],
"total": 0,
"page": 0,
"pageSize": 0
}
}create a 嚮導手記 post
/api/v1/journal參數
title必填手記標題,顯示於前台與後台列表
slug選填網址代稱(slug);僅小寫英數與連字號,省略時由系統依標題產生
excerpt選填摘要,列表與分享預覽用;null 清除
coverImageUrl選填封面圖網址(http/https);null 清除
contentMdx必填內文(MDX 格式)
authorGuideId選填作者嚮導 ID;null 表示無指定作者
seoTitle選填SEO 標題,省略時用 title;null 清除
seoDescription選填SEO 描述(meta description);null 清除
ogImageUrl選填Open Graph 分享圖網址(http/https);null 清除
status選填draftpublishedarchived發佈狀態:draft 草稿、published 已發佈、archived 已封存
回應欄位 · data
idslugcurl -X POST https://your-tenant.example.com/api/v1/journal \
-H "Authorization: Bearer $CAIRN_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"title": "<title>",
"contentMdx": "<contentMdx>"
}'{
"ok": true,
"data": {
"id": "…",
"slug": "…"
}
}full 嚮導手記 post detail
/api/v1/journal/{id}參數
id路徑嚮導手記文章 ID
回應欄位 · data
idslugtitleexcerptcoverImageUrlcontentMdxauthorGuideIdseoTitleseoDescriptionogImageUrlstatuspublishedAtcreatedAtupdatedAtcurl -X GET https://your-tenant.example.com/api/v1/journal/<id> \ -H "Authorization: Bearer $CAIRN_TOKEN"
{
"ok": true,
"data": {
"id": "…",
"slug": "…",
"title": "…",
"excerpt": "…",
"coverImageUrl": "…",
"contentMdx": "…",
"authorGuideId": "…",
"seoTitle": "…",
"seoDescription": "…",
"ogImageUrl": "…",
"status": "…",
"publishedAt": null,
"createdAt": "2026-06-30T08:00:00.000Z",
"updatedAt": "2026-06-30T08:00:00.000Z"
}
}update a 嚮導手記 post
/api/v1/journal/{id}參數
title必填手記標題,顯示於前台與後台列表
slug選填網址代稱(slug);僅小寫英數與連字號,省略時由系統依標題產生
excerpt選填摘要,列表與分享預覽用;null 清除
coverImageUrl選填封面圖網址(http/https);null 清除
contentMdx必填內文(MDX 格式)
authorGuideId選填作者嚮導 ID;null 表示無指定作者
seoTitle選填SEO 標題,省略時用 title;null 清除
seoDescription選填SEO 描述(meta description);null 清除
ogImageUrl選填Open Graph 分享圖網址(http/https);null 清除
status選填draftpublishedarchived發佈狀態:draft 草稿、published 已發佈、archived 已封存
id路徑嚮導手記文章 ID
回應欄位 · data
okcurl -X PATCH https://your-tenant.example.com/api/v1/journal/<id> \
-H "Authorization: Bearer $CAIRN_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"title": "<title>",
"contentMdx": "<contentMdx>"
}'{
"ok": true,
"data": {
"ok": true
}
}archive a 嚮導手記 post
/api/v1/journal/{id}/archive參數
id路徑嚮導手記文章 ID
回應欄位 · data
okcurl -X POST https://your-tenant.example.com/api/v1/journal/<id>/archive \ -H "Authorization: Bearer $CAIRN_TOKEN"
{
"ok": true,
"data": {
"ok": true
}
}/leaderboard
全公司業務業績排行
/api/v1/leaderboard參數
period選填monthquarteryearall業績統計區間:當月、當季、當年或全部,預設 month
回應欄位 · data[]
userIdnameemailroleorderCountpaidCountcancelledCountrevenuecurl -X GET https://your-tenant.example.com/api/v1/leaderboard \ -H "Authorization: Bearer $CAIRN_TOKEN"
{
"ok": true,
"data": [
{
"userId": "…",
"name": "…",
"email": "…",
"role": "…",
"orderCount": 0,
"paidCount": 0,
"cancelledCount": 0,
"revenue": 0
}
]
}待派發訂單 KPI
/api/v1/leaderboard/review-stats回應欄位 · data
pendingCountpendingTotalTwdlongestWaitHoursthisMonthAssignedcurl -X GET https://your-tenant.example.com/api/v1/leaderboard/review-stats \ -H "Authorization: Bearer $CAIRN_TOKEN"
{
"ok": true,
"data": {
"pendingCount": 0,
"pendingTotalTwd": 0,
"longestWaitHours": 0,
"thisMonthAssigned": 0
}
}/lodging
list staff-side direct lodging bookings
/api/v1/lodging/bookings參數
status選填依訂單狀態篩選(省略則回全部)
q選填自由文字關鍵字(訂房人、旅宿等)
回應欄位 · data[]
orderIdorderNumberstatusbookingStatepaymentStaterefundStatetotalTwdcreatedAtbookerNamebookerEmailpropertyIdpropertyNameroomTypeIdroomTypeNamecheckIncheckOutunitsguestCountcurl -X GET https://your-tenant.example.com/api/v1/lodging/bookings \ -H "Authorization: Bearer $CAIRN_TOKEN"
{
"ok": true,
"data": [
{
"orderId": "…",
"orderNumber": "…",
"status": "…",
"bookingState": "…",
"paymentState": "…",
"refundState": "…",
"totalTwd": 0,
"createdAt": "2026-06-30T08:00:00.000Z",
"bookerName": "…",
"bookerEmail": "…",
"propertyId": "…",
"propertyName": "…",
"roomTypeId": "…",
"roomTypeName": "…",
"checkIn": "…",
"checkOut": "…",
"units": 0,
"guestCount": 0
}
]
}/api/v1/lodging/bookings參數
propertyId必填旅宿物件 ID
roomTypeId必填房型 ID(須屬於該旅宿物件)
checkIn必填入住日(YYYY-MM-DD,含此晚)
checkOut必填退房日(YYYY-MM-DD,不含此晚,須晚於入住日)
units必填預訂單元數(房數或床位數,1-50)
guestCount必填入住人數(1-100,不得超過房型總容納人數)
bookerEmail必填訂房人 Email(須為已註冊會員)
paymentMethod必填cashatmmanual付款方式:cash 現金/atm 轉帳/manual 其他人工
receivingAccountId選填收款帳戶 ID(搭配付款方式記帳,可省略)
notes選填代訂備註
回應欄位 · data
orderIdcurl -X POST https://your-tenant.example.com/api/v1/lodging/bookings \
-H "Authorization: Bearer $CAIRN_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"propertyId": "<propertyId>",
"roomTypeId": "<roomTypeId>",
"checkIn": "<checkIn>",
"checkOut": "<checkOut>",
"units": 0,
"guestCount": 0,
"bookerEmail": "<bookerEmail>",
"paymentMethod": "cash"
}'{
"ok": true,
"data": {
"orderId": "…"
}
}single lodging booking detail.
/api/v1/lodging/bookings/{orderId}參數
orderId路徑旅宿訂單 ID
回應欄位 · data
orderIdorderNumberstatusbookingStatepaymentStaterefundStatetotalTwdcreatedAtbookerNamebookerEmailpropertyIdpropertyNameroomTypeIdroomTypeNamecheckIncheckOutunitsguestCountcurl -X GET https://your-tenant.example.com/api/v1/lodging/bookings/<orderId> \ -H "Authorization: Bearer $CAIRN_TOKEN"
{
"ok": true,
"data": {
"orderId": "…",
"orderNumber": "…",
"status": "…",
"bookingState": "…",
"paymentState": "…",
"refundState": "…",
"totalTwd": 0,
"createdAt": "2026-06-30T08:00:00.000Z",
"bookerName": "…",
"bookerEmail": "…",
"propertyId": "…",
"propertyName": "…",
"roomTypeId": "…",
"roomTypeName": "…",
"checkIn": "…",
"checkOut": "…",
"units": 0,
"guestCount": 0
}
}cancel a direct lodging
/api/v1/lodging/bookings/{orderId}/cancel參數
orderId路徑旅宿訂單 ID
回應欄位 · data
okcurl -X POST https://your-tenant.example.com/api/v1/lodging/bookings/<orderId>/cancel \ -H "Authorization: Bearer $CAIRN_TOKEN"
{
"ok": true,
"data": {
"ok": true
}
}delete a gallery
/api/v1/lodging/images/{id}參數
id路徑圖片 ID
kind必填propertyroom-type圖片所屬相簿:property 旅宿相簿/room-type 房型相簿
回應欄位 · data
okcurl -X DELETE "https://your-tenant.example.com/api/v1/lodging/images/<id>?kind=<kind>" \ -H "Authorization: Bearer $CAIRN_TOKEN"
{
"ok": true,
"data": {
"ok": true
}
}list tenant lodging properties
/api/v1/lodging/properties回應欄位 · data[]
iddescriptionstatusnamephonekindcontentMdxslugcoverImageUrlseoTitleseoDescriptionogImageUrlisOverseaslocationfacilitiesusageHintcheckInTimecheckOutTimecheckInInfohouseRulescancellationPolicyaddressRegionaddressLocalitystreetAddresspostalCodelatitudelongitudepetsAllowedsmokingAllowedcreatedAtupdatedAtcurl -X GET https://your-tenant.example.com/api/v1/lodging/properties \ -H "Authorization: Bearer $CAIRN_TOKEN"
{
"ok": true,
"data": [
{
"id": "…",
"description": "…",
"status": "…",
"name": "…",
"phone": "…",
"kind": "…",
"contentMdx": "…",
"slug": "…",
"coverImageUrl": "…",
"seoTitle": "…",
"seoDescription": "…",
"ogImageUrl": "…",
"isOverseas": true,
"location": "…",
"facilities": "…",
"usageHint": "…",
"checkInTime": "…",
"checkOutTime": "…",
"checkInInfo": "…",
"houseRules": "…",
"cancellationPolicy": "…",
"addressRegion": "…",
"addressLocality": "…",
"streetAddress": "…",
"postalCode": "…",
"latitude": 0,
"longitude": 0,
"petsAllowed": true,
"smokingAllowed": true,
"createdAt": "2026-06-30T08:00:00.000Z",
"updatedAt": "2026-06-30T08:00:00.000Z"
}
]
}create a property
/api/v1/lodging/properties參數
slug必填旅宿代稱(小寫英數與連字號,2-63 字,租戶內唯一,用於網址)
name必填旅宿名稱(對外顯示)
kind選填camphotel旅宿類型:camp 營地/hotel 旅館,預設 hotel
isOverseas選填是否為海外旅宿,預設否
location選填所在地點概述(如縣市、區域)
description選填旅宿介紹文字
usageHint選填directpackageboth銷售用途:direct 僅直接訂房/package 僅併入套裝行程/both 兩者皆可,預設 both
回應欄位 · data
idcurl -X POST https://your-tenant.example.com/api/v1/lodging/properties \
-H "Authorization: Bearer $CAIRN_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"slug": "<slug>",
"name": "<name>"
}'{
"ok": true,
"data": {
"id": "…"
}
}single lodging property
/api/v1/lodging/properties/{id}參數
id路徑旅宿物件 ID
回應欄位 · data
iddescriptionstatusnamephonekindcontentMdxslugcoverImageUrlseoTitleseoDescriptionogImageUrlisOverseaslocationfacilitiesusageHintcheckInTimecheckOutTimecheckInInfohouseRulescancellationPolicyaddressRegionaddressLocalitystreetAddresspostalCodelatitudelongitudepetsAllowedsmokingAllowedcreatedAtupdatedAtcurl -X GET https://your-tenant.example.com/api/v1/lodging/properties/<id> \ -H "Authorization: Bearer $CAIRN_TOKEN"
{
"ok": true,
"data": {
"id": "…",
"description": "…",
"status": "…",
"name": "…",
"phone": "…",
"kind": "…",
"contentMdx": "…",
"slug": "…",
"coverImageUrl": "…",
"seoTitle": "…",
"seoDescription": "…",
"ogImageUrl": "…",
"isOverseas": true,
"location": "…",
"facilities": "…",
"usageHint": "…",
"checkInTime": "…",
"checkOutTime": "…",
"checkInInfo": "…",
"houseRules": "…",
"cancellationPolicy": "…",
"addressRegion": "…",
"addressLocality": "…",
"streetAddress": "…",
"postalCode": "…",
"latitude": 0,
"longitude": 0,
"petsAllowed": true,
"smokingAllowed": true,
"createdAt": "2026-06-30T08:00:00.000Z",
"updatedAt": "2026-06-30T08:00:00.000Z"
}
}update a property
/api/v1/lodging/properties/{id}參數
id路徑旅宿物件 ID
name選填旅宿名稱(對外顯示)
location選填所在地點概述(如縣市、區域)
description選填旅宿介紹文字
usageHint選填directpackageboth銷售用途:direct 僅直接訂房/package 僅併入套裝行程/both 兩者皆可
checkInTime選填入住時間(如 15:00)
checkOutTime選填退房時間(如 11:00)
checkInInfo選填入住須知與報到說明
houseRules選填住宿規範
cancellationPolicy選填取消政策說明
addressRegion選填地址行政區(縣市層級)
addressLocality選填地址鄉鎮市區
streetAddress選填街道地址
postalCode選填郵遞區號
latitude選填緯度(-90 至 90)
longitude選填經度(-180 至 180)
phone選填聯絡電話
petsAllowed選填allowdisallowunset是否允許攜帶寵物:allow 允許/disallow 不允許/unset 清除設定,省略則不變更
smokingAllowed選填allowdisallowunset是否允許吸菸:allow 允許/disallow 不允許/unset 清除設定,省略則不變更
facilities選填設施代碼陣列(須為合法 amenity key;送空陣列代表清空)
seoTitle選填SEO 標題(送空字串代表清空,退回預設)
seoDescription選填SEO 描述(送空字串代表清空,退回預設)
ogImageUrl選填社群分享圖 URL(須為 http/https,送空字串代表清空)
回應欄位 · data
okcurl -X PATCH https://your-tenant.example.com/api/v1/lodging/properties/<id> \
-H "Authorization: Bearer $CAIRN_TOKEN" \
-H "Content-Type: application/json" \
-d '{
}'{
"ok": true,
"data": {
"ok": true
}
}archive
/api/v1/lodging/properties/{id}/archive參數
id路徑旅宿物件 ID
回應欄位 · data
okcurl -X POST https://your-tenant.example.com/api/v1/lodging/properties/<id>/archive \ -H "Authorization: Bearer $CAIRN_TOKEN"
{
"ok": true,
"data": {
"ok": true
}
}property gallery images.
/api/v1/lodging/properties/{id}/images參數
id路徑旅宿物件 ID
回應欄位 · data[]
idurlcaptiondisplayOrdercurl -X GET https://your-tenant.example.com/api/v1/lodging/properties/<id>/images \ -H "Authorization: Bearer $CAIRN_TOKEN"
{
"ok": true,
"data": [
{
"id": "…",
"url": "…",
"caption": "…",
"displayOrder": 0
}
]
}add a property gallery image
/api/v1/lodging/properties/{id}/images參數
id路徑旅宿物件 ID
url必填圖片網址
caption選填圖片說明文字(可省略)
displayOrder選填在相簿中的排序序號,數字越小越前面,預設 0
回應欄位 · data
idcurl -X POST https://your-tenant.example.com/api/v1/lodging/properties/<id>/images \
-H "Authorization: Bearer $CAIRN_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"url": "<url>"
}'{
"ok": true,
"data": {
"id": "…"
}
}room types for one property
/api/v1/lodging/properties/{id}/room-types參數
id路徑旅宿物件 ID
回應欄位 · data[]
iddescriptionstatusnamebedConfigpropertyIdfacilitiescreatedAtupdatedAtinventoryUnitunitsTotalcapacityPerUnitbasePriceTwdfloorSizeSqmcurl -X GET https://your-tenant.example.com/api/v1/lodging/properties/<id>/room-types \ -H "Authorization: Bearer $CAIRN_TOKEN"
{
"ok": true,
"data": [
{
"id": "…",
"description": "…",
"status": "…",
"name": "…",
"bedConfig": "…",
"propertyId": "…",
"facilities": "…",
"createdAt": "2026-06-30T08:00:00.000Z",
"updatedAt": "2026-06-30T08:00:00.000Z",
"inventoryUnit": "…",
"unitsTotal": 0,
"capacityPerUnit": 0,
"basePriceTwd": 0,
"floorSizeSqm": 0
}
]
}create a room type under this property
/api/v1/lodging/properties/{id}/room-types參數
id路徑所屬旅宿物件 ID
name必填房型名稱(如標準雙人房)
inventoryUnit選填roombed庫存單位:room 以房計/bed 以床位計,預設 room
unitsTotal必填此房型可售總單元數(房數或床位數)
capacityPerUnit選填每單元可容納人數,預設 1
basePriceTwd必填每晚每單元基準售價(新台幣)
description選填房型介紹文字
floorSizeSqm選填房間坪數(平方公尺)
bedType選填床型代碼(須為合法 bed type,搭配 bedCount 才生效)
bedCount選填該床型數量(須大於 0 才生效)
facilities選填房型設施代碼陣列(須為合法 amenity key)
回應欄位 · data
idcurl -X POST https://your-tenant.example.com/api/v1/lodging/properties/<id>/room-types \
-H "Authorization: Bearer $CAIRN_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"name": "<name>",
"unitsTotal": 0,
"basePriceTwd": 0
}'{
"ok": true,
"data": {
"id": "…"
}
}single room type
/api/v1/lodging/room-types/{id}參數
id路徑房型 ID
回應欄位 · data
iddescriptionstatusnamebedConfigpropertyIdfacilitiescreatedAtupdatedAtinventoryUnitunitsTotalcapacityPerUnitbasePriceTwdfloorSizeSqmcurl -X GET https://your-tenant.example.com/api/v1/lodging/room-types/<id> \ -H "Authorization: Bearer $CAIRN_TOKEN"
{
"ok": true,
"data": {
"id": "…",
"description": "…",
"status": "…",
"name": "…",
"bedConfig": "…",
"propertyId": "…",
"facilities": "…",
"createdAt": "2026-06-30T08:00:00.000Z",
"updatedAt": "2026-06-30T08:00:00.000Z",
"inventoryUnit": "…",
"unitsTotal": 0,
"capacityPerUnit": 0,
"basePriceTwd": 0,
"floorSizeSqm": 0
}
}update a room type
/api/v1/lodging/room-types/{id}參數
id路徑房型 ID
name選填房型名稱(如標準雙人房)
inventoryUnit選填roombed庫存單位:room 以房計/bed 以床位計
unitsTotal選填此房型可售總單元數(房數或床位數)
capacityPerUnit選填每單元可容納人數
basePriceTwd選填每晚每單元基準售價(新台幣)
description選填房型介紹文字
floorSizeSqm選填房間坪數(平方公尺)
bedType選填床型代碼(須為合法 bed type,搭配 bedCount 才生效)
bedCount選填該床型數量(須大於 0 才生效)
facilities選填房型設施代碼陣列(須為合法 amenity key;送空陣列代表清空)
回應欄位 · data
okcurl -X PATCH https://your-tenant.example.com/api/v1/lodging/room-types/<id> \
-H "Authorization: Bearer $CAIRN_TOKEN" \
-H "Content-Type: application/json" \
-d '{
}'{
"ok": true,
"data": {
"ok": true
}
}archive
/api/v1/lodging/room-types/{id}/archive參數
id路徑房型 ID
回應欄位 · data
okcurl -X POST https://your-tenant.example.com/api/v1/lodging/room-types/<id>/archive \ -H "Authorization: Bearer $CAIRN_TOKEN"
{
"ok": true,
"data": {
"ok": true
}
}per-night availability +
/api/v1/lodging/room-types/{id}/availability參數
id路徑房型 ID
checkIn必填入住日(YYYY-MM-DD,含此晚)
checkOut必填退房日(YYYY-MM-DD,不含此晚)
回應欄位 · data
availablenightstotalPriceTwdperNightnightcapacitybookedremainingpriceTwdstatuscurl -X GET "https://your-tenant.example.com/api/v1/lodging/room-types/<id>/availability?checkIn=<checkIn>&checkOut=<checkOut>" \ -H "Authorization: Bearer $CAIRN_TOKEN"
{
"ok": true,
"data": {
"available": 0,
"nights": 0,
"totalPriceTwd": 0,
"perNight": [
{
"night": "…",
"capacity": 0,
"booked": 0,
"remaining": 0,
"priceTwd": 0,
"status": "…"
}
]
}
}per-night
/api/v1/lodging/room-types/{id}/availability/breakdown參數
id路徑房型 ID
from必填起始日(YYYY-MM-DD,含此晚)
to必填結束日(YYYY-MM-DD,不含此晚)
回應欄位 · data[]
nightdirectBookedpackageBookedcurl -X GET "https://your-tenant.example.com/api/v1/lodging/room-types/<id>/availability/breakdown?from=<from>&to=<to>" \ -H "Authorization: Bearer $CAIRN_TOKEN"
{
"ok": true,
"data": [
{
"night": "…",
"directBooked": 0,
"packageBooked": 0
}
]
}room-type gallery images.
/api/v1/lodging/room-types/{id}/images參數
id路徑房型 ID
回應欄位 · data[]
idurlcaptiondisplayOrdercurl -X GET https://your-tenant.example.com/api/v1/lodging/room-types/<id>/images \ -H "Authorization: Bearer $CAIRN_TOKEN"
{
"ok": true,
"data": [
{
"id": "…",
"url": "…",
"caption": "…",
"displayOrder": 0
}
]
}add a room-type gallery image
/api/v1/lodging/room-types/{id}/images參數
id路徑房型 ID
url必填圖片網址
caption選填圖片說明文字(可省略)
displayOrder選填在相簿中的排序序號,數字越小越前面,預設 0
回應欄位 · data
idcurl -X POST https://your-tenant.example.com/api/v1/lodging/room-types/<id>/images \
-H "Authorization: Bearer $CAIRN_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"url": "<url>"
}'{
"ok": true,
"data": {
"id": "…"
}
}batch-override the
/api/v1/lodging/room-types/{id}/nights/override參數
id路徑房型 ID
from必填套用起始日(YYYY-MM-DD,含此日)
to必填套用結束日(YYYY-MM-DD,含此日;須不早於起始日)
priceTwd選填覆寫的每晚售價(新台幣),省略則不調整價格
capacity選填覆寫的每晚可售單元數,若低於已訂數量會回 409 衝突
status選填openclosed每晚開關房狀態:open 開放/closed 封房
回應欄位 · data
okcurl -X POST https://your-tenant.example.com/api/v1/lodging/room-types/<id>/nights/override \
-H "Authorization: Bearer $CAIRN_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"from": "<from>",
"to": "<to>"
}'{
"ok": true,
"data": {
"ok": true
}
}旅宿 dashboard overview
/api/v1/lodging/stats回應欄位 · data
tonightCheckInUnitstonightCheckInGuestsweekOccupancyPctnext7AvailableUnitspendingPaymentCountpendingPaymentTwdcurl -X GET https://your-tenant.example.com/api/v1/lodging/stats \ -H "Authorization: Bearer $CAIRN_TOKEN"
{
"ok": true,
"data": {
"tonightCheckInUnits": 0,
"tonightCheckInGuests": 0,
"weekOccupancyPct": 0,
"next7AvailableUnits": 0,
"pendingPaymentCount": 0,
"pendingPaymentTwd": 0
}
}/members
list/search the tenant customer
/api/v1/members參數
q選填關鍵字,模糊比對會員姓名、Email 或電話
county選填縣市篩選,僅回傳通訊地址在該縣市的會員
year選填加入年份(西元四位數),僅回傳該年註冊的會員
page選填分頁頁碼,從 1 起算,預設第 1 頁
pageSize選填每頁筆數,上限 200,預設由後端決定
回應欄位 · data
rowsuserIdemailnamecreatedAtphoneaddressbirthDateorderCountpaidOrderCounttotalSpentlastOrderAtpdpaSignedAtanonymizedAttotalpagepageSizecurl -X GET https://your-tenant.example.com/api/v1/members \ -H "Authorization: Bearer $CAIRN_TOKEN"
{
"ok": true,
"data": {
"rows": [
{
"userId": "…",
"email": "…",
"name": "…",
"createdAt": "2026-06-30T08:00:00.000Z",
"phone": "…",
"address": "…",
"birthDate": "…",
"orderCount": 0,
"paidOrderCount": 0,
"totalSpent": 0,
"lastOrderAt": null,
"pdpaSignedAt": null,
"anonymizedAt": null
}
],
"total": 0,
"page": 0,
"pageSize": 0
}
}full member detail
/api/v1/members/{id}參數
id路徑會員(顧客)的使用者 ID
回應欄位 · data
profileuserIdemailnamecreatedAtphoneaddressbirthDateorderCountpaidOrderCounttotalSpentlastOrderAtpdpaSignedAtanonymizedAtordersidorderNumberstatustotalcreatedAttripTitleconsentsidkindversionsignedAtipAddresscurl -X GET https://your-tenant.example.com/api/v1/members/<id> \ -H "Authorization: Bearer $CAIRN_TOKEN"
{
"ok": true,
"data": {
"profile": {
"userId": "…",
"email": "…",
"name": "…",
"createdAt": "2026-06-30T08:00:00.000Z",
"phone": "…",
"address": "…",
"birthDate": "…",
"orderCount": 0,
"paidOrderCount": 0,
"totalSpent": 0,
"lastOrderAt": null,
"pdpaSignedAt": null,
"anonymizedAt": null
},
"orders": [
{
"id": "…",
"orderNumber": "…",
"status": "…",
"total": 0,
"createdAt": "2026-06-30T08:00:00.000Z",
"tripTitle": "…"
}
],
"consents": [
{
"id": "…",
"kind": "…",
"version": 0,
"signedAt": "2026-06-30T08:00:00.000Z",
"ipAddress": "…"
}
]
}
}irreversible PDPA anonymization of one
/api/v1/members/{id}/anonymize參數
id路徑欲匿名化的會員(顧客)使用者 ID
reason選填匿名化原因,記入稽核紀錄備查
回應欄位 · data
okcurl -X POST https://your-tenant.example.com/api/v1/members/<id>/anonymize \
-H "Authorization: Bearer $CAIRN_TOKEN" \
-H "Content-Type: application/json" \
-d '{
}'{
"ok": true,
"data": {
"ok": true
}
}given a batch of member
/api/v1/members/expiry-warnings參數
ids必填以逗號分隔的會員使用者 ID 批次,上限 200 個,回傳其中護照即將到期者
回應欄位 · data
userIdscurl -X GET "https://your-tenant.example.com/api/v1/members/expiry-warnings?ids=<ids>" \ -H "Authorization: Bearer $CAIRN_TOKEN"
{
"ok": true,
"data": {
"userIds": [
"…"
]
}
}member directory KPI cards
/api/v1/members/stats回應欄位 · data
totalMembersnewThisMonthwithOrdersaverageOrderscurl -X GET https://your-tenant.example.com/api/v1/members/stats \ -H "Authorization: Bearer $CAIRN_TOKEN"
{
"ok": true,
"data": {
"totalMembers": 0,
"newThisMonth": 0,
"withOrders": 0,
"averageOrders": 0
}
}/message-templates
list canned message templates
/api/v1/message-templates參數
channel選填lineemail依發送管道篩選範本(line 或 email)
回應欄位 · data[]
idkeystagechanneltitlebodySinglebodyMultiisActivecreatedAtupdatedAtcurl -X GET https://your-tenant.example.com/api/v1/message-templates \ -H "Authorization: Bearer $CAIRN_TOKEN"
{
"ok": true,
"data": [
{
"id": "…",
"key": "…",
"stage": "受理",
"channel": "email",
"title": "…",
"bodySingle": "…",
"bodyMulti": "…",
"isActive": true,
"createdAt": "2026-06-30T08:00:00.000Z",
"updatedAt": "2026-06-30T08:00:00.000Z"
}
]
}/api/v1/message-templates參數
key選填範本識別碼,2–64 碼大寫英數 / _ / -(用於程式化引用,選填,自動轉大寫)
stage必填訊息對應的 SOP 階段
channel必填發送管道(line 或 email)
title必填範本標題(供後台辨識)
bodySingle必填單人版訊息內文
bodyMulti選填多人版訊息內文(留空表示沿用單人版;選填)
isActive選填是否啟用(停用後不出現在可選範本中)
回應欄位 · data
idcurl -X POST https://your-tenant.example.com/api/v1/message-templates \
-H "Authorization: Bearer $CAIRN_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"stage": "<stage>",
"channel": "<channel>",
"title": "<title>",
"bodySingle": "<bodySingle>"
}'{
"ok": true,
"data": {
"id": "…"
}
}single canned message template detail.
/api/v1/message-templates/{id}參數
id路徑訊息範本 ID
回應欄位 · data
idkeystagechanneltitlebodySinglebodyMultiisActivecreatedAtupdatedAtcurl -X GET https://your-tenant.example.com/api/v1/message-templates/<id> \ -H "Authorization: Bearer $CAIRN_TOKEN"
{
"ok": true,
"data": {
"id": "…",
"key": "…",
"stage": "受理",
"channel": "email",
"title": "…",
"bodySingle": "…",
"bodyMulti": "…",
"isActive": true,
"createdAt": "2026-06-30T08:00:00.000Z",
"updatedAt": "2026-06-30T08:00:00.000Z"
}
}/api/v1/message-templates/{id}參數
id路徑要更新的訊息範本 ID
key選填範本識別碼,2–64 碼大寫英數 / _ / -(用於程式化引用,選填,自動轉大寫)
stage必填訊息對應的 SOP 階段
channel必填發送管道(line 或 email)
title必填範本標題(供後台辨識)
bodySingle必填單人版訊息內文
bodyMulti選填多人版訊息內文(留空表示沿用單人版;選填)
isActive選填是否啟用(停用後不出現在可選範本中)
回應欄位 · data
okcurl -X PATCH https://your-tenant.example.com/api/v1/message-templates/<id> \
-H "Authorization: Bearer $CAIRN_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"stage": "<stage>",
"channel": "<channel>",
"title": "<title>",
"bodySingle": "<bodySingle>"
}'{
"ok": true,
"data": {
"ok": true
}
}/api/v1/message-templates/{id}參數
id路徑訊息範本 ID
回應欄位 · data
okcurl -X DELETE https://your-tenant.example.com/api/v1/message-templates/<id> \ -H "Authorization: Bearer $CAIRN_TOKEN"
{
"ok": true,
"data": {
"ok": true
}
}enable / disable
/api/v1/message-templates/{id}/active參數
id路徑要啟用 / 停用的訊息範本 ID
isActive必填true 啟用、false 停用(軟刪除)此範本
回應欄位 · data
okcurl -X POST https://your-tenant.example.com/api/v1/message-templates/<id>/active \
-H "Authorization: Bearer $CAIRN_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"isActive": true
}'{
"ok": true,
"data": {
"ok": true
}
}/orders
list/search/filter orders
/api/v1/orders參數
status選填依訂單顯示狀態篩選(如 pending、paid、cancelled)
assignment選填依派發狀態篩選(如 unassigned、assigned)
rooming選填依分房狀態篩選
dateFrom選填出發日期區間起(格式 YYYY-MM-DD,含當日)
dateTo選填出發日期區間迄(格式 YYYY-MM-DD,含當日)
q選填關鍵字搜尋(訂單編號、訂購人姓名或 Email 等)
agencyId選填依合作旅行社 ID 篩選(同業單)
page選填頁碼,從 1 起算,預設第 1 頁
pageSize選填每頁筆數,上限 200
回應欄位 · data
rowsidorderNumberbookingStatepaymentStaterefundStategrossReceivableTwdcollectedTwdcustomerCashAppliedTwdoutstandingTwdpartySizecreatedAtnotesuserIduserNameuserEmailprimaryTravelerNameprimaryTravelerPhonetripIdtripTitletripSlugdepartureIddepartureDatereturnDateassignedToUserIdassigneeNameassignmentStatusassignedAtassignedByUserIdcreatedByUserIdpendingConsentroomingStatuslotteryStatefailoverFromOrderIdtotalpagepageSizecurl -X GET https://your-tenant.example.com/api/v1/orders \ -H "Authorization: Bearer $CAIRN_TOKEN"
{
"ok": true,
"data": {
"rows": [
{
"id": "…",
"orderNumber": "…",
"bookingState": "…",
"paymentState": "…",
"refundState": "…",
"grossReceivableTwd": 0,
"collectedTwd": 0,
"customerCashAppliedTwd": 0,
"outstandingTwd": 0,
"partySize": 0,
"createdAt": "2026-06-30T08:00:00.000Z",
"notes": "…",
"userId": "…",
"userName": "…",
"userEmail": "…",
"primaryTravelerName": "…",
"primaryTravelerPhone": "…",
"tripId": "…",
"tripTitle": "…",
"tripSlug": "…",
"departureId": "…",
"departureDate": "…",
"returnDate": "…",
"assignedToUserId": "…",
"assigneeName": "…",
"assignmentStatus": "…",
"assignedAt": null,
"assignedByUserId": "…",
"createdByUserId": "…",
"pendingConsent": true,
"roomingStatus": "…",
"lotteryState": "…",
"failoverFromOrderId": "…"
}
],
"total": 0,
"page": 0,
"pageSize": 0
}
}/api/v1/orders參數
tripId必填行程 ID
departureId必填梯次 ID,決定佔位的出發團
primaryEmail必填訂購人 Email,須對應已註冊會員
partySize必填報名人數,決定佔位數,須為 1 至 20 之間整數
travelers必填旅客名單,筆數須與報名人數一致
paymentMethod必填cashatmmanual收款方式:cash 現金、atm 轉帳、manual 人工
customerType選填directagency客戶類型:direct 直客、agency 同業,預設直客
paymentPlan選填fulldeposit付款方案:full 全額、deposit 訂金,預設全額
receivingAccountId選填收款帳戶 ID,指定本筆款項入帳的帳戶
notes選填訂單備註
回應欄位 · data
orderIdorderNumbercurl -X POST https://your-tenant.example.com/api/v1/orders \
-H "Authorization: Bearer $CAIRN_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"tripId": "<tripId>",
"departureId": "<departureId>",
"primaryEmail": "<primaryEmail>",
"partySize": 0,
"travelers": [],
"paymentMethod": "cash"
}'{
"ok": true,
"data": {
"orderId": "…",
"orderNumber": "…"
}
}full kind-aware order detail
/api/v1/orders/{id}參數
id路徑訂單 ID
回應欄位 · data
idorderNumberbookingStatepaymentStaterefundStategrossReceivableTwdcollectedTwdcustomerCashAppliedTwdoutstandingTwdpartySizecreatedAtnotesuserIduserNameuserEmailprimaryTravelerNameprimaryTravelerPhonetripIdtripTitletripSlugdepartureIddepartureDatereturnDateassignedToUserIdassigneeNameassignmentStatusassignedAtassignedByUserIdcreatedByUserIdpendingConsentroomingStatuslotteryStatefailoverFromOrderIdkindlodgingtravelersidfullNameidNumberMaskpassportNoMaskbirthDatephoneemailemergencyContactNameemergencyContactPhoneisPrimarygenderroomPreferenceroommatePrefaddressroomLabelchargeLinesidtypeamountTwddescriptionsourceTypereversesChargeLineIdcreatedAttransactionsiddirectiontypeamountTwdfeeTwdnetTwdproviderproviderTradeNorefundIdoccurredAtschedulesidpurposetargetAmountTwdstatusdueAtsequenceintentsidpurposeamountTwdstatusscheduleIdattemptProviderattemptMethodattemptStatusbankCodevirtualAccountpayExpireAtcurl -X GET https://your-tenant.example.com/api/v1/orders/<id> \ -H "Authorization: Bearer $CAIRN_TOKEN"
{
"ok": true,
"data": {
"id": "…",
"orderNumber": "…",
"bookingState": "…",
"paymentState": "…",
"refundState": "…",
"grossReceivableTwd": 0,
"collectedTwd": 0,
"customerCashAppliedTwd": 0,
"outstandingTwd": 0,
"partySize": 0,
"createdAt": "2026-06-30T08:00:00.000Z",
"notes": "…",
"userId": "…",
"userName": "…",
"userEmail": "…",
"primaryTravelerName": "…",
"primaryTravelerPhone": "…",
"tripId": "…",
"tripTitle": "…",
"tripSlug": "…",
"departureId": "…",
"departureDate": "…",
"returnDate": "…",
"assignedToUserId": "…",
"assigneeName": "…",
"assignmentStatus": "…",
"assignedAt": null,
"assignedByUserId": "…",
"createdByUserId": "…",
"pendingConsent": true,
"roomingStatus": "…",
"lotteryState": "…",
"failoverFromOrderId": "…",
"kind": "lodging",
"lodging": null,
"travelers": [
{
"id": "…",
"fullName": "…",
"idNumberMask": "…",
"passportNoMask": "…",
"birthDate": "…",
"phone": "…",
"email": "…",
"emergencyContactName": "…",
"emergencyContactPhone": "…",
"isPrimary": true,
"gender": "…",
"roomPreference": "…",
"roommatePref": "…",
"address": "…",
"roomLabel": "…"
}
],
"chargeLines": [
{
"id": "…",
"type": "…",
"amountTwd": 0,
"description": "…",
"sourceType": "…",
"reversesChargeLineId": "…",
"createdAt": "2026-06-30T08:00:00.000Z"
}
],
"transactions": [
{
"id": "…",
"direction": "…",
"type": "…",
"amountTwd": 0,
"feeTwd": 0,
"netTwd": 0,
"provider": "…",
"providerTradeNo": "…",
"refundId": "…",
"occurredAt": "2026-06-30T08:00:00.000Z"
}
],
"schedules": [
{
"id": "…",
"purpose": "…",
"targetAmountTwd": 0,
"status": "…",
"dueAt": null,
"sequence": 0
}
],
"intents": [
{
"id": "…",
"purpose": "…",
"amountTwd": 0,
"status": "…",
"scheduleId": "…",
"attemptProvider": "…",
"attemptMethod": "…",
"attemptStatus": "…",
"bankCode": "…",
"virtualAccount": "…",
"payExpireAt": null
}
]
}
}manual charge adjustment
/api/v1/orders/{id}/adjust參數
id路徑訂單 ID
kind必填surchargeallowance調整類型:surcharge 加收、allowance 減免
amountTwd必填調整金額(新台幣,正整數)
description必填調整事由說明
回應欄位 · data
okcurl -X POST https://your-tenant.example.com/api/v1/orders/<id>/adjust \
-H "Authorization: Bearer $CAIRN_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"kind": "surcharge",
"amountTwd": 0,
"description": "<description>"
}'{
"ok": true,
"data": {
"ok": true
}
}首次派發訂單給承辦業務
/api/v1/orders/{id}/assign參數
id路徑訂單 ID
assigneeUserId必填受派業務的使用者 ID
reason選填派發事由說明(上限 500 字)
回應欄位 · data
okidempotentcurl -X POST https://your-tenant.example.com/api/v1/orders/<id>/assign \
-H "Authorization: Bearer $CAIRN_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"assigneeUserId": "<assigneeUserId>"
}'{
"ok": true,
"data": {
"ok": true,
"idempotent": true
}
}產生/重用尾款
/api/v1/orders/{id}/balance-link參數
id路徑訂單 ID
回應欄位 · data
okamountTwdscheduleIdcurl -X POST https://your-tenant.example.com/api/v1/orders/<id>/balance-link \ -H "Authorization: Bearer $CAIRN_TOKEN"
{
"ok": true,
"data": {
"ok": true,
"amountTwd": 0,
"scheduleId": "…"
}
}cancel a tour order
/api/v1/orders/{id}/cancel參數
id路徑訂單 ID
reason選填取消事由說明
回應欄位 · data
okcurl -X POST https://your-tenant.example.com/api/v1/orders/<id>/cancel \
-H "Authorization: Bearer $CAIRN_TOKEN" \
-H "Content-Type: application/json" \
-d '{
}'{
"ok": true,
"data": {
"ok": true
}
}線控手動抽籤裁決:won
/api/v1/orders/{id}/lottery/resolve參數
id路徑訂單 ID
outcome必填wonlost抽籤裁決結果:won 中籤確認、lost 未中籤(啟動備案或取消)
回應欄位 · data
okoutcomecurl -X POST https://your-tenant.example.com/api/v1/orders/<id>/lottery/resolve \
-H "Authorization: Bearer $CAIRN_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"outcome": "won"
}'{
"ok": true,
"data": {
"ok": true,
"outcome": "won"
}
}mark an order paid by manual
/api/v1/orders/{id}/mark-paid參數
id路徑訂單 ID
note選填對帳備註,記錄人工核款說明
receivingAccountId選填收款帳戶 ID,指定本筆款項入帳的帳戶
回應欄位 · data
idempotentcurl -X POST https://your-tenant.example.com/api/v1/orders/<id>/mark-paid \
-H "Authorization: Bearer $CAIRN_TOKEN" \
-H "Content-Type: application/json" \
-d '{
}'{
"ok": true,
"data": {
"idempotent": true
}
}重新指派已派發訂單
/api/v1/orders/{id}/reassign參數
id路徑訂單 ID
assigneeUserId必填重新指派的承接業務使用者 ID
reason選填重派事由說明(上限 500 字)
回應欄位 · data
okidempotentcurl -X POST https://your-tenant.example.com/api/v1/orders/<id>/reassign \
-H "Authorization: Bearer $CAIRN_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"assigneeUserId": "<assigneeUserId>"
}'{
"ok": true,
"data": {
"ok": true,
"idempotent": true
}
}create + submit a customer refund
/api/v1/orders/{id}/refunds參數
id路徑訂單 ID
refundKind必填receivable_reductionoverpayment_return退款種類:receivable_reduction 應收減免、overpayment_return 溢收退還
reason必填退款事由說明
amountTwd必填退款總金額(新台幣,正整數)
executionMethod選填chargebackremit退款執行方式:chargeback 原路退刷、remit 銀行匯款
originAccountId選填出款來源帳戶 ID(匯款退款時指定)
adminFeeTwd選填手續費/行政費(新台幣,非負整數)
remitFeeTwd選填匯款轉帳費(新台幣,非負整數)
payeeAccountName選填受款人戶名(匯款退款時填寫)
payeeBankCode選填受款銀行代碼(匯款退款時填寫)
payeeAccountNumber選填受款銀行帳號(匯款退款時填寫)
lines選填退款明細列;省略時依退款總額處理
回應欄位 · data
idrefundNumberstatuscurl -X POST https://your-tenant.example.com/api/v1/orders/<id>/refunds \
-H "Authorization: Bearer $CAIRN_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"refundKind": "receivable_reduction",
"reason": "<reason>",
"amountTwd": 0
}'{
"ok": true,
"data": {
"id": "…",
"refundNumber": "…",
"status": "…"
}
}approve a submitted
/api/v1/orders/{id}/refunds/{refundId}/approve參數
refundId路徑退款單 ID
回應欄位 · data
okcurl -X POST https://your-tenant.example.com/api/v1/orders/{id}/refunds/<refundId>/approve \
-H "Authorization: Bearer $CAIRN_TOKEN"{
"ok": true,
"data": {
"ok": true
}
}mark an approved
/api/v1/orders/{id}/refunds/{refundId}/mark-paid參數
refundId路徑退款單 ID
bankReference選填出款的銀行交易參考號(匯款憑證)
receivingAccountId選填出款帳戶 ID;remit 退款須指定具匯款能力的帳戶
回應欄位 · data
okcurl -X POST https://your-tenant.example.com/api/v1/orders/{id}/refunds/<refundId>/mark-paid \
-H "Authorization: Bearer $CAIRN_TOKEN" \
-H "Content-Type: application/json" \
-d '{
}'{
"ok": true,
"data": {
"ok": true
}
}reject a submitted
/api/v1/orders/{id}/refunds/{refundId}/reject參數
refundId路徑退款單 ID
reason選填退件事由說明
回應欄位 · data
okcurl -X POST https://your-tenant.example.com/api/v1/orders/{id}/refunds/<refundId>/reject \
-H "Authorization: Bearer $CAIRN_TOKEN" \
-H "Content-Type: application/json" \
-d '{
}'{
"ok": true,
"data": {
"ok": true
}
}reverse an existing charge line
/api/v1/orders/{id}/reverse參數
id路徑訂單 ID
chargeLineId必填欲沖正的應收項目(charge line)ID
description必填沖正事由說明
回應欄位 · data
okcurl -X POST https://your-tenant.example.com/api/v1/orders/<id>/reverse \
-H "Authorization: Bearer $CAIRN_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"chargeLineId": "<chargeLineId>",
"description": "<description>"
}'{
"ok": true,
"data": {
"ok": true
}
}人工核可/駁回登山資格審核
/api/v1/orders/{id}/review-screening參數
id路徑訂單 ID
decision必填approvereject登山資格審核裁決:approve 核可、reject 駁回
note選填審核註記說明(上限 500 字)
回應欄位 · data
okcurl -X POST https://your-tenant.example.com/api/v1/orders/<id>/review-screening \
-H "Authorization: Bearer $CAIRN_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"decision": "approve"
}'{
"ok": true,
"data": {
"ok": true
}
}新增旅客到訂單
/api/v1/orders/{id}/travelers參數
fullName選填旅客全名,須與證件一致;新增旅客時必填,更新時可省略
phone選填旅客聯絡電話
email選填旅客電子郵件
birthDate選填旅客出生日期(格式 YYYY-MM-DD)
emergencyContactName選填緊急聯絡人姓名
emergencyContactPhone選填緊急聯絡人電話
gender選填malefemaleother旅客性別:male 男、female 女、other 其他
roomPreference選填房型偏好(用於分房作業)
roommatePref選填指定同住室友(用於分房作業)
address選填旅客通訊地址
idNumber選填身分證字號,屬個資將加密保存
passportNo選填護照號碼,屬個資將加密保存
id路徑訂單 ID
回應欄位 · data
oktravelerIdcurl -X POST https://your-tenant.example.com/api/v1/orders/<id>/travelers \
-H "Authorization: Bearer $CAIRN_TOKEN" \
-H "Content-Type: application/json" \
-d '{
}'{
"ok": true,
"data": {
"ok": true,
"travelerId": "…"
}
}更新旅客資料
/api/v1/orders/{id}/travelers/{travelerId}參數
fullName選填旅客全名,須與證件一致;新增旅客時必填,更新時可省略
phone選填旅客聯絡電話
email選填旅客電子郵件
birthDate選填旅客出生日期(格式 YYYY-MM-DD)
emergencyContactName選填緊急聯絡人姓名
emergencyContactPhone選填緊急聯絡人電話
gender選填malefemaleother旅客性別:male 男、female 女、other 其他
roomPreference選填房型偏好(用於分房作業)
roommatePref選填指定同住室友(用於分房作業)
address選填旅客通訊地址
idNumber選填身分證字號,屬個資將加密保存
passportNo選填護照號碼,屬個資將加密保存
id路徑訂單 ID
travelerId路徑旅客 ID
回應欄位 · data
okcurl -X PATCH https://your-tenant.example.com/api/v1/orders/<id>/travelers/<travelerId> \
-H "Authorization: Bearer $CAIRN_TOKEN" \
-H "Content-Type: application/json" \
-d '{
}'{
"ok": true,
"data": {
"ok": true
}
}移除旅客
/api/v1/orders/{id}/travelers/{travelerId}參數
id路徑訂單 ID
travelerId路徑旅客 ID
回應欄位 · data
okcurl -X DELETE https://your-tenant.example.com/api/v1/orders/<id>/travelers/<travelerId> \ -H "Authorization: Bearer $CAIRN_TOKEN"
{
"ok": true,
"data": {
"ok": true
}
}顯示旅客證號/護照全碼
/api/v1/orders/{id}/travelers/{travelerId}/reveal參數
id路徑訂單 ID
travelerId路徑旅客 ID
field必填idNumberpassportNo欲顯示全碼的個資欄位:idNumber 身分證字號、passportNo 護照號碼
回應欄位 · data
fieldvaluecurl -X POST https://your-tenant.example.com/api/v1/orders/<id>/travelers/<travelerId>/reveal \
-H "Authorization: Bearer $CAIRN_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"field": "idNumber"
}'{
"ok": true,
"data": {
"field": "idNumber",
"value": "…"
}
}更新旅客分房需求
/api/v1/orders/{id}/travelers/{travelerId}/rooming參數
roomPreference選填房型偏好(用於分房作業)
roommatePref選填指定同住室友(用於分房作業)
id路徑訂單 ID
travelerId路徑旅客 ID
回應欄位 · data
okcurl -X PATCH https://your-tenant.example.com/api/v1/orders/<id>/travelers/<travelerId>/rooming \
-H "Authorization: Bearer $CAIRN_TOKEN" \
-H "Content-Type: application/json" \
-d '{
}'{
"ok": true,
"data": {
"ok": true
}
}批次把多張訂單派給同一位業務
/api/v1/orders/bulk-assign參數
orderIds必填欲批次派發的訂單 ID 陣列(1 至 100 筆)
assigneeUserId必填受派業務的使用者 ID(所有訂單派給同一人)
reason選填派發事由說明(上限 500 字)
回應欄位 · data
okassignedCountskippedCountcurl -X POST https://your-tenant.example.com/api/v1/orders/bulk-assign \
-H "Authorization: Bearer $CAIRN_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"orderIds": [],
"assigneeUserId": "<assigneeUserId>"
}'{
"ok": true,
"data": {
"ok": true,
"assignedCount": 0,
"skippedCount": 0
}
}匯出訂單
/api/v1/orders/export參數
status選填依訂單顯示狀態篩選(如 pending、paid、cancelled)
assignment選填依派發狀態篩選(如 unassigned、assigned)
rooming選填依分房狀態篩選
dateFrom選填出發日期區間起(格式 YYYY-MM-DD,含當日)
dateTo選填出發日期區間迄(格式 YYYY-MM-DD,含當日)
q選填關鍵字搜尋(訂單編號、訂購人姓名或 Email 等)
agencyId選填依合作旅行社 ID 篩選(同業單)
回應欄位 · data
rowsidorderNumberbookingStatepaymentStaterefundStategrossReceivableTwdcollectedTwdcustomerCashAppliedTwdoutstandingTwdpartySizecreatedAtnotesuserIduserNameuserEmailprimaryTravelerNameprimaryTravelerPhonetripIdtripTitletripSlugdepartureIddepartureDatereturnDateassignedToUserIdassigneeNameassignmentStatusassignedAtassignedByUserIdcreatedByUserIdpendingConsentroomingStatuslotteryStatefailoverFromOrderIdtotaltruncatedcurl -X GET https://your-tenant.example.com/api/v1/orders/export \ -H "Authorization: Bearer $CAIRN_TOKEN"
{
"ok": true,
"data": {
"rows": [
{
"id": "…",
"orderNumber": "…",
"bookingState": "…",
"paymentState": "…",
"refundState": "…",
"grossReceivableTwd": 0,
"collectedTwd": 0,
"customerCashAppliedTwd": 0,
"outstandingTwd": 0,
"partySize": 0,
"createdAt": "2026-06-30T08:00:00.000Z",
"notes": "…",
"userId": "…",
"userName": "…",
"userEmail": "…",
"primaryTravelerName": "…",
"primaryTravelerPhone": "…",
"tripId": "…",
"tripTitle": "…",
"tripSlug": "…",
"departureId": "…",
"departureDate": "…",
"returnDate": "…",
"assignedToUserId": "…",
"assigneeName": "…",
"assignmentStatus": "…",
"assignedAt": null,
"assignedByUserId": "…",
"createdByUserId": "…",
"pendingConsent": true,
"roomingStatus": "…",
"lotteryState": "…",
"failoverFromOrderId": "…"
}
],
"total": 0,
"truncated": true
}
}order KPI counts
/api/v1/orders/stats回應欄位 · data
pendingPaymentdepositPaidpaidcancelledrefundedcompletedthisMonthPaidTwdcurl -X GET https://your-tenant.example.com/api/v1/orders/stats \ -H "Authorization: Bearer $CAIRN_TOKEN"
{
"ok": true,
"data": {
"pendingPayment": 0,
"depositPaid": 0,
"paid": 0,
"cancelled": 0,
"refunded": 0,
"completed": 0,
"thisMonthPaidTwd": 0
}
}/payment-requests
list/search/filter 對外應付
/api/v1/payment-requests參數
status選填draftsubmittedapprovedpaidrejectedcancelledall依狀態篩選(draft 草稿 / submitted 已送審 / approved 已核准 / paid 已付款 / rejected 已退件 / cancelled 已取消 / all 全部)
payeeType選填supplierguidestaff_commissionotherall依收款對象類型篩選(supplier 供應商 / guide 領隊嚮導 / staff_commission 員工獎金 / other 其他 / all 全部)
departureId選填依關聯梯次 id 篩選
createdByUserId選填依建單人 user id 篩選
q選填關鍵字搜尋(請款單號、收款對象名稱等)
page選填頁碼(從 1 起算)
pageSize選填每頁筆數(上限 200)
回應欄位 · data
rowsidrequestNumberstatuspayeeTypepayeeNameamountTwdnetAmountTwdtaxAmountTwddepartureIddepartureLabeldescriptioncreatedAtupdatedAtcreatedByUserIdcreatedByNamepaidAtsubmittedAtapprovedAttotalpagepageSizecurl -X GET https://your-tenant.example.com/api/v1/payment-requests \ -H "Authorization: Bearer $CAIRN_TOKEN"
{
"ok": true,
"data": {
"rows": [
{
"id": "…",
"requestNumber": "…",
"status": "…",
"payeeType": "…",
"payeeName": "…",
"amountTwd": 0,
"netAmountTwd": 0,
"taxAmountTwd": 0,
"departureId": "…",
"departureLabel": "…",
"description": "…",
"createdAt": "2026-06-30T08:00:00.000Z",
"updatedAt": "2026-06-30T08:00:00.000Z",
"createdByUserId": "…",
"createdByName": "…",
"paidAt": null,
"submittedAt": null,
"approvedAt": null
}
],
"total": 0,
"page": 0,
"pageSize": 0
}
}/api/v1/payment-requests參數
payeeType必填supplierguidestaff_commissionother收款對象類型(supplier 供應商 / guide 領隊嚮導 / staff_commission 員工獎金 / other 其他)
payeeName必填收款對象名稱
payeeBankAccount選填收款銀行帳號
payeeBankName選填收款銀行名稱
payeeBankBranch選填收款銀行分行
payeeTaxId選填收款對象統一編號 / 稅籍編號
departureId選填關聯梯次 id(將此請款歸屬至特定出團)
description必填請款單摘要說明
taxAmountTwd選填稅額(TWD),未填視為 0
items必填請款細項陣列(至少一筆)
submitImmediately選填是否建立後立即送審(true 則同交易送出,跳過草稿)
回應欄位 · data
idrequestNumberstatuscurl -X POST https://your-tenant.example.com/api/v1/payment-requests \
-H "Authorization: Bearer $CAIRN_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"payeeType": "supplier",
"payeeName": "<payeeName>",
"description": "<description>",
"items": []
}'{
"ok": true,
"data": {
"id": "…",
"requestNumber": "…",
"status": "…"
}
}單一對外應付請款單完整明細
/api/v1/payment-requests/{id}參數
id路徑請款單 id(路徑參數)
回應欄位 · data
payeeBankAccountpayeeBankNamepayeeBankBranchpayeeTaxIdsubmittedByUserIdsubmittedByNameapprovedByUserIdapprovedByNamepaidByUserIdpaidByNamerejectedAtrejectedByNamerejectionReasoncancelledAtcancelledByNamecancellationReasonpdfGeneratedAtpaperPrintedAtpaperSignedBybankReferenceitemsidcategorydescriptionquantityunitPriceTwdtotalTwdnotessortOrderauditidactioncreatedAtactorUserIdactorNamemetadataipAddressidrequestNumberstatuspayeeTypepayeeNameamountTwdnetAmountTwdtaxAmountTwddepartureIddepartureLabeldescriptioncreatedAtupdatedAtcreatedByUserIdcreatedByNamepaidAtsubmittedAtapprovedAtcurl -X GET https://your-tenant.example.com/api/v1/payment-requests/<id> \ -H "Authorization: Bearer $CAIRN_TOKEN"
{
"ok": true,
"data": {
"payeeBankAccount": "…",
"payeeBankName": "…",
"payeeBankBranch": "…",
"payeeTaxId": "…",
"submittedByUserId": "…",
"submittedByName": "…",
"approvedByUserId": "…",
"approvedByName": "…",
"paidByUserId": "…",
"paidByName": "…",
"rejectedAt": null,
"rejectedByName": "…",
"rejectionReason": "…",
"cancelledAt": null,
"cancelledByName": "…",
"cancellationReason": "…",
"pdfGeneratedAt": null,
"paperPrintedAt": null,
"paperSignedBy": "…",
"bankReference": "…",
"items": [
{
"id": "…",
"category": "…",
"description": "…",
"quantity": 0,
"unitPriceTwd": 0,
"totalTwd": 0,
"notes": "…",
"sortOrder": 0
}
],
"audit": [
{
"id": "…",
"action": "…",
"createdAt": "2026-06-30T08:00:00.000Z",
"actorUserId": "…",
"actorName": "…",
"metadata": "…",
"ipAddress": "…"
}
],
"id": "…",
"requestNumber": "…",
"status": "…",
"payeeType": "…",
"payeeName": "…",
"amountTwd": 0,
"netAmountTwd": 0,
"taxAmountTwd": 0,
"departureId": "…",
"departureLabel": "…",
"description": "…",
"createdAt": "2026-06-30T08:00:00.000Z",
"updatedAt": "2026-06-30T08:00:00.000Z",
"createdByUserId": "…",
"createdByName": "…",
"paidAt": null,
"submittedAt": null,
"approvedAt": null
}
}核可請款單
/api/v1/payment-requests/{id}/approve參數
id路徑請款單 id(路徑參數)
回應欄位 · data
okcurl -X POST https://your-tenant.example.com/api/v1/payment-requests/<id>/approve \ -H "Authorization: Bearer $CAIRN_TOKEN"
{
"ok": true,
"data": {
"ok": true
}
}取消請款單
/api/v1/payment-requests/{id}/cancel參數
id路徑請款單 id(路徑參數)
reason選填取消原因;留空預設為「使用者取消」(上限 200 字)
回應欄位 · data
okcurl -X POST https://your-tenant.example.com/api/v1/payment-requests/<id>/cancel \
-H "Authorization: Bearer $CAIRN_TOKEN" \
-H "Content-Type: application/json" \
-d '{
}'{
"ok": true,
"data": {
"ok": true
}
}標記請款單已付
/api/v1/payment-requests/{id}/mark-paid參數
id路徑請款單 id(路徑參數)
bankReference必填網銀交易序號 / 轉帳憑證號(必填)
paperSignedBy選填紙本簽核人姓名
receivingAccountId選填出款帳戶 id(從哪個收款帳戶付出)
回應欄位 · data
okcurl -X POST https://your-tenant.example.com/api/v1/payment-requests/<id>/mark-paid \
-H "Authorization: Bearer $CAIRN_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"bankReference": "<bankReference>"
}'{
"ok": true,
"data": {
"ok": true
}
}標記 PDF/紙本已產生
/api/v1/payment-requests/{id}/mark-printed參數
id路徑請款單 id(路徑參數)
回應欄位 · data
okcurl -X POST https://your-tenant.example.com/api/v1/payment-requests/<id>/mark-printed \ -H "Authorization: Bearer $CAIRN_TOKEN"
{
"ok": true,
"data": {
"ok": true
}
}記錄紙本簽核人
/api/v1/payment-requests/{id}/mark-signed參數
id路徑請款單 id(路徑參數)
signedBy必填紙本簽核人姓名(必填)
回應欄位 · data
okcurl -X POST https://your-tenant.example.com/api/v1/payment-requests/<id>/mark-signed \
-H "Authorization: Bearer $CAIRN_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"signedBy": "<signedBy>"
}'{
"ok": true,
"data": {
"ok": true
}
}退件請款單
/api/v1/payment-requests/{id}/reject參數
id路徑請款單 id(路徑參數)
reason必填退件原因(必填,回饋給建單人)
回應欄位 · data
okcurl -X POST https://your-tenant.example.com/api/v1/payment-requests/<id>/reject \
-H "Authorization: Bearer $CAIRN_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"reason": "<reason>"
}'{
"ok": true,
"data": {
"ok": true
}
}送審請款單
/api/v1/payment-requests/{id}/submit參數
id路徑請款單 id(路徑參數)
回應欄位 · data
okcurl -X POST https://your-tenant.example.com/api/v1/payment-requests/<id>/submit \ -H "Authorization: Bearer $CAIRN_TOKEN"
{
"ok": true,
"data": {
"ok": true
}
}對外應付請款單 KPI 計數
/api/v1/payment-requests/stats回應欄位 · data
draftCountsubmittedCountapprovedCountpaidCountthisMonthPaidCountthisMonthAmounttotalApprovedAmountcurl -X GET https://your-tenant.example.com/api/v1/payment-requests/stats \ -H "Authorization: Bearer $CAIRN_TOKEN"
{
"ok": true,
"data": {
"draftCount": 0,
"submittedCount": 0,
"approvedCount": 0,
"paidCount": 0,
"thisMonthPaidCount": 0,
"thisMonthAmount": 0,
"totalApprovedAmount": 0
}
}由某梯次的
/api/v1/payment-requests/supplier-suggestions參數
departureId必填梯次 id;用於推導該梯次住宿供應商的請款細項建議
回應欄位 · data[]
categorydescriptionquantityunitPriceTwdtotalTwdsuggestedPayeecurl -X GET "https://your-tenant.example.com/api/v1/payment-requests/supplier-suggestions?departureId=<departureId>" \ -H "Authorization: Bearer $CAIRN_TOKEN"
{
"ok": true,
"data": [
{
"category": "…",
"description": "…",
"quantity": 0,
"unitPriceTwd": 0,
"totalTwd": 0,
"suggestedPayee": "…"
}
]
}/payments
list/search/filter the customer→agency payment ledger
/api/v1/payments參數
status選填依金流狀態篩選(如 paid 已收款 / pending 待付 / failed 失敗 / refunded 已退款)
method選填依付款方式篩選(如信用卡、ATM 轉帳)
dateFrom選填收款日期區間起日(YYYY-MM-DD)
dateTo選填收款日期區間迄日(YYYY-MM-DD)
q選填關鍵字搜尋(訂單編號、客戶名稱等)
page選填頁碼(從 1 起算)
pageSize選填每頁筆數(上限 200)
回應欄位 · data
rowsidorderIdorderNumbermerchantTradeNoproviderTradeNoproviderpaymentMethodamountTwdstatusrefundedpaidAtcreatedAtcustomerNamecustomerEmailtripTitletotalpagepageSizecurl -X GET https://your-tenant.example.com/api/v1/payments \ -H "Authorization: Bearer $CAIRN_TOKEN"
{
"ok": true,
"data": {
"rows": [
{
"id": "…",
"orderId": "…",
"orderNumber": "…",
"merchantTradeNo": "…",
"providerTradeNo": "…",
"provider": "…",
"paymentMethod": "…",
"amountTwd": 0,
"status": "…",
"refunded": true,
"paidAt": null,
"createdAt": "2026-06-30T08:00:00.000Z",
"customerName": "…",
"customerEmail": "…",
"tripTitle": "…"
}
],
"total": 0,
"page": 0,
"pageSize": 0
}
}匯出金流分類帳
/api/v1/payments/export參數
status選填依金流狀態篩選(如 paid 已收款 / pending 待付 / failed 失敗 / refunded 已退款)
method選填依付款方式篩選(如信用卡、ATM 轉帳)
dateFrom選填收款日期區間起日(YYYY-MM-DD)
dateTo選填收款日期區間迄日(YYYY-MM-DD)
q選填關鍵字搜尋(訂單編號、客戶名稱等)
回應欄位 · data
rowsidorderIdorderNumbermerchantTradeNoproviderTradeNoproviderpaymentMethodamountTwdstatusrefundedpaidAtcreatedAtcustomerNamecustomerEmailtripTitletotaltruncatedcurl -X GET https://your-tenant.example.com/api/v1/payments/export \ -H "Authorization: Bearer $CAIRN_TOKEN"
{
"ok": true,
"data": {
"rows": [
{
"id": "…",
"orderId": "…",
"orderNumber": "…",
"merchantTradeNo": "…",
"providerTradeNo": "…",
"provider": "…",
"paymentMethod": "…",
"amountTwd": 0,
"status": "…",
"refunded": true,
"paidAt": null,
"createdAt": "2026-06-30T08:00:00.000Z",
"customerName": "…",
"customerEmail": "…",
"tripTitle": "…"
}
],
"total": 0,
"truncated": true
}
}payment KPI counts
/api/v1/payments/stats回應欄位 · data
totalAmountpaidCountpendingCountfailedCountrefundedCountthisMonthAmountcurl -X GET https://your-tenant.example.com/api/v1/payments/stats \ -H "Authorization: Bearer $CAIRN_TOKEN"
{
"ok": true,
"data": {
"totalAmount": 0,
"paidCount": 0,
"pendingCount": 0,
"failedCount": 0,
"refundedCount": 0,
"thisMonthAmount": 0
}
}/payouts
派生當月
/api/v1/payouts/aggregate參數
period必填出款月份(YYYY-MM),彙整該月已核准未付的應付
scope必填guidesupplierstaff收款對象範圍(guide 領隊嚮導 / supplier 供應商 / staff 員工)
回應欄位 · data[]
payeeTypepayeeRefIdpayeeNamepayeeAccountNamepayeeBankCodepayeeAccountNumbergrossTwditemspayableIdpayableNumberdatetripLabelamountTwdcurl -X GET "https://your-tenant.example.com/api/v1/payouts/aggregate?period=<period>&scope=<scope>" \ -H "Authorization: Bearer $CAIRN_TOKEN"
{
"ok": true,
"data": [
{
"payeeType": "…",
"payeeRefId": "…",
"payeeName": "…",
"payeeAccountName": "…",
"payeeBankCode": "…",
"payeeAccountNumber": "…",
"grossTwd": 0,
"items": [
{
"payableId": "…",
"payableNumber": "…",
"date": "…",
"tripLabel": "…",
"amountTwd": 0
}
]
}
]
}建立出款批次草稿
/api/v1/payouts/batches參數
period必填出款月份(YYYY-MM)
payeeScope必填收款對象範圍(guide 領隊嚮導 / supplier 供應商 / staff 員工)
paidFromAccountId選填出帳帳戶 id(從哪個收款帳戶付出);可留空待確認時指定
lines必填納入批次的出款列(至少一列)
回應欄位 · data
idcurl -X POST https://your-tenant.example.com/api/v1/payouts/batches \
-H "Authorization: Bearer $CAIRN_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"period": "<period>",
"payeeScope": "<payeeScope>",
"lines": []
}'{
"ok": true,
"data": {
"id": "…"
}
}確認出款批次
/api/v1/payouts/batches/{id}/confirm參數
id路徑出款批次 id(路徑參數,格式 pob_…)
bankReference選填網銀交易序號 / 轉帳憑證號(可選)
回應欄位 · data
okcurl -X POST https://your-tenant.example.com/api/v1/payouts/batches/<id>/confirm \
-H "Authorization: Bearer $CAIRN_TOKEN" \
-H "Content-Type: application/json" \
-d '{
}'{
"ok": true,
"data": {
"ok": true
}
}出款批次的標準四欄批次轉帳檔
/api/v1/payouts/batches/{id}/transfer-file參數
id路徑出款批次 id(路徑參數)
format選填csvjson輸出格式:json 完整匯出(預設)或 csv 僅回傳轉帳檔字串
curl -X GET https://your-tenant.example.com/api/v1/payouts/batches/<id>/transfer-file \ -H "Authorization: Bearer $CAIRN_TOKEN"
{
"ok": true,
"data": "…"
}為某出款批次列簽發廠商自助確認
/api/v1/payouts/lines/{lineId}/confirm-token參數
lineId路徑出款批次列 id(路徑參數,格式 pobl_…)
回應欄位 · data
tokencurl -X POST https://your-tenant.example.com/api/v1/payouts/lines/<lineId>/confirm-token \ -H "Authorization: Bearer $CAIRN_TOKEN"
{
"ok": true,
"data": {
"token": "…"
}
}出款批次的「出帳帳戶」選項
/api/v1/payouts/remit-accounts回應欄位 · data[]
idcodedisplayNamekindbankNameaccountNocanReceivecanRemitcanChargebackisDeprecatedisSettlementMastercurrencyisActivedisplayOrderusedCountcreatedAtupdatedAtcurl -X GET https://your-tenant.example.com/api/v1/payouts/remit-accounts \ -H "Authorization: Bearer $CAIRN_TOKEN"
{
"ok": true,
"data": [
{
"id": "…",
"code": "…",
"displayName": "…",
"kind": "…",
"bankName": "…",
"accountNo": "…",
"canReceive": true,
"canRemit": true,
"canChargeback": true,
"isDeprecated": true,
"isSettlementMaster": true,
"currency": "…",
"isActive": true,
"displayOrder": 0,
"usedCount": 0,
"createdAt": "2026-06-30T08:00:00.000Z",
"updatedAt": "2026-06-30T08:00:00.000Z"
}
]
}/pnl
list the company expense-category
/api/v1/pnl/expense-categories參數
activeOnly選填是否只回傳啟用中的費用類別;預設含停用列
回應欄位 · data[]
idcodedisplayNamekindisActivecreatedAtupdatedAtcurl -X GET https://your-tenant.example.com/api/v1/pnl/expense-categories \ -H "Authorization: Bearer $CAIRN_TOKEN"
{
"ok": true,
"data": [
{
"id": "…",
"code": "…",
"displayName": "…",
"kind": "opex",
"isActive": true,
"createdAt": "2026-06-30T08:00:00.000Z",
"updatedAt": "2026-06-30T08:00:00.000Z"
}
]
}list company operating-expense ledger rows
/api/v1/pnl/expenses參數
period選填歸屬月(格式 YYYY-MM);只列出該月的費用
category選填費用類別 ID;只列出該類別的費用
kind選填opextaxplatform_feespecial費用大類:opex 營業費用、tax 稅、platform_fee 平台手續費、special 特殊損益
回應欄位 · data[]
idcategoryIdcategoryCodecategoryDisplayNamecategoryKindperiodincurredOnamountTwddescriptionpaidFromAccountIdpaidFromAccountNamefrontedByUserIdfrontedByNamepayableIdpayableNumberrecurringnotecreatedByUserIdcreatedAtupdatedAtcurl -X GET https://your-tenant.example.com/api/v1/pnl/expenses \ -H "Authorization: Bearer $CAIRN_TOKEN"
{
"ok": true,
"data": [
{
"id": "…",
"categoryId": "…",
"categoryCode": "…",
"categoryDisplayName": "…",
"categoryKind": "…",
"period": "…",
"incurredOn": "…",
"amountTwd": 0,
"description": "…",
"paidFromAccountId": "…",
"paidFromAccountName": "…",
"frontedByUserId": "…",
"frontedByName": "…",
"payableId": "…",
"payableNumber": "…",
"recurring": true,
"note": "…",
"createdByUserId": "…",
"createdAt": "2026-06-30T08:00:00.000Z",
"updatedAt": "2026-06-30T08:00:00.000Z"
}
]
}/api/v1/pnl/expenses參數
categoryId必填費用類別 ID(對應公司費用類別目錄)
period必填歸屬月(格式 YYYY-MM),供月損益表彙整
description必填費用摘要
amountTwd必填費用金額(台幣非負整數)
incurredOn選填費用發生日期(格式 YYYY-MM-DD)
paidFromAccountId選填支付來源帳戶 ID
frontedByUserId選填代墊人使用者 ID(由員工先行墊付時填寫)
note選填備註
recurring選填是否為週期性費用
回應欄位 · data
okidcurl -X POST https://your-tenant.example.com/api/v1/pnl/expenses \
-H "Authorization: Bearer $CAIRN_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"categoryId": "<categoryId>",
"period": "<period>",
"description": "<description>",
"amountTwd": 0
}'{
"ok": true,
"data": {
"ok": true,
"id": "…"
}
}更正一筆公司營業費用
/api/v1/pnl/expenses/{id}參數
categoryId必填費用類別 ID(對應公司費用類別目錄)
period必填歸屬月(格式 YYYY-MM),供月損益表彙整
description必填費用摘要
amountTwd必填費用金額(台幣非負整數)
incurredOn選填費用發生日期(格式 YYYY-MM-DD)
paidFromAccountId選填支付來源帳戶 ID
frontedByUserId選填代墊人使用者 ID(由員工先行墊付時填寫)
note選填備註
recurring選填是否為週期性費用
id路徑營業費用列 ID
payableId選填關聯的請款核簽 ID;整列覆寫時須原樣帶回,省略則清為 null
回應欄位 · data
okcurl -X PATCH https://your-tenant.example.com/api/v1/pnl/expenses/<id> \
-H "Authorization: Bearer $CAIRN_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"categoryId": "<categoryId>",
"period": "<period>",
"description": "<description>",
"amountTwd": 0
}'{
"ok": true,
"data": {
"ok": true
}
}the company monthly P&L statement
/api/v1/pnl/statement參數
period必填損益表結算月(格式 YYYY-MM)
extraIncome選填額外收入(台幣非負整數),併入公司淨利計算;預設 0
回應欄位 · data
periodregionsregionlabelrevenueTwddirectCostTwdmarginTwddeparturesgrossMarginTwdrevenueTotalTwdextraIncomeTwdadminFeeIncomeTwdotherIncomeTwdexpensesByKindkindamountTwdcountoperatingExpenseTotalTwdspecialidcategoryIdcategoryDisplayNamedescriptionamountTwdspecialTotalTwdnetProfitTwdnetMarginPctcurl -X GET "https://your-tenant.example.com/api/v1/pnl/statement?period=<period>" \ -H "Authorization: Bearer $CAIRN_TOKEN"
{
"ok": true,
"data": {
"period": "…",
"regions": [
{
"region": "…",
"label": "…",
"revenueTwd": 0,
"directCostTwd": 0,
"marginTwd": 0,
"departures": 0
}
],
"grossMarginTwd": 0,
"revenueTotalTwd": 0,
"extraIncomeTwd": 0,
"adminFeeIncomeTwd": 0,
"otherIncomeTwd": 0,
"expensesByKind": [
{
"kind": "…",
"amountTwd": 0,
"count": 0
}
],
"operatingExpenseTotalTwd": 0,
"special": [
{
"id": "…",
"categoryId": "…",
"categoryDisplayName": "…",
"description": "…",
"amountTwd": 0
}
],
"specialTotalTwd": 0,
"netProfitTwd": 0,
"netMarginPct": 0
}
}/reconciliation
逐收款帳戶現金進出對帳
/api/v1/reconciliation/accounts參數
dateFrom選填對帳期間起日(YYYY-MM-DD,含當日),以 Asia/Taipei 牆鐘日界計;省略則不設下界
dateTo選填對帳期間迄日(YYYY-MM-DD,含整日),以 Asia/Taipei 牆鐘日界計;省略則不設上界
回應欄位 · data[]
accountIdcodedisplayNamekindinTwdoutTwdpayableOutTwdnetTwdtxCountcurl -X GET https://your-tenant.example.com/api/v1/reconciliation/accounts \ -H "Authorization: Bearer $CAIRN_TOKEN"
{
"ok": true,
"data": [
{
"accountId": "…",
"code": "…",
"displayName": "…",
"kind": null,
"inTwd": 0,
"outTwd": 0,
"payableOutTwd": 0,
"netTwd": 0,
"txCount": 0
}
]
}未結掛帳追蹤
/api/v1/reconciliation/obligations參數
period選填月結來源期間(YYYY-MM),篩選由該期月結互抵推導出的掛帳;省略則不限期間
reason選填掛帳原因代碼,篩選特定成因的掛帳;省略則不限原因
status選填掛帳狀態(如未結清 / 已結清),篩選特定結清狀態;省略則含全部
回應欄位 · data[]
iddebtorAccountIdcreditorAccountIdamountTwdsettledAmountTwdoutstandingTwdreasonoriginPeriodstatusnotecreatedAtupdatedAtcurl -X GET https://your-tenant.example.com/api/v1/reconciliation/obligations \ -H "Authorization: Bearer $CAIRN_TOKEN"
{
"ok": true,
"data": [
{
"id": "…",
"debtorAccountId": "…",
"creditorAccountId": "…",
"amountTwd": 0,
"settledAmountTwd": 0,
"outstandingTwd": 0,
"reason": "…",
"originPeriod": "…",
"status": "…",
"note": "…",
"createdAt": "2026-06-30T08:00:00.000Z",
"updatedAt": "2026-06-30T08:00:00.000Z"
}
]
}收款帳戶目錄清單
/api/v1/reconciliation/receiving-accounts參數
activeOnly選填是否只回傳啟用中的收款帳戶(true/false);省略則含停用
回應欄位 · data[]
idcodedisplayNamekindbankNameaccountNocanReceivecanRemitcanChargebackisDeprecatedisSettlementMastercurrencyisActivedisplayOrderusedCountcreatedAtupdatedAtcurl -X GET https://your-tenant.example.com/api/v1/reconciliation/receiving-accounts \ -H "Authorization: Bearer $CAIRN_TOKEN"
{
"ok": true,
"data": [
{
"id": "…",
"code": "…",
"displayName": "…",
"kind": "…",
"bankName": "…",
"accountNo": "…",
"canReceive": true,
"canRemit": true,
"canChargeback": true,
"isDeprecated": true,
"isSettlementMaster": true,
"currency": "…",
"isActive": true,
"displayOrder": 0,
"usedCount": 0,
"createdAt": "2026-06-30T08:00:00.000Z",
"updatedAt": "2026-06-30T08:00:00.000Z"
}
]
}退款執行清單
/api/v1/reconciliation/refund-executions參數
status選填approvedpaid退款狀態篩選:approved 待執行(已核准)、paid 已執行(已出款);省略則合併回傳兩者
回應欄位 · data
rowsidrefundNumberorderIdorderNumberstatusrefundKindaffectsReceivableamountTwdmethodreasoncreatedAtpaidAtcreatedByNameexecutionMethodoriginAccountIdadminFeeTwdremitFeeTwdpayeeAccountNamepayeeBankCodepayeeAccountNumbertotalcurl -X GET https://your-tenant.example.com/api/v1/reconciliation/refund-executions \ -H "Authorization: Bearer $CAIRN_TOKEN"
{
"ok": true,
"data": {
"rows": [
{
"id": "…",
"refundNumber": "…",
"orderId": "…",
"orderNumber": "…",
"status": "…",
"refundKind": "…",
"affectsReceivable": true,
"amountTwd": 0,
"method": "…",
"reason": "…",
"createdAt": "2026-06-30T08:00:00.000Z",
"paidAt": null,
"createdByName": "…",
"executionMethod": null,
"originAccountId": "…",
"adminFeeTwd": 0,
"remitFeeTwd": 0,
"payeeAccountName": "…",
"payeeBankCode": "…",
"payeeAccountNumber": "…"
}
],
"total": 0
}
}子系統 B 月結互抵派生總覽
/api/v1/reconciliation/settlement-overview參數
period必填要查詢月結互抵總覽的結算期(YYYY-MM)
回應欄位 · data
periodmatrixlinesunclassifiedobligationsiddebtorAccountIdcreditorAccountIdamountTwdsettledAmountTwdoutstandingTwdreasonoriginPeriodstatusnotecreatedAtupdatedAtcurl -X GET "https://your-tenant.example.com/api/v1/reconciliation/settlement-overview?period=<period>" \ -H "Authorization: Bearer $CAIRN_TOKEN"
{
"ok": true,
"data": {
"period": "…",
"matrix": {
"lines": [],
"unclassified": "…"
},
"obligations": [
{
"id": "…",
"debtorAccountId": "…",
"creditorAccountId": "…",
"amountTwd": 0,
"settledAmountTwd": 0,
"outstandingTwd": 0,
"reason": "…",
"originPeriod": "…",
"status": "…",
"note": "…",
"createdAt": "2026-06-30T08:00:00.000Z",
"updatedAt": "2026-06-30T08:00:00.000Z"
}
]
}
}跑當期月結互抵派生 + upsert
/api/v1/reconciliation/settlement/compute參數
period必填要計算月結互抵的結算期(YYYY-MM),可重跑且冪等(不回退已結額)
回應欄位 · data
periodmatrixlinesunclassifiedupsertsdebtorAccountIdcreditorAccountIdderivedAmountTwdappliedAmountTwdobligationIdactionadjustmentTwdadjustmentObligationIddeletedObligationIdscurl -X POST https://your-tenant.example.com/api/v1/reconciliation/settlement/compute \
-H "Authorization: Bearer $CAIRN_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"period": "<period>"
}'{
"ok": true,
"data": {
"period": "…",
"matrix": {
"lines": [],
"unclassified": "…"
},
"upserts": [
{
"debtorAccountId": "…",
"creditorAccountId": "…",
"derivedAmountTwd": 0,
"appliedAmountTwd": 0,
"obligationId": "…",
"action": "created",
"adjustmentTwd": 0,
"adjustmentObligationId": "…"
}
],
"deletedObligationIds": [
"…"
]
}
}帳戶間移轉統一分類帳查詢
/api/v1/reconciliation/transfers參數
kind選填移轉類型篩選(fx_conversion 換匯 / replenishment 補款 / advance 代墊 / backfill 回填 / refund_payout 退款匯出 / reversal 沖正);省略則含全部
account選填帳戶 ID 篩選,回傳該帳戶為出帳或進帳方的移轉;省略則不限帳戶
dateFrom選填移轉日期起日(YYYY-MM-DD,含當日);省略則不設下界
dateTo選填移轉日期迄日(YYYY-MM-DD,含當日);省略則不設上界
settlementPeriod選填對應月結期間(YYYY-MM)篩選;省略則不限月結
obligation選填掛帳 ID 篩選,回傳沖減該筆掛帳的移轉;省略則不限掛帳
回應欄位 · data[]
idkindfromAccountIdtoAccountIdamountTwdfeeTwdcurrencyforeignAmountfeeForeigngrossRatesettlementPeriodobligationIdreversesTransferIdoccurredAtnotecreatedByUserIdcreatedAtupdatedAtcurl -X GET https://your-tenant.example.com/api/v1/reconciliation/transfers \ -H "Authorization: Bearer $CAIRN_TOKEN"
{
"ok": true,
"data": [
{
"id": "…",
"kind": "…",
"fromAccountId": "…",
"toAccountId": "…",
"amountTwd": 0,
"feeTwd": 0,
"currency": "…",
"foreignAmount": 0,
"feeForeign": 0,
"grossRate": "…",
"settlementPeriod": "…",
"obligationId": "…",
"reversesTransferId": "…",
"occurredAt": "…",
"note": "…",
"createdByUserId": "…",
"createdAt": "2026-06-30T08:00:00.000Z",
"updatedAt": "2026-06-30T08:00:00.000Z"
}
]
}/api/v1/reconciliation/transfers參數
kind選填移轉類型:fx_conversion 換匯、replenishment 補款、advance 代墊、backfill 回填、refund_payout 退款匯出、reversal 沖正
fromAccountId選填出帳(轉出)帳戶 ID;與進帳帳戶至少填一個,null 表示無出帳方
toAccountId選填進帳(轉入)帳戶 ID;與出帳帳戶至少填一個,null 表示無進帳方
amountTwd選填移轉台幣淨額(整數,不可為負);沖減掛帳時須大於 0
feeTwd選填此筆移轉產生的手續費(台幣整數,不可為負)
occurredAt選填移轉發生日期(YYYY-MM-DD)
settlementPeriod選填對應月結期間(YYYY-MM),標記此移轉沖減哪一期互抵;換匯不掛單一月結,傳 null
currency選填換匯外幣幣別(ISO 4217 三碼);非換匯傳 null
foreignAmount選填換匯外幣金額(整數最小單位,須大於 0);非換匯傳 null
grossRate選填換匯牌價(正數,最多 6 位小數,以字串表達避免精度遺失);非換匯傳 null
obligationId選填選填沖減的掛帳 ID(aob_ 開頭);換匯不沖減掛帳須傳 null
回應欄位 · data
okcurl -X POST https://your-tenant.example.com/api/v1/reconciliation/transfers \
-H "Authorization: Bearer $CAIRN_TOKEN" \
-H "Content-Type: application/json" \
-d '{
}'{
"ok": true,
"data": {
"ok": true
}
}/reports
tenant monthly
/api/v1/reports/monthly參數
year必填報表年份(西元四位數),月界以台北時區計
month必填報表月份,1 至 12
回應欄位 · data
yearmonthtotalOrderspaidOrderscancelledOrderstotalRevenuerefundedAmountnetCashnewCustomersbyTriptripIdtripTitleorderCountrevenuebyProviderproviderorderCountamountcurl -X GET "https://your-tenant.example.com/api/v1/reports/monthly?year=<year>&month=<month>" \ -H "Authorization: Bearer $CAIRN_TOKEN"
{
"ok": true,
"data": {
"year": 0,
"month": 0,
"totalOrders": 0,
"paidOrders": 0,
"cancelledOrders": 0,
"totalRevenue": 0,
"refundedAmount": 0,
"netCash": 0,
"newCustomers": 0,
"byTrip": [
{
"tripId": "…",
"tripTitle": "…",
"orderCount": 0,
"revenue": 0
}
],
"byProvider": [
{
"provider": "…",
"orderCount": 0,
"amount": 0
}
]
}
}/roles
list all roles
/api/v1/roles參數
system選填truefalse是否只列內建角色:true 僅內建、false 僅自訂,省略則全部
回應欄位 · data[]
idnamelabelisSystempermissionCountmemberCountcurl -X GET https://your-tenant.example.com/api/v1/roles \ -H "Authorization: Bearer $CAIRN_TOKEN"
{
"ok": true,
"data": [
{
"id": "…",
"name": "…",
"label": "…",
"isSystem": true,
"permissionCount": 0,
"memberCount": 0
}
]
}/api/v1/roles參數
name必填角色代碼,小寫英數與底線、2–32 字且須以字母開頭,建立後不可改
label必填角色顯示名稱,呈現於後台角色清單
permissions選填此角色授予的權限清單,每筆為一組資源與動作
回應欄位 · data
idcurl -X POST https://your-tenant.example.com/api/v1/roles \
-H "Authorization: Bearer $CAIRN_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"name": "<name>",
"label": "<label>"
}'{
"ok": true,
"data": {
"id": "…"
}
}one role + its full
/api/v1/roles/{id}參數
id路徑角色 ID(內建角色為其代碼)
回應欄位 · data
idnamelabelisSystempermissionsresourceactioncurl -X GET https://your-tenant.example.com/api/v1/roles/<id> \ -H "Authorization: Bearer $CAIRN_TOKEN"
{
"ok": true,
"data": {
"id": "…",
"name": "…",
"label": "…",
"isSystem": true,
"permissions": [
{
"resource": "…",
"action": "…"
}
]
}
}/api/v1/roles/{id}參數
id路徑欲更新的角色 ID
label必填角色顯示名稱,呈現於後台角色清單
permissions選填完整取代後的權限清單,會整批覆寫此角色現有權限
回應欄位 · data
okcurl -X PATCH https://your-tenant.example.com/api/v1/roles/<id> \
-H "Authorization: Bearer $CAIRN_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"label": "<label>"
}'{
"ok": true,
"data": {
"ok": true
}
}/api/v1/roles/{id}參數
id路徑角色 ID(內建角色為其代碼)
回應欄位 · data
okcurl -X DELETE https://your-tenant.example.com/api/v1/roles/<id> \ -H "Authorization: Bearer $CAIRN_TOKEN"
{
"ok": true,
"data": {
"ok": true
}
}the code-defined permission catalog: every legal
/api/v1/roles/catalog回應欄位 · data[]
resourceactionscurl -X GET https://your-tenant.example.com/api/v1/roles/catalog \ -H "Authorization: Bearer $CAIRN_TOKEN"
{
"ok": true,
"data": [
{
"resource": "…",
"actions": [
"…"
]
}
]
}/rooms
指派旅客進房
/api/v1/rooms/{roomId}/travelers參數
roomId路徑目標房間 ID,旅客將被指派入住此房
travelerId必填欲指派的旅客 ID,須與房間屬於同一梯次
回應欄位 · data
okcurl -X POST https://your-tenant.example.com/api/v1/rooms/<roomId>/travelers \
-H "Authorization: Bearer $CAIRN_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"travelerId": "<travelerId>"
}'{
"ok": true,
"data": {
"ok": true
}
}把旅客移出房間
/api/v1/rooms/travelers/{travelerId}參數
travelerId路徑欲移出房間的旅客 ID
回應欄位 · data
okcurl -X DELETE https://your-tenant.example.com/api/v1/rooms/travelers/<travelerId> \ -H "Authorization: Bearer $CAIRN_TOKEN"
{
"ok": true,
"data": {
"ok": true
}
}/settings
the tenant_settings singleton
/api/v1/settings回應欄位 · data
idcompanyNamecompanyPhonetaxIdcompanyAddresslogoUrlsiteTaglineseoDefaultDescriptionogImageUrlemailReplyToassignmentModedefaultAssigneeUserIdpassportExpiryWarningDaysecpayFeeBpsfongshouFeeBpsprofitTaxBpsecpayMerchantIdecpaySecretsMasksendingDomainresendDomainIdsendingDomainStatussenderLocalPartupdatedAtcurl -X GET https://your-tenant.example.com/api/v1/settings \ -H "Authorization: Bearer $CAIRN_TOKEN"
{
"ok": true,
"data": {
"id": "…",
"companyName": "…",
"companyPhone": "…",
"taxId": "…",
"companyAddress": "…",
"logoUrl": "…",
"siteTagline": "…",
"seoDefaultDescription": "…",
"ogImageUrl": "…",
"emailReplyTo": "…",
"assignmentMode": "…",
"defaultAssigneeUserId": "…",
"passportExpiryWarningDays": 0,
"ecpayFeeBps": 0,
"fongshouFeeBps": 0,
"profitTaxBps": 0,
"ecpayMerchantId": "…",
"ecpaySecretsMask": "…",
"sendingDomain": "…",
"resendDomainId": "…",
"sendingDomainStatus": "…",
"senderLocalPart": "…",
"updatedAt": "2026-06-30T08:00:00.000Z"
}
}/api/v1/settings參數
companyName選填公司全名,顯示於發票、合約與對外信件抬頭;傳 null 或空字串清除
companyPhone選填公司聯絡電話,顯示於對外文件;傳 null 或空字串清除
taxId選填公司統一編號(8 位數字),用於開立發票;傳 null 或空字串清除
companyAddress選填公司登記地址,顯示於對外文件;傳 null 或空字串清除
logoUrl選填公司 Logo 圖片網址(http/https),用於後台與對外頁面品牌呈現;傳 null 或空字串清除
emailReplyTo選填系統寄信時的回覆收件信箱,客戶回信會寄到此處;傳 null 或空字串清除
senderLocalPart選填寄件人信箱的帳號部分(@ 前段),與寄件網域組成完整寄件地址;傳 null 或空字串清除
passportExpiryWarningDays選填護照到期前提早幾天提醒(1 至 3650 天),用於行前護照效期預警
回應欄位 · data
okcurl -X PATCH https://your-tenant.example.com/api/v1/settings \
-H "Authorization: Bearer $CAIRN_TOKEN" \
-H "Content-Type: application/json" \
-d '{
}'{
"ok": true,
"data": {
"ok": true
}
}the staff pool eligible to be an
/api/v1/settings/assignable-staff回應欄位 · data[]
userIdnameemailrolethisMonthAssignedcurl -X GET https://your-tenant.example.com/api/v1/settings/assignable-staff \ -H "Authorization: Bearer $CAIRN_TOKEN"
{
"ok": true,
"data": [
{
"userId": "…",
"name": "…",
"email": "…",
"role": "…",
"thisMonthAssigned": 0
}
]
}S5 order-assignment mode + default
/api/v1/settings/assignment參數
assignmentMode必填auto_round_robinauto_customer_choicemanual_review訂單指派模式:auto_round_robin 輪流自動指派、auto_customer_choice 依客戶選擇指派、manual_review 進待審由人工指派
defaultAssigneeUserId選填預設承辦人員的使用者 ID,自動指派找不到對象時的兜底承辦人;空字串表示不設預設
回應欄位 · data
okcurl -X PATCH https://your-tenant.example.com/api/v1/settings/assignment \
-H "Authorization: Bearer $CAIRN_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"assignmentMode": "auto_round_robin"
}'{
"ok": true,
"data": {
"ok": true
}
}/api/v1/settings/ecpay-credentials參數
merchantId必填綠界 ECPay 特店編號(MerchantID),用於金流請款與簽章
hashKey必填綠界 ECPay HashKey,CheckMacValue 簽章用密鑰;寫入後即 KMS 加密儲存且永不回傳
hashIv必填綠界 ECPay HashIV,CheckMacValue 簽章用初始向量;寫入後即 KMS 加密儲存且永不回傳
回應欄位 · data
okcurl -X PUT https://your-tenant.example.com/api/v1/settings/ecpay-credentials \
-H "Authorization: Bearer $CAIRN_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"merchantId": "<merchantId>",
"hashKey": "<hashKey>",
"hashIv": "<hashIv>"
}'{
"ok": true,
"data": {
"ok": true
}
}/api/v1/settings/ecpay-credentials回應欄位 · data
okcurl -X DELETE https://your-tenant.example.com/api/v1/settings/ecpay-credentials \ -H "Authorization: Bearer $CAIRN_TOKEN"
{
"ok": true,
"data": {
"ok": true
}
}公司營業費用類別目錄
/api/v1/settings/expense-categories參數
activeOnly選填是否只回傳啟用中的費用類別(true/false);省略則含停用
回應欄位 · data[]
idcodedisplayNamekindisActivecreatedAtupdatedAtcurl -X GET https://your-tenant.example.com/api/v1/settings/expense-categories \ -H "Authorization: Bearer $CAIRN_TOKEN"
{
"ok": true,
"data": [
{
"id": "…",
"code": "…",
"displayName": "…",
"kind": "opex",
"isActive": true,
"createdAt": "2026-06-30T08:00:00.000Z",
"updatedAt": "2026-06-30T08:00:00.000Z"
}
]
}/api/v1/settings/expense-categories參數
code必填費用類別代碼(小寫英數與底線),建立後不可變更,作為類別的穩定識別
displayName必填費用類別顯示名稱,呈現於後台費用登錄與報表
kind必填費用類別種類:opex 營業費用、tax 稅務、platform_fee 平台手續費、special 特殊,影響損益表歸類
回應欄位 · data
idcurl -X POST https://your-tenant.example.com/api/v1/settings/expense-categories \
-H "Authorization: Bearer $CAIRN_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"code": "<code>",
"displayName": "<displayName>",
"kind": "<kind>"
}'{
"ok": true,
"data": {
"id": "…"
}
}更新費用類別的顯示名 / kind +
/api/v1/settings/expense-categories/{id}參數
id路徑費用類別 ID(路徑參數),指定要更新的類別
displayName必填費用類別顯示名稱,呈現於後台費用登錄與報表
kind必填費用類別種類:opex 營業費用、tax 稅務、platform_fee 平台手續費、special 特殊,影響損益表歸類
isActive必填是否啟用此費用類別;false 為停用(停用而非刪除)
回應欄位 · data
okcurl -X PATCH https://your-tenant.example.com/api/v1/settings/expense-categories/<id> \
-H "Authorization: Bearer $CAIRN_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"displayName": "<displayName>",
"kind": "<kind>",
"isActive": true
}'{
"ok": true,
"data": {
"ok": true
}
}toggle a費用類別
/api/v1/settings/expense-categories/{id}/active參數
id路徑費用類別 ID(路徑參數),指定要切換啟用狀態的類別
isActive必填目標啟用狀態:true 啟用、false 停用(停用而非刪除)
回應欄位 · data
okcurl -X PATCH https://your-tenant.example.com/api/v1/settings/expense-categories/<id>/active \
-H "Authorization: Bearer $CAIRN_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"isActive": true
}'{
"ok": true,
"data": {
"ok": true
}
}fee-category → final receiving
/api/v1/settings/fee-category-routes回應欄位 · data[]
idfeeCategorydisplayNamefinalAccountIdfinalAccountNamefinalAccountCodeisActivecreatedAtupdatedAtcurl -X GET https://your-tenant.example.com/api/v1/settings/fee-category-routes \ -H "Authorization: Bearer $CAIRN_TOKEN"
{
"ok": true,
"data": [
{
"id": "…",
"feeCategory": "…",
"displayName": "…",
"finalAccountId": "…",
"finalAccountName": "…",
"finalAccountCode": "…",
"isActive": true,
"createdAt": "2026-06-30T08:00:00.000Z",
"updatedAt": "2026-06-30T08:00:00.000Z"
}
]
}/api/v1/settings/fee-category-routes參數
feeCategory必填費用類型代碼(小寫英數與底線),此 upsert 的唯一鍵;決定該手續費類型最終結算到哪個帳戶
displayName必填費用類型路由的顯示名稱,呈現於對帳設定
finalAccountId必填此費用類型最終結算進的收款帳戶 ID
isActive選填是否啟用此費用類型路由;省略則維持預設啟用
回應欄位 · data
idcurl -X PUT https://your-tenant.example.com/api/v1/settings/fee-category-routes \
-H "Authorization: Bearer $CAIRN_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"feeCategory": "<feeCategory>",
"displayName": "<displayName>",
"finalAccountId": "<finalAccountId>"
}'{
"ok": true,
"data": {
"id": "…"
}
}toggle a fee-category
/api/v1/settings/fee-category-routes/{id}/active參數
id路徑費用類型路由 ID(路徑參數,非 feeCategory 代碼),指定要切換啟用狀態的路由
isActive必填目標啟用狀態:true 啟用、false 停用(停用而非刪除)
回應欄位 · data
okcurl -X PATCH https://your-tenant.example.com/api/v1/settings/fee-category-routes/<id>/active \
-H "Authorization: Bearer $CAIRN_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"isActive": true
}'{
"ok": true,
"data": {
"ok": true
}
}internal/external-ledger profit estimate
/api/v1/settings/ledger-fees參數
ecpayFeeBps選填綠界 ECPay 金流手續費率,單位 basis points(0..10000,10000=100%),用於內外帳淨利試算;留空不變更
fongshouFeeBps選填豐收金流手續費率,單位 basis points(0..10000,10000=100%),用於內外帳淨利試算;留空不變更
profitTaxBps選填淨利稅率,單位 basis points(0..10000,10000=100%),用於內外帳淨利試算;留空不變更
回應欄位 · data
okcurl -X PATCH https://your-tenant.example.com/api/v1/settings/ledger-fees \
-H "Authorization: Bearer $CAIRN_TOKEN" \
-H "Content-Type: application/json" \
-d '{
}'{
"ok": true,
"data": {
"ok": true
}
}the tenant's enabled plan modules
/api/v1/settings/modules回應欄位 · data
climbingoverseaslodgingaccountinglotterycurl -X GET https://your-tenant.example.com/api/v1/settings/modules \ -H "Authorization: Bearer $CAIRN_TOKEN"
{
"ok": true,
"data": {
"climbing": true,
"overseas": true,
"lodging": true,
"accounting": true,
"lottery": true
}
}the收款帳戶目錄
/api/v1/settings/receiving-accounts參數
activeOnly選填是否只回傳啟用中的收款帳戶(true/false);省略則含停用
回應欄位 · data[]
idcodedisplayNamekindbankNameaccountNocanReceivecanRemitcanChargebackisDeprecatedisSettlementMastercurrencyisActivedisplayOrderusedCountcreatedAtupdatedAtcurl -X GET https://your-tenant.example.com/api/v1/settings/receiving-accounts \ -H "Authorization: Bearer $CAIRN_TOKEN"
{
"ok": true,
"data": [
{
"id": "…",
"code": "…",
"displayName": "…",
"kind": "…",
"bankName": "…",
"accountNo": "…",
"canReceive": true,
"canRemit": true,
"canChargeback": true,
"isDeprecated": true,
"isSettlementMaster": true,
"currency": "…",
"isActive": true,
"displayOrder": 0,
"usedCount": 0,
"createdAt": "2026-06-30T08:00:00.000Z",
"updatedAt": "2026-06-30T08:00:00.000Z"
}
]
}/api/v1/settings/receiving-accounts參數
code必填收款帳戶代號,建立後不可變更,作為帳戶的穩定識別
displayName必填收款帳戶顯示名稱,呈現於收款與對帳介面
kind必填bankcashgateway帳戶種類:bank 銀行帳戶、cash 現金、gateway 金流閘道
bankName選填銀行名稱(bank 類別適用);空字串清除
accountNo選填銀行帳號(bank 類別適用);空字串清除
currency選填帳戶幣別,ISO 4217 三碼(如 TWD / JPY / IDR);空字串預設 TWD,非 TWD 即為外幣池
displayOrder選填排序權重(0..9999),數字越小越前面;預設 0
isActive選填是否啟用此帳戶;省略維持預設
canReceive選填是否可作為收款(進帳)帳戶
canRemit選填是否可作為出款(匯出)帳戶
canChargeback選填是否可作為退款 / 退刷帳戶
isDeprecated選填是否標記為已淘汰(保留歷史紀錄但不再新用)
isSettlementMaster選填是否為主結算帳戶;每租戶僅能有一個,月結互抵以此為彙整中心
回應欄位 · data
idcurl -X POST https://your-tenant.example.com/api/v1/settings/receiving-accounts \
-H "Authorization: Bearer $CAIRN_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"code": "<code>",
"displayName": "<displayName>",
"kind": "bank"
}'{
"ok": true,
"data": {
"id": "…"
}
}update a收款帳戶
/api/v1/settings/receiving-accounts/{id}參數
id路徑收款帳戶 ID(路徑參數),指定要更新的帳戶
displayName必填收款帳戶顯示名稱,呈現於收款與對帳介面
kind必填bankcashgateway帳戶種類:bank 銀行帳戶、cash 現金、gateway 金流閘道
bankName選填銀行名稱(bank 類別適用);空字串清除
accountNo選填銀行帳號(bank 類別適用);空字串清除
currency選填帳戶幣別,ISO 4217 三碼(如 TWD / JPY / IDR);空字串預設 TWD,非 TWD 即為外幣池
displayOrder必填排序權重(0..9999),數字越小越前面
isActive選填是否啟用此帳戶;省略維持原值
canReceive選填是否可作為收款(進帳)帳戶
canRemit選填是否可作為出款(匯出)帳戶
canChargeback選填是否可作為退款 / 退刷帳戶
isDeprecated選填是否標記為已淘汰(保留歷史紀錄但不再新用)
isSettlementMaster選填是否為主結算帳戶;每租戶僅能有一個,月結互抵以此為彙整中心
回應欄位 · data
okcurl -X PATCH https://your-tenant.example.com/api/v1/settings/receiving-accounts/<id> \
-H "Authorization: Bearer $CAIRN_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"displayName": "<displayName>",
"kind": "bank",
"displayOrder": 0
}'{
"ok": true,
"data": {
"ok": true
}
}the tenant's custom email sending-domain
/api/v1/settings/sending-domain回應欄位 · data
sendingDomainresendDomainIdsendingDomainStatussenderLocalPartrecordsrecordnametypevaluettl選填status選填priority選填curl -X GET https://your-tenant.example.com/api/v1/settings/sending-domain \ -H "Authorization: Bearer $CAIRN_TOKEN"
{
"ok": true,
"data": {
"sendingDomain": "…",
"resendDomainId": "…",
"sendingDomainStatus": "…",
"senderLocalPart": "…",
"records": [
{
"record": "…",
"name": "…",
"type": "…",
"value": "…",
"ttl": "…",
"status": "…",
"priority": 0
}
]
}
}tear down the tenant's custom
/api/v1/settings/sending-domain/disable回應欄位 · data
okcurl -X POST https://your-tenant.example.com/api/v1/settings/sending-domain/disable \ -H "Authorization: Bearer $CAIRN_TOKEN"
{
"ok": true,
"data": {
"ok": true
}
}provision the tenant's custom
/api/v1/settings/sending-domain/enable回應欄位 · data
okdomaincurl -X POST https://your-tenant.example.com/api/v1/settings/sending-domain/enable \ -H "Authorization: Bearer $CAIRN_TOKEN"
{
"ok": true,
"data": {
"ok": true,
"domain": "…"
}
}re-sync DNS verification status
/api/v1/settings/sending-domain/verify回應欄位 · data
okstatuscurl -X POST https://your-tenant.example.com/api/v1/settings/sending-domain/verify \ -H "Authorization: Bearer $CAIRN_TOKEN"
{
"ok": true,
"data": {
"ok": true,
"status": "…"
}
}SEO defaults subset of tenant_settings
/api/v1/settings/seo參數
siteTagline選填網站標語,顯示於公開站標題與品牌呈現;空字串清除
seoDefaultDescription選填SEO 預設頁面描述(meta description),未個別設定的頁面套用此值;空字串清除
ogImageUrl選填社群分享預設縮圖(Open Graph image)網址(http/https);空字串清除
回應欄位 · data
okcurl -X PATCH https://your-tenant.example.com/api/v1/settings/seo \
-H "Authorization: Bearer $CAIRN_TOKEN" \
-H "Content-Type: application/json" \
-d '{
}'{
"ok": true,
"data": {
"ok": true
}
}/staff
list every staffer in the tenant DB
/api/v1/staff回應欄位 · data[]
userIdemailnamerolecreatedAtcurl -X GET https://your-tenant.example.com/api/v1/staff \ -H "Authorization: Bearer $CAIRN_TOKEN"
{
"ok": true,
"data": [
{
"userId": "…",
"email": "…",
"name": "…",
"role": "…",
"createdAt": "2026-06-30T08:00:00.000Z"
}
]
}remove a staffer
/api/v1/staff/{userId}參數
userId路徑欲移除員工身分的使用者 ID(將降為一般顧客)
回應欄位 · data
okcurl -X DELETE https://your-tenant.example.com/api/v1/staff/<userId> \ -H "Authorization: Bearer $CAIRN_TOKEN"
{
"ok": true,
"data": {
"ok": true
}
}change a staffer's role
/api/v1/staff/{userId}/role參數
userId路徑欲變更角色的員工使用者 ID
role必填變更後的員工角色(admin/sales/op/accountant),決定權限範圍
回應欄位 · data
okcurl -X PATCH https://your-tenant.example.com/api/v1/staff/<userId>/role \
-H "Authorization: Bearer $CAIRN_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"role": "<role>"
}'{
"ok": true,
"data": {
"ok": true
}
}建立一個新員工帳號
/api/v1/staff/invite參數
email必填受邀員工的登入 Email,作為帳號識別
name必填員工顯示姓名
role必填指派的員工角色(admin/sales/op/accountant),決定權限範圍
回應欄位 · data
userIdtempPasswordemailrolecurl -X POST https://your-tenant.example.com/api/v1/staff/invite \
-H "Authorization: Bearer $CAIRN_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"email": "<email>",
"name": "<name>",
"role": "<role>"
}'{
"ok": true,
"data": {
"userId": "…",
"tempPassword": "…",
"email": "…",
"role": "…"
}
}/suppliers
廠商目錄列表
/api/v1/suppliers參數
status選填activeinactiveall依狀態篩選(active 啟用 / inactive 停用 / all 全部,預設 active)
q選填關鍵字搜尋(廠商名稱或類別)
回應欄位 · data[]
idnamecategoryHintpayeeAccountNamepayeeBankCodepayeeAccountNumberstatuscreatedAtupdatedAtcurl -X GET https://your-tenant.example.com/api/v1/suppliers \ -H "Authorization: Bearer $CAIRN_TOKEN"
{
"ok": true,
"data": [
{
"id": "…",
"name": "…",
"categoryHint": "…",
"payeeAccountName": "…",
"payeeBankCode": "…",
"payeeAccountNumber": "…",
"status": "…",
"createdAt": "2026-06-30T08:00:00.000Z",
"updatedAt": "2026-06-30T08:00:00.000Z"
}
]
}/api/v1/suppliers參數
name必填廠商名稱(出款對象顯示名)
categoryHint選填類別提示(如住宿、交通、餐飲),供分類與搜尋
payeeAccountName選填收款戶名(須與銀行帳戶登記名一致)
payeeBankCode選填銀行代號(3~7 碼數字,台銀通用四欄轉帳檔用)
payeeAccountNumber選填收款銀行帳號(純數字,write-only 寫入後僅回遮罩)
回應欄位 · data
okidcurl -X POST https://your-tenant.example.com/api/v1/suppliers \
-H "Authorization: Bearer $CAIRN_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"name": "<name>"
}'{
"ok": true,
"data": {
"ok": true,
"id": "…"
}
}單一廠商主檔
/api/v1/suppliers/{id}參數
id路徑廠商 id(路徑參數)
回應欄位 · data
idnamecategoryHintpayeeAccountNamepayeeBankCodepayeeAccountNumberstatuscreatedAtupdatedAtcurl -X GET https://your-tenant.example.com/api/v1/suppliers/<id> \ -H "Authorization: Bearer $CAIRN_TOKEN"
{
"ok": true,
"data": {
"id": "…",
"name": "…",
"categoryHint": "…",
"payeeAccountName": "…",
"payeeBankCode": "…",
"payeeAccountNumber": "…",
"status": "…",
"createdAt": "2026-06-30T08:00:00.000Z",
"updatedAt": "2026-06-30T08:00:00.000Z"
}
}/api/v1/suppliers/{id}參數
name選填廠商名稱(出款對象顯示名)
categoryHint選填類別提示(如住宿、交通、餐飲),供分類與搜尋
payeeAccountName選填收款戶名(須與銀行帳戶登記名一致)
payeeBankCode選填銀行代號(3~7 碼數字,台銀通用四欄轉帳檔用)
payeeAccountNumber選填收款銀行帳號(純數字,write-only 寫入後僅回遮罩)
id路徑廠商 id(路徑參數)
回應欄位 · data
okcurl -X PATCH https://your-tenant.example.com/api/v1/suppliers/<id> \
-H "Authorization: Bearer $CAIRN_TOKEN" \
-H "Content-Type: application/json" \
-d '{
}'{
"ok": true,
"data": {
"ok": true
}
}/trips
/api/v1/trips參數
status選填依行程狀態篩選(draft 草稿/published 上架/archived 封存)
q選填自由文字搜尋(行程標題/代稱/目的地)
groupCode選填依團號篩選,列出含該團號梯次的行程
回應欄位 · data[]
idslugtitledestinationdurationDayspriceFromTwdstatusupdatedAtisClimbingisOverseasactiveDepartureCountnextDepartureDaterepresentativeGroupCodecurl -X GET https://your-tenant.example.com/api/v1/trips \ -H "Authorization: Bearer $CAIRN_TOKEN"
{
"ok": true,
"data": [
{
"id": "…",
"slug": "…",
"title": "…",
"destination": "…",
"durationDays": 0,
"priceFromTwd": 0,
"status": "…",
"updatedAt": "2026-06-30T08:00:00.000Z",
"isClimbing": true,
"isOverseas": true,
"activeDepartureCount": 0,
"nextDepartureDate": "…",
"representativeGroupCode": "…"
}
]
}same core op + audit as the back office
/api/v1/trips參數
slug必填行程網址代稱(slug),用於前台路徑與後台識別,只能小寫英數與連字號
title必填行程標題,顯示於前台與訂單
summary選填行程摘要,前台列表卡片用的一句話簡介
contentMdx選填行程詳細內容(MDX 格式),前台行程頁主文
destination必填目的地名稱
durationDays必填行程天數
priceFromTwd必填起價(新台幣),前台「OOO 元起」顯示用
directPriceTwd選填直客定價(新台幣),留空(null)則退回起價繼承
agencyPriceTwd選填同業定價(新台幣),留空(null)則退回直客/起價繼承
depositMode選填nonefixedpercent訂金計算方式(none 不收/fixed 固定金額/percent 百分比)
depositAmountTwd選填訂金固定金額(新台幣),depositMode 為 fixed 時生效
depositPercent選填訂金百分比(1–100),depositMode 為 percent 時生效
balanceDueDaysBeforeDeparture選填尾款應繳截止日(出發前幾天)
feeInclusions選填費用包含項目清單,每項含勾選狀態(ok)與說明文字(text)
isClimbing選填是否為登山團(啟用登山相關模組欄位)
isOverseas選填是否為海外團
gradeScore選填登山難度評分(0–100),null 表示未評級
requiresAlpineExperience選填是否需具備高山經驗
gradeLabel選填難度等級標籤文字
confirmGroupMultiple選填成團人數倍數(如國內高山團為 7 的倍數),null 表示不限
restrictedQuotaEnabled選填是否啟用每人使用次數限制
quotaPerPersonLimit選填每人於限制窗內可使用次數上限,null 表示不限
quotaWindow選填次數限制的計算窗口
waitlistEnabled選填是否開放候補
coverImageUrl選填行程封面圖網址(http/https)
seoTitle選填SEO 標題,覆寫前台頁面 title
seoDescription選填SEO 描述,覆寫前台 meta description
ogImageUrl選填Open Graph 社群分享圖網址(http/https)
status選填行程狀態(draft 草稿/published 上架/archived 封存)
回應欄位 · data
idcurl -X POST https://your-tenant.example.com/api/v1/trips \
-H "Authorization: Bearer $CAIRN_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"slug": "<slug>",
"title": "<title>",
"destination": "<destination>",
"durationDays": 0,
"priceFromTwd": 0
}'{
"ok": true,
"data": {
"id": "…"
}
}full admin trip detail
/api/v1/trips/{id}參數
id路徑行程 ID(路徑參數)
回應欄位 · data
idslugtitlesummarycontentMdxdestinationdurationDayspriceFromTwdcoverImageUrlstatuscreatedAtupdatedAtisClimbingisOverseasgradeScorerequiresAlpineExperiencegradeLabelfeeInclusionsseoTitleseoDescriptionogImageUrlimagesidurlcaptiondisplayOrderdeparturesidtripIddepartureDatereturnDatepriceTwdcapacitybookedCountstatusnotesallocationModeagencyPriceTwd選填depositMode選填depositAmountTwd選填depositPercent選填groupCode選填regionCode選填airlineCode選填promoActive選填promoPriceTwd選填promoAgencyPriceTwd選填curl -X GET https://your-tenant.example.com/api/v1/trips/<id> \ -H "Authorization: Bearer $CAIRN_TOKEN"
{
"ok": true,
"data": {
"id": "…",
"slug": "…",
"title": "…",
"summary": "…",
"contentMdx": "…",
"destination": "…",
"durationDays": 0,
"priceFromTwd": 0,
"coverImageUrl": "…",
"status": "…",
"createdAt": "2026-06-30T08:00:00.000Z",
"updatedAt": "2026-06-30T08:00:00.000Z",
"isClimbing": true,
"isOverseas": true,
"gradeScore": 0,
"requiresAlpineExperience": true,
"gradeLabel": "…",
"feeInclusions": "…",
"seoTitle": "…",
"seoDescription": "…",
"ogImageUrl": "…",
"images": [
{
"id": "…",
"url": "…",
"caption": "…",
"displayOrder": 0
}
],
"departures": [
{
"id": "…",
"tripId": "…",
"departureDate": "…",
"returnDate": "…",
"priceTwd": 0,
"capacity": 0,
"bookedCount": 0,
"status": "…",
"notes": "…",
"allocationMode": "fcfs",
"agencyPriceTwd": 0,
"depositMode": null,
"depositAmountTwd": 0,
"depositPercent": 0,
"groupCode": "…",
"regionCode": "…",
"airlineCode": "…",
"promoActive": true,
"promoPriceTwd": 0,
"promoAgencyPriceTwd": 0
}
]
}
}/api/v1/trips/{id}參數
id路徑行程 ID(路徑參數)
slug必填行程網址代稱(slug),用於前台路徑與後台識別,只能小寫英數與連字號
title必填行程標題,顯示於前台與訂單
summary選填行程摘要,前台列表卡片用的一句話簡介
contentMdx選填行程詳細內容(MDX 格式),前台行程頁主文
destination必填目的地名稱
durationDays必填行程天數
priceFromTwd必填起價(新台幣),前台「OOO 元起」顯示用
directPriceTwd選填直客定價(新台幣),留空(null)則退回起價繼承
agencyPriceTwd選填同業定價(新台幣),留空(null)則退回直客/起價繼承
depositMode選填nonefixedpercent訂金計算方式(none 不收/fixed 固定金額/percent 百分比)
depositAmountTwd選填訂金固定金額(新台幣),depositMode 為 fixed 時生效
depositPercent選填訂金百分比(1–100),depositMode 為 percent 時生效
balanceDueDaysBeforeDeparture選填尾款應繳截止日(出發前幾天)
feeInclusions選填費用包含項目清單,每項含勾選狀態(ok)與說明文字(text)
isClimbing選填是否為登山團(啟用登山相關模組欄位)
isOverseas選填是否為海外團
gradeScore選填登山難度評分(0–100),null 表示未評級
requiresAlpineExperience選填是否需具備高山經驗
gradeLabel選填難度等級標籤文字
confirmGroupMultiple選填成團人數倍數(如國內高山團為 7 的倍數),null 表示不限
restrictedQuotaEnabled選填是否啟用每人使用次數限制
quotaPerPersonLimit選填每人於限制窗內可使用次數上限,null 表示不限
quotaWindow選填次數限制的計算窗口
waitlistEnabled選填是否開放候補
coverImageUrl選填行程封面圖網址(http/https)
seoTitle選填SEO 標題,覆寫前台頁面 title
seoDescription選填SEO 描述,覆寫前台 meta description
ogImageUrl選填Open Graph 社群分享圖網址(http/https)
status選填行程狀態(draft 草稿/published 上架/archived 封存)
回應欄位 · data
okcurl -X PATCH https://your-tenant.example.com/api/v1/trips/<id> \
-H "Authorization: Bearer $CAIRN_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"slug": "<slug>",
"title": "<title>",
"destination": "<destination>",
"durationDays": 0,
"priceFromTwd": 0
}'{
"ok": true,
"data": {
"ok": true
}
}bind / unbind a trip's cost template
/api/v1/trips/{id}/cost-template參數
id路徑行程 ID(路徑參數)
templateId選填要綁定的成本範本 ID;null 或省略表示解除綁定
回應欄位 · data
okcurl -X PUT https://your-tenant.example.com/api/v1/trips/<id>/cost-template \
-H "Authorization: Bearer $CAIRN_TOKEN" \
-H "Content-Type: application/json" \
-d '{
}'{
"ok": true,
"data": {
"ok": true
}
}add a departure to a trip
/api/v1/trips/{id}/departures參數
id路徑行程 ID(路徑參數),新梯次所屬的行程
departureDate必填出發日期(YYYY-MM-DD)
returnDate必填回程日期(YYYY-MM-DD),須晚於出發日
priceTwd必填梯次直客售價(新台幣)
capacity必填梯次總名額(座位上限)
agencyPriceTwd選填梯次同業售價(新台幣)
depositMode選填nonefixedpercent訂金計算方式(none 不收/fixed 固定金額/percent 百分比)
depositAmountTwd選填訂金固定金額(新台幣),depositMode 為 fixed 時生效
depositPercent選填訂金百分比(1–100),depositMode 為 percent 時生效
status選填梯次狀態(selling 銷售中/closed 關閉/cancelled 取消/completed 完成)
regionCode選填團號地區來源碼(2–3 碼大寫英數),用於產生團號,可不指定
airlineCode選填團號航空來源碼(2–3 碼大寫英數),用於產生團號,可不指定
回應欄位 · data
idcurl -X POST https://your-tenant.example.com/api/v1/trips/<id>/departures \
-H "Authorization: Bearer $CAIRN_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"departureDate": "<departureDate>",
"returnDate": "<returnDate>",
"priceTwd": 0,
"capacity": 0
}'{
"ok": true,
"data": {
"id": "…"
}
}為某梯次預留自家旅宿配套
/api/v1/trips/{id}/departures/{depId}/lodging參數
id路徑行程 ID(路徑參數),梯次所屬的行程
depId路徑梯次 ID(路徑參數),要預留旅宿的梯次
propertyId必填自家旅宿物件 ID
roomTypeId必填該旅宿的房型 ID
checkIn必填入住日(YYYY-MM-DD)
checkOut必填退房日(YYYY-MM-DD),須晚於入住日
blockUnits必填整塊預留的房間間數
回應欄位 · data
okcurl -X POST https://your-tenant.example.com/api/v1/trips/<id>/departures/<depId>/lodging \
-H "Authorization: Bearer $CAIRN_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"propertyId": "<propertyId>",
"roomTypeId": "<roomTypeId>",
"checkIn": "<checkIn>",
"checkOut": "<checkOut>",
"blockUnits": 0
}'{
"ok": true,
"data": {
"ok": true
}
}釋回某梯次的自家旅宿配套預留
/api/v1/trips/{id}/lodging/{dlId}參數
id路徑行程 ID(路徑參數),預留所屬的行程
dlId路徑梯次旅宿配套預留 ID(路徑參數),要釋回的預留
回應欄位 · data
okcurl -X DELETE https://your-tenant.example.com/api/v1/trips/<id>/lodging/<dlId> \ -H "Authorization: Bearer $CAIRN_TOKEN"
{
"ok": true,
"data": {
"ok": true
}
}active cost templates for
/api/v1/trips/cost-templates參數
status選填成本範本狀態篩選;目前僅回傳啟用中(active)範本
回應欄位 · data[]
idnamecurl -X GET https://your-tenant.example.com/api/v1/trips/cost-templates \ -H "Authorization: Bearer $CAIRN_TOKEN"
{
"ok": true,
"data": [
{
"id": "…",
"name": "…"
}
]
}group-code lookup over HTTP.
/api/v1/trips/departures參數
groupCode選填完整團號,精確比對單一梯次
groupCodePrefix選填團號前綴,前綴比對列出多個梯次
curl -X GET https://your-tenant.example.com/api/v1/trips/departures \ -H "Authorization: Bearer $CAIRN_TOKEN"
{
"ok": true,
"data": "…"
}per-row pricing / deposit /
/api/v1/trips/departures/{departureId}參數
departureId路徑梯次 ID(路徑參數)
priceTwd必填梯次直客售價(新台幣)
agencyPriceTwd選填梯次同業售價(新台幣),留空則退回常規定價鏈
depositMode選填nonefixedpercent訂金計算方式(none 不收/fixed 固定金額/percent 百分比)
depositAmountTwd選填訂金固定金額(新台幣),depositMode 為 fixed 時生效
depositPercent選填訂金百分比(1–100),depositMode 為 percent 時生效
promoActive選填是否啟用梯次促銷覆寫價
promoPriceTwd選填直客促銷價(新台幣),啟用促銷時必填,null 表示清空
promoAgencyPriceTwd選填同業促銷價(新台幣),null 表示同業退回常規鏈
回應欄位 · data
okcurl -X PATCH https://your-tenant.example.com/api/v1/trips/departures/<departureId> \
-H "Authorization: Bearer $CAIRN_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"priceTwd": 0
}'{
"ok": true,
"data": {
"ok": true
}
}manual group-code
/api/v1/trips/departures/{departureId}/group-code參數
departureId路徑要覆寫團號的梯次 ID
groupCode必填完整團號,格式為 YY+地區+航空+MMDD+序號(如 26EGTK1010A,自動轉大寫)
回應欄位 · data
okgroupCodecurl -X POST https://your-tenant.example.com/api/v1/trips/departures/<departureId>/group-code \
-H "Authorization: Bearer $CAIRN_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"groupCode": "<groupCode>"
}'{
"ok": true,
"data": {
"ok": true,
"groupCode": "…"
}
}auto
/api/v1/trips/departures/{departureId}/group-code/generate參數
departureId路徑要產生團號的梯次 ID
regionCode必填地區碼,2–3 碼大寫英數(自動轉大寫)
airlineCode必填航空碼,2–3 碼大寫英數(自動轉大寫)
departureDate必填出發日期(ISO 格式 YYYY-MM-DD,取 MMDD 組成團號)
回應欄位 · data
groupCodecurl -X POST https://your-tenant.example.com/api/v1/trips/departures/<departureId>/group-code/generate \
-H "Authorization: Bearer $CAIRN_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"regionCode": "<regionCode>",
"airlineCode": "<airlineCode>",
"departureDate": "<departureDate>"
}'{
"ok": true,
"data": {
"groupCode": "…"
}
}change a departure's
/api/v1/trips/departures/{departureId}/status參數
departureId路徑梯次 ID(路徑參數)
status必填目標梯次狀態(selling 銷售中/closed 關閉/cancelled 取消/completed 完成)
回應欄位 · data
okcurl -X POST https://your-tenant.example.com/api/v1/trips/departures/<departureId>/status \
-H "Authorization: Bearer $CAIRN_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"status": "<status>"
}'{
"ok": true,
"data": {
"ok": true
}
}匯出行程
/api/v1/trips/export參數
status選填依行程狀態篩選(draft 草稿/published 上架/archived 封存)
q選填自由文字搜尋(行程標題/代稱/目的地)
groupCode選填依團號篩選,匯出含該團號梯次的行程
回應欄位 · data
rowsidslugtitledestinationdurationDayspriceFromTwdstatusupdatedAtisClimbingisOverseasactiveDepartureCountnextDepartureDaterepresentativeGroupCodetotaltruncatedcurl -X GET https://your-tenant.example.com/api/v1/trips/export \ -H "Authorization: Bearer $CAIRN_TOKEN"
{
"ok": true,
"data": {
"rows": [
{
"id": "…",
"slug": "…",
"title": "…",
"destination": "…",
"durationDays": 0,
"priceFromTwd": 0,
"status": "…",
"updatedAt": "2026-06-30T08:00:00.000Z",
"isClimbing": true,
"isOverseas": true,
"activeDepartureCount": 0,
"nextDepartureDate": "…",
"representativeGroupCode": "…"
}
],
"total": 0,
"truncated": true
}
}行程批次匯入 commit:上傳檔
/api/v1/trips/import參數
filename必填上傳檔名,副檔名須為 .xlsx 或 .csv
contentBase64必填檔案內容的 base64 編碼字串(上限 5 MB)
回應欄位 · data
filenameresultimportBatchIdcreatedTripCountcreatedDepartureCountskippedCounterrorCountresultscurl -X POST https://your-tenant.example.com/api/v1/trips/import \
-H "Authorization: Bearer $CAIRN_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"filename": "<filename>",
"contentBase64": "<contentBase64>"
}'{
"ok": true,
"data": {
"filename": "…",
"result": {
"importBatchId": "…",
"createdTripCount": 0,
"createdDepartureCount": 0,
"skippedCount": 0,
"errorCount": 0,
"results": []
}
}
}行程批次匯入 dry-run:上傳檔
/api/v1/trips/import/validate參數
filename必填上傳檔名,副檔名須為 .xlsx 或 .csv
contentBase64必填檔案內容的 base64 編碼字串(上限 5 MB)
回應欄位 · data
filenameresultrowssummaryfileErrorcurl -X POST https://your-tenant.example.com/api/v1/trips/import/validate \
-H "Authorization: Bearer $CAIRN_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"filename": "<filename>",
"contentBase64": "<contentBase64>"
}'{
"ok": true,
"data": {
"filename": "…",
"result": {
"rows": [],
"summary": "…",
"fileError": "…"
}
}
}