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

# 애플리케이션 자격 증명 API: client_id·api_key 조회

> Didit 애플리케이션의 client_id와 api_key를 GET으로 조회하세요. 모든 인증 API 호출에는 api_key를 x-api-key 헤더로 사용합니다. 사용량 기준 요금, 약정 없음.



애플리케이션 자격 증명 가져오기 프롬프트
        프롬프트를 클립보드에 복사



      
      

\<pre>

\`Read one application's full record — including its client_id and api_key (client_secret). Use this to RECOVER an api_key you've misplaced.

Endpoint:
GET https://apx.didit.me/auth/v2/organizations/me/{org_id}/applications/{app_id}/

Authentication:
Authorization: Bearer <access_token>
Get a token via POST /programmatic/login/.

Path parameters:
\- org_id (UUID, required) — Organization that owns the application. Get via GET /organizations/me/.
\- app_id (UUID, required) — Application UUID. Returned by POST /programmatic/verify-email/ (in the application.uuid field), by POST /organizations/me/{org_id}/applications/, or visible in the Didit console.

curl example:
curl "https://apx.didit.me/auth/v2/organizations/me/<ORG_ID>/applications/<APP_ID>/" \
-H "Authorization: Bearer <ACCESS_TOKEN>"

Response (200 OK):
\{
"uuid": "b2c3d4e5-6789-...",
"name": "My App",
"client_id": "S9LIYGSoWNuGMLHsvEt9dQ",
"api_key": "sk_live_example_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
"website_url": "https://example.com",
"redirect_uris": ["https://example.com/callback"],
"terms_url": "https://example.com/terms",
"privacy_url": "https://example.com/privacy",
"description": "Production application",
"created_at": "2025-06-01T10:00:00Z",
"data_location": "eu",
"products": [
\{ "product": "identity", "status": "enabled", "modules": { "user_verification": true, "business_verification": true, "case_management": true } },
\{ "product": "transactions", "status": "disabled", "modules": { "travel_rule": true, "case_management": true } },
\{ "product": "authentication", "status": "disabled", "modules": {} }
]
}

How to use the response:
\- api_key → set as the x-api-key header on EVERY call to https://verification.didit.me/v3/... (sessions, workflows, questionnaires, AML monitoring, billing, etc.).
\- client_id → shown alongside api_key for OAuth-style introspection scenarios. Routine verification calls only need api_key.
\- data_location → where the application's verification data is stored and processed: "eu" (European Union, Ireland). Chosen when the application is created; "au" (Australia, Sydney) and "mx" (Mexico) are coming soon.
\- products → read-only. Always all three products in this order: identity, transactions, authentication. Each has a status (enabled, early_access or disabled) and its module switches (true or false). identity modules: user_verification, business_verification, case_management. transactions modules: travel_rule, case_management. authentication has none ({}).

Failure modes:
\- 401: { "detail": "Invalid access token" } or { "detail": "Expired access token" } when the token is malformed or expired.
\- 403: { "detail": "Only organization owners and admins can manage applications." } when you are a member of the organization but not an owner or admin.
\- 403: { "detail": "Your access to this organization is suspended." } when your membership in the organization is suspended.
\- 403: { "detail": "You do not have permission to perform this action." } when the request has no Authorization header.
\- 404: { "detail": "Organization not found." } when the organization does not exist or you are not a member of it, or { "detail": "Application not found." } when the application is not in that organization.

When to call:
\- After programmatic login from a new machine — you have an access_token but not the api_key, and you need x-api-key to start calling verification.didit.me.
\- Auditing your applications — list all apps with GET /organizations/me/{org_id}/applications/, then read each.

Note:
This endpoint does not rotate the credential. It returns the application's current api_key on every GET, so there is no "show api_key once" model.

For end-to-end Didit integration, paste in the full prompt at /integration/integration-prompt.`

\</pre>



      
      

붙여넣을 곳



## OpenAPI

````yaml ko/openapi-auth.json GET /organizations/me/{org_id}/applications/{app_id}/
openapi: 3.0.0
info:
  version: 1.0.0
  title: Didit Auth API
  description: >-
    개발자와 AI 에이전트를 위한 프로그래밍 방식 등록 및 인증 API입니다. 브라우저 없이 API 호출 2번만으로 등록할 수 있습니다.
    에이전트 친화성이 가장 뛰어난 신원 인증 플랫폼입니다.


    ## 기본 URL


    이 사양의 모든 endpoint는 `https://apx.didit.me/auth/v2`에서 호스팅됩니다. 이는 인증
    API(`https://verification.didit.me/v3`)와는 다른 호스트입니다. 혼동하지 않도록 유의하십시오. 이 인증
    호스트는 **JWT 액세스 토큰**을 발급하며 **조직** 및 **애플리케이션**을 나열하고 관리할 수 있도록 합니다. 인증 호스트는 이
    API가 반환한 **`api_key`**로 인증하여 세션, 워크플로, AML 등을 호출하는 곳입니다.


    ## 인증 흐름 작동 방식


    1. `POST /programmatic/register/` — 이메일 + 비밀번호 제출.

    2. 이메일로 6자리 영숫자 코드 수신.

    3. `POST /programmatic/verify-email/` — 코드 제출. JWT `access_token`,
    `refresh_token`, 조직, 그리고 `client_id` + `api_key`가 포함된 기본 애플리케이션을 반환받습니다.

    4. `api_key`를 저장합니다. `https://verification.didit.me/v3/...`에 대한 모든 호출에
    `x-api-key`로 사용하십시오.

    5. 향후 다른 머신에서 `POST /programmatic/login/`으로 이메일 + 비밀번호를 새 JWT로 교환한 다음, `GET
    /organizations/me/` 및 애플리케이션 endpoint를 호출하여 자격 증명을 복구하거나 교체할 수 있습니다.


    JWT는 이 사양의 **계정 관리** endpoint에만 필요합니다. 인증 API 트래픽은 JWT가 아닌 장기 유효 `api_key`를
    사용합니다.


    ## 규칙


    - 모든 요청 및 응답 본문은 JSON(`Content-Type: application/json`)입니다.

    - **`POST /programmatic/register/`를 테스트할 때는 실제로 수신 가능한 이메일 주소를 사용하십시오.**
    endpoint가 인증 코드를 동기식으로 전송하므로 예약된 테스트 도메인(`@example.com`, `@example.org`,
    `@*.test`, `@*.example`, `@*.invalid`)의 주소는 메일 발송이 거부되어 요청에서 `500`이 반환됩니다.
    샘플의 `you@yourdomain.com` 플레이스홀더를 실제로 확인할 수 있는 수신함 주소로 대체하십시오.

    - 유효성 검사 오류는 두 가지 엔벨로프 형식 중 하나와 함께 HTTP `400`을 반환합니다. 필드 수준 문제의 경우
    `{"field": ["message", ...]}` 형식이고, 비즈니스 규칙 오류의 경우 `{"detail": "message"}`
    형식입니다. 소수의 검증기(등록 시 비밀번호 강도, 이메일 인증 시 코드 만료)는 현재 필드 키 형식 대신 기본 배열
    `["message"]`로 응답합니다. 이는 서버 측의 알려진 불일치 사항이므로 클라이언트 코드가 두 형태를 모두 수용하도록 작성해야
    합니다.

    - 인증 오류는 HTTP `401`(유효하지 않은 Bearer 토큰) 또는 `403`(Bearer 토큰 누락 / 권한 부족)과 함께
    `{"detail": "..."}` 형태로 반환됩니다.

    - 속도 제한 응답에는 대기 시간을 초 단위로 나타내는 `wait` 필드가 포함됩니다.
servers:
  - url: https://apx.didit.me/auth/v2
    description: 프로덕션 인증 서버
security: []
tags:
  - name: Programmatic Auth
    description: >-
      이메일 및 비밀번호 계정 라이프사이클: 가입, 인증, 로그인. 계정 관리 endpoint에 사용할 JWT `access_token`과
      (인증 완료 시) 첫 번째 애플리케이션의 `client_id` 및 `api_key`를 반환합니다.
  - name: Account Management
    description: >-
      조직 목록을 조회하고 애플리케이션을 생성, 조회 또는 업데이트하는 인증된 endpoint(JWT bearer)입니다. 검증 API
      호출에 인증하는 데 사용하는 `api_key`를 복구하거나 교체할 때 사용하십시오.
paths:
  /organizations/me/{org_id}/applications/{app_id}/:
    get:
      tags:
        - Account Management
      summary: 애플리케이션 자격 증명 조회
      description: >-
        `client_id` 및 `api_key`를 포함한 단일 애플리케이션의 전체 레코드를 읽습니다. 분실한 `api_key`를 복구할
        때 사용합니다.
      operationId: get_application_credentials
      parameters:
        - name: org_id
          in: path
          required: true
          description: 해당 애플리케이션을 소유한 조직의 UUID입니다.
          schema:
            type: string
            format: uuid
            example: a1b2c3d4-5678-90ab-cdef-111111111111
        - name: app_id
          in: path
          required: true
          description: 자격 증명을 읽으려는 애플리케이션의 UUID입니다.
          schema:
            type: string
            format: uuid
            example: b2c3d4e5-6789-01bc-defg-222222222222
      responses:
        '200':
          description: '`client_id` 및 `api_key`를 포함한 애플리케이션 레코드입니다.'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Application'
              examples:
                Success:
                  value:
                    uuid: b2c3d4e5-6789-01bc-defg-222222222222
                    name: My App
                    client_id: S9LIYGSoWNuGMLHsvEt9dQ
                    api_key: sk_live_example_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
                    website_url: https://example.com
                    redirect_uris:
                      - https://example.com/callback
                    terms_url: https://example.com/terms
                    privacy_url: https://example.com/privacy
                    description: Production application
                    created_at: '2025-06-01T10:00:00Z'
                    data_location: eu
                    products:
                      - product: identity
                        status: enabled
                        modules:
                          user_verification: true
                          business_verification: true
                          case_management: true
                      - product: transactions
                        status: disabled
                        modules:
                          travel_rule: true
                          case_management: true
                      - product: authentication
                        status: disabled
                        modules: {}
        '401':
          description: >-
            액세스 token의 형식이 잘못되었거나, 유효하지 않거나, 만료되었습니다. `POST
            /programmatic/login/`으로 새 token을 받으십시오.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/AuthError'
              examples:
                InvalidToken:
                  value:
                    detail: Invalid access token
                ExpiredToken:
                  value:
                    detail: Expired access token
        '403':
          description: >-
            이 애플리케이션을 조회할 수 없습니다. 소유자나 관리자가 아닌 조직 멤버에게는 `Only organization
            owners and admins can manage applications.` 메시지가 반환됩니다. 조직에 대한 접근이
            정지된 소유자나 관리자에게는 `Your access to this organization is suspended.`
            메시지가 반환됩니다. `Authorization` 헤더가 없는 요청에는 `You do not have permission
            to perform this action.` 메시지가 반환됩니다.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/AuthError'
              examples:
                NotOwnerOrAdmin:
                  summary: 소유자나 관리자가 아닌 멤버
                  value:
                    detail: >-
                      Only organization owners and admins can manage
                      applications.
                Suspended:
                  summary: 멤버십 정지됨
                  value:
                    detail: Your access to this organization is suspended.
                MissingToken:
                  summary: Authorization 헤더가 없습니다
                  value:
                    detail: You do not have permission to perform this action.
        '404':
          description: 조직이 존재하지 않거나 해당 조직의 멤버가 아니거나, 해당 조직에 애플리케이션이 존재하지 않습니다.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/AuthError'
              examples:
                OrganizationNotFound:
                  summary: 조직을 찾을 수 없거나 멤버가 아닙니다
                  value:
                    detail: Organization not found.
                ApplicationNotFound:
                  summary: 이 조직에 해당 애플리케이션이 없습니다
                  value:
                    detail: Application not found.
      security:
        - BearerAuth: []
      x-codeSamples:
        - lang: curl
          label: cURL
          source: >-
            curl
            "https://apx.didit.me/auth/v2/organizations/me/$ORG_ID/applications/$APP_ID/"
            \
              -H "Authorization: Bearer $ACCESS_TOKEN"
        - lang: python
          label: Python
          source: |-
            from didit import Didit

            # Use the access token that account.login returns.
            client = Didit(account_token="YOUR_ACCESS_TOKEN")

            result = client.account.applications.retrieve(
                "a1b2c3d4-5678-90ab-cdef-111111111111",
                "b2c3d4e5-6789-01bc-defg-222222222222",
            )
            print(result)
        - lang: javascript
          label: Node.js
          source: |-
            import Didit from "@didit-protocol/sdk-node";

            // Use the access token that account.login returns.
            const didit = new Didit({ accountToken: "YOUR_ACCESS_TOKEN" });

            const result = await didit.account.applications.retrieve(
              "a1b2c3d4-5678-90ab-cdef-111111111111",
              "b2c3d4e5-6789-01bc-defg-222222222222",
            );
            console.log(result);
        - lang: go
          label: Go
          source: "ctx := context.Background()\n// Use the access token that account.login returns.\nclient := didit.NewClient(option.WithAccountToken(\"YOUR_ACCESS_TOKEN\"))\n\nresult, err := client.Account.Applications.Retrieve(ctx, \"a1b2c3d4-5678-90ab-cdef-111111111111\", \"b2c3d4e5-6789-01bc-defg-222222222222\")\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)"
        - lang: java
          label: Java
          source: >-
            import me.didit.Didit;


            // Use the access token that account.login returns.

            Didit client =
            Didit.builder().accountToken("YOUR_ACCESS_TOKEN").build();


            var result =
            client.account().applications().retrieve("a1b2c3d4-5678-90ab-cdef-111111111111",
            "b2c3d4e5-6789-01bc-defg-222222222222");

            System.out.println(result);
        - lang: php
          label: PHP
          source: >-
            <?php


            require 'vendor/autoload.php';


            use Didit\DiditClient;


            // Use the access token that account.login returns.

            $didit = new DiditClient(accountToken: 'YOUR_ACCESS_TOKEN');


            $result =
            $didit->account->applications->retrieve('a1b2c3d4-5678-90ab-cdef-111111111111',
            'b2c3d4e5-6789-01bc-defg-222222222222');

            print_r($result->toArray());
        - lang: ruby
          label: Ruby
          source: |-
            require "didit"

            # Use the access token that account.login returns.
            didit = Didit::Client.new(account_token: "YOUR_ACCESS_TOKEN")

            result = didit.account.applications.retrieve(
              "a1b2c3d4-5678-90ab-cdef-111111111111",
              "b2c3d4e5-6789-01bc-defg-222222222222"
            )
            puts result.to_h
        - lang: csharp
          label: .NET
          source: >-
            using System;

            using System.Text.Json;

            using Didit;


            // Use the access token that account.login returns.

            using var client = new DiditClient(new DiditClientOptions {
            AccountToken = "YOUR_ACCESS_TOKEN" });


            var result = await
            client.Account.Applications.RetrieveAsync("a1b2c3d4-5678-90ab-cdef-111111111111",
            "b2c3d4e5-6789-01bc-defg-222222222222");

            Console.WriteLine(JsonSerializer.Serialize(result));
components:
  schemas:
    Application:
      type: object
      description: >-
        전체 애플리케이션 레코드입니다. `uuid`, `client_id`, `api_key`는 생성 후 절대 변경되지 않습니다.
        `data_location` 역시 변경되지 않으나, 조직과 함께 생성된 라이브 애플리케이션에서 사용 전 한 번만 변경할 수
        있습니다(업데이트 요청 참조).
      properties:
        uuid:
          type: string
          format: uuid
          description: 애플리케이션 UUID입니다. 후속 호출에서 `{app_id}`로 사용합니다.
          example: b2c3d4e5-6789-01bc-defg-222222222222
        name:
          type: string
          description: Didit 콘솔에 표시되는 애플리케이션 표시 이름입니다.
          example: Acme Production App
        client_id:
          type: string
          description: OAuth 스타일 플로우에 안전하게 삽입할 수 있는 공개 클라이언트 식별자입니다.
          example: S9LIYGSoWNuGMLHsvEt9dQ
        api_key:
          type: string
          description: >-
            장기간 유지되는 시크릿(`client_secret`이라고도 함).
            `https://verification.didit.me/v3/...`에 대한 모든 호출(세션, 워크플로, AML 등)의
            `x-api-key` 헤더로 사용합니다. 자격 증명으로 취급해야 하며 클라이언트 측에 절대 노출하지 마십시오. 새 키는
            `sk_live_`(프로덕션 애플리케이션) 또는 `sk_test_`(샌드박스 애플리케이션)로 시작하며 그 뒤에 URL에
            안전한 43자리 문자(영문자, 숫자, `-` 및 `_`)가 옵니다. 이 형식 이전에 생성된 키에는 접두사가 없으며 변경
            없이 계속 작동합니다. 계정을 복구한 후 72시간 동안 목록 조회, 단건 조회, 수정 시 키 대신 빈 문자열이 반환됩니다.
          example: sk_live_example_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
        website_url:
          type: string
          nullable: true
          description: 이 애플리케이션과 연결된 웹사이트 또는 앱 URL입니다.
          example: https://acme.example
        redirect_uris:
          type: array
          items:
            type: string
          description: OAuth 스타일 및 인증 리디렉션 워크플로에 허용된 리디렉션 URI입니다.
          example:
            - https://acme.example/callback
        terms_url:
          type: string
          nullable: true
          description: 인증 흐름에 표시되는 서비스 이용약관 URL입니다.
          example: https://acme.example/terms
        privacy_url:
          type: string
          nullable: true
          description: 인증 플로우에 표시되는 개인정보 처리방침 URL입니다.
          example: https://acme.example/privacy
        description:
          type: string
          nullable: true
          description: 애플리케이션에 대한 내부 설명(최종 사용자에게는 표시되지 않음).
        created_at:
          type: string
          format: date-time
          example: '2025-06-01T10:00:00Z'
        data_location:
          $ref: '#/components/schemas/ApplicationDataLocation'
        products:
          type: array
          readOnly: true
          description: >-
            애플리케이션의 제품입니다. 항상 세 가지 모두 다음 순서로 포함됩니다: `identity`, `transactions`,
            `authentication`. 새 애플리케이션은 `identity`가 모든 모듈과 함께 활성화되어 있고,
            `transactions` 및 `authentication`은 비활성화되어 있습니다. 읽기 전용: 생성 또는 업데이트
            본문의 `products` 키는 무시됩니다.
          items:
            $ref: '#/components/schemas/ApplicationProduct'
          example:
            - product: identity
              status: enabled
              modules:
                user_verification: true
                business_verification: true
                case_management: true
            - product: transactions
              status: disabled
              modules:
                travel_rule: true
                case_management: true
            - product: authentication
              status: disabled
              modules: {}
    AuthError:
      type: object
      description: 인증 / 권한 부여 / 찾을 수 없음 오류 엔벨로프입니다.
      properties:
        detail:
          type: string
          example: Invalid access token
    ApplicationDataLocation:
      type: string
      enum:
        - eu
        - au
        - mx
      description: >-
        애플리케이션의 인증 데이터가 저장되고 처리되는 위치로, 애플리케이션 생성 시 선택됩니다. 기본값은 `eu`인 유럽
        연합(아일랜드)입니다. `au`(호주, 시드니) 및 `mx`(멕시코)는 곧 지원될 예정입니다. 해당 위치를 지정한 요청에는 400
        `This data location is not available yet.` 응답이 반환됩니다. 조직의 샌드박스 애플리케이션은
        항상 유럽 연합에 위치합니다.
      example: eu
    ApplicationProduct:
      type: object
      description: >-
        애플리케이션의 단일 제품 및 해당 상태입니다. 읽기 전용: 애플리케이션 endpoint가 이를 반환하며 요청 본문에서는
        무시됩니다.
      properties:
        product:
          type: string
          enum:
            - identity
            - transactions
            - authentication
          description: >-
            `identity`(신원 인증), `transactions`(거래 모니터링) 또는
            `authentication`(인증)입니다.
          example: identity
        status:
          type: string
          enum:
            - enabled
            - early_access
            - disabled
          description: >-
            이 애플리케이션에서 해당 제품이 활성화되어 있는지 여부입니다. `early_access`는 Didit이 직접 활성화해 주는
            `authentication`에만 적용됩니다.
          example: enabled
        modules:
          type: object
          additionalProperties:
            type: boolean
          description: >-
            제품의 모듈 스위치로, 각각 `true` 또는 `false`입니다. `identity`에는
            `user_verification`, `business_verification`, `case_management`가
            있습니다. `transactions`에는 `travel_rule`과 `case_management`가 있습니다.
            `authentication`에는 모듈이 없습니다(`{}`). `case_management`는 `identity`와
            `transactions` 모두에 표시되는 단일 설정이므로 두 항목 모두에서 동일한 값을 갖습니다.
          example:
            user_verification: true
            business_verification: true
            case_management: true
      required:
        - product
        - status
        - modules
  securitySchemes:
    BearerAuth:
      type: http
      scheme: bearer
      bearerFormat: JWT
      description: >-
        `POST /programmatic/login/` 또는 `POST /programmatic/verify-email/`에서 반환된
        RS256으로 서명된 JWT `access_token`입니다. `Authorization: Bearer
        <access_token>` 형태로 전송합니다. 기본 유효 기간은 86400초(24시간)입니다. 이 token은
        `apx.didit.me/auth/v2`의 계정 관리 endpoint에 대해서만 유효합니다. 인증
        API(`verification.didit.me/v3`)는 대신 장기 `api_key`를 `x-api-key`로 사용합니다.

````

This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.