본문으로 건너뛰기
WhatsApp 문의내 예약

개발자 API

최종 업데이트 2026년 9월 23일

저희 항공편을 검색하고, 고객을 예약 화면으로 바로 연결하고, 보내 주신 예약에 대해 수수료를 받으세요. 아래의 모든 내용은 https://aviodeals.com에서 제공돼요.

이미 파트너이신가요? 통계, 예약, 월별 정산 내역서는 파트너 포털에서 확인할 수 있어요. 파트너 로그인

이용 신청

파트너 프로그램은 누구나 참여할 수 있어요. 아래 양식을 작성하시면 체험용 인증 정보를 받을 수 있는 링크를 바로 이메일로 보내 드려요. 이때 프로젝트에 대해서도 알려 주세요. 상업 계약은 그 내용을 바탕으로 맺어요.

  • 추적 코드 — 저희에게 보내는 모든 링크의 ref 파라미터에 넣는 값이에요.
  • 검색 및 피드 엔드포인트용 API 토큰
  • 수수료 조건: 주문 총액의 일정 비율로, 예약 1건당 합의된 최대 금액까지 지급돼요.

토큰은 bearer 인증 정보예요. 토큰을 가진 사람은 누구나 고객님 계정으로 조회할 수 있어요. 저희는 토큰의 해시값만 저장하므로 토큰을 다시 알려 드릴 수 없어요. 안전한 곳에 보관하시고, 유출되면 바로 알려 주세요. 새 토큰으로 교체해 드릴게요.

체험 계정에는 제한이 있어요. 저희를 평가하는 일이 항공사 계약에 부담이 되지 않도록 하기 위해서예요.

  • 그때까지 조건에 합의하지 않으면 30일 후에 종료돼요.
  • 하루 최대 500건의 검색 요청
  • 검색 결과는 저희 가격 저장소에서 제공돼요. 이 저장소는 저희 고객과 실제 운영 중인 파트너의 검색으로 채워져요. 최근에 아무도 검색하지 않은 노선과 날짜는 빈 결과가 나올 수 있어요. 정식 계정은 실시간 갱신을 요청해요.
  • 체험 기간 중 보내 주신 예약은 고객님의 코드로 추적돼요. 수수료는 계약일부터 지급돼요.

체험판 인증 정보 받기

이 이름이 추적 코드가 돼요. 예: acme-travel

인증 정보 링크를 이 주소로 보내고, 이후 모든 연락에 사용해요.

선택 사항이에요. 저희 항공편이 표시될 곳이에요.

한두 문장으로 알려 주세요. 제품, 대상 시장, 저희 항공편이 표시될 위치를 적어 주세요.

입력하신 정보는 접근 권한 설정과 계약 관련 연락에만 사용해요.

인증

모든 피드 및 검색 요청에 토큰을 보내 주세요. Bearer 접두어 없이 원래 토큰을 담은 Authorization 헤더로 보내거나, accessToken 쿼리 파라미터로 보내면 돼요. 리디렉션 엔드포인트는 공개되어 있어 토큰이 필요 없어요.

예시

curl -H "Authorization: YOUR_TOKEN" \
  "https://aviodeals.com/api/v2/data/routes.json"

실패

두 경우 모두 ERROR_UNAUTHORIZED 코드와 함께 HTTP 401로 응답해요.

  • 토큰이 전혀 없는 경우: Authentication required
  • 알 수 없는 토큰이거나 비활성화된 계정의 토큰인 경우: Access Denied [1]

엔드포인트

응답은 JSON이에요. 날짜는 ISO 8601(YYYY-MM-DD) 형식이에요. 공항은 IATA 코드나 공항 피드의 숫자 id로 지정할 수 있으며, 공항을 지정하는 모든 곳에서 두 방식 모두 사용할 수 있어요.

수하물과 운임 옵션은 -tcs로 끝나는 두 주소, flights-tcs.json과 flights-multi-tcs에서만 제공돼요. 다른 주소는 절대 바뀌지 않으므로, 그 주소로 만든 연동은 지금과 똑같이 계속 작동해요.

GET/api/v2/data/airports.json토큰 필요

저희가 취항하는 모든 공항과 각 공항의 숫자 id, IATA 코드, 도시, 국가

고정 참조 데이터예요. 거의 바뀌지 않고 id도 안정적이니 캐시해 두세요.

응답 예시 · 200 OK

[
  {
    "id": 51,
    "code": "DUS",
    "city": "Dusseldorf",
    "country": "Germany"
  },
  {
    "id": 242,
    "code": "DAR",
    "city": "Dar es salaam",
    "country": "Tanzania"
  }
]
GET/api/v2/data/routes.json토큰 필요

저희가 실제로 운항하는 공항 쌍을 출발지와 도착지 쌍으로 제공해요.

저희가 취항하는 두 공항이라고 해서 예약 가능한 쌍이 되는 것은 아니에요. 이 피드로 실제 존재하는 노선만 검색하세요. 이 피드에 없는 쌍은 항상 빈 결과만 나와요.

응답 예시 · 200 OK

[
  {
    "departure": {
      "id": 242,
      "code": "DAR",
      "city": "Dar es salaam",
      "country": "Tanzania"
    },
    "destination": {
      "id": 267,
      "code": "ZNZ",
      "city": "Zanzibar",
      "country": "Tanzania"
    }
  }
]
GET/api/v2/data/routes/with-availability.json토큰 필요

같은 공항 쌍과 각 노선의 운항 요일

운항하지 않는 요일에 노선을 검색하지 않도록 이 피드를 활용하세요.

응답 예시 · 200 OK

[
  {
    "dep": "DAR",
    "des": "ZNZ",
    "dow": "Mon,Tue,Wed,Thu,Fri,Sat,Sun",
    "from": "2026-01-01",
    "to": "2027-12-31"
  }
]
GET/api/v2/flights.json토큰 필요

한 노선을 한 날짜로 편도 또는 왕복 검색해요.

departure와 return 배열이 담긴 객체로 응답해요. 각 항공편에는 고유 id가 있어요. 이 id를 리디렉션 엔드포인트에 넘기면 고객이 해당 항공편으로 바로 이동해요.

파라미터

from 필수
출발 공항, IATA 코드 또는 id
to 필수
도착 공항, IATA 코드 또는 id
departureDate 필수
가는 날짜, YYYY-MM-DD
returnDate 선택
왕복일 때 오는 날짜. 편도는 생략하세요.
adults 선택
성인 탑승객. 기본값은 1이에요.
children 선택
소아 탑승객. 기본값은 0이에요.
infants 선택
좌석 없이 무릎에 앉는 유아. 기본값은 0이에요.
  • 저희가 운항하지 않는 쌍은 오류가 아닌 빈 배열로 응답해요. 빈 응답은 재시도할 이유가 되지 않아요.
  • 지난 날짜는 실패하지 않고 빈 결과로 응답해요.
  • return은 returnDate를 보낸 경우에만 포함돼요.

응답 예시 · 200 OK

{
  "departure": [
    {
      "from": {
        "id": 242,
        "code": "DAR",
        "city": "Dar es salaam",
        "country": "Tanzania"
      },
      "to": {
        "id": 267,
        "code": "ZNZ",
        "city": "Zanzibar",
        "country": "Tanzania"
      },
      "legs": [
        {
          "from": {
            "id": 242,
            "code": "DAR",
            "city": "Dar es salaam",
            "country": "Tanzania"
          },
          "to": {
            "id": 267,
            "code": "ZNZ",
            "city": "Zanzibar",
            "country": "Tanzania"
          },
          "number": "611",
          "dates": {
            "departure": "2026-10-27 07:15",
            "arrival": "2026-10-27 07:30"
          },
          "duration": 900,
          "airline": {
            "id": 173,
            "name": "Auric Air",
            "code": "UI"
          }
        }
      ],
      "dates": {
        "departure": "2026-10-27 07:15",
        "arrival": "2026-10-27 07:30"
      },
      "duration": 900,
      "airline": {
        "id": 173,
        "name": "Auric Air",
        "code": "UI"
      },
      "price": {
        "currency": "USD",
        "adult": "122.00",
        "child": "0.00",
        "infant": "0.00"
      },
      "priceUsd": {
        "adult": "122.00",
        "child": "0.00",
        "infant": "0.00"
      },
      "priceEur": {
        "adult": "106.05",
        "child": "0.00",
        "infant": "0.00"
      },
      "priceGbp": {
        "adult": "90.88",
        "child": "0.00",
        "infant": "0.00"
      },
      "requiredFields": {
        "phone": true,
        "nationality": true,
        "documentType": true,
        "documentNumber": true,
        "documentExpiry": false,
        "documentIssuer": false,
        "documentIssueDate": false,
        "birthDate": false,
        "birthDateForChildren": false,
        "birthDateForInfants": false,
        "placeOfBirth": false
      },
      "id": 1000000383705
    }
  ]
}
GET/api/v2/flights-tcs.json토큰 필요

같은 검색에 수하물과 항공편당 최대 네 가지 운임 옵션이 더해져요.

flights.json과 정확히 같은 내용으로 응답하고, 모든 항공편 객체에 fareOptions 배열이 추가돼요. 해당 항공편에서 판매할 수 있는 운임을 가장 저렴한 것부터 최대 네 개까지 담아요. 각 옵션에는 리디렉션 엔드포인트용 고유 id, 자체 가격 블록, fareFamilyName, 포함된 수하물이 있어요. 수하물은 cabinBag과 checkedBag으로, 각각 pieces, status(FREE 또는 NOT_INCLUDED), 그리고 항공사가 명시한 경우 개당 무게(킬로그램)를 담아요. Skyscanner Total Cost Search 같은 총비용 비교를 위해 만들어졌어요.

파라미터

from 필수
출발 공항, IATA 코드 또는 id
to 필수
도착 공항, IATA 코드 또는 id
departureDate 필수
가는 날짜, YYYY-MM-DD
returnDate 선택
왕복일 때 오는 날짜. 편도는 생략하세요.
adults 선택
성인 탑승객. 기본값은 1이에요.
children 선택
소아 탑승객. 기본값은 0이에요.
infants 선택
좌석 없이 무릎에 앉는 유아. 기본값은 0이에요.
  • 첫 번째 운임 옵션은 해당 항공편 자체의 상품이에요. 항공편 객체와 id와 가격이 같아요.
  • 항공사가 명시하지 않은 필드는 0으로 보내지 않고 생략해요. cabinBag이나 checkedBag이 없으면 알 수 없음으로 처리하세요.
  • cancellation과 flightChange는 항공사가 명시한 경우에만 FREE로만 표시돼요. 표시되지 않았다고 해서 어떤 의미가 있는 것은 아니에요.
  • 속성이 완전히 같은 두 운임은 하나의 상품이에요. 더 저렴한 것만 표시돼요.
  • 저희는 유료 수하물을 판매하지 않으므로 수하물 가격은 보내지 않아요.
  • flights.json은 바뀌지 않고 계속 제공돼요. 연동에 맞는 것을 사용하세요.

응답 예시 · 200 OK

{
  "departure": [
    {
      "from": {
        "id": 242,
        "code": "DAR",
        "city": "Dar es salaam",
        "country": "Tanzania"
      },
      "to": {
        "id": 267,
        "code": "ZNZ",
        "city": "Zanzibar",
        "country": "Tanzania"
      },
      "legs": [
        {
          "from": {
            "id": 242,
            "code": "DAR",
            "city": "Dar es salaam",
            "country": "Tanzania"
          },
          "to": {
            "id": 267,
            "code": "ZNZ",
            "city": "Zanzibar",
            "country": "Tanzania"
          },
          "number": "611",
          "dates": {
            "departure": "2026-10-27 07:15",
            "arrival": "2026-10-27 07:30"
          },
          "duration": 900,
          "airline": {
            "id": 173,
            "name": "Auric Air",
            "code": "UI"
          }
        }
      ],
      "dates": {
        "departure": "2026-10-27 07:15",
        "arrival": "2026-10-27 07:30"
      },
      "duration": 900,
      "airline": {
        "id": 173,
        "name": "Auric Air",
        "code": "UI"
      },
      "price": {
        "currency": "USD",
        "adult": "122.00",
        "child": "0.00",
        "infant": "0.00"
      },
      "priceUsd": {
        "adult": "122.00",
        "child": "0.00",
        "infant": "0.00"
      },
      "priceEur": {
        "adult": "106.05",
        "child": "0.00",
        "infant": "0.00"
      },
      "priceGbp": {
        "adult": "90.88",
        "child": "0.00",
        "infant": "0.00"
      },
      "requiredFields": {
        "phone": true,
        "nationality": true,
        "documentType": true,
        "documentNumber": true,
        "documentExpiry": false,
        "documentIssuer": false,
        "documentIssueDate": false,
        "birthDate": false,
        "birthDateForChildren": false,
        "birthDateForInfants": false,
        "placeOfBirth": false
      },
      "id": 1000000383705,
      "fareOptions": [
        {
          "id": 1000000383705,
          "fareFamilyName": "NR",
          "price": {
            "currency": "USD",
            "adult": "122.00",
            "child": "0.00",
            "infant": "0.00"
          },
          "priceUsd": {
            "adult": "122.00",
            "child": "0.00",
            "infant": "0.00"
          },
          "priceEur": {
            "adult": "106.05",
            "child": "0.00",
            "infant": "0.00"
          },
          "priceGbp": {
            "adult": "90.88",
            "child": "0.00",
            "infant": "0.00"
          },
          "cabinBag": {
            "pieces": 1,
            "status": "FREE",
            "weight": {
              "value": 5,
              "unit": "KG"
            }
          },
          "checkedBag": {
            "pieces": 1,
            "status": "FREE",
            "weight": {
              "value": 20,
              "unit": "KG"
            }
          }
        },
        {
          "id": 1000000383706,
          "fareFamilyName": "Y",
          "price": {
            "currency": "USD",
            "adult": "168.00",
            "child": "0.00",
            "infant": "0.00"
          },
          "priceUsd": {
            "adult": "168.00",
            "child": "0.00",
            "infant": "0.00"
          },
          "priceEur": {
            "adult": "146.04",
            "child": "0.00",
            "infant": "0.00"
          },
          "priceGbp": {
            "adult": "125.15",
            "child": "0.00",
            "infant": "0.00"
          },
          "checkedBag": {
            "pieces": 2,
            "status": "FREE",
            "weight": {
              "value": 23,
              "unit": "KG"
            }
          },
          "flightChange": "FREE"
        }
      ]
    }
  ]
}
POST/api/v2/flights-multi토큰 필요

한 번의 요청으로 최대 다섯 개의 노선과 날짜를 수하물 정보 없이 검색해요.

요청은 JSON 본문이에요. 각 destination은 한 날짜의 한 노선이에요. 왕복 여정은 가는 편과 오는 편, 두 개의 destination이에요. 응답은 result라는 객체로, FROM-TO-DATE(예: MGA-RNI-2026-10-27) 형식의 키마다 해당 destination의 항공편을 flights.json과 같은 형식으로 담아요. 이 응답은 절대 바뀌지 않아요. 수하물과 운임 옵션이 필요하면 같은 요청을 flights-multi-tcs로 보내세요.

파라미터

passengers.adults 선택
성인 탑승객. 기본값은 1이에요.
passengers.children 선택
소아 탑승객. 기본값은 0이에요.
passengers.infants 선택
좌석 없이 무릎에 앉는 유아. 기본값은 0이에요.
destinations[N].from 필수
출발 공항, IATA 코드 또는 id
destinations[N].to 필수
도착 공항, IATA 코드 또는 id
destinations[N].date 필수
날짜, YYYY-MM-DD
  • destination은 최대 다섯 개까지만 읽어요. 다섯 번째 이후는 무시돼요.
  • 왕복 여정을 연결하려면 가는 편과 오는 편 항공편 id를 redirect-multi에 넘기세요.
  • 노선 피드에 없는 쌍은 ERROR_DATA_VALIDATION 코드(Route X-Y is not supported)와 함께 HTTP 400으로 거부돼요. flights.json은 같은 쌍에 빈 배열로 응답해요.
  • 운항하지 않는 요일이나 지난 날짜의 destination은 빈 목록으로 응답해요. destination이 없는 요청은 빈 배열로 응답해요.

요청 예시

{
  "passengers": {
    "adults": 1,
    "children": 0,
    "infants": 0
  },
  "destinations": [
    {
      "from": "MGA",
      "to": "RNI",
      "date": "2026-10-27"
    }
  ]
}

응답 예시 · 200 OK

{
  "result": {
    "MGA-RNI-2026-10-27": [
      {
        "from": {
          "id": 5217,
          "code": "MGA",
          "city": "Managua",
          "country": "Nicaragua"
        },
        "to": {
          "id": 5219,
          "code": "RNI",
          "city": "Corn Island",
          "country": "Nicaragua"
        },
        "legs": [
          {
            "from": {
              "id": 5217,
              "code": "MGA",
              "city": "Managua",
              "country": "Nicaragua"
            },
            "to": {
              "id": 5219,
              "code": "RNI",
              "city": "Corn Island",
              "country": "Nicaragua"
            },
            "number": "142",
            "dates": {
              "departure": "2026-10-27 07:00",
              "arrival": "2026-10-27 08:30"
            },
            "duration": 5400,
            "airline": {
              "id": 1320,
              "name": "LAC",
              "code": "6Y"
            }
          }
        ],
        "dates": {
          "departure": "2026-10-27 07:00",
          "arrival": "2026-10-27 08:30"
        },
        "duration": 5400,
        "airline": {
          "id": 1320,
          "name": "LAC",
          "code": "6Y"
        },
        "price": {
          "currency": "USD",
          "adult": "161.74",
          "child": "0.00",
          "infant": "0.00"
        },
        "priceUsd": {
          "adult": "161.74",
          "child": "0.00",
          "infant": "0.00"
        },
        "priceEur": {
          "adult": "140.60",
          "child": "0.00",
          "infant": "0.00"
        },
        "priceGbp": {
          "adult": "120.48",
          "child": "0.00",
          "infant": "0.00"
        },
        "requiredFields": {
          "phone": false,
          "nationality": true,
          "documentType": false,
          "documentNumber": true,
          "documentExpiry": false,
          "documentIssuer": false,
          "documentIssueDate": false,
          "birthDate": false,
          "birthDateForChildren": false,
          "birthDateForInfants": false,
          "placeOfBirth": false
        },
        "id": 1000000384088
      }
    ]
  }
}
POST/api/v2/flights-multi-tcs토큰 필요

같은 다구간 검색에 수하물과 항공편당 최대 네 가지 운임 옵션이 더해져요.

flights-multi와 정확히 같은 요청을 받아 정확히 같은 내용으로 응답하고, flights-tcs.json에서 설명한 것처럼 모든 항공편 객체에 fareOptions 배열이 추가돼요. 해당 항공편에서 판매할 수 있는 운임을 가장 저렴한 것부터 최대 네 개까지 담고, 각 운임에는 리디렉션 엔드포인트용 고유 id, 자체 가격 블록, fareFamilyName, 포함된 수하물이 있어요. Skyscanner Total Cost Search 같은 총비용 비교를 위해 만들어졌어요.

파라미터

passengers.adults 선택
성인 탑승객. 기본값은 1이에요.
passengers.children 선택
소아 탑승객. 기본값은 0이에요.
passengers.infants 선택
좌석 없이 무릎에 앉는 유아. 기본값은 0이에요.
destinations[N].from 필수
출발 공항, IATA 코드 또는 id
destinations[N].to 필수
도착 공항, IATA 코드 또는 id
destinations[N].date 필수
날짜, YYYY-MM-DD
  • 첫 번째 운임 옵션은 해당 항공편 자체의 상품이에요. 항공편 객체와 id와 가격이 같아요.
  • 항공사가 명시하지 않은 필드는 0으로 보내지 않고 생략해요. cabinBag이나 checkedBag이 없으면 알 수 없음으로 처리하세요.
  • cancellation과 flightChange는 항공사가 명시한 경우에만 FREE로만 표시돼요. 표시되지 않았다고 해서 어떤 의미가 있는 것은 아니에요.
  • 저희는 유료 수하물을 판매하지 않으므로 수하물 가격은 보내지 않아요.
  • flights-multi는 바뀌지 않고 계속 제공돼요. 전환할 때는 주소만 바꾸면 돼요.

요청 예시

{
  "passengers": {
    "adults": 1,
    "children": 0,
    "infants": 0
  },
  "destinations": [
    {
      "from": "MGA",
      "to": "RNI",
      "date": "2026-10-27"
    }
  ]
}

응답 예시 · 200 OK

{
  "result": {
    "MGA-RNI-2026-10-27": [
      {
        "from": {
          "id": 5217,
          "code": "MGA",
          "city": "Managua",
          "country": "Nicaragua"
        },
        "to": {
          "id": 5219,
          "code": "RNI",
          "city": "Corn Island",
          "country": "Nicaragua"
        },
        "legs": [
          {
            "from": {
              "id": 5217,
              "code": "MGA",
              "city": "Managua",
              "country": "Nicaragua"
            },
            "to": {
              "id": 5219,
              "code": "RNI",
              "city": "Corn Island",
              "country": "Nicaragua"
            },
            "number": "142",
            "dates": {
              "departure": "2026-10-27 07:00",
              "arrival": "2026-10-27 08:30"
            },
            "duration": 5400,
            "airline": {
              "id": 1320,
              "name": "LAC",
              "code": "6Y"
            }
          }
        ],
        "dates": {
          "departure": "2026-10-27 07:00",
          "arrival": "2026-10-27 08:30"
        },
        "duration": 5400,
        "airline": {
          "id": 1320,
          "name": "LAC",
          "code": "6Y"
        },
        "price": {
          "currency": "USD",
          "adult": "161.74",
          "child": "0.00",
          "infant": "0.00"
        },
        "priceUsd": {
          "adult": "161.74",
          "child": "0.00",
          "infant": "0.00"
        },
        "priceEur": {
          "adult": "140.60",
          "child": "0.00",
          "infant": "0.00"
        },
        "priceGbp": {
          "adult": "120.48",
          "child": "0.00",
          "infant": "0.00"
        },
        "requiredFields": {
          "phone": false,
          "nationality": true,
          "documentType": false,
          "documentNumber": true,
          "documentExpiry": false,
          "documentIssuer": false,
          "documentIssueDate": false,
          "birthDate": false,
          "birthDateForChildren": false,
          "birthDateForInfants": false,
          "placeOfBirth": false
        },
        "id": 1000000384088,
        "fareOptions": [
          {
            "id": 1000000384088,
            "fareFamilyName": "Light",
            "price": {
              "currency": "USD",
              "adult": "161.74",
              "child": "0.00",
              "infant": "0.00"
            },
            "priceUsd": {
              "adult": "161.74",
              "child": "0.00",
              "infant": "0.00"
            },
            "priceEur": {
              "adult": "140.60",
              "child": "0.00",
              "infant": "0.00"
            },
            "priceGbp": {
              "adult": "120.48",
              "child": "0.00",
              "infant": "0.00"
            },
            "cabinBag": {
              "pieces": 1,
              "status": "FREE",
              "weight": {
                "value": 9.5,
                "unit": "KG"
              }
            },
            "checkedBag": {
              "pieces": 0,
              "status": "NOT_INCLUDED"
            }
          },
          {
            "id": 1000000384091,
            "fareFamilyName": "Standard",
            "price": {
              "currency": "USD",
              "adult": "172.74",
              "child": "0.00",
              "infant": "0.00"
            },
            "priceUsd": {
              "adult": "172.74",
              "child": "0.00",
              "infant": "0.00"
            },
            "priceEur": {
              "adult": "150.16",
              "child": "0.00",
              "infant": "0.00"
            },
            "priceGbp": {
              "adult": "128.68",
              "child": "0.00",
              "infant": "0.00"
            },
            "checkedBag": {
              "pieces": 1,
              "status": "FREE",
              "weight": {
                "value": 14,
                "unit": "KG"
              }
            }
          },
          {
            "id": 1000000384092,
            "fareFamilyName": "Essential",
            "price": {
              "currency": "USD",
              "adult": "194.74",
              "child": "0.00",
              "infant": "0.00"
            },
            "priceUsd": {
              "adult": "194.74",
              "child": "0.00",
              "infant": "0.00"
            },
            "priceEur": {
              "adult": "169.29",
              "child": "0.00",
              "infant": "0.00"
            },
            "priceGbp": {
              "adult": "145.07",
              "child": "0.00",
              "infant": "0.00"
            },
            "cabinBag": {
              "pieces": 1,
              "status": "FREE",
              "weight": {
                "value": 9.5,
                "unit": "KG"
              }
            },
            "checkedBag": {
              "pieces": 1,
              "status": "FREE",
              "weight": {
                "value": 14,
                "unit": "KG"
              }
            }
          }
        ]
      }
    ]
  }
}
GET/api/v2/redirect공개

딥 링크예요. 고객을 이곳으로 보내면 클릭한 항공편으로 바로 이동해요.

여정이 미리 입력된 검색 결과 페이지로 리디렉션하고 고객님의 유입 경로를 기록해요. 이 엔드포인트는 오류를 내지 않아요. 확인할 수 없는 id라도 고객은 막다른 페이지가 아닌 사용 가능한 페이지로 이동해요.

파라미터

flightId 필수
검색 응답에서 받은 가는 편 항공편 id
returnFlightId 선택
왕복일 때 오는 편 항공편 id
ref 필수
고객님의 추적 코드. 이 코드가 없으면 방문에 대한 수익이 발생하지 않아요.
subAffiliate 선택
고객님의 하위 채널 라벨. 보고서에 그대로 표시돼요.
campaign 선택
고객님의 캠페인 라벨
partnerClickId 선택
고객님의 클릭 식별자. 예약을 고객님의 로그와 대조할 수 있어요.
currency 선택
가격을 표시할 통화. 결제 통화는 바뀌지 않아요.

응답 예시 · 301 Moved Permanently

Location: https://aviodeals.com/search?from=DAR&to=ZNZ&depart=2026-10-27&adults=1&children=0&infants=0#results
GET/api/v2/redirect-multi공개

왕복 여정용 딥 링크로, 두 구간을 목록으로 받아요.

flightIds를 컬렉션으로 읽어요. 첫 번째 항목은 가는 편, 두 번째 항목은 오는 편이에요. 단일 리디렉션과 같은 유입 경로 파라미터를 받아요.

파라미터

flightIds[] 필수
순서대로 항공편 id: 가는 편이 먼저, 오는 편이 두 번째
ref 필수
고객님의 추적 코드

응답 예시 · 301 Moved Permanently

Location: https://aviodeals.com/search?from=DAR&to=ZNZ&depart=2026-10-27&adults=1&children=0&infants=0#results
GET/api/v2/results-multi공개

항공편 id 대신 공항과 날짜로 만드는 딥 링크

캐시되었거나 만료된 검색처럼 항공편 id가 없을 때 사용하세요. destinations를 인덱스 파라미터로 읽어요: destinations[0][from], destinations[0][to], destinations[0][date].

파라미터

destinations[N][from] 필수
N번째 구간의 출발 공항
destinations[N][to] 필수
N번째 구간의 도착 공항
destinations[N][date] 필수
N번째 구간의 날짜
ref 필수
고객님의 추적 코드
  • 확인할 수 없는 destination은 거부하지 않고 건너뛰어요.

응답 예시 · 301 Moved Permanently

Location: https://aviodeals.com/search?from=DAR&to=ZNZ&depart=2026-10-27&adults=1&children=0&infants=0#results
GET/api/v2/partner/statistics.json토큰 필요

일별 또는 노선별 검색, 클릭, 예약, 수수료

파트너 포털의 통계 페이지 수치를 고객님의 시스템에서 사용할 수 있어요. 검색은 고객님의 토큰으로 보낸 검색 요청이에요. 클릭은 저희에게 보내 주신 리디렉션이며, 막다른 클릭은 항공편과 연결하지 못한 클릭이에요. 예약은 결제된 날에 집계되고 각각의 수수료가 함께 표시돼요. 이후 예약이 어떻게 되더라도 수수료는 회수하지 않아요.

파라미터

from 선택
시작일, YYYY-MM-DD(UTC). 기본값은 to가 속한 달의 1일이에요.
to 선택
종료일, YYYY-MM-DD(UTC), 해당일 포함. 기본값은 오늘이에요. from으로부터 최대 366일까지예요.
groupBy 선택
day(기본값) 또는 route. 노선은 양방향을 합쳐 집계해요.
  • 항상 고객님의 수치만 제공돼요. 저희 자체 기록으로 응답하며 항공사에는 요청하지 않아요.
  • 수수료는 응답에 명시된 통화의 숫자예요.

응답 예시 · 200 OK

{
  "partner": {
    "code": "your-code",
    "id": 10001
  },
  "from": "2026-09-01",
  "to": "2026-09-26",
  "groupBy": "day",
  "currency": "USD",
  "totals": {
    "searches": 41280,
    "clicks": 312,
    "deadEnds": 4,
    "bookings": 9,
    "commission": 51.32
  },
  "days": [
    {
      "date": "2026-09-01",
      "searches": 1466,
      "clicks": 11,
      "deadEnds": 0,
      "bookings": 0,
      "commission": 0
    },
    {
      "date": "2026-09-02",
      "searches": 1655,
      "clicks": 13,
      "deadEnds": 0,
      "bookings": 0,
      "commission": 0
    },
    {
      "date": "2026-09-03",
      "searches": 1702,
      "clicks": 12,
      "deadEnds": 0,
      "bookings": 1,
      "commission": 3.05
    }
  ]
}
GET/api/v2/partner/bookings.json토큰 필요

한 달 동안의 예약과 수수료, 고객님의 클릭 id

파트너 포털 예약 페이지의 행이에요. 예약은 결제된 달에 속하며 수수료가 유지돼요. 나중에 취소되거나 환불된 예약도 해당 상태로 목록에 남아요.

파라미터

month 선택
YYYY-MM. 기본값은 이번 달이에요.
  • status는 confirmed, cancelled 또는 refunded예요. 그달의 수수료는 상태와 관계없이 그달에 결제된 모든 예약을 집계해요.
  • clickId와 subId는 클릭과 함께 보내 주신 값이에요.

응답 예시 · 200 OK

{
  "partner": {
    "code": "your-code",
    "id": 10001
  },
  "month": "2026-09",
  "currency": "USD",
  "count": 9,
  "commission": 51.32,
  "bookings": [
    {
      "paidAt": "2026-09-25T10:14:03.000Z",
      "reference": "00GDSG",
      "route": "SAP-RTB-SAP",
      "travelFrom": "2026-12-20",
      "travelTo": "2027-01-03",
      "passengers": 1,
      "commission": 7.5,
      "currency": "USD",
      "status": "confirmed",
      "clickId": "c-B4C912",
      "subId": null
    }
  ]
}

오류

모든 오류는 같은 형식이에요. success는 false이고, code는 오류 종류를 나타내며, errors는 잘못된 내용을 나열하고, 문제가 있는 파라미터가 있으면 path로 알려 줘요. 토큰이 없거나 알 수 없으면 401로 응답하고, 읽을 수 없는 검색은 400으로 응답해요. 빈 결과는 절대 오류가 아니에요.

401 Unauthorized

{
  "success": false,
  "code": "ERROR_UNAUTHORIZED",
  "errors": [
    {
      "message": "Authentication required"
    }
  ]
}

400 Bad Request

{
  "success": false,
  "code": "ERROR_GENERAL",
  "errors": [
    {
      "message": "To airport is required",
      "path": "to"
    },
    {
      "message": "Departure date is required",
      "path": "departureDate"
    }
  ]
}

유입 경로 기록

모든 링크의 ref 파라미터에 추적 코드를 넣어 주세요. 고객이 도착하면 자사 쿠키를 설정하고, 예약할 때 다시 읽어요. 그래서 클릭 후 며칠이 지나 예약해도 고객님의 실적으로 집계돼요.

https://aviodeals.com/api/v2/redirect?flightId=1000000000123&ref=YOUR_CODE
  • 유입 경로 인정 기간은 클릭 후 42일이에요.
  • 가장 최근 클릭이 우선해요. 고객이 고객님 이후에 다른 파트너를 통해 들어오면 예약은 그 파트너의 실적이 돼요.
  • 예약은 생성되는 시점에 한 번만 귀속돼요.

수수료

주문 총액의 합의된 비율을 예약 1건당 합의된 최대 금액까지 받아요. 정확한 수치는 고객님의 계약서에 있으며, 아래 규칙은 모든 파트너에게 적용돼요.

  • 최대 금액은 탑승객별이 아닌 예약별이에요. 탑승객이 몇 명이든 예약 1건에는 상한이 적용된 수수료 1건이 지급돼요.
  • 수수료는 이전에 안내된 가격이 아니라 실제로 결제된 주문 총액을 기준으로 계산해요.
  • 금액은 센트 단위에서 버림해요.
  • 수수료는 결제가 완료된 예약에 대해 지급되며, 나중에 예약이 취소되거나 환불되어도 회수하지 않아요. 홀드 중이거나 중단된 결제에는 수수료가 없어요.
  • 고객님의 지급 통화가 아닌 다른 통화로 판매된 예약은 자동으로 지급하지 않고 별도로 알려 드려요. 정산 시 환전하지 않고 고객님과 환율을 합의해요.

보고

파트너 포털에 로그인해 통계, 예약, 월별 정산 내역서를 확인하거나, 위의 두 파트너 엔드포인트로 같은 수치를 가져올 수 있어요. 매월 2일에 지난달 정산 내역서를 이메일로 보내 드려요. 청구서 작성에 필요한 내용이 모두 들어 있어요.

공정 사용

저희는 예약 1건당 항공사에 보내는 검색 수를 측정하는 계약에 따라 항공사에서 좌석을 구매해요. 이 한도는 고객님과 함께 쓰는 것이므로, 몇 가지 습관만 지켜 주시면 서로에게 좋은 연결을 유지할 수 있어요.

  • 노선 피드에 있는 쌍만, 운항 피드에서 운항한다고 표시된 요일에만 검색하세요. 저희가 운항하지 않는 쌍은 빈 결과만 나오며, 그래도 요청하면 한도만 낭비돼요.
  • 공항 및 노선 피드는 캐시해 두세요. 거의 바뀌지 않아요.
  • 같은 여정을 반복해서 검색하지 마세요. 가격은 검색 시점이 아닌 예약 시점에 확정돼요.
  • 요청량을 크게 늘리기 전에 미리 알려 주세요. 저희 쪽 한도를 먼저 늘릴 수 있어요.

문의

이해가 안 되는 부분이나 작동하지 않는 부분이 있거나, 필요한 엔드포인트가 없나요? 연락 주세요. 우회해서 쓰시게 하기보다는 API를 바꾸는 편을 택할게요.

개발자 API | aviodeals