> ## Documentation Index
> Fetch the complete documentation index at: https://manual.voiceping.net/llms.txt
> Use this file to discover all available pages before exploring further.

# API Access

> 권한 범위가 지정된 API 키로 자체 백엔드에서 VoicePing 회의록을 조회하는 방법과 언어별 예제

export const FeedbackKo = () => <>
    <Tip>
      기능 개선 의견이나 요청은 <a href="/ko/product-feedback">Product Feedback</a>에서 보내 주세요.
    </Tip>

    <h2>공식 링크</h2>

    <CardGroup cols={2}>
      <Card title="공식 웹사이트" icon="globe" href="https://voiceping.net/en/">
        VoicePing 공식 웹사이트 열기
      </Card>
      <Card title="X (Twitter)" icon="x-twitter" href="https://x.com/VoicePingMedia">
        X에서 VoicePing 팔로우하기
      </Card>
      <Card title="Facebook" icon="facebook" href="https://www.facebook.com/voiceping.inc">
        Facebook 페이지 열기
      </Card>
      <Card title="LinkedIn" icon="linkedin" href="https://www.linkedin.com/company/28684130/">
        LinkedIn 페이지 열기
      </Card>
    </CardGroup>
  </>;

<Frame>
  <img src="https://mintcdn.com/test-cf63e467/z13MfE0CikV5b-4X/en/images/external_access/external-access-api-hero.png?fit=max&auto=format&n=z13MfE0CikV5b-4X&q=85&s=a53cf64ef6fca20c699fc108bb9cc509" alt="백엔드에서 VoicePing 회의록을 조회하는 API Access 구성" width="1408" height="768" data-path="en/images/external_access/external-access-api-hero.png" />
</Frame>

## 백엔드에서 VoicePing 회의록 조회

API Access는 정기 내보내기, CRM 동기화, 대시보드, 규정 준수 보관 등 서버 간 워크플로우에 사용합니다. 워크스페이스에서 API 키를 생성하고 권한 범위를 부여한 뒤 백엔드에서 Bearer 토큰으로 VoicePing API를 호출합니다.

AI 클라이언트에서 사람이 질문하는 경우에는 [MCP Access](/ko/external-access/mcp)를 사용하세요.

```text theme={null}
사람이 질문하면 MCP Access를 사용합니다.
서버가 데이터를 가져오면 API Access를 사용합니다.
```

***

## API Access 사용 사례

| 사용 사례          | 예시                              |
| -------------- | ------------------------------- |
| 정기 내보내기        | 매주 금요일에 이번 주 회의록 내보내기           |
| 사내 보고          | 주간 회의 요약 보고서 작성                 |
| CRM / PM 워크플로우 | 회의록 요약을 Salesforce, Asana 등에 반영 |
| 규정 준수 아카이브     | 승인된 저장소에 회의 기록 보관               |
| 대시보드           | 회의록 메타데이터를 분석 시스템에 공급           |

***

## API 키 생성

1. **워크스페이스 설정 → 외부 액세스(External Access) → API Access**를 엽니다.
2. **API Access Mode**가 꺼져 있으면 활성화합니다.
3. **Create API key**를 클릭합니다.
4. 이름, **허용된 IP 주소**(권장), 필요한 **스코프**, 유효 기간을 선택합니다.
5. 생성된 키를 즉시 복사해 시크릿 매니저에 저장하세요. 전체 키는 단 한 번만 표시됩니다.

<Frame>
  <img src="https://mintcdn.com/test-cf63e467/z13MfE0CikV5b-4X/en/images/external_access/external_access_API_key_creation_modal.png?fit=max&auto=format&n=z13MfE0CikV5b-4X&q=85&s=25d83a9a0a0425717f7e19625799c0a5" alt="이름, 허용 IP, 권한 범위, 유효 기간을 입력하는 Create API key 화면" width="570" height="477" data-path="en/images/external_access/external_access_API_key_creation_modal.png" />
</Frame>

키를 생성하면 원본 키는 한 번만 표시됩니다. 완료 패널을 닫기 전에 복사하세요.

<Frame>
  <img src="https://mintcdn.com/test-cf63e467/1_BQkW2BilGmh1Db/en/images/external_access/external_access_API_key_created_screen.png?fit=max&auto=format&n=1_BQkW2BilGmh1Db&q=85&s=30cdac40d0142317d2f298453b78f6a1" alt="원본 키와 API Access 키 목록이 표시된 API 키 생성 완료 화면" width="3420" height="2100" data-path="en/images/external_access/external_access_API_key_created_screen.png" />
</Frame>

<Note>
  **API 키는 절대 커밋하지 마세요.** 환경 변수나 시크릿 매니저에 보관하세요. 키 생성 화면에서 각 키에 **허용된 IP 주소**를 설정하면 다른 IP의 요청을 차단할 수 있습니다.
</Note>

***

## 요청 인증

모든 요청은 Bearer 토큰으로 `https://api.voiceping.io`에 인증합니다.

```http theme={null}
GET /api/v1/transcripts/search?q=pricing&limit=10 HTTP/1.1
Host: api.voiceping.io
Authorization: Bearer <VOICEPING_API_KEY>
```

키를 환경 변수 `VOICEPING_API_KEY`에 설정하면 다음 예제에서 이 값을 사용합니다.

***

## 퀵스타트 — 언어별로 API 호출

**회의록을 검색하고 한 건의 상세 내용을 조회하는 과정**을 네 언어로 제공합니다. 사용하는 기술에 맞는 탭을 선택하세요.

<CodeGroup>
  ```typescript TypeScript theme={null}
  // Requires Node.js 18+ (for built-in fetch)
  const apiKey = process.env.VOICEPING_API_KEY!;
  const base = "https://api.voiceping.io/api/v1";
  const headers = { Authorization: `Bearer ${apiKey}` };

  // 1. Search transcripts
  const searchRes = await fetch(
    `${base}/transcripts/search?q=pricing&limit=10`,
    { headers },
  );
  const { transcripts } = await searchRes.json();

  // 2. Read the first result in full
  const detailRes = await fetch(
    `${base}/transcripts/${transcripts[0].id}`,
    { headers },
  );
  const transcript = await detailRes.json();

  console.log(transcript.title, transcript.content);
  ```

  ```python Python theme={null}
  # pip install requests
  import os
  import requests

  api_key = os.environ["VOICEPING_API_KEY"]
  base = "https://api.voiceping.io/api/v1"
  headers = {"Authorization": f"Bearer {api_key}"}

  # 1. Search transcripts
  search = requests.get(
      f"{base}/transcripts/search",
      headers=headers,
      params={"q": "pricing", "limit": 10},
  ).json()

  # 2. Read the first result in full
  first_id = search["transcripts"][0]["id"]
  detail = requests.get(
      f"{base}/transcripts/{first_id}",
      headers=headers,
  ).json()

  print(detail["title"], detail["content"])
  ```

  ```java Java theme={null}
  // Java 11+ (uses built-in java.net.http)
  import java.net.URI;
  import java.net.http.HttpClient;
  import java.net.http.HttpRequest;
  import java.net.http.HttpResponse;

  public class VoicePingQuickstart {
      public static void main(String[] args) throws Exception {
          String apiKey = System.getenv("VOICEPING_API_KEY");
          String base = "https://api.voiceping.io/api/v1";
          HttpClient client = HttpClient.newHttpClient();

          // 1. Search transcripts
          HttpRequest search = HttpRequest.newBuilder()
              .uri(URI.create(base + "/transcripts/search?q=pricing&limit=10"))
              .header("Authorization", "Bearer " + apiKey)
              .GET()
              .build();
          HttpResponse<String> searchRes =
              client.send(search, HttpResponse.BodyHandlers.ofString());
          System.out.println(searchRes.body());

          // 2. Read a transcript (parse the id from searchRes.body() first;
          //    shown here with a placeholder)
          HttpRequest detail = HttpRequest.newBuilder()
              .uri(URI.create(base + "/transcripts/TRANSCRIPT_ID"))
              .header("Authorization", "Bearer " + apiKey)
              .GET()
              .build();
          HttpResponse<String> detailRes =
              client.send(detail, HttpResponse.BodyHandlers.ofString());
          System.out.println(detailRes.body());
      }
  }
  ```

  ```go Go theme={null}
  // go run main.go
  package main

  import (
      "fmt"
      "io"
      "net/http"
      "os"
  )

  func main() {
      apiKey := os.Getenv("VOICEPING_API_KEY")
      base := "https://api.voiceping.io/api/v1"

      // 1. Search transcripts
      req, _ := http.NewRequest("GET",
          base+"/transcripts/search?q=pricing&limit=10", nil)
      req.Header.Set("Authorization", "Bearer "+apiKey)

      res, err := http.DefaultClient.Do(req)
      if err != nil {
          panic(err)
      }
      defer res.Body.Close()
      body, _ := io.ReadAll(res.Body)
      fmt.Println(string(body))

      // 2. Read a transcript by id (parse id from body first)
      detailReq, _ := http.NewRequest("GET",
          base+"/transcripts/TRANSCRIPT_ID", nil)
      detailReq.Header.Set("Authorization", "Bearer "+apiKey)

      detailRes, _ := http.DefaultClient.Do(detailReq)
      defer detailRes.Body.Close()
      detailBody, _ := io.ReadAll(detailRes.Body)
      fmt.Println(string(detailBody))
  }
  ```
</CodeGroup>

***

## 다음 단계

<CardGroup cols={2}>
  <Card title="외부 액세스 개요" icon="arrow-left" href="/ko/external-access">
    MCP와 API에 공통되는 권한 범위, 접근 상태 관리, 이벤트 로그를 확인합니다.
  </Card>

  <Card title="AI 클라이언트용 MCP Access" icon="robot" href="/ko/external-access/mcp">
    Claude, ChatGPT, Codex, Claude Code, Gemini CLI 등을 통해 사람이 질문하는 경우에는 MCP Access를 사용하세요.
  </Card>
</CardGroup>

<FeedbackKo />
