일별 청구서 조회
curl --request GET \
--url https://maas.gravitex.ai/prod-api/api/logs/getDailyList \
--header 'Authorization: <authorization>'import requests
url = "https://maas.gravitex.ai/prod-api/api/logs/getDailyList"
headers = {"Authorization": "<authorization>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: '<authorization>'}};
fetch('https://maas.gravitex.ai/prod-api/api/logs/getDailyList', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://maas.gravitex.ai/prod-api/api/logs/getDailyList",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: <authorization>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://maas.gravitex.ai/prod-api/api/logs/getDailyList"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "<authorization>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://maas.gravitex.ai/prod-api/api/logs/getDailyList")
.header("Authorization", "<authorization>")
.asString();require 'uri'
require 'net/http'
url = URI("https://maas.gravitex.ai/prod-api/api/logs/getDailyList")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = '<authorization>'
response = http.request(request)
puts response.read_body인터페이스 모듈
일별 청구서 조회
날짜별 청구서 소비 상세 및 일 요약 데이터를 조회하여 정산, 비용 분석, 청구서 수집에 사용
GET
/
prod-api
/
api
/
logs
/
getDailyList
일별 청구서 조회
curl --request GET \
--url https://maas.gravitex.ai/prod-api/api/logs/getDailyList \
--header 'Authorization: <authorization>'import requests
url = "https://maas.gravitex.ai/prod-api/api/logs/getDailyList"
headers = {"Authorization": "<authorization>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: '<authorization>'}};
fetch('https://maas.gravitex.ai/prod-api/api/logs/getDailyList', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://maas.gravitex.ai/prod-api/api/logs/getDailyList",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: <authorization>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://maas.gravitex.ai/prod-api/api/logs/getDailyList"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "<authorization>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://maas.gravitex.ai/prod-api/api/logs/getDailyList")
.header("Authorization", "<authorization>")
.asString();require 'uri'
require 'net/http'
url = URI("https://maas.gravitex.ai/prod-api/api/logs/getDailyList")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = '<authorization>'
response = http.request(request)
puts response.read_body날짜별로 청구서의 소비 상세와 일 요약 데이터를 조회하여 클라이언트 측 정산, 비용 분석, 청구서 수집에 사용합니다.
엔드포인트 정보
| 항목 | 설명 |
|---|---|
| 서비스 도메인 | https://maas.gravitex.ai/prod-api |
| 데이터 형식 | application/json |
| 문자 인코딩 | UTF-8 |
| 프로토콜 | HTTPS (필수) |
| 금액 통화 | USD (달러) |
| 과금 시간대 | utc+8 |
엔드포인트 목록
| 엔드포인트 | 요청 주소 | 용도 |
|---|---|---|
| 소비 상세 | GET /api/logs/getDailyList | (청구일 × 계정 × 모델 × Token 유형) 기준으로 소비 상세 반환 |
| 일 요약 | GET /api/logs/getDailySummary | (청구일 × 계정) 기준으로 당일 소비 순액 요약 반환 |
인증
모든 요청은 HTTP Header에 Bearer 자격 증명을 포함해야 합니다. 다음 두 가지 자격 증명 중 하나를 선택할 수 있습니다:| 자격 증명 유형 | 설명 |
|---|---|
| 액세스 토큰 (Access Token) | 플랫폼이 계정에 할당한 액세스 토큰 |
| API 키 (API Key) | 플랫폼이 계정용으로 생성한 API 키, 보통 sk-로 시작 |
string
필수
형식
Bearer <자격증명>; 위 자격 증명 중 하나를 입력# 방식 1: 액세스 토큰
Authorization: Bearer <access_token>
# 방식 2: API 키
Authorization: Bearer sk-xxxxxxxxxxxxxxxxxxxx
401, 비즈니스 코드 40100을 반환합니다.
URL, 프론트엔드 코드, 로그, 지원 티켓에 전체 키를 기록하지 마세요.
공통 응답 구조
모든 엔드포인트는 통일된 구조를 반환합니다:{
"code": 0,
"message": "success",
"data": {
"total": 128,
"rows": []
}
}
| 필드 | 유형 | 설명 |
|---|---|---|
code | integer | 비즈니스 상태 코드, 0은 성공, 비 0은 실패 |
message | string | 안내 메시지 |
data | object | 비즈니스 데이터 본문; 실패 시 null |
data.total | integer | 조회 조건을 만족하는 총 건수 (페이지네이션용) |
data.rows | array | 데이터 행 목록 |
비즈니스 오류 코드
| code | HTTP 상태 | 설명 |
|---|---|---|
| 0 | 200 | 성공 |
| 40001 | 400 | 파라미터 형식 오류 (날짜 형식 오류, 페이지네이션 파라미터가 양의 정수가 아님 등) |
| 40002 | 400 | 필수 파라미터 누락 |
| 40003 | 400 | 날짜 구간 오류 (startDate가 endDate보다 늦거나, 기간이 상한을 초과) |
| 40100 | 401 | Token 누락, 무효 또는 만료 |
| 50000 | 500 | 서버 내부 오류 |
소비 상세 조회
GET https://maas.gravitex.ai/prod-api/api/logs/getDailyList
(청구일 × 계정 × 모델 × Token 유형) 기준으로 소비 상세를 반환합니다.
쿼리 파라미터
string
필수
시작 날짜, 형식
yyyy-MM-ddstring
필수
종료 날짜, 형식
yyyy-MM-dd; startDate와의 기간은 92일을 초과할 수 없음string
필수
페이지 크기, 양의 정수 문자열; 범위
1 ~ 100, 100 초과 시 100으로 처리string
필수
현재 페이지 번호, 양의 정수 문자열,
1부터 시작페이지네이션 단위는 「소비 상세 항목」이며,
data.total은 조건을 만족하는 상세 총 건수입니다.응답 행 필드 (data.rows[])
| 필드 | 유형 | 설명 |
|---|---|---|
billMonth | string | 청구 월, 형식 yyyyMM |
billDay | string | 청구일, 형식 yyyy-MM-dd |
billingDateTimezone | string | 과금 시간대, 고정 utc+8 |
account | string | 계정명 |
modelType | string | 모델 분류, 예: claude, gpt, gemini, qwen, deepseek 등 |
modelName | string | 모델 이름 |
tokenType | string | Token 유형, 아래 enum 참고 |
tokenCount | string | 해당 유형의 소비 Token 수 (문자열형 정수) |
tokenUnit | string | Token 계량 단위, 고정 million (백만 Token당 과금) |
currency | string | 통화 유형, 고정 USD |
subtotalBeforeTax | string | 할인 전 세전 금액 (소수점 8자리) |
subtotalAfterDiscount | string | 할인 후 세전 금액 (소수점 8자리) |
totalAmountAfterTax | string | 할인 후 세후 금액 (소수점 8자리) |
price | string | 단가: tokenUnit 1개(즉 백만 Token) 당 할인 전 단가 (소수점 8자리). 환산: subtotalBeforeTax = price × tokenCount ÷ 1,000,000; tokenCount가 0이면 생략될 수 있음 |
entryType | string | 항목 유형, normal은 정상 소비 |
tokenType enum
| 열거값 | 설명 |
|---|---|
textInputTokens | 텍스트 입력 Token |
textOutputTokens | 텍스트 출력 Token |
reasoningTokens | 추론/사고 Token |
cacheCreationTokens5m | 캐시 생성 Token (5분 TTL) |
cacheCreationTokens1h | 캐시 생성 Token (1시간 TTL) |
cacheTokens | 캐시 히트(읽기) Token |
imageInputTokens | 이미지 입력 Token |
imageOutputTokens | 이미지 출력 Token |
audioInputTokens | 오디오 입력 Token |
audioOutputTokens | 오디오 출력 Token |
videoInputTokens | 비디오 입력 Token |
videoOutputTokens | 비디오 출력 Token |
정렬 규칙:
billDay 내림차순, 이어서 account, modelName, tokenType, currency 오름차순.요청 예시
curl "https://maas.gravitex.ai/prod-api/api/logs/getDailyList?startDate=2026-07-27&endDate=2026-07-27&pageSize=100&pageNum=1" \
-H "Authorization: Bearer <your_token>"
응답 예시
{
"code": 0,
"message": "success",
"data": {
"total": 23,
"rows": [
{
"billMonth": "202607",
"billDay": "2026-07-27",
"billingDateTimezone": "utc+8",
"account": "your_account",
"modelType": "claude",
"modelName": "claude-opus-4-8",
"tokenType": "textOutputTokens",
"tokenCount": "2931",
"tokenUnit": "million",
"currency": "USD",
"subtotalBeforeTax": "0.07327564",
"subtotalAfterDiscount": "0.07327564",
"totalAmountAfterTax": "0.07327564",
"price": "25.00021836",
"entryType": "normal"
}
]
}
}
일 요약 조회
GET https://maas.gravitex.ai/prod-api/api/logs/getDailySummary
쿼리 파라미터
string
필수
시작 날짜, 형식
yyyy-MM-ddstring
필수
종료 날짜, 형식
yyyy-MM-dd; startDate와의 기간은 366일을 초과할 수 없음string
필수
페이지 크기, 양의 정수 문자열; 범위
1 ~ 400, 400 초과 시 400으로 처리string
필수
현재 페이지 번호, 양의 정수 문자열,
1부터 시작페이지네이션 단위는 「청구일 × 계정」이며,
data.total은 조건을 만족하는 조합 총수입니다.응답 행 필드 (data.rows[])
| 필드 | 유형 | 설명 |
|---|---|---|
billMonth | string | 청구 월, 형식 yyyyMM |
billDay | string | 청구일, 형식 yyyy-MM-dd |
billingDateTimezone | string | 과금 시간대, 고정 utc+8 |
account | string | 계정명 |
currency | string | 통화 유형, 고정 USD |
subtotalBeforeTax | string | 당일 할인 전 세전 순액 (소수점 8자리) |
subtotalAfterDiscount | string | 당일 할인 후 세전 순액 (소수점 8자리) |
totalAmountAfterTax | string | 당일 할인 후 세후 순액 (소수점 8자리) |
정렬 규칙:
billDay 내림차순, 이어서 account 오름차순.요청 예시
curl "https://maas.gravitex.ai/prod-api/api/logs/getDailySummary?startDate=2026-07-01&endDate=2026-07-27&pageSize=31&pageNum=1" \
-H "Authorization: Bearer <your_token>"
응답 예시
{
"code": 0,
"message": "success",
"data": {
"total": 2,
"rows": [
{
"billMonth": "202607",
"billDay": "2026-07-27",
"billingDateTimezone": "utc+8",
"account": "your_account",
"currency": "USD",
"subtotalBeforeTax": "0.26569400",
"subtotalAfterDiscount": "0.26569400",
"totalAmountAfterTax": "0.26569400"
}
]
}
}
비즈니스 규칙과 약정
- 금액 정밀도: 모든 금액 필드는
string으로 전송하며 소수점 8자리를 유지하여 JSON number 정밀도 손실을 방지합니다. - 금액 일관성: 동일 청구일·동일 계정에서, 일 요약의 각 금액 필드는 해당일 소비 상세의 대응 금액 필드 합과 같습니다 (페이지를 넘어 합산).
- 제로 소비일: 조회 구간 내 소비가 없는 날짜는 기록을 반환하지 않습니다.
- 데이터 지연: 청구서 데이터는 T+1이며, 최신 하루 데이터는 다음 날에 조회 가능합니다.
- 계정 범위와 기업 관리: 기본적으로 자격 증명은 자신의 계정 청구서만 조회할 수 있습니다. 해당 계정이 「기업 관리」를 개통하고 주 계정인 경우, 하위 전체 계정의 청구서를 볼 수 있습니다 — 이때
userId/userName를 미전달하면 전체 하위 계정을 반환하고, 전달하면 지정 하위 계정으로 필터링합니다 (하위 계정 자신의 자격 증명은 본인만 조회 가능). 기업 관리 개통은 플랫폼 관리자에게 문의하세요. - 페이지 범위 초과:
pageNum이 총 페이지 수를 초과하면 빈rows를 반환하며,total은 실제 총수를 유지합니다.
