POST/v1/sources
소스 생성
create_source
조직 API 키로는(1.62.0부터) 사용자 지정 소스(kind: custom)만 다룰 수 있어요. 키에는 admin 역할과 admin 스코프가 필요해요. 다른 종류는 400 sources.kind_not_allowed_for_key 오류를 반환해요. 서비스 제공자 계정으로 로그인하는 커넥터는 브라우저에서 설정해요. 커넥터 필드는 공개 명세에 나오지 않아요. 사용자 지정 소스에는 name, 컬렉션(collection_id 또는 collection), 권한 모드 permissions_mode, 카드를 넣을 컬렉션 폴더(folder_id와 folder_mode), 선택한 문서 폴더(roots)를 지정해요. 문서는 /v1/push/sources/{source_id}/* 오퍼레이션으로 보내요.
인증
Authorization 헤더로 API 키를 보내세요: Authorization: Bearer <키>.
헤더 파라미터
X-View-Asstringadmin역할의 API 키만 쓸 수 있어요.<profile>[:viewer|verifier|editor]형식의 데이터 프로필로 요청을 보내요(예:employee:viewer). 설치 키는 이 헤더를 쓸 수 없어요(403).Idempotency-Keystring쓰기 요청을 안전하게 재시도하기 위한 키예요. 출력 가능한 ASCII 문자 1~255자이며, 논리적 처리 단위마다 UUID v4를 하나씩 쓰기를 권장해요. 24시간 안에 같은 키로 재시도하면 처리를 다시 실행하지 않고, 저장된 응답(상태, 헤더, 본문)을
Idempotency-Replayed: true헤더와 함께 반환해요. 같은 키를 다른 메서드, 경로,Content-Type값이나 본문과 함께 보내면409 api.idempotency_mismatch오류를 반환하고, 첫 요청이 아직 실행 중이면409 api.idempotency_in_progress오류를Retry-After: 1헤더와 함께 반환해요. 5xx나 429 응답 뒤에는 키가 해제되어, 재시도하면 처리가 다시 실행돼요. 키의 적용 범위는 조직과 호출자(API 키, 사용자, 사용자 지정 소스 키)예요.length ≥ 1, length ≤ 255
쿠키 파라미터
kb_view_asstring세션의 “View as” 모드(다른 사용자로 보기) 쿠키.
POST /auth/view-as요청으로 설정하고DELETE /auth/view-as요청으로 지워요.
요청 본문
application/json
kindstring소스 종류(SourceKind 참고). 조직 API 키로는
custom값만 가능해요.기본값: "gdrive"
namestring필수length ≥ 1, length ≤ 120
collectionstring소스의 컬렉션 이름. 대신
collection_id값을 전달할 수 있어요(1.62.0부터).length ≥ 1, length ≤ 64
collection_idintegerID로 지정하는 소스의 컬렉션(1.62.0부터). 둘 다 전달하면
collection_id값이 우선해요.permissions_modestring소스 카드의 권한 모드(1.62.0부터,
update_source_settings오퍼레이션과 같음):own은 컬렉션의 권한을 쓰고,mirror는 문서에서 권한을 가져와요(permissions).mirror값을 선택하려면 컬렉션 권한을 관리할 권리가 필요해요.허용 값:
ownmirrordefault_owner_idinteger | nullverify_interval_daysinteger기본값: 90≥ 1, ≤ 3650
tagsarray of string기본값: []
default_categorystring | nullrootsarray of string | null소스에서 선택한 폴더. 그 안의 항목만 카드가 돼요. 사용자 지정 소스에서는 문서의 폴더 경로(
Guides/Billing)이고, 커넥터에서는 외부 서비스 트리의 노드예요.folder_idstring | null소스의 컬렉션에서 카드를 넣을 폴더(null이면 컬렉션 최상위).
folder_modestringflat은 모든 항목을 선택한 폴더에 넣어요.mirror는 소스에서의 항목 경로를 그대로 따르는 폴더를 만들되, 폴더 중첩 한도(3단계)보다 깊게 만들지 않아요(더 깊은 항목은 가장 가까운 폴더로 들어가요).허용 값:
flatmirror기본값: "flat"
응답
200성공 응답
응답 헤더
RateLimit-Policy적용 중인 한도. IETF 초안
draft-ietf-httpapi-ratelimit-headers형식이며, 쉼표로 구분한"<name>";q=<quota>;w=<window in seconds>항목으로 이루어져요.key항목은 API 키의 요청 속도예요(할당량은 버스트, 시간 창은 버스트가 완전히 다시 채워지는 시간이에요. 세션에서는user, 자격 증명이 없으면ip예요).minute,day,month항목은 UTC 기준 달력상의 분, 일, 월에 대한 조직의 할당량이에요.RateLimitRateLimit-Policy헤더의 각 한도에서 남은 양:"<name>";r=<remaining>;t=<seconds until reset>.X-RateLimit-LimitRateLimit-Policy헤더에서 가장 엄격한 항목(남은 요청 수가 가장 적은 항목)의 한도.X-RateLimit-Remaining가장 엄격한 한도에서 남은 요청 수.
X-RateLimit-Reset가장 엄격한 한도가 초기화될 때까지 남은 초.
Idempotency-Replayedtrue이면 이Idempotency-Key값으로 저장된 응답을 재생한 것이에요. 처리는 다시 실행되지 않았어요.
400잘못된 요청이에요. 파라미터 값이나 객체의 상태 때문에 이 동작을 할 수 없어요(`detail` 필드에 메시지가 있어요).
응답 헤더
RateLimit-Policy적용 중인 한도. IETF 초안
draft-ietf-httpapi-ratelimit-headers형식이며, 쉼표로 구분한"<name>";q=<quota>;w=<window in seconds>항목으로 이루어져요.key항목은 API 키의 요청 속도예요(할당량은 버스트, 시간 창은 버스트가 완전히 다시 채워지는 시간이에요. 세션에서는user, 자격 증명이 없으면ip예요).minute,day,month항목은 UTC 기준 달력상의 분, 일, 월에 대한 조직의 할당량이에요.RateLimitRateLimit-Policy헤더의 각 한도에서 남은 양:"<name>";r=<remaining>;t=<seconds until reset>.X-RateLimit-LimitRateLimit-Policy헤더에서 가장 엄격한 항목(남은 요청 수가 가장 적은 항목)의 한도.X-RateLimit-Remaining가장 엄격한 한도에서 남은 요청 수.
X-RateLimit-Reset가장 엄격한 한도가 초기화될 때까지 남은 초.
application/json
401자격 증명(세션 쿠키나 API 키)을 보내지 않았거나 키를 찾을 수 없어요.
응답 헤더
RateLimit-Policy적용 중인 한도. IETF 초안
draft-ietf-httpapi-ratelimit-headers형식이며, 쉼표로 구분한"<name>";q=<quota>;w=<window in seconds>항목으로 이루어져요.key항목은 API 키의 요청 속도예요(할당량은 버스트, 시간 창은 버스트가 완전히 다시 채워지는 시간이에요. 세션에서는user, 자격 증명이 없으면ip예요).minute,day,month항목은 UTC 기준 달력상의 분, 일, 월에 대한 조직의 할당량이에요.RateLimitRateLimit-Policy헤더의 각 한도에서 남은 양:"<name>";r=<remaining>;t=<seconds until reset>.X-RateLimit-LimitRateLimit-Policy헤더에서 가장 엄격한 항목(남은 요청 수가 가장 적은 항목)의 한도.X-RateLimit-Remaining가장 엄격한 한도에서 남은 요청 수.
X-RateLimit-Reset가장 엄격한 한도가 초기화될 때까지 남은 초.
application/json
403이 동작은 허용되지 않아요. 역할이 부족하거나, 컬렉션이나 카드에 접근할 수 없거나, 요청이 “View as” 모드로 실행 중이거나, 조직이 정지 또는 삭제된 경우예요(`detail` 필드는 `code: org_suspended | org_deleted` 값을 가진 객체예요).
응답 헤더
RateLimit-Policy적용 중인 한도. IETF 초안
draft-ietf-httpapi-ratelimit-headers형식이며, 쉼표로 구분한"<name>";q=<quota>;w=<window in seconds>항목으로 이루어져요.key항목은 API 키의 요청 속도예요(할당량은 버스트, 시간 창은 버스트가 완전히 다시 채워지는 시간이에요. 세션에서는user, 자격 증명이 없으면ip예요).minute,day,month항목은 UTC 기준 달력상의 분, 일, 월에 대한 조직의 할당량이에요.RateLimitRateLimit-Policy헤더의 각 한도에서 남은 양:"<name>";r=<remaining>;t=<seconds until reset>.X-RateLimit-LimitRateLimit-Policy헤더에서 가장 엄격한 항목(남은 요청 수가 가장 적은 항목)의 한도.X-RateLimit-Remaining가장 엄격한 한도에서 남은 요청 수.
X-RateLimit-Reset가장 엄격한 한도가 초기화될 때까지 남은 초.
application/json
404객체가 없거나 접근할 수 없어요. API는 접근이 제한된 객체가 존재하는지 확인해 주지 않아요.
응답 헤더
RateLimit-Policy적용 중인 한도. IETF 초안
draft-ietf-httpapi-ratelimit-headers형식이며, 쉼표로 구분한"<name>";q=<quota>;w=<window in seconds>항목으로 이루어져요.key항목은 API 키의 요청 속도예요(할당량은 버스트, 시간 창은 버스트가 완전히 다시 채워지는 시간이에요. 세션에서는user, 자격 증명이 없으면ip예요).minute,day,month항목은 UTC 기준 달력상의 분, 일, 월에 대한 조직의 할당량이에요.RateLimitRateLimit-Policy헤더의 각 한도에서 남은 양:"<name>";r=<remaining>;t=<seconds until reset>.X-RateLimit-LimitRateLimit-Policy헤더에서 가장 엄격한 항목(남은 요청 수가 가장 적은 항목)의 한도.X-RateLimit-Remaining가장 엄격한 한도에서 남은 요청 수.
X-RateLimit-Reset가장 엄격한 한도가 초기화될 때까지 남은 초.
application/json
422유효성 검사 오류예요. 본문이나 파라미터가 스키마와 맞지 않거나(`detail` 필드는 유효성 검사 오류 목록), 파라미터 값이 허용 범위를 벗어났어요(`detail` 필드는 메시지).
응답 헤더
RateLimit-Policy적용 중인 한도. IETF 초안
draft-ietf-httpapi-ratelimit-headers형식이며, 쉼표로 구분한"<name>";q=<quota>;w=<window in seconds>항목으로 이루어져요.key항목은 API 키의 요청 속도예요(할당량은 버스트, 시간 창은 버스트가 완전히 다시 채워지는 시간이에요. 세션에서는user, 자격 증명이 없으면ip예요).minute,day,month항목은 UTC 기준 달력상의 분, 일, 월에 대한 조직의 할당량이에요.RateLimitRateLimit-Policy헤더의 각 한도에서 남은 양:"<name>";r=<remaining>;t=<seconds until reset>.X-RateLimit-LimitRateLimit-Policy헤더에서 가장 엄격한 항목(남은 요청 수가 가장 적은 항목)의 한도.X-RateLimit-Remaining가장 엄격한 한도에서 남은 요청 수.
X-RateLimit-Reset가장 엄격한 한도가 초기화될 때까지 남은 초.
application/json
429요청이 너무 많거나(`api.rate_limited`), 조직의 분·일·월 할당량을 다 썼거나(`api.quota_exceeded`, `error.details` 필드에 `quota`, `limit`, `reset_at` 값이 있어요), 조직의 한도에 도달했거나, 답변 서비스가 바쁜 상태예요(`answers.engine_busy`). `Retry-After` 헤더에 적힌 시간만큼 기다리세요.
응답 헤더
Retry-After요청을 다시 시도하기 전에 기다릴 초.
RateLimit-Policy적용 중인 한도. IETF 초안
draft-ietf-httpapi-ratelimit-headers형식이며, 쉼표로 구분한"<name>";q=<quota>;w=<window in seconds>항목으로 이루어져요.key항목은 API 키의 요청 속도예요(할당량은 버스트, 시간 창은 버스트가 완전히 다시 채워지는 시간이에요. 세션에서는user, 자격 증명이 없으면ip예요).minute,day,month항목은 UTC 기준 달력상의 분, 일, 월에 대한 조직의 할당량이에요.RateLimitRateLimit-Policy헤더의 각 한도에서 남은 양:"<name>";r=<remaining>;t=<seconds until reset>.X-RateLimit-LimitRateLimit-Policy헤더에서 가장 엄격한 항목(남은 요청 수가 가장 적은 항목)의 한도.X-RateLimit-Remaining가장 엄격한 한도에서 남은 요청 수.
X-RateLimit-Reset가장 엄격한 한도가 초기화될 때까지 남은 초.
application/json
오류 코드
모든 요청에 공통으로 쓰이는 코드 외에 이 엔드포인트가 error.code로 반환할 수 있는 코드예요.
- 400sources.kind_not_allowed_for_key
- 403api_keys.scope
- 401auth.not_authenticated
- 403auth.system_scope
- 400categories.unknown
- 403collections.no_access
- 404collections.not_found
- 403org.deleted
- 403org.suspended
- 400sources.invalid_config
- 400sources.connection_kind_mismatch
- 404sources.connection_not_found
- 403sources.connection_not_usable
- 403sources.feature_disabled
- 400sources.folder_invalid
- 402limits.sources
- 402limits.sources_instant
- 400users.inactive_assignment
- 400users.not_in_org
- 403view_as.read_only
안전한 재시도
POST와 PATCH 요청마다 Idempotency-Key 헤더(예: UUID)를 보내세요. 24시간 안에 같은 키로 재시도하면 요청을 다시 실행하지 않고 저장된 응답을 반환해요.
호출 한도
응답에는 RateLimit, RateLimit-Policy 헤더와 이전 헤더인 X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Reset이 담겨요. 429 응답에는 초 단위의 Retry-After 헤더가 있어요. 그만큼 기다린 뒤 재시도하세요.